diff mbox series

[net-next,v2] net: ti: icssg-prueth: Split out common object into module

Message ID 20240606073639.3299252-1-danishanwar@ti.com (mailing list archive)
State Changes Requested
Delegated to: Netdev Maintainers
Headers show
Series [net-next,v2] net: ti: icssg-prueth: Split out common object into module | expand

Checks

Context Check Description
netdev/series_format success Single patches do not need cover letters
netdev/tree_selection success Clearly marked for net-next
netdev/ynl success Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 8 this patch: 8
netdev/build_tools success No tools touched, skip
netdev/cc_maintainers warning 2 maintainers not CCed: hkallweit1@gmail.com linux-arm-kernel@lists.infradead.org
netdev/build_clang success Errors and warnings before: 8 this patch: 8
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 8 this patch: 8
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 389 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0
netdev/contest fail net-next-2024-06-06--15-00 (tests: 1037)

Commit Message

MD Danish Anwar June 6, 2024, 7:36 a.m. UTC
icssg_prueth.c and icssg_prueth_sr1.c drivers use multiple common .c
files. These common objects are getting added to multiple modules. As a
result when both drivers are enabled in .config, below warning is seen.

drivers/net/ethernet/ti/Makefile: icssg/icssg_common.o is added to multiple modules: icssg-prueth icssg-prueth-sr1
drivers/net/ethernet/ti/Makefile: icssg/icssg_classifier.o is added to multiple modules: icssg-prueth icssg-prueth-sr1
drivers/net/ethernet/ti/Makefile: icssg/icssg_config.o is added to multiple modules: icssg-prueth icssg-prueth-sr1
drivers/net/ethernet/ti/Makefile: icssg/icssg_mii_cfg.o is added to multiple modules: icssg-prueth icssg-prueth-sr1
drivers/net/ethernet/ti/Makefile: icssg/icssg_stats.o is added to multiple modules: icssg-prueth icssg-prueth-sr1
drivers/net/ethernet/ti/Makefile: icssg/icssg_ethtool.o is added to multiple modules: icssg-prueth icssg-prueth-sr1

Fix this by building a new module (icssg.o) for all the common objects.
Both the driver can then depend on this common module.

This also fixes below error seen when both drivers are built.
ERROR: modpost: "icssg_queue_pop"
[drivers/net/ethernet/ti/icssg-prueth-sr1.ko] undefined!
ERROR: modpost: "icssg_queue_push"
[drivers/net/ethernet/ti/icssg-prueth-sr1.ko] undefined!

Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202405182038.ncf1mL7Z-lkp@intel.com/
Fixes: 487f7323f39a ("net: ti: icssg-prueth: Add helper functions to configure FDB")
Signed-off-by: MD Danish Anwar <danishanwar@ti.com>
---
Cc: Thorsten Leemhuis <linux@leemhuis.info>

NOTE: This is only applicable on net-next but not on net as the patch that
introduced this dependency is part of net-next.

v1 -> v2:
*) Instead of just adding the missing module to icssg-prueth-sr1, the
   patch also splits the common objects into new module as suggested by
   Andrew Lunn <andrew@lunn.ch>
*) Not carrying Tested-by tag of Thorsten Leemhuis <linux@leemhuis.info>
   as this patch has significant diff over v1. I would like him to test
   this patch again.

v1 https://lore.kernel.org/all/20240605035617.2189393-1-danishanwar@ti.com/

 drivers/net/ethernet/ti/Makefile              | 32 ++++++++-----------
 .../net/ethernet/ti/icssg/icssg_classifier.c  |  6 ++++
 drivers/net/ethernet/ti/icssg/icssg_common.c  | 32 +++++++++++++++++++
 drivers/net/ethernet/ti/icssg/icssg_config.c  | 11 +++++++
 drivers/net/ethernet/ti/icssg/icssg_ethtool.c |  1 +
 drivers/net/ethernet/ti/icssg/icssg_mii_cfg.c |  4 +++
 drivers/net/ethernet/ti/icssg/icssg_queues.c  |  2 ++
 drivers/net/ethernet/ti/icssg/icssg_stats.c   |  1 +
 8 files changed, 71 insertions(+), 18 deletions(-)


base-commit: 7da375e2c7e023957b71fce44a72107559cfa6d0

Comments

Thorsten Leemhuis June 6, 2024, 10:34 a.m. UTC | #1
On 06.06.24 09:36, MD Danish Anwar wrote:
> icssg_prueth.c and icssg_prueth_sr1.c drivers use multiple common .c
> files. These common objects are getting added to multiple modules. As a
> result when both drivers are enabled in .config, below warning is seen.
> [...]

Thx, seems that patch does the trick as well (tested it with today's
-next and assuming here that no change fixed it in between).

Reported-and-tested-by: Thorsten Leemhuis <linux@leemhuis.info>
Closes:
https://lore.kernel.org/all/de980a49-b802-417a-a57e-2c47f67b08e4@leemhuis.info/

