diff options
55 files changed, 364 insertions, 165 deletions
diff --git a/Documentation/DocBook/kernel-hacking.tmpl b/Documentation/DocBook/kernel-hacking.tmpl index a50d6cd58573..992e67e6be7f 100644 --- a/Documentation/DocBook/kernel-hacking.tmpl +++ b/Documentation/DocBook/kernel-hacking.tmpl | |||
| @@ -449,8 +449,8 @@ printk(KERN_INFO "i = %u\n", i); | |||
| 449 | </para> | 449 | </para> |
| 450 | 450 | ||
| 451 | <programlisting> | 451 | <programlisting> |
| 452 | __u32 ipaddress; | 452 | __be32 ipaddress; |
| 453 | printk(KERN_INFO "my ip: %d.%d.%d.%d\n", NIPQUAD(ipaddress)); | 453 | printk(KERN_INFO "my ip: %pI4\n", &ipaddress); |
| 454 | </programlisting> | 454 | </programlisting> |
| 455 | 455 | ||
| 456 | <para> | 456 | <para> |
diff --git a/drivers/isdn/mISDN/l1oip_core.c b/drivers/isdn/mISDN/l1oip_core.c index c3b661a666cb..7e5f30dbc0a0 100644 --- a/drivers/isdn/mISDN/l1oip_core.c +++ b/drivers/isdn/mISDN/l1oip_core.c | |||
| @@ -1480,7 +1480,7 @@ l1oip_init(void) | |||
| 1480 | return -ENOMEM; | 1480 | return -ENOMEM; |
| 1481 | 1481 | ||
| 1482 | l1oip_cnt = 0; | 1482 | l1oip_cnt = 0; |
| 1483 | while (type[l1oip_cnt] && l1oip_cnt < MAX_CARDS) { | 1483 | while (l1oip_cnt < MAX_CARDS && type[l1oip_cnt]) { |
| 1484 | switch (type[l1oip_cnt] & 0xff) { | 1484 | switch (type[l1oip_cnt] & 0xff) { |
| 1485 | case 1: | 1485 | case 1: |
| 1486 | pri = 0; | 1486 | pri = 0; |
diff --git a/drivers/net/3c515.c b/drivers/net/3c515.c index 3e00fa8ea65f..4a7c32895be5 100644 --- a/drivers/net/3c515.c +++ b/drivers/net/3c515.c | |||
| @@ -832,7 +832,9 @@ static int corkscrew_open(struct net_device *dev) | |||
| 832 | skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ | 832 | skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ |
| 833 | vp->rx_ring[i].addr = isa_virt_to_bus(skb->data); | 833 | vp->rx_ring[i].addr = isa_virt_to_bus(skb->data); |
| 834 | } | 834 | } |
| 835 | vp->rx_ring[i - 1].next = isa_virt_to_bus(&vp->rx_ring[0]); /* Wrap the ring. */ | 835 | if (i != 0) |
| 836 | vp->rx_ring[i - 1].next = | ||
| 837 | isa_virt_to_bus(&vp->rx_ring[0]); /* Wrap the ring. */ | ||
| 836 | outl(isa_virt_to_bus(&vp->rx_ring[0]), ioaddr + UpListPtr); | 838 | outl(isa_virt_to_bus(&vp->rx_ring[0]), ioaddr + UpListPtr); |
| 837 | } | 839 | } |
| 838 | if (vp->full_bus_master_tx) { /* Boomerang bus master Tx. */ | 840 | if (vp->full_bus_master_tx) { /* Boomerang bus master Tx. */ |
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index c34aee91250b..c20416850948 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c | |||
| @@ -2721,13 +2721,15 @@ dump_tx_ring(struct net_device *dev) | |||
| 2721 | &vp->tx_ring[vp->dirty_tx % TX_RING_SIZE]); | 2721 | &vp->tx_ring[vp->dirty_tx % TX_RING_SIZE]); |
| 2722 | issue_and_wait(dev, DownStall); | 2722 | issue_and_wait(dev, DownStall); |
| 2723 | for (i = 0; i < TX_RING_SIZE; i++) { | 2723 | for (i = 0; i < TX_RING_SIZE; i++) { |
| 2724 | pr_err(" %d: @%p length %8.8x status %8.8x\n", i, | 2724 | unsigned int length; |
| 2725 | &vp->tx_ring[i], | 2725 | |
| 2726 | #if DO_ZEROCOPY | 2726 | #if DO_ZEROCOPY |
| 2727 | le32_to_cpu(vp->tx_ring[i].frag[0].length), | 2727 | length = le32_to_cpu(vp->tx_ring[i].frag[0].length); |
| 2728 | #else | 2728 | #else |
| 2729 | le32_to_cpu(vp->tx_ring[i].length), | 2729 | length = le32_to_cpu(vp->tx_ring[i].length); |
| 2730 | #endif | 2730 | #endif |
| 2731 | pr_err(" %d: @%p length %8.8x status %8.8x\n", | ||
| 2732 | i, &vp->tx_ring[i], length, | ||
| 2731 | le32_to_cpu(vp->tx_ring[i].status)); | 2733 | le32_to_cpu(vp->tx_ring[i].status)); |
| 2732 | } | 2734 | } |
| 2733 | if (!stalled) | 2735 | if (!stalled) |
diff --git a/drivers/net/eexpress.c b/drivers/net/eexpress.c index 1686dca28748..1f016d66684a 100644 --- a/drivers/net/eexpress.c +++ b/drivers/net/eexpress.c | |||
| @@ -1474,13 +1474,13 @@ static void eexp_hw_init586(struct net_device *dev) | |||
| 1474 | outw(0x0000, ioaddr + 0x800c); | 1474 | outw(0x0000, ioaddr + 0x800c); |
| 1475 | outw(0x0000, ioaddr + 0x800e); | 1475 | outw(0x0000, ioaddr + 0x800e); |
| 1476 | 1476 | ||
| 1477 | for (i = 0; i < (sizeof(start_code)); i+=32) { | 1477 | for (i = 0; i < ARRAY_SIZE(start_code) * 2; i+=32) { |
| 1478 | int j; | 1478 | int j; |
| 1479 | outw(i, ioaddr + SM_PTR); | 1479 | outw(i, ioaddr + SM_PTR); |
| 1480 | for (j = 0; j < 16; j+=2) | 1480 | for (j = 0; j < 16 && (i+j)/2 < ARRAY_SIZE(start_code); j+=2) |
| 1481 | outw(start_code[(i+j)/2], | 1481 | outw(start_code[(i+j)/2], |
| 1482 | ioaddr+0x4000+j); | 1482 | ioaddr+0x4000+j); |
| 1483 | for (j = 0; j < 16; j+=2) | 1483 | for (j = 0; j < 16 && (i+j+16)/2 < ARRAY_SIZE(start_code); j+=2) |
| 1484 | outw(start_code[(i+j+16)/2], | 1484 | outw(start_code[(i+j+16)/2], |
| 1485 | ioaddr+0x8000+j); | 1485 | ioaddr+0x8000+j); |
| 1486 | } | 1486 | } |
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index 78952f8324e2..fa311a950996 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
| 41 | 41 | ||
| 42 | #define DRV_NAME "ehea" | 42 | #define DRV_NAME "ehea" |
| 43 | #define DRV_VERSION "EHEA_0101" | 43 | #define DRV_VERSION "EHEA_0102" |
| 44 | 44 | ||
| 45 | /* eHEA capability flags */ | 45 | /* eHEA capability flags */ |
| 46 | #define DLPAR_PORT_ADD_REM 1 | 46 | #define DLPAR_PORT_ADD_REM 1 |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index e8d46cc1bec2..977c3d358279 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
| @@ -1545,6 +1545,9 @@ static int ehea_clean_portres(struct ehea_port *port, struct ehea_port_res *pr) | |||
| 1545 | { | 1545 | { |
| 1546 | int ret, i; | 1546 | int ret, i; |
| 1547 | 1547 | ||
| 1548 | if (pr->qp) | ||
| 1549 | netif_napi_del(&pr->napi); | ||
| 1550 | |||
| 1548 | ret = ehea_destroy_qp(pr->qp); | 1551 | ret = ehea_destroy_qp(pr->qp); |
| 1549 | 1552 | ||
| 1550 | if (!ret) { | 1553 | if (!ret) { |
diff --git a/drivers/net/gianfar_ethtool.c b/drivers/net/gianfar_ethtool.c index dbf06e9313cc..2234118eedbb 100644 --- a/drivers/net/gianfar_ethtool.c +++ b/drivers/net/gianfar_ethtool.c | |||
| @@ -366,9 +366,8 @@ static int gfar_scoalesce(struct net_device *dev, struct ethtool_coalesce *cvals | |||
| 366 | return -EINVAL; | 366 | return -EINVAL; |
| 367 | } | 367 | } |
| 368 | 368 | ||
| 369 | priv->rxic = mk_ic_value( | 369 | priv->rxic = mk_ic_value(cvals->rx_max_coalesced_frames, |
| 370 | gfar_usecs2ticks(priv, cvals->rx_coalesce_usecs), | 370 | gfar_usecs2ticks(priv, cvals->rx_coalesce_usecs)); |
| 371 | cvals->rx_max_coalesced_frames); | ||
| 372 | 371 | ||
| 373 | /* Set up tx coalescing */ | 372 | /* Set up tx coalescing */ |
| 374 | if ((cvals->tx_coalesce_usecs == 0) || | 373 | if ((cvals->tx_coalesce_usecs == 0) || |
| @@ -390,9 +389,8 @@ static int gfar_scoalesce(struct net_device *dev, struct ethtool_coalesce *cvals | |||
| 390 | return -EINVAL; | 389 | return -EINVAL; |
| 391 | } | 390 | } |
| 392 | 391 | ||
| 393 | priv->txic = mk_ic_value( | 392 | priv->txic = mk_ic_value(cvals->tx_max_coalesced_frames, |
| 394 | gfar_usecs2ticks(priv, cvals->tx_coalesce_usecs), | 393 | gfar_usecs2ticks(priv, cvals->tx_coalesce_usecs)); |
| 395 | cvals->tx_max_coalesced_frames); | ||
| 396 | 394 | ||
| 397 | gfar_write(&priv->regs->rxic, 0); | 395 | gfar_write(&priv->regs->rxic, 0); |
| 398 | if (priv->rxcoalescing) | 396 | if (priv->rxcoalescing) |
diff --git a/drivers/net/igbvf/vf.c b/drivers/net/igbvf/vf.c index 2a4faf9ade69..a9a61efa964c 100644 --- a/drivers/net/igbvf/vf.c +++ b/drivers/net/igbvf/vf.c | |||
| @@ -274,6 +274,8 @@ static s32 e1000_set_vfta_vf(struct e1000_hw *hw, u16 vid, bool set) | |||
| 274 | 274 | ||
| 275 | err = mbx->ops.read_posted(hw, msgbuf, 2); | 275 | err = mbx->ops.read_posted(hw, msgbuf, 2); |
| 276 | 276 | ||
| 277 | msgbuf[0] &= ~E1000_VT_MSGTYPE_CTS; | ||
| 278 | |||
| 277 | /* if nacked the vlan was rejected */ | 279 | /* if nacked the vlan was rejected */ |
| 278 | if (!err && (msgbuf[0] == (E1000_VF_SET_VLAN | E1000_VT_MSGTYPE_NACK))) | 280 | if (!err && (msgbuf[0] == (E1000_VF_SET_VLAN | E1000_VT_MSGTYPE_NACK))) |
| 279 | err = -E1000_ERR_MAC_INIT; | 281 | err = -E1000_ERR_MAC_INIT; |
| @@ -317,6 +319,8 @@ static void e1000_rar_set_vf(struct e1000_hw *hw, u8 * addr, u32 index) | |||
| 317 | if (!ret_val) | 319 | if (!ret_val) |
| 318 | ret_val = mbx->ops.read_posted(hw, msgbuf, 3); | 320 | ret_val = mbx->ops.read_posted(hw, msgbuf, 3); |
| 319 | 321 | ||
| 322 | msgbuf[0] &= ~E1000_VT_MSGTYPE_CTS; | ||
| 323 | |||
| 320 | /* if nacked the address was rejected, use "perm_addr" */ | 324 | /* if nacked the address was rejected, use "perm_addr" */ |
| 321 | if (!ret_val && | 325 | if (!ret_val && |
| 322 | (msgbuf[0] == (E1000_VF_SET_MAC_ADDR | E1000_VT_MSGTYPE_NACK))) | 326 | (msgbuf[0] == (E1000_VF_SET_MAC_ADDR | E1000_VT_MSGTYPE_NACK))) |
diff --git a/drivers/net/ixgbe/ixgbe.h b/drivers/net/ixgbe/ixgbe.h index 1b12c7ba275f..e11d83d5852b 100644 --- a/drivers/net/ixgbe/ixgbe.h +++ b/drivers/net/ixgbe/ixgbe.h | |||
| @@ -96,6 +96,8 @@ | |||
| 96 | #define IXGBE_TX_FLAGS_VLAN_PRIO_MASK 0x0000e000 | 96 | #define IXGBE_TX_FLAGS_VLAN_PRIO_MASK 0x0000e000 |
| 97 | #define IXGBE_TX_FLAGS_VLAN_SHIFT 16 | 97 | #define IXGBE_TX_FLAGS_VLAN_SHIFT 16 |
| 98 | 98 | ||
| 99 | #define IXGBE_MAX_RSC_INT_RATE 162760 | ||
| 100 | |||
| 99 | /* wrapper around a pointer to a socket buffer, | 101 | /* wrapper around a pointer to a socket buffer, |
| 100 | * so a DMA handle can be stored along with the buffer */ | 102 | * so a DMA handle can be stored along with the buffer */ |
| 101 | struct ixgbe_tx_buffer { | 103 | struct ixgbe_tx_buffer { |
diff --git a/drivers/net/ixgbe/ixgbe_82598.c b/drivers/net/ixgbe/ixgbe_82598.c index b9923047ce11..522c03bc1dad 100644 --- a/drivers/net/ixgbe/ixgbe_82598.c +++ b/drivers/net/ixgbe/ixgbe_82598.c | |||
| @@ -50,6 +50,51 @@ static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, | |||
| 50 | u8 *eeprom_data); | 50 | u8 *eeprom_data); |
| 51 | 51 | ||
| 52 | /** | 52 | /** |
| 53 | * ixgbe_set_pcie_completion_timeout - set pci-e completion timeout | ||
| 54 | * @hw: pointer to the HW structure | ||
| 55 | * | ||
| 56 | * The defaults for 82598 should be in the range of 50us to 50ms, | ||
| 57 | * however the hardware default for these parts is 500us to 1ms which is less | ||
| 58 | * than the 10ms recommended by the pci-e spec. To address this we need to | ||
| 59 | * increase the value to either 10ms to 250ms for capability version 1 config, | ||
| 60 | * or 16ms to 55ms for version 2. | ||
| 61 | **/ | ||
| 62 | void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw) | ||
| 63 | { | ||
| 64 | struct ixgbe_adapter *adapter = hw->back; | ||
| 65 | u32 gcr = IXGBE_READ_REG(hw, IXGBE_GCR); | ||
| 66 | u16 pcie_devctl2; | ||
| 67 | |||
| 68 | /* only take action if timeout value is defaulted to 0 */ | ||
| 69 | if (gcr & IXGBE_GCR_CMPL_TMOUT_MASK) | ||
| 70 | goto out; | ||
| 71 | |||
| 72 | /* | ||
| 73 | * if capababilities version is type 1 we can write the | ||
| 74 | * timeout of 10ms to 250ms through the GCR register | ||
| 75 | */ | ||
| 76 | if (!(gcr & IXGBE_GCR_CAP_VER2)) { | ||
| 77 | gcr |= IXGBE_GCR_CMPL_TMOUT_10ms; | ||
| 78 | goto out; | ||
| 79 | } | ||
| 80 | |||
| 81 | /* | ||
| 82 | * for version 2 capabilities we need to write the config space | ||
| 83 | * directly in order to set the completion timeout value for | ||
| 84 | * 16ms to 55ms | ||
| 85 | */ | ||
| 86 | pci_read_config_word(adapter->pdev, | ||
| 87 | IXGBE_PCI_DEVICE_CONTROL2, &pcie_devctl2); | ||
| 88 | pcie_devctl2 |= IXGBE_PCI_DEVICE_CONTROL2_16ms; | ||
| 89 | pci_write_config_word(adapter->pdev, | ||
| 90 | IXGBE_PCI_DEVICE_CONTROL2, pcie_devctl2); | ||
| 91 | out: | ||
| 92 | /* disable completion timeout resend */ | ||
| 93 | gcr &= ~IXGBE_GCR_CMPL_TMOUT_RESEND; | ||
| 94 | IXGBE_WRITE_REG(hw, IXGBE_GCR, gcr); | ||
| 95 | } | ||
| 96 | |||
| 97 | /** | ||
| 53 | * ixgbe_get_pcie_msix_count_82598 - Gets MSI-X vector count | 98 | * ixgbe_get_pcie_msix_count_82598 - Gets MSI-X vector count |
| 54 | * @hw: pointer to hardware structure | 99 | * @hw: pointer to hardware structure |
| 55 | * | 100 | * |
| @@ -153,6 +198,26 @@ out: | |||
| 153 | } | 198 | } |
| 154 | 199 | ||
| 155 | /** | 200 | /** |
| 201 | * ixgbe_start_hw_82598 - Prepare hardware for Tx/Rx | ||
| 202 | * @hw: pointer to hardware structure | ||
| 203 | * | ||
| 204 | * Starts the hardware using the generic start_hw function. | ||
| 205 | * Then set pcie completion timeout | ||
| 206 | **/ | ||
| 207 | s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw) | ||
| 208 | { | ||
| 209 | s32 ret_val = 0; | ||
| 210 | |||
| 211 | ret_val = ixgbe_start_hw_generic(hw); | ||
| 212 | |||
| 213 | /* set the completion timeout for interface */ | ||
| 214 | if (ret_val == 0) | ||
| 215 | ixgbe_set_pcie_completion_timeout(hw); | ||
| 216 | |||
| 217 | return ret_val; | ||
| 218 | } | ||
| 219 | |||
| 220 | /** | ||
| 156 | * ixgbe_get_link_capabilities_82598 - Determines link capabilities | 221 | * ixgbe_get_link_capabilities_82598 - Determines link capabilities |
| 157 | * @hw: pointer to hardware structure | 222 | * @hw: pointer to hardware structure |
| 158 | * @speed: pointer to link speed | 223 | * @speed: pointer to link speed |
| @@ -1085,7 +1150,7 @@ out: | |||
| 1085 | static struct ixgbe_mac_operations mac_ops_82598 = { | 1150 | static struct ixgbe_mac_operations mac_ops_82598 = { |
| 1086 | .init_hw = &ixgbe_init_hw_generic, | 1151 | .init_hw = &ixgbe_init_hw_generic, |
| 1087 | .reset_hw = &ixgbe_reset_hw_82598, | 1152 | .reset_hw = &ixgbe_reset_hw_82598, |
| 1088 | .start_hw = &ixgbe_start_hw_generic, | 1153 | .start_hw = &ixgbe_start_hw_82598, |
| 1089 | .clear_hw_cntrs = &ixgbe_clear_hw_cntrs_generic, | 1154 | .clear_hw_cntrs = &ixgbe_clear_hw_cntrs_generic, |
| 1090 | .get_media_type = &ixgbe_get_media_type_82598, | 1155 | .get_media_type = &ixgbe_get_media_type_82598, |
| 1091 | .get_supported_physical_layer = &ixgbe_get_supported_physical_layer_82598, | 1156 | .get_supported_physical_layer = &ixgbe_get_supported_physical_layer_82598, |
diff --git a/drivers/net/ixgbe/ixgbe_ethtool.c b/drivers/net/ixgbe/ixgbe_ethtool.c index 2a978008fd6e..79144e950a34 100644 --- a/drivers/net/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ixgbe/ixgbe_ethtool.c | |||
| @@ -1975,7 +1975,10 @@ static int ixgbe_set_coalesce(struct net_device *netdev, | |||
| 1975 | * any other value means disable eitr, which is best | 1975 | * any other value means disable eitr, which is best |
| 1976 | * served by setting the interrupt rate very high | 1976 | * served by setting the interrupt rate very high |
| 1977 | */ | 1977 | */ |
| 1978 | adapter->eitr_param = IXGBE_MAX_INT_RATE; | 1978 | if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) |
| 1979 | adapter->eitr_param = IXGBE_MAX_RSC_INT_RATE; | ||
| 1980 | else | ||
| 1981 | adapter->eitr_param = IXGBE_MAX_INT_RATE; | ||
| 1979 | adapter->itr_setting = 0; | 1982 | adapter->itr_setting = 0; |
| 1980 | } | 1983 | } |
| 1981 | 1984 | ||
| @@ -1999,13 +2002,13 @@ static int ixgbe_set_flags(struct net_device *netdev, u32 data) | |||
| 1999 | 2002 | ||
| 2000 | ethtool_op_set_flags(netdev, data); | 2003 | ethtool_op_set_flags(netdev, data); |
| 2001 | 2004 | ||
| 2002 | if (!(adapter->flags & IXGBE_FLAG2_RSC_CAPABLE)) | 2005 | if (!(adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE)) |
| 2003 | return 0; | 2006 | return 0; |
| 2004 | 2007 | ||
| 2005 | /* if state changes we need to update adapter->flags and reset */ | 2008 | /* if state changes we need to update adapter->flags and reset */ |
| 2006 | if ((!!(data & ETH_FLAG_LRO)) != | 2009 | if ((!!(data & ETH_FLAG_LRO)) != |
| 2007 | (!!(adapter->flags & IXGBE_FLAG2_RSC_ENABLED))) { | 2010 | (!!(adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED))) { |
| 2008 | adapter->flags ^= IXGBE_FLAG2_RSC_ENABLED; | 2011 | adapter->flags2 ^= IXGBE_FLAG2_RSC_ENABLED; |
| 2009 | if (netif_running(netdev)) | 2012 | if (netif_running(netdev)) |
| 2010 | ixgbe_reinit_locked(adapter); | 2013 | ixgbe_reinit_locked(adapter); |
| 2011 | else | 2014 | else |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 200454f30f6a..110c65ab5cb5 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -780,7 +780,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||
| 780 | prefetch(next_rxd); | 780 | prefetch(next_rxd); |
| 781 | cleaned_count++; | 781 | cleaned_count++; |
| 782 | 782 | ||
| 783 | if (adapter->flags & IXGBE_FLAG2_RSC_CAPABLE) | 783 | if (adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE) |
| 784 | rsc_count = ixgbe_get_rsc_count(rx_desc); | 784 | rsc_count = ixgbe_get_rsc_count(rx_desc); |
| 785 | 785 | ||
| 786 | if (rsc_count) { | 786 | if (rsc_count) { |
| @@ -2036,7 +2036,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) | |||
| 2036 | IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype); | 2036 | IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype); |
| 2037 | } | 2037 | } |
| 2038 | } else { | 2038 | } else { |
| 2039 | if (!(adapter->flags & IXGBE_FLAG2_RSC_ENABLED) && | 2039 | if (!(adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) && |
| 2040 | (netdev->mtu <= ETH_DATA_LEN)) | 2040 | (netdev->mtu <= ETH_DATA_LEN)) |
| 2041 | rx_buf_len = MAXIMUM_ETHERNET_VLAN_SIZE; | 2041 | rx_buf_len = MAXIMUM_ETHERNET_VLAN_SIZE; |
| 2042 | else | 2042 | else |
| @@ -2165,7 +2165,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) | |||
| 2165 | IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl); | 2165 | IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl); |
| 2166 | } | 2166 | } |
| 2167 | 2167 | ||
| 2168 | if (adapter->flags & IXGBE_FLAG2_RSC_ENABLED) { | 2168 | if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { |
| 2169 | /* Enable 82599 HW-RSC */ | 2169 | /* Enable 82599 HW-RSC */ |
| 2170 | for (i = 0; i < adapter->num_rx_queues; i++) { | 2170 | for (i = 0; i < adapter->num_rx_queues; i++) { |
| 2171 | j = adapter->rx_ring[i].reg_idx; | 2171 | j = adapter->rx_ring[i].reg_idx; |
| @@ -3812,8 +3812,8 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter) | |||
| 3812 | adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82598; | 3812 | adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82598; |
| 3813 | } else if (hw->mac.type == ixgbe_mac_82599EB) { | 3813 | } else if (hw->mac.type == ixgbe_mac_82599EB) { |
| 3814 | adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82599; | 3814 | adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82599; |
| 3815 | adapter->flags |= IXGBE_FLAG2_RSC_CAPABLE; | 3815 | adapter->flags2 |= IXGBE_FLAG2_RSC_CAPABLE; |
| 3816 | adapter->flags |= IXGBE_FLAG2_RSC_ENABLED; | 3816 | adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED; |
| 3817 | adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE; | 3817 | adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE; |
| 3818 | adapter->ring_feature[RING_F_FDIR].indices = | 3818 | adapter->ring_feature[RING_F_FDIR].indices = |
| 3819 | IXGBE_MAX_FDIR_INDICES; | 3819 | IXGBE_MAX_FDIR_INDICES; |
| @@ -5360,12 +5360,19 @@ static int ixgbe_del_sanmac_netdev(struct net_device *dev) | |||
| 5360 | static void ixgbe_netpoll(struct net_device *netdev) | 5360 | static void ixgbe_netpoll(struct net_device *netdev) |
| 5361 | { | 5361 | { |
| 5362 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 5362 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
| 5363 | int i; | ||
| 5363 | 5364 | ||
| 5364 | disable_irq(adapter->pdev->irq); | ||
| 5365 | adapter->flags |= IXGBE_FLAG_IN_NETPOLL; | 5365 | adapter->flags |= IXGBE_FLAG_IN_NETPOLL; |
| 5366 | ixgbe_intr(adapter->pdev->irq, netdev); | 5366 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { |
| 5367 | int num_q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; | ||
| 5368 | for (i = 0; i < num_q_vectors; i++) { | ||
| 5369 | struct ixgbe_q_vector *q_vector = adapter->q_vector[i]; | ||
| 5370 | ixgbe_msix_clean_many(0, q_vector); | ||
| 5371 | } | ||
| 5372 | } else { | ||
| 5373 | ixgbe_intr(adapter->pdev->irq, netdev); | ||
| 5374 | } | ||
| 5367 | adapter->flags &= ~IXGBE_FLAG_IN_NETPOLL; | 5375 | adapter->flags &= ~IXGBE_FLAG_IN_NETPOLL; |
| 5368 | enable_irq(adapter->pdev->irq); | ||
| 5369 | } | 5376 | } |
| 5370 | #endif | 5377 | #endif |
| 5371 | 5378 | ||
| @@ -5611,7 +5618,7 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, | |||
| 5611 | if (pci_using_dac) | 5618 | if (pci_using_dac) |
| 5612 | netdev->features |= NETIF_F_HIGHDMA; | 5619 | netdev->features |= NETIF_F_HIGHDMA; |
| 5613 | 5620 | ||
| 5614 | if (adapter->flags & IXGBE_FLAG2_RSC_ENABLED) | 5621 | if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) |
| 5615 | netdev->features |= NETIF_F_LRO; | 5622 | netdev->features |= NETIF_F_LRO; |
| 5616 | 5623 | ||
| 5617 | /* make sure the EEPROM is good */ | 5624 | /* make sure the EEPROM is good */ |
diff --git a/drivers/net/ixgbe/ixgbe_type.h b/drivers/net/ixgbe/ixgbe_type.h index fa87309dc087..be90eb4575f6 100644 --- a/drivers/net/ixgbe/ixgbe_type.h +++ b/drivers/net/ixgbe/ixgbe_type.h | |||
| @@ -718,6 +718,12 @@ | |||
| 718 | #define IXGBE_ECC_STATUS_82599 0x110E0 | 718 | #define IXGBE_ECC_STATUS_82599 0x110E0 |
| 719 | #define IXGBE_BAR_CTRL_82599 0x110F4 | 719 | #define IXGBE_BAR_CTRL_82599 0x110F4 |
| 720 | 720 | ||
| 721 | /* PCI Express Control */ | ||
| 722 | #define IXGBE_GCR_CMPL_TMOUT_MASK 0x0000F000 | ||
| 723 | #define IXGBE_GCR_CMPL_TMOUT_10ms 0x00001000 | ||
| 724 | #define IXGBE_GCR_CMPL_TMOUT_RESEND 0x00010000 | ||
| 725 | #define IXGBE_GCR_CAP_VER2 0x00040000 | ||
| 726 | |||
| 721 | /* Time Sync Registers */ | 727 | /* Time Sync Registers */ |
| 722 | #define IXGBE_TSYNCRXCTL 0x05188 /* Rx Time Sync Control register - RW */ | 728 | #define IXGBE_TSYNCRXCTL 0x05188 /* Rx Time Sync Control register - RW */ |
| 723 | #define IXGBE_TSYNCTXCTL 0x08C00 /* Tx Time Sync Control register - RW */ | 729 | #define IXGBE_TSYNCTXCTL 0x08C00 /* Tx Time Sync Control register - RW */ |
| @@ -1521,6 +1527,7 @@ | |||
| 1521 | 1527 | ||
| 1522 | /* PCI Bus Info */ | 1528 | /* PCI Bus Info */ |
| 1523 | #define IXGBE_PCI_LINK_STATUS 0xB2 | 1529 | #define IXGBE_PCI_LINK_STATUS 0xB2 |
| 1530 | #define IXGBE_PCI_DEVICE_CONTROL2 0xC8 | ||
| 1524 | #define IXGBE_PCI_LINK_WIDTH 0x3F0 | 1531 | #define IXGBE_PCI_LINK_WIDTH 0x3F0 |
| 1525 | #define IXGBE_PCI_LINK_WIDTH_1 0x10 | 1532 | #define IXGBE_PCI_LINK_WIDTH_1 0x10 |
| 1526 | #define IXGBE_PCI_LINK_WIDTH_2 0x20 | 1533 | #define IXGBE_PCI_LINK_WIDTH_2 0x20 |
| @@ -1531,6 +1538,7 @@ | |||
| 1531 | #define IXGBE_PCI_LINK_SPEED_5000 0x2 | 1538 | #define IXGBE_PCI_LINK_SPEED_5000 0x2 |
| 1532 | #define IXGBE_PCI_HEADER_TYPE_REGISTER 0x0E | 1539 | #define IXGBE_PCI_HEADER_TYPE_REGISTER 0x0E |
| 1533 | #define IXGBE_PCI_HEADER_TYPE_MULTIFUNC 0x80 | 1540 | #define IXGBE_PCI_HEADER_TYPE_MULTIFUNC 0x80 |
| 1541 | #define IXGBE_PCI_DEVICE_CONTROL2_16ms 0x0005 | ||
| 1534 | 1542 | ||
| 1535 | /* Number of 100 microseconds we wait for PCI Express master disable */ | 1543 | /* Number of 100 microseconds we wait for PCI Express master disable */ |
| 1536 | #define IXGBE_PCI_MASTER_DISABLE_TIMEOUT 800 | 1544 | #define IXGBE_PCI_MASTER_DISABLE_TIMEOUT 800 |
diff --git a/drivers/net/mlx4/en_tx.c b/drivers/net/mlx4/en_tx.c index 08c43f2ae72b..5a88b3f57693 100644 --- a/drivers/net/mlx4/en_tx.c +++ b/drivers/net/mlx4/en_tx.c | |||
| @@ -249,6 +249,7 @@ static u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv, | |||
| 249 | pci_unmap_page(mdev->pdev, | 249 | pci_unmap_page(mdev->pdev, |
| 250 | (dma_addr_t) be64_to_cpu(data->addr), | 250 | (dma_addr_t) be64_to_cpu(data->addr), |
| 251 | frag->size, PCI_DMA_TODEVICE); | 251 | frag->size, PCI_DMA_TODEVICE); |
| 252 | ++data; | ||
| 252 | } | 253 | } |
| 253 | } | 254 | } |
| 254 | /* Stamp the freed descriptor */ | 255 | /* Stamp the freed descriptor */ |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 637ac8b89bac..3cd8cfcf627b 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
| @@ -221,7 +221,7 @@ netxen_napi_disable(struct netxen_adapter *adapter) | |||
| 221 | } | 221 | } |
| 222 | } | 222 | } |
| 223 | 223 | ||
| 224 | static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) | 224 | static int nx_set_dma_mask(struct netxen_adapter *adapter) |
| 225 | { | 225 | { |
| 226 | struct pci_dev *pdev = adapter->pdev; | 226 | struct pci_dev *pdev = adapter->pdev; |
| 227 | uint64_t mask, cmask; | 227 | uint64_t mask, cmask; |
| @@ -229,19 +229,17 @@ static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) | |||
| 229 | adapter->pci_using_dac = 0; | 229 | adapter->pci_using_dac = 0; |
| 230 | 230 | ||
| 231 | mask = DMA_BIT_MASK(32); | 231 | mask = DMA_BIT_MASK(32); |
| 232 | /* | ||
| 233 | * Consistent DMA mask is set to 32 bit because it cannot be set to | ||
| 234 | * 35 bits. For P3 also leave it at 32 bits for now. Only the rings | ||
| 235 | * come off this pool. | ||
| 236 | */ | ||
| 237 | cmask = DMA_BIT_MASK(32); | 232 | cmask = DMA_BIT_MASK(32); |
| 238 | 233 | ||
| 234 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | ||
| 239 | #ifndef CONFIG_IA64 | 235 | #ifndef CONFIG_IA64 |
| 240 | if (revision_id >= NX_P3_B0) | ||
| 241 | mask = DMA_BIT_MASK(39); | ||
| 242 | else if (revision_id == NX_P2_C1) | ||
| 243 | mask = DMA_BIT_MASK(35); | 236 | mask = DMA_BIT_MASK(35); |
| 244 | #endif | 237 | #endif |
| 238 | } else { | ||
| 239 | mask = DMA_BIT_MASK(39); | ||
| 240 | cmask = mask; | ||
| 241 | } | ||
| 242 | |||
| 245 | if (pci_set_dma_mask(pdev, mask) == 0 && | 243 | if (pci_set_dma_mask(pdev, mask) == 0 && |
| 246 | pci_set_consistent_dma_mask(pdev, cmask) == 0) { | 244 | pci_set_consistent_dma_mask(pdev, cmask) == 0) { |
| 247 | adapter->pci_using_dac = 1; | 245 | adapter->pci_using_dac = 1; |
| @@ -256,7 +254,7 @@ static int | |||
| 256 | nx_update_dma_mask(struct netxen_adapter *adapter) | 254 | nx_update_dma_mask(struct netxen_adapter *adapter) |
| 257 | { | 255 | { |
| 258 | int change, shift, err; | 256 | int change, shift, err; |
| 259 | uint64_t mask, old_mask; | 257 | uint64_t mask, old_mask, old_cmask; |
| 260 | struct pci_dev *pdev = adapter->pdev; | 258 | struct pci_dev *pdev = adapter->pdev; |
| 261 | 259 | ||
| 262 | change = 0; | 260 | change = 0; |
| @@ -272,14 +270,29 @@ nx_update_dma_mask(struct netxen_adapter *adapter) | |||
| 272 | 270 | ||
| 273 | if (change) { | 271 | if (change) { |
| 274 | old_mask = pdev->dma_mask; | 272 | old_mask = pdev->dma_mask; |
| 273 | old_cmask = pdev->dev.coherent_dma_mask; | ||
| 274 | |||
| 275 | mask = (1ULL<<(32+shift)) - 1; | 275 | mask = (1ULL<<(32+shift)) - 1; |
| 276 | 276 | ||
| 277 | err = pci_set_dma_mask(pdev, mask); | 277 | err = pci_set_dma_mask(pdev, mask); |
| 278 | if (err) | 278 | if (err) |
| 279 | return pci_set_dma_mask(pdev, old_mask); | 279 | goto err_out; |
| 280 | |||
| 281 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | ||
| 282 | |||
| 283 | err = pci_set_consistent_dma_mask(pdev, mask); | ||
| 284 | if (err) | ||
| 285 | goto err_out; | ||
| 286 | } | ||
| 287 | dev_info(&pdev->dev, "using %d-bit dma mask\n", 32+shift); | ||
| 280 | } | 288 | } |
| 281 | 289 | ||
| 282 | return 0; | 290 | return 0; |
| 291 | |||
| 292 | err_out: | ||
| 293 | pci_set_dma_mask(pdev, old_mask); | ||
| 294 | pci_set_consistent_dma_mask(pdev, old_cmask); | ||
| 295 | return err; | ||
| 283 | } | 296 | } |
| 284 | 297 | ||
| 285 | static void netxen_check_options(struct netxen_adapter *adapter) | 298 | static void netxen_check_options(struct netxen_adapter *adapter) |
| @@ -1006,7 +1019,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 1006 | revision_id = pdev->revision; | 1019 | revision_id = pdev->revision; |
| 1007 | adapter->ahw.revision_id = revision_id; | 1020 | adapter->ahw.revision_id = revision_id; |
| 1008 | 1021 | ||
| 1009 | err = nx_set_dma_mask(adapter, revision_id); | 1022 | err = nx_set_dma_mask(adapter); |
| 1010 | if (err) | 1023 | if (err) |
| 1011 | goto err_out_free_netdev; | 1024 | goto err_out_free_netdev; |
| 1012 | 1025 | ||
diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c index 28368157dac4..a646a445fda9 100644 --- a/drivers/net/pcnet32.c +++ b/drivers/net/pcnet32.c | |||
| @@ -1611,8 +1611,11 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
| 1611 | if (pcnet32_dwio_read_csr(ioaddr, 0) == 4 | 1611 | if (pcnet32_dwio_read_csr(ioaddr, 0) == 4 |
| 1612 | && pcnet32_dwio_check(ioaddr)) { | 1612 | && pcnet32_dwio_check(ioaddr)) { |
| 1613 | a = &pcnet32_dwio; | 1613 | a = &pcnet32_dwio; |
| 1614 | } else | 1614 | } else { |
| 1615 | if (pcnet32_debug & NETIF_MSG_PROBE) | ||
| 1616 | printk(KERN_ERR PFX "No access methods\n"); | ||
| 1615 | goto err_release_region; | 1617 | goto err_release_region; |
| 1618 | } | ||
| 1616 | } | 1619 | } |
| 1617 | 1620 | ||
| 1618 | chip_version = | 1621 | chip_version = |
| @@ -1719,7 +1722,9 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
| 1719 | ret = -ENOMEM; | 1722 | ret = -ENOMEM; |
| 1720 | goto err_release_region; | 1723 | goto err_release_region; |
| 1721 | } | 1724 | } |
| 1722 | SET_NETDEV_DEV(dev, &pdev->dev); | 1725 | |
| 1726 | if (pdev) | ||
| 1727 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
| 1723 | 1728 | ||
| 1724 | if (pcnet32_debug & NETIF_MSG_PROBE) | 1729 | if (pcnet32_debug & NETIF_MSG_PROBE) |
| 1725 | printk(KERN_INFO PFX "%s at %#3lx,", chipname, ioaddr); | 1730 | printk(KERN_INFO PFX "%s at %#3lx,", chipname, ioaddr); |
| @@ -1818,7 +1823,6 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
| 1818 | 1823 | ||
| 1819 | spin_lock_init(&lp->lock); | 1824 | spin_lock_init(&lp->lock); |
| 1820 | 1825 | ||
| 1821 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
| 1822 | lp->name = chipname; | 1826 | lp->name = chipname; |
| 1823 | lp->shared_irq = shared; | 1827 | lp->shared_irq = shared; |
| 1824 | lp->tx_ring_size = TX_RING_SIZE; /* default tx ring size */ | 1828 | lp->tx_ring_size = TX_RING_SIZE; /* default tx ring size */ |
| @@ -1852,12 +1856,6 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
| 1852 | ((cards_found >= MAX_UNITS) || full_duplex[cards_found])) | 1856 | ((cards_found >= MAX_UNITS) || full_duplex[cards_found])) |
| 1853 | lp->options |= PCNET32_PORT_FD; | 1857 | lp->options |= PCNET32_PORT_FD; |
| 1854 | 1858 | ||
| 1855 | if (!a) { | ||
| 1856 | if (pcnet32_debug & NETIF_MSG_PROBE) | ||
| 1857 | printk(KERN_ERR PFX "No access methods\n"); | ||
| 1858 | ret = -ENODEV; | ||
| 1859 | goto err_free_consistent; | ||
| 1860 | } | ||
| 1861 | lp->a = *a; | 1859 | lp->a = *a; |
| 1862 | 1860 | ||
| 1863 | /* prior to register_netdev, dev->name is not yet correct */ | 1861 | /* prior to register_netdev, dev->name is not yet correct */ |
| @@ -1973,14 +1971,13 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
| 1973 | 1971 | ||
| 1974 | return 0; | 1972 | return 0; |
| 1975 | 1973 | ||
| 1976 | err_free_ring: | 1974 | err_free_ring: |
| 1977 | pcnet32_free_ring(dev); | 1975 | pcnet32_free_ring(dev); |
| 1978 | err_free_consistent: | ||
| 1979 | pci_free_consistent(lp->pci_dev, sizeof(*lp->init_block), | 1976 | pci_free_consistent(lp->pci_dev, sizeof(*lp->init_block), |
| 1980 | lp->init_block, lp->init_dma_addr); | 1977 | lp->init_block, lp->init_dma_addr); |
| 1981 | err_free_netdev: | 1978 | err_free_netdev: |
| 1982 | free_netdev(dev); | 1979 | free_netdev(dev); |
| 1983 | err_release_region: | 1980 | err_release_region: |
| 1984 | release_region(ioaddr, PCNET32_TOTAL_SIZE); | 1981 | release_region(ioaddr, PCNET32_TOTAL_SIZE); |
| 1985 | return ret; | 1982 | return ret; |
| 1986 | } | 1983 | } |
| @@ -2089,6 +2086,7 @@ static void pcnet32_free_ring(struct net_device *dev) | |||
| 2089 | static int pcnet32_open(struct net_device *dev) | 2086 | static int pcnet32_open(struct net_device *dev) |
| 2090 | { | 2087 | { |
| 2091 | struct pcnet32_private *lp = netdev_priv(dev); | 2088 | struct pcnet32_private *lp = netdev_priv(dev); |
| 2089 | struct pci_dev *pdev = lp->pci_dev; | ||
| 2092 | unsigned long ioaddr = dev->base_addr; | 2090 | unsigned long ioaddr = dev->base_addr; |
| 2093 | u16 val; | 2091 | u16 val; |
| 2094 | int i; | 2092 | int i; |
| @@ -2149,9 +2147,9 @@ static int pcnet32_open(struct net_device *dev) | |||
| 2149 | lp->a.write_csr(ioaddr, 124, val); | 2147 | lp->a.write_csr(ioaddr, 124, val); |
| 2150 | 2148 | ||
| 2151 | /* Allied Telesyn AT 2700/2701 FX are 100Mbit only and do not negotiate */ | 2149 | /* Allied Telesyn AT 2700/2701 FX are 100Mbit only and do not negotiate */ |
| 2152 | if (lp->pci_dev->subsystem_vendor == PCI_VENDOR_ID_AT && | 2150 | if (pdev && pdev->subsystem_vendor == PCI_VENDOR_ID_AT && |
| 2153 | (lp->pci_dev->subsystem_device == PCI_SUBDEVICE_ID_AT_2700FX || | 2151 | (pdev->subsystem_device == PCI_SUBDEVICE_ID_AT_2700FX || |
| 2154 | lp->pci_dev->subsystem_device == PCI_SUBDEVICE_ID_AT_2701FX)) { | 2152 | pdev->subsystem_device == PCI_SUBDEVICE_ID_AT_2701FX)) { |
| 2155 | if (lp->options & PCNET32_PORT_ASEL) { | 2153 | if (lp->options & PCNET32_PORT_ASEL) { |
| 2156 | lp->options = PCNET32_PORT_FD | PCNET32_PORT_100; | 2154 | lp->options = PCNET32_PORT_FD | PCNET32_PORT_100; |
| 2157 | if (netif_msg_link(lp)) | 2155 | if (netif_msg_link(lp)) |
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index 639d11bc444e..cd37d739ac74 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c | |||
| @@ -1384,7 +1384,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) | |||
| 1384 | 1384 | ||
| 1385 | /* create a fragment for each channel */ | 1385 | /* create a fragment for each channel */ |
| 1386 | bits = B; | 1386 | bits = B; |
| 1387 | while (nfree > 0 && len > 0) { | 1387 | while (len > 0) { |
| 1388 | list = list->next; | 1388 | list = list->next; |
| 1389 | if (list == &ppp->channels) { | 1389 | if (list == &ppp->channels) { |
| 1390 | i = 0; | 1390 | i = 0; |
| @@ -1431,29 +1431,31 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) | |||
| 1431 | *otherwise divide it according to the speed | 1431 | *otherwise divide it according to the speed |
| 1432 | *of the channel we are going to transmit on | 1432 | *of the channel we are going to transmit on |
| 1433 | */ | 1433 | */ |
| 1434 | if (pch->speed == 0) { | 1434 | if (nfree > 0) { |
| 1435 | flen = totlen/nfree ; | 1435 | if (pch->speed == 0) { |
| 1436 | if (nbigger > 0) { | 1436 | flen = totlen/nfree ; |
| 1437 | flen++; | 1437 | if (nbigger > 0) { |
| 1438 | nbigger--; | 1438 | flen++; |
| 1439 | } | 1439 | nbigger--; |
| 1440 | } else { | 1440 | } |
| 1441 | flen = (((totfree - nzero)*(totlen + hdrlen*totfree)) / | 1441 | } else { |
| 1442 | ((totspeed*totfree)/pch->speed)) - hdrlen; | 1442 | flen = (((totfree - nzero)*(totlen + hdrlen*totfree)) / |
| 1443 | if (nbigger > 0) { | 1443 | ((totspeed*totfree)/pch->speed)) - hdrlen; |
| 1444 | flen += ((totfree - nzero)*pch->speed)/totspeed; | 1444 | if (nbigger > 0) { |
| 1445 | nbigger -= ((totfree - nzero)*pch->speed)/ | 1445 | flen += ((totfree - nzero)*pch->speed)/totspeed; |
| 1446 | nbigger -= ((totfree - nzero)*pch->speed)/ | ||
| 1446 | totspeed; | 1447 | totspeed; |
| 1448 | } | ||
| 1447 | } | 1449 | } |
| 1450 | nfree--; | ||
| 1448 | } | 1451 | } |
| 1449 | nfree--; | ||
| 1450 | 1452 | ||
| 1451 | /* | 1453 | /* |
| 1452 | *check if we are on the last channel or | 1454 | *check if we are on the last channel or |
| 1453 | *we exceded the lenght of the data to | 1455 | *we exceded the lenght of the data to |
| 1454 | *fragment | 1456 | *fragment |
| 1455 | */ | 1457 | */ |
| 1456 | if ((nfree == 0) || (flen > len)) | 1458 | if ((nfree <= 0) || (flen > len)) |
| 1457 | flen = len; | 1459 | flen = len; |
| 1458 | /* | 1460 | /* |
| 1459 | *it is not worth to tx on slow channels: | 1461 | *it is not worth to tx on slow channels: |
| @@ -1467,7 +1469,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) | |||
| 1467 | continue; | 1469 | continue; |
| 1468 | } | 1470 | } |
| 1469 | 1471 | ||
| 1470 | mtu = pch->chan->mtu + 2 - hdrlen; | 1472 | mtu = pch->chan->mtu - hdrlen; |
| 1471 | if (mtu < 4) | 1473 | if (mtu < 4) |
| 1472 | mtu = 4; | 1474 | mtu = 4; |
| 1473 | if (flen > mtu) | 1475 | if (flen > mtu) |
diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c index f0031f1f97e5..5f2090233d7b 100644 --- a/drivers/net/pppoe.c +++ b/drivers/net/pppoe.c | |||
| @@ -1063,6 +1063,7 @@ static void *pppoe_seq_next(struct seq_file *seq, void *v, loff_t *pos) | |||
| 1063 | else { | 1063 | else { |
| 1064 | int hash = hash_item(po->pppoe_pa.sid, po->pppoe_pa.remote); | 1064 | int hash = hash_item(po->pppoe_pa.sid, po->pppoe_pa.remote); |
| 1065 | 1065 | ||
| 1066 | po = NULL; | ||
| 1066 | while (++hash < PPPOE_HASH_SIZE) { | 1067 | while (++hash < PPPOE_HASH_SIZE) { |
| 1067 | po = pn->hash_table[hash]; | 1068 | po = pn->hash_table[hash]; |
| 1068 | if (po) | 1069 | if (po) |
diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c index e7935d09c896..e0f9219a0aea 100644 --- a/drivers/net/pppol2tp.c +++ b/drivers/net/pppol2tp.c | |||
| @@ -2680,6 +2680,7 @@ out_unregister_pppol2tp_proto: | |||
| 2680 | static void __exit pppol2tp_exit(void) | 2680 | static void __exit pppol2tp_exit(void) |
| 2681 | { | 2681 | { |
| 2682 | unregister_pppox_proto(PX_PROTO_OL2TP); | 2682 | unregister_pppox_proto(PX_PROTO_OL2TP); |
| 2683 | unregister_pernet_gen_device(pppol2tp_net_id, &pppol2tp_net_ops); | ||
| 2683 | proto_unregister(&pppol2tp_sk_proto); | 2684 | proto_unregister(&pppol2tp_sk_proto); |
| 2684 | } | 2685 | } |
| 2685 | 2686 | ||
diff --git a/drivers/net/s6gmac.c b/drivers/net/s6gmac.c index 5345e47b35ac..4525cbe8dd69 100644 --- a/drivers/net/s6gmac.c +++ b/drivers/net/s6gmac.c | |||
| @@ -793,7 +793,7 @@ static inline int s6gmac_phy_start(struct net_device *dev) | |||
| 793 | struct s6gmac *pd = netdev_priv(dev); | 793 | struct s6gmac *pd = netdev_priv(dev); |
| 794 | int i = 0; | 794 | int i = 0; |
| 795 | struct phy_device *p = NULL; | 795 | struct phy_device *p = NULL; |
| 796 | while ((!(p = pd->mii.bus->phy_map[i])) && (i < PHY_MAX_ADDR)) | 796 | while ((i < PHY_MAX_ADDR) && (!(p = pd->mii.bus->phy_map[i]))) |
| 797 | i++; | 797 | i++; |
| 798 | p = phy_connect(dev, dev_name(&p->dev), &s6gmac_adjust_link, 0, | 798 | p = phy_connect(dev, dev_name(&p->dev), &s6gmac_adjust_link, 0, |
| 799 | PHY_INTERFACE_MODE_RGMII); | 799 | PHY_INTERFACE_MODE_RGMII); |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 3550c5dcd93c..0a551d8f5d95 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
| @@ -1488,6 +1488,8 @@ static int sky2_up(struct net_device *dev) | |||
| 1488 | sky2_set_vlan_mode(hw, port, sky2->vlgrp != NULL); | 1488 | sky2_set_vlan_mode(hw, port, sky2->vlgrp != NULL); |
| 1489 | #endif | 1489 | #endif |
| 1490 | 1490 | ||
| 1491 | sky2->restarting = 0; | ||
| 1492 | |||
| 1491 | err = sky2_rx_start(sky2); | 1493 | err = sky2_rx_start(sky2); |
| 1492 | if (err) | 1494 | if (err) |
| 1493 | goto err_out; | 1495 | goto err_out; |
| @@ -1500,6 +1502,9 @@ static int sky2_up(struct net_device *dev) | |||
| 1500 | 1502 | ||
| 1501 | sky2_set_multicast(dev); | 1503 | sky2_set_multicast(dev); |
| 1502 | 1504 | ||
| 1505 | /* wake queue incase we are restarting */ | ||
| 1506 | netif_wake_queue(dev); | ||
| 1507 | |||
| 1503 | if (netif_msg_ifup(sky2)) | 1508 | if (netif_msg_ifup(sky2)) |
| 1504 | printk(KERN_INFO PFX "%s: enabling interface\n", dev->name); | 1509 | printk(KERN_INFO PFX "%s: enabling interface\n", dev->name); |
| 1505 | return 0; | 1510 | return 0; |
| @@ -1533,6 +1538,8 @@ static inline int tx_dist(unsigned tail, unsigned head) | |||
| 1533 | /* Number of list elements available for next tx */ | 1538 | /* Number of list elements available for next tx */ |
| 1534 | static inline int tx_avail(const struct sky2_port *sky2) | 1539 | static inline int tx_avail(const struct sky2_port *sky2) |
| 1535 | { | 1540 | { |
| 1541 | if (unlikely(sky2->restarting)) | ||
| 1542 | return 0; | ||
| 1536 | return sky2->tx_pending - tx_dist(sky2->tx_cons, sky2->tx_prod); | 1543 | return sky2->tx_pending - tx_dist(sky2->tx_cons, sky2->tx_prod); |
| 1537 | } | 1544 | } |
| 1538 | 1545 | ||
| @@ -1818,6 +1825,10 @@ static int sky2_down(struct net_device *dev) | |||
| 1818 | if (netif_msg_ifdown(sky2)) | 1825 | if (netif_msg_ifdown(sky2)) |
| 1819 | printk(KERN_INFO PFX "%s: disabling interface\n", dev->name); | 1826 | printk(KERN_INFO PFX "%s: disabling interface\n", dev->name); |
| 1820 | 1827 | ||
| 1828 | /* explicitly shut off tx incase we're restarting */ | ||
| 1829 | sky2->restarting = 1; | ||
| 1830 | netif_tx_disable(dev); | ||
| 1831 | |||
| 1821 | /* Force flow control off */ | 1832 | /* Force flow control off */ |
| 1822 | sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_OFF); | 1833 | sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_OFF); |
| 1823 | 1834 | ||
| @@ -2359,7 +2370,7 @@ static inline void sky2_tx_done(struct net_device *dev, u16 last) | |||
| 2359 | { | 2370 | { |
| 2360 | struct sky2_port *sky2 = netdev_priv(dev); | 2371 | struct sky2_port *sky2 = netdev_priv(dev); |
| 2361 | 2372 | ||
| 2362 | if (netif_running(dev)) { | 2373 | if (likely(netif_running(dev) && !sky2->restarting)) { |
| 2363 | netif_tx_lock(dev); | 2374 | netif_tx_lock(dev); |
| 2364 | sky2_tx_complete(sky2, last); | 2375 | sky2_tx_complete(sky2, last); |
| 2365 | netif_tx_unlock(dev); | 2376 | netif_tx_unlock(dev); |
| @@ -4283,6 +4294,7 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw, | |||
| 4283 | spin_lock_init(&sky2->phy_lock); | 4294 | spin_lock_init(&sky2->phy_lock); |
| 4284 | sky2->tx_pending = TX_DEF_PENDING; | 4295 | sky2->tx_pending = TX_DEF_PENDING; |
| 4285 | sky2->rx_pending = RX_DEF_PENDING; | 4296 | sky2->rx_pending = RX_DEF_PENDING; |
| 4297 | sky2->restarting = 0; | ||
| 4286 | 4298 | ||
| 4287 | hw->dev[port] = dev; | 4299 | hw->dev[port] = dev; |
| 4288 | 4300 | ||
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index b5549c9e5107..4486b066b43f 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h | |||
| @@ -2051,6 +2051,7 @@ struct sky2_port { | |||
| 2051 | u8 duplex; /* DUPLEX_HALF, DUPLEX_FULL */ | 2051 | u8 duplex; /* DUPLEX_HALF, DUPLEX_FULL */ |
| 2052 | u8 rx_csum; | 2052 | u8 rx_csum; |
| 2053 | u8 wol; | 2053 | u8 wol; |
| 2054 | u8 restarting; | ||
| 2054 | enum flow_control flow_mode; | 2055 | enum flow_control flow_mode; |
| 2055 | enum flow_control flow_status; | 2056 | enum flow_control flow_status; |
| 2056 | 2057 | ||
diff --git a/drivers/net/tulip/de4x5.c b/drivers/net/tulip/de4x5.c index eb72d2e9ab3d..acfdccd44567 100644 --- a/drivers/net/tulip/de4x5.c +++ b/drivers/net/tulip/de4x5.c | |||
| @@ -5059,7 +5059,7 @@ mii_get_phy(struct net_device *dev) | |||
| 5059 | if ((id == 0) || (id == 65535)) continue; /* Valid ID? */ | 5059 | if ((id == 0) || (id == 65535)) continue; /* Valid ID? */ |
| 5060 | for (j=0; j<limit; j++) { /* Search PHY table */ | 5060 | for (j=0; j<limit; j++) { /* Search PHY table */ |
| 5061 | if (id != phy_info[j].id) continue; /* ID match? */ | 5061 | if (id != phy_info[j].id) continue; /* ID match? */ |
| 5062 | for (k=0; lp->phy[k].id && (k < DE4X5_MAX_PHY); k++); | 5062 | for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++); |
| 5063 | if (k < DE4X5_MAX_PHY) { | 5063 | if (k < DE4X5_MAX_PHY) { |
| 5064 | memcpy((char *)&lp->phy[k], | 5064 | memcpy((char *)&lp->phy[k], |
| 5065 | (char *)&phy_info[j], sizeof(struct phy_table)); | 5065 | (char *)&phy_info[j], sizeof(struct phy_table)); |
| @@ -5072,7 +5072,7 @@ mii_get_phy(struct net_device *dev) | |||
| 5072 | break; | 5072 | break; |
| 5073 | } | 5073 | } |
| 5074 | if ((j == limit) && (i < DE4X5_MAX_MII)) { | 5074 | if ((j == limit) && (i < DE4X5_MAX_MII)) { |
| 5075 | for (k=0; lp->phy[k].id && (k < DE4X5_MAX_PHY); k++); | 5075 | for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++); |
| 5076 | lp->phy[k].addr = i; | 5076 | lp->phy[k].addr = i; |
| 5077 | lp->phy[k].id = id; | 5077 | lp->phy[k].id = id; |
| 5078 | lp->phy[k].spd.reg = GENERIC_REG; /* ANLPA register */ | 5078 | lp->phy[k].spd.reg = GENERIC_REG; /* ANLPA register */ |
| @@ -5091,7 +5091,7 @@ mii_get_phy(struct net_device *dev) | |||
| 5091 | purgatory: | 5091 | purgatory: |
| 5092 | lp->active = 0; | 5092 | lp->active = 0; |
| 5093 | if (lp->phy[0].id) { /* Reset the PHY devices */ | 5093 | if (lp->phy[0].id) { /* Reset the PHY devices */ |
| 5094 | for (k=0; lp->phy[k].id && (k < DE4X5_MAX_PHY); k++) { /*For each PHY*/ | 5094 | for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++) { /*For each PHY*/ |
| 5095 | mii_wr(MII_CR_RST, MII_CR, lp->phy[k].addr, DE4X5_MII); | 5095 | mii_wr(MII_CR_RST, MII_CR, lp->phy[k].addr, DE4X5_MII); |
| 5096 | while (mii_rd(MII_CR, lp->phy[k].addr, DE4X5_MII) & MII_CR_RST); | 5096 | while (mii_rd(MII_CR, lp->phy[k].addr, DE4X5_MII) & MII_CR_RST); |
| 5097 | 5097 | ||
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c index c70604f0329e..8ce5e4cee168 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c | |||
| @@ -5918,20 +5918,19 @@ static int airo_set_essid(struct net_device *dev, | |||
| 5918 | readSsidRid(local, &SSID_rid); | 5918 | readSsidRid(local, &SSID_rid); |
| 5919 | 5919 | ||
| 5920 | /* Check if we asked for `any' */ | 5920 | /* Check if we asked for `any' */ |
| 5921 | if(dwrq->flags == 0) { | 5921 | if (dwrq->flags == 0) { |
| 5922 | /* Just send an empty SSID list */ | 5922 | /* Just send an empty SSID list */ |
| 5923 | memset(&SSID_rid, 0, sizeof(SSID_rid)); | 5923 | memset(&SSID_rid, 0, sizeof(SSID_rid)); |
| 5924 | } else { | 5924 | } else { |
| 5925 | int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; | 5925 | unsigned index = (dwrq->flags & IW_ENCODE_INDEX) - 1; |
| 5926 | 5926 | ||
| 5927 | /* Check the size of the string */ | 5927 | /* Check the size of the string */ |
| 5928 | if(dwrq->length > IW_ESSID_MAX_SIZE) { | 5928 | if (dwrq->length > IW_ESSID_MAX_SIZE) |
| 5929 | return -E2BIG ; | 5929 | return -E2BIG ; |
| 5930 | } | 5930 | |
| 5931 | /* Check if index is valid */ | 5931 | /* Check if index is valid */ |
| 5932 | if((index < 0) || (index >= 4)) { | 5932 | if (index >= ARRAY_SIZE(SSID_rid.ssids)) |
| 5933 | return -EINVAL; | 5933 | return -EINVAL; |
| 5934 | } | ||
| 5935 | 5934 | ||
| 5936 | /* Set the SSID */ | 5935 | /* Set the SSID */ |
| 5937 | memset(SSID_rid.ssids[index].ssid, 0, | 5936 | memset(SSID_rid.ssids[index].ssid, 0, |
| @@ -6819,7 +6818,7 @@ static int airo_set_txpow(struct net_device *dev, | |||
| 6819 | return -EINVAL; | 6818 | return -EINVAL; |
| 6820 | } | 6819 | } |
| 6821 | clear_bit (FLAG_RADIO_OFF, &local->flags); | 6820 | clear_bit (FLAG_RADIO_OFF, &local->flags); |
| 6822 | for (i = 0; cap_rid.txPowerLevels[i] && (i < 8); i++) | 6821 | for (i = 0; i < 8 && cap_rid.txPowerLevels[i]; i++) |
| 6823 | if (v == cap_rid.txPowerLevels[i]) { | 6822 | if (v == cap_rid.txPowerLevels[i]) { |
| 6824 | readConfigRid(local, 1); | 6823 | readConfigRid(local, 1); |
| 6825 | local->config.txPower = v; | 6824 | local->config.txPower = v; |
diff --git a/drivers/net/wireless/ath/ath9k/eeprom.c b/drivers/net/wireless/ath/ath9k/eeprom.c index a2fda702b620..ce0e86c36a82 100644 --- a/drivers/net/wireless/ath/ath9k/eeprom.c +++ b/drivers/net/wireless/ath/ath9k/eeprom.c | |||
| @@ -460,7 +460,7 @@ static int ath9k_hw_4k_check_eeprom(struct ath_hw *ah) | |||
| 460 | integer = swab32(eep->modalHeader.antCtrlCommon); | 460 | integer = swab32(eep->modalHeader.antCtrlCommon); |
| 461 | eep->modalHeader.antCtrlCommon = integer; | 461 | eep->modalHeader.antCtrlCommon = integer; |
| 462 | 462 | ||
| 463 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { | 463 | for (i = 0; i < AR5416_EEP4K_MAX_CHAINS; i++) { |
| 464 | integer = swab32(eep->modalHeader.antCtrlChain[i]); | 464 | integer = swab32(eep->modalHeader.antCtrlChain[i]); |
| 465 | eep->modalHeader.antCtrlChain[i] = integer; | 465 | eep->modalHeader.antCtrlChain[i] = integer; |
| 466 | } | 466 | } |
| @@ -914,7 +914,7 @@ static void ath9k_hw_set_4k_power_per_rate_table(struct ath_hw *ah, | |||
| 914 | ctlMode, numCtlModes, isHt40CtlMode, | 914 | ctlMode, numCtlModes, isHt40CtlMode, |
| 915 | (pCtlMode[ctlMode] & EXT_ADDITIVE)); | 915 | (pCtlMode[ctlMode] & EXT_ADDITIVE)); |
| 916 | 916 | ||
| 917 | for (i = 0; (i < AR5416_NUM_CTLS) && | 917 | for (i = 0; (i < AR5416_EEP4K_NUM_CTLS) && |
| 918 | pEepData->ctlIndex[i]; i++) { | 918 | pEepData->ctlIndex[i]; i++) { |
| 919 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | 919 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, |
| 920 | " LOOP-Ctlidx %d: cfgCtl 0x%2.2x " | 920 | " LOOP-Ctlidx %d: cfgCtl 0x%2.2x " |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.h b/drivers/net/wireless/iwlwifi/iwl-3945.h index fbb3a573463e..2de6471d4be9 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945.h | |||
| @@ -112,7 +112,7 @@ enum iwl3945_antenna { | |||
| 112 | #define IWL_TX_FIFO_NONE 7 | 112 | #define IWL_TX_FIFO_NONE 7 |
| 113 | 113 | ||
| 114 | /* Minimum number of queues. MAX_NUM is defined in hw specific files */ | 114 | /* Minimum number of queues. MAX_NUM is defined in hw specific files */ |
| 115 | #define IWL_MIN_NUM_QUEUES 4 | 115 | #define IWL39_MIN_NUM_QUEUES 4 |
| 116 | 116 | ||
| 117 | #define IEEE80211_DATA_LEN 2304 | 117 | #define IEEE80211_DATA_LEN 2304 |
| 118 | #define IEEE80211_4ADDR_LEN 30 | 118 | #define IEEE80211_4ADDR_LEN 30 |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index 6ab07165ea28..18b135f510e5 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
| @@ -1332,6 +1332,9 @@ int iwl_setup_mac(struct iwl_priv *priv) | |||
| 1332 | 1332 | ||
| 1333 | hw->wiphy->custom_regulatory = true; | 1333 | hw->wiphy->custom_regulatory = true; |
| 1334 | 1334 | ||
| 1335 | /* Firmware does not support this */ | ||
| 1336 | hw->wiphy->disable_beacon_hints = true; | ||
| 1337 | |||
| 1335 | hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX; | 1338 | hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX; |
| 1336 | /* we create the 802.11 header and a zero-length SSID element */ | 1339 | /* we create the 802.11 header and a zero-length SSID element */ |
| 1337 | hw->wiphy->max_scan_ie_len = IWL_MAX_PROBE_REQUEST - 24 - 2; | 1340 | hw->wiphy->max_scan_ie_len = IWL_MAX_PROBE_REQUEST - 24 - 2; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c index 11e08c068917..ca00cc8ad4c7 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c +++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c | |||
| @@ -308,18 +308,18 @@ static ssize_t iwl_dbgfs_nvm_read(struct file *file, | |||
| 308 | return -ENODATA; | 308 | return -ENODATA; |
| 309 | } | 309 | } |
| 310 | 310 | ||
| 311 | ptr = priv->eeprom; | ||
| 312 | if (!ptr) { | ||
| 313 | IWL_ERR(priv, "Invalid EEPROM/OTP memory\n"); | ||
| 314 | return -ENOMEM; | ||
| 315 | } | ||
| 316 | |||
| 311 | /* 4 characters for byte 0xYY */ | 317 | /* 4 characters for byte 0xYY */ |
| 312 | buf = kzalloc(buf_size, GFP_KERNEL); | 318 | buf = kzalloc(buf_size, GFP_KERNEL); |
| 313 | if (!buf) { | 319 | if (!buf) { |
| 314 | IWL_ERR(priv, "Can not allocate Buffer\n"); | 320 | IWL_ERR(priv, "Can not allocate Buffer\n"); |
| 315 | return -ENOMEM; | 321 | return -ENOMEM; |
| 316 | } | 322 | } |
| 317 | |||
| 318 | ptr = priv->eeprom; | ||
| 319 | if (!ptr) { | ||
| 320 | IWL_ERR(priv, "Invalid EEPROM/OTP memory\n"); | ||
| 321 | return -ENOMEM; | ||
| 322 | } | ||
| 323 | pos += scnprintf(buf + pos, buf_size - pos, "NVM Type: %s\n", | 323 | pos += scnprintf(buf + pos, buf_size - pos, "NVM Type: %s\n", |
| 324 | (priv->nvm_device_type == NVM_DEVICE_TYPE_OTP) | 324 | (priv->nvm_device_type == NVM_DEVICE_TYPE_OTP) |
| 325 | ? "OTP" : "EEPROM"); | 325 | ? "OTP" : "EEPROM"); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index e2d620f0b6e8..650e20af20fa 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
| @@ -258,8 +258,10 @@ struct iwl_channel_info { | |||
| 258 | #define IWL_TX_FIFO_HCCA_2 6 | 258 | #define IWL_TX_FIFO_HCCA_2 6 |
| 259 | #define IWL_TX_FIFO_NONE 7 | 259 | #define IWL_TX_FIFO_NONE 7 |
| 260 | 260 | ||
| 261 | /* Minimum number of queues. MAX_NUM is defined in hw specific files */ | 261 | /* Minimum number of queues. MAX_NUM is defined in hw specific files. |
| 262 | #define IWL_MIN_NUM_QUEUES 4 | 262 | * Set the minimum to accommodate the 4 standard TX queues, 1 command |
| 263 | * queue, 2 (unused) HCCA queues, and 4 HT queues (one for each AC) */ | ||
| 264 | #define IWL_MIN_NUM_QUEUES 10 | ||
| 263 | 265 | ||
| 264 | /* Power management (not Tx power) structures */ | 266 | /* Power management (not Tx power) structures */ |
| 265 | 267 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c index 2addf735b193..ffd5c61a7553 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-sta.c | |||
| @@ -566,6 +566,8 @@ int iwl_remove_default_wep_key(struct iwl_priv *priv, | |||
| 566 | unsigned long flags; | 566 | unsigned long flags; |
| 567 | 567 | ||
| 568 | spin_lock_irqsave(&priv->sta_lock, flags); | 568 | spin_lock_irqsave(&priv->sta_lock, flags); |
| 569 | IWL_DEBUG_WEP(priv, "Removing default WEP key: idx=%d\n", | ||
| 570 | keyconf->keyidx); | ||
| 569 | 571 | ||
| 570 | if (!test_and_clear_bit(keyconf->keyidx, &priv->ucode_key_table)) | 572 | if (!test_and_clear_bit(keyconf->keyidx, &priv->ucode_key_table)) |
| 571 | IWL_ERR(priv, "index %d not used in uCode key table.\n", | 573 | IWL_ERR(priv, "index %d not used in uCode key table.\n", |
| @@ -573,6 +575,11 @@ int iwl_remove_default_wep_key(struct iwl_priv *priv, | |||
| 573 | 575 | ||
| 574 | priv->default_wep_key--; | 576 | priv->default_wep_key--; |
| 575 | memset(&priv->wep_keys[keyconf->keyidx], 0, sizeof(priv->wep_keys[0])); | 577 | memset(&priv->wep_keys[keyconf->keyidx], 0, sizeof(priv->wep_keys[0])); |
| 578 | if (iwl_is_rfkill(priv)) { | ||
| 579 | IWL_DEBUG_WEP(priv, "Not sending REPLY_WEPKEY command due to RFKILL.\n"); | ||
| 580 | spin_unlock_irqrestore(&priv->sta_lock, flags); | ||
| 581 | return 0; | ||
| 582 | } | ||
| 576 | ret = iwl_send_static_wepkey_cmd(priv, 1); | 583 | ret = iwl_send_static_wepkey_cmd(priv, 1); |
| 577 | IWL_DEBUG_WEP(priv, "Remove default WEP key: idx=%d ret=%d\n", | 584 | IWL_DEBUG_WEP(priv, "Remove default WEP key: idx=%d ret=%d\n", |
| 578 | keyconf->keyidx, ret); | 585 | keyconf->keyidx, ret); |
| @@ -853,6 +860,11 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv, | |||
| 853 | priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; | 860 | priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; |
| 854 | priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; | 861 | priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; |
| 855 | 862 | ||
| 863 | if (iwl_is_rfkill(priv)) { | ||
| 864 | IWL_DEBUG_WEP(priv, "Not sending REPLY_ADD_STA command because RFKILL enabled. \n"); | ||
| 865 | spin_unlock_irqrestore(&priv->sta_lock, flags); | ||
| 866 | return 0; | ||
| 867 | } | ||
| 856 | ret = iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC); | 868 | ret = iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC); |
| 857 | spin_unlock_irqrestore(&priv->sta_lock, flags); | 869 | spin_unlock_irqrestore(&priv->sta_lock, flags); |
| 858 | return ret; | 870 | return ret; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index 9bbeec9427f0..2e89040e63be 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
| @@ -720,8 +720,6 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
| 720 | goto drop_unlock; | 720 | goto drop_unlock; |
| 721 | } | 721 | } |
| 722 | 722 | ||
| 723 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 724 | |||
| 725 | hdr_len = ieee80211_hdrlen(fc); | 723 | hdr_len = ieee80211_hdrlen(fc); |
| 726 | 724 | ||
| 727 | /* Find (or create) index into station table for destination station */ | 725 | /* Find (or create) index into station table for destination station */ |
| @@ -729,7 +727,7 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
| 729 | if (sta_id == IWL_INVALID_STATION) { | 727 | if (sta_id == IWL_INVALID_STATION) { |
| 730 | IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", | 728 | IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", |
| 731 | hdr->addr1); | 729 | hdr->addr1); |
| 732 | goto drop; | 730 | goto drop_unlock; |
| 733 | } | 731 | } |
| 734 | 732 | ||
| 735 | IWL_DEBUG_TX(priv, "station Id %d\n", sta_id); | 733 | IWL_DEBUG_TX(priv, "station Id %d\n", sta_id); |
| @@ -750,14 +748,17 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
| 750 | txq_id = priv->stations[sta_id].tid[tid].agg.txq_id; | 748 | txq_id = priv->stations[sta_id].tid[tid].agg.txq_id; |
| 751 | swq_id = iwl_virtual_agg_queue_num(swq_id, txq_id); | 749 | swq_id = iwl_virtual_agg_queue_num(swq_id, txq_id); |
| 752 | } | 750 | } |
| 753 | priv->stations[sta_id].tid[tid].tfds_in_queue++; | ||
| 754 | } | 751 | } |
| 755 | 752 | ||
| 756 | txq = &priv->txq[txq_id]; | 753 | txq = &priv->txq[txq_id]; |
| 757 | q = &txq->q; | 754 | q = &txq->q; |
| 758 | txq->swq_id = swq_id; | 755 | txq->swq_id = swq_id; |
| 759 | 756 | ||
| 760 | spin_lock_irqsave(&priv->lock, flags); | 757 | if (unlikely(iwl_queue_space(q) < q->high_mark)) |
| 758 | goto drop_unlock; | ||
| 759 | |||
| 760 | if (ieee80211_is_data_qos(fc)) | ||
| 761 | priv->stations[sta_id].tid[tid].tfds_in_queue++; | ||
| 761 | 762 | ||
| 762 | /* Set up driver data for this TFD */ | 763 | /* Set up driver data for this TFD */ |
| 763 | memset(&(txq->txb[q->write_ptr]), 0, sizeof(struct iwl_tx_info)); | 764 | memset(&(txq->txb[q->write_ptr]), 0, sizeof(struct iwl_tx_info)); |
| @@ -902,7 +903,6 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
| 902 | 903 | ||
| 903 | drop_unlock: | 904 | drop_unlock: |
| 904 | spin_unlock_irqrestore(&priv->lock, flags); | 905 | spin_unlock_irqrestore(&priv->lock, flags); |
| 905 | drop: | ||
| 906 | return -1; | 906 | return -1; |
| 907 | } | 907 | } |
| 908 | EXPORT_SYMBOL(iwl_tx_skb); | 908 | EXPORT_SYMBOL(iwl_tx_skb); |
| @@ -1171,6 +1171,8 @@ int iwl_tx_agg_start(struct iwl_priv *priv, const u8 *ra, u16 tid, u16 *ssn) | |||
| 1171 | IWL_ERR(priv, "Start AGG on invalid station\n"); | 1171 | IWL_ERR(priv, "Start AGG on invalid station\n"); |
| 1172 | return -ENXIO; | 1172 | return -ENXIO; |
| 1173 | } | 1173 | } |
| 1174 | if (unlikely(tid >= MAX_TID_COUNT)) | ||
| 1175 | return -EINVAL; | ||
| 1174 | 1176 | ||
| 1175 | if (priv->stations[sta_id].tid[tid].agg.state != IWL_AGG_OFF) { | 1177 | if (priv->stations[sta_id].tid[tid].agg.state != IWL_AGG_OFF) { |
| 1176 | IWL_ERR(priv, "Start AGG when state is not IWL_AGG_OFF !\n"); | 1178 | IWL_ERR(priv, "Start AGG when state is not IWL_AGG_OFF !\n"); |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 956798f2c80c..523843369ca2 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -3968,6 +3968,9 @@ static int iwl3945_setup_mac(struct iwl_priv *priv) | |||
| 3968 | 3968 | ||
| 3969 | hw->wiphy->custom_regulatory = true; | 3969 | hw->wiphy->custom_regulatory = true; |
| 3970 | 3970 | ||
| 3971 | /* Firmware does not support this */ | ||
| 3972 | hw->wiphy->disable_beacon_hints = true; | ||
| 3973 | |||
| 3971 | hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX_3945; | 3974 | hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX_3945; |
| 3972 | /* we create the 802.11 header and a zero-length SSID element */ | 3975 | /* we create the 802.11 header and a zero-length SSID element */ |
| 3973 | hw->wiphy->max_scan_ie_len = IWL_MAX_PROBE_REQUEST - 24 - 2; | 3976 | hw->wiphy->max_scan_ie_len = IWL_MAX_PROBE_REQUEST - 24 - 2; |
| @@ -4018,10 +4021,10 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
| 4018 | SET_IEEE80211_DEV(hw, &pdev->dev); | 4021 | SET_IEEE80211_DEV(hw, &pdev->dev); |
| 4019 | 4022 | ||
| 4020 | if ((iwl3945_mod_params.num_of_queues > IWL39_MAX_NUM_QUEUES) || | 4023 | if ((iwl3945_mod_params.num_of_queues > IWL39_MAX_NUM_QUEUES) || |
| 4021 | (iwl3945_mod_params.num_of_queues < IWL_MIN_NUM_QUEUES)) { | 4024 | (iwl3945_mod_params.num_of_queues < IWL39_MIN_NUM_QUEUES)) { |
| 4022 | IWL_ERR(priv, | 4025 | IWL_ERR(priv, |
| 4023 | "invalid queues_num, should be between %d and %d\n", | 4026 | "invalid queues_num, should be between %d and %d\n", |
| 4024 | IWL_MIN_NUM_QUEUES, IWL39_MAX_NUM_QUEUES); | 4027 | IWL39_MIN_NUM_QUEUES, IWL39_MAX_NUM_QUEUES); |
| 4025 | err = -EINVAL; | 4028 | err = -EINVAL; |
| 4026 | goto out_ieee80211_free_hw; | 4029 | goto out_ieee80211_free_hw; |
| 4027 | } | 4030 | } |
diff --git a/drivers/net/wireless/iwmc3200wifi/commands.c b/drivers/net/wireless/iwmc3200wifi/commands.c index 834a7f544e5d..e2334d123599 100644 --- a/drivers/net/wireless/iwmc3200wifi/commands.c +++ b/drivers/net/wireless/iwmc3200wifi/commands.c | |||
| @@ -220,6 +220,7 @@ int iwm_store_rxiq_calib_result(struct iwm_priv *iwm) | |||
| 220 | eeprom_rxiq = iwm_eeprom_access(iwm, IWM_EEPROM_CALIB_RXIQ); | 220 | eeprom_rxiq = iwm_eeprom_access(iwm, IWM_EEPROM_CALIB_RXIQ); |
| 221 | if (IS_ERR(eeprom_rxiq)) { | 221 | if (IS_ERR(eeprom_rxiq)) { |
| 222 | IWM_ERR(iwm, "Couldn't access EEPROM RX IQ entry\n"); | 222 | IWM_ERR(iwm, "Couldn't access EEPROM RX IQ entry\n"); |
| 223 | kfree(rxiq); | ||
| 223 | return PTR_ERR(eeprom_rxiq); | 224 | return PTR_ERR(eeprom_rxiq); |
| 224 | } | 225 | } |
| 225 | 226 | ||
diff --git a/drivers/net/wireless/iwmc3200wifi/netdev.c b/drivers/net/wireless/iwmc3200wifi/netdev.c index aea5ccf24ccf..bf294e41753b 100644 --- a/drivers/net/wireless/iwmc3200wifi/netdev.c +++ b/drivers/net/wireless/iwmc3200wifi/netdev.c | |||
| @@ -106,10 +106,8 @@ void *iwm_if_alloc(int sizeof_bus, struct device *dev, | |||
| 106 | int ret = 0; | 106 | int ret = 0; |
| 107 | 107 | ||
| 108 | wdev = iwm_wdev_alloc(sizeof_bus, dev); | 108 | wdev = iwm_wdev_alloc(sizeof_bus, dev); |
| 109 | if (!wdev) { | 109 | if (IS_ERR(wdev)) |
| 110 | dev_err(dev, "no memory for wireless device instance\n"); | 110 | return wdev; |
| 111 | return ERR_PTR(-ENOMEM); | ||
| 112 | } | ||
| 113 | 111 | ||
| 114 | iwm = wdev_to_iwm(wdev); | 112 | iwm = wdev_to_iwm(wdev); |
| 115 | iwm->bus_ops = if_ops; | 113 | iwm->bus_ops = if_ops; |
diff --git a/drivers/net/wireless/libertas/11d.c b/drivers/net/wireless/libertas/11d.c index 9a5408e7d94a..5c6968101f0d 100644 --- a/drivers/net/wireless/libertas/11d.c +++ b/drivers/net/wireless/libertas/11d.c | |||
| @@ -47,7 +47,7 @@ static u8 lbs_region_2_code(u8 *region) | |||
| 47 | { | 47 | { |
| 48 | u8 i; | 48 | u8 i; |
| 49 | 49 | ||
| 50 | for (i = 0; region[i] && i < COUNTRY_CODE_LEN; i++) | 50 | for (i = 0; i < COUNTRY_CODE_LEN && region[i]; i++) |
| 51 | region[i] = toupper(region[i]); | 51 | region[i] = toupper(region[i]); |
| 52 | 52 | ||
| 53 | for (i = 0; i < ARRAY_SIZE(region_code_mapping); i++) { | 53 | for (i = 0; i < ARRAY_SIZE(region_code_mapping); i++) { |
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c index b9b374119033..d6997371c27e 100644 --- a/drivers/net/wireless/libertas/assoc.c +++ b/drivers/net/wireless/libertas/assoc.c | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | /* Copyright (C) 2006, Red Hat, Inc. */ | 1 | /* Copyright (C) 2006, Red Hat, Inc. */ |
| 2 | 2 | ||
| 3 | #include <linux/types.h> | 3 | #include <linux/types.h> |
| 4 | #include <linux/kernel.h> | ||
| 4 | #include <linux/etherdevice.h> | 5 | #include <linux/etherdevice.h> |
| 5 | #include <linux/ieee80211.h> | 6 | #include <linux/ieee80211.h> |
| 6 | #include <linux/if_arp.h> | 7 | #include <linux/if_arp.h> |
| @@ -43,21 +44,21 @@ static int get_common_rates(struct lbs_private *priv, | |||
| 43 | u16 *rates_size) | 44 | u16 *rates_size) |
| 44 | { | 45 | { |
| 45 | u8 *card_rates = lbs_bg_rates; | 46 | u8 *card_rates = lbs_bg_rates; |
| 46 | size_t num_card_rates = sizeof(lbs_bg_rates); | ||
| 47 | int ret = 0, i, j; | 47 | int ret = 0, i, j; |
| 48 | u8 tmp[30]; | 48 | u8 tmp[(ARRAY_SIZE(lbs_bg_rates) - 1) * (*rates_size - 1)]; |
| 49 | size_t tmp_size = 0; | 49 | size_t tmp_size = 0; |
| 50 | 50 | ||
| 51 | /* For each rate in card_rates that exists in rate1, copy to tmp */ | 51 | /* For each rate in card_rates that exists in rate1, copy to tmp */ |
| 52 | for (i = 0; card_rates[i] && (i < num_card_rates); i++) { | 52 | for (i = 0; i < ARRAY_SIZE(lbs_bg_rates) && card_rates[i]; i++) { |
| 53 | for (j = 0; rates[j] && (j < *rates_size); j++) { | 53 | for (j = 0; j < *rates_size && rates[j]; j++) { |
| 54 | if (rates[j] == card_rates[i]) | 54 | if (rates[j] == card_rates[i]) |
| 55 | tmp[tmp_size++] = card_rates[i]; | 55 | tmp[tmp_size++] = card_rates[i]; |
| 56 | } | 56 | } |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | lbs_deb_hex(LBS_DEB_JOIN, "AP rates ", rates, *rates_size); | 59 | lbs_deb_hex(LBS_DEB_JOIN, "AP rates ", rates, *rates_size); |
| 60 | lbs_deb_hex(LBS_DEB_JOIN, "card rates ", card_rates, num_card_rates); | 60 | lbs_deb_hex(LBS_DEB_JOIN, "card rates ", card_rates, |
| 61 | ARRAY_SIZE(lbs_bg_rates)); | ||
| 61 | lbs_deb_hex(LBS_DEB_JOIN, "common rates", tmp, tmp_size); | 62 | lbs_deb_hex(LBS_DEB_JOIN, "common rates", tmp, tmp_size); |
| 62 | lbs_deb_join("TX data rate 0x%02x\n", priv->cur_rate); | 63 | lbs_deb_join("TX data rate 0x%02x\n", priv->cur_rate); |
| 63 | 64 | ||
| @@ -69,10 +70,7 @@ static int get_common_rates(struct lbs_private *priv, | |||
| 69 | lbs_pr_alert("Previously set fixed data rate %#x isn't " | 70 | lbs_pr_alert("Previously set fixed data rate %#x isn't " |
| 70 | "compatible with the network.\n", priv->cur_rate); | 71 | "compatible with the network.\n", priv->cur_rate); |
| 71 | ret = -1; | 72 | ret = -1; |
| 72 | goto done; | ||
| 73 | } | 73 | } |
| 74 | ret = 0; | ||
| 75 | |||
| 76 | done: | 74 | done: |
| 77 | memset(rates, 0, *rates_size); | 75 | memset(rates, 0, *rates_size); |
| 78 | *rates_size = min_t(int, tmp_size, *rates_size); | 76 | *rates_size = min_t(int, tmp_size, *rates_size); |
| @@ -322,7 +320,7 @@ static int lbs_associate(struct lbs_private *priv, | |||
| 322 | rates = (struct mrvl_ie_rates_param_set *) pos; | 320 | rates = (struct mrvl_ie_rates_param_set *) pos; |
| 323 | rates->header.type = cpu_to_le16(TLV_TYPE_RATES); | 321 | rates->header.type = cpu_to_le16(TLV_TYPE_RATES); |
| 324 | memcpy(&rates->rates, &bss->rates, MAX_RATES); | 322 | memcpy(&rates->rates, &bss->rates, MAX_RATES); |
| 325 | tmplen = MAX_RATES; | 323 | tmplen = min_t(u16, ARRAY_SIZE(rates->rates), MAX_RATES); |
| 326 | if (get_common_rates(priv, rates->rates, &tmplen)) { | 324 | if (get_common_rates(priv, rates->rates, &tmplen)) { |
| 327 | ret = -1; | 325 | ret = -1; |
| 328 | goto done; | 326 | goto done; |
| @@ -598,7 +596,7 @@ static int lbs_adhoc_join(struct lbs_private *priv, | |||
| 598 | 596 | ||
| 599 | /* Copy Data rates from the rates recorded in scan response */ | 597 | /* Copy Data rates from the rates recorded in scan response */ |
| 600 | memset(cmd.bss.rates, 0, sizeof(cmd.bss.rates)); | 598 | memset(cmd.bss.rates, 0, sizeof(cmd.bss.rates)); |
| 601 | ratesize = min_t(u16, sizeof(cmd.bss.rates), MAX_RATES); | 599 | ratesize = min_t(u16, ARRAY_SIZE(cmd.bss.rates), MAX_RATES); |
| 602 | memcpy(cmd.bss.rates, bss->rates, ratesize); | 600 | memcpy(cmd.bss.rates, bss->rates, ratesize); |
| 603 | if (get_common_rates(priv, cmd.bss.rates, &ratesize)) { | 601 | if (get_common_rates(priv, cmd.bss.rates, &ratesize)) { |
| 604 | lbs_deb_join("ADHOC_JOIN: get_common_rates returned error.\n"); | 602 | lbs_deb_join("ADHOC_JOIN: get_common_rates returned error.\n"); |
diff --git a/drivers/net/wireless/libertas/scan.c b/drivers/net/wireless/libertas/scan.c index 601b54249677..6c95af3023cc 100644 --- a/drivers/net/wireless/libertas/scan.c +++ b/drivers/net/wireless/libertas/scan.c | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | * for sending scan commands to the firmware. | 5 | * for sending scan commands to the firmware. |
| 6 | */ | 6 | */ |
| 7 | #include <linux/types.h> | 7 | #include <linux/types.h> |
| 8 | #include <linux/kernel.h> | ||
| 8 | #include <linux/etherdevice.h> | 9 | #include <linux/etherdevice.h> |
| 9 | #include <linux/if_arp.h> | 10 | #include <linux/if_arp.h> |
| 10 | #include <asm/unaligned.h> | 11 | #include <asm/unaligned.h> |
| @@ -876,7 +877,7 @@ static inline char *lbs_translate_scan(struct lbs_private *priv, | |||
| 876 | iwe.u.bitrate.disabled = 0; | 877 | iwe.u.bitrate.disabled = 0; |
| 877 | iwe.u.bitrate.value = 0; | 878 | iwe.u.bitrate.value = 0; |
| 878 | 879 | ||
| 879 | for (j = 0; bss->rates[j] && (j < sizeof(bss->rates)); j++) { | 880 | for (j = 0; j < ARRAY_SIZE(bss->rates) && bss->rates[j]; j++) { |
| 880 | /* Bit rate given in 500 kb/s units */ | 881 | /* Bit rate given in 500 kb/s units */ |
| 881 | iwe.u.bitrate.value = bss->rates[j] * 500000; | 882 | iwe.u.bitrate.value = bss->rates[j] * 500000; |
| 882 | current_val = iwe_stream_add_value(info, start, current_val, | 883 | current_val = iwe_stream_add_value(info, start, current_val, |
diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c index 40b07b988224..3bd3c779fff3 100644 --- a/drivers/net/wireless/zd1211rw/zd_mac.c +++ b/drivers/net/wireless/zd1211rw/zd_mac.c | |||
| @@ -698,7 +698,7 @@ int zd_mac_rx(struct ieee80211_hw *hw, const u8 *buffer, unsigned int length) | |||
| 698 | && !mac->pass_ctrl) | 698 | && !mac->pass_ctrl) |
| 699 | return 0; | 699 | return 0; |
| 700 | 700 | ||
| 701 | fc = *(__le16 *)buffer; | 701 | fc = get_unaligned((__le16*)buffer); |
| 702 | need_padding = ieee80211_is_data_qos(fc) ^ ieee80211_has_a4(fc); | 702 | need_padding = ieee80211_is_data_qos(fc) ^ ieee80211_has_a4(fc); |
| 703 | 703 | ||
| 704 | skb = dev_alloc_skb(length + (need_padding ? 2 : 0)); | 704 | skb = dev_alloc_skb(length + (need_padding ? 2 : 0)); |
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 783e33c65eb7..b47240ca4b19 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c | |||
| @@ -990,7 +990,7 @@ int iscsi_offload_mesg(struct Scsi_Host *shost, | |||
| 990 | struct iscsi_uevent *ev; | 990 | struct iscsi_uevent *ev; |
| 991 | int len = NLMSG_SPACE(sizeof(*ev) + data_size); | 991 | int len = NLMSG_SPACE(sizeof(*ev) + data_size); |
| 992 | 992 | ||
| 993 | skb = alloc_skb(len, GFP_NOIO); | 993 | skb = alloc_skb(len, GFP_ATOMIC); |
| 994 | if (!skb) { | 994 | if (!skb) { |
| 995 | printk(KERN_ERR "can not deliver iscsi offload message:OOM\n"); | 995 | printk(KERN_ERR "can not deliver iscsi offload message:OOM\n"); |
| 996 | return -ENOMEM; | 996 | return -ENOMEM; |
| @@ -1012,7 +1012,7 @@ int iscsi_offload_mesg(struct Scsi_Host *shost, | |||
| 1012 | 1012 | ||
| 1013 | memcpy((char *)ev + sizeof(*ev), data, data_size); | 1013 | memcpy((char *)ev + sizeof(*ev), data, data_size); |
| 1014 | 1014 | ||
| 1015 | return iscsi_multicast_skb(skb, ISCSI_NL_GRP_UIP, GFP_NOIO); | 1015 | return iscsi_multicast_skb(skb, ISCSI_NL_GRP_UIP, GFP_ATOMIC); |
| 1016 | } | 1016 | } |
| 1017 | EXPORT_SYMBOL_GPL(iscsi_offload_mesg); | 1017 | EXPORT_SYMBOL_GPL(iscsi_offload_mesg); |
| 1018 | 1018 | ||
diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h index acef2a770b6b..ad27c7da8798 100644 --- a/include/linux/inetdevice.h +++ b/include/linux/inetdevice.h | |||
| @@ -82,7 +82,7 @@ static inline void ipv4_devconf_setall(struct in_device *in_dev) | |||
| 82 | 82 | ||
| 83 | #define IN_DEV_FORWARD(in_dev) IN_DEV_CONF_GET((in_dev), FORWARDING) | 83 | #define IN_DEV_FORWARD(in_dev) IN_DEV_CONF_GET((in_dev), FORWARDING) |
| 84 | #define IN_DEV_MFORWARD(in_dev) IN_DEV_ANDCONF((in_dev), MC_FORWARDING) | 84 | #define IN_DEV_MFORWARD(in_dev) IN_DEV_ANDCONF((in_dev), MC_FORWARDING) |
| 85 | #define IN_DEV_RPFILTER(in_dev) IN_DEV_ANDCONF((in_dev), RP_FILTER) | 85 | #define IN_DEV_RPFILTER(in_dev) IN_DEV_MAXCONF((in_dev), RP_FILTER) |
| 86 | #define IN_DEV_SOURCE_ROUTE(in_dev) IN_DEV_ANDCONF((in_dev), \ | 86 | #define IN_DEV_SOURCE_ROUTE(in_dev) IN_DEV_ANDCONF((in_dev), \ |
| 87 | ACCEPT_SOURCE_ROUTE) | 87 | ACCEPT_SOURCE_ROUTE) |
| 88 | #define IN_DEV_BOOTP_RELAY(in_dev) IN_DEV_ANDCONF((in_dev), BOOTP_RELAY) | 88 | #define IN_DEV_BOOTP_RELAY(in_dev) IN_DEV_ANDCONF((in_dev), BOOTP_RELAY) |
diff --git a/include/net/bluetooth/rfcomm.h b/include/net/bluetooth/rfcomm.h index 80072611d26a..c274993234e3 100644 --- a/include/net/bluetooth/rfcomm.h +++ b/include/net/bluetooth/rfcomm.h | |||
| @@ -355,7 +355,17 @@ struct rfcomm_dev_list_req { | |||
| 355 | }; | 355 | }; |
| 356 | 356 | ||
| 357 | int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg); | 357 | int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg); |
| 358 | |||
| 359 | #ifdef CONFIG_BT_RFCOMM_TTY | ||
| 358 | int rfcomm_init_ttys(void); | 360 | int rfcomm_init_ttys(void); |
| 359 | void rfcomm_cleanup_ttys(void); | 361 | void rfcomm_cleanup_ttys(void); |
| 360 | 362 | #else | |
| 363 | static inline int rfcomm_init_ttys(void) | ||
| 364 | { | ||
| 365 | return 0; | ||
| 366 | } | ||
| 367 | static inline void rfcomm_cleanup_ttys(void) | ||
| 368 | { | ||
| 369 | } | ||
| 370 | #endif | ||
| 361 | #endif /* __RFCOMM_H */ | 371 | #endif /* __RFCOMM_H */ |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 1a21895b732b..d1892d66701a 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
| @@ -979,6 +979,10 @@ struct cfg80211_ops { | |||
| 979 | * channels at a later time. This can be used for devices which do not | 979 | * channels at a later time. This can be used for devices which do not |
| 980 | * have calibration information gauranteed for frequencies or settings | 980 | * have calibration information gauranteed for frequencies or settings |
| 981 | * outside of its regulatory domain. | 981 | * outside of its regulatory domain. |
| 982 | * @disable_beacon_hints: enable this if your driver needs to ensure that | ||
| 983 | * passive scan flags and beaconing flags may not be lifted by cfg80211 | ||
| 984 | * due to regulatory beacon hints. For more information on beacon | ||
| 985 | * hints read the documenation for regulatory_hint_found_beacon() | ||
| 982 | * @reg_notifier: the driver's regulatory notification callback | 986 | * @reg_notifier: the driver's regulatory notification callback |
| 983 | * @regd: the driver's regulatory domain, if one was requested via | 987 | * @regd: the driver's regulatory domain, if one was requested via |
| 984 | * the regulatory_hint() API. This can be used by the driver | 988 | * the regulatory_hint() API. This can be used by the driver |
| @@ -1004,6 +1008,7 @@ struct wiphy { | |||
| 1004 | 1008 | ||
| 1005 | bool custom_regulatory; | 1009 | bool custom_regulatory; |
| 1006 | bool strict_regulatory; | 1010 | bool strict_regulatory; |
| 1011 | bool disable_beacon_hints; | ||
| 1007 | 1012 | ||
| 1008 | enum cfg80211_signal_type signal_type; | 1013 | enum cfg80211_signal_type signal_type; |
| 1009 | 1014 | ||
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index e50566ebf9f9..94b3388c188b 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
| @@ -2080,28 +2080,41 @@ static CLASS_ATTR(rfcomm_dlc, S_IRUGO, rfcomm_dlc_sysfs_show, NULL); | |||
| 2080 | /* ---- Initialization ---- */ | 2080 | /* ---- Initialization ---- */ |
| 2081 | static int __init rfcomm_init(void) | 2081 | static int __init rfcomm_init(void) |
| 2082 | { | 2082 | { |
| 2083 | int ret; | ||
| 2084 | |||
| 2083 | l2cap_load(); | 2085 | l2cap_load(); |
| 2084 | 2086 | ||
| 2085 | hci_register_cb(&rfcomm_cb); | 2087 | hci_register_cb(&rfcomm_cb); |
| 2086 | 2088 | ||
| 2087 | rfcomm_thread = kthread_run(rfcomm_run, NULL, "krfcommd"); | 2089 | rfcomm_thread = kthread_run(rfcomm_run, NULL, "krfcommd"); |
| 2088 | if (IS_ERR(rfcomm_thread)) { | 2090 | if (IS_ERR(rfcomm_thread)) { |
| 2089 | hci_unregister_cb(&rfcomm_cb); | 2091 | ret = PTR_ERR(rfcomm_thread); |
| 2090 | return PTR_ERR(rfcomm_thread); | 2092 | goto out_thread; |
| 2091 | } | 2093 | } |
| 2092 | 2094 | ||
| 2093 | if (class_create_file(bt_class, &class_attr_rfcomm_dlc) < 0) | 2095 | if (class_create_file(bt_class, &class_attr_rfcomm_dlc) < 0) |
| 2094 | BT_ERR("Failed to create RFCOMM info file"); | 2096 | BT_ERR("Failed to create RFCOMM info file"); |
| 2095 | 2097 | ||
| 2096 | rfcomm_init_sockets(); | 2098 | ret = rfcomm_init_ttys(); |
| 2099 | if (ret) | ||
| 2100 | goto out_tty; | ||
| 2097 | 2101 | ||
| 2098 | #ifdef CONFIG_BT_RFCOMM_TTY | 2102 | ret = rfcomm_init_sockets(); |
| 2099 | rfcomm_init_ttys(); | 2103 | if (ret) |
| 2100 | #endif | 2104 | goto out_sock; |
| 2101 | 2105 | ||
| 2102 | BT_INFO("RFCOMM ver %s", VERSION); | 2106 | BT_INFO("RFCOMM ver %s", VERSION); |
| 2103 | 2107 | ||
| 2104 | return 0; | 2108 | return 0; |
| 2109 | |||
| 2110 | out_sock: | ||
| 2111 | rfcomm_cleanup_ttys(); | ||
| 2112 | out_tty: | ||
| 2113 | kthread_stop(rfcomm_thread); | ||
| 2114 | out_thread: | ||
| 2115 | hci_unregister_cb(&rfcomm_cb); | ||
| 2116 | |||
| 2117 | return ret; | ||
| 2105 | } | 2118 | } |
| 2106 | 2119 | ||
| 2107 | static void __exit rfcomm_exit(void) | 2120 | static void __exit rfcomm_exit(void) |
| @@ -2112,9 +2125,7 @@ static void __exit rfcomm_exit(void) | |||
| 2112 | 2125 | ||
| 2113 | kthread_stop(rfcomm_thread); | 2126 | kthread_stop(rfcomm_thread); |
| 2114 | 2127 | ||
| 2115 | #ifdef CONFIG_BT_RFCOMM_TTY | ||
| 2116 | rfcomm_cleanup_ttys(); | 2128 | rfcomm_cleanup_ttys(); |
| 2117 | #endif | ||
| 2118 | 2129 | ||
| 2119 | rfcomm_cleanup_sockets(); | 2130 | rfcomm_cleanup_sockets(); |
| 2120 | } | 2131 | } |
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 7f482784e9f7..0b85e8116859 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
| @@ -1132,7 +1132,7 @@ error: | |||
| 1132 | return err; | 1132 | return err; |
| 1133 | } | 1133 | } |
| 1134 | 1134 | ||
| 1135 | void __exit rfcomm_cleanup_sockets(void) | 1135 | void rfcomm_cleanup_sockets(void) |
| 1136 | { | 1136 | { |
| 1137 | class_remove_file(bt_class, &class_attr_rfcomm); | 1137 | class_remove_file(bt_class, &class_attr_rfcomm); |
| 1138 | 1138 | ||
diff --git a/net/core/dev.c b/net/core/dev.c index 70c27e0c7c32..43e61ba7bd95 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -3865,10 +3865,12 @@ int dev_unicast_delete(struct net_device *dev, void *addr) | |||
| 3865 | 3865 | ||
| 3866 | ASSERT_RTNL(); | 3866 | ASSERT_RTNL(); |
| 3867 | 3867 | ||
| 3868 | netif_addr_lock_bh(dev); | ||
| 3868 | err = __hw_addr_del(&dev->uc, addr, dev->addr_len, | 3869 | err = __hw_addr_del(&dev->uc, addr, dev->addr_len, |
| 3869 | NETDEV_HW_ADDR_T_UNICAST); | 3870 | NETDEV_HW_ADDR_T_UNICAST); |
| 3870 | if (!err) | 3871 | if (!err) |
| 3871 | __dev_set_rx_mode(dev); | 3872 | __dev_set_rx_mode(dev); |
| 3873 | netif_addr_unlock_bh(dev); | ||
| 3872 | return err; | 3874 | return err; |
| 3873 | } | 3875 | } |
| 3874 | EXPORT_SYMBOL(dev_unicast_delete); | 3876 | EXPORT_SYMBOL(dev_unicast_delete); |
| @@ -3889,10 +3891,12 @@ int dev_unicast_add(struct net_device *dev, void *addr) | |||
| 3889 | 3891 | ||
| 3890 | ASSERT_RTNL(); | 3892 | ASSERT_RTNL(); |
| 3891 | 3893 | ||
| 3894 | netif_addr_lock_bh(dev); | ||
| 3892 | err = __hw_addr_add(&dev->uc, addr, dev->addr_len, | 3895 | err = __hw_addr_add(&dev->uc, addr, dev->addr_len, |
| 3893 | NETDEV_HW_ADDR_T_UNICAST); | 3896 | NETDEV_HW_ADDR_T_UNICAST); |
| 3894 | if (!err) | 3897 | if (!err) |
| 3895 | __dev_set_rx_mode(dev); | 3898 | __dev_set_rx_mode(dev); |
| 3899 | netif_addr_unlock_bh(dev); | ||
| 3896 | return err; | 3900 | return err; |
| 3897 | } | 3901 | } |
| 3898 | EXPORT_SYMBOL(dev_unicast_add); | 3902 | EXPORT_SYMBOL(dev_unicast_add); |
| @@ -3949,7 +3953,8 @@ void __dev_addr_unsync(struct dev_addr_list **to, int *to_count, | |||
| 3949 | * @from: source device | 3953 | * @from: source device |
| 3950 | * | 3954 | * |
| 3951 | * Add newly added addresses to the destination device and release | 3955 | * Add newly added addresses to the destination device and release |
| 3952 | * addresses that have no users left. | 3956 | * addresses that have no users left. The source device must be |
| 3957 | * locked by netif_tx_lock_bh. | ||
| 3953 | * | 3958 | * |
| 3954 | * This function is intended to be called from the dev->set_rx_mode | 3959 | * This function is intended to be called from the dev->set_rx_mode |
| 3955 | * function of layered software devices. | 3960 | * function of layered software devices. |
| @@ -3958,14 +3963,14 @@ int dev_unicast_sync(struct net_device *to, struct net_device *from) | |||
| 3958 | { | 3963 | { |
| 3959 | int err = 0; | 3964 | int err = 0; |
| 3960 | 3965 | ||
| 3961 | ASSERT_RTNL(); | ||
| 3962 | |||
| 3963 | if (to->addr_len != from->addr_len) | 3966 | if (to->addr_len != from->addr_len) |
| 3964 | return -EINVAL; | 3967 | return -EINVAL; |
| 3965 | 3968 | ||
| 3969 | netif_addr_lock_bh(to); | ||
| 3966 | err = __hw_addr_sync(&to->uc, &from->uc, to->addr_len); | 3970 | err = __hw_addr_sync(&to->uc, &from->uc, to->addr_len); |
| 3967 | if (!err) | 3971 | if (!err) |
| 3968 | __dev_set_rx_mode(to); | 3972 | __dev_set_rx_mode(to); |
| 3973 | netif_addr_unlock_bh(to); | ||
| 3969 | return err; | 3974 | return err; |
| 3970 | } | 3975 | } |
| 3971 | EXPORT_SYMBOL(dev_unicast_sync); | 3976 | EXPORT_SYMBOL(dev_unicast_sync); |
| @@ -3981,28 +3986,30 @@ EXPORT_SYMBOL(dev_unicast_sync); | |||
| 3981 | */ | 3986 | */ |
| 3982 | void dev_unicast_unsync(struct net_device *to, struct net_device *from) | 3987 | void dev_unicast_unsync(struct net_device *to, struct net_device *from) |
| 3983 | { | 3988 | { |
| 3984 | ASSERT_RTNL(); | ||
| 3985 | |||
| 3986 | if (to->addr_len != from->addr_len) | 3989 | if (to->addr_len != from->addr_len) |
| 3987 | return; | 3990 | return; |
| 3988 | 3991 | ||
| 3992 | netif_addr_lock_bh(from); | ||
| 3993 | netif_addr_lock(to); | ||
| 3989 | __hw_addr_unsync(&to->uc, &from->uc, to->addr_len); | 3994 | __hw_addr_unsync(&to->uc, &from->uc, to->addr_len); |
| 3990 | __dev_set_rx_mode(to); | 3995 | __dev_set_rx_mode(to); |
| 3996 | netif_addr_unlock(to); | ||
| 3997 | netif_addr_unlock_bh(from); | ||
| 3991 | } | 3998 | } |
| 3992 | EXPORT_SYMBOL(dev_unicast_unsync); | 3999 | EXPORT_SYMBOL(dev_unicast_unsync); |
| 3993 | 4000 | ||
| 3994 | static void dev_unicast_flush(struct net_device *dev) | 4001 | static void dev_unicast_flush(struct net_device *dev) |
| 3995 | { | 4002 | { |
| 3996 | /* rtnl_mutex must be held here */ | 4003 | netif_addr_lock_bh(dev); |
| 3997 | |||
| 3998 | __hw_addr_flush(&dev->uc); | 4004 | __hw_addr_flush(&dev->uc); |
| 4005 | netif_addr_unlock_bh(dev); | ||
| 3999 | } | 4006 | } |
| 4000 | 4007 | ||
| 4001 | static void dev_unicast_init(struct net_device *dev) | 4008 | static void dev_unicast_init(struct net_device *dev) |
| 4002 | { | 4009 | { |
| 4003 | /* rtnl_mutex must be held here */ | 4010 | netif_addr_lock_bh(dev); |
| 4004 | |||
| 4005 | __hw_addr_init(&dev->uc); | 4011 | __hw_addr_init(&dev->uc); |
| 4012 | netif_addr_unlock_bh(dev); | ||
| 4006 | } | 4013 | } |
| 4007 | 4014 | ||
| 4008 | 4015 | ||
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index b7292a2719dc..197283072cc8 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
| @@ -488,7 +488,7 @@ int net_assign_generic(struct net *net, int id, void *data) | |||
| 488 | */ | 488 | */ |
| 489 | 489 | ||
| 490 | ng->len = id; | 490 | ng->len = id; |
| 491 | memcpy(&ng->ptr, &old_ng->ptr, old_ng->len); | 491 | memcpy(&ng->ptr, &old_ng->ptr, old_ng->len * sizeof(void*)); |
| 492 | 492 | ||
| 493 | rcu_assign_pointer(net->gen, ng); | 493 | rcu_assign_pointer(net->gen, ng); |
| 494 | call_rcu(&old_ng->rcu, net_generic_release); | 494 | call_rcu(&old_ng->rcu, net_generic_release); |
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index c29d75d8f1b1..090e9991ac2a 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
| @@ -1304,7 +1304,9 @@ static void arp_format_neigh_entry(struct seq_file *seq, | |||
| 1304 | hbuffer[k++] = hex_asc_lo(n->ha[j]); | 1304 | hbuffer[k++] = hex_asc_lo(n->ha[j]); |
| 1305 | hbuffer[k++] = ':'; | 1305 | hbuffer[k++] = ':'; |
| 1306 | } | 1306 | } |
| 1307 | hbuffer[--k] = 0; | 1307 | if (k != 0) |
| 1308 | --k; | ||
| 1309 | hbuffer[k] = 0; | ||
| 1308 | #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) | 1310 | #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) |
| 1309 | } | 1311 | } |
| 1310 | #endif | 1312 | #endif |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index aca22b00b6a3..07e7e41816be 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -721,7 +721,7 @@ void ieee80211_dynamic_ps_timer(unsigned long data) | |||
| 721 | { | 721 | { |
| 722 | struct ieee80211_local *local = (void *) data; | 722 | struct ieee80211_local *local = (void *) data; |
| 723 | 723 | ||
| 724 | if (local->quiescing) | 724 | if (local->quiescing || local->suspended) |
| 725 | return; | 725 | return; |
| 726 | 726 | ||
| 727 | queue_work(local->hw.workqueue, &local->dynamic_ps_enable_work); | 727 | queue_work(local->hw.workqueue, &local->dynamic_ps_enable_work); |
diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c index 7a549f9deb96..5e3d476972f9 100644 --- a/net/mac80211/pm.c +++ b/net/mac80211/pm.c | |||
| @@ -55,15 +55,6 @@ int __ieee80211_suspend(struct ieee80211_hw *hw) | |||
| 55 | 55 | ||
| 56 | rcu_read_unlock(); | 56 | rcu_read_unlock(); |
| 57 | 57 | ||
| 58 | /* flush again, in case driver queued work */ | ||
| 59 | flush_workqueue(local->hw.workqueue); | ||
| 60 | |||
| 61 | /* stop hardware - this must stop RX */ | ||
| 62 | if (local->open_count) { | ||
| 63 | ieee80211_led_radio(local, false); | ||
| 64 | drv_stop(local); | ||
| 65 | } | ||
| 66 | |||
| 67 | /* remove STAs */ | 58 | /* remove STAs */ |
| 68 | spin_lock_irqsave(&local->sta_lock, flags); | 59 | spin_lock_irqsave(&local->sta_lock, flags); |
| 69 | list_for_each_entry(sta, &local->sta_list, list) { | 60 | list_for_each_entry(sta, &local->sta_list, list) { |
| @@ -111,7 +102,22 @@ int __ieee80211_suspend(struct ieee80211_hw *hw) | |||
| 111 | drv_remove_interface(local, &conf); | 102 | drv_remove_interface(local, &conf); |
| 112 | } | 103 | } |
| 113 | 104 | ||
| 105 | /* stop hardware - this must stop RX */ | ||
| 106 | if (local->open_count) { | ||
| 107 | ieee80211_led_radio(local, false); | ||
| 108 | drv_stop(local); | ||
| 109 | } | ||
| 110 | |||
| 111 | /* | ||
| 112 | * flush again, in case driver queued work -- it | ||
| 113 | * shouldn't be doing (or cancel everything in the | ||
| 114 | * stop callback) that but better safe than sorry. | ||
| 115 | */ | ||
| 116 | flush_workqueue(local->hw.workqueue); | ||
| 117 | |||
| 114 | local->suspended = true; | 118 | local->suspended = true; |
| 119 | /* need suspended to be visible before quiescing is false */ | ||
| 120 | barrier(); | ||
| 115 | local->quiescing = false; | 121 | local->quiescing = false; |
| 116 | 122 | ||
| 117 | return 0; | 123 | return 0; |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index de5bba7f910a..0936fc24942d 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
| @@ -2453,6 +2453,18 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
| 2453 | return; | 2453 | return; |
| 2454 | } | 2454 | } |
| 2455 | 2455 | ||
| 2456 | /* | ||
| 2457 | * If we're suspending, it is possible although not too likely | ||
| 2458 | * that we'd be receiving frames after having already partially | ||
| 2459 | * quiesced the stack. We can't process such frames then since | ||
| 2460 | * that might, for example, cause stations to be added or other | ||
| 2461 | * driver callbacks be invoked. | ||
| 2462 | */ | ||
| 2463 | if (unlikely(local->quiescing || local->suspended)) { | ||
| 2464 | kfree_skb(skb); | ||
| 2465 | return; | ||
| 2466 | } | ||
| 2467 | |||
| 2456 | if (status->flag & RX_FLAG_HT) { | 2468 | if (status->flag & RX_FLAG_HT) { |
| 2457 | /* rate_idx is MCS index */ | 2469 | /* rate_idx is MCS index */ |
| 2458 | if (WARN_ON(status->rate_idx < 0 || | 2470 | if (WARN_ON(status->rate_idx < 0 || |
diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c index b0e582f2d37a..16e6c4378ff1 100644 --- a/net/netlabel/netlabel_kapi.c +++ b/net/netlabel/netlabel_kapi.c | |||
| @@ -151,7 +151,7 @@ int netlbl_cfg_unlbl_map_add(const char *domain, | |||
| 151 | addr6 = addr; | 151 | addr6 = addr; |
| 152 | mask6 = mask; | 152 | mask6 = mask; |
| 153 | map6 = kzalloc(sizeof(*map6), GFP_ATOMIC); | 153 | map6 = kzalloc(sizeof(*map6), GFP_ATOMIC); |
| 154 | if (map4 == NULL) | 154 | if (map6 == NULL) |
| 155 | goto cfg_unlbl_map_add_failure; | 155 | goto cfg_unlbl_map_add_failure; |
| 156 | map6->type = NETLBL_NLTYPE_UNLABELED; | 156 | map6->type = NETLBL_NLTYPE_UNLABELED; |
| 157 | ipv6_addr_copy(&map6->list.addr, addr6); | 157 | ipv6_addr_copy(&map6->list.addr, addr6); |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 5e14371cda70..75a406d33619 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
| @@ -1089,17 +1089,18 @@ static void handle_reg_beacon(struct wiphy *wiphy, | |||
| 1089 | 1089 | ||
| 1090 | chan->beacon_found = true; | 1090 | chan->beacon_found = true; |
| 1091 | 1091 | ||
| 1092 | if (wiphy->disable_beacon_hints) | ||
| 1093 | return; | ||
| 1094 | |||
| 1092 | chan_before.center_freq = chan->center_freq; | 1095 | chan_before.center_freq = chan->center_freq; |
| 1093 | chan_before.flags = chan->flags; | 1096 | chan_before.flags = chan->flags; |
| 1094 | 1097 | ||
| 1095 | if ((chan->flags & IEEE80211_CHAN_PASSIVE_SCAN) && | 1098 | if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN) { |
| 1096 | !(chan->orig_flags & IEEE80211_CHAN_PASSIVE_SCAN)) { | ||
| 1097 | chan->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN; | 1099 | chan->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN; |
| 1098 | channel_changed = true; | 1100 | channel_changed = true; |
| 1099 | } | 1101 | } |
| 1100 | 1102 | ||
| 1101 | if ((chan->flags & IEEE80211_CHAN_NO_IBSS) && | 1103 | if (chan->flags & IEEE80211_CHAN_NO_IBSS) { |
| 1102 | !(chan->orig_flags & IEEE80211_CHAN_NO_IBSS)) { | ||
| 1103 | chan->flags &= ~IEEE80211_CHAN_NO_IBSS; | 1104 | chan->flags &= ~IEEE80211_CHAN_NO_IBSS; |
| 1104 | channel_changed = true; | 1105 | channel_changed = true; |
| 1105 | } | 1106 | } |
diff --git a/net/wireless/reg.h b/net/wireless/reg.h index e37829a49dc4..4e167a8e11be 100644 --- a/net/wireless/reg.h +++ b/net/wireless/reg.h | |||
| @@ -30,7 +30,8 @@ int set_regdom(const struct ieee80211_regdomain *rd); | |||
| 30 | * non-radar 5 GHz channels. | 30 | * non-radar 5 GHz channels. |
| 31 | * | 31 | * |
| 32 | * Drivers do not need to call this, cfg80211 will do it for after a scan | 32 | * Drivers do not need to call this, cfg80211 will do it for after a scan |
| 33 | * on a newly found BSS. | 33 | * on a newly found BSS. If you cannot make use of this feature you can |
| 34 | * set the wiphy->disable_beacon_hints to true. | ||
| 34 | */ | 35 | */ |
| 35 | int regulatory_hint_found_beacon(struct wiphy *wiphy, | 36 | int regulatory_hint_found_beacon(struct wiphy *wiphy, |
| 36 | struct ieee80211_channel *beacon_chan, | 37 | struct ieee80211_channel *beacon_chan, |
diff --git a/net/wireless/scan.c b/net/wireless/scan.c index 9271118e1fc4..7e595ce24eeb 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c | |||
| @@ -118,7 +118,7 @@ static int cmp_ies(u8 num, u8 *ies1, size_t len1, u8 *ies2, size_t len2) | |||
| 118 | 118 | ||
| 119 | if (!ie1 && !ie2) | 119 | if (!ie1 && !ie2) |
| 120 | return 0; | 120 | return 0; |
| 121 | if (!ie1) | 121 | if (!ie1 || !ie2) |
| 122 | return -1; | 122 | return -1; |
| 123 | 123 | ||
| 124 | r = memcmp(ie1 + 2, ie2 + 2, min(ie1[1], ie2[1])); | 124 | r = memcmp(ie1 + 2, ie2 + 2, min(ie1[1], ie2[1])); |
| @@ -171,6 +171,8 @@ static bool is_mesh(struct cfg80211_bss *a, | |||
| 171 | ie = find_ie(WLAN_EID_MESH_CONFIG, | 171 | ie = find_ie(WLAN_EID_MESH_CONFIG, |
| 172 | a->information_elements, | 172 | a->information_elements, |
| 173 | a->len_information_elements); | 173 | a->len_information_elements); |
| 174 | if (!ie) | ||
| 175 | return false; | ||
| 174 | if (ie[1] != IEEE80211_MESH_CONFIG_LEN) | 176 | if (ie[1] != IEEE80211_MESH_CONFIG_LEN) |
| 175 | return false; | 177 | return false; |
| 176 | 178 | ||
