Re: [PATCH net-next v01 01/12] hinic3: HW initialization
From: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Date: 2025-08-26 11:37:40
Also in:
linux-doc, lkml
On 26/08/2025 10:05, Fan Gong wrote:
quoted hunk ↗ jump to hunk
Add the hardware resource data structures, functions for HW initialization, configuration and releasement. Co-developed-by: Xin Guo <redacted> Signed-off-by: Xin Guo <redacted> Co-developed-by: Zhu Yikai <redacted> Signed-off-by: Zhu Yikai <redacted> Signed-off-by: Fan Gong <gongfan1@huawei.com> --- .../net/ethernet/huawei/hinic3/hinic3_hwdev.c | 67 ++++- .../net/ethernet/huawei/hinic3/hinic3_hwif.c | 240 ++++++++++++++++++ .../net/ethernet/huawei/hinic3/hinic3_hwif.h | 13 + .../net/ethernet/huawei/hinic3/hinic3_lld.c | 8 +- .../huawei/hinic3/hinic3_pci_id_tbl.h | 10 + 5 files changed, 334 insertions(+), 4 deletions(-)diff --git a/drivers/net/ethernet/huawei/hinic3/hinic3_hwdev.c b/drivers/net/ethernet/huawei/hinic3/hinic3_hwdev.c index 6e8788a64925..d145d3b05e19 100644 --- a/drivers/net/ethernet/huawei/hinic3/hinic3_hwdev.c +++ b/drivers/net/ethernet/huawei/hinic3/hinic3_hwdev.c@@ -7,15 +7,76 @@ #include "hinic3_mbox.h" #include "hinic3_mgmt.h" +#define HINIC3_HWDEV_WQ_NAME "hinic3_hardware" +#define HINIC3_WQ_MAX_REQ 10 + +enum hinic3_hwdev_init_state { + HINIC3_HWDEV_MBOX_INITED = 2, + HINIC3_HWDEV_CMDQ_INITED = 3, +}; + +static int init_hwdev(struct pci_dev *pdev) +{ + struct hinic3_pcidev *pci_adapter = pci_get_drvdata(pdev); + struct hinic3_hwdev *hwdev; + + hwdev = kzalloc(sizeof(*hwdev), GFP_KERNEL); + if (!hwdev) + return -ENOMEM; + + pci_adapter->hwdev = hwdev; + hwdev->adapter = pci_adapter; + hwdev->pdev = pci_adapter->pdev; + hwdev->dev = &pci_adapter->pdev->dev; + hwdev->func_state = 0; + memset(hwdev->features, 0, sizeof(hwdev->features));
no need to init values to zeros as you use kzalloc to allocate the memory
+ spin_lock_init(&hwdev->channel_lock);
+
+ return 0;
+}
+
int hinic3_init_hwdev(struct pci_dev *pdev)
{
- /* Completed by later submission due to LoC limit. */
- return -EFAULT;
+ struct hinic3_pcidev *pci_adapter = pci_get_drvdata(pdev);
+ struct hinic3_hwdev *hwdev;
+ int err;
+
+ err = init_hwdev(pdev);I think there is no reason to have another init function
+ if (err)
+ return err;
+
+ hwdev = pci_adapter->hwdev;
+ err = hinic3_init_hwif(hwdev);
+ if (err) {
+ dev_err(hwdev->dev, "Failed to init hwif\n");
+ goto err_free_hwdev;
+ }
+
+ hwdev->workq = alloc_workqueue(HINIC3_HWDEV_WQ_NAME, WQ_MEM_RECLAIM,
+ HINIC3_WQ_MAX_REQ);
+ if (!hwdev->workq) {
+ dev_err(hwdev->dev, "Failed to alloc hardware workq\n");
+ err = -ENOMEM;
+ goto err_free_hwif;
+ }
+
+ return 0;
+
+err_free_hwif:
+ hinic3_free_hwif(hwdev);
+
+err_free_hwdev:
+ pci_adapter->hwdev = NULL;
+ kfree(hwdev);
+
+ return err;
}[...]
quoted hunk ↗ jump to hunk
@@ -121,6 +122,7 @@ static int hinic3_attach_aux_devices(struct hinic3_hwdev *hwdev) goto err_del_adevs; } mutex_unlock(&pci_adapter->pdev_mutex); + return 0; err_del_adevs:@@ -132,6 +134,7 @@ static int hinic3_attach_aux_devices(struct hinic3_hwdev *hwdev) } } mutex_unlock(&pci_adapter->pdev_mutex); + return -ENOMEM; }@@ -153,6 +156,7 @@ struct hinic3_hwdev *hinic3_adev_get_hwdev(struct auxiliary_device *adev) struct hinic3_adev *hadev; hadev = container_of(adev, struct hinic3_adev, adev); + return hadev->hwdev; }@@ -333,6 +337,7 @@ static int hinic3_probe_func(struct hinic3_pcidev *pci_adapter) err_out: dev_err(&pdev->dev, "PCIe device probe function failed\n"); + return err; }@@ -365,6 +370,7 @@ static int hinic3_probe(struct pci_dev *pdev, const struct pci_device_id *id) err_out: dev_err(&pdev->dev, "PCIe device probe failed\n"); + return err; }
not sure it's good to have this empty lines in this particular patch