Selaa lähdekoodia

qcacmn: add a new function to update net_device->dev_addr

In kernel 5.17, net_device->dev_addr is changed to const unsigned char*
and can only be updated via dev_addr_mod(). Add a new function
qdf_net_update_net_device_dev_addr() to call kernel API dev_addr_mod().

Change-Id: Ifecfb453f5dc6b066892c04f4bdbec3759e32c53
CRs-Fixed: 3298120
Rajesh Chauhan 2 vuotta sitten
vanhempi
sitoutus
e895717ffb
4 muutettua tiedostoa jossa 106 lisäystä ja 4 poistoa
  1. 36 2
      qdf/inc/qdf_net_if.h
  2. 41 0
      qdf/linux/src/i_qdf_net_if.h
  3. 22 0
      qdf/linux/src/qdf_net_if.c
  4. 7 2
      utils/epping/src/epping_txrx.c

+ 36 - 2
qdf/inc/qdf_net_if.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -63,7 +64,22 @@ qdf_net_if_get_dev_by_name(char *nif_name);
  */
 QDF_STATUS
 qdf_net_if_release_dev(struct qdf_net_if *nif);
-#else
+
+/**
+ * qdf_net_update_net_device_dev_addr() - update net_device dev_addr
+ * @ndev: net_device
+ * @src_addr: source mac address
+ * @len: length
+ *
+ * This function updates dev_addr in net_device
+ *
+ * Return: void
+ */
+void
+qdf_net_update_net_device_dev_addr(struct net_device *ndev,
+				   const void *src_addr,
+				   size_t len);
+#else /* ENHANCED_OS_ABSTRACTION */
 static inline QDF_STATUS
 qdf_net_if_create_dummy_if(struct qdf_net_if *nif)
 {
@@ -81,7 +97,25 @@ qdf_net_if_release_dev(struct qdf_net_if *nif)
 {
 	return __qdf_net_if_release_dev(nif);
 }
-#endif
+
+/**
+ * qdf_net_update_net_device_dev_addr() - update net_device dev_addr
+ * @ndev: net_device
+ * @src_addr: source mac address
+ * @len: length
+ *
+ * This function updates dev_addr in net_device
+ *
+ * Return: void
+ */
+static inline void
+qdf_net_update_net_device_dev_addr(struct net_device *ndev,
+				   const void *src_addr,
+				   size_t len)
+{
+	__qdf_net_update_net_device_dev_addr(ndev, src_addr, len);
+}
+#endif /* ENHANCED_OS_ABSTRACTION */
 
 /**
  * qdf_net_if_get_devname() - Retrieve netdevice name

+ 41 - 0
qdf/linux/src/i_qdf_net_if.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -84,4 +85,44 @@ __qdf_net_if_release_dev(struct qdf_net_if  *nif)
 
 	return QDF_STATUS_SUCCESS;
 }
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0))
+/**
+ * qdf_net_update_net_device_dev_addr() - update net_device dev_addr
+ * @ndev: net_device
+ * @src_addr: source mac address
+ * @len: length
+ *
+ * kernel version 5.17 onwards made net_device->dev_addr as const unsigned char*
+ * so to update dev_addr, this function calls kernel api dev_addr_mod.
+ *
+ * Return: void
+ */
+static inline void
+__qdf_net_update_net_device_dev_addr(struct net_device *ndev,
+				     const void *src_addr,
+				     size_t len)
+{
+	dev_addr_mod(ndev, 0, src_addr, len);
+}
+#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)) */
+/**
+ * qdf_net_update_net_device_dev_addr() - update net_device dev_addr
+ * @ndev: net_device
+ * @src_addr: source mac address
+ * @len: length
+ *
+ * This function updates dev_addr in net_device using mem copy.
+ *
+ * Return: void
+ */
+static inline void
+__qdf_net_update_net_device_dev_addr(struct net_device *ndev,
+				     const void *src_addr,
+				     size_t len)
+{
+	memcpy(ndev->dev_addr, src_addr, len);
+}
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)) */
+
 #endif /*__I_QDF_NET_IF_H */

+ 22 - 0
qdf/linux/src/qdf_net_if.c

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2018,2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -87,3 +88,24 @@ qdf_net_if_release_dev(struct qdf_net_if  *nif)
 }
 
 qdf_export_symbol(qdf_net_if_release_dev);
+
+/**
+ * qdf_net_update_net_device_dev_addr() - update net_device dev_addr
+ * @ndev: net_device
+ * @src_addr: source mac address
+ * @len: length
+ *
+ * kernel version 5.17 onwards made net_device->dev_addr as const unsigned char*
+ * so to update dev_addr, this function calls kernel api dev_addr_mod.
+ *
+ * Return: void
+ */
+void
+qdf_net_update_net_device_dev_addr(struct net_device *ndev,
+				   const void *src_addr,
+				   size_t len)
+{
+	__qdf_net_update_net_device_dev_addr(ndev, src_addr, len);
+}
+
+qdf_export_symbol(qdf_net_update_net_device_dev_addr);

+ 7 - 2
utils/epping/src/epping_txrx.c

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -41,6 +42,7 @@
 #include <linux/ctype.h>
 #include "epping_main.h"
 #include "epping_internal.h"
+#include "qdf_net_if.h"
 
 static int epping_start_adapter(epping_adapter_t *adapter);
 static void epping_stop_adapter(epping_adapter_t *adapter);
@@ -220,7 +222,8 @@ static int epping_set_mac_address(struct net_device *dev, void *addr)
 	struct sockaddr *psta_mac_addr = addr;
 	qdf_mem_copy(&adapter->macAddressCurrent,
 		     psta_mac_addr->sa_data, ETH_ALEN);
-	qdf_mem_copy(dev->dev_addr, psta_mac_addr->sa_data, ETH_ALEN);
+	qdf_net_update_net_device_dev_addr(dev, psta_mac_addr->sa_data,
+					   ETH_ALEN);
 	return 0;
 }
 
@@ -379,7 +382,9 @@ epping_adapter_t *epping_add_adapter(epping_context_t *pEpping_ctx,
 	adapter->dev = dev;
 	adapter->pEpping_ctx = pEpping_ctx;
 	adapter->device_mode = device_mode;    /* station, SAP, etc */
-	qdf_mem_copy(dev->dev_addr, (void *)macAddr, sizeof(tSirMacAddr));
+	qdf_net_update_net_device_dev_addr(dev,
+					   (void *)macAddr,
+					   sizeof(tSirMacAddr));
 	qdf_mem_copy(adapter->macAddressCurrent.bytes,
 		     macAddr, sizeof(tSirMacAddr));
 	qdf_spinlock_create(&adapter->data_lock);