summaryrefslogtreecommitdiffstats
path: root/debian/patches/features/all/ethernet-microsoft/0003-net-mana-Add-support-for-auxiliary-device.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/features/all/ethernet-microsoft/0003-net-mana-Add-support-for-auxiliary-device.patch')
-rw-r--r--debian/patches/features/all/ethernet-microsoft/0003-net-mana-Add-support-for-auxiliary-device.patch178
1 files changed, 178 insertions, 0 deletions
diff --git a/debian/patches/features/all/ethernet-microsoft/0003-net-mana-Add-support-for-auxiliary-device.patch b/debian/patches/features/all/ethernet-microsoft/0003-net-mana-Add-support-for-auxiliary-device.patch
new file mode 100644
index 000000000..a639b69c9
--- /dev/null
+++ b/debian/patches/features/all/ethernet-microsoft/0003-net-mana-Add-support-for-auxiliary-device.patch
@@ -0,0 +1,178 @@
+From 63ea159035f1c00da99016a1c71380d90f156ad4 Mon Sep 17 00:00:00 2001
+From: Long Li <longli@microsoft.com>
+Date: Thu, 3 Nov 2022 12:16:19 -0700
+Subject: [PATCH 03/23] net: mana: Add support for auxiliary device
+
+In preparation for supporting MANA RDMA driver, add support for auxiliary
+device in the Ethernet driver. The RDMA device is modeled as an auxiliary
+device to the Ethernet device.
+
+Reviewed-by: Dexuan Cui <decui@microsoft.com>
+Signed-off-by: Long Li <longli@microsoft.com>
+Link: https://lore.kernel.org/r/1667502990-2559-2-git-send-email-longli@linuxonhyperv.com
+Acked-by: Haiyang Zhang <haiyangz@microsoft.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+(cherry picked from commit a69839d4327d053b18d8e1b0e7ddeee78db78f4f)
+Signed-off-by: Bastian Blank <waldi@debian.org>
+---
+ drivers/net/ethernet/microsoft/Kconfig | 1 +
+ drivers/net/ethernet/microsoft/mana/gdma.h | 2 +
+ .../ethernet/microsoft/mana/mana_auxiliary.h | 10 +++
+ drivers/net/ethernet/microsoft/mana/mana_en.c | 83 ++++++++++++++++++-
+ 4 files changed, 95 insertions(+), 1 deletion(-)
+ create mode 100644 drivers/net/ethernet/microsoft/mana/mana_auxiliary.h
+
+--- a/drivers/net/ethernet/microsoft/Kconfig
++++ b/drivers/net/ethernet/microsoft/Kconfig
+@@ -19,6 +19,7 @@ config MICROSOFT_MANA
+ tristate "Microsoft Azure Network Adapter (MANA) support"
+ depends on PCI_MSI && X86_64
+ depends on PCI_HYPERV
++ select AUXILIARY_BUS
+ select PAGE_POOL
+ help
+ This driver supports Microsoft Azure Network Adapter (MANA).
+--- a/drivers/net/ethernet/microsoft/mana/gdma.h
++++ b/drivers/net/ethernet/microsoft/mana/gdma.h
+@@ -204,6 +204,8 @@ struct gdma_dev {
+
+ /* GDMA driver specific pointer */
+ void *driver_data;
++
++ struct auxiliary_device *adev;
+ };
+
+ #define MINIMUM_SUPPORTED_PAGE_SIZE PAGE_SIZE
+--- /dev/null
++++ b/drivers/net/ethernet/microsoft/mana/mana_auxiliary.h
+@@ -0,0 +1,10 @@
++/* SPDX-License-Identifier: GPL-2.0-only */
++/* Copyright (c) 2022, Microsoft Corporation. */
++
++#include "mana.h"
++#include <linux/auxiliary_bus.h>
++
++struct mana_adev {
++ struct auxiliary_device adev;
++ struct gdma_dev *mdev;
++};
+--- a/drivers/net/ethernet/microsoft/mana/mana_en.c
++++ b/drivers/net/ethernet/microsoft/mana/mana_en.c
+@@ -14,6 +14,19 @@
+ #include <net/ip6_checksum.h>
+
+ #include "mana.h"
++#include "mana_auxiliary.h"
++
++static DEFINE_IDA(mana_adev_ida);
++
++static int mana_adev_idx_alloc(void)
++{
++ return ida_alloc(&mana_adev_ida, GFP_KERNEL);
++}
++
++static void mana_adev_idx_free(int idx)
++{
++ ida_free(&mana_adev_ida, idx);
++}
+
+ /* Microsoft Azure Network Adapter (MANA) functions */
+
+@@ -2145,6 +2158,69 @@ free_net:
+ return err;
+ }
+
++static void adev_release(struct device *dev)
++{
++ struct mana_adev *madev = container_of(dev, struct mana_adev, adev.dev);
++
++ kfree(madev);
++}
++
++static void remove_adev(struct gdma_dev *gd)
++{
++ struct auxiliary_device *adev = gd->adev;
++ int id = adev->id;
++
++ auxiliary_device_delete(adev);
++ auxiliary_device_uninit(adev);
++
++ mana_adev_idx_free(id);
++ gd->adev = NULL;
++}
++
++static int add_adev(struct gdma_dev *gd)
++{
++ struct auxiliary_device *adev;
++ struct mana_adev *madev;
++ int ret;
++
++ madev = kzalloc(sizeof(*madev), GFP_KERNEL);
++ if (!madev)
++ return -ENOMEM;
++
++ adev = &madev->adev;
++ ret = mana_adev_idx_alloc();
++ if (ret < 0)
++ goto idx_fail;
++ adev->id = ret;
++
++ adev->name = "rdma";
++ adev->dev.parent = gd->gdma_context->dev;
++ adev->dev.release = adev_release;
++ madev->mdev = gd;
++
++ ret = auxiliary_device_init(adev);
++ if (ret)
++ goto init_fail;
++
++ ret = auxiliary_device_add(adev);
++ if (ret)
++ goto add_fail;
++
++ gd->adev = adev;
++ return 0;
++
++add_fail:
++ auxiliary_device_uninit(adev);
++
++init_fail:
++ mana_adev_idx_free(adev->id);
++
++idx_fail:
++ kfree(madev);
++
++ return ret;
++}
++
+ int mana_probe(struct gdma_dev *gd, bool resuming)
+ {
+ struct gdma_context *gc = gd->gdma_context;
+@@ -2212,6 +2288,8 @@ int mana_probe(struct gdma_dev *gd, bool
+ break;
+ }
+ }
++
++ err = add_adev(gd);
+ out:
+ if (err)
+ mana_remove(gd, false);
+@@ -2228,6 +2306,10 @@ void mana_remove(struct gdma_dev *gd, bo
+ int err;
+ int i;
+
++ /* adev currently doesn't support suspending, always remove it */
++ if (gd->adev)
++ remove_adev(gd);
++
+ for (i = 0; i < ac->num_ports; i++) {
+ ndev = ac->ports[i];
+ if (!ndev) {
+@@ -2260,7 +2342,6 @@ void mana_remove(struct gdma_dev *gd, bo
+ }
+
+ mana_destroy_eq(ac);
+-
+ out:
+ mana_gd_deregister_device(gd);
+