Ciao, Thorsten
Andrew Lunn June 6, 2024, 3:54 p.m. UTC | #2
> +EXPORT_SYMBOL_GPL(icssg_class_set_mac_addr);
> +EXPORT_SYMBOL_GPL(icssg_class_disable);
> +EXPORT_SYMBOL_GPL(icssg_class_default);
> +EXPORT_SYMBOL_GPL(icssg_class_promiscuous_sr1);
> +EXPORT_SYMBOL_GPL(icssg_class_add_mcast_sr1);
> +EXPORT_SYMBOL_GPL(icssg_ft1_set_mac_addr);
> +EXPORT_SYMBOL_GPL(prueth_cleanup_rx_chns);
> +EXPORT_SYMBOL_GPL(prueth_cleanup_tx_chns);
> +EXPORT_SYMBOL_GPL(prueth_ndev_del_tx_napi);
> +EXPORT_SYMBOL_GPL(prueth_xmit_free);
> +EXPORT_SYMBOL_GPL(prueth_ndev_add_tx_napi);
> +EXPORT_SYMBOL_GPL(prueth_init_tx_chns);
> +EXPORT_SYMBOL_GPL(prueth_init_rx_chns);
> +EXPORT_SYMBOL_GPL(prueth_dma_rx_push);
> +EXPORT_SYMBOL_GPL(icssg_ts_to_ns);
> +EXPORT_SYMBOL_GPL(emac_ndo_start_xmit);
> +EXPORT_SYMBOL_GPL(prueth_rx_irq);
> +EXPORT_SYMBOL_GPL(prueth_emac_stop);
> +EXPORT_SYMBOL_GPL(prueth_cleanup_tx_ts);
> +EXPORT_SYMBOL_GPL(emac_napi_rx_poll);
> +EXPORT_SYMBOL_GPL(prueth_prepare_rx_chan);
> +EXPORT_SYMBOL_GPL(prueth_reset_tx_chan);
> +EXPORT_SYMBOL_GPL(prueth_reset_rx_chan);
> +EXPORT_SYMBOL_GPL(emac_ndo_tx_timeout);
> +EXPORT_SYMBOL_GPL(emac_ndo_ioctl);
> +EXPORT_SYMBOL_GPL(emac_ndo_get_stats64);
> +EXPORT_SYMBOL_GPL(emac_ndo_get_phys_port_name);
> +EXPORT_SYMBOL_GPL(prueth_node_port);
> +EXPORT_SYMBOL_GPL(prueth_node_mac);
> +EXPORT_SYMBOL_GPL(prueth_netdev_exit);
> +EXPORT_SYMBOL_GPL(prueth_get_cores);
> +EXPORT_SYMBOL_GPL(prueth_put_cores);
> +EXPORT_SYMBOL_GPL(prueth_dev_pm_ops);
> +EXPORT_SYMBOL_GPL(icssg_config_ipg);
> +EXPORT_SYMBOL_GPL(icssg_config);
> +EXPORT_SYMBOL_GPL(emac_set_port_state);
> +EXPORT_SYMBOL_GPL(icssg_config_half_duplex);
> +EXPORT_SYMBOL_GPL(icssg_config_set_speed);
> +EXPORT_SYMBOL_GPL(icssg_send_fdb_msg);
> +EXPORT_SYMBOL_GPL(icssg_fdb_add_del);
> +EXPORT_SYMBOL_GPL(icssg_fdb_lookup);
> +EXPORT_SYMBOL_GPL(icssg_vtbl_modify);
> +EXPORT_SYMBOL_GPL(icssg_get_pvid);
> +EXPORT_SYMBOL_GPL(icssg_set_pvid);
> +EXPORT_SYMBOL_GPL(icssg_ethtool_ops);
> +EXPORT_SYMBOL_GPL(icssg_mii_update_mtu);
> +EXPORT_SYMBOL_GPL(icssg_update_rgmii_cfg);
> +EXPORT_SYMBOL_GPL(icssg_rgmii_get_speed);
> +EXPORT_SYMBOL_GPL(icssg_rgmii_get_fullduplex);
> +EXPORT_SYMBOL_GPL(icssg_queue_pop);
> +EXPORT_SYMBOL_GPL(icssg_queue_push);
> +EXPORT_SYMBOL_GPL(emac_stats_work_handler);

Please could you clean up the namespace a little. icssg_ and prueth_
are O.K, but we also have arc/emac_rockchip.c, allwinner/sun4i-emac.c,
ibm/emac/, and qualcomm/emac/ using the emac_ prefix.

Thanks
    Andrew

---
pw-bot: cr
Thorsten Leemhuis June 26, 2024, 7:19 a.m. UTC | #3
On 06.06.24 17:54, Andrew Lunn wrote:
>> +EXPORT_SYMBOL_GPL(icssg_class_set_mac_addr);
>> +EXPORT_SYMBOL_GPL(icssg_class_disable);
>> +EXPORT_SYMBOL_GPL(icssg_class_default);
>> +EXPORT_SYMBOL_GPL(icssg_class_promiscuous_sr1);
> [...]
> Please could you clean up the namespace a little. icssg_ and prueth_
> are O.K, but we also have arc/emac_rockchip.c, allwinner/sun4i-emac.c,
> ibm/emac/, and qualcomm/emac/ using the emac_ prefix.

Just wondering (not as a regression tracker, just as someone that ran
into this and carries the patch in his tree to avoid a build error for
next):

What happened to this fix? After above feedback nearly 20 days ago
nothing happened afaics. Did this fall through the cracks? Or was some
other solution found and I just missed this (and thus can drop the fix
from my tree)?

