[dpdk-dev] [PATCH v2 03/40] bnxt: add driver register/unregister support

2016-05-25 Thread Bruce Richardson
On Fri, May 13, 2016 at 03:45:52PM -0700, Stephen Hurd wrote:
> Move init() cleanup into uninit() function
> Fix .dev_private_size
> Add require hwrm calls:
>   bnxt_hwrm_func_driver_register()
>   bnxt_hwrm_func_driver_unregister()
> 
> Signed-off-by: Stephen Hurd 
> Reviewed-by: Ajit Kumar Khaparde 
> ---
>  drivers/net/bnxt/bnxt.h|   1 +
>  drivers/net/bnxt/bnxt_ethdev.c |  48 --
>  drivers/net/bnxt/bnxt_hwrm.c   |  50 ++
>  drivers/net/bnxt/bnxt_hwrm.h   |   3 +
>  drivers/net/bnxt/hsi_struct_def_dpdk.h | 277 
> -
>  5 files changed, 359 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
> index 0f816ed..ebddeab 100644
> --- a/drivers/net/bnxt/bnxt.h
> +++ b/drivers/net/bnxt/bnxt.h
> @@ -91,6 +91,7 @@ struct bnxt {
>   struct rte_pci_device   *pdev;
>  
>   uint32_tflags;
> +#define BNXT_FLAG_REGISTERED (1<<0)
>  #define BNXT_FLAG_VF (1<<1)
>  #define BNXT_PF(bp)  (!((bp)->flags & BNXT_FLAG_VF))
>  #define BNXT_VF(bp)  ((bp)->flags & BNXT_FLAG_VF)
> diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
> index a74cc6c..07519df 100644
> --- a/drivers/net/bnxt/bnxt_ethdev.c
> +++ b/drivers/net/bnxt/bnxt_ethdev.c
> @@ -52,20 +52,12 @@ static struct rte_pci_id bnxt_pci_id_map[] = {
>   {.device_id = 0},
>  };
>  
> -static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
> -{
> - struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
> -
> - rte_free(eth_dev->data->mac_addrs);
> - bnxt_free_hwrm_resources(bp);
> -}
> -

It seems strange to remove this code given that it was just added in the 
previous
commit. Does it need to be added in the first place?

Regards,
/Bruce


[dpdk-dev] [PATCH v2 03/40] bnxt: add driver register/unregister support

2016-05-13 Thread Stephen Hurd
Move init() cleanup into uninit() function
Fix .dev_private_size
Add require hwrm calls:
bnxt_hwrm_func_driver_register()
bnxt_hwrm_func_driver_unregister()

Signed-off-by: Stephen Hurd 
Reviewed-by: Ajit Kumar Khaparde 
---
 drivers/net/bnxt/bnxt.h|   1 +
 drivers/net/bnxt/bnxt_ethdev.c |  48 --
 drivers/net/bnxt/bnxt_hwrm.c   |  50 ++
 drivers/net/bnxt/bnxt_hwrm.h   |   3 +
 drivers/net/bnxt/hsi_struct_def_dpdk.h | 277 -
 5 files changed, 359 insertions(+), 20 deletions(-)

diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index 0f816ed..ebddeab 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -91,6 +91,7 @@ struct bnxt {
struct rte_pci_device   *pdev;

uint32_tflags;
+#define BNXT_FLAG_REGISTERED   (1<<0)
 #define BNXT_FLAG_VF   (1<<1)
 #define BNXT_PF(bp)(!((bp)->flags & BNXT_FLAG_VF))
 #define BNXT_VF(bp)((bp)->flags & BNXT_FLAG_VF)
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index a74cc6c..07519df 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -52,20 +52,12 @@ static struct rte_pci_id bnxt_pci_id_map[] = {
{.device_id = 0},
 };

-static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
-{
-   struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
-
-   rte_free(eth_dev->data->mac_addrs);
-   bnxt_free_hwrm_resources(bp);
-}
-
 /*
  * Initialization
  */

 static struct eth_dev_ops bnxt_dev_ops = {
-   .dev_close = bnxt_dev_close_op,
+0
 };

 static bool bnxt_vf_pciid(uint16_t id)
@@ -123,7 +115,8 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev)
eth_dev->pci_dev->addr.function < 4) {
RTE_LOG(ERR, PMD, "Function not enabled %x:\n",
eth_dev->pci_dev->addr.function);
-   return -ENOMEM;
+   rc = -ENOMEM;
+   goto error;
}

