diff options
67 files changed, 364 insertions, 228 deletions
diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c index d4386019af5d..96cce6d53195 100644 --- a/drivers/atm/iphase.c +++ b/drivers/atm/iphase.c | |||
@@ -2362,7 +2362,7 @@ static int __devinit ia_init(struct atm_dev *dev) | |||
2362 | { | 2362 | { |
2363 | printk(DEV_LABEL " (itf %d): can't set up page mapping\n", | 2363 | printk(DEV_LABEL " (itf %d): can't set up page mapping\n", |
2364 | dev->number); | 2364 | dev->number); |
2365 | return error; | 2365 | return -ENOMEM; |
2366 | } | 2366 | } |
2367 | IF_INIT(printk(DEV_LABEL " (itf %d): rev.%d,base=%p,irq=%d\n", | 2367 | IF_INIT(printk(DEV_LABEL " (itf %d): rev.%d,base=%p,irq=%d\n", |
2368 | dev->number, iadev->pci->revision, base, iadev->irq);) | 2368 | dev->number, iadev->pci->revision, base, iadev->irq);) |
diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c index 11b32d2642df..a6e5672c67e7 100644 --- a/drivers/bcma/host_pci.c +++ b/drivers/bcma/host_pci.c | |||
@@ -272,6 +272,7 @@ static DEFINE_PCI_DEVICE_TABLE(bcma_pci_bridge_tbl) = { | |||
272 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4331) }, | 272 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4331) }, |
273 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4353) }, | 273 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4353) }, |
274 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4357) }, | 274 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4357) }, |
275 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) }, | ||
275 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) }, | 276 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) }, |
276 | { 0, }, | 277 | { 0, }, |
277 | }; | 278 | }; |
diff --git a/drivers/bcma/sprom.c b/drivers/bcma/sprom.c index 26823d97fd9f..9ea4627dc0c2 100644 --- a/drivers/bcma/sprom.c +++ b/drivers/bcma/sprom.c | |||
@@ -507,7 +507,9 @@ static bool bcma_sprom_onchip_available(struct bcma_bus *bus) | |||
507 | /* for these chips OTP is always available */ | 507 | /* for these chips OTP is always available */ |
508 | present = true; | 508 | present = true; |
509 | break; | 509 | break; |
510 | 510 | case BCMA_CHIP_ID_BCM43228: | |
511 | present = chip_status & BCMA_CC_CHIPST_43228_OTP_PRESENT; | ||
512 | break; | ||
511 | default: | 513 | default: |
512 | present = false; | 514 | present = false; |
513 | break; | 515 | break; |
diff --git a/drivers/isdn/isdnloop/isdnloop.c b/drivers/isdn/isdnloop/isdnloop.c index 5405ec644db3..baf2686aa8eb 100644 --- a/drivers/isdn/isdnloop/isdnloop.c +++ b/drivers/isdn/isdnloop/isdnloop.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <linux/sched.h> | 16 | #include <linux/sched.h> |
17 | #include "isdnloop.h" | 17 | #include "isdnloop.h" |
18 | 18 | ||
19 | static char *revision = "$Revision: 1.11.6.7 $"; | ||
20 | static char *isdnloop_id = "loop0"; | 19 | static char *isdnloop_id = "loop0"; |
21 | 20 | ||
22 | MODULE_DESCRIPTION("ISDN4Linux: Pseudo Driver that simulates an ISDN card"); | 21 | MODULE_DESCRIPTION("ISDN4Linux: Pseudo Driver that simulates an ISDN card"); |
@@ -1494,17 +1493,6 @@ isdnloop_addcard(char *id1) | |||
1494 | static int __init | 1493 | static int __init |
1495 | isdnloop_init(void) | 1494 | isdnloop_init(void) |
1496 | { | 1495 | { |
1497 | char *p; | ||
1498 | char rev[10]; | ||
1499 | |||
1500 | if ((p = strchr(revision, ':'))) { | ||
1501 | strcpy(rev, p + 1); | ||
1502 | p = strchr(rev, '$'); | ||
1503 | *p = 0; | ||
1504 | } else | ||
1505 | strcpy(rev, " ??? "); | ||
1506 | printk(KERN_NOTICE "isdnloop-ISDN-driver Rev%s\n", rev); | ||
1507 | |||
1508 | if (isdnloop_id) | 1496 | if (isdnloop_id) |
1509 | return (isdnloop_addcard(isdnloop_id)); | 1497 | return (isdnloop_addcard(isdnloop_id)); |
1510 | 1498 | ||
diff --git a/drivers/isdn/mISDN/layer2.c b/drivers/isdn/mISDN/layer2.c index 0dc8abca1407..949cabb88f1c 100644 --- a/drivers/isdn/mISDN/layer2.c +++ b/drivers/isdn/mISDN/layer2.c | |||
@@ -2222,7 +2222,7 @@ create_l2(struct mISDNchannel *ch, u_int protocol, u_long options, int tei, | |||
2222 | InitWin(l2); | 2222 | InitWin(l2); |
2223 | l2->l2m.fsm = &l2fsm; | 2223 | l2->l2m.fsm = &l2fsm; |
2224 | if (test_bit(FLG_LAPB, &l2->flag) || | 2224 | if (test_bit(FLG_LAPB, &l2->flag) || |
2225 | test_bit(FLG_PTP, &l2->flag) || | 2225 | test_bit(FLG_FIXED_TEI, &l2->flag) || |
2226 | test_bit(FLG_LAPD_NET, &l2->flag)) | 2226 | test_bit(FLG_LAPD_NET, &l2->flag)) |
2227 | l2->l2m.state = ST_L2_4; | 2227 | l2->l2m.state = ST_L2_4; |
2228 | else | 2228 | else |
diff --git a/drivers/net/appletalk/cops.c b/drivers/net/appletalk/cops.c index 545c09ed9079..cff6f023c03a 100644 --- a/drivers/net/appletalk/cops.c +++ b/drivers/net/appletalk/cops.c | |||
@@ -996,9 +996,7 @@ static int __init cops_module_init(void) | |||
996 | printk(KERN_WARNING "%s: You shouldn't autoprobe with insmod\n", | 996 | printk(KERN_WARNING "%s: You shouldn't autoprobe with insmod\n", |
997 | cardname); | 997 | cardname); |
998 | cops_dev = cops_probe(-1); | 998 | cops_dev = cops_probe(-1); |
999 | if (IS_ERR(cops_dev)) | 999 | return PTR_RET(cops_dev); |
1000 | return PTR_ERR(cops_dev); | ||
1001 | return 0; | ||
1002 | } | 1000 | } |
1003 | 1001 | ||
1004 | static void __exit cops_module_exit(void) | 1002 | static void __exit cops_module_exit(void) |
diff --git a/drivers/net/appletalk/ltpc.c b/drivers/net/appletalk/ltpc.c index 0910dce3996d..b5782cdf0bca 100644 --- a/drivers/net/appletalk/ltpc.c +++ b/drivers/net/appletalk/ltpc.c | |||
@@ -1243,9 +1243,7 @@ static int __init ltpc_module_init(void) | |||
1243 | "ltpc: Autoprobing is not recommended for modules\n"); | 1243 | "ltpc: Autoprobing is not recommended for modules\n"); |
1244 | 1244 | ||
1245 | dev_ltpc = ltpc_probe(); | 1245 | dev_ltpc = ltpc_probe(); |
1246 | if (IS_ERR(dev_ltpc)) | 1246 | return PTR_RET(dev_ltpc); |
1247 | return PTR_ERR(dev_ltpc); | ||
1248 | return 0; | ||
1249 | } | 1247 | } |
1250 | module_init(ltpc_module_init); | 1248 | module_init(ltpc_module_init); |
1251 | #endif | 1249 | #endif |
diff --git a/drivers/net/cris/eth_v10.c b/drivers/net/cris/eth_v10.c index f0c8bd54ce29..021d69c5d9bc 100644 --- a/drivers/net/cris/eth_v10.c +++ b/drivers/net/cris/eth_v10.c | |||
@@ -1712,7 +1712,7 @@ e100_set_network_leds(int active) | |||
1712 | static void | 1712 | static void |
1713 | e100_netpoll(struct net_device* netdev) | 1713 | e100_netpoll(struct net_device* netdev) |
1714 | { | 1714 | { |
1715 | e100rxtx_interrupt(NETWORK_DMA_TX_IRQ_NBR, netdev, NULL); | 1715 | e100rxtx_interrupt(NETWORK_DMA_TX_IRQ_NBR, netdev); |
1716 | } | 1716 | } |
1717 | #endif | 1717 | #endif |
1718 | 1718 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c index 734fd87cd990..62f754bd0dfe 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c | |||
@@ -2485,6 +2485,7 @@ static int bnx2x_mcast_enqueue_cmd(struct bnx2x *bp, | |||
2485 | break; | 2485 | break; |
2486 | 2486 | ||
2487 | default: | 2487 | default: |
2488 | kfree(new_cmd); | ||
2488 | BNX2X_ERR("Unknown command: %d\n", cmd); | 2489 | BNX2X_ERR("Unknown command: %d\n", cmd); |
2489 | return -EINVAL; | 2490 | return -EINVAL; |
2490 | } | 2491 | } |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index c60de89b6669..90a903d83d87 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -1948,7 +1948,7 @@ static int be_rx_cqs_create(struct be_adapter *adapter) | |||
1948 | 1948 | ||
1949 | if (adapter->num_rx_qs != MAX_RX_QS) | 1949 | if (adapter->num_rx_qs != MAX_RX_QS) |
1950 | dev_info(&adapter->pdev->dev, | 1950 | dev_info(&adapter->pdev->dev, |
1951 | "Created only %d receive queues", adapter->num_rx_qs); | 1951 | "Created only %d receive queues\n", adapter->num_rx_qs); |
1952 | 1952 | ||
1953 | return 0; | 1953 | return 0; |
1954 | } | 1954 | } |
diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c index 5e84eaac48c1..ba994fb4cec6 100644 --- a/drivers/net/ethernet/intel/igb/e1000_82575.c +++ b/drivers/net/ethernet/intel/igb/e1000_82575.c | |||
@@ -254,6 +254,14 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw) | |||
254 | */ | 254 | */ |
255 | size += NVM_WORD_SIZE_BASE_SHIFT; | 255 | size += NVM_WORD_SIZE_BASE_SHIFT; |
256 | 256 | ||
257 | /* | ||
258 | * Check for invalid size | ||
259 | */ | ||
260 | if ((hw->mac.type == e1000_82576) && (size > 15)) { | ||
261 | pr_notice("The NVM size is not valid, defaulting to 32K\n"); | ||
262 | size = 15; | ||
263 | } | ||
264 | |||
257 | nvm->word_size = 1 << size; | 265 | nvm->word_size = 1 << size; |
258 | if (hw->mac.type < e1000_i210) { | 266 | if (hw->mac.type < e1000_i210) { |
259 | nvm->opcode_bits = 8; | 267 | nvm->opcode_bits = 8; |
@@ -281,14 +289,6 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw) | |||
281 | } else | 289 | } else |
282 | nvm->type = e1000_nvm_flash_hw; | 290 | nvm->type = e1000_nvm_flash_hw; |
283 | 291 | ||
284 | /* | ||
285 | * Check for invalid size | ||
286 | */ | ||
287 | if ((hw->mac.type == e1000_82576) && (size > 15)) { | ||
288 | pr_notice("The NVM size is not valid, defaulting to 32K\n"); | ||
289 | size = 15; | ||
290 | } | ||
291 | |||
292 | /* NVM Function Pointers */ | 292 | /* NVM Function Pointers */ |
293 | switch (hw->mac.type) { | 293 | switch (hw->mac.type) { |
294 | case e1000_82580: | 294 | case e1000_82580: |
diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c index a19c84cad0e9..90550f5e3dd9 100644 --- a/drivers/net/ethernet/intel/igb/igb_ethtool.c +++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c | |||
@@ -209,8 +209,8 @@ static int igb_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) | |||
209 | /* When SoL/IDER sessions are active, autoneg/speed/duplex | 209 | /* When SoL/IDER sessions are active, autoneg/speed/duplex |
210 | * cannot be changed */ | 210 | * cannot be changed */ |
211 | if (igb_check_reset_block(hw)) { | 211 | if (igb_check_reset_block(hw)) { |
212 | dev_err(&adapter->pdev->dev, "Cannot change link " | 212 | dev_err(&adapter->pdev->dev, |
213 | "characteristics when SoL/IDER is active.\n"); | 213 | "Cannot change link characteristics when SoL/IDER is active.\n"); |
214 | return -EINVAL; | 214 | return -EINVAL; |
215 | } | 215 | } |
216 | 216 | ||
@@ -1089,8 +1089,8 @@ static bool reg_pattern_test(struct igb_adapter *adapter, u64 *data, | |||
1089 | wr32(reg, (_test[pat] & write)); | 1089 | wr32(reg, (_test[pat] & write)); |
1090 | val = rd32(reg) & mask; | 1090 | val = rd32(reg) & mask; |
1091 | if (val != (_test[pat] & write & mask)) { | 1091 | if (val != (_test[pat] & write & mask)) { |
1092 | dev_err(&adapter->pdev->dev, "pattern test reg %04X " | 1092 | dev_err(&adapter->pdev->dev, |
1093 | "failed: got 0x%08X expected 0x%08X\n", | 1093 | "pattern test reg %04X failed: got 0x%08X expected 0x%08X\n", |
1094 | reg, val, (_test[pat] & write & mask)); | 1094 | reg, val, (_test[pat] & write & mask)); |
1095 | *data = reg; | 1095 | *data = reg; |
1096 | return 1; | 1096 | return 1; |
@@ -1108,8 +1108,8 @@ static bool reg_set_and_check(struct igb_adapter *adapter, u64 *data, | |||
1108 | wr32(reg, write & mask); | 1108 | wr32(reg, write & mask); |
1109 | val = rd32(reg); | 1109 | val = rd32(reg); |
1110 | if ((write & mask) != (val & mask)) { | 1110 | if ((write & mask) != (val & mask)) { |
1111 | dev_err(&adapter->pdev->dev, "set/check reg %04X test failed:" | 1111 | dev_err(&adapter->pdev->dev, |
1112 | " got 0x%08X expected 0x%08X\n", reg, | 1112 | "set/check reg %04X test failed: got 0x%08X expected 0x%08X\n", reg, |
1113 | (val & mask), (write & mask)); | 1113 | (val & mask), (write & mask)); |
1114 | *data = reg; | 1114 | *data = reg; |
1115 | return 1; | 1115 | return 1; |
@@ -1171,8 +1171,9 @@ static int igb_reg_test(struct igb_adapter *adapter, u64 *data) | |||
1171 | wr32(E1000_STATUS, toggle); | 1171 | wr32(E1000_STATUS, toggle); |
1172 | after = rd32(E1000_STATUS) & toggle; | 1172 | after = rd32(E1000_STATUS) & toggle; |
1173 | if (value != after) { | 1173 | if (value != after) { |
1174 | dev_err(&adapter->pdev->dev, "failed STATUS register test " | 1174 | dev_err(&adapter->pdev->dev, |
1175 | "got: 0x%08X expected: 0x%08X\n", after, value); | 1175 | "failed STATUS register test got: 0x%08X expected: 0x%08X\n", |
1176 | after, value); | ||
1176 | *data = 1; | 1177 | *data = 1; |
1177 | return 1; | 1178 | return 1; |
1178 | } | 1179 | } |
@@ -1777,16 +1778,14 @@ static int igb_loopback_test(struct igb_adapter *adapter, u64 *data) | |||
1777 | * sessions are active */ | 1778 | * sessions are active */ |
1778 | if (igb_check_reset_block(&adapter->hw)) { | 1779 | if (igb_check_reset_block(&adapter->hw)) { |
1779 | dev_err(&adapter->pdev->dev, | 1780 | dev_err(&adapter->pdev->dev, |
1780 | "Cannot do PHY loopback test " | 1781 | "Cannot do PHY loopback test when SoL/IDER is active.\n"); |
1781 | "when SoL/IDER is active.\n"); | ||
1782 | *data = 0; | 1782 | *data = 0; |
1783 | goto out; | 1783 | goto out; |
1784 | } | 1784 | } |
1785 | if ((adapter->hw.mac.type == e1000_i210) | 1785 | if ((adapter->hw.mac.type == e1000_i210) |
1786 | || (adapter->hw.mac.type == e1000_i210)) { | 1786 | || (adapter->hw.mac.type == e1000_i211)) { |
1787 | dev_err(&adapter->pdev->dev, | 1787 | dev_err(&adapter->pdev->dev, |
1788 | "Loopback test not supported " | 1788 | "Loopback test not supported on this part at this time.\n"); |
1789 | "on this part at this time.\n"); | ||
1790 | *data = 0; | 1789 | *data = 0; |
1791 | goto out; | 1790 | goto out; |
1792 | } | 1791 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c index f32e70300770..5aba5ecdf1e2 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c | |||
@@ -614,8 +614,8 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud | |||
614 | /* If source MAC is equal to our own MAC and not performing | 614 | /* If source MAC is equal to our own MAC and not performing |
615 | * the selftest or flb disabled - drop the packet */ | 615 | * the selftest or flb disabled - drop the packet */ |
616 | if (s_mac == priv->mac && | 616 | if (s_mac == priv->mac && |
617 | (!(dev->features & NETIF_F_LOOPBACK) || | 617 | !((dev->features & NETIF_F_LOOPBACK) || |
618 | !priv->validate_loopback)) | 618 | priv->validate_loopback)) |
619 | goto next; | 619 | goto next; |
620 | 620 | ||
621 | /* | 621 | /* |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index 019d856b1334..10bba09c44ea 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | |||
@@ -164,7 +164,6 @@ int mlx4_en_activate_tx_ring(struct mlx4_en_priv *priv, | |||
164 | ring->cons = 0xffffffff; | 164 | ring->cons = 0xffffffff; |
165 | ring->last_nr_txbb = 1; | 165 | ring->last_nr_txbb = 1; |
166 | ring->poll_cnt = 0; | 166 | ring->poll_cnt = 0; |
167 | ring->blocked = 0; | ||
168 | memset(ring->tx_info, 0, ring->size * sizeof(struct mlx4_en_tx_info)); | 167 | memset(ring->tx_info, 0, ring->size * sizeof(struct mlx4_en_tx_info)); |
169 | memset(ring->buf, 0, ring->buf_size); | 168 | memset(ring->buf, 0, ring->buf_size); |
170 | 169 | ||
@@ -365,14 +364,13 @@ static void mlx4_en_process_tx_cq(struct net_device *dev, struct mlx4_en_cq *cq) | |||
365 | ring->cons += txbbs_skipped; | 364 | ring->cons += txbbs_skipped; |
366 | netdev_tx_completed_queue(ring->tx_queue, packets, bytes); | 365 | netdev_tx_completed_queue(ring->tx_queue, packets, bytes); |
367 | 366 | ||
368 | /* Wakeup Tx queue if this ring stopped it */ | 367 | /* |
369 | if (unlikely(ring->blocked)) { | 368 | * Wakeup Tx queue if this stopped, and at least 1 packet |
370 | if ((u32) (ring->prod - ring->cons) <= | 369 | * was completed |
371 | ring->size - HEADROOM - MAX_DESC_TXBBS) { | 370 | */ |
372 | ring->blocked = 0; | 371 | if (netif_tx_queue_stopped(ring->tx_queue) && txbbs_skipped > 0) { |
373 | netif_tx_wake_queue(ring->tx_queue); | 372 | netif_tx_wake_queue(ring->tx_queue); |
374 | priv->port_stats.wake_queue++; | 373 | priv->port_stats.wake_queue++; |
375 | } | ||
376 | } | 374 | } |
377 | } | 375 | } |
378 | 376 | ||
@@ -592,7 +590,6 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) | |||
592 | ring->size - HEADROOM - MAX_DESC_TXBBS)) { | 590 | ring->size - HEADROOM - MAX_DESC_TXBBS)) { |
593 | /* every full Tx ring stops queue */ | 591 | /* every full Tx ring stops queue */ |
594 | netif_tx_stop_queue(ring->tx_queue); | 592 | netif_tx_stop_queue(ring->tx_queue); |
595 | ring->blocked = 1; | ||
596 | priv->port_stats.queue_stopped++; | 593 | priv->port_stats.queue_stopped++; |
597 | 594 | ||
598 | return NETDEV_TX_BUSY; | 595 | return NETDEV_TX_BUSY; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 48d0e90194cb..827b72dfce99 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
@@ -157,9 +157,6 @@ int mlx4_check_port_params(struct mlx4_dev *dev, | |||
157 | "on this HCA, aborting.\n"); | 157 | "on this HCA, aborting.\n"); |
158 | return -EINVAL; | 158 | return -EINVAL; |
159 | } | 159 | } |
160 | if (port_type[i] == MLX4_PORT_TYPE_ETH && | ||
161 | port_type[i + 1] == MLX4_PORT_TYPE_IB) | ||
162 | return -EINVAL; | ||
163 | } | 160 | } |
164 | } | 161 | } |
165 | 162 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index 5f1ab105debc..9d27e42264e2 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | |||
@@ -248,7 +248,6 @@ struct mlx4_en_tx_ring { | |||
248 | u32 doorbell_qpn; | 248 | u32 doorbell_qpn; |
249 | void *buf; | 249 | void *buf; |
250 | u16 poll_cnt; | 250 | u16 poll_cnt; |
251 | int blocked; | ||
252 | struct mlx4_en_tx_info *tx_info; | 251 | struct mlx4_en_tx_info *tx_info; |
253 | u8 *bounce_buf; | 252 | u8 *bounce_buf; |
254 | u32 last_nr_txbb; | 253 | u32 last_nr_txbb; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/sense.c b/drivers/net/ethernet/mellanox/mlx4/sense.c index 802498293528..34ee09bae36e 100644 --- a/drivers/net/ethernet/mellanox/mlx4/sense.c +++ b/drivers/net/ethernet/mellanox/mlx4/sense.c | |||
@@ -81,20 +81,6 @@ void mlx4_do_sense_ports(struct mlx4_dev *dev, | |||
81 | } | 81 | } |
82 | 82 | ||
83 | /* | 83 | /* |
84 | * Adjust port configuration: | ||
85 | * If port 1 sensed nothing and port 2 is IB, set both as IB | ||
86 | * If port 2 sensed nothing and port 1 is Eth, set both as Eth | ||
87 | */ | ||
88 | if (stype[0] == MLX4_PORT_TYPE_ETH) { | ||
89 | for (i = 1; i < dev->caps.num_ports; i++) | ||
90 | stype[i] = stype[i] ? stype[i] : MLX4_PORT_TYPE_ETH; | ||
91 | } | ||
92 | if (stype[dev->caps.num_ports - 1] == MLX4_PORT_TYPE_IB) { | ||
93 | for (i = 0; i < dev->caps.num_ports - 1; i++) | ||
94 | stype[i] = stype[i] ? stype[i] : MLX4_PORT_TYPE_IB; | ||
95 | } | ||
96 | |||
97 | /* | ||
98 | * If sensed nothing, remain in current configuration. | 84 | * If sensed nothing, remain in current configuration. |
99 | */ | 85 | */ |
100 | for (i = 0; i < dev->caps.num_ports; i++) | 86 | for (i = 0; i < dev->caps.num_ports; i++) |
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c index 70554a1b2b02..65a8d49106a4 100644 --- a/drivers/net/ethernet/sfc/efx.c +++ b/drivers/net/ethernet/sfc/efx.c | |||
@@ -1503,6 +1503,11 @@ static int efx_probe_all(struct efx_nic *efx) | |||
1503 | goto fail2; | 1503 | goto fail2; |
1504 | } | 1504 | } |
1505 | 1505 | ||
1506 | BUILD_BUG_ON(EFX_DEFAULT_DMAQ_SIZE < EFX_RXQ_MIN_ENT); | ||
1507 | if (WARN_ON(EFX_DEFAULT_DMAQ_SIZE < EFX_TXQ_MIN_ENT(efx))) { | ||
1508 | rc = -EINVAL; | ||
1509 | goto fail3; | ||
1510 | } | ||
1506 | efx->rxq_entries = efx->txq_entries = EFX_DEFAULT_DMAQ_SIZE; | 1511 | efx->rxq_entries = efx->txq_entries = EFX_DEFAULT_DMAQ_SIZE; |
1507 | 1512 | ||
1508 | rc = efx_probe_filters(efx); | 1513 | rc = efx_probe_filters(efx); |
@@ -2070,6 +2075,7 @@ static int efx_register_netdev(struct efx_nic *efx) | |||
2070 | net_dev->irq = efx->pci_dev->irq; | 2075 | net_dev->irq = efx->pci_dev->irq; |
2071 | net_dev->netdev_ops = &efx_netdev_ops; | 2076 | net_dev->netdev_ops = &efx_netdev_ops; |
2072 | SET_ETHTOOL_OPS(net_dev, &efx_ethtool_ops); | 2077 | SET_ETHTOOL_OPS(net_dev, &efx_ethtool_ops); |
2078 | net_dev->gso_max_segs = EFX_TSO_MAX_SEGS; | ||
2073 | 2079 | ||
2074 | rtnl_lock(); | 2080 | rtnl_lock(); |
2075 | 2081 | ||
diff --git a/drivers/net/ethernet/sfc/efx.h b/drivers/net/ethernet/sfc/efx.h index be8f9158a714..70755c97251a 100644 --- a/drivers/net/ethernet/sfc/efx.h +++ b/drivers/net/ethernet/sfc/efx.h | |||
@@ -30,6 +30,7 @@ extern netdev_tx_t | |||
30 | efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb); | 30 | efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb); |
31 | extern void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index); | 31 | extern void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index); |
32 | extern int efx_setup_tc(struct net_device *net_dev, u8 num_tc); | 32 | extern int efx_setup_tc(struct net_device *net_dev, u8 num_tc); |
33 | extern unsigned int efx_tx_max_skb_descs(struct efx_nic *efx); | ||
33 | 34 | ||
34 | /* RX */ | 35 | /* RX */ |
35 | extern int efx_probe_rx_queue(struct efx_rx_queue *rx_queue); | 36 | extern int efx_probe_rx_queue(struct efx_rx_queue *rx_queue); |
@@ -52,10 +53,15 @@ extern void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue); | |||
52 | #define EFX_MAX_EVQ_SIZE 16384UL | 53 | #define EFX_MAX_EVQ_SIZE 16384UL |
53 | #define EFX_MIN_EVQ_SIZE 512UL | 54 | #define EFX_MIN_EVQ_SIZE 512UL |
54 | 55 | ||
55 | /* The smallest [rt]xq_entries that the driver supports. Callers of | 56 | /* Maximum number of TCP segments we support for soft-TSO */ |
56 | * efx_wake_queue() assume that they can subsequently send at least one | 57 | #define EFX_TSO_MAX_SEGS 100 |
57 | * skb. Falcon/A1 may require up to three descriptors per skb_frag. */ | 58 | |
58 | #define EFX_MIN_RING_SIZE (roundup_pow_of_two(2 * 3 * MAX_SKB_FRAGS)) | 59 | /* The smallest [rt]xq_entries that the driver supports. RX minimum |
60 | * is a bit arbitrary. For TX, we must have space for at least 2 | ||
61 | * TSO skbs. | ||
62 | */ | ||
63 | #define EFX_RXQ_MIN_ENT 128U | ||
64 | #define EFX_TXQ_MIN_ENT(efx) (2 * efx_tx_max_skb_descs(efx)) | ||
59 | 65 | ||
60 | /* Filters */ | 66 | /* Filters */ |
61 | extern int efx_probe_filters(struct efx_nic *efx); | 67 | extern int efx_probe_filters(struct efx_nic *efx); |
diff --git a/drivers/net/ethernet/sfc/ethtool.c b/drivers/net/ethernet/sfc/ethtool.c index 10536f93b561..8cba2df82b18 100644 --- a/drivers/net/ethernet/sfc/ethtool.c +++ b/drivers/net/ethernet/sfc/ethtool.c | |||
@@ -680,21 +680,27 @@ static int efx_ethtool_set_ringparam(struct net_device *net_dev, | |||
680 | struct ethtool_ringparam *ring) | 680 | struct ethtool_ringparam *ring) |
681 | { | 681 | { |
682 | struct efx_nic *efx = netdev_priv(net_dev); | 682 | struct efx_nic *efx = netdev_priv(net_dev); |
683 | u32 txq_entries; | ||
683 | 684 | ||
684 | if (ring->rx_mini_pending || ring->rx_jumbo_pending || | 685 | if (ring->rx_mini_pending || ring->rx_jumbo_pending || |
685 | ring->rx_pending > EFX_MAX_DMAQ_SIZE || | 686 | ring->rx_pending > EFX_MAX_DMAQ_SIZE || |
686 | ring->tx_pending > EFX_MAX_DMAQ_SIZE) | 687 | ring->tx_pending > EFX_MAX_DMAQ_SIZE) |
687 | return -EINVAL; | 688 | return -EINVAL; |
688 | 689 | ||
689 | if (ring->rx_pending < EFX_MIN_RING_SIZE || | 690 | if (ring->rx_pending < EFX_RXQ_MIN_ENT) { |
690 | ring->tx_pending < EFX_MIN_RING_SIZE) { | ||
691 | netif_err(efx, drv, efx->net_dev, | 691 | netif_err(efx, drv, efx->net_dev, |
692 | "TX and RX queues cannot be smaller than %ld\n", | 692 | "RX queues cannot be smaller than %u\n", |
693 | EFX_MIN_RING_SIZE); | 693 | EFX_RXQ_MIN_ENT); |
694 | return -EINVAL; | 694 | return -EINVAL; |
695 | } | 695 | } |
696 | 696 | ||
697 | return efx_realloc_channels(efx, ring->rx_pending, ring->tx_pending); | 697 | txq_entries = max(ring->tx_pending, EFX_TXQ_MIN_ENT(efx)); |
698 | if (txq_entries != ring->tx_pending) | ||
699 | netif_warn(efx, drv, efx->net_dev, | ||
700 | "increasing TX queue size to minimum of %u\n", | ||
701 | txq_entries); | ||
702 | |||
703 | return efx_realloc_channels(efx, ring->rx_pending, txq_entries); | ||
698 | } | 704 | } |
699 | 705 | ||
700 | static int efx_ethtool_set_pauseparam(struct net_device *net_dev, | 706 | static int efx_ethtool_set_pauseparam(struct net_device *net_dev, |
diff --git a/drivers/net/ethernet/sfc/tx.c b/drivers/net/ethernet/sfc/tx.c index 9b225a7769f7..18713436b443 100644 --- a/drivers/net/ethernet/sfc/tx.c +++ b/drivers/net/ethernet/sfc/tx.c | |||
@@ -119,6 +119,25 @@ efx_max_tx_len(struct efx_nic *efx, dma_addr_t dma_addr) | |||
119 | return len; | 119 | return len; |
120 | } | 120 | } |
121 | 121 | ||
122 | unsigned int efx_tx_max_skb_descs(struct efx_nic *efx) | ||
123 | { | ||
124 | /* Header and payload descriptor for each output segment, plus | ||
125 | * one for every input fragment boundary within a segment | ||
126 | */ | ||
127 | unsigned int max_descs = EFX_TSO_MAX_SEGS * 2 + MAX_SKB_FRAGS; | ||
128 | |||
129 | /* Possibly one more per segment for the alignment workaround */ | ||
130 | if (EFX_WORKAROUND_5391(efx)) | ||
131 | max_descs += EFX_TSO_MAX_SEGS; | ||
132 | |||
133 | /* Possibly more for PCIe page boundaries within input fragments */ | ||
134 | if (PAGE_SIZE > EFX_PAGE_SIZE) | ||
135 | max_descs += max_t(unsigned int, MAX_SKB_FRAGS, | ||
136 | DIV_ROUND_UP(GSO_MAX_SIZE, EFX_PAGE_SIZE)); | ||
137 | |||
138 | return max_descs; | ||
139 | } | ||
140 | |||
122 | /* | 141 | /* |
123 | * Add a socket buffer to a TX queue | 142 | * Add a socket buffer to a TX queue |
124 | * | 143 | * |
diff --git a/drivers/net/ethernet/xscale/ixp4xx_eth.c b/drivers/net/ethernet/xscale/ixp4xx_eth.c index 482648fcf0b6..98934bdf6acf 100644 --- a/drivers/net/ethernet/xscale/ixp4xx_eth.c +++ b/drivers/net/ethernet/xscale/ixp4xx_eth.c | |||
@@ -1003,6 +1003,7 @@ static int ixp4xx_nway_reset(struct net_device *dev) | |||
1003 | } | 1003 | } |
1004 | 1004 | ||
1005 | int ixp46x_phc_index = -1; | 1005 | int ixp46x_phc_index = -1; |
1006 | EXPORT_SYMBOL_GPL(ixp46x_phc_index); | ||
1006 | 1007 | ||
1007 | static int ixp4xx_get_ts_info(struct net_device *dev, | 1008 | static int ixp4xx_get_ts_info(struct net_device *dev, |
1008 | struct ethtool_ts_info *info) | 1009 | struct ethtool_ts_info *info) |
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 6cee2917eb02..4a1a5f58fa73 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c | |||
@@ -383,13 +383,6 @@ int netvsc_device_remove(struct hv_device *device) | |||
383 | unsigned long flags; | 383 | unsigned long flags; |
384 | 384 | ||
385 | net_device = hv_get_drvdata(device); | 385 | net_device = hv_get_drvdata(device); |
386 | spin_lock_irqsave(&device->channel->inbound_lock, flags); | ||
387 | net_device->destroy = true; | ||
388 | spin_unlock_irqrestore(&device->channel->inbound_lock, flags); | ||
389 | |||
390 | /* Wait for all send completions */ | ||
391 | wait_event(net_device->wait_drain, | ||
392 | atomic_read(&net_device->num_outstanding_sends) == 0); | ||
393 | 386 | ||
394 | netvsc_disconnect_vsp(net_device); | 387 | netvsc_disconnect_vsp(net_device); |
395 | 388 | ||
diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c index e5d6146937fa..1e88a1095934 100644 --- a/drivers/net/hyperv/rndis_filter.c +++ b/drivers/net/hyperv/rndis_filter.c | |||
@@ -718,6 +718,9 @@ static void rndis_filter_halt_device(struct rndis_device *dev) | |||
718 | { | 718 | { |
719 | struct rndis_request *request; | 719 | struct rndis_request *request; |
720 | struct rndis_halt_request *halt; | 720 | struct rndis_halt_request *halt; |
721 | struct netvsc_device *nvdev = dev->net_dev; | ||
722 | struct hv_device *hdev = nvdev->dev; | ||
723 | ulong flags; | ||
721 | 724 | ||
722 | /* Attempt to do a rndis device halt */ | 725 | /* Attempt to do a rndis device halt */ |
723 | request = get_rndis_request(dev, RNDIS_MSG_HALT, | 726 | request = get_rndis_request(dev, RNDIS_MSG_HALT, |
@@ -735,6 +738,14 @@ static void rndis_filter_halt_device(struct rndis_device *dev) | |||
735 | dev->state = RNDIS_DEV_UNINITIALIZED; | 738 | dev->state = RNDIS_DEV_UNINITIALIZED; |
736 | 739 | ||
737 | cleanup: | 740 | cleanup: |
741 | spin_lock_irqsave(&hdev->channel->inbound_lock, flags); | ||
742 | nvdev->destroy = true; | ||
743 | spin_unlock_irqrestore(&hdev->channel->inbound_lock, flags); | ||
744 | |||
745 | /* Wait for all send completions */ | ||
746 | wait_event(nvdev->wait_drain, | ||
747 | atomic_read(&nvdev->num_outstanding_sends) == 0); | ||
748 | |||
738 | if (request) | 749 | if (request) |
739 | put_rndis_request(dev, request); | 750 | put_rndis_request(dev, request); |
740 | return; | 751 | return; |
diff --git a/drivers/net/phy/mdio-mux-gpio.c b/drivers/net/phy/mdio-mux-gpio.c index e0cc4ef33dee..eefe49e8713c 100644 --- a/drivers/net/phy/mdio-mux-gpio.c +++ b/drivers/net/phy/mdio-mux-gpio.c | |||
@@ -101,7 +101,6 @@ err: | |||
101 | n--; | 101 | n--; |
102 | gpio_free(s->gpio[n]); | 102 | gpio_free(s->gpio[n]); |
103 | } | 103 | } |
104 | devm_kfree(&pdev->dev, s); | ||
105 | return r; | 104 | return r; |
106 | } | 105 | } |
107 | 106 | ||
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index f4ce5957df32..4cd582a4f625 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c | |||
@@ -1225,6 +1225,26 @@ static const struct usb_device_id cdc_devs[] = { | |||
1225 | .driver_info = (unsigned long) &wwan_info, | 1225 | .driver_info = (unsigned long) &wwan_info, |
1226 | }, | 1226 | }, |
1227 | 1227 | ||
1228 | /* Dell branded MBM devices like DW5550 */ | ||
1229 | { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
1230 | | USB_DEVICE_ID_MATCH_VENDOR, | ||
1231 | .idVendor = 0x413c, | ||
1232 | .bInterfaceClass = USB_CLASS_COMM, | ||
1233 | .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM, | ||
1234 | .bInterfaceProtocol = USB_CDC_PROTO_NONE, | ||
1235 | .driver_info = (unsigned long) &wwan_info, | ||
1236 | }, | ||
1237 | |||
1238 | /* Toshiba branded MBM devices */ | ||
1239 | { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
1240 | | USB_DEVICE_ID_MATCH_VENDOR, | ||
1241 | .idVendor = 0x0930, | ||
1242 | .bInterfaceClass = USB_CLASS_COMM, | ||
1243 | .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM, | ||
1244 | .bInterfaceProtocol = USB_CDC_PROTO_NONE, | ||
1245 | .driver_info = (unsigned long) &wwan_info, | ||
1246 | }, | ||
1247 | |||
1228 | /* Generic CDC-NCM devices */ | 1248 | /* Generic CDC-NCM devices */ |
1229 | { USB_INTERFACE_INFO(USB_CLASS_COMM, | 1249 | { USB_INTERFACE_INFO(USB_CLASS_COMM, |
1230 | USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE), | 1250 | USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE), |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index cfa91ab7acf8..60b6a9daff7e 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
@@ -730,6 +730,7 @@ int ath9k_hw_init(struct ath_hw *ah) | |||
730 | case AR9300_DEVID_QCA955X: | 730 | case AR9300_DEVID_QCA955X: |
731 | case AR9300_DEVID_AR9580: | 731 | case AR9300_DEVID_AR9580: |
732 | case AR9300_DEVID_AR9462: | 732 | case AR9300_DEVID_AR9462: |
733 | case AR9485_DEVID_AR1111: | ||
733 | break; | 734 | break; |
734 | default: | 735 | default: |
735 | if (common->bus_ops->ath_bus_type == ATH_USB) | 736 | if (common->bus_ops->ath_bus_type == ATH_USB) |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index dd0c146d81dc..ce7332c64efb 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
@@ -49,6 +49,7 @@ | |||
49 | #define AR9300_DEVID_AR9462 0x0034 | 49 | #define AR9300_DEVID_AR9462 0x0034 |
50 | #define AR9300_DEVID_AR9330 0x0035 | 50 | #define AR9300_DEVID_AR9330 0x0035 |
51 | #define AR9300_DEVID_QCA955X 0x0038 | 51 | #define AR9300_DEVID_QCA955X 0x0038 |
52 | #define AR9485_DEVID_AR1111 0x0037 | ||
52 | 53 | ||
53 | #define AR5416_AR9100_DEVID 0x000b | 54 | #define AR5416_AR9100_DEVID 0x000b |
54 | 55 | ||
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index 87b89d55e637..d455de9162ec 100644 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c | |||
@@ -37,6 +37,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = { | |||
37 | { PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E AR9485 */ | 37 | { PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E AR9485 */ |
38 | { PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E AR9580 */ | 38 | { PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E AR9580 */ |
39 | { PCI_VDEVICE(ATHEROS, 0x0034) }, /* PCI-E AR9462 */ | 39 | { PCI_VDEVICE(ATHEROS, 0x0034) }, /* PCI-E AR9462 */ |
40 | { PCI_VDEVICE(ATHEROS, 0x0037) }, /* PCI-E AR1111/AR9485 */ | ||
40 | { 0 } | 41 | { 0 } |
41 | }; | 42 | }; |
42 | 43 | ||
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index b80352b308d5..a140165dfee0 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -2719,32 +2719,37 @@ static int b43_gpio_init(struct b43_wldev *dev) | |||
2719 | if (dev->dev->chip_id == 0x4301) { | 2719 | if (dev->dev->chip_id == 0x4301) { |
2720 | mask |= 0x0060; | 2720 | mask |= 0x0060; |
2721 | set |= 0x0060; | 2721 | set |= 0x0060; |
2722 | } else if (dev->dev->chip_id == 0x5354) { | ||
2723 | /* Don't allow overtaking buttons GPIOs */ | ||
2724 | set &= 0x2; /* 0x2 is LED GPIO on BCM5354 */ | ||
2722 | } | 2725 | } |
2723 | if (dev->dev->chip_id == 0x5354) | 2726 | |
2724 | set &= 0xff02; | ||
2725 | if (0 /* FIXME: conditional unknown */ ) { | 2727 | if (0 /* FIXME: conditional unknown */ ) { |
2726 | b43_write16(dev, B43_MMIO_GPIO_MASK, | 2728 | b43_write16(dev, B43_MMIO_GPIO_MASK, |
2727 | b43_read16(dev, B43_MMIO_GPIO_MASK) | 2729 | b43_read16(dev, B43_MMIO_GPIO_MASK) |
2728 | | 0x0100); | 2730 | | 0x0100); |
2729 | mask |= 0x0180; | 2731 | /* BT Coexistance Input */ |
2730 | set |= 0x0180; | 2732 | mask |= 0x0080; |
2733 | set |= 0x0080; | ||
2734 | /* BT Coexistance Out */ | ||
2735 | mask |= 0x0100; | ||
2736 | set |= 0x0100; | ||
2731 | } | 2737 | } |
2732 | if (dev->dev->bus_sprom->boardflags_lo & B43_BFL_PACTRL) { | 2738 | if (dev->dev->bus_sprom->boardflags_lo & B43_BFL_PACTRL) { |
2739 | /* PA is controlled by gpio 9, let ucode handle it */ | ||
2733 | b43_write16(dev, B43_MMIO_GPIO_MASK, | 2740 | b43_write16(dev, B43_MMIO_GPIO_MASK, |
2734 | b43_read16(dev, B43_MMIO_GPIO_MASK) | 2741 | b43_read16(dev, B43_MMIO_GPIO_MASK) |
2735 | | 0x0200); | 2742 | | 0x0200); |
2736 | mask |= 0x0200; | 2743 | mask |= 0x0200; |
2737 | set |= 0x0200; | 2744 | set |= 0x0200; |
2738 | } | 2745 | } |
2739 | if (dev->dev->core_rev >= 2) | ||
2740 | mask |= 0x0010; /* FIXME: This is redundant. */ | ||
2741 | 2746 | ||
2742 | switch (dev->dev->bus_type) { | 2747 | switch (dev->dev->bus_type) { |
2743 | #ifdef CONFIG_B43_BCMA | 2748 | #ifdef CONFIG_B43_BCMA |
2744 | case B43_BUS_BCMA: | 2749 | case B43_BUS_BCMA: |
2745 | bcma_cc_write32(&dev->dev->bdev->bus->drv_cc, BCMA_CC_GPIOCTL, | 2750 | bcma_cc_write32(&dev->dev->bdev->bus->drv_cc, BCMA_CC_GPIOCTL, |
2746 | (bcma_cc_read32(&dev->dev->bdev->bus->drv_cc, | 2751 | (bcma_cc_read32(&dev->dev->bdev->bus->drv_cc, |
2747 | BCMA_CC_GPIOCTL) & mask) | set); | 2752 | BCMA_CC_GPIOCTL) & ~mask) | set); |
2748 | break; | 2753 | break; |
2749 | #endif | 2754 | #endif |
2750 | #ifdef CONFIG_B43_SSB | 2755 | #ifdef CONFIG_B43_SSB |
@@ -2753,7 +2758,7 @@ static int b43_gpio_init(struct b43_wldev *dev) | |||
2753 | if (gpiodev) | 2758 | if (gpiodev) |
2754 | ssb_write32(gpiodev, B43_GPIO_CONTROL, | 2759 | ssb_write32(gpiodev, B43_GPIO_CONTROL, |
2755 | (ssb_read32(gpiodev, B43_GPIO_CONTROL) | 2760 | (ssb_read32(gpiodev, B43_GPIO_CONTROL) |
2756 | & mask) | set); | 2761 | & ~mask) | set); |
2757 | break; | 2762 | break; |
2758 | #endif | 2763 | #endif |
2759 | } | 2764 | } |
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/channel.c b/drivers/net/wireless/brcm80211/brcmsmac/channel.c index 9a4c63f927cb..7ed7d7577024 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c | |||
@@ -382,9 +382,7 @@ brcms_c_channel_set_chanspec(struct brcms_cm_info *wlc_cm, u16 chanspec, | |||
382 | { | 382 | { |
383 | struct brcms_c_info *wlc = wlc_cm->wlc; | 383 | struct brcms_c_info *wlc = wlc_cm->wlc; |
384 | struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.channel; | 384 | struct ieee80211_channel *ch = wlc->pub->ieee_hw->conf.channel; |
385 | const struct ieee80211_reg_rule *reg_rule; | ||
386 | struct txpwr_limits txpwr; | 385 | struct txpwr_limits txpwr; |
387 | int ret; | ||
388 | 386 | ||
389 | brcms_c_channel_reg_limits(wlc_cm, chanspec, &txpwr); | 387 | brcms_c_channel_reg_limits(wlc_cm, chanspec, &txpwr); |
390 | 388 | ||
@@ -393,8 +391,7 @@ brcms_c_channel_set_chanspec(struct brcms_cm_info *wlc_cm, u16 chanspec, | |||
393 | ); | 391 | ); |
394 | 392 | ||
395 | /* set or restore gmode as required by regulatory */ | 393 | /* set or restore gmode as required by regulatory */ |
396 | ret = freq_reg_info(wlc->wiphy, ch->center_freq, 0, ®_rule); | 394 | if (ch->flags & IEEE80211_CHAN_NO_OFDM) |
397 | if (!ret && (reg_rule->flags & NL80211_RRF_NO_OFDM)) | ||
398 | brcms_c_set_gmode(wlc, GMODE_LEGACY_B, false); | 395 | brcms_c_set_gmode(wlc, GMODE_LEGACY_B, false); |
399 | else | 396 | else |
400 | brcms_c_set_gmode(wlc, wlc->protection->gmode_user, false); | 397 | brcms_c_set_gmode(wlc, wlc->protection->gmode_user, false); |
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c index 9e79d47e077f..192ad5c1fcc8 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c | |||
@@ -121,7 +121,8 @@ static struct ieee80211_channel brcms_2ghz_chantable[] = { | |||
121 | IEEE80211_CHAN_NO_HT40PLUS), | 121 | IEEE80211_CHAN_NO_HT40PLUS), |
122 | CHAN2GHZ(14, 2484, | 122 | CHAN2GHZ(14, 2484, |
123 | IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_IBSS | | 123 | IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_IBSS | |
124 | IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS) | 124 | IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS | |
125 | IEEE80211_CHAN_NO_OFDM) | ||
125 | }; | 126 | }; |
126 | 127 | ||
127 | static struct ieee80211_channel brcms_5ghz_nphy_chantable[] = { | 128 | static struct ieee80211_channel brcms_5ghz_nphy_chantable[] = { |
diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c index eb5de800ed90..1c10b542ab23 100644 --- a/drivers/net/wireless/libertas/cfg.c +++ b/drivers/net/wireless/libertas/cfg.c | |||
@@ -1254,6 +1254,7 @@ static int lbs_associate(struct lbs_private *priv, | |||
1254 | netif_tx_wake_all_queues(priv->dev); | 1254 | netif_tx_wake_all_queues(priv->dev); |
1255 | } | 1255 | } |
1256 | 1256 | ||
1257 | kfree(cmd); | ||
1257 | done: | 1258 | done: |
1258 | lbs_deb_leave_args(LBS_DEB_CFG80211, "ret %d", ret); | 1259 | lbs_deb_leave_args(LBS_DEB_CFG80211, "ret %d", ret); |
1259 | return ret; | 1260 | return ret; |
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c index 76caebaa4397..e970897f6ab5 100644 --- a/drivers/net/wireless/libertas/if_sdio.c +++ b/drivers/net/wireless/libertas/if_sdio.c | |||
@@ -1314,6 +1314,7 @@ static void if_sdio_remove(struct sdio_func *func) | |||
1314 | kfree(packet); | 1314 | kfree(packet); |
1315 | } | 1315 | } |
1316 | 1316 | ||
1317 | kfree(card); | ||
1317 | lbs_deb_leave(LBS_DEB_SDIO); | 1318 | lbs_deb_leave(LBS_DEB_SDIO); |
1318 | } | 1319 | } |
1319 | 1320 | ||
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c index 58048189bd24..fe1ea43c5149 100644 --- a/drivers/net/wireless/libertas/main.c +++ b/drivers/net/wireless/libertas/main.c | |||
@@ -571,7 +571,10 @@ static int lbs_thread(void *data) | |||
571 | netdev_info(dev, "Timeout submitting command 0x%04x\n", | 571 | netdev_info(dev, "Timeout submitting command 0x%04x\n", |
572 | le16_to_cpu(cmdnode->cmdbuf->command)); | 572 | le16_to_cpu(cmdnode->cmdbuf->command)); |
573 | lbs_complete_command(priv, cmdnode, -ETIMEDOUT); | 573 | lbs_complete_command(priv, cmdnode, -ETIMEDOUT); |
574 | if (priv->reset_card) | 574 | |
575 | /* Reset card, but only when it isn't in the process | ||
576 | * of being shutdown anyway. */ | ||
577 | if (!dev->dismantle && priv->reset_card) | ||
575 | priv->reset_card(priv); | 578 | priv->reset_card(priv); |
576 | } | 579 | } |
577 | priv->cmd_timed_out = 0; | 580 | priv->cmd_timed_out = 0; |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 88455b1b9fe0..cb8c2aca54e4 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
@@ -221,6 +221,67 @@ static void rt2800_rf_write(struct rt2x00_dev *rt2x00dev, | |||
221 | mutex_unlock(&rt2x00dev->csr_mutex); | 221 | mutex_unlock(&rt2x00dev->csr_mutex); |
222 | } | 222 | } |
223 | 223 | ||
224 | static int rt2800_enable_wlan_rt3290(struct rt2x00_dev *rt2x00dev) | ||
225 | { | ||
226 | u32 reg; | ||
227 | int i, count; | ||
228 | |||
229 | rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL, ®); | ||
230 | if (rt2x00_get_field32(reg, WLAN_EN)) | ||
231 | return 0; | ||
232 | |||
233 | rt2x00_set_field32(®, WLAN_GPIO_OUT_OE_BIT_ALL, 0xff); | ||
234 | rt2x00_set_field32(®, FRC_WL_ANT_SET, 1); | ||
235 | rt2x00_set_field32(®, WLAN_CLK_EN, 0); | ||
236 | rt2x00_set_field32(®, WLAN_EN, 1); | ||
237 | rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg); | ||
238 | |||
239 | udelay(REGISTER_BUSY_DELAY); | ||
240 | |||
241 | count = 0; | ||
242 | do { | ||
243 | /* | ||
244 | * Check PLL_LD & XTAL_RDY. | ||
245 | */ | ||
246 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { | ||
247 | rt2800_register_read(rt2x00dev, CMB_CTRL, ®); | ||
248 | if (rt2x00_get_field32(reg, PLL_LD) && | ||
249 | rt2x00_get_field32(reg, XTAL_RDY)) | ||
250 | break; | ||
251 | udelay(REGISTER_BUSY_DELAY); | ||
252 | } | ||
253 | |||
254 | if (i >= REGISTER_BUSY_COUNT) { | ||
255 | |||
256 | if (count >= 10) | ||
257 | return -EIO; | ||
258 | |||
259 | rt2800_register_write(rt2x00dev, 0x58, 0x018); | ||
260 | udelay(REGISTER_BUSY_DELAY); | ||
261 | rt2800_register_write(rt2x00dev, 0x58, 0x418); | ||
262 | udelay(REGISTER_BUSY_DELAY); | ||
263 | rt2800_register_write(rt2x00dev, 0x58, 0x618); | ||
264 | udelay(REGISTER_BUSY_DELAY); | ||
265 | count++; | ||
266 | } else { | ||
267 | count = 0; | ||
268 | } | ||
269 | |||
270 | rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL, ®); | ||
271 | rt2x00_set_field32(®, PCIE_APP0_CLK_REQ, 0); | ||
272 | rt2x00_set_field32(®, WLAN_CLK_EN, 1); | ||
273 | rt2x00_set_field32(®, WLAN_RESET, 1); | ||
274 | rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg); | ||
275 | udelay(10); | ||
276 | rt2x00_set_field32(®, WLAN_RESET, 0); | ||
277 | rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg); | ||
278 | udelay(10); | ||
279 | rt2800_register_write(rt2x00dev, INT_SOURCE_CSR, 0x7fffffff); | ||
280 | } while (count != 0); | ||
281 | |||
282 | return 0; | ||
283 | } | ||
284 | |||
224 | void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev, | 285 | void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev, |
225 | const u8 command, const u8 token, | 286 | const u8 command, const u8 token, |
226 | const u8 arg0, const u8 arg1) | 287 | const u8 arg0, const u8 arg1) |
@@ -400,6 +461,13 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev, | |||
400 | { | 461 | { |
401 | unsigned int i; | 462 | unsigned int i; |
402 | u32 reg; | 463 | u32 reg; |
464 | int retval; | ||
465 | |||
466 | if (rt2x00_rt(rt2x00dev, RT3290)) { | ||
467 | retval = rt2800_enable_wlan_rt3290(rt2x00dev); | ||
468 | if (retval) | ||
469 | return -EBUSY; | ||
470 | } | ||
403 | 471 | ||
404 | /* | 472 | /* |
405 | * If driver doesn't wake up firmware here, | 473 | * If driver doesn't wake up firmware here, |
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c index 235376e9cb04..98aa426a3564 100644 --- a/drivers/net/wireless/rt2x00/rt2800pci.c +++ b/drivers/net/wireless/rt2x00/rt2800pci.c | |||
@@ -980,66 +980,6 @@ static int rt2800pci_validate_eeprom(struct rt2x00_dev *rt2x00dev) | |||
980 | return rt2800_validate_eeprom(rt2x00dev); | 980 | return rt2800_validate_eeprom(rt2x00dev); |
981 | } | 981 | } |
982 | 982 | ||
983 | static int rt2800_enable_wlan_rt3290(struct rt2x00_dev *rt2x00dev) | ||
984 | { | ||
985 | u32 reg; | ||
986 | int i, count; | ||
987 | |||
988 | rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL, ®); | ||
989 | if (rt2x00_get_field32(reg, WLAN_EN)) | ||
990 | return 0; | ||
991 | |||
992 | rt2x00_set_field32(®, WLAN_GPIO_OUT_OE_BIT_ALL, 0xff); | ||
993 | rt2x00_set_field32(®, FRC_WL_ANT_SET, 1); | ||
994 | rt2x00_set_field32(®, WLAN_CLK_EN, 0); | ||
995 | rt2x00_set_field32(®, WLAN_EN, 1); | ||
996 | rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg); | ||
997 | |||
998 | udelay(REGISTER_BUSY_DELAY); | ||
999 | |||
1000 | count = 0; | ||
1001 | do { | ||
1002 | /* | ||
1003 | * Check PLL_LD & XTAL_RDY. | ||
1004 | */ | ||
1005 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { | ||
1006 | rt2800_register_read(rt2x00dev, CMB_CTRL, ®); | ||
1007 | if (rt2x00_get_field32(reg, PLL_LD) && | ||
1008 | rt2x00_get_field32(reg, XTAL_RDY)) | ||
1009 | break; | ||
1010 | udelay(REGISTER_BUSY_DELAY); | ||
1011 | } | ||
1012 | |||
1013 | if (i >= REGISTER_BUSY_COUNT) { | ||
1014 | |||
1015 | if (count >= 10) | ||
1016 | return -EIO; | ||
1017 | |||
1018 | rt2800_register_write(rt2x00dev, 0x58, 0x018); | ||
1019 | udelay(REGISTER_BUSY_DELAY); | ||
1020 | rt2800_register_write(rt2x00dev, 0x58, 0x418); | ||
1021 | udelay(REGISTER_BUSY_DELAY); | ||
1022 | rt2800_register_write(rt2x00dev, 0x58, 0x618); | ||
1023 | udelay(REGISTER_BUSY_DELAY); | ||
1024 | count++; | ||
1025 | } else { | ||
1026 | count = 0; | ||
1027 | } | ||
1028 | |||
1029 | rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL, ®); | ||
1030 | rt2x00_set_field32(®, PCIE_APP0_CLK_REQ, 0); | ||
1031 | rt2x00_set_field32(®, WLAN_CLK_EN, 1); | ||
1032 | rt2x00_set_field32(®, WLAN_RESET, 1); | ||
1033 | rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg); | ||
1034 | udelay(10); | ||
1035 | rt2x00_set_field32(®, WLAN_RESET, 0); | ||
1036 | rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg); | ||
1037 | udelay(10); | ||
1038 | rt2800_register_write(rt2x00dev, INT_SOURCE_CSR, 0x7fffffff); | ||
1039 | } while (count != 0); | ||
1040 | |||
1041 | return 0; | ||
1042 | } | ||
1043 | static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev) | 983 | static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev) |
1044 | { | 984 | { |
1045 | int retval; | 985 | int retval; |
@@ -1063,17 +1003,6 @@ static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
1063 | return retval; | 1003 | return retval; |
1064 | 1004 | ||
1065 | /* | 1005 | /* |
1066 | * In probe phase call rt2800_enable_wlan_rt3290 to enable wlan | ||
1067 | * clk for rt3290. That avoid the MCU fail in start phase. | ||
1068 | */ | ||
1069 | if (rt2x00_rt(rt2x00dev, RT3290)) { | ||
1070 | retval = rt2800_enable_wlan_rt3290(rt2x00dev); | ||
1071 | |||
1072 | if (retval) | ||
1073 | return retval; | ||
1074 | } | ||
1075 | |||
1076 | /* | ||
1077 | * This device has multiple filters for control frames | 1006 | * This device has multiple filters for control frames |
1078 | * and has a separate filter for PS Poll frames. | 1007 | * and has a separate filter for PS Poll frames. |
1079 | */ | 1008 | */ |
diff --git a/include/linux/bcma/bcma_driver_chipcommon.h b/include/linux/bcma/bcma_driver_chipcommon.h index 3c80885fa829..d323a4b4143c 100644 --- a/include/linux/bcma/bcma_driver_chipcommon.h +++ b/include/linux/bcma/bcma_driver_chipcommon.h | |||
@@ -89,6 +89,12 @@ | |||
89 | #define BCMA_CC_CHIPST_4313_OTP_PRESENT 2 | 89 | #define BCMA_CC_CHIPST_4313_OTP_PRESENT 2 |
90 | #define BCMA_CC_CHIPST_4331_SPROM_PRESENT 2 | 90 | #define BCMA_CC_CHIPST_4331_SPROM_PRESENT 2 |
91 | #define BCMA_CC_CHIPST_4331_OTP_PRESENT 4 | 91 | #define BCMA_CC_CHIPST_4331_OTP_PRESENT 4 |
92 | #define BCMA_CC_CHIPST_43228_ILP_DIV_EN 0x00000001 | ||
93 | #define BCMA_CC_CHIPST_43228_OTP_PRESENT 0x00000002 | ||
94 | #define BCMA_CC_CHIPST_43228_SERDES_REFCLK_PADSEL 0x00000004 | ||
95 | #define BCMA_CC_CHIPST_43228_SDIO_MODE 0x00000008 | ||
96 | #define BCMA_CC_CHIPST_43228_SDIO_OTP_PRESENT 0x00000010 | ||
97 | #define BCMA_CC_CHIPST_43228_SDIO_RESET 0x00000020 | ||
92 | #define BCMA_CC_CHIPST_4706_PKG_OPTION BIT(0) /* 0: full-featured package 1: low-cost package */ | 98 | #define BCMA_CC_CHIPST_4706_PKG_OPTION BIT(0) /* 0: full-featured package 1: low-cost package */ |
93 | #define BCMA_CC_CHIPST_4706_SFLASH_PRESENT BIT(1) /* 0: parallel, 1: serial flash is present */ | 99 | #define BCMA_CC_CHIPST_4706_SFLASH_PRESENT BIT(1) /* 0: parallel, 1: serial flash is present */ |
94 | #define BCMA_CC_CHIPST_4706_SFLASH_TYPE BIT(2) /* 0: 8b-p/ST-s flash, 1: 16b-p/Atmal-s flash */ | 100 | #define BCMA_CC_CHIPST_4706_SFLASH_TYPE BIT(2) /* 0: 8b-p/ST-s flash, 1: 16b-p/Atmal-s flash */ |
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 379e433e15e0..879db26ec401 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h | |||
@@ -369,6 +369,7 @@ struct ipv6_pinfo { | |||
369 | __u8 rcv_tclass; | 369 | __u8 rcv_tclass; |
370 | 370 | ||
371 | __u32 dst_cookie; | 371 | __u32 dst_cookie; |
372 | __u32 rx_dst_cookie; | ||
372 | 373 | ||
373 | struct ipv6_mc_socklist __rcu *ipv6_mc_list; | 374 | struct ipv6_mc_socklist __rcu *ipv6_mc_list; |
374 | struct ipv6_ac_socklist *ipv6_ac_list; | 375 | struct ipv6_ac_socklist *ipv6_ac_list; |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index eb06e58bed0b..a9db4f33407f 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -1300,6 +1300,8 @@ struct net_device { | |||
1300 | /* for setting kernel sock attribute on TCP connection setup */ | 1300 | /* for setting kernel sock attribute on TCP connection setup */ |
1301 | #define GSO_MAX_SIZE 65536 | 1301 | #define GSO_MAX_SIZE 65536 |
1302 | unsigned int gso_max_size; | 1302 | unsigned int gso_max_size; |
1303 | #define GSO_MAX_SEGS 65535 | ||
1304 | u16 gso_max_segs; | ||
1303 | 1305 | ||
1304 | #ifdef CONFIG_DCB | 1306 | #ifdef CONFIG_DCB |
1305 | /* Data Center Bridging netlink ops */ | 1307 | /* Data Center Bridging netlink ops */ |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 493fa0c79005..3d254e10ff30 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
@@ -96,6 +96,7 @@ enum ieee80211_band { | |||
96 | * is not permitted. | 96 | * is not permitted. |
97 | * @IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel | 97 | * @IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel |
98 | * is not permitted. | 98 | * is not permitted. |
99 | * @IEEE80211_CHAN_NO_OFDM: OFDM is not allowed on this channel. | ||
99 | */ | 100 | */ |
100 | enum ieee80211_channel_flags { | 101 | enum ieee80211_channel_flags { |
101 | IEEE80211_CHAN_DISABLED = 1<<0, | 102 | IEEE80211_CHAN_DISABLED = 1<<0, |
@@ -104,6 +105,7 @@ enum ieee80211_channel_flags { | |||
104 | IEEE80211_CHAN_RADAR = 1<<3, | 105 | IEEE80211_CHAN_RADAR = 1<<3, |
105 | IEEE80211_CHAN_NO_HT40PLUS = 1<<4, | 106 | IEEE80211_CHAN_NO_HT40PLUS = 1<<4, |
106 | IEEE80211_CHAN_NO_HT40MINUS = 1<<5, | 107 | IEEE80211_CHAN_NO_HT40MINUS = 1<<5, |
108 | IEEE80211_CHAN_NO_OFDM = 1<<6, | ||
107 | }; | 109 | }; |
108 | 110 | ||
109 | #define IEEE80211_CHAN_NO_HT40 \ | 111 | #define IEEE80211_CHAN_NO_HT40 \ |
diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h index 5ee66f517b4f..ba1d3615acbb 100644 --- a/include/net/inet_connection_sock.h +++ b/include/net/inet_connection_sock.h | |||
@@ -39,6 +39,7 @@ struct inet_connection_sock_af_ops { | |||
39 | int (*queue_xmit)(struct sk_buff *skb, struct flowi *fl); | 39 | int (*queue_xmit)(struct sk_buff *skb, struct flowi *fl); |
40 | void (*send_check)(struct sock *sk, struct sk_buff *skb); | 40 | void (*send_check)(struct sock *sk, struct sk_buff *skb); |
41 | int (*rebuild_header)(struct sock *sk); | 41 | int (*rebuild_header)(struct sock *sk); |
42 | void (*sk_rx_dst_set)(struct sock *sk, const struct sk_buff *skb); | ||
42 | int (*conn_request)(struct sock *sk, struct sk_buff *skb); | 43 | int (*conn_request)(struct sock *sk, struct sk_buff *skb); |
43 | struct sock *(*syn_recv_sock)(struct sock *sk, struct sk_buff *skb, | 44 | struct sock *(*syn_recv_sock)(struct sock *sk, struct sk_buff *skb, |
44 | struct request_sock *req, | 45 | struct request_sock *req, |
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index 83b567fe1941..613cfa401672 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h | |||
@@ -249,13 +249,4 @@ static inline __u8 inet_sk_flowi_flags(const struct sock *sk) | |||
249 | return flags; | 249 | return flags; |
250 | } | 250 | } |
251 | 251 | ||
252 | static inline void inet_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb) | ||
253 | { | ||
254 | struct dst_entry *dst = skb_dst(skb); | ||
255 | |||
256 | dst_hold(dst); | ||
257 | sk->sk_rx_dst = dst; | ||
258 | inet_sk(sk)->rx_dst_ifindex = skb->skb_iif; | ||
259 | } | ||
260 | |||
261 | #endif /* _INET_SOCK_H */ | 252 | #endif /* _INET_SOCK_H */ |
diff --git a/include/net/sock.h b/include/net/sock.h index b3730239bf18..72132aef53fc 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -218,6 +218,7 @@ struct cg_proto; | |||
218 | * @sk_route_nocaps: forbidden route capabilities (e.g NETIF_F_GSO_MASK) | 218 | * @sk_route_nocaps: forbidden route capabilities (e.g NETIF_F_GSO_MASK) |
219 | * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4) | 219 | * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4) |
220 | * @sk_gso_max_size: Maximum GSO segment size to build | 220 | * @sk_gso_max_size: Maximum GSO segment size to build |
221 | * @sk_gso_max_segs: Maximum number of GSO segments | ||
221 | * @sk_lingertime: %SO_LINGER l_linger setting | 222 | * @sk_lingertime: %SO_LINGER l_linger setting |
222 | * @sk_backlog: always used with the per-socket spinlock held | 223 | * @sk_backlog: always used with the per-socket spinlock held |
223 | * @sk_callback_lock: used with the callbacks in the end of this struct | 224 | * @sk_callback_lock: used with the callbacks in the end of this struct |
@@ -338,6 +339,7 @@ struct sock { | |||
338 | netdev_features_t sk_route_nocaps; | 339 | netdev_features_t sk_route_nocaps; |
339 | int sk_gso_type; | 340 | int sk_gso_type; |
340 | unsigned int sk_gso_max_size; | 341 | unsigned int sk_gso_max_size; |
342 | u16 sk_gso_max_segs; | ||
341 | int sk_rcvlowat; | 343 | int sk_rcvlowat; |
342 | unsigned long sk_lingertime; | 344 | unsigned long sk_lingertime; |
343 | struct sk_buff_head sk_error_queue; | 345 | struct sk_buff_head sk_error_queue; |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index d9509eb29b80..62b619e82a90 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -213,6 +213,9 @@ struct xfrm_state { | |||
213 | struct xfrm_lifetime_cur curlft; | 213 | struct xfrm_lifetime_cur curlft; |
214 | struct tasklet_hrtimer mtimer; | 214 | struct tasklet_hrtimer mtimer; |
215 | 215 | ||
216 | /* used to fix curlft->add_time when changing date */ | ||
217 | long saved_tmo; | ||
218 | |||
216 | /* Last used time */ | 219 | /* Last used time */ |
217 | unsigned long lastused; | 220 | unsigned long lastused; |
218 | 221 | ||
@@ -238,6 +241,7 @@ static inline struct net *xs_net(struct xfrm_state *x) | |||
238 | 241 | ||
239 | /* xflags - make enum if more show up */ | 242 | /* xflags - make enum if more show up */ |
240 | #define XFRM_TIME_DEFER 1 | 243 | #define XFRM_TIME_DEFER 1 |
244 | #define XFRM_SOFT_EXPIRE 2 | ||
241 | 245 | ||
242 | enum { | 246 | enum { |
243 | XFRM_STATE_VOID, | 247 | XFRM_STATE_VOID, |
diff --git a/net/batman-adv/gateway_client.c b/net/batman-adv/gateway_client.c index b421cc49d2cd..fc866f2e4528 100644 --- a/net/batman-adv/gateway_client.c +++ b/net/batman-adv/gateway_client.c | |||
@@ -200,11 +200,11 @@ void batadv_gw_election(struct batadv_priv *bat_priv) | |||
200 | if (atomic_read(&bat_priv->gw_mode) != BATADV_GW_MODE_CLIENT) | 200 | if (atomic_read(&bat_priv->gw_mode) != BATADV_GW_MODE_CLIENT) |
201 | goto out; | 201 | goto out; |
202 | 202 | ||
203 | if (!batadv_atomic_dec_not_zero(&bat_priv->gw_reselect)) | ||
204 | goto out; | ||
205 | |||
206 | curr_gw = batadv_gw_get_selected_gw_node(bat_priv); | 203 | curr_gw = batadv_gw_get_selected_gw_node(bat_priv); |
207 | 204 | ||
205 | if (!batadv_atomic_dec_not_zero(&bat_priv->gw_reselect) && curr_gw) | ||
206 | goto out; | ||
207 | |||
208 | next_gw = batadv_gw_get_best_gw_node(bat_priv); | 208 | next_gw = batadv_gw_get_best_gw_node(bat_priv); |
209 | 209 | ||
210 | if (curr_gw == next_gw) | 210 | if (curr_gw == next_gw) |
diff --git a/net/core/dev.c b/net/core/dev.c index 0cb3fe8d8e72..f91abf800161 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2134,6 +2134,9 @@ netdev_features_t netif_skb_features(struct sk_buff *skb) | |||
2134 | __be16 protocol = skb->protocol; | 2134 | __be16 protocol = skb->protocol; |
2135 | netdev_features_t features = skb->dev->features; | 2135 | netdev_features_t features = skb->dev->features; |
2136 | 2136 | ||
2137 | if (skb_shinfo(skb)->gso_segs > skb->dev->gso_max_segs) | ||
2138 | features &= ~NETIF_F_GSO_MASK; | ||
2139 | |||
2137 | if (protocol == htons(ETH_P_8021Q)) { | 2140 | if (protocol == htons(ETH_P_8021Q)) { |
2138 | struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; | 2141 | struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; |
2139 | protocol = veh->h_vlan_encapsulated_proto; | 2142 | protocol = veh->h_vlan_encapsulated_proto; |
@@ -5986,6 +5989,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, | |||
5986 | dev_net_set(dev, &init_net); | 5989 | dev_net_set(dev, &init_net); |
5987 | 5990 | ||
5988 | dev->gso_max_size = GSO_MAX_SIZE; | 5991 | dev->gso_max_size = GSO_MAX_SIZE; |
5992 | dev->gso_max_segs = GSO_MAX_SEGS; | ||
5989 | 5993 | ||
5990 | INIT_LIST_HEAD(&dev->napi_list); | 5994 | INIT_LIST_HEAD(&dev->napi_list); |
5991 | INIT_LIST_HEAD(&dev->unreg_list); | 5995 | INIT_LIST_HEAD(&dev->unreg_list); |
diff --git a/net/core/sock.c b/net/core/sock.c index 6b654b3ddfda..8f67ced8d6a8 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -1458,6 +1458,7 @@ void sk_setup_caps(struct sock *sk, struct dst_entry *dst) | |||
1458 | } else { | 1458 | } else { |
1459 | sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM; | 1459 | sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM; |
1460 | sk->sk_gso_max_size = dst->dev->gso_max_size; | 1460 | sk->sk_gso_max_size = dst->dev->gso_max_size; |
1461 | sk->sk_gso_max_segs = dst->dev->gso_max_segs; | ||
1461 | } | 1462 | } |
1462 | } | 1463 | } |
1463 | } | 1464 | } |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index ba39a52d18c1..76dde25fb9a0 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -197,7 +197,7 @@ static inline int ip_finish_output2(struct sk_buff *skb) | |||
197 | neigh = __ipv4_neigh_lookup_noref(dev, nexthop); | 197 | neigh = __ipv4_neigh_lookup_noref(dev, nexthop); |
198 | if (unlikely(!neigh)) | 198 | if (unlikely(!neigh)) |
199 | neigh = __neigh_create(&arp_tbl, &nexthop, dev, false); | 199 | neigh = __neigh_create(&arp_tbl, &nexthop, dev, false); |
200 | if (neigh) { | 200 | if (!IS_ERR(neigh)) { |
201 | int res = dst_neigh_output(dst, neigh, skb); | 201 | int res = dst_neigh_output(dst, neigh, skb); |
202 | 202 | ||
203 | rcu_read_unlock_bh(); | 203 | rcu_read_unlock_bh(); |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index c035251beb07..e4ba974f143c 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -70,7 +70,6 @@ | |||
70 | #include <linux/types.h> | 70 | #include <linux/types.h> |
71 | #include <linux/kernel.h> | 71 | #include <linux/kernel.h> |
72 | #include <linux/mm.h> | 72 | #include <linux/mm.h> |
73 | #include <linux/bootmem.h> | ||
74 | #include <linux/string.h> | 73 | #include <linux/string.h> |
75 | #include <linux/socket.h> | 74 | #include <linux/socket.h> |
76 | #include <linux/sockios.h> | 75 | #include <linux/sockios.h> |
@@ -80,7 +79,6 @@ | |||
80 | #include <linux/netdevice.h> | 79 | #include <linux/netdevice.h> |
81 | #include <linux/proc_fs.h> | 80 | #include <linux/proc_fs.h> |
82 | #include <linux/init.h> | 81 | #include <linux/init.h> |
83 | #include <linux/workqueue.h> | ||
84 | #include <linux/skbuff.h> | 82 | #include <linux/skbuff.h> |
85 | #include <linux/inetdevice.h> | 83 | #include <linux/inetdevice.h> |
86 | #include <linux/igmp.h> | 84 | #include <linux/igmp.h> |
@@ -88,11 +86,9 @@ | |||
88 | #include <linux/mroute.h> | 86 | #include <linux/mroute.h> |
89 | #include <linux/netfilter_ipv4.h> | 87 | #include <linux/netfilter_ipv4.h> |
90 | #include <linux/random.h> | 88 | #include <linux/random.h> |
91 | #include <linux/jhash.h> | ||
92 | #include <linux/rcupdate.h> | 89 | #include <linux/rcupdate.h> |
93 | #include <linux/times.h> | 90 | #include <linux/times.h> |
94 | #include <linux/slab.h> | 91 | #include <linux/slab.h> |
95 | #include <linux/prefetch.h> | ||
96 | #include <net/dst.h> | 92 | #include <net/dst.h> |
97 | #include <net/net_namespace.h> | 93 | #include <net/net_namespace.h> |
98 | #include <net/protocol.h> | 94 | #include <net/protocol.h> |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index e7e6eeae49c0..2109ff4a1daf 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -811,7 +811,9 @@ static unsigned int tcp_xmit_size_goal(struct sock *sk, u32 mss_now, | |||
811 | old_size_goal + mss_now > xmit_size_goal)) { | 811 | old_size_goal + mss_now > xmit_size_goal)) { |
812 | xmit_size_goal = old_size_goal; | 812 | xmit_size_goal = old_size_goal; |
813 | } else { | 813 | } else { |
814 | tp->xmit_size_goal_segs = xmit_size_goal / mss_now; | 814 | tp->xmit_size_goal_segs = |
815 | min_t(u16, xmit_size_goal / mss_now, | ||
816 | sk->sk_gso_max_segs); | ||
815 | xmit_size_goal = tp->xmit_size_goal_segs * mss_now; | 817 | xmit_size_goal = tp->xmit_size_goal_segs * mss_now; |
816 | } | 818 | } |
817 | } | 819 | } |
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index 4d4db16e336e..1432cdb0644c 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c | |||
@@ -291,7 +291,8 @@ bool tcp_is_cwnd_limited(const struct sock *sk, u32 in_flight) | |||
291 | left = tp->snd_cwnd - in_flight; | 291 | left = tp->snd_cwnd - in_flight; |
292 | if (sk_can_gso(sk) && | 292 | if (sk_can_gso(sk) && |
293 | left * sysctl_tcp_tso_win_divisor < tp->snd_cwnd && | 293 | left * sysctl_tcp_tso_win_divisor < tp->snd_cwnd && |
294 | left * tp->mss_cache < sk->sk_gso_max_size) | 294 | left * tp->mss_cache < sk->sk_gso_max_size && |
295 | left < sk->sk_gso_max_segs) | ||
295 | return true; | 296 | return true; |
296 | return left <= tcp_max_tso_deferred_mss(tp); | 297 | return left <= tcp_max_tso_deferred_mss(tp); |
297 | } | 298 | } |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 2fd2bc9e3c64..85308b90df80 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -5392,6 +5392,8 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, | |||
5392 | { | 5392 | { |
5393 | struct tcp_sock *tp = tcp_sk(sk); | 5393 | struct tcp_sock *tp = tcp_sk(sk); |
5394 | 5394 | ||
5395 | if (unlikely(sk->sk_rx_dst == NULL)) | ||
5396 | inet_csk(sk)->icsk_af_ops->sk_rx_dst_set(sk, skb); | ||
5395 | /* | 5397 | /* |
5396 | * Header prediction. | 5398 | * Header prediction. |
5397 | * The code loosely follows the one in the famous | 5399 | * The code loosely follows the one in the famous |
@@ -5605,7 +5607,7 @@ void tcp_finish_connect(struct sock *sk, struct sk_buff *skb) | |||
5605 | tcp_set_state(sk, TCP_ESTABLISHED); | 5607 | tcp_set_state(sk, TCP_ESTABLISHED); |
5606 | 5608 | ||
5607 | if (skb != NULL) { | 5609 | if (skb != NULL) { |
5608 | inet_sk_rx_dst_set(sk, skb); | 5610 | icsk->icsk_af_ops->sk_rx_dst_set(sk, skb); |
5609 | security_inet_conn_established(sk, skb); | 5611 | security_inet_conn_established(sk, skb); |
5610 | } | 5612 | } |
5611 | 5613 | ||
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 42b2a6a73092..272241f16fcb 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -1627,9 +1627,6 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
1627 | sk->sk_rx_dst = NULL; | 1627 | sk->sk_rx_dst = NULL; |
1628 | } | 1628 | } |
1629 | } | 1629 | } |
1630 | if (unlikely(sk->sk_rx_dst == NULL)) | ||
1631 | inet_sk_rx_dst_set(sk, skb); | ||
1632 | |||
1633 | if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len)) { | 1630 | if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len)) { |
1634 | rsk = sk; | 1631 | rsk = sk; |
1635 | goto reset; | 1632 | goto reset; |
@@ -1872,10 +1869,20 @@ static struct timewait_sock_ops tcp_timewait_sock_ops = { | |||
1872 | .twsk_destructor= tcp_twsk_destructor, | 1869 | .twsk_destructor= tcp_twsk_destructor, |
1873 | }; | 1870 | }; |
1874 | 1871 | ||
1872 | static void inet_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb) | ||
1873 | { | ||
1874 | struct dst_entry *dst = skb_dst(skb); | ||
1875 | |||
1876 | dst_hold(dst); | ||
1877 | sk->sk_rx_dst = dst; | ||
1878 | inet_sk(sk)->rx_dst_ifindex = skb->skb_iif; | ||
1879 | } | ||
1880 | |||
1875 | const struct inet_connection_sock_af_ops ipv4_specific = { | 1881 | const struct inet_connection_sock_af_ops ipv4_specific = { |
1876 | .queue_xmit = ip_queue_xmit, | 1882 | .queue_xmit = ip_queue_xmit, |
1877 | .send_check = tcp_v4_send_check, | 1883 | .send_check = tcp_v4_send_check, |
1878 | .rebuild_header = inet_sk_rebuild_header, | 1884 | .rebuild_header = inet_sk_rebuild_header, |
1885 | .sk_rx_dst_set = inet_sk_rx_dst_set, | ||
1879 | .conn_request = tcp_v4_conn_request, | 1886 | .conn_request = tcp_v4_conn_request, |
1880 | .syn_recv_sock = tcp_v4_syn_recv_sock, | 1887 | .syn_recv_sock = tcp_v4_syn_recv_sock, |
1881 | .net_header_len = sizeof(struct iphdr), | 1888 | .net_header_len = sizeof(struct iphdr), |
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index 232a90c3ec86..d9c9dcef2de3 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c | |||
@@ -387,7 +387,7 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req, | |||
387 | struct tcp_sock *oldtp = tcp_sk(sk); | 387 | struct tcp_sock *oldtp = tcp_sk(sk); |
388 | struct tcp_cookie_values *oldcvp = oldtp->cookie_values; | 388 | struct tcp_cookie_values *oldcvp = oldtp->cookie_values; |
389 | 389 | ||
390 | inet_sk_rx_dst_set(newsk, skb); | 390 | newicsk->icsk_af_ops->sk_rx_dst_set(newsk, skb); |
391 | 391 | ||
392 | /* TCP Cookie Transactions require space for the cookie pair, | 392 | /* TCP Cookie Transactions require space for the cookie pair, |
393 | * as it differs for each connection. There is no need to | 393 | * as it differs for each connection. There is no need to |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 3f1bcff0b10b..20dfd892c86f 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -940,7 +940,7 @@ void __init tcp_tasklet_init(void) | |||
940 | * We cant xmit new skbs from this context, as we might already | 940 | * We cant xmit new skbs from this context, as we might already |
941 | * hold qdisc lock. | 941 | * hold qdisc lock. |
942 | */ | 942 | */ |
943 | void tcp_wfree(struct sk_buff *skb) | 943 | static void tcp_wfree(struct sk_buff *skb) |
944 | { | 944 | { |
945 | struct sock *sk = skb->sk; | 945 | struct sock *sk = skb->sk; |
946 | struct tcp_sock *tp = tcp_sk(sk); | 946 | struct tcp_sock *tp = tcp_sk(sk); |
@@ -1522,21 +1522,21 @@ static void tcp_cwnd_validate(struct sock *sk) | |||
1522 | * when we would be allowed to send the split-due-to-Nagle skb fully. | 1522 | * when we would be allowed to send the split-due-to-Nagle skb fully. |
1523 | */ | 1523 | */ |
1524 | static unsigned int tcp_mss_split_point(const struct sock *sk, const struct sk_buff *skb, | 1524 | static unsigned int tcp_mss_split_point(const struct sock *sk, const struct sk_buff *skb, |
1525 | unsigned int mss_now, unsigned int cwnd) | 1525 | unsigned int mss_now, unsigned int max_segs) |
1526 | { | 1526 | { |
1527 | const struct tcp_sock *tp = tcp_sk(sk); | 1527 | const struct tcp_sock *tp = tcp_sk(sk); |
1528 | u32 needed, window, cwnd_len; | 1528 | u32 needed, window, max_len; |
1529 | 1529 | ||
1530 | window = tcp_wnd_end(tp) - TCP_SKB_CB(skb)->seq; | 1530 | window = tcp_wnd_end(tp) - TCP_SKB_CB(skb)->seq; |
1531 | cwnd_len = mss_now * cwnd; | 1531 | max_len = mss_now * max_segs; |
1532 | 1532 | ||
1533 | if (likely(cwnd_len <= window && skb != tcp_write_queue_tail(sk))) | 1533 | if (likely(max_len <= window && skb != tcp_write_queue_tail(sk))) |
1534 | return cwnd_len; | 1534 | return max_len; |
1535 | 1535 | ||
1536 | needed = min(skb->len, window); | 1536 | needed = min(skb->len, window); |
1537 | 1537 | ||
1538 | if (cwnd_len <= needed) | 1538 | if (max_len <= needed) |
1539 | return cwnd_len; | 1539 | return max_len; |
1540 | 1540 | ||
1541 | return needed - needed % mss_now; | 1541 | return needed - needed % mss_now; |
1542 | } | 1542 | } |
@@ -1765,7 +1765,8 @@ static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb) | |||
1765 | limit = min(send_win, cong_win); | 1765 | limit = min(send_win, cong_win); |
1766 | 1766 | ||
1767 | /* If a full-sized TSO skb can be sent, do it. */ | 1767 | /* If a full-sized TSO skb can be sent, do it. */ |
1768 | if (limit >= sk->sk_gso_max_size) | 1768 | if (limit >= min_t(unsigned int, sk->sk_gso_max_size, |
1769 | sk->sk_gso_max_segs * tp->mss_cache)) | ||
1769 | goto send_now; | 1770 | goto send_now; |
1770 | 1771 | ||
1771 | /* Middle in queue won't get any more data, full sendable already? */ | 1772 | /* Middle in queue won't get any more data, full sendable already? */ |
@@ -1999,7 +2000,9 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | |||
1999 | limit = mss_now; | 2000 | limit = mss_now; |
2000 | if (tso_segs > 1 && !tcp_urg_mode(tp)) | 2001 | if (tso_segs > 1 && !tcp_urg_mode(tp)) |
2001 | limit = tcp_mss_split_point(sk, skb, mss_now, | 2002 | limit = tcp_mss_split_point(sk, skb, mss_now, |
2002 | cwnd_quota); | 2003 | min_t(unsigned int, |
2004 | cwnd_quota, | ||
2005 | sk->sk_gso_max_segs)); | ||
2003 | 2006 | ||
2004 | if (skb->len > limit && | 2007 | if (skb->len > limit && |
2005 | unlikely(tso_fragment(sk, skb, limit, mss_now, gfp))) | 2008 | unlikely(tso_fragment(sk, skb, limit, mss_now, gfp))) |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index c66b90f71c9b..5a439e9a4c01 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1447,7 +1447,17 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
1447 | opt_skb = skb_clone(skb, sk_gfp_atomic(sk, GFP_ATOMIC)); | 1447 | opt_skb = skb_clone(skb, sk_gfp_atomic(sk, GFP_ATOMIC)); |
1448 | 1448 | ||
1449 | if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */ | 1449 | if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */ |
1450 | struct dst_entry *dst = sk->sk_rx_dst; | ||
1451 | |||
1450 | sock_rps_save_rxhash(sk, skb); | 1452 | sock_rps_save_rxhash(sk, skb); |
1453 | if (dst) { | ||
1454 | if (inet_sk(sk)->rx_dst_ifindex != skb->skb_iif || | ||
1455 | dst->ops->check(dst, np->rx_dst_cookie) == NULL) { | ||
1456 | dst_release(dst); | ||
1457 | sk->sk_rx_dst = NULL; | ||
1458 | } | ||
1459 | } | ||
1460 | |||
1451 | if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len)) | 1461 | if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len)) |
1452 | goto reset; | 1462 | goto reset; |
1453 | if (opt_skb) | 1463 | if (opt_skb) |
@@ -1705,9 +1715,9 @@ static void tcp_v6_early_demux(struct sk_buff *skb) | |||
1705 | struct dst_entry *dst = sk->sk_rx_dst; | 1715 | struct dst_entry *dst = sk->sk_rx_dst; |
1706 | struct inet_sock *icsk = inet_sk(sk); | 1716 | struct inet_sock *icsk = inet_sk(sk); |
1707 | if (dst) | 1717 | if (dst) |
1708 | dst = dst_check(dst, 0); | 1718 | dst = dst_check(dst, inet6_sk(sk)->rx_dst_cookie); |
1709 | if (dst && | 1719 | if (dst && |
1710 | icsk->rx_dst_ifindex == inet6_iif(skb)) | 1720 | icsk->rx_dst_ifindex == skb->skb_iif) |
1711 | skb_dst_set_noref(skb, dst); | 1721 | skb_dst_set_noref(skb, dst); |
1712 | } | 1722 | } |
1713 | } | 1723 | } |
@@ -1719,10 +1729,23 @@ static struct timewait_sock_ops tcp6_timewait_sock_ops = { | |||
1719 | .twsk_destructor= tcp_twsk_destructor, | 1729 | .twsk_destructor= tcp_twsk_destructor, |
1720 | }; | 1730 | }; |
1721 | 1731 | ||
1732 | static void inet6_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb) | ||
1733 | { | ||
1734 | struct dst_entry *dst = skb_dst(skb); | ||
1735 | const struct rt6_info *rt = (const struct rt6_info *)dst; | ||
1736 | |||
1737 | dst_hold(dst); | ||
1738 | sk->sk_rx_dst = dst; | ||
1739 | inet_sk(sk)->rx_dst_ifindex = skb->skb_iif; | ||
1740 | if (rt->rt6i_node) | ||
1741 | inet6_sk(sk)->rx_dst_cookie = rt->rt6i_node->fn_sernum; | ||
1742 | } | ||
1743 | |||
1722 | static const struct inet_connection_sock_af_ops ipv6_specific = { | 1744 | static const struct inet_connection_sock_af_ops ipv6_specific = { |
1723 | .queue_xmit = inet6_csk_xmit, | 1745 | .queue_xmit = inet6_csk_xmit, |
1724 | .send_check = tcp_v6_send_check, | 1746 | .send_check = tcp_v6_send_check, |
1725 | .rebuild_header = inet6_sk_rebuild_header, | 1747 | .rebuild_header = inet6_sk_rebuild_header, |
1748 | .sk_rx_dst_set = inet6_sk_rx_dst_set, | ||
1726 | .conn_request = tcp_v6_conn_request, | 1749 | .conn_request = tcp_v6_conn_request, |
1727 | .syn_recv_sock = tcp_v6_syn_recv_sock, | 1750 | .syn_recv_sock = tcp_v6_syn_recv_sock, |
1728 | .net_header_len = sizeof(struct ipv6hdr), | 1751 | .net_header_len = sizeof(struct ipv6hdr), |
diff --git a/net/llc/llc_station.c b/net/llc/llc_station.c index 39a8d8924b9c..6828e39ec2ec 100644 --- a/net/llc/llc_station.c +++ b/net/llc/llc_station.c | |||
@@ -268,7 +268,7 @@ static int llc_station_ac_send_null_dsap_xid_c(struct sk_buff *skb) | |||
268 | out: | 268 | out: |
269 | return rc; | 269 | return rc; |
270 | free: | 270 | free: |
271 | kfree_skb(skb); | 271 | kfree_skb(nskb); |
272 | goto out; | 272 | goto out; |
273 | } | 273 | } |
274 | 274 | ||
@@ -293,7 +293,7 @@ static int llc_station_ac_send_xid_r(struct sk_buff *skb) | |||
293 | out: | 293 | out: |
294 | return rc; | 294 | return rc; |
295 | free: | 295 | free: |
296 | kfree_skb(skb); | 296 | kfree_skb(nskb); |
297 | goto out; | 297 | goto out; |
298 | } | 298 | } |
299 | 299 | ||
@@ -322,7 +322,7 @@ static int llc_station_ac_send_test_r(struct sk_buff *skb) | |||
322 | out: | 322 | out: |
323 | return rc; | 323 | return rc; |
324 | free: | 324 | free: |
325 | kfree_skb(skb); | 325 | kfree_skb(nskb); |
326 | goto out; | 326 | goto out; |
327 | } | 327 | } |
328 | 328 | ||
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c index 6fac18c0423f..85572353a7e3 100644 --- a/net/mac80211/mesh.c +++ b/net/mac80211/mesh.c | |||
@@ -622,6 +622,7 @@ void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata) | |||
622 | 622 | ||
623 | del_timer_sync(&sdata->u.mesh.housekeeping_timer); | 623 | del_timer_sync(&sdata->u.mesh.housekeeping_timer); |
624 | del_timer_sync(&sdata->u.mesh.mesh_path_root_timer); | 624 | del_timer_sync(&sdata->u.mesh.mesh_path_root_timer); |
625 | del_timer_sync(&sdata->u.mesh.mesh_path_timer); | ||
625 | /* | 626 | /* |
626 | * If the timer fired while we waited for it, it will have | 627 | * If the timer fired while we waited for it, it will have |
627 | * requeued the work. Now the work will be running again | 628 | * requeued the work. Now the work will be running again |
@@ -634,6 +635,8 @@ void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata) | |||
634 | local->fif_other_bss--; | 635 | local->fif_other_bss--; |
635 | atomic_dec(&local->iff_allmultis); | 636 | atomic_dec(&local->iff_allmultis); |
636 | ieee80211_configure_filter(local); | 637 | ieee80211_configure_filter(local); |
638 | |||
639 | sdata->u.mesh.timers_running = 0; | ||
637 | } | 640 | } |
638 | 641 | ||
639 | static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, | 642 | static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index cef0c9e79aba..a4a5acdbaa4d 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -1430,6 +1430,8 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
1430 | del_timer_sync(&sdata->u.mgd.bcn_mon_timer); | 1430 | del_timer_sync(&sdata->u.mgd.bcn_mon_timer); |
1431 | del_timer_sync(&sdata->u.mgd.timer); | 1431 | del_timer_sync(&sdata->u.mgd.timer); |
1432 | del_timer_sync(&sdata->u.mgd.chswitch_timer); | 1432 | del_timer_sync(&sdata->u.mgd.chswitch_timer); |
1433 | |||
1434 | sdata->u.mgd.timers_running = 0; | ||
1433 | } | 1435 | } |
1434 | 1436 | ||
1435 | void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata, | 1437 | void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata, |
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index bcaee5d12839..839dd9737989 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -299,7 +299,7 @@ static void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted, | |||
299 | if (local->scan_req != local->int_scan_req) | 299 | if (local->scan_req != local->int_scan_req) |
300 | cfg80211_scan_done(local->scan_req, aborted); | 300 | cfg80211_scan_done(local->scan_req, aborted); |
301 | local->scan_req = NULL; | 301 | local->scan_req = NULL; |
302 | local->scan_sdata = NULL; | 302 | rcu_assign_pointer(local->scan_sdata, NULL); |
303 | 303 | ||
304 | local->scanning = 0; | 304 | local->scanning = 0; |
305 | local->scan_channel = NULL; | 305 | local->scan_channel = NULL; |
@@ -984,7 +984,6 @@ int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata) | |||
984 | kfree(local->sched_scan_ies.ie[i]); | 984 | kfree(local->sched_scan_ies.ie[i]); |
985 | 985 | ||
986 | drv_sched_scan_stop(local, sdata); | 986 | drv_sched_scan_stop(local, sdata); |
987 | rcu_assign_pointer(local->sched_scan_sdata, NULL); | ||
988 | } | 987 | } |
989 | out: | 988 | out: |
990 | mutex_unlock(&local->mtx); | 989 | mutex_unlock(&local->mtx); |
diff --git a/net/sched/act_gact.c b/net/sched/act_gact.c index f10fb8256442..05d60859d8e3 100644 --- a/net/sched/act_gact.c +++ b/net/sched/act_gact.c | |||
@@ -67,6 +67,9 @@ static int tcf_gact_init(struct nlattr *nla, struct nlattr *est, | |||
67 | struct tcf_common *pc; | 67 | struct tcf_common *pc; |
68 | int ret = 0; | 68 | int ret = 0; |
69 | int err; | 69 | int err; |
70 | #ifdef CONFIG_GACT_PROB | ||
71 | struct tc_gact_p *p_parm = NULL; | ||
72 | #endif | ||
70 | 73 | ||
71 | if (nla == NULL) | 74 | if (nla == NULL) |
72 | return -EINVAL; | 75 | return -EINVAL; |
@@ -82,6 +85,12 @@ static int tcf_gact_init(struct nlattr *nla, struct nlattr *est, | |||
82 | #ifndef CONFIG_GACT_PROB | 85 | #ifndef CONFIG_GACT_PROB |
83 | if (tb[TCA_GACT_PROB] != NULL) | 86 | if (tb[TCA_GACT_PROB] != NULL) |
84 | return -EOPNOTSUPP; | 87 | return -EOPNOTSUPP; |
88 | #else | ||
89 | if (tb[TCA_GACT_PROB]) { | ||
90 | p_parm = nla_data(tb[TCA_GACT_PROB]); | ||
91 | if (p_parm->ptype >= MAX_RAND) | ||
92 | return -EINVAL; | ||
93 | } | ||
85 | #endif | 94 | #endif |
86 | 95 | ||
87 | pc = tcf_hash_check(parm->index, a, bind, &gact_hash_info); | 96 | pc = tcf_hash_check(parm->index, a, bind, &gact_hash_info); |
@@ -103,8 +112,7 @@ static int tcf_gact_init(struct nlattr *nla, struct nlattr *est, | |||
103 | spin_lock_bh(&gact->tcf_lock); | 112 | spin_lock_bh(&gact->tcf_lock); |
104 | gact->tcf_action = parm->action; | 113 | gact->tcf_action = parm->action; |
105 | #ifdef CONFIG_GACT_PROB | 114 | #ifdef CONFIG_GACT_PROB |
106 | if (tb[TCA_GACT_PROB] != NULL) { | 115 | if (p_parm) { |
107 | struct tc_gact_p *p_parm = nla_data(tb[TCA_GACT_PROB]); | ||
108 | gact->tcfg_paction = p_parm->paction; | 116 | gact->tcfg_paction = p_parm->paction; |
109 | gact->tcfg_pval = p_parm->pval; | 117 | gact->tcfg_pval = p_parm->pval; |
110 | gact->tcfg_ptype = p_parm->ptype; | 118 | gact->tcfg_ptype = p_parm->ptype; |
@@ -133,7 +141,7 @@ static int tcf_gact(struct sk_buff *skb, const struct tc_action *a, | |||
133 | 141 | ||
134 | spin_lock(&gact->tcf_lock); | 142 | spin_lock(&gact->tcf_lock); |
135 | #ifdef CONFIG_GACT_PROB | 143 | #ifdef CONFIG_GACT_PROB |
136 | if (gact->tcfg_ptype && gact_rand[gact->tcfg_ptype] != NULL) | 144 | if (gact->tcfg_ptype) |
137 | action = gact_rand[gact->tcfg_ptype](gact); | 145 | action = gact_rand[gact->tcfg_ptype](gact); |
138 | else | 146 | else |
139 | action = gact->tcf_action; | 147 | action = gact->tcf_action; |
diff --git a/net/sched/act_ipt.c b/net/sched/act_ipt.c index 60e281ad0f07..58fb3c7aab9e 100644 --- a/net/sched/act_ipt.c +++ b/net/sched/act_ipt.c | |||
@@ -185,7 +185,12 @@ err3: | |||
185 | err2: | 185 | err2: |
186 | kfree(tname); | 186 | kfree(tname); |
187 | err1: | 187 | err1: |
188 | kfree(pc); | 188 | if (ret == ACT_P_CREATED) { |
189 | if (est) | ||
190 | gen_kill_estimator(&pc->tcfc_bstats, | ||
191 | &pc->tcfc_rate_est); | ||
192 | kfree_rcu(pc, tcfc_rcu); | ||
193 | } | ||
189 | return err; | 194 | return err; |
190 | } | 195 | } |
191 | 196 | ||
diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c index 26aa2f6ce257..45c53ab067a6 100644 --- a/net/sched/act_pedit.c +++ b/net/sched/act_pedit.c | |||
@@ -74,7 +74,10 @@ static int tcf_pedit_init(struct nlattr *nla, struct nlattr *est, | |||
74 | p = to_pedit(pc); | 74 | p = to_pedit(pc); |
75 | keys = kmalloc(ksize, GFP_KERNEL); | 75 | keys = kmalloc(ksize, GFP_KERNEL); |
76 | if (keys == NULL) { | 76 | if (keys == NULL) { |
77 | kfree(pc); | 77 | if (est) |
78 | gen_kill_estimator(&pc->tcfc_bstats, | ||
79 | &pc->tcfc_rate_est); | ||
80 | kfree_rcu(pc, tcfc_rcu); | ||
78 | return -ENOMEM; | 81 | return -ENOMEM; |
79 | } | 82 | } |
80 | ret = ACT_P_CREATED; | 83 | ret = ACT_P_CREATED; |
diff --git a/net/sched/act_simple.c b/net/sched/act_simple.c index 3922f2a2821b..3714f60f0b3c 100644 --- a/net/sched/act_simple.c +++ b/net/sched/act_simple.c | |||
@@ -131,7 +131,10 @@ static int tcf_simp_init(struct nlattr *nla, struct nlattr *est, | |||
131 | d = to_defact(pc); | 131 | d = to_defact(pc); |
132 | ret = alloc_defdata(d, defdata); | 132 | ret = alloc_defdata(d, defdata); |
133 | if (ret < 0) { | 133 | if (ret < 0) { |
134 | kfree(pc); | 134 | if (est) |
135 | gen_kill_estimator(&pc->tcfc_bstats, | ||
136 | &pc->tcfc_rate_est); | ||
137 | kfree_rcu(pc, tcfc_rcu); | ||
135 | return ret; | 138 | return ret; |
136 | } | 139 | } |
137 | d->tcf_action = parm->action; | 140 | d->tcf_action = parm->action; |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 2303ee73b50a..2ded3c7fad06 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -680,6 +680,8 @@ static u32 map_regdom_flags(u32 rd_flags) | |||
680 | channel_flags |= IEEE80211_CHAN_NO_IBSS; | 680 | channel_flags |= IEEE80211_CHAN_NO_IBSS; |
681 | if (rd_flags & NL80211_RRF_DFS) | 681 | if (rd_flags & NL80211_RRF_DFS) |
682 | channel_flags |= IEEE80211_CHAN_RADAR; | 682 | channel_flags |= IEEE80211_CHAN_RADAR; |
683 | if (rd_flags & NL80211_RRF_NO_OFDM) | ||
684 | channel_flags |= IEEE80211_CHAN_NO_OFDM; | ||
683 | return channel_flags; | 685 | return channel_flags; |
684 | } | 686 | } |
685 | 687 | ||
@@ -901,7 +903,21 @@ static void handle_channel(struct wiphy *wiphy, | |||
901 | chan->max_antenna_gain = min(chan->orig_mag, | 903 | chan->max_antenna_gain = min(chan->orig_mag, |
902 | (int) MBI_TO_DBI(power_rule->max_antenna_gain)); | 904 | (int) MBI_TO_DBI(power_rule->max_antenna_gain)); |
903 | chan->max_reg_power = (int) MBM_TO_DBM(power_rule->max_eirp); | 905 | chan->max_reg_power = (int) MBM_TO_DBM(power_rule->max_eirp); |
904 | chan->max_power = min(chan->max_power, chan->max_reg_power); | 906 | if (chan->orig_mpwr) { |
907 | /* | ||
908 | * Devices that have their own custom regulatory domain | ||
909 | * but also use WIPHY_FLAG_STRICT_REGULATORY will follow the | ||
910 | * passed country IE power settings. | ||
911 | */ | ||
912 | if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE && | ||
913 | wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY && | ||
914 | wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY) | ||
915 | chan->max_power = chan->max_reg_power; | ||
916 | else | ||
917 | chan->max_power = min(chan->orig_mpwr, | ||
918 | chan->max_reg_power); | ||
919 | } else | ||
920 | chan->max_power = chan->max_reg_power; | ||
905 | } | 921 | } |
906 | 922 | ||
907 | static void handle_band(struct wiphy *wiphy, | 923 | static void handle_band(struct wiphy *wiphy, |
@@ -1885,6 +1901,7 @@ static void restore_custom_reg_settings(struct wiphy *wiphy) | |||
1885 | chan->flags = chan->orig_flags; | 1901 | chan->flags = chan->orig_flags; |
1886 | chan->max_antenna_gain = chan->orig_mag; | 1902 | chan->max_antenna_gain = chan->orig_mag; |
1887 | chan->max_power = chan->orig_mpwr; | 1903 | chan->max_power = chan->orig_mpwr; |
1904 | chan->beacon_found = false; | ||
1888 | } | 1905 | } |
1889 | } | 1906 | } |
1890 | } | 1907 | } |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 5b228f97d4b3..87cd0e4d4282 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -415,8 +415,17 @@ static enum hrtimer_restart xfrm_timer_handler(struct hrtimer * me) | |||
415 | if (x->lft.hard_add_expires_seconds) { | 415 | if (x->lft.hard_add_expires_seconds) { |
416 | long tmo = x->lft.hard_add_expires_seconds + | 416 | long tmo = x->lft.hard_add_expires_seconds + |
417 | x->curlft.add_time - now; | 417 | x->curlft.add_time - now; |
418 | if (tmo <= 0) | 418 | if (tmo <= 0) { |
419 | goto expired; | 419 | if (x->xflags & XFRM_SOFT_EXPIRE) { |
420 | /* enter hard expire without soft expire first?! | ||
421 | * setting a new date could trigger this. | ||
422 | * workarbound: fix x->curflt.add_time by below: | ||
423 | */ | ||
424 | x->curlft.add_time = now - x->saved_tmo - 1; | ||
425 | tmo = x->lft.hard_add_expires_seconds - x->saved_tmo; | ||
426 | } else | ||
427 | goto expired; | ||
428 | } | ||
420 | if (tmo < next) | 429 | if (tmo < next) |
421 | next = tmo; | 430 | next = tmo; |
422 | } | 431 | } |
@@ -433,10 +442,14 @@ static enum hrtimer_restart xfrm_timer_handler(struct hrtimer * me) | |||
433 | if (x->lft.soft_add_expires_seconds) { | 442 | if (x->lft.soft_add_expires_seconds) { |
434 | long tmo = x->lft.soft_add_expires_seconds + | 443 | long tmo = x->lft.soft_add_expires_seconds + |
435 | x->curlft.add_time - now; | 444 | x->curlft.add_time - now; |
436 | if (tmo <= 0) | 445 | if (tmo <= 0) { |
437 | warn = 1; | 446 | warn = 1; |
438 | else if (tmo < next) | 447 | x->xflags &= ~XFRM_SOFT_EXPIRE; |
448 | } else if (tmo < next) { | ||
439 | next = tmo; | 449 | next = tmo; |
450 | x->xflags |= XFRM_SOFT_EXPIRE; | ||
451 | x->saved_tmo = tmo; | ||
452 | } | ||
440 | } | 453 | } |
441 | if (x->lft.soft_use_expires_seconds) { | 454 | if (x->lft.soft_use_expires_seconds) { |
442 | long tmo = x->lft.soft_use_expires_seconds + | 455 | long tmo = x->lft.soft_use_expires_seconds + |