Ciao, Thorsten
Roger Quadros June 26, 2024, 7:37 a.m. UTC | #4
On 06/06/2024 10:36, MD Danish Anwar wrote:
> icssg_prueth.c and icssg_prueth_sr1.c drivers use multiple common .c
> files. These common objects are getting added to multiple modules. As a
> result when both drivers are enabled in .config, below warning is seen.
> 
> drivers/net/ethernet/ti/Makefile: icssg/icssg_common.o is added to multiple modules: icssg-prueth icssg-prueth-sr1
> drivers/net/ethernet/ti/Makefile: icssg/icssg_classifier.o is added to multiple modules: icssg-prueth icssg-prueth-sr1
> drivers/net/ethernet/ti/Makefile: icssg/icssg_config.o is added to multiple modules: icssg-prueth icssg-prueth-sr1
> drivers/net/ethernet/ti/Makefile: icssg/icssg_mii_cfg.o is added to multiple modules: icssg-prueth icssg-prueth-sr1
> drivers/net/ethernet/ti/Makefile: icssg/icssg_stats.o is added to multiple modules: icssg-prueth icssg-prueth-sr1
> drivers/net/ethernet/ti/Makefile: icssg/icssg_ethtool.o is added to multiple modules: icssg-prueth icssg-prueth-sr1
> 
> Fix this by building a new module (icssg.o) for all the common objects.
> Both the driver can then depend on this common module.
> 
> This also fixes below error seen when both drivers are built.
> ERROR: modpost: "icssg_queue_pop"
> [drivers/net/ethernet/ti/icssg-prueth-sr1.ko] undefined!
> ERROR: modpost: "icssg_queue_push"
> [drivers/net/ethernet/ti/icssg-prueth-sr1.ko] undefined!
> 
> Reported-by: kernel test robot <lkp@intel.com>
> Closes: https://lore.kernel.org/oe-kbuild-all/202405182038.ncf1mL7Z-lkp@intel.com/
> Fixes: 487f7323f39a ("net: ti: icssg-prueth: Add helper functions to configure FDB")
> Signed-off-by: MD Danish Anwar <danishanwar@ti.com>

Reviewed-by: Roger Quadros <rogerq@kernel.org>
Thorsten Leemhuis July 12, 2024, 11:12 a.m. UTC | #5
On 26.06.24 09:19, Thorsten Leemhuis wrote:
> On 06.06.24 17:54, Andrew Lunn wrote:
>>> +EXPORT_SYMBOL_GPL(icssg_class_set_mac_addr);
>>> +EXPORT_SYMBOL_GPL(icssg_class_disable);
>>> +EXPORT_SYMBOL_GPL(icssg_class_default);
>>> +EXPORT_SYMBOL_GPL(icssg_class_promiscuous_sr1);
>> [...]
>> Please could you clean up the namespace a little. icssg_ and prueth_
>> are O.K, but we also have arc/emac_rockchip.c, allwinner/sun4i-emac.c,
>> ibm/emac/, and qualcomm/emac/ using the emac_ prefix.
> 
> Just wondering (not as a regression tracker, just as someone that ran
> into this and carries the patch in his tree to avoid a build error for
> next):
> 
> What happened to this fix? After above feedback nearly 20 days ago
> nothing happened afaics. Did this fall through the cracks? Or was some
> other solution found and I just missed this (and thus can drop the fix
> from my tree)?

That inquiry lead to a review from Roger (thx!) more than two weeks ago,
but that was all afaics. Makes me wonder if this regression will hit
mainline soon, as the merge window might open on Monday already.

Ciao, Thorsten
MD Danish Anwar July 12, 2024, 11:40 a.m. UTC | #6
On 12/07/24 4:42 pm, Thorsten Leemhuis wrote:
> On 26.06.24 09:19, Thorsten Leemhuis wrote:
>> On 06.06.24 17:54, Andrew Lunn wrote:
>>>> +EXPORT_SYMBOL_GPL(icssg_class_set_mac_addr);
>>>> +EXPORT_SYMBOL_GPL(icssg_class_disable);
>>>> +EXPORT_SYMBOL_GPL(icssg_class_default);
>>>> +EXPORT_SYMBOL_GPL(icssg_class_promiscuous_sr1);
>>> [...]
>>> Please could you clean up the namespace a little. icssg_ and prueth_
>>> are O.K, but we also have arc/emac_rockchip.c, allwinner/sun4i-emac.c,
>>> ibm/emac/, and qualcomm/emac/ using the emac_ prefix.
>>
>> Just wondering (not as a regression tracker, just as someone that ran
>> into this and carries the patch in his tree to avoid a build error for
>> next):
>>
>> What happened to this fix? After above feedback nearly 20 days ago
>> nothing happened afaics. Did this fall through the cracks? Or was some
>> other solution found and I just missed this (and thus can drop the fix
>> from my tree)?
> 
> That inquiry lead to a review from Roger (thx!) more than two weeks ago,
> but that was all afaics. Makes me wonder if this regression will hit
> mainline soon, as the merge window might open on Monday already.
> 
> Ciao, Thorsten


