aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-12-16 02:11:14 -0500
committerDavid S. Miller <davem@davemloft.net>2011-12-16 02:11:14 -0500
commitb26e478f8fd5b575684f021b05a5c6236ebb911a (patch)
tree27d3b3eaf3fe10d05319ad3395b2569ad5f8f6d0
parentbcebcc468a6bcd3820fe9ad36b34220563efc93a (diff)
parentbb3c36863e8001fc21a88bebfdead4da4c23e848 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/ethernet/freescale/fsl_pq_mdio.c net/batman-adv/translation-table.c net/ipv6/route.c
-rw-r--r--drivers/net/ethernet/freescale/fec.c11
-rw-r--r--drivers/net/ethernet/freescale/fsl_pq_mdio.c13
-rw-r--r--drivers/net/ppp/pptp.c4
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/phy.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/phy.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/phy.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/phy.c2
-rw-r--r--drivers/ssb/driver_pcicore.c8
-rw-r--r--net/batman-adv/translation-table.c24
-rw-r--r--net/ipv4/ipip.c7
-rw-r--r--net/ipv6/addrconf.c3
-rw-r--r--net/ipv6/route.c2
-rw-r--r--net/ipv6/sit.c7
-rw-r--r--net/mac80211/agg-tx.c86
-rw-r--r--net/sched/sch_gred.c2
16 files changed, 102 insertions, 75 deletions
diff --git a/drivers/net/ethernet/freescale/fec.c b/drivers/net/ethernet/freescale/fec.c
index 01ee9cc417b2..4ea2bdc852f8 100644
--- a/drivers/net/ethernet/freescale/fec.c
+++ b/drivers/net/ethernet/freescale/fec.c
@@ -232,6 +232,7 @@ struct fec_enet_private {
232 struct platform_device *pdev; 232 struct platform_device *pdev;
233 233
234 int opened; 234 int opened;
235 int dev_id;
235 236
236 /* Phylib and MDIO interface */ 237 /* Phylib and MDIO interface */
237 struct mii_bus *mii_bus; 238 struct mii_bus *mii_bus;
@@ -842,7 +843,7 @@ static void __inline__ fec_get_mac(struct net_device *ndev)
842 843
843 /* Adjust MAC if using macaddr */ 844 /* Adjust MAC if using macaddr */
844 if (iap == macaddr) 845 if (iap == macaddr)
845 ndev->dev_addr[ETH_ALEN-1] = macaddr[ETH_ALEN-1] + fep->pdev->id; 846 ndev->dev_addr[ETH_ALEN-1] = macaddr[ETH_ALEN-1] + fep->dev_id;
846} 847}
847 848
848/* ------------------------------------------------------------------------- */ 849/* ------------------------------------------------------------------------- */
@@ -960,7 +961,7 @@ static int fec_enet_mii_probe(struct net_device *ndev)
960 char mdio_bus_id[MII_BUS_ID_SIZE]; 961 char mdio_bus_id[MII_BUS_ID_SIZE];
961 char phy_name[MII_BUS_ID_SIZE + 3]; 962 char phy_name[MII_BUS_ID_SIZE + 3];
962 int phy_id; 963 int phy_id;
963 int dev_id = fep->pdev->id; 964 int dev_id = fep->dev_id;
964 965
965 fep->phy_dev = NULL; 966 fep->phy_dev = NULL;
966 967
@@ -1040,7 +1041,7 @@ static int fec_enet_mii_init(struct platform_device *pdev)
1040 * mdio interface in board design, and need to be configured by 1041 * mdio interface in board design, and need to be configured by
1041 * fec0 mii_bus. 1042 * fec0 mii_bus.
1042 */ 1043 */
1043 if ((id_entry->driver_data & FEC_QUIRK_ENET_MAC) && pdev->id > 0) { 1044 if ((id_entry->driver_data & FEC_QUIRK_ENET_MAC) && fep->dev_id > 0) {
1044 /* fec1 uses fec0 mii_bus */ 1045 /* fec1 uses fec0 mii_bus */
1045 if (mii_cnt && fec0_mii_bus) { 1046 if (mii_cnt && fec0_mii_bus) {
1046 fep->mii_bus = fec0_mii_bus; 1047 fep->mii_bus = fec0_mii_bus;
@@ -1076,7 +1077,7 @@ static int fec_enet_mii_init(struct platform_device *pdev)
1076 fep->mii_bus->read = fec_enet_mdio_read; 1077 fep->mii_bus->read = fec_enet_mdio_read;
1077 fep->mii_bus->write = fec_enet_mdio_write; 1078 fep->mii_bus->write = fec_enet_mdio_write;
1078 fep->mii_bus->reset = fec_enet_mdio_reset; 1079 fep->mii_bus->reset = fec_enet_mdio_reset;
1079 snprintf(fep->mii_bus->id, MII_BUS_ID_SIZE, "%x", pdev->id + 1); 1080 snprintf(fep->mii_bus->id, MII_BUS_ID_SIZE, "%x", fep->dev_id + 1);
1080 fep->mii_bus->priv = fep; 1081 fep->mii_bus->priv = fep;
1081 fep->mii_bus->parent = &pdev->dev; 1082 fep->mii_bus->parent = &pdev->dev;
1082 1083
@@ -1536,6 +1537,7 @@ fec_probe(struct platform_device *pdev)
1536 int i, irq, ret = 0; 1537 int i, irq, ret = 0;
1537 struct resource *r; 1538 struct resource *r;
1538 const struct of_device_id *of_id; 1539 const struct of_device_id *of_id;
1540 static int dev_id;
1539 1541
1540 of_id = of_match_device(fec_dt_ids, &pdev->dev); 1542 of_id = of_match_device(fec_dt_ids, &pdev->dev);
1541 if (of_id) 1543 if (of_id)
@@ -1563,6 +1565,7 @@ fec_probe(struct platform_device *pdev)
1563 1565
1564 fep->hwp = ioremap(r->start, resource_size(r)); 1566 fep->hwp = ioremap(r->start, resource_size(r));
1565 fep->pdev = pdev; 1567 fep->pdev = pdev;
1568 fep->dev_id = dev_id++;
1566 1569
1567 if (!fep->hwp) { 1570 if (!fep->hwp) {
1568 ret = -ENOMEM; 1571 ret = -ENOMEM;
diff --git a/drivers/net/ethernet/freescale/fsl_pq_mdio.c b/drivers/net/ethernet/freescale/fsl_pq_mdio.c
index f1096027b186..9eb815941df5 100644
--- a/drivers/net/ethernet/freescale/fsl_pq_mdio.c
+++ b/drivers/net/ethernet/freescale/fsl_pq_mdio.c
@@ -356,14 +356,13 @@ static int fsl_pq_mdio_probe(struct platform_device *ofdev)
356 356
357 if (prop) 357 if (prop)
358 tbiaddr = *prop; 358 tbiaddr = *prop;
359 }
359 360
360 if (tbiaddr == -1) { 361 if (tbiaddr == -1) {
361 err = -EBUSY; 362 err = -EBUSY;
362 363 goto err_free_irqs;
363 goto err_free_irqs; 364 } else {
364 } else { 365 out_be32(tbipa, tbiaddr);
365 out_be32(tbipa, tbiaddr);
366 }
367 } 366 }
368 367
369 err = of_mdiobus_register(new_bus, np); 368 err = of_mdiobus_register(new_bus, np);
diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c
index ede899ca0ee6..c1c9293c2bbf 100644
--- a/drivers/net/ppp/pptp.c
+++ b/drivers/net/ppp/pptp.c
@@ -423,10 +423,8 @@ static int pptp_bind(struct socket *sock, struct sockaddr *uservaddr,
423 lock_sock(sk); 423 lock_sock(sk);
424 424
425 opt->src_addr = sp->sa_addr.pptp; 425 opt->src_addr = sp->sa_addr.pptp;
426 if (add_chan(po)) { 426 if (add_chan(po))
427 release_sock(sk);
428 error = -EBUSY; 427 error = -EBUSY;
429 }
430 428
431 release_sock(sk); 429 release_sock(sk);
432 return error; 430 return error;
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 5007297c9447..7d920044d031 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -286,7 +286,7 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)
286 ath_start_ani(common); 286 ath_start_ani(common);
287 } 287 }
288 288
289 if (ath9k_hw_ops(ah)->antdiv_comb_conf_get && sc->ant_rx != 3) { 289 if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx != 3) {
290 struct ath_hw_antcomb_conf div_ant_conf; 290 struct ath_hw_antcomb_conf div_ant_conf;
291 u8 lna_conf; 291 u8 lna_conf;
292 292
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
index 592a10ac5929..3b585aadabfc 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
@@ -569,7 +569,7 @@ static bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
569 } 569 }
570 case ERFSLEEP:{ 570 case ERFSLEEP:{
571 if (ppsc->rfpwr_state == ERFOFF) 571 if (ppsc->rfpwr_state == ERFOFF)
572 break; 572 return false;
573 for (queue_id = 0, i = 0; 573 for (queue_id = 0, i = 0;
574 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 574 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
575 ring = &pcipriv->dev.tx_ring[queue_id]; 575 ring = &pcipriv->dev.tx_ring[queue_id];
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
index 72852900df84..e49cf2244c75 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
@@ -548,7 +548,7 @@ static bool _rtl92cu_phy_set_rf_power_state(struct ieee80211_hw *hw,
548 break; 548 break;
549 case ERFSLEEP: 549 case ERFSLEEP:
550 if (ppsc->rfpwr_state == ERFOFF) 550 if (ppsc->rfpwr_state == ERFOFF)
551 break; 551 return false;
552 for (queue_id = 0, i = 0; 552 for (queue_id = 0, i = 0;
553 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 553 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
554 ring = &pcipriv->dev.tx_ring[queue_id]; 554 ring = &pcipriv->dev.tx_ring[queue_id];
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c
index 3ac7af1c5509..0883349e1c83 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c
@@ -3374,7 +3374,7 @@ bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw,
3374 break; 3374 break;
3375 case ERFSLEEP: 3375 case ERFSLEEP:
3376 if (ppsc->rfpwr_state == ERFOFF) 3376 if (ppsc->rfpwr_state == ERFOFF)
3377 break; 3377 return false;
3378 3378
3379 for (queue_id = 0, i = 0; 3379 for (queue_id = 0, i = 0;
3380 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 3380 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/phy.c b/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
index f27171af979c..f10ac1ad9087 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
@@ -602,7 +602,7 @@ bool rtl92s_phy_set_rf_power_state(struct ieee80211_hw *hw,
602 } 602 }
603 case ERFSLEEP: 603 case ERFSLEEP:
604 if (ppsc->rfpwr_state == ERFOFF) 604 if (ppsc->rfpwr_state == ERFOFF)
605 break; 605 return false;
606 606
607 for (queue_id = 0, i = 0; 607 for (queue_id = 0, i = 0;
608 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 608 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
diff --git a/drivers/ssb/driver_pcicore.c b/drivers/ssb/driver_pcicore.c
index 84c934c0a545..520e8286db28 100644
--- a/drivers/ssb/driver_pcicore.c
+++ b/drivers/ssb/driver_pcicore.c
@@ -517,10 +517,14 @@ static void ssb_pcicore_pcie_setup_workarounds(struct ssb_pcicore *pc)
517 517
518static void __devinit ssb_pcicore_init_clientmode(struct ssb_pcicore *pc) 518static void __devinit ssb_pcicore_init_clientmode(struct ssb_pcicore *pc)
519{ 519{
520 ssb_pcicore_fix_sprom_core_index(pc); 520 struct ssb_device *pdev = pc->dev;
521 struct ssb_bus *bus = pdev->bus;
522
523 if (bus->bustype == SSB_BUSTYPE_PCI)
524 ssb_pcicore_fix_sprom_core_index(pc);
521 525
522 /* Disable PCI interrupts. */ 526 /* Disable PCI interrupts. */
523 ssb_write32(pc->dev, SSB_INTVEC, 0); 527 ssb_write32(pdev, SSB_INTVEC, 0);
524 528
525 /* Additional PCIe always once-executed workarounds */ 529 /* Additional PCIe always once-executed workarounds */
526 if (pc->dev->id.coreid == SSB_DEV_PCIE) { 530 if (pc->dev->id.coreid == SSB_DEV_PCIE) {
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index cc87acf02431..46a2b3791d9c 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -242,9 +242,10 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
242 if (tt_global_entry) { 242 if (tt_global_entry) {
243 /* This node is probably going to update its tt table */ 243 /* This node is probably going to update its tt table */
244 tt_global_entry->orig_node->tt_poss_change = true; 244 tt_global_entry->orig_node->tt_poss_change = true;
245 /* The global entry has to be marked as PENDING and has to be 245 /* The global entry has to be marked as ROAMING and has to be
246 * kept for consistency purpose */ 246 * kept for consistency purpose */
247 tt_global_entry->common.flags |= TT_CLIENT_PENDING; 247 tt_global_entry->common.flags |= TT_CLIENT_PENDING;
248 tt_global_entry->roam_at = jiffies;
248 send_roam_adv(bat_priv, tt_global_entry->common.addr, 249 send_roam_adv(bat_priv, tt_global_entry->common.addr,
249 tt_global_entry->orig_node); 250 tt_global_entry->orig_node);
250 } 251 }
@@ -661,6 +662,7 @@ void tt_global_del(struct bat_priv *bat_priv,
661 const char *message, bool roaming) 662 const char *message, bool roaming)
662{ 663{
663 struct tt_global_entry *tt_global_entry = NULL; 664 struct tt_global_entry *tt_global_entry = NULL;
665 struct tt_local_entry *tt_local_entry = NULL;
664 666
665 tt_global_entry = tt_global_hash_find(bat_priv, addr); 667 tt_global_entry = tt_global_hash_find(bat_priv, addr);
666 if (!tt_global_entry) 668 if (!tt_global_entry)
@@ -668,15 +670,29 @@ void tt_global_del(struct bat_priv *bat_priv,
668 670
669 if (tt_global_entry->orig_node == orig_node) { 671 if (tt_global_entry->orig_node == orig_node) {
670 if (roaming) { 672 if (roaming) {
671 tt_global_entry->common.flags |= TT_CLIENT_ROAM; 673 /* if we are deleting a global entry due to a roam
672 tt_global_entry->roam_at = jiffies; 674 * event, there are two possibilities:
673 goto out; 675 * 1) the client roamed from node A to node B => we mark
676 * it with TT_CLIENT_ROAM, we start a timer and we
677 * wait for node B to claim it. In case of timeout
678 * the entry is purged.
679 * 2) the client roamed to us => we can directly delete
680 * the global entry, since it is useless now. */
681 tt_local_entry = tt_local_hash_find(bat_priv,
682 tt_global_entry->common.addr);
683 if (!tt_local_entry) {
684 tt_global_entry->common.flags |= TT_CLIENT_ROAM;
685 tt_global_entry->roam_at = jiffies;
686 goto out;
687 }
674 } 688 }
675 _tt_global_del(bat_priv, tt_global_entry, message); 689 _tt_global_del(bat_priv, tt_global_entry, message);
676 } 690 }
677out: 691out:
678 if (tt_global_entry) 692 if (tt_global_entry)
679 tt_global_entry_free_ref(tt_global_entry); 693 tt_global_entry_free_ref(tt_global_entry);
694 if (tt_local_entry)
695 tt_local_entry_free_ref(tt_local_entry);
680} 696}
681 697
682void tt_global_del_orig(struct bat_priv *bat_priv, 698void tt_global_del_orig(struct bat_priv *bat_priv,
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c
index 94906908a416..413ed1ba7a5a 100644
--- a/net/ipv4/ipip.c
+++ b/net/ipv4/ipip.c
@@ -285,6 +285,8 @@ static struct ip_tunnel * ipip_tunnel_locate(struct net *net,
285 if (register_netdevice(dev) < 0) 285 if (register_netdevice(dev) < 0)
286 goto failed_free; 286 goto failed_free;
287 287
288 strcpy(nt->parms.name, dev->name);
289
288 dev_hold(dev); 290 dev_hold(dev);
289 ipip_tunnel_link(ipn, nt); 291 ipip_tunnel_link(ipn, nt);
290 return nt; 292 return nt;
@@ -759,7 +761,6 @@ static int ipip_tunnel_init(struct net_device *dev)
759 struct ip_tunnel *tunnel = netdev_priv(dev); 761 struct ip_tunnel *tunnel = netdev_priv(dev);
760 762
761 tunnel->dev = dev; 763 tunnel->dev = dev;
762 strcpy(tunnel->parms.name, dev->name);
763 764
764 memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4); 765 memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4);
765 memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4); 766 memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4);
@@ -825,6 +826,7 @@ static void ipip_destroy_tunnels(struct ipip_net *ipn, struct list_head *head)
825static int __net_init ipip_init_net(struct net *net) 826static int __net_init ipip_init_net(struct net *net)
826{ 827{
827 struct ipip_net *ipn = net_generic(net, ipip_net_id); 828 struct ipip_net *ipn = net_generic(net, ipip_net_id);
829 struct ip_tunnel *t;
828 int err; 830 int err;
829 831
830 ipn->tunnels[0] = ipn->tunnels_wc; 832 ipn->tunnels[0] = ipn->tunnels_wc;
@@ -848,6 +850,9 @@ static int __net_init ipip_init_net(struct net *net)
848 if ((err = register_netdev(ipn->fb_tunnel_dev))) 850 if ((err = register_netdev(ipn->fb_tunnel_dev)))
849 goto err_reg_dev; 851 goto err_reg_dev;
850 852
853 t = netdev_priv(ipn->fb_tunnel_dev);
854
855 strcpy(t->parms.name, ipn->fb_tunnel_dev->name);
851 return 0; 856 return 0;
852 857
853err_reg_dev: 858err_reg_dev:
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 94f3fd91a1a6..59a9d0e1da56 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -1805,7 +1805,8 @@ static struct inet6_dev *addrconf_add_dev(struct net_device *dev)
1805 return ERR_PTR(-EACCES); 1805 return ERR_PTR(-EACCES);
1806 1806
1807 /* Add default multicast route */ 1807 /* Add default multicast route */
1808 addrconf_add_mroute(dev); 1808 if (!(dev->flags & IFF_LOOPBACK))
1809 addrconf_add_mroute(dev);
1809 1810
1810 /* Add link local route */ 1811 /* Add link local route */
1811 addrconf_add_lroute(dev); 1812 addrconf_add_lroute(dev);
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 4bf362baa97a..ad438546d915 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -728,7 +728,7 @@ static struct rt6_info *rt6_alloc_cow(const struct rt6_info *ort,
728 int attempts = !in_softirq(); 728 int attempts = !in_softirq();
729 729
730 if (!(rt->rt6i_flags & RTF_GATEWAY)) { 730 if (!(rt->rt6i_flags & RTF_GATEWAY)) {
731 if (rt->rt6i_dst.plen != 128 && 731 if (ort->rt6i_dst.plen != 128 &&
732 ipv6_addr_equal(&ort->rt6i_dst.addr, daddr)) 732 ipv6_addr_equal(&ort->rt6i_dst.addr, daddr))
733 rt->rt6i_flags |= RTF_ANYCAST; 733 rt->rt6i_flags |= RTF_ANYCAST;
734 rt->rt6i_gateway = *daddr; 734 rt->rt6i_gateway = *daddr;
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
index b7d14cc12ee8..3b6dac956bb0 100644
--- a/net/ipv6/sit.c
+++ b/net/ipv6/sit.c
@@ -263,6 +263,8 @@ static struct ip_tunnel *ipip6_tunnel_locate(struct net *net,
263 if (register_netdevice(dev) < 0) 263 if (register_netdevice(dev) < 0)
264 goto failed_free; 264 goto failed_free;
265 265
266 strcpy(nt->parms.name, dev->name);
267
266 dev_hold(dev); 268 dev_hold(dev);
267 269
268 ipip6_tunnel_link(sitn, nt); 270 ipip6_tunnel_link(sitn, nt);
@@ -1144,7 +1146,6 @@ static int ipip6_tunnel_init(struct net_device *dev)
1144 struct ip_tunnel *tunnel = netdev_priv(dev); 1146 struct ip_tunnel *tunnel = netdev_priv(dev);
1145 1147
1146 tunnel->dev = dev; 1148 tunnel->dev = dev;
1147 strcpy(tunnel->parms.name, dev->name);
1148 1149
1149 memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4); 1150 memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4);
1150 memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4); 1151 memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4);
@@ -1207,6 +1208,7 @@ static void __net_exit sit_destroy_tunnels(struct sit_net *sitn, struct list_hea
1207static int __net_init sit_init_net(struct net *net) 1208static int __net_init sit_init_net(struct net *net)
1208{ 1209{
1209 struct sit_net *sitn = net_generic(net, sit_net_id); 1210 struct sit_net *sitn = net_generic(net, sit_net_id);
1211 struct ip_tunnel *t;
1210 int err; 1212 int err;
1211 1213
1212 sitn->tunnels[0] = sitn->tunnels_wc; 1214 sitn->tunnels[0] = sitn->tunnels_wc;
@@ -1231,6 +1233,9 @@ static int __net_init sit_init_net(struct net *net)
1231 if ((err = register_netdev(sitn->fb_tunnel_dev))) 1233 if ((err = register_netdev(sitn->fb_tunnel_dev)))
1232 goto err_reg_dev; 1234 goto err_reg_dev;
1233 1235
1236 t = netdev_priv(sitn->fb_tunnel_dev);
1237
1238 strcpy(t->parms.name, sitn->fb_tunnel_dev->name);
1234 return 0; 1239 return 0;
1235 1240
1236err_reg_dev: 1241err_reg_dev:
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index c45fa5df0d41..7380287f010e 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -307,6 +307,38 @@ ieee80211_wake_queue_agg(struct ieee80211_local *local, int tid)
307 __release(agg_queue); 307 __release(agg_queue);
308} 308}
309 309
310/*
311 * splice packets from the STA's pending to the local pending,
312 * requires a call to ieee80211_agg_splice_finish later
313 */
314static void __acquires(agg_queue)
315ieee80211_agg_splice_packets(struct ieee80211_local *local,
316 struct tid_ampdu_tx *tid_tx, u16 tid)
317{
318 int queue = ieee80211_ac_from_tid(tid);
319 unsigned long flags;
320
321 ieee80211_stop_queue_agg(local, tid);
322
323 if (WARN(!tid_tx, "TID %d gone but expected when splicing aggregates"
324 " from the pending queue\n", tid))
325 return;
326
327 if (!skb_queue_empty(&tid_tx->pending)) {
328 spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
329 /* copy over remaining packets */
330 skb_queue_splice_tail_init(&tid_tx->pending,
331 &local->pending[queue]);
332 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
333 }
334}
335
336static void __releases(agg_queue)
337ieee80211_agg_splice_finish(struct ieee80211_local *local, u16 tid)
338{
339 ieee80211_wake_queue_agg(local, tid);
340}
341
310void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) 342void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)
311{ 343{
312 struct tid_ampdu_tx *tid_tx; 344 struct tid_ampdu_tx *tid_tx;
@@ -318,19 +350,17 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)
318 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); 350 tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
319 351
320 /* 352 /*
321 * While we're asking the driver about the aggregation, 353 * Start queuing up packets for this aggregation session.
322 * stop the AC queue so that we don't have to worry 354 * We're going to release them once the driver is OK with
323 * about frames that came in while we were doing that, 355 * that.
324 * which would require us to put them to the AC pending
325 * afterwards which just makes the code more complex.
326 */ 356 */
327 ieee80211_stop_queue_agg(local, tid);
328
329 clear_bit(HT_AGG_STATE_WANT_START, &tid_tx->state); 357 clear_bit(HT_AGG_STATE_WANT_START, &tid_tx->state);
330 358
331 /* 359 /*
332 * make sure no packets are being processed to get 360 * Make sure no packets are being processed. This ensures that
333 * valid starting sequence number 361 * we have a valid starting sequence number and that in-flight
362 * packets have been flushed out and no packets for this TID
363 * will go into the driver during the ampdu_action call.
334 */ 364 */
335 synchronize_net(); 365 synchronize_net();
336 366
@@ -344,17 +374,15 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)
344 " tid %d\n", tid); 374 " tid %d\n", tid);
345#endif 375#endif
346 spin_lock_bh(&sta->lock); 376 spin_lock_bh(&sta->lock);
377 ieee80211_agg_splice_packets(local, tid_tx, tid);
347 ieee80211_assign_tid_tx(sta, tid, NULL); 378 ieee80211_assign_tid_tx(sta, tid, NULL);
379 ieee80211_agg_splice_finish(local, tid);
348 spin_unlock_bh(&sta->lock); 380 spin_unlock_bh(&sta->lock);
349 381
350 ieee80211_wake_queue_agg(local, tid);
351 kfree_rcu(tid_tx, rcu_head); 382 kfree_rcu(tid_tx, rcu_head);
352 return; 383 return;
353 } 384 }
354 385
355 /* we can take packets again now */
356 ieee80211_wake_queue_agg(local, tid);
357
358 /* activate the timer for the recipient's addBA response */ 386 /* activate the timer for the recipient's addBA response */
359 mod_timer(&tid_tx->addba_resp_timer, jiffies + ADDBA_RESP_INTERVAL); 387 mod_timer(&tid_tx->addba_resp_timer, jiffies + ADDBA_RESP_INTERVAL);
360#ifdef CONFIG_MAC80211_HT_DEBUG 388#ifdef CONFIG_MAC80211_HT_DEBUG
@@ -514,38 +542,6 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
514} 542}
515EXPORT_SYMBOL(ieee80211_start_tx_ba_session); 543EXPORT_SYMBOL(ieee80211_start_tx_ba_session);
516 544
517/*
518 * splice packets from the STA's pending to the local pending,
519 * requires a call to ieee80211_agg_splice_finish later
520 */
521static void __acquires(agg_queue)
522ieee80211_agg_splice_packets(struct ieee80211_local *local,
523 struct tid_ampdu_tx *tid_tx, u16 tid)
524{
525 int queue = ieee80211_ac_from_tid(tid);
526 unsigned long flags;
527
528 ieee80211_stop_queue_agg(local, tid);
529
530 if (WARN(!tid_tx, "TID %d gone but expected when splicing aggregates"
531 " from the pending queue\n", tid))
532 return;
533
534 if (!skb_queue_empty(&tid_tx->pending)) {
535 spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
536 /* copy over remaining packets */
537 skb_queue_splice_tail_init(&tid_tx->pending,
538 &local->pending[queue]);
539 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
540 }
541}
542
543static void __releases(agg_queue)
544ieee80211_agg_splice_finish(struct ieee80211_local *local, u16 tid)
545{
546 ieee80211_wake_queue_agg(local, tid);
547}
548
549static void ieee80211_agg_tx_operational(struct ieee80211_local *local, 545static void ieee80211_agg_tx_operational(struct ieee80211_local *local,
550 struct sta_info *sta, u16 tid) 546 struct sta_info *sta, u16 tid)
551{ 547{
diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c
index a1b7407ac2a4..1b5e63126cb3 100644
--- a/net/sched/sch_gred.c
+++ b/net/sched/sch_gred.c
@@ -386,7 +386,7 @@ static inline int gred_change_vq(struct Qdisc *sch, int dp,
386 struct gred_sched_data *q; 386 struct gred_sched_data *q;
387 387
388 if (table->tab[dp] == NULL) { 388 if (table->tab[dp] == NULL) {
389 table->tab[dp] = kzalloc(sizeof(*q), GFP_KERNEL); 389 table->tab[dp] = kzalloc(sizeof(*q), GFP_ATOMIC);
390 if (table->tab[dp] == NULL) 390 if (table->tab[dp] == NULL)
391 return -ENOMEM; 391 return -ENOMEM;
392 } 392 }