Merge "Add per queue drop count to rx_over_errors."
diff --git a/arch/mips/brcmstb/bchip.c b/arch/mips/brcmstb/bchip.c
index 80856c3..f5a1173 100644
--- a/arch/mips/brcmstb/bchip.c
+++ b/arch/mips/brcmstb/bchip.c
@@ -421,6 +421,13 @@
 #if defined(CONFIG_BRCM_HAS_1GB_MEMC1)
 	/* enable access to SCB1 */
 	BDEV_SET(USB_REG(base, SETUP), BIT(14));
+
+#if defined(CONFIG_BCM7425B0) || defined(CONFIG_BCM7435A0) || \
+	defined(CONFIG_BCM7435B0)
+	/* SWLINUX-2259 - Work around a USB DMA to memc1 arbitration bug */
+	BDEV_SET(USB_REG(base, SETUP), BIT(13));
+#endif
+
 #endif
 
 #if defined(BCHP_USB_CTRL_GENERIC_CTL_1_PLL_SUSPEND_EN_MASK)
diff --git a/arch/mips/brcmstb/setup.c b/arch/mips/brcmstb/setup.c
index f7d4276..de5f14c 100644
--- a/arch/mips/brcmstb/setup.c
+++ b/arch/mips/brcmstb/setup.c
@@ -319,6 +319,16 @@
 	pdev->dev.dma_mask = (u64 *)&usb_dmamask;
 	pdev->dev.coherent_dma_mask = 0xffffffff;
 
+#if defined(CONFIG_BCM7425B0) || defined(CONFIG_BCM7435A0) || \
+	defined(CONFIG_BCM7435B0)
+	/* SWLINUX-2259: Prevent OHCI from doing DMA to memc1 */
+	if (type == CAP_TYPE_OHCI) {
+		static const u64 lowmem_dma_mask = DMA_BIT_MASK(31);
+		pdev->dev.dma_mask = (u64 *)&lowmem_dma_mask;
+		pdev->dev.coherent_dma_mask = (u32)lowmem_dma_mask;
+	}
+#endif
+
 	platform_device_add(pdev);
 }
 
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index ab3cf80..102e1e4 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -33,6 +33,8 @@
 
 #include "br_private.h"
 
+static void br_multicast_start_querier(struct net_bridge *br);
+
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 static inline int ipv6_is_local_multicast(const struct in6_addr *addr)
 {
@@ -799,6 +801,21 @@
 {
 }
 
+static void br_multicast_querier_expired(unsigned long data)
+{
+	struct net_bridge_port *port = (void *)data;
+	struct net_bridge *br = port->br;
+
+	spin_lock(&br->multicast_lock);
+	if (!netif_running(br->dev) || br->multicast_disabled)
+		goto out;
+
+	br_multicast_start_querier(br);
+
+out:
+	spin_unlock(&br->multicast_lock);
+}
+
 static void __br_multicast_send_query(struct net_bridge *br,
 				      struct net_bridge_port *port,
 				      struct br_ip *ip)
@@ -1163,7 +1180,7 @@
 		if (timer_pending(&p->timer) ?
 		    time_after(p->timer.expires, now + max_delay) :
 		    try_to_del_timer_sync(&p->timer) >= 0)
-			mod_timer(&mp->timer, now + max_delay);
+			mod_timer(&p->timer, now + max_delay);
 	}
 
 out:
@@ -1231,7 +1248,7 @@
 		if (timer_pending(&p->timer) ?
 		    time_after(p->timer.expires, now + max_delay) :
 		    try_to_del_timer_sync(&p->timer) >= 0)
-			mod_timer(&mp->timer, now + max_delay);
+			mod_timer(&p->timer, now + max_delay);
 	}
 
 out:
@@ -1610,7 +1627,7 @@
 	setup_timer(&br->multicast_router_timer,
 		    br_multicast_local_router_expired, 0);
 	setup_timer(&br->multicast_querier_timer,
-		    br_multicast_local_router_expired, 0);
+		    br_multicast_querier_expired, 0);
 	setup_timer(&br->multicast_query_timer, br_multicast_query_expired,
 		    (unsigned long)br);
 }
@@ -1738,9 +1755,23 @@
 	return err;
 }
 
-int br_multicast_toggle(struct net_bridge *br, unsigned long val)
+static void br_multicast_start_querier(struct net_bridge *br)
 {
 	struct net_bridge_port *port;
+
+	br_multicast_open(br);
+
+	list_for_each_entry(port, &br->port_list, list) {
+		if (port->state == BR_STATE_DISABLED ||
+		    port->state == BR_STATE_BLOCKING)
+			continue;
+
+		__br_multicast_enable_port(port);
+	}
+}
+
+int br_multicast_toggle(struct net_bridge *br, unsigned long val)
+{
 	int err = 0;
 
 	spin_lock(&br->multicast_lock);
@@ -1768,14 +1799,7 @@
 			goto rollback;
 	}
 
-	br_multicast_open(br);
-	list_for_each_entry(port, &br->port_list, list) {
-		if (port->state == BR_STATE_DISABLED ||
-		    port->state == BR_STATE_BLOCKING)
-			continue;
-
-		__br_multicast_enable_port(port);
-	}
+	br_multicast_start_querier(br);
 
 unlock:
 	spin_unlock(&br->multicast_lock);