Re: [PATCH net 2/2] net: stmmac: move fixed-link support fixup code

From: kernel test robot
Date: Mon Mar 13 2023 - 07:49:13 EST


Hi Michael,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on net/master]

url: https://github.com/intel-lab-lkp/linux/commits/Michael-Sit-Wei-Hong/net-stmmac-fix-PHY-handle-parsing/20230313-160802
patch link: https://lore.kernel.org/r/20230313080135.2952774-3-michael.wei.hong.sit%40intel.com
patch subject: [PATCH net 2/2] net: stmmac: move fixed-link support fixup code
config: x86_64-randconfig-a013-20230313 (https://download.01.org/0day-ci/archive/20230313/202303131924.MkBmpkFK-lkp@xxxxxxxxx/config)
compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/e1abd092fb1e75931e37147152b274e0d3e6e655
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Michael-Sit-Wei-Hong/net-stmmac-fix-PHY-handle-parsing/20230313-160802
git checkout e1abd092fb1e75931e37147152b274e0d3e6e655
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 olddefconfig
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/net/ethernet/stmicro/stmmac/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Link: https://lore.kernel.org/oe-kbuild-all/202303131924.MkBmpkFK-lkp@xxxxxxxxx/

All warnings (new ones prefixed by >>):

>> drivers/net/ethernet/stmicro/stmmac/stmmac_main.c:7311:7: warning: variable 'fwnode' is uninitialized when used here [-Wuninitialized]
if (!fwnode)
^~~~~~
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c:7067:30: note: initialize the variable 'fwnode' to silence this warning
struct fwnode_handle *fwnode;
^
= NULL
1 warning generated.


vim +/fwnode +7311 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

7051
7052 /**
7053 * stmmac_dvr_probe
7054 * @device: device pointer
7055 * @plat_dat: platform data pointer
7056 * @res: stmmac resource pointer
7057 * Description: this is the main probe function used to
7058 * call the alloc_etherdev, allocate the priv structure.
7059 * Return:
7060 * returns 0 on success, otherwise errno.
7061 */
7062 int stmmac_dvr_probe(struct device *device,
7063 struct plat_stmmacenet_data *plat_dat,
7064 struct stmmac_resources *res)
7065 {
7066 struct net_device *ndev = NULL;
7067 struct fwnode_handle *fwnode;
7068 struct stmmac_priv *priv;
7069 u32 rxq;
7070 int i, ret = 0;
7071
7072 ndev = devm_alloc_etherdev_mqs(device, sizeof(struct stmmac_priv),
7073 MTL_MAX_TX_QUEUES, MTL_MAX_RX_QUEUES);
7074 if (!ndev)
7075 return -ENOMEM;
7076
7077 SET_NETDEV_DEV(ndev, device);
7078
7079 priv = netdev_priv(ndev);
7080 priv->device = device;
7081 priv->dev = ndev;
7082
7083 stmmac_set_ethtool_ops(ndev);
7084 priv->pause = pause;
7085 priv->plat = plat_dat;
7086 priv->ioaddr = res->addr;
7087 priv->dev->base_addr = (unsigned long)res->addr;
7088 priv->plat->dma_cfg->multi_msi_en = priv->plat->multi_msi_en;
7089
7090 priv->dev->irq = res->irq;
7091 priv->wol_irq = res->wol_irq;
7092 priv->lpi_irq = res->lpi_irq;
7093 priv->sfty_ce_irq = res->sfty_ce_irq;
7094 priv->sfty_ue_irq = res->sfty_ue_irq;
7095 for (i = 0; i < MTL_MAX_RX_QUEUES; i++)
7096 priv->rx_irq[i] = res->rx_irq[i];
7097 for (i = 0; i < MTL_MAX_TX_QUEUES; i++)
7098 priv->tx_irq[i] = res->tx_irq[i];
7099
7100 if (!is_zero_ether_addr(res->mac))
7101 eth_hw_addr_set(priv->dev, res->mac);
7102
7103 dev_set_drvdata(device, priv->dev);
7104
7105 /* Verify driver arguments */
7106 stmmac_verify_args();
7107
7108 priv->af_xdp_zc_qps = bitmap_zalloc(MTL_MAX_TX_QUEUES, GFP_KERNEL);
7109 if (!priv->af_xdp_zc_qps)
7110 return -ENOMEM;
7111
7112 /* Allocate workqueue */
7113 priv->wq = create_singlethread_workqueue("stmmac_wq");
7114 if (!priv->wq) {
7115 dev_err(priv->device, "failed to create workqueue\n");
7116 ret = -ENOMEM;
7117 goto error_wq_init;
7118 }
7119
7120 INIT_WORK(&priv->service_task, stmmac_service_task);
7121
7122 /* Initialize Link Partner FPE workqueue */
7123 INIT_WORK(&priv->fpe_task, stmmac_fpe_lp_task);
7124
7125 /* Override with kernel parameters if supplied XXX CRS XXX
7126 * this needs to have multiple instances
7127 */
7128 if ((phyaddr >= 0) && (phyaddr <= 31))
7129 priv->plat->phy_addr = phyaddr;
7130
7131 if (priv->plat->stmmac_rst) {
7132 ret = reset_control_assert(priv->plat->stmmac_rst);
7133 reset_control_deassert(priv->plat->stmmac_rst);
7134 /* Some reset controllers have only reset callback instead of
7135 * assert + deassert callbacks pair.
7136 */
7137 if (ret == -ENOTSUPP)
7138 reset_control_reset(priv->plat->stmmac_rst);
7139 }
7140
7141 ret = reset_control_deassert(priv->plat->stmmac_ahb_rst);
7142 if (ret == -ENOTSUPP)
7143 dev_err(priv->device, "unable to bring out of ahb reset: %pe\n",
7144 ERR_PTR(ret));
7145
7146 /* Init MAC and get the capabilities */
7147 ret = stmmac_hw_init(priv);
7148 if (ret)
7149 goto error_hw_init;
7150
7151 /* Only DWMAC core version 5.20 onwards supports HW descriptor prefetch.
7152 */
7153 if (priv->synopsys_id < DWMAC_CORE_5_20)
7154 priv->plat->dma_cfg->dche = false;
7155
7156 stmmac_check_ether_addr(priv);
7157
7158 ndev->netdev_ops = &stmmac_netdev_ops;
7159
7160 ndev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
7161 NETIF_F_RXCSUM;
7162 ndev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
7163 NETDEV_XDP_ACT_XSK_ZEROCOPY |
7164 NETDEV_XDP_ACT_NDO_XMIT;
7165
7166 ret = stmmac_tc_init(priv, priv);
7167 if (!ret) {
7168 ndev->hw_features |= NETIF_F_HW_TC;
7169 }
7170
7171 if ((priv->plat->tso_en) && (priv->dma_cap.tsoen)) {
7172 ndev->hw_features |= NETIF_F_TSO | NETIF_F_TSO6;
7173 if (priv->plat->has_gmac4)
7174 ndev->hw_features |= NETIF_F_GSO_UDP_L4;
7175 priv->tso = true;
7176 dev_info(priv->device, "TSO feature enabled\n");
7177 }
7178
7179 if (priv->dma_cap.sphen && !priv->plat->sph_disable) {
7180 ndev->hw_features |= NETIF_F_GRO;
7181 priv->sph_cap = true;
7182 priv->sph = priv->sph_cap;
7183 dev_info(priv->device, "SPH feature enabled\n");
7184 }
7185
7186 /* The current IP register MAC_HW_Feature1[ADDR64] only define
7187 * 32/40/64 bit width, but some SOC support others like i.MX8MP
7188 * support 34 bits but it map to 40 bits width in MAC_HW_Feature1[ADDR64].
7189 * So overwrite dma_cap.addr64 according to HW real design.
7190 */
7191 if (priv->plat->addr64)
7192 priv->dma_cap.addr64 = priv->plat->addr64;
7193
7194 if (priv->dma_cap.addr64) {
7195 ret = dma_set_mask_and_coherent(device,
7196 DMA_BIT_MASK(priv->dma_cap.addr64));
7197 if (!ret) {
7198 dev_info(priv->device, "Using %d bits DMA width\n",
7199 priv->dma_cap.addr64);
7200
7201 /*
7202 * If more than 32 bits can be addressed, make sure to
7203 * enable enhanced addressing mode.
7204 */
7205 if (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT))
7206 priv->plat->dma_cfg->eame = true;
7207 } else {
7208 ret = dma_set_mask_and_coherent(device, DMA_BIT_MASK(32));
7209 if (ret) {
7210 dev_err(priv->device, "Failed to set DMA Mask\n");
7211 goto error_hw_init;
7212 }
7213
7214 priv->dma_cap.addr64 = 32;
7215 }
7216 }
7217
7218 ndev->features |= ndev->hw_features | NETIF_F_HIGHDMA;
7219 ndev->watchdog_timeo = msecs_to_jiffies(watchdog);
7220 #ifdef STMMAC_VLAN_TAG_USED
7221 /* Both mac100 and gmac support receive VLAN tag detection */
7222 ndev->features |= NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_VLAN_STAG_RX;
7223 if (priv->dma_cap.vlhash) {
7224 ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
7225 ndev->features |= NETIF_F_HW_VLAN_STAG_FILTER;
7226 }
7227 if (priv->dma_cap.vlins) {
7228 ndev->features |= NETIF_F_HW_VLAN_CTAG_TX;
7229 if (priv->dma_cap.dvlan)
7230 ndev->features |= NETIF_F_HW_VLAN_STAG_TX;
7231 }
7232 #endif
7233 priv->msg_enable = netif_msg_init(debug, default_msg_level);
7234
7235 /* Initialize RSS */
7236 rxq = priv->plat->rx_queues_to_use;
7237 netdev_rss_key_fill(priv->rss.key, sizeof(priv->rss.key));
7238 for (i = 0; i < ARRAY_SIZE(priv->rss.table); i++)
7239 priv->rss.table[i] = ethtool_rxfh_indir_default(i, rxq);
7240
7241 if (priv->dma_cap.rssen && priv->plat->rss_en)
7242 ndev->features |= NETIF_F_RXHASH;
7243
7244 /* MTU range: 46 - hw-specific max */
7245 ndev->min_mtu = ETH_ZLEN - ETH_HLEN;
7246 if (priv->plat->has_xgmac)
7247 ndev->max_mtu = XGMAC_JUMBO_LEN;
7248 else if ((priv->plat->enh_desc) || (priv->synopsys_id >= DWMAC_CORE_4_00))
7249 ndev->max_mtu = JUMBO_LEN;
7250 else
7251 ndev->max_mtu = SKB_MAX_HEAD(NET_SKB_PAD + NET_IP_ALIGN);
7252 /* Will not overwrite ndev->max_mtu if plat->maxmtu > ndev->max_mtu
7253 * as well as plat->maxmtu < ndev->min_mtu which is a invalid range.
7254 */
7255 if ((priv->plat->maxmtu < ndev->max_mtu) &&
7256 (priv->plat->maxmtu >= ndev->min_mtu))
7257 ndev->max_mtu = priv->plat->maxmtu;
7258 else if (priv->plat->maxmtu < ndev->min_mtu)
7259 dev_warn(priv->device,
7260 "%s: warning: maxmtu having invalid value (%d)\n",
7261 __func__, priv->plat->maxmtu);
7262
7263 if (flow_ctrl)
7264 priv->flow_ctrl = FLOW_AUTO; /* RX/TX pause on */
7265
7266 /* Setup channels NAPI */
7267 stmmac_napi_add(ndev);
7268
7269 mutex_init(&priv->lock);
7270
7271 /* If a specific clk_csr value is passed from the platform
7272 * this means that the CSR Clock Range selection cannot be
7273 * changed at run-time and it is fixed. Viceversa the driver'll try to
7274 * set the MDC clock dynamically according to the csr actual
7275 * clock input.
7276 */
7277 if (priv->plat->clk_csr >= 0)
7278 priv->clk_csr = priv->plat->clk_csr;
7279 else
7280 stmmac_clk_csr_set(priv);
7281
7282 stmmac_check_pcs_mode(priv);
7283
7284 pm_runtime_get_noresume(device);
7285 pm_runtime_set_active(device);
7286 if (!pm_runtime_enabled(device))
7287 pm_runtime_enable(device);
7288
7289 if (priv->hw->pcs != STMMAC_PCS_TBI &&
7290 priv->hw->pcs != STMMAC_PCS_RTBI) {
7291 /* MDIO bus Registration */
7292 ret = stmmac_mdio_register(ndev);
7293 if (ret < 0) {
7294 dev_err_probe(priv->device, ret,
7295 "%s: MDIO bus (id: %d) registration failed\n",
7296 __func__, priv->plat->bus_id);
7297 goto error_mdio_register;
7298 }
7299 }
7300
7301 if (priv->plat->speed_mode_2500)
7302 priv->plat->speed_mode_2500(ndev, priv->plat->bsp_priv);
7303
7304 if (priv->plat->mdio_bus_data && priv->plat->mdio_bus_data->has_xpcs) {
7305 ret = stmmac_xpcs_setup(priv->mii);
7306 if (ret)
7307 goto error_xpcs_setup;
7308 }
7309
7310 /* For fixed-link setup, we clear xpcs_an_inband */
> 7311 if (!fwnode)
7312 fwnode = dev_fwnode(priv->device);
7313
7314 if (fwnode) {
7315 struct fwnode_handle *fixed_node;
7316
7317 fixed_node = fwnode_get_named_child_node(fwnode, "fixed-link");
7318 if (fixed_node)
7319 priv->plat->mdio_bus_data->xpcs_an_inband = false;
7320
7321 fwnode_handle_put(fixed_node);
7322 }
7323
7324 ret = stmmac_phy_setup(priv);
7325 if (ret) {
7326 netdev_err(ndev, "failed to setup phy (%d)\n", ret);
7327 goto error_phy_setup;
7328 }
7329
7330 ret = register_netdev(ndev);
7331 if (ret) {
7332 dev_err(priv->device, "%s: ERROR %i registering the device\n",
7333 __func__, ret);
7334 goto error_netdev_register;
7335 }
7336

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests