diff mbox series

[v3,14/23] hw/rdma: Initialize node_guid from vmxnet3 mac address

Message ID 20181113071336.6242-15-yuval.shaia@oracle.com (mailing list archive)
State New, archived
Headers show
Series Add support for RDMA MAD | expand

Commit Message

Yuval Shaia Nov. 13, 2018, 7:13 a.m. UTC
node_guid should be set once device is load.
Make node_guid be GID format (32 bit) of PCI function 0 vmxnet3 device's
MAC.

A new function was added to do the conversion.
So for example the MAC 56:b6:44:e9:62:dc will be converted to GID
54b6:44ff:fee9:62dc.

Signed-off-by: Yuval Shaia <yuval.shaia@oracle.com>
---
 hw/rdma/rdma_utils.h      |  9 +++++++++
 hw/rdma/vmw/pvrdma_cmd.c  | 10 ----------
 hw/rdma/vmw/pvrdma_main.c |  5 ++++-
 3 files changed, 13 insertions(+), 11 deletions(-)

Comments

Marcel Apfelbaum Nov. 17, 2018, 12:10 p.m. UTC | #1
On 11/13/18 9:13 AM, Yuval Shaia wrote:
> node_guid should be set once device is load.
> Make node_guid be GID format (32 bit) of PCI function 0 vmxnet3 device's
> MAC.
>
> A new function was added to do the conversion.
> So for example the MAC 56:b6:44:e9:62:dc will be converted to GID
> 54b6:44ff:fee9:62dc.
>
> Signed-off-by: Yuval Shaia <yuval.shaia@oracle.com>
> ---
>   hw/rdma/rdma_utils.h      |  9 +++++++++
>   hw/rdma/vmw/pvrdma_cmd.c  | 10 ----------
>   hw/rdma/vmw/pvrdma_main.c |  5 ++++-
>   3 files changed, 13 insertions(+), 11 deletions(-)
>
> diff --git a/hw/rdma/rdma_utils.h b/hw/rdma/rdma_utils.h
> index 989db249ef..202abb3366 100644
> --- a/hw/rdma/rdma_utils.h
> +++ b/hw/rdma/rdma_utils.h
> @@ -63,4 +63,13 @@ extern unsigned long pr_dbg_cnt;
>   void *rdma_pci_dma_map(PCIDevice *dev, dma_addr_t addr, dma_addr_t plen);
>   void rdma_pci_dma_unmap(PCIDevice *dev, void *buffer, dma_addr_t len);
>   
> +static inline void addrconf_addr_eui48(uint8_t *eui, const char *addr)
> +{
> +    memcpy(eui, addr, 3);
> +    eui[3] = 0xFF;
> +    eui[4] = 0xFE;
> +    memcpy(eui + 5, addr + 3, 3);
> +    eui[0] ^= 2;
> +}
> +
>   #endif
> diff --git a/hw/rdma/vmw/pvrdma_cmd.c b/hw/rdma/vmw/pvrdma_cmd.c
> index a334f6205e..2979582fac 100644
> --- a/hw/rdma/vmw/pvrdma_cmd.c
> +++ b/hw/rdma/vmw/pvrdma_cmd.c
> @@ -592,16 +592,6 @@ static int create_bind(PVRDMADev *dev, union pvrdma_cmd_req *req,
>           return -EINVAL;
>       }
>   
> -    /* TODO: Since drivers stores node_guid at load_dsr phase then this
> -     * assignment is not relevant, i need to figure out a way how to
> -     * retrieve MAC of our netdev */
> -    if (!cmd->index) {
> -        dev->node_guid =
> -            dev->rdma_dev_res.ports[0].gid_tbl[0].gid.global.interface_id;
> -        pr_dbg("dev->node_guid=0x%llx\n",
> -               (long long unsigned int)be64_to_cpu(dev->node_guid));
> -    }
> -
>       return 0;
>   }
>   
> diff --git a/hw/rdma/vmw/pvrdma_main.c b/hw/rdma/vmw/pvrdma_main.c
> index fa6468d221..95e9322b7c 100644
> --- a/hw/rdma/vmw/pvrdma_main.c
> +++ b/hw/rdma/vmw/pvrdma_main.c
> @@ -264,7 +264,7 @@ static void init_dsr_dev_caps(PVRDMADev *dev)
>       dsr->caps.sys_image_guid = 0;
>       pr_dbg("sys_image_guid=%" PRIx64 "\n", dsr->caps.sys_image_guid);
>   
> -    dsr->caps.node_guid = cpu_to_be64(dev->node_guid);
> +    dsr->caps.node_guid = dev->node_guid;
>       pr_dbg("node_guid=%" PRIx64 "\n", be64_to_cpu(dsr->caps.node_guid));
>   
>       dsr->caps.phys_port_cnt = MAX_PORTS;
> @@ -579,6 +579,9 @@ static void pvrdma_realize(PCIDevice *pdev, Error **errp)
>       /* Break if not vmxnet3 device in slot 0 */
>       dev->func0 = VMXNET3(pci_get_function_0(pdev));
>   
> +    addrconf_addr_eui48((unsigned char *)&dev->node_guid,
> +                        (const char *)&dev->func0->conf.macaddr.a);
> +
>       memdev_root = object_resolve_path("/objects", NULL);
>       if (memdev_root) {
>           object_child_foreach(memdev_root, pvrdma_check_ram_shared, &ram_shared);

Reviewed-by: Marcel Apfelbaum<marcel.apfelbaum@gmail.com>

Thanks,
Marcel
diff mbox series

Patch

diff --git a/hw/rdma/rdma_utils.h b/hw/rdma/rdma_utils.h
index 989db249ef..202abb3366 100644
--- a/hw/rdma/rdma_utils.h
+++ b/hw/rdma/rdma_utils.h
@@ -63,4 +63,13 @@  extern unsigned long pr_dbg_cnt;
 void *rdma_pci_dma_map(PCIDevice *dev, dma_addr_t addr, dma_addr_t plen);
 void rdma_pci_dma_unmap(PCIDevice *dev, void *buffer, dma_addr_t len);
 
+static inline void addrconf_addr_eui48(uint8_t *eui, const char *addr)
+{
+    memcpy(eui, addr, 3);
+    eui[3] = 0xFF;
+    eui[4] = 0xFE;
+    memcpy(eui + 5, addr + 3, 3);
+    eui[0] ^= 2;
+}
+
 #endif
diff --git a/hw/rdma/vmw/pvrdma_cmd.c b/hw/rdma/vmw/pvrdma_cmd.c
index a334f6205e..2979582fac 100644
--- a/hw/rdma/vmw/pvrdma_cmd.c
+++ b/hw/rdma/vmw/pvrdma_cmd.c
@@ -592,16 +592,6 @@  static int create_bind(PVRDMADev *dev, union pvrdma_cmd_req *req,
         return -EINVAL;
     }
 
-    /* TODO: Since drivers stores node_guid at load_dsr phase then this
-     * assignment is not relevant, i need to figure out a way how to
-     * retrieve MAC of our netdev */
-    if (!cmd->index) {
-        dev->node_guid =
-            dev->rdma_dev_res.ports[0].gid_tbl[0].gid.global.interface_id;
-        pr_dbg("dev->node_guid=0x%llx\n",
-               (long long unsigned int)be64_to_cpu(dev->node_guid));
-    }
-
     return 0;
 }
 
