|
@@ -21,6 +21,7 @@
|
|
|
#include <linux/io.h>
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/of_mdio.h>
|
|
|
+#include <linux/of_net.h>
|
|
|
#include <linux/of_address.h>
|
|
|
#include <linux/if_vlan.h>
|
|
|
#include <linux/ptp_classify.h>
|
|
@@ -707,6 +708,7 @@ struct gbe_slave {
|
|
|
u32 link_interface;
|
|
|
u32 mac_control;
|
|
|
u8 phy_port_t;
|
|
|
+ struct device_node *node;
|
|
|
struct device_node *phy_node;
|
|
|
struct ts_ctl ts_ctl;
|
|
|
struct list_head slave_list;
|
|
@@ -2322,6 +2324,21 @@ static int gbe_slave_open(struct gbe_intf *gbe_intf)
|
|
|
has_phy = true;
|
|
|
phy_mode = PHY_INTERFACE_MODE_SGMII;
|
|
|
slave->phy_port_t = PORT_MII;
|
|
|
+ } else if (slave->link_interface == RGMII_LINK_MAC_PHY) {
|
|
|
+ has_phy = true;
|
|
|
+ phy_mode = of_get_phy_mode(slave->node);
|
|
|
+ /* if phy-mode is not present, default to
|
|
|
+ * PHY_INTERFACE_MODE_RGMII
|
|
|
+ */
|
|
|
+ if (phy_mode < 0)
|
|
|
+ phy_mode = PHY_INTERFACE_MODE_RGMII;
|
|
|
+
|
|
|
+ if (!phy_interface_mode_is_rgmii(phy_mode)) {
|
|
|
+ dev_err(priv->dev,
|
|
|
+ "Unsupported phy mode %d\n", phy_mode);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ slave->phy_port_t = PORT_MII;
|
|
|
} else if (slave->link_interface == XGMII_LINK_MAC_PHY) {
|
|
|
has_phy = true;
|
|
|
phy_mode = PHY_INTERFACE_MODE_NA;
|
|
@@ -2947,6 +2964,7 @@ static int init_slave(struct gbe_priv *gbe_dev, struct gbe_slave *slave,
|
|
|
slave->link_interface = SGMII_LINK_MAC_PHY;
|
|
|
}
|
|
|
|
|
|
+ slave->node = node;
|
|
|
slave->open = false;
|
|
|
if ((slave->link_interface == SGMII_LINK_MAC_PHY) ||
|
|
|
(slave->link_interface == RGMII_LINK_MAC_PHY) ||
|