Andrew L has given comment to clean up the API names. I will rename the
APIs being exported from emac_ prefix to icssg_ prefix and re-spin this.
MD Danish Anwar July 12, 2024, 12:08 p.m. UTC | #7
On 12/07/24 5:10 pm, MD Danish Anwar wrote:
> 
> 
> On 12/07/24 4:42 pm, Thorsten Leemhuis wrote:
>> On 26.06.24 09:19, Thorsten Leemhuis wrote:
>>> On 06.06.24 17:54, Andrew Lunn wrote:
>>>>> +EXPORT_SYMBOL_GPL(icssg_class_set_mac_addr);
>>>>> +EXPORT_SYMBOL_GPL(icssg_class_disable);
>>>>> +EXPORT_SYMBOL_GPL(icssg_class_default);
>>>>> +EXPORT_SYMBOL_GPL(icssg_class_promiscuous_sr1);
>>>> [...]
>>>> Please could you clean up the namespace a little. icssg_ and prueth_
>>>> are O.K, but we also have arc/emac_rockchip.c, allwinner/sun4i-emac.c,
>>>> ibm/emac/, and qualcomm/emac/ using the emac_ prefix.
>>>
>>> Just wondering (not as a regression tracker, just as someone that ran
>>> into this and carries the patch in his tree to avoid a build error for
>>> next):
>>>
>>> What happened to this fix? After above feedback nearly 20 days ago
>>> nothing happened afaics. Did this fall through the cracks? Or was some
>>> other solution found and I just missed this (and thus can drop the fix
>>> from my tree)?
>>
>> That inquiry lead to a review from Roger (thx!) more than two weeks ago,
>> but that was all afaics. Makes me wonder if this regression will hit
>> mainline soon, as the merge window might open on Monday already.
>>
>> Ciao, Thorsten
> 
> 
> Andrew L has given comment to clean up the API names. I will rename the
> APIs being exported from emac_ prefix to icssg_ prefix and re-spin this.
> 

Posted v3
https://lore.kernel.org/all/20240712120636.814564-1-danishanwar@ti.com/
diff mbox series

Patch

diff --git a/drivers/net/ethernet/ti/Makefile b/drivers/net/ethernet/ti/Makefile
index 59cd20a38267..cbcf44806924 100644
--- a/drivers/net/ethernet/ti/Makefile
+++ b/drivers/net/ethernet/ti/Makefile
@@ -31,22 +31,18 @@  ti-am65-cpsw-nuss-$(CONFIG_TI_AM65_CPSW_QOS) += am65-cpsw-qos.o
 ti-am65-cpsw-nuss-$(CONFIG_TI_K3_AM65_CPSW_SWITCHDEV) += am65-cpsw-switchdev.o
 obj-$(CONFIG_TI_K3_AM65_CPTS) += am65-cpts.o
 
-obj-$(CONFIG_TI_ICSSG_PRUETH) += icssg-prueth.o
-icssg-prueth-y := icssg/icssg_prueth.o \
-		  icssg/icssg_common.o \
-		  icssg/icssg_classifier.o \
-		  icssg/icssg_queues.o \
-		  icssg/icssg_config.o \
-		  icssg/icssg_mii_cfg.o \
-		  icssg/icssg_stats.o \
-		  icssg/icssg_ethtool.o \
-		  icssg/icssg_switchdev.o
-obj-$(CONFIG_TI_ICSSG_PRUETH_SR1) += icssg-prueth-sr1.o
-icssg-prueth-sr1-y := icssg/icssg_prueth_sr1.o \
-		      icssg/icssg_common.o \
-		      icssg/icssg_classifier.o \
-		      icssg/icssg_config.o \
-		      icssg/icssg_mii_cfg.o \
-		      icssg/icssg_stats.o \
-		      icssg/icssg_ethtool.o
+obj-$(CONFIG_TI_ICSSG_PRUETH) += icssg-prueth.o icssg.o
+icssg-prueth-y := icssg/icssg_prueth.o icssg/icssg_switchdev.o
+
+obj-$(CONFIG_TI_ICSSG_PRUETH_SR1) += icssg-prueth-sr1.o icssg.o
+icssg-prueth-sr1-y := icssg/icssg_prueth_sr1.o
+
+icssg-y := icssg/icssg_common.o \
+	   icssg/icssg_classifier.o \
+	   icssg/icssg_queues.o \
+	   icssg/icssg_config.o \
+	   icssg/icssg_mii_cfg.o \
+	   icssg/icssg_stats.o \
+	   icssg/icssg_ethtool.o
+
 obj-$(CONFIG_TI_ICSS_IEP) += icssg/icss_iep.o
diff --git a/drivers/net/ethernet/ti/icssg/icssg_classifier.c b/drivers/net/ethernet/ti/icssg/icssg_classifier.c
index f7d21da1a0fb..9ec504d976d6 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_classifier.c
+++ b/drivers/net/ethernet/ti/icssg/icssg_classifier.c
@@ -297,6 +297,7 @@  void icssg_class_set_mac_addr(struct regmap *miig_rt, int slice, u8 *mac)
 		     mac[2] << 16 | mac[3] << 24));
 	regmap_write(miig_rt, offs[slice].mac1, (u32)(mac[4] | mac[5] << 8));
 }
+EXPORT_SYMBOL_GPL(icssg_class_set_mac_addr);
 
 static void icssg_class_ft1_add_mcast(struct regmap *miig_rt, int slice,
 				      int slot, const u8 *addr, const u8 *mask)
@@ -360,6 +361,7 @@  void icssg_class_disable(struct regmap *miig_rt, int slice)
 	/* clear CFG2 */
 	regmap_write(miig_rt, offs[slice].rx_class_cfg2, 0);
 }
