]> git.sur5r.net Git - u-boot/blobdiff - drivers/net/fm/init.c
blackfin: convert makefiles to Kbuild style
[u-boot] / drivers / net / fm / init.c
index 14fa2ce59cf6d77595e6d458362239a56e9e236b..35edd7ad94017ff7cb0f69064d76d0e8ca560da7 100644 (file)
@@ -145,6 +145,14 @@ void fm_disable_port(enum fm_port port)
        fman_disable_port(port);
 }
 
+void fm_enable_port(enum fm_port port)
+{
+       int i = fm_port_to_index(port);
+
+       fm_info[i].enabled = 1;
+       fman_enable_port(port);
+}
+
 void fm_info_set_mdio(enum fm_port port, struct mii_dev *bus)
 {
        int i = fm_port_to_index(port);
@@ -274,3 +282,47 @@ void fdt_fixup_fman_ethernet(void *blob)
        }
 #endif
 }
+
+/*QSGMII Riser Card can work in SGMII mode, but the PHY address is different.
+ *This function scans which Riser Card being used(QSGMII or SGMII Riser Card),
+ *then set the correct PHY address
+ */
+void set_sgmii_phy(struct mii_dev *bus, enum fm_port base_port,
+               unsigned int port_num, int phy_base_addr)
+{
+       unsigned int regnum = 0;
+       int qsgmii;
+       int i;
+       int phy_real_addr;
+
+       qsgmii = is_qsgmii_riser_card(bus, phy_base_addr, port_num, regnum);
+
+       if (!qsgmii)
+               return;
+
+       for (i = base_port; i < base_port + port_num; i++) {
+               if (fm_info_get_enet_if(i) == PHY_INTERFACE_MODE_SGMII) {
+                       phy_real_addr = phy_base_addr + i - base_port;
+                       fm_info_set_phy_address(i, phy_real_addr);
+               }
+       }
+}
+
+/*to check whether qsgmii riser card is used*/
+int is_qsgmii_riser_card(struct mii_dev *bus, int phy_base_addr,
+               unsigned int port_num, unsigned regnum)
+{
+       int i;
+       int val;
+
+       if (!bus)
+               return 0;
+
+       for (i = phy_base_addr; i < phy_base_addr + port_num; i++) {
+               val = bus->read(bus, i, MDIO_DEVAD_NONE, regnum);
+               if (val != MIIM_TIMEOUT)
+                       return 1;
+       }
+
+       return 0;
+}