void __iomem *base;
        struct gemini_ethernet_port *port0;
        struct gemini_ethernet_port *port1;
+       bool initialized;
 
        spinlock_t      irq_lock; /* Locks IRQ-related registers */
        unsigned int    freeq_order;
 
 static void gemini_ethernet_init(struct gemini_ethernet *geth)
 {
+       /* Only do this once both ports are online */
+       if (geth->initialized)
+               return;
+       if (geth->port0 && geth->port1)
+               geth->initialized = true;
+       else
+               return;
+
        writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG);
        writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG);
        writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_2_REG);
                geth->port0 = port;
        else
                geth->port1 = port;
+
+       /* This will just be done once both ports are up and reset */
+       gemini_ethernet_init(geth);
+
        platform_set_drvdata(pdev, port);
 
        /* Set up and register the netdev */
 
        spin_lock_init(&geth->irq_lock);
        spin_lock_init(&geth->freeq_lock);
-       gemini_ethernet_init(geth);
 
        /* The children will use this */
        platform_set_drvdata(pdev, geth);
 {
        struct gemini_ethernet *geth = platform_get_drvdata(pdev);
 
-       gemini_ethernet_init(geth);
        geth_cleanup_freeq(geth);
+       geth->initialized = false;
 
        return 0;
 }