+EXPORT_SYMBOL_GPL(icssg_class_disable);
 
 void icssg_class_default(struct regmap *miig_rt, int slice, bool allmulti,
 			 bool is_sr1)
@@ -390,6 +392,7 @@  void icssg_class_default(struct regmap *miig_rt, int slice, bool allmulti,
 	/* clear CFG2 */
 	regmap_write(miig_rt, offs[slice].rx_class_cfg2, 0);
 }
+EXPORT_SYMBOL_GPL(icssg_class_default);
 
 void icssg_class_promiscuous_sr1(struct regmap *miig_rt, int slice)
 {
@@ -408,6 +411,7 @@  void icssg_class_promiscuous_sr1(struct regmap *miig_rt, int slice)
 		regmap_write(miig_rt, offset, data);
 	}
 }
+EXPORT_SYMBOL_GPL(icssg_class_promiscuous_sr1);
 
 void icssg_class_add_mcast_sr1(struct regmap *miig_rt, int slice,
 			       struct net_device *ndev)
@@ -449,6 +453,7 @@  void icssg_class_add_mcast_sr1(struct regmap *miig_rt, int slice,
 		slot++;
 	}
 }
+EXPORT_SYMBOL_GPL(icssg_class_add_mcast_sr1);
 
 /* required for SAV check */
 void icssg_ft1_set_mac_addr(struct regmap *miig_rt, int slice, u8 *mac_addr)
@@ -460,3 +465,4 @@  void icssg_ft1_set_mac_addr(struct regmap *miig_rt, int slice, u8 *mac_addr)
 	rx_class_ft1_set_da_mask(miig_rt, slice, 0, mask_addr);
 	rx_class_ft1_cfg_set_type(miig_rt, slice, 0, FT1_CFG_TYPE_EQ);
 }
+EXPORT_SYMBOL_GPL(icssg_ft1_set_mac_addr);
diff --git a/drivers/net/ethernet/ti/icssg/icssg_common.c b/drivers/net/ethernet/ti/icssg/icssg_common.c
index 873126dfc173..b94e88592a93 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_common.c
+++ b/drivers/net/ethernet/ti/icssg/icssg_common.c
@@ -51,6 +51,7 @@  void prueth_cleanup_rx_chns(struct prueth_emac *emac,
 	if (rx_chn->rx_chn)
 		k3_udma_glue_release_rx_chn(rx_chn->rx_chn);
 }
+EXPORT_SYMBOL_GPL(prueth_cleanup_rx_chns);
 
 void prueth_cleanup_tx_chns(struct prueth_emac *emac)
 {
@@ -71,6 +72,7 @@  void prueth_cleanup_tx_chns(struct prueth_emac *emac)
 		memset(tx_chn, 0, sizeof(*tx_chn));
 	}
 }
+EXPORT_SYMBOL_GPL(prueth_cleanup_tx_chns);
 
 void prueth_ndev_del_tx_napi(struct prueth_emac *emac, int num)
 {
@@ -84,6 +86,7 @@  void prueth_ndev_del_tx_napi(struct prueth_emac *emac, int num)
 		netif_napi_del(&tx_chn->napi_tx);
 	}
 }
+EXPORT_SYMBOL_GPL(prueth_ndev_del_tx_napi);
 
 void prueth_xmit_free(struct prueth_tx_chn *tx_chn,
 		      struct cppi5_host_desc_t *desc)
@@ -120,6 +123,7 @@  void prueth_xmit_free(struct prueth_tx_chn *tx_chn,
 
 	k3_cppi_desc_pool_free(tx_chn->desc_pool, first_desc);
 }
+EXPORT_SYMBOL_GPL(prueth_xmit_free);
 
 int emac_tx_complete_packets(struct prueth_emac *emac, int chn,
 			     int budget, bool *tdown)
@@ -264,6 +268,7 @@  int prueth_ndev_add_tx_napi(struct prueth_emac *emac)
 	prueth_ndev_del_tx_napi(emac, i);
 	return ret;
 }
+EXPORT_SYMBOL_GPL(prueth_ndev_add_tx_napi);
 
 int prueth_init_tx_chns(struct prueth_emac *emac)
 {
@@ -344,6 +349,7 @@  int prueth_init_tx_chns(struct prueth_emac *emac)
 	prueth_cleanup_tx_chns(emac);
 	return ret;
 }
