From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jose Abreu Subject: [PATCH net-next] net: stmmac: Populate missing callbacks in HWIF initialization Date: Thu, 17 May 2018 10:57:28 +0100 Message-ID: Cc: Jose Abreu , Corentin Labbe , "David S. Miller" , Joao Pinto , Giuseppe Cavallaro , Alexandre Torgue To: netdev@vger.kernel.org Return-path: Received: from smtprelay6.synopsys.com ([198.182.37.59]:51918 "EHLO smtprelay.synopsys.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750826AbeEQJ5s (ORCPT ); Thu, 17 May 2018 05:57:48 -0400 Received: from mailhost.synopsys.com (mailhost1.synopsys.com [10.12.238.239]) by smtprelay.synopsys.com (Postfix) with ESMTP id 15DC01E0490 for ; Thu, 17 May 2018 11:57:47 +0200 (CEST) Sender: netdev-owner@vger.kernel.org List-ID: Some HW specific setusp, like sun8i, do not populate all the necessary callbacks, which is what HWIF helpers were expecting. Fix this by always trying to get the generic helpers and populate them if they were not previously populated by HW specific setup. Signed-off-by: Jose Abreu Fixes: 5f0456b43140 ("net: stmmac: Implement logic to automatically select HW Interface") Reported-by: Corentin Labbe Cc: Corentin Labbe Cc: David S. Miller Cc: Joao Pinto Cc: Giuseppe Cavallaro Cc: Alexandre Torgue --- Hi Corentin, Please check if this patch makes sun8i work again. Thanks and Best Regards, Jose Miguel Abreu --- drivers/net/ethernet/stmicro/stmmac/hwif.c | 38 ++++++++++++++++----------- 1 files changed, 22 insertions(+), 16 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.c b/drivers/net/ethernet/stmicro/stmmac/hwif.c index 9acc8d2..bf87571 100644 --- a/drivers/net/ethernet/stmicro/stmmac/hwif.c +++ b/drivers/net/ethernet/stmicro/stmmac/hwif.c @@ -163,13 +163,16 @@ int stmmac_hwif_init(struct stmmac_priv *priv) bool needs_gmac = priv->plat->has_gmac; const struct stmmac_hwif_entry *entry; struct mac_device_info *mac; + bool needs_setup = true; int i, ret; u32 id; if (needs_gmac) { id = stmmac_get_id(priv, GMAC_VERSION); - } else { + } else if (needs_gmac4) { id = stmmac_get_id(priv, GMAC4_VERSION); + } else { + id = 0; } /* Save ID for later use */ @@ -177,13 +180,12 @@ int stmmac_hwif_init(struct stmmac_priv *priv) /* Check for HW specific setup first */ if (priv->plat->setup) { - priv->hw = priv->plat->setup(priv); - if (!priv->hw) - return -ENOMEM; - return 0; + mac = priv->plat->setup(priv); + needs_setup = false; + } else { + mac = devm_kzalloc(priv->device, sizeof(*mac), GFP_KERNEL); } - mac = devm_kzalloc(priv->device, sizeof(*mac), GFP_KERNEL); if (!mac) return -ENOMEM; @@ -195,22 +197,26 @@ int stmmac_hwif_init(struct stmmac_priv *priv) continue; if (needs_gmac4 ^ entry->gmac4) continue; - if (id < entry->min_id) + /* Use synopsys_id var because some setups can override this */ + if (priv->synopsys_id < entry->min_id) continue; - mac->desc = entry->desc; - mac->dma = entry->dma; - mac->mac = entry->mac; - mac->ptp = entry->hwtimestamp; - mac->mode = entry->mode; - mac->tc = entry->tc; + /* Only use generic HW helpers if needed */ + mac->desc = mac->desc ? : entry->desc; + mac->dma = mac->dma ? : entry->dma; + mac->mac = mac->mac ? : entry->mac; + mac->ptp = mac->ptp ? : entry->hwtimestamp; + mac->mode = mac->mode ? : entry->mode; + mac->tc = mac->tc ? : entry->tc; priv->hw = mac; /* Entry found */ - ret = entry->setup(priv); - if (ret) - return ret; + if (needs_setup) { + ret = entry->setup(priv); + if (ret) + return ret; + } /* Run quirks, if needed */ if (entry->quirks) { -- 1.7.1