[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <b794027a-ef3b-4262-a952-db249a840e89@lunn.ch>
Date: Thu, 12 Dec 2024 18:41:44 +0100
From: Andrew Lunn <andrew@...n.ch>
To: Gur Stavi <gur.stavi@...wei.com>
Cc: gongfan <gongfan1@...wei.com>, netdev@...r.kernel.org,
linux-kernel@...r.kernel.org,
"David S. Miller" <davem@...emloft.net>,
Eric Dumazet <edumazet@...gle.com>,
Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>,
Simon Horman <horms@...nel.org>,
Andrew Lunn <andrew+netdev@...n.ch>, linux-doc@...r.kernel.org,
Jonathan Corbet <corbet@....net>,
Cai Huoqing <cai.huoqing@...ux.dev>, Xin Guo <guoxin09@...wei.com>,
Shen Chenyang <shenchenyang1@...ilicon.com>,
Zhou Shuai <zhoushuai28@...wei.com>, Wu Like <wulike1@...wei.com>,
Shi Jing <shijing34@...wei.com>,
Meny Yossefi <meny.yossefi@...wei.com>
Subject: Re: [RFC net-next v02 1/3] net: hinic3: module initialization and
tx/rx logic
> +static void hinic3_del_one_adev(struct hinic3_hwdev *hwdev,
> + enum hinic3_service_type svc_type)
> +{
> + struct hinic3_pcidev *pci_adapter = hwdev->adapter;
> + struct hinic3_adev *hadev;
> + bool timeout = true;
> + unsigned long end;
> +
> + end = jiffies + msecs_to_jiffies(HINIC3_EVENT_PROCESS_TIMEOUT);
> + do {
> + if (!test_and_set_bit(svc_type, &pci_adapter->state)) {
> + timeout = false;
> + break;
> + }
> + usleep_range(900, 1000);
> + } while (time_before(jiffies, end));
> +
> + if (timeout && !test_and_set_bit(svc_type, &pci_adapter->state))
> + timeout = false;
Please look at using iopoll.h
> +static int hinic3_sw_init(struct net_device *netdev)
> +{
> + struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
> + struct hinic3_hwdev *hwdev = nic_dev->hwdev;
> + int err;
> +
> + nic_dev->q_params.sq_depth = HINIC3_SQ_DEPTH;
> + nic_dev->q_params.rq_depth = HINIC3_RQ_DEPTH;
> +
> + hinic3_try_to_enable_rss(netdev);
> +
> + eth_hw_addr_random(netdev);
Is using a random MAC just a temporary thing until more code is added
to access an OTP?
> + err = register_netdev(netdev);
> + if (err) {
> + err = -ENOMEM;
> + goto err_netdev;
> + }
> +
> + netif_carrier_off(netdev);
> +
> + dev_set_drvdata(&adev->dev, nic_dev);
Is this used anywhere in the driver? Calling register_netdev() makes
the interface live, even before it returns. If you have NFS root for
example, it could be sending packets, etc, before drvdata is set.
> +int hinic3_set_port_mtu(struct net_device *netdev, u16 new_mtu)
> +{
> + struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
> + struct hinic3_func_tbl_cfg func_tbl_cfg = {};
> + struct hinic3_hwdev *hwdev = nic_dev->hwdev;
> +
> + if (new_mtu < HINIC3_MIN_MTU_SIZE) {
> + dev_err(hwdev->dev,
> + "Invalid mtu size: %ubytes, mtu size < %ubytes\n",
> + new_mtu, HINIC3_MIN_MTU_SIZE);
> + return -EINVAL;
> + }
> +
> + if (new_mtu > HINIC3_MAX_JUMBO_FRAME_SIZE) {
> + dev_err(hwdev->dev, "Invalid mtu size: %ubytes, mtu size > %ubytes\n",
> + new_mtu, HINIC3_MAX_JUMBO_FRAME_SIZE);
> + return -EINVAL;
> + }
The core can do this validation for you, if you set ndev->max_mtu,
ndev->min_mtu.
Andrew
---
pw-bot: cr
Powered by blists - more mailing lists