diff --git a/hw/rdma/vmw/pvrdma_main.c b/hw/rdma/vmw/pvrdma_main.c
index fa6468d221..95e9322b7c 100644
--- a/hw/rdma/vmw/pvrdma_main.c
+++ b/hw/rdma/vmw/pvrdma_main.c
@@ -264,7 +264,7 @@  static void init_dsr_dev_caps(PVRDMADev *dev)
     dsr->caps.sys_image_guid = 0;
     pr_dbg("sys_image_guid=%" PRIx64 "\n", dsr->caps.sys_image_guid);
 
-    dsr->caps.node_guid = cpu_to_be64(dev->node_guid);
+    dsr->caps.node_guid = dev->node_guid;
     pr_dbg("node_guid=%" PRIx64 "\n", be64_to_cpu(dsr->caps.node_guid));
 
     dsr->caps.phys_port_cnt = MAX_PORTS;
@@ -579,6 +579,9 @@  static void pvrdma_realize(PCIDevice *pdev, Error **errp)
     /* Break if not vmxnet3 device in slot 0 */
     dev->func0 = VMXNET3(pci_get_function_0(pdev));
 
+    addrconf_addr_eui48((unsigned char *)&dev->node_guid,
+                        (const char *)&dev->func0->conf.macaddr.a);
+
     memdev_root = object_resolve_path("/objects", NULL);
     if (memdev_root) {
         object_child_foreach(memdev_root, pvrdma_check_ram_shared, &ram_shared);