ramips: switch to 6.1 kernel
[openwrt/staging/stintel.git] / target / linux / ramips / files / drivers / net / ethernet / ralink / mtk_eth_soc.c
index f8301ad3ca7b2c7acada544831315cd9e6c90830..3748264dadf7719574b784c30de85ea76cc93448 100644 (file)
@@ -61,8 +61,6 @@
 #define NEXT_TX_DESP_IDX(X)    (((X) + 1) & (ring->tx_ring_size - 1))
 #define NEXT_RX_DESP_IDX(X)    (((X) + 1) & (ring->rx_ring_size - 1))
 
-#define SYSC_REG_RSTCTRL       0x34
-
 static int fe_msg_level = -1;
 module_param_named(msg_level, fe_msg_level, int, 0);
 MODULE_PARM_DESC(msg_level, "Message level (-1=defaults,0=none,...,16=all)");
@@ -127,18 +125,15 @@ void fe_m32(struct fe_priv *eth, u32 clear, u32 set, unsigned reg)
        spin_unlock(&eth->page_lock);
 }
 
-void fe_reset(u32 reset_bits)
+static void fe_reset_fe(struct fe_priv *priv)
 {
-       u32 t;
-
-       t = rt_sysc_r32(SYSC_REG_RSTCTRL);
-       t |= reset_bits;
-       rt_sysc_w32(t, SYSC_REG_RSTCTRL);
-       usleep_range(10, 20);
+       if (!priv->resets)
+               return;
 
-       t &= ~reset_bits;
-       rt_sysc_w32(t, SYSC_REG_RSTCTRL);
-       usleep_range(10, 20);
+       reset_control_assert(priv->resets);
+       usleep_range(60, 120);
+       reset_control_deassert(priv->resets);
+       usleep_range(1000, 1200);
 }
 
 static inline void fe_int_disable(u32 mask)
@@ -157,7 +152,7 @@ static inline void fe_int_enable(u32 mask)
        fe_reg_r32(FE_REG_FE_INT_ENABLE);
 }
 
-static inline void fe_hw_set_macaddr(struct fe_priv *priv, unsigned char *mac)
+static inline void fe_hw_set_macaddr(struct fe_priv *priv, const unsigned char *mac)
 {
        unsigned long flags;
 
@@ -1085,7 +1080,7 @@ poll_again:
        return rx_done;
 }
 
-static void fe_tx_timeout(struct net_device *dev)
+static void fe_tx_timeout(struct net_device *dev, unsigned int txqueue)
 {
        struct fe_priv *priv = netdev_priv(dev);
        struct fe_tx_ring *ring = &priv->tx_ring;
@@ -1353,25 +1348,25 @@ static int __init fe_init(struct net_device *dev)
 {
        struct fe_priv *priv = netdev_priv(dev);
        struct device_node *port;
-       const char *mac_addr;
        int err;
 
-       priv->soc->reset_fe();
+       fe_reset_fe(priv);
+
+       if (priv->soc->switch_init) {
+               err = priv->soc->switch_init(priv);
+               if (err) {
+                       if (err == -EPROBE_DEFER)
+                               return err;
 
-       if (priv->soc->switch_init)
-               if (priv->soc->switch_init(priv)) {
                        netdev_err(dev, "failed to initialize switch core\n");
                        return -ENODEV;
                }
+       }
 
        fe_reset_phy(priv);
 
-       mac_addr = of_get_mac_address(priv->dev->of_node);
-       if (!IS_ERR_OR_NULL(mac_addr))
-               ether_addr_copy(dev->dev_addr, mac_addr);
-
-       /* If the mac address is invalid, use random mac address  */
-       if (!is_valid_ether_addr(dev->dev_addr)) {
+       /* Set the MAC address if it is correct, if not use a random MAC address  */
+       if (of_get_ethdev_address(priv->dev->of_node, dev)) {
                eth_hw_addr_random(dev);
                dev_err(priv->dev, "generated random MAC address %pM\n",
                        dev->dev_addr);
@@ -1541,7 +1536,9 @@ static int fe_probe(struct platform_device *pdev)
        struct clk *sysclk;
        int err, napi_weight;
 
-       device_reset(&pdev->dev);
+       err = device_reset(&pdev->dev);
+       if (err)
+               dev_err(&pdev->dev, "failed to reset device\n");
 
        match = of_match_device(of_fe_match, &pdev->dev);
        soc = (struct fe_soc_data *)match->data;
@@ -1575,6 +1572,14 @@ static int fe_probe(struct platform_device *pdev)
                goto err_free_dev;
        }
 
+       priv = netdev_priv(netdev);
+       spin_lock_init(&priv->page_lock);
+       priv->resets = devm_reset_control_array_get_exclusive(&pdev->dev);
+       if (IS_ERR(priv->resets)) {
+               dev_err(&pdev->dev, "Failed to get resets for FE and ESW cores: %pe\n", priv->resets);
+               priv->resets = NULL;
+       }
+
        if (soc->init_data)
                soc->init_data(soc, netdev);
        netdev->vlan_features = netdev->hw_features &
@@ -1589,8 +1594,6 @@ static int fe_probe(struct platform_device *pdev)
        if (fe_reg_table[FE_REG_FE_DMA_VID_BASE])
                netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
 
-       priv = netdev_priv(netdev);
-       spin_lock_init(&priv->page_lock);
        if (fe_reg_table[FE_REG_FE_COUNTER_BASE]) {
                priv->hw_stats = kzalloc(sizeof(*priv->hw_stats), GFP_KERNEL);
                if (!priv->hw_stats) {
@@ -1598,6 +1601,7 @@ static int fe_probe(struct platform_device *pdev)
                        goto err_free_dev;
                }
                spin_lock_init(&priv->hw_stats->stats_lock);
+               u64_stats_init(&priv->hw_stats->syncp);
        }
 
        sysclk = devm_clk_get(&pdev->dev, NULL);
@@ -1625,7 +1629,6 @@ static int fe_probe(struct platform_device *pdev)
        priv->tx_ring.tx_ring_size = NUM_DMA_DESC;
        priv->rx_ring.rx_ring_size = NUM_DMA_DESC;
        INIT_WORK(&priv->pending_work, fe_pending_work);
-       u64_stats_init(&priv->hw_stats->syncp);
 
        napi_weight = 16;
        if (priv->flags & FE_FLAG_NAPI_WEIGHT) {
@@ -1633,7 +1636,7 @@ static int fe_probe(struct platform_device *pdev)
                priv->tx_ring.tx_ring_size *= 4;
                priv->rx_ring.rx_ring_size *= 4;
        }
-       netif_napi_add(netdev, &priv->rx_napi, fe_poll, napi_weight);
+       netif_napi_add_weight(netdev, &priv->rx_napi, fe_poll, napi_weight);
        fe_set_ethtool_ops(netdev);
 
        err = register_netdev(netdev);