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;
}