+EXPORT_SYMBOL_GPL(prueth_init_tx_chns);
 
 int prueth_init_rx_chns(struct prueth_emac *emac,
 			struct prueth_rx_chn *rx_chn,
@@ -455,6 +461,7 @@  int prueth_init_rx_chns(struct prueth_emac *emac,
 	prueth_cleanup_rx_chns(emac, rx_chn, max_rflows);
 	return ret;
 }
+EXPORT_SYMBOL_GPL(prueth_init_rx_chns);
 
 int prueth_dma_rx_push(struct prueth_emac *emac,
 		       struct sk_buff *skb,
@@ -492,6 +499,7 @@  int prueth_dma_rx_push(struct prueth_emac *emac,
 	return k3_udma_glue_push_rx_chn(rx_chn->rx_chn, 0,
 					desc_rx, desc_dma);
 }
+EXPORT_SYMBOL_GPL(prueth_dma_rx_push);
 
 u64 icssg_ts_to_ns(u32 hi_sw, u32 hi, u32 lo, u32 cycle_time_ns)
 {
@@ -507,6 +515,7 @@  u64 icssg_ts_to_ns(u32 hi_sw, u32 hi, u32 lo, u32 cycle_time_ns)
 
 	return ns;
 }
+EXPORT_SYMBOL_GPL(icssg_ts_to_ns);
 
 void emac_rx_timestamp(struct prueth_emac *emac,
 		       struct sk_buff *skb, u32 *psdata)
@@ -808,6 +817,7 @@  enum netdev_tx emac_ndo_start_xmit(struct sk_buff *skb, struct net_device *ndev)
 	netif_tx_stop_queue(netif_txq);
 	return NETDEV_TX_BUSY;
 }
+EXPORT_SYMBOL_GPL(emac_ndo_start_xmit);
 
 static void prueth_tx_cleanup(void *data, dma_addr_t desc_dma)
 {
@@ -833,6 +843,7 @@  irqreturn_t prueth_rx_irq(int irq, void *dev_id)
 
 	return IRQ_HANDLED;
 }
+EXPORT_SYMBOL_GPL(prueth_rx_irq);
 
 void prueth_emac_stop(struct prueth_emac *emac)
 {
@@ -857,6 +868,7 @@  void prueth_emac_stop(struct prueth_emac *emac)
 	rproc_shutdown(prueth->rtu[slice]);
 	rproc_shutdown(prueth->pru[slice]);
 }
+EXPORT_SYMBOL_GPL(prueth_emac_stop);
 
 void prueth_cleanup_tx_ts(struct prueth_emac *emac)
 {
@@ -869,6 +881,7 @@  void prueth_cleanup_tx_ts(struct prueth_emac *emac)
 		}
 	}
 }
+EXPORT_SYMBOL_GPL(prueth_cleanup_tx_ts);
 
 int emac_napi_rx_poll(struct napi_struct *napi_rx, int budget)
 {
@@ -907,6 +920,7 @@  int emac_napi_rx_poll(struct napi_struct *napi_rx, int budget)
 
 	return num_rx;
 }
+EXPORT_SYMBOL_GPL(emac_napi_rx_poll);
 
 int prueth_prepare_rx_chan(struct prueth_emac *emac,
 			   struct prueth_rx_chn *chn,
@@ -932,6 +946,7 @@  int prueth_prepare_rx_chan(struct prueth_emac *emac,
 
 	return 0;
 }
+EXPORT_SYMBOL_GPL(prueth_prepare_rx_chan);
 
 void prueth_reset_tx_chan(struct prueth_emac *emac, int ch_num,
 			  bool free_skb)
@@ -946,6 +961,7 @@  void prueth_reset_tx_chan(struct prueth_emac *emac, int ch_num,
 		k3_udma_glue_disable_tx_chn(emac->tx_chns[i].tx_chn);
 	}
 }
+EXPORT_SYMBOL_GPL(prueth_reset_tx_chan);
 
 void prueth_reset_rx_chan(struct prueth_rx_chn *chn,
 			  int num_flows, bool disable)
@@ -958,11 +974,13 @@  void prueth_reset_rx_chan(struct prueth_rx_chn *chn,
 	if (disable)
 		k3_udma_glue_disable_rx_chn(chn->rx_chn);
 }
+EXPORT_SYMBOL_GPL(prueth_reset_rx_chan);
 
 void emac_ndo_tx_timeout(struct net_device *ndev, unsigned int txqueue)
 {
 	ndev->stats.tx_errors++;
 }
+EXPORT_SYMBOL_GPL(emac_ndo_tx_timeout);
 
 static int emac_set_ts_config(struct net_device *ndev, struct ifreq *ifr)
 {
@@ -1039,6 +1057,7 @@  int emac_ndo_ioctl(struct net_device *ndev, struct ifreq *ifr, int cmd)
 
 	return phy_do_ioctl(ndev, ifr, cmd);
 }
+EXPORT_SYMBOL_GPL(emac_ndo_ioctl);
 
 void emac_ndo_get_stats64(struct net_device *ndev,
 			  struct rtnl_link_stats64 *stats)
@@ -1060,6 +1079,7 @@  void emac_ndo_get_stats64(struct net_device *ndev,
 	stats->tx_errors  = ndev->stats.tx_errors;
 	stats->tx_dropped = ndev->stats.tx_dropped;
 }
+EXPORT_SYMBOL_GPL(emac_ndo_get_stats64);
 
 int emac_ndo_get_phys_port_name(struct net_device *ndev, char *name,
 				size_t len)
@@ -1073,6 +1093,7 @@  int emac_ndo_get_phys_port_name(struct net_device *ndev, char *name,
 
 	return 0;
 }
+EXPORT_SYMBOL_GPL(emac_ndo_get_phys_port_name);
 
 /* get emac_port corresponding to eth_node name */
 int prueth_node_port(struct device_node *eth_node)
@@ -1091,6 +1112,7 @@  int prueth_node_port(struct device_node *eth_node)
 	else
 		return PRUETH_PORT_INVALID;
 }
+EXPORT_SYMBOL_GPL(prueth_node_port);
 
 /* get MAC instance corresponding to eth_node name */
 int prueth_node_mac(struct device_node *eth_node)
@@ -1109,6 +1131,7 @@  int prueth_node_mac(struct device_node *eth_node)
 	else
 		return PRUETH_MAC_INVALID;
 }
