#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)");
spin_unlock(ð->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)
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;
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;
{
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);
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;
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 &
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) {
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);
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) {
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);