关于LS1043A ioctl SIOCSMIIREG等命令读写PHY 返回 -EINVAL 的问题

前言

关于,在LS1043A处理器下,使用NXP提供的LSDK的内核启动系统,当打算在应用层通过编程读写PHY的寄存器的时候,使用 ioctl 命令会失败返回 -EINVAL即 -22,有很大可能是本文提到的情况。

  • 内核版本 linux5_10

详情

  • 首先,关于LS1043A的驱动代码,无论配置是dpaa还是sdk_dpaa, dpaa 使用的是

drivers\net\ethernet\freescale\dpaa\dpaa_eth.c

sdk_dpaa 使用的是

drivers\net\ethernet\freescale\sdk_dpaa\dpaa_eth.c

,两者均是同一种情况;

  • 以 dpaa 为例,ioctl 会调用驱动中的 net_device_ops 结构体中的 dpaa_ioctl
static const struct net_device_ops dpaa_ops = {
	.ndo_open = dpaa_open,
	.ndo_start_xmit = dpaa_start_xmit,
	.ndo_stop = dpaa_eth_stop,
	.ndo_tx_timeout = dpaa_tx_timeout,
	.ndo_get_stats64 = dpaa_get_stats64,
	.ndo_change_carrier = fixed_phy_change_carrier,
	.ndo_set_mac_address = dpaa_set_mac_address,
	.ndo_validate_addr = eth_validate_addr,
	.ndo_set_rx_mode = dpaa_set_rx_mode,
	.ndo_do_ioctl = dpaa_ioctl,
	.ndo_setup_tc = dpaa_setup_tc,
};
  • 查看 dpaa_ioctl 函数:
static int dpaa_ioctl(struct net_device *net_dev, struct ifreq *rq, int cmd)
{
	int ret = -EINVAL;

	if (cmd == SIOCGMIIREG) {
		if (net_dev->phydev)
			return phy_mii_ioctl(net_dev->phydev, rq, cmd);
	}

	if (cmd == SIOCSHWTSTAMP)
		return dpaa_ts_ioctl(net_dev, rq, cmd);

	return ret;
}
由此函数知,只有在 cmd == SIOCGMIIREG 或者 SIOCSHWTSTAMP 的时候才会处理,其他命令均返回错误,这就是原因。解决办法就是,一在驱动中配置PHY寄存器,二修改此处的内核驱动文件即可。
static int dpaa_ioctl(struct net_device *net_dev, struct ifreq *rq, int cmd)
{
	int ret = -EINVAL;

	//if (cmd == SIOCGMIIREG) 
	{
		if (net_dev->phydev)
			return phy_mii_ioctl(net_dev->phydev, rq, cmd);
	}

	if (cmd == SIOCSHWTSTAMP)
		return dpaa_ts_ioctl(net_dev, rq, cmd);

	return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Call Me Gavyn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值