]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
hinic3: Add PF device support and function type validation
authorFan Gong <gongfan1@huawei.com>
Tue, 10 Mar 2026 01:04:54 +0000 (09:04 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 12 Mar 2026 11:13:48 +0000 (12:13 +0100)
Add PF device ID to support for PF devices in driver and enhance
function type validation to ensure proper handling of both PF and
VF.

Co-developed-by: Zhu Yikai <zhuyikai1@h-partners.com>
Signed-off-by: Zhu Yikai <zhuyikai1@h-partners.com>
Signed-off-by: Fan Gong <gongfan1@huawei.com>
Link: https://patch.msgid.link/895cf7ac341c475e383aa8726039dc8ea3b96ffb.1773062356.git.zhuyikai1@h-partners.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/huawei/hinic3/hinic3_hwdev.c
drivers/net/ethernet/huawei/hinic3/hinic3_hwif.c
drivers/net/ethernet/huawei/hinic3/hinic3_lld.c
drivers/net/ethernet/huawei/hinic3/hinic3_mbox.c
drivers/net/ethernet/huawei/hinic3/hinic3_pci_id_tbl.h

index 04c0385b3344eac484b2326d2008687eb2ebf06a..f44b3064ab2eab83deb316c08d950913701ed52c 100644 (file)
@@ -434,6 +434,10 @@ err_free_ceqs:
 static void hinic3_free_cmdqs_channel(struct hinic3_hwdev *hwdev)
 {
        hinic3_comm_cmdqs_free(hwdev);
+
+       hinic3_set_wq_page_size(hwdev, hinic3_global_func_id(hwdev),
+                               HINIC3_MIN_PAGE_SIZE);
+
        hinic3_ceqs_free(hwdev);
 }
 
index 70d70556dca6b586321bc520b6cdd9118ed3b57a..90feaa2250801c8de0e8bf7ea3996546c4af12f9 100644 (file)
 #define HINIC3_PPF_ELECTION_GET(val, member) \
        FIELD_GET(HINIC3_PPF_ELECTION_##member##_MASK, val)
 
+#define HINIC3_GET_REG_FLAG(reg)  ((reg) & (~(HINIC3_REGS_FLAG_MASK)))
 #define HINIC3_GET_REG_ADDR(reg)  ((reg) & (HINIC3_REGS_FLAG_MASK))
 
 static void __iomem *hinic3_reg_addr(struct hinic3_hwif *hwif, u32 reg)
 {
-       return hwif->cfg_regs_base + HINIC3_GET_REG_ADDR(reg);
+       void __iomem *addr;
+
+       if (HINIC3_GET_REG_FLAG(reg) == HINIC3_MGMT_REGS_FLAG)
+               addr = hwif->mgmt_regs_base + HINIC3_GET_REG_ADDR(reg);
+       else
+               addr = hwif->cfg_regs_base + HINIC3_GET_REG_ADDR(reg);
+
+       return addr;
 }
 
 u32 hinic3_hwif_read_reg(struct hinic3_hwif *hwif, u32 reg)
@@ -137,6 +145,7 @@ static void set_hwif_attr(struct hinic3_func_attr *attr, u32 attr0, u32 attr1,
 static int init_hwif_attr(struct hinic3_hwdev *hwdev)
 {
        u32 attr0, attr1, attr2, attr3, attr6;
+       struct hinic3_func_attr *attr;
        struct hinic3_hwif *hwif;
 
        hwif = hwdev->hwif;
@@ -160,7 +169,15 @@ static int init_hwif_attr(struct hinic3_hwdev *hwdev)
        if (attr6 == HINIC3_PCIE_LINK_DOWN)
                return -EFAULT;
 
-       set_hwif_attr(&hwif->attr, attr0, attr1, attr2, attr3, attr6);
+       attr = &hwif->attr;
+       set_hwif_attr(attr, attr0, attr1, attr2, attr3, attr6);
+
+       if (attr->func_type != HINIC3_FUNC_TYPE_VF &&
+           attr->func_type != HINIC3_FUNC_TYPE_PF) {
+               dev_err(hwdev->dev, "unexpected func_type %u\n",
+                       attr->func_type);
+               return -EINVAL;
+       }
 
        if (!hwif->attr.num_ceqs) {
                dev_err(hwdev->dev, "Ceq num cfg in fw is zero\n");
index a8b89eeed753fd43978a0217576e15e19876a1d5..f83d5bd1041e365db4d75a95ff14b266c13ea672 100644 (file)
@@ -426,6 +426,7 @@ static void hinic3_remove(struct pci_dev *pdev)
 }
 
 static const struct pci_device_id hinic3_pci_table[] = {
+       {PCI_VDEVICE(HUAWEI, PCI_DEV_ID_HINIC3_PF), 0},
        {PCI_VDEVICE(HUAWEI, PCI_DEV_ID_HINIC3_VF), 0},
        {0, 0}
 
index 51be726d9d2edea9b63611366c0a2065d1166454..c1bc64a50dd3b135256d2db5c7ca6d9bffd4462d 100644 (file)
@@ -462,7 +462,8 @@ void hinic3_free_mbox(struct hinic3_hwdev *hwdev)
 
        destroy_workqueue(mbox->workq);
        free_mbox_wb_status(mbox);
-       hinic3_uninit_func_mbox_msg_channel(hwdev);
+       if (HINIC3_IS_VF(hwdev))
+               hinic3_uninit_func_mbox_msg_channel(hwdev);
        uninit_mgmt_msg_channel(mbox);
        kfree(mbox);
 }
index 86c88d0bb4bd0ed3ab0dee2e6ed5cca35f7e5d06..02b2b0fbecc7599d53c25c0e7090df160a7677ab 100644 (file)
@@ -4,6 +4,7 @@
 #ifndef _HINIC3_PCI_ID_TBL_H_
 #define _HINIC3_PCI_ID_TBL_H_
 
+#define PCI_DEV_ID_HINIC3_PF    0x0222
 #define PCI_DEV_ID_HINIC3_VF    0x375F
 
 #endif