I ran into the same problems. I hacked up a patch to 3.8.8 from this patch:
http://permalink.gmane.org/gmane.linux.network/267097
and the ifdown/ifup issue went away for me.
Here is my git diff for those who want to give it a try:
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index 21ba53e…67c7f74 100644
— a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -342,6 +342,7 @@ struct cpsw_priv {
/* snapshot of IRQ numbers */
u32 irqs_table[4];
u32 num_irqs;
- bool irq_enabled;
struct cpts cpts;
};
@@ -458,7 +459,10 @@ static irqreturn_t cpsw_interrupt(int irq, void *dev_id)
if (likely(netif_running(priv->ndev))) {
cpsw_intr_disable(priv);
- cpsw_disable_irq(priv);
- if (priv->irq_enabled == true) {
- cpsw_disable_irq(priv);
- priv->irq_enabled = false;
- }
napi_schedule(&priv->napi);
}
@@ -512,7 +516,11 @@ static int cpsw_poll(struct napi_struct *napi, int budget)
if ((num_total_rx + num_total_tx) < budget) {
napi_complete(napi);
cpsw_intr_enable(priv);
- cpsw_enable_irq(priv);
- if (priv->irq_enabled == false) {
- cpsw_enable_irq(priv);
- priv->irq_enabled = true;
- }