DECLARE_GLOBAL_DATA_PTR;
 
+/*
+ * BOCO FPGA definitions
+ */
+#define BOCO           0x10
+#define REG_CTRL_H             0x02
+#define MASK_WRL_UNITRUN       0x01
+#define MASK_RBX_PGY_PRESENT   0x40
+#define REG_IRQ_CIRQ2          0x2d
+#define MASK_RBI_DEFECT_16     0x01
+
 /* Multi-Purpose Pins Functionality configuration */
 u32 kwmpp_config[] = {
        MPP0_NF_IO2,
        0
 };
 
+#if defined(CONFIG_MGCOGE3UN)
+/*
+ * Wait for startup OK from mgcoge3ne
+ */
+int startup_allowed(void)
+{
+       unsigned char buf;
+
+       /*
+        * Read CIRQ16 bit (bit 0)
+        */
+       if (i2c_read(BOCO, REG_IRQ_CIRQ2, 1, &buf, 1) != 0)
+               printf("%s: Error reading Boco\n", __func__);
+       else
+               if ((buf & MASK_RBI_DEFECT_16) == MASK_RBI_DEFECT_16)
+                       return 1;
+       return 0;
+}
+
+/*
+ * mgcoge3un has always ethernet present. Its connected to the 6061 switch
+ * and provides ICNev and piggy4 connections.
+ */
+int ethernet_present(void)
+{
+       return 1;
+}
+#else
 int ethernet_present(void)
 {
        uchar   buf;
        int     ret = 0;
 
-       if (i2c_read(0x10, 2, 1, &buf, 1) != 0) {
+       if (i2c_read(BOCO, REG_CTRL_H, 1, &buf, 1) != 0) {
                printf("%s: Error reading Boco\n", __func__);
                return -1;
        }
-       if ((buf & 0x40) == 0x40)
+       if ((buf & MASK_RBX_PGY_PRESENT) == MASK_RBX_PGY_PRESENT)
                ret = 1;
 
        return ret;
 }
+#endif
 
 int initialize_unit_leds(void)
 {
        /*
-        * init the unit LEDs
-        * per default they all are
+        * Init the unit LEDs per default they all are
         * ok apart from bootstat
-        * LED connected through BOCO
-        * BOCO lies at the address  0x10
-        * LEDs are in the block CTRL_H (addr 0x02)
-        * BOOTSTAT LED is the first 0x01
         */
-       #define BOCO        0x10
-       #define CTRL_H      0x02
-       #define APPLEDMASK  0x01
        uchar buf;
 
-       if (i2c_read(BOCO, CTRL_H, 1, &buf, 1) != 0) {
+       if (i2c_read(BOCO, REG_CTRL_H, 1, &buf, 1) != 0) {
                printf("%s: Error reading Boco\n", __func__);
                return -1;
        }
-       buf |= APPLEDMASK;
-       if (i2c_write(BOCO, CTRL_H, 1, &buf, 1) != 0) {
+       buf |= MASK_WRL_UNITRUN;
+       if (i2c_write(BOCO, REG_CTRL_H, 1, &buf, 1) != 0) {
                printf("%s: Error writing Boco\n", __func__);
                return -1;
        }
                printf("Overwriting MACH_TYPE with %d!!!\n", mach_type);
                gd->bd->bi_arch_number = mach_type;
        }
+#if defined(CONFIG_MGCOGE3UN)
+       char *wait_for_ne;
+       wait_for_ne = getenv("waitforne");
+       if (wait_for_ne != NULL) {
+               if (strcmp(wait_for_ne, "true") == 0) {
+                       int cnt = 0;
+                       puts("NE go: ");
+                       while (startup_allowed() == 0) {
+                               udelay(200000);
+                               cnt++;
+                               if (cnt == 5)
+                                       puts("wait\b\b\b\b");
+                               if (cnt == 10) {
+                                       cnt = 0;
+                                       puts("    \b\b\b\b");
+                               }
+                       }
+                       puts("OK\n");
+               }
+       }
+#endif
 
        initialize_unit_leds();
        set_km_env();
 
 /* we use a new RAM type on mgcoge3un board */
 #define CONFIG_SYS_KWD_CONFIG $(SRCTREE)/$(CONFIG_BOARDDIR)/kwbimage-memphis.cfg
 
+/*
+ * mgcoge3un has a fixed link to the marvell switch
+ * with 100MB full duplex and autoneg off, for this
+ * reason we have to change the default settings
+ */
+#define PORT_SERIAL_CONTROL_VALUE              ( \
+       MVGBE_FORCE_LINK_PASS                   | \
+       MVGBE_DIS_AUTO_NEG_FOR_DUPLX            | \
+       MVGBE_DIS_AUTO_NEG_FOR_FLOW_CTRL        | \
+       MVGBE_ADV_NO_FLOW_CTRL                  | \
+       MVGBE_FORCE_FC_MODE_NO_PAUSE_DIS_TX     | \
+       MVGBE_FORCE_BP_MODE_NO_JAM              | \
+       (1 << 9) /* Reserved bit has to be 1 */ | \
+       MVGBE_DO_NOT_FORCE_LINK_FAIL            | \
+       MVGBE_DIS_AUTO_NEG_SPEED_GMII           | \
+       MVGBE_DTE_ADV_0                         | \
+       MVGBE_MIIPHY_MAC_MODE                   | \
+       MVGBE_AUTO_NEG_NO_CHANGE                | \
+       MVGBE_MAX_RX_PACKET_1552BYTE            | \
+       MVGBE_CLR_EXT_LOOPBACK                  | \
+       MVGBE_SET_FULL_DUPLEX_MODE              | \
+       MVGBE_DIS_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX        |\
+       MVGBE_SET_GMII_SPEED_TO_10_100  |\
+       MVGBE_SET_MII_SPEED_TO_100)
+
 #endif /* _CONFIG_MGCOGE3UN_H */