rte_eth_copy_pci_info(eth_dev, eth_dev->pci_dev);
@@ -148,11 +141,11 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev)
if (rc) {
RTE_LOG(ERR, PMD,
"hwrm resource allocation failure rc: %x\n", rc);
-   goto error;
+   goto error_free;
}
rc = bnxt_hwrm_ver_get(bp);
if (rc)
-   goto error;
+   goto error_free;
bnxt_hwrm_queue_qportcfg(bp);

/* Get the MAX capabilities for this function */
@@ -177,17 +170,38 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev)
memcpy(bp->mac_addr, bp->vf.mac_addr, sizeof(bp->mac_addr));
memcpy(_dev->data->mac_addrs[0], bp->mac_addr, ETHER_ADDR_LEN);

-   return -EPERM;
+   rc = bnxt_hwrm_func_driver_register(bp, 0,
+   bp->pf.vf_req_fwd);
+   if (rc) {
+   RTE_LOG(ERR, PMD,
+   "Failed to register driver");
+   rc = -EBUSY;
+   goto error_free;
+   }
+
+   RTE_LOG(INFO, PMD,
+   DRV_MODULE_NAME " found at mem %" PRIx64 ", node addr %pM\n",
+   eth_dev->pci_dev->mem_resource[0].phys_addr,
+   eth_dev->pci_dev->mem_resource[0].addr);
+
+   return 0;

 error_free:
-   bnxt_dev_close_op(eth_dev);
+   eth_dev->driver->eth_dev_uninit(eth_dev);
 error:
return rc;
 }

 static int
-bnxt_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused) {
-   return 0;
+bnxt_dev_uninit(struct rte_eth_dev *eth_dev) {
+   struct bnxt *bp = eth_dev->data->dev_private;
+   int rc;
+
+   if (eth_dev->data->mac_addrs)
+   rte_free(eth_dev->data->mac_addrs);
+   rc = bnxt_hwrm_func_driver_unregister(bp, 0);
+   bnxt_free_hwrm_resources(bp);
+   return rc;
 }

 static struct eth_driver bnxt_rte_pmd = {
@@ -198,7 +212,7 @@ static struct eth_driver bnxt_rte_pmd = {
},
.eth_dev_init = bnxt_dev_init,
.eth_dev_uninit = bnxt_dev_uninit,
-   .dev_private_size = 32 /* this must be non-zero apparently */,
+   .dev_private_size = sizeof(struct bnxt),
 };

 static int bnxt_rte_pmd_init(const char *name, const char *params __rte_unused)
diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c
index 5b66721..398f0f5 100644
--- a/drivers/net/bnxt/bnxt_hwrm.c
+++ b/drivers/net/bnxt/bnxt_hwrm.c
@@ -36,6 +36,7 @@
 #include 
 #include 
 #include 
+#include 

 #include "bnxt.h"
 #include "bnxt_hwrm.h"
@@ -178,6 +179,34 @@ int bnxt_hwrm_func_qcaps(struct bnxt *bp)
return rc;
 }

+int bnxt_hwrm_func_driver_register(struct bnxt *bp, uint32_t flags,
+  uint32_t *vf_req_fwd)
+{
+   int rc;
+   struct hwrm_func_drv_rgtr_input req = {.req_type = 0 };
+   struct hwrm_func_drv_rgtr_output *resp = bp->hwrm_cmd_resp_addr;
+
+   if