> -----Original Message-----
> From: Guo, Junfeng <junfeng....@intel.com>
> Sent: Monday, September 5, 2022 6:58 PM
> To: Zhang, Qi Z <qi.z.zh...@intel.com>; Wu, Jingjing
> <jingjing...@intel.com>; Xing, Beilei <beilei.x...@intel.com>
> Cc: dev@dpdk.org; Wang, Xiao W <xiao.w.w...@intel.com>; Guo, Junfeng
> <junfeng....@intel.com>; Li, Xiaoyun <xiaoyun...@intel.com>
> Subject: [PATCH v2 03/14] net/idpf: add support for device initialization
> 
> Support device init and the following dev ops:
>       - dev_configure
>       - dev_start
>       - dev_stop
>       - dev_close
> 
> Signed-off-by: Beilei Xing <beilei.x...@intel.com>
> Signed-off-by: Xiaoyun Li <xiaoyun...@intel.com>
> Signed-off-by: Xiao Wang <xiao.w.w...@intel.com>
> Signed-off-by: Junfeng Guo <junfeng....@intel.com>
> ---
>  drivers/net/idpf/idpf_ethdev.c | 810
> +++++++++++++++++++++++++++++++++  drivers/net/idpf/idpf_ethdev.h |
> 229 ++++++++++  drivers/net/idpf/idpf_vchnl.c  | 495
> ++++++++++++++++++++
>  drivers/net/idpf/meson.build   |  18 +
>  drivers/net/idpf/version.map   |   3 +
>  drivers/net/meson.build        |   1 +
>  6 files changed, 1556 insertions(+)
>  create mode 100644 drivers/net/idpf/idpf_ethdev.c  create mode 100644
> drivers/net/idpf/idpf_ethdev.h  create mode 100644
> drivers/net/idpf/idpf_vchnl.c  create mode 100644
> drivers/net/idpf/meson.build  create mode 100644
> drivers/net/idpf/version.map
> 
<...>

> +static int
> +idpf_adapter_init(struct rte_pci_device *pci_dev, struct idpf_adapter
> +*adapter) {
> +     struct iecm_hw *hw = &adapter->hw;
> +     int ret = 0;
> +
> +     hw->hw_addr = (void *)pci_dev->mem_resource[0].addr;
> +     hw->hw_addr_len = pci_dev->mem_resource[0].len;
> +     hw->back = adapter;
> +     hw->vendor_id = pci_dev->id.vendor_id;
> +     hw->device_id = pci_dev->id.device_id;
> +     hw->subsystem_vendor_id = pci_dev->id.subsystem_vendor_id;
> +
> +     strncpy(adapter->name, pci_dev->device.name, PCI_PRI_STR_SIZE);
> +
> +     idpf_reset_pf(hw);
> +     ret = idpf_check_pf_reset_done(hw);
> +     if (ret) {
> +             PMD_INIT_LOG(ERR, "IDPF is still resetting");
> +             goto err;
> +     }
> +
> +     ret = idpf_init_mbx(hw);
> +     if (ret) {
> +             PMD_INIT_LOG(ERR, "Failed to init mailbox");
> +             goto err;
> +     }
> +
> +     adapter->mbx_resp = rte_zmalloc("idpf_adapter_mbx_resp",
> IDPF_DFLT_MBX_BUF_SIZE, 0);
> +     if (!adapter->mbx_resp) {
> +             PMD_INIT_LOG(ERR, "Failed to allocate
> idpf_adapter_mbx_resp memory");
> +             goto err_mbx;
> +     }
> +
> +     if (idpf_check_api_version(adapter)) {
> +             PMD_INIT_LOG(ERR, "Failed to check api version");
> +             goto err_api;
> +     }
> +
> +     adapter->caps = rte_zmalloc("idpf_caps",
> +                            sizeof(struct virtchnl2_get_capabilities), 0);
> +     if (!adapter->caps) {
> +             PMD_INIT_LOG(ERR, "Failed to allocate idpf_caps memory");
> +             goto err_api;
> +     }
> +
> +     if (idpf_get_caps(adapter)) {
> +             PMD_INIT_LOG(ERR, "Failed to get capabilities");
> +             goto err_caps;
> +     }
> +
> +     adapter->max_vport_nb = adapter->caps->max_vports;
> +
> +     adapter->vport_req_info = rte_zmalloc("vport_req_info",
> +                                           adapter->max_vport_nb *
> +                                           sizeof(*adapter->vport_req_info),
> +                                           0);
> +     if (!adapter->vport_req_info) {
> +             PMD_INIT_LOG(ERR, "Failed to allocate vport_req_info
> memory");
> +             goto err_caps;
> +     }
> +
> +     adapter->vport_recv_info = rte_zmalloc("vport_recv_info",
> +                                            adapter->max_vport_nb *
> +                                            sizeof(*adapter-
> >vport_recv_info),
> +                                            0);
> +     if (!adapter->vport_recv_info) {
> +             PMD_INIT_LOG(ERR, "Failed to allocate vport_recv_info
> memory");
> +             goto err_vport_recv_info;
> +     }
> +
> +     adapter->vports = rte_zmalloc("vports",
> +                                   adapter->max_vport_nb *
> +                                   sizeof(*adapter->vports),
> +                                   0);
> +     if (!adapter->vports) {
> +             PMD_INIT_LOG(ERR, "Failed to allocate vports memory");
> +             goto err_vports;
> +     }
> +
> +     adapter->max_rxq_per_msg = (IDPF_DFLT_MBX_BUF_SIZE -
> +                            sizeof(struct virtchnl2_config_rx_queues)) /
> +                            sizeof(struct virtchnl2_rxq_info);
> +     adapter->max_txq_per_msg = (IDPF_DFLT_MBX_BUF_SIZE -
> +                            sizeof(struct virtchnl2_config_tx_queues)) /
> +                            sizeof(struct virtchnl2_txq_info);
> +
> +     adapter->cur_vports = 0;
> +     adapter->cur_vport_nb = 0;
> +     adapter->next_vport_idx = 0;
> +
> +     return ret;
> +
> +err_vports:
> +     rte_free(adapter->vports);
> +     adapter->vports = NULL;

Need to free adapter->vport_recv_info here but not adapter->vports.
 

> +err_vport_recv_info:
> +     rte_free(adapter->vport_req_info);
> +     adapter->vport_req_info = NULL;
> +err_caps:
> +     rte_free(adapter->caps);
> +     adapter->caps = NULL;
> +err_api:
> +     rte_free(adapter->mbx_resp);
> +     adapter->mbx_resp = NULL;
> +err_mbx:
> +     iecm_ctlq_deinit(hw);
> +err:
> +     return -1;
> +}
> +
> +

Reply via email to