+EXPORT_SYMBOL_GPL(prueth_node_mac);
 
 void prueth_netdev_exit(struct prueth *prueth,
 			struct device_node *eth_node)
@@ -1134,6 +1157,7 @@  void prueth_netdev_exit(struct prueth *prueth,
 	free_netdev(emac->ndev);
 	prueth->emac[mac] = NULL;
 }
+EXPORT_SYMBOL_GPL(prueth_netdev_exit);
 
 int prueth_get_cores(struct prueth *prueth, int slice, bool is_sr1)
 {
@@ -1184,6 +1208,7 @@  int prueth_get_cores(struct prueth *prueth, int slice, bool is_sr1)
 
 	return 0;
 }
+EXPORT_SYMBOL_GPL(prueth_get_cores);
 
 void prueth_put_cores(struct prueth *prueth, int slice)
 {
@@ -1196,6 +1221,7 @@  void prueth_put_cores(struct prueth *prueth, int slice)
 	if (prueth->pru[slice])
 		pru_rproc_put(prueth->pru[slice]);
 }
+EXPORT_SYMBOL_GPL(prueth_put_cores);
 
 #ifdef CONFIG_PM_SLEEP
 static int prueth_suspend(struct device *dev)
@@ -1252,3 +1278,9 @@  static int prueth_resume(struct device *dev)
 const struct dev_pm_ops prueth_dev_pm_ops = {
 	SET_SYSTEM_SLEEP_PM_OPS(prueth_suspend, prueth_resume)
 };
+EXPORT_SYMBOL_GPL(prueth_dev_pm_ops);
+
+MODULE_AUTHOR("Roger Quadros <rogerq@ti.com>");
+MODULE_AUTHOR("Md Danish Anwar <danishanwar@ti.com>");
+MODULE_DESCRIPTION("PRUSS ICSSG Ethernet Driver Common Module");
+MODULE_LICENSE("GPL");
diff --git a/drivers/net/ethernet/ti/icssg/icssg_config.c b/drivers/net/ethernet/ti/icssg/icssg_config.c
index 9444e56b7672..b8616c852156 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_config.c
+++ b/drivers/net/ethernet/ti/icssg/icssg_config.c
@@ -248,6 +248,7 @@  void icssg_config_ipg(struct prueth_emac *emac)
 
 	icssg_mii_update_ipg(prueth->mii_rt, slice, ipg);
 }
+EXPORT_SYMBOL_GPL(icssg_config_ipg);
 
 static void emac_r30_cmd_init(struct prueth_emac *emac)
 {
@@ -508,6 +509,7 @@  int icssg_config(struct prueth *prueth, struct prueth_emac *emac, int slice)
 
 	return 0;
 }
+EXPORT_SYMBOL_GPL(icssg_config);
 
 /* Bitmask for ICSSG r30 commands */
 static const struct icssg_r30_cmd emac_r32_bitmask[] = {
@@ -564,6 +566,7 @@  int emac_set_port_state(struct prueth_emac *emac,
 
 	return ret;
 }
+EXPORT_SYMBOL_GPL(emac_set_port_state);
 
 void icssg_config_half_duplex(struct prueth_emac *emac)
 {
@@ -575,6 +578,7 @@  void icssg_config_half_duplex(struct prueth_emac *emac)
 	val = get_random_u32();
 	writel(val, emac->dram.va + HD_RAND_SEED_OFFSET);
 }
+EXPORT_SYMBOL_GPL(icssg_config_half_duplex);
 
 void icssg_config_set_speed(struct prueth_emac *emac)
 {
@@ -601,6 +605,7 @@  void icssg_config_set_speed(struct prueth_emac *emac)
 
 	writeb(fw_speed, emac->dram.va + PORT_LINK_SPEED_OFFSET);
 }
+EXPORT_SYMBOL_GPL(icssg_config_set_speed);
 
 int icssg_send_fdb_msg(struct prueth_emac *emac, struct mgmt_cmd *cmd,
 		       struct mgmt_cmd_rsp *rsp)
@@ -635,6 +640,7 @@  int icssg_send_fdb_msg(struct prueth_emac *emac, struct mgmt_cmd *cmd,
 
 	return 0;
 }
+EXPORT_SYMBOL_GPL(icssg_send_fdb_msg);
 
 static void icssg_fdb_setup(struct prueth_emac *emac, struct mgmt_cmd *fdb_cmd,
 			    const unsigned char *addr, u8 fid, int cmd)
@@ -687,6 +693,7 @@  int icssg_fdb_add_del(struct prueth_emac *emac, const unsigned char *addr,
 
 	return -EINVAL;
 }
+EXPORT_SYMBOL_GPL(icssg_fdb_add_del);
 
 int icssg_fdb_lookup(struct prueth_emac *emac, const unsigned char *addr,
 		     u8 vid)
@@ -716,6 +723,7 @@  int icssg_fdb_lookup(struct prueth_emac *emac, const unsigned char *addr,
 
 	return 0;
 }
+EXPORT_SYMBOL_GPL(icssg_fdb_lookup);
 
 void icssg_vtbl_modify(struct prueth_emac *emac, u8 vid, u8 port_mask,
 		       u8 untag_mask, bool add)
@@ -741,6 +749,7 @@  void icssg_vtbl_modify(struct prueth_emac *emac, u8 vid, u8 port_mask,
 
 	tbl[vid].fid_c1 = fid_c1;
 }
+EXPORT_SYMBOL_GPL(icssg_vtbl_modify);
 
 u16 icssg_get_pvid(struct prueth_emac *emac)
 {
@@ -756,6 +765,7 @@  u16 icssg_get_pvid(struct prueth_emac *emac)
 
 	return pvid;
 }
+EXPORT_SYMBOL_GPL(icssg_get_pvid);
 
 void icssg_set_pvid(struct prueth *prueth, u8 vid, u8 port)
 {
@@ -771,3 +781,4 @@  void icssg_set_pvid(struct prueth *prueth, u8 vid, u8 port)
 	else
 		writel(pvid, prueth->shram.va + EMAC_ICSSG_SWITCH_PORT0_DEFAULT_VLAN_OFFSET);
 }
+EXPORT_SYMBOL_GPL(icssg_set_pvid);
diff --git a/drivers/net/ethernet/ti/icssg/icssg_ethtool.c b/drivers/net/ethernet/ti/icssg/icssg_ethtool.c
index c8d0f45cc5b1..131eb4cae1c3 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_ethtool.c
+++ b/drivers/net/ethernet/ti/icssg/icssg_ethtool.c
@@ -312,3 +312,4 @@  const struct ethtool_ops icssg_ethtool_ops = {
 	.nway_reset = emac_nway_reset,
 	.get_rmon_stats = emac_get_rmon_stats,
 };
+EXPORT_SYMBOL_GPL(icssg_ethtool_ops);
diff --git a/drivers/net/ethernet/ti/icssg/icssg_mii_cfg.c b/drivers/net/ethernet/ti/icssg/icssg_mii_cfg.c
index 92718ae40d7e..b64955438bb2 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_mii_cfg.c
+++ b/drivers/net/ethernet/ti/icssg/icssg_mii_cfg.c
@@ -40,6 +40,7 @@  void icssg_mii_update_mtu(struct regmap *mii_rt, int mii, int mtu)
 				   (mtu - 1) << PRUSS_MII_RT_RX_FRMS_MAX_FRM_SHIFT);
 	}
 }
