Merge "Re-enable bad block table."
diff --git a/arch/arm/mach-comcerto/board-optimus.c b/arch/arm/mach-comcerto/board-optimus.c
index 682e9b0..d5c49c5 100644
--- a/arch/arm/mach-comcerto/board-optimus.c
+++ b/arch/arm/mach-comcerto/board-optimus.c
@@ -18,6 +18,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include <linux/delay.h>
 #include <linux/sched.h>
 #include <linux/device.h>
 #include <linux/serial_8250.h>
@@ -110,6 +111,21 @@
 	__raw_writel(__raw_readl(COMCERTO_GPIO_OUTPUT_REG) | MOCA_RESET_GPIO_PIN, COMCERTO_GPIO_OUTPUT_REG);
 #endif
 
+#ifdef PCIE_ADDITIONAL_RESET_PIN
+	printk(KERN_WARNING "Pulsing GPIO_62 to reset PCIe");
+	writel((0x2 << 4) | (readl(COMCERTO_GPIO_MISC_PIN_SELECT) & ~(0x3 << 4)),
+			COMCERTO_GPIO_MISC_PIN_SELECT);
+	writel(readl(COMCERTO_GPIO_63_32_PIN_OUTPUT_EN) & ~(PCIE_ADDITIONAL_RESET_PIN),
+			COMCERTO_GPIO_63_32_PIN_OUTPUT_EN);
+	c2k_gpio_pin_stat.c2k_gpio_pins_32_63 |= PCIE_ADDITIONAL_RESET_PIN;
+	writel(readl(COMCERTO_GPIO_63_32_PIN_OUTPUT) & ~(PCIE_ADDITIONAL_RESET_PIN),
+			COMCERTO_GPIO_63_32_PIN_OUTPUT);
+	udelay(1000);
+	writel(readl(COMCERTO_GPIO_63_32_PIN_OUTPUT) | (PCIE_ADDITIONAL_RESET_PIN),
+			COMCERTO_GPIO_63_32_PIN_OUTPUT);
+	udelay(1000);
+#endif
+
 	// enable GPIO0 interrupt (for MoCA) as level triggered, active high.
 	__raw_writel(__raw_readl(COMCERTO_GPIO_INT_CFG_REG) | (0x3),
 			COMCERTO_GPIO_INT_CFG_REG);
@@ -478,7 +494,7 @@
 			  1 -> set bit 21 and 20 in COMCERTO_GPIO_IOCTRL_REG
 			  (software control, clock output)
 			  2 -> clear bit 21 in COMCERTO_GPIO_IOCTRL_REG (hardware control) */
-	.tdmmux = 0x1, /* TDM interface Muxing:0x0 - TDM block, 0x1 - ZDS block,
+	.tdmmux = 0x2, /* TDM interface Muxing:0x0 - TDM block, 0x1 - ZDS block,
 		0x2 - GPIO[63:60] signals and 0x3 - MSIF block is selected */
 #if 0
 	/* FIX ME - Need correct values for TDM_DR, TDM_DX, TDM_FS and TDM_CK */
diff --git a/arch/arm/mach-comcerto/include/mach/board-optimus.h b/arch/arm/mach-comcerto/include/mach/board-optimus.h
index 581114c..bf2d6cf 100644
--- a/arch/arm/mach-comcerto/include/mach/board-optimus.h
+++ b/arch/arm/mach-comcerto/include/mach/board-optimus.h
@@ -17,6 +17,7 @@
 
 	#define COMCERTO_EXPCLK		50000000	/* 50MHz */
 	#define MOCA_RESET_GPIO_PIN	GPIO_PIN_11
+	#define PCIE_ADDITIONAL_RESET_PIN	GPIO_PIN_62
 
 	/***********************************
 	 * GPIO
diff --git a/drivers/i2c/busses/i2c-comcerto.c b/drivers/i2c/busses/i2c-comcerto.c
index 4611ba8..0898123 100644
--- a/drivers/i2c/busses/i2c-comcerto.c
+++ b/drivers/i2c/busses/i2c-comcerto.c
@@ -45,7 +45,7 @@
 module_param(force_poll, bool, S_IRUGO);
 MODULE_PARM_DESC(force_poll, "Force polling mode: 0=interrupt mode, polling mode otherwise");
 
-static int speed = 1;
+static int speed = 0;
 module_param(speed, int, S_IRUGO);
 MODULE_PARM_DESC(speed, "I2C speed: 0=standard, 1=fast, 2=high speed");
 
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
index 3ae122f..d177c74 100644
--- a/net/bridge/br_fdb.c
+++ b/net/bridge/br_fdb.c
@@ -94,6 +94,21 @@
 
 static inline void fdb_delete(struct net_bridge_fdb_entry *f)
 {
+#if defined(CONFIG_COMCERTO_FP)
+	struct net_bridge_port *this_port = f->dst, *p;
+	struct net_bridge *br = this_port->br;
+
+	if (f->is_local) {
+		list_for_each_entry(p, &br->port_list, list) {
+			if (this_port == p)
+				continue;
+
+			dev_uc_del(this_port->dev, p->dev->dev_addr);
+			dev_uc_del(p->dev, f->addr.addr);
+		}
+	}
+#endif
+
 	fdb_notify(f, RTM_DELNEIGH);
 	hlist_del_rcu(&f->hlist);
 	call_rcu(&f->rcu, fdb_rcu_free);
@@ -378,6 +393,9 @@
 {
 	struct hlist_head *head = &br->hash[br_mac_hash(addr)];
 	struct net_bridge_fdb_entry *fdb;
+#if defined(CONFIG_COMCERTO_FP)
+	struct net_bridge_port *p;
+#endif
 
 	if (!is_valid_ether_addr(addr))
 		return -EINVAL;
@@ -399,6 +417,15 @@
 	if (!fdb)
 		return -ENOMEM;
 
+#if defined(CONFIG_COMCERTO_FP)
+	list_for_each_entry(p, &br->port_list, list) {
+		if (source == p)
+			continue;
+
+		dev_uc_add(source->dev, p->dev->dev_addr);
+		dev_uc_add(p->dev, addr);
+	}
+#endif
 	fdb->is_local = fdb->is_static = 1;
 	return 0;
 }