|
|
@@ -22,6 +22,7 @@
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/skbuff.h>
|
|
|
#include <linux/etherdevice.h>
|
|
|
+#include <linux/ethtool.h>
|
|
|
#include <linux/platform_device.h>
|
|
|
|
|
|
#include <ramips_eth_platform.h>
|
|
|
@@ -77,6 +78,47 @@ ramips_hw_set_macaddr(unsigned char *mac)
|
|
|
RAMIPS_GDMA1_MAC_ADRL);
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_RALINK_RT288X
|
|
|
+static void
|
|
|
+ramips_setup_mdio_cfg(struct raeth_priv *re)
|
|
|
+{
|
|
|
+ unsigned int mdio_cfg;
|
|
|
+
|
|
|
+ mdio_cfg = RAMIPS_MDIO_CFG_TX_CLK_SKEW_200 |
|
|
|
+ RAMIPS_MDIO_CFG_TX_CLK_SKEW_200 |
|
|
|
+ RAMIPS_MDIO_CFG_GP1_FRC_EN;
|
|
|
+
|
|
|
+ if (re->duplex == DUPLEX_FULL)
|
|
|
+ mdio_cfg |= RAMIPS_MDIO_CFG_GP1_DUPLEX;
|
|
|
+
|
|
|
+ if (re->tx_fc)
|
|
|
+ mdio_cfg |= RAMIPS_MDIO_CFG_GP1_FC_TX;
|
|
|
+
|
|
|
+ if (re->rx_fc)
|
|
|
+ mdio_cfg |= RAMIPS_MDIO_CFG_GP1_FC_RX;
|
|
|
+
|
|
|
+ switch (re->speed) {
|
|
|
+ case SPEED_10:
|
|
|
+ mdio_cfg |= RAMIPS_MDIO_CFG_GP1_SPEED_10;
|
|
|
+ break;
|
|
|
+ case SPEED_100:
|
|
|
+ mdio_cfg |= RAMIPS_MDIO_CFG_GP1_SPEED_100;
|
|
|
+ break;
|
|
|
+ case SPEED_1000:
|
|
|
+ mdio_cfg |= RAMIPS_MDIO_CFG_GP1_SPEED_1000;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ BUG();
|
|
|
+ }
|
|
|
+
|
|
|
+ ramips_fe_wr(mdio_cfg, RAMIPS_MDIO_CFG);
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void ramips_setup_mdio_cfg(struct raeth_priv *re)
|
|
|
+{
|
|
|
+}
|
|
|
+#endif /* CONFIG_RALINK_RT288X */
|
|
|
+
|
|
|
static void
|
|
|
ramips_cleanup_dma(struct raeth_priv *re)
|
|
|
{
|
|
|
@@ -334,6 +376,8 @@ ramips_eth_open(struct net_device *dev)
|
|
|
(unsigned long)dev);
|
|
|
tasklet_init(&priv->rx_tasklet, ramips_eth_rx_hw, (unsigned long)dev);
|
|
|
|
|
|
+ ramips_setup_mdio_cfg(priv);
|
|
|
+
|
|
|
ramips_fe_wr(RAMIPS_DELAY_INIT, RAMIPS_DLY_INT_CFG);
|
|
|
ramips_fe_wr(RAMIPS_TX_DLY_INT | RAMIPS_RX_DLY_INT, RAMIPS_FE_INT_ENABLE);
|
|
|
ramips_fe_wr(ramips_fe_rr(RAMIPS_GDMA1_FWD_CFG) &
|
|
|
@@ -442,6 +486,11 @@ ramips_eth_plat_probe(struct platform_device *plat)
|
|
|
ramips_dev->netdev_ops = &ramips_eth_netdev_ops;
|
|
|
|
|
|
priv = netdev_priv(ramips_dev);
|
|
|
+
|
|
|
+ priv->speed = data->speed;
|
|
|
+ priv->duplex = data->duplex;
|
|
|
+ priv->rx_fc = data->rx_fc;
|
|
|
+ priv->tx_fc = data->tx_fc;
|
|
|
priv->plat = data;
|
|
|
|
|
|
err = register_netdev(ramips_dev);
|