+EXPORT_SYMBOL_GPL(icssg_mii_update_mtu);
 
 void icssg_update_rgmii_cfg(struct regmap *miig_rt, struct prueth_emac *emac)
 {
@@ -66,6 +67,7 @@  void icssg_update_rgmii_cfg(struct regmap *miig_rt, struct prueth_emac *emac)
 	regmap_update_bits(miig_rt, RGMII_CFG_OFFSET, full_duplex_mask,
 			   full_duplex_val);
 }
+EXPORT_SYMBOL_GPL(icssg_update_rgmii_cfg);
 
 void icssg_miig_set_interface_mode(struct regmap *miig_rt, int mii, phy_interface_t phy_if)
 {
@@ -105,6 +107,7 @@  u32 icssg_rgmii_get_speed(struct regmap *miig_rt, int mii)
 
 	return icssg_rgmii_cfg_get_bitfield(miig_rt, mask, shift);
 }
+EXPORT_SYMBOL_GPL(icssg_rgmii_get_speed);
 
 u32 icssg_rgmii_get_fullduplex(struct regmap *miig_rt, int mii)
 {
@@ -118,3 +121,4 @@  u32 icssg_rgmii_get_fullduplex(struct regmap *miig_rt, int mii)
 
 	return icssg_rgmii_cfg_get_bitfield(miig_rt, mask, shift);
 }
+EXPORT_SYMBOL_GPL(icssg_rgmii_get_fullduplex);
diff --git a/drivers/net/ethernet/ti/icssg/icssg_queues.c b/drivers/net/ethernet/ti/icssg/icssg_queues.c
index 3c34f61ad40b..e5052d9e7807 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_queues.c
+++ b/drivers/net/ethernet/ti/icssg/icssg_queues.c
@@ -28,6 +28,7 @@  int icssg_queue_pop(struct prueth *prueth, u8 queue)
 
 	return val;
 }
+EXPORT_SYMBOL_GPL(icssg_queue_pop);
 
 void icssg_queue_push(struct prueth *prueth, int queue, u16 addr)
 {
@@ -36,6 +37,7 @@  void icssg_queue_push(struct prueth *prueth, int queue, u16 addr)
 
 	regmap_write(prueth->miig_rt, ICSSG_QUEUE_OFFSET + 4 * queue, addr);
 }
+EXPORT_SYMBOL_GPL(icssg_queue_push);
 
 u32 icssg_queue_level(struct prueth *prueth, int queue)
 {
diff --git a/drivers/net/ethernet/ti/icssg/icssg_stats.c b/drivers/net/ethernet/ti/icssg/icssg_stats.c
index 3dbadddd7e35..fa071b4b27c5 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_stats.c
+++ b/drivers/net/ethernet/ti/icssg/icssg_stats.c
@@ -51,6 +51,7 @@  void emac_stats_work_handler(struct work_struct *work)
 	queue_delayed_work(system_long_wq, &emac->stats_work,
 			   msecs_to_jiffies((STATS_TIME_LIMIT_1G_MS * 1000) / emac->speed));
 }
+EXPORT_SYMBOL_GPL(emac_stats_work_handler);
 
 int emac_get_stat_by_name(struct prueth_emac *emac, char *stat_name)
 {