Re: [PATCH v8 1/2] net: mhi: Enable Ethernet interface support

vivek pernamitta <[email protected]> Mon, 23 Mar 2026 11:41:26 +0530
Newsgroups dev.linux.lists.mhi,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-kernel,org.kernel.vger.netdev
Message-ID <[email protected]>

On 3/6/2026 11:24 AM, Manivannan Sadhasivam wrote:
> On Thu, Feb 12, 2026 at 04:30:22PM +0530, Vivek Pernamitta wrote:
>> From: Vivek Pernamitta <[email protected]>
>>
>> Add support to configure a new client as Ethernet type over MHI by
>> setting "mhi_device_info.ethernet_if = true". Create a new Ethernet
>> interface named eth%d. This complements existing NET driver support.
>>
>> Allocate MHI netdevs using NET_NAME_ENUM to reflect kernel-enumerated
>> naming. This updates the reported name_assign_type for MHI net
>> interfaces created by this driver, aligning naming semantics across
>> existing and new devices. No functional or interface naming changes
>> are introduced
>>
>> Introduce IP_SW1, ETH0, and ETH1 network interfaces required for
> 
> IP_SW1 is not related to this patch.
Will create an new patch for IP_SW1 alone in the same series.
> 
>> M-plane, NETCONF, and S-plane components.
>>
> 
> The main thing you want to describe in description is that IP_ETH channels are
> representing the Ethernet interface of the MHI device for which the driver is
> also creating the netdev interface so that the host can access the Ethernet
> interface of the device.
Will add this information in commit message.
> 
>> M-plane:
>> Implement DU M-Plane software for non-real-time O-RAN management
>> between O-DU and O-RU using NETCONF/YANG and O-RAN WG4 M-Plane YANG
>> models. Provide capability exchange, configuration management,
>> performance monitoring, and fault management per O-RAN.WG4.TS.MP.0-
>> R004-v18.00.
>>
>> NETCONF:
>> Use NETCONF protocol for configuration operations such as fetching,
>> modifying, and deleting network device configurations.
>>
>> S-plane:
>> Support frequency and time synchronization between O-DUs and O-RUs
>> using Synchronous Ethernet and IEEE 1588. Assume PTP transport over
>> L2 Ethernet (ITU-T G.8275.1) for full timing support; allow PTP over
>> UDP/IP (ITU-T G.8275.2) with reduced reliability. as per ORAN spec
>> O-RAN.WG4.CUS.0-R003-v12.00.
>>
>> Signed-off-by: Vivek Pernamitta <[email protected]>
>> ---
>>   drivers/net/mhi_net.c | 67 ++++++++++++++++++++++++++++++++++++++++++---------
>>   1 file changed, 56 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/net/mhi_net.c b/drivers/net/mhi_net.c
>> index ae169929a9d8e449b5a427993abf68e8d032fae2..aa65b267d5c06c76482eaede097c500edc1cdf7f 100644
>> --- a/drivers/net/mhi_net.c
>> +++ b/drivers/net/mhi_net.c
>> @@ -4,6 +4,7 @@
>>    * Copyright (C) 2020 Linaro Ltd <[email protected]>
>>    */
>>   
>> +#include <linux/etherdevice.h>
>>   #include <linux/if_arp.h>
>>   #include <linux/mhi.h>
>>   #include <linux/mod_devicetable.h>
>> @@ -42,6 +43,7 @@ struct mhi_net_dev {
>>   
>>   struct mhi_device_info {
>>   	const char *netname;
>> +	bool ethernet_if;
>>   };
>>   
>>   static int mhi_ndo_open(struct net_device *ndev)
>> @@ -119,11 +121,29 @@ static void mhi_ndo_get_stats64(struct net_device *ndev,
>>   	} while (u64_stats_fetch_retry(&mhi_netdev->stats.tx_syncp, start));
>>   }
>>   
>> +static int mhi_mac_address(struct net_device *dev, void *p)
>> +{
>> +	if (dev->type == ARPHRD_ETHER)
>> +		return eth_mac_addr(dev, p);
>> +
>> +	return 0;
>> +}
>> +
>> +static int mhi_validate_address(struct net_device *dev)
>> +{
>> +	if (dev->type == ARPHRD_ETHER)
>> +		return eth_validate_addr(dev);
>> +
>> +	return 0;
>> +}
>> +
>>   static const struct net_device_ops mhi_netdev_ops = {
>>   	.ndo_open               = mhi_ndo_open,
>>   	.ndo_stop               = mhi_ndo_stop,
>>   	.ndo_start_xmit         = mhi_ndo_xmit,
>>   	.ndo_get_stats64	= mhi_ndo_get_stats64,
>> +	.ndo_set_mac_address    = mhi_mac_address,
>> +	.ndo_validate_addr      = mhi_validate_address,
>>   };
>>   
>>   static void mhi_net_setup(struct net_device *ndev)
>> @@ -140,6 +160,13 @@ static void mhi_net_setup(struct net_device *ndev)
>>   	ndev->tx_queue_len = 1000;
>>   }
>>   
>> +static void mhi_ethernet_setup(struct net_device *ndev)
>> +{
>> +	ndev->netdev_ops = &mhi_netdev_ops;
>> +	ether_setup(ndev);
>> +	ndev->max_mtu = ETH_MAX_MTU;
>> +}
>> +
>>   static struct sk_buff *mhi_net_skb_agg(struct mhi_net_dev *mhi_netdev,
>>   				       struct sk_buff *skb)
>>   {
>> @@ -209,16 +236,20 @@ static void mhi_net_dl_callback(struct mhi_device *mhi_dev,
>>   			mhi_netdev->skbagg_head = NULL;
>>   		}
>>   
>> -		switch (skb->data[0] & 0xf0) {
>> -		case 0x40:
>> -			skb->protocol = htons(ETH_P_IP);
>> -			break;
>> -		case 0x60:
>> -			skb->protocol = htons(ETH_P_IPV6);
>> -			break;
>> -		default:
>> -			skb->protocol = htons(ETH_P_MAP);
>> -			break;
>> +		if (!!mhi_netdev->ndev->header_ops) {
> 
> Why not just if (mhi_netdev->ndev->header_ops)?
sure , will make changes accordingly.

> 
> But you should really check ARPHRD_ETHER type here and below.
Sure, Will add an check for ARPHRD_ETHER type before assigning protocol.

> 
>> +			skb->protocol = eth_type_trans(skb, mhi_netdev->ndev);
>> +		} else {
>> +			switch (skb->data[0] & 0xf0) {
>> +			case 0x40:
>> +				skb->protocol = htons(ETH_P_IP);
>> +				break;
>> +			case 0x60:
>> +				skb->protocol = htons(ETH_P_IPV6);
>> +				break;
>> +			default:
>> +				skb->protocol = htons(ETH_P_MAP);
>> +				break;
>> +			}
>>   		}
>>   
>>   		u64_stats_update_begin(&mhi_netdev->stats.rx_syncp);
>> @@ -306,6 +337,9 @@ static int mhi_net_newlink(struct mhi_device *mhi_dev, struct net_device *ndev)
>>   	struct mhi_net_dev *mhi_netdev;
>>   	int err;
>>   
>> +	if (!!ndev->header_ops)
>> +		eth_hw_addr_random(ndev);
>> +
>>   	mhi_netdev = netdev_priv(ndev);
>>   
>>   	dev_set_drvdata(&mhi_dev->dev, mhi_netdev);
>> @@ -356,7 +390,8 @@ static int mhi_net_probe(struct mhi_device *mhi_dev,
>>   	int err;
>>   
>>   	ndev = alloc_netdev(sizeof(struct mhi_net_dev), info->netname,
>> -			    NET_NAME_PREDICTABLE, mhi_net_setup);
>> +			    NET_NAME_ENUM, info->ethernet_if ?
>> +			    mhi_ethernet_setup : mhi_net_setup);
>>   	if (!ndev)
>>   		return -ENOMEM;
>>   
>> @@ -380,10 +415,17 @@ static void mhi_net_remove(struct mhi_device *mhi_dev)
>>   
>>   static const struct mhi_device_info mhi_hwip0 = {
>>   	.netname = "mhi_hwip%d",
>> +	.ethernet_if = false,
> 
> Default state is false isn't it? No need to set it explicitly.\
> 
> - Mani
> 
ok, will make changes in next patchset.