diff options
author | David S. Miller <davem@davemloft.net> | 2011-12-16 02:11:14 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-12-16 02:11:14 -0500 |
commit | b26e478f8fd5b575684f021b05a5c6236ebb911a (patch) | |
tree | 27d3b3eaf3fe10d05319ad3395b2569ad5f8f6d0 | |
parent | bcebcc468a6bcd3820fe9ad36b34220563efc93a (diff) | |
parent | bb3c36863e8001fc21a88bebfdead4da4c23e848 (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.c | 11 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fsl_pq_mdio.c | 13 | ||||
-rw-r--r-- | drivers/net/ppp/pptp.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192ce/phy.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/phy.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192de/phy.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192se/phy.c | 2 | ||||
-rw-r--r-- | drivers/ssb/driver_pcicore.c | 8 | ||||
-rw-r--r-- | net/batman-adv/translation-table.c | 24 | ||||
-rw-r--r-- | net/ipv4/ipip.c | 7 | ||||
-rw-r--r-- | net/ipv6/addrconf.c | 3 | ||||
-rw-r--r-- | net/ipv6/route.c | 2 | ||||
-rw-r--r-- | net/ipv6/sit.c | 7 | ||||
-rw-r--r-- | net/mac80211/agg-tx.c | 86 | ||||
-rw-r--r-- | net/sched/sch_gred.c | 2 |
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 | ||
518 | static void __devinit ssb_pcicore_init_clientmode(struct ssb_pcicore *pc) | 518 | static 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 | } |
677 | out: | 691 | out: |
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 | ||
682 | void tt_global_del_orig(struct bat_priv *bat_priv, | 698 | void 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) | |||
825 | static int __net_init ipip_init_net(struct net *net) | 826 | static 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 | ||
853 | err_reg_dev: | 858 | err_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 | |||
1207 | static int __net_init sit_init_net(struct net *net) | 1208 | static 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 | ||
1236 | err_reg_dev: | 1241 | err_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 | */ | ||
314 | static void __acquires(agg_queue) | ||
315 | ieee80211_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 | |||
336 | static void __releases(agg_queue) | ||
337 | ieee80211_agg_splice_finish(struct ieee80211_local *local, u16 tid) | ||
338 | { | ||
339 | ieee80211_wake_queue_agg(local, tid); | ||
340 | } | ||
341 | |||
310 | void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) | 342 | void 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 | } |
515 | EXPORT_SYMBOL(ieee80211_start_tx_ba_session); | 543 | EXPORT_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 | */ | ||
521 | static void __acquires(agg_queue) | ||
522 | ieee80211_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 | |||
543 | static void __releases(agg_queue) | ||
544 | ieee80211_agg_splice_finish(struct ieee80211_local *local, u16 tid) | ||
545 | { | ||
546 | ieee80211_wake_queue_agg(local, tid); | ||
547 | } | ||
548 | |||
549 | static void ieee80211_agg_tx_operational(struct ieee80211_local *local, | 545 | static 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 | } |