NanoPC-T2 以太网分析(3)

本章节用来介绍stmmac_dvr_probe函数过程。

函数一开始就调用nxp_plat_initialize函数对MAC IP核复位、PHY复位、MAC IP核用到的时钟进行初始化,但是这部分做的事情跟注册MAC设备的时候nxpmac_init做的事情完全一样,所以这个函数做的事情就不再进行详细的介绍。

紧接着申请stmmac_priv类型的变量,并对它进行各种的赋值。

接下来最重要的是调用stmmac_hw_init函数,在stmmac_hw_init函数中比较重要的是调用dwmac1000_setup,并在内存中申请了一个mac_device_info类型的变量,并对其赋值,重要的是以下两个赋值。

mac->mac = &dwmac1000_ops;
mac->dma = &dwmac1000_dma_ops;

在dwmac1000_ops变量中,存在一个core_init成员,这个函数指针是用来初始化S5P4418 SOC中的MAC IP核的,host_irq_status成员函数指针是中断处理函数,比如插入和拔掉网线,会执行host_irq_status函数指针指向的函数dwmac1000_irq_status。经过层层追踪,发现在nxpmac_hw_setup调用dwmac1000_ops以及dwmac1000_dma_ops注册的函数,进行初始化MAC 以及 DMA的操作。而nxpmac_hw_setup是被stmmac_open以及stmmac_resume函数中调用。


在dwmac1000_setup调用完成后,stmmac_hw_init做的其他事情不怎么重要,就不再讲述该函数其他部分。

返回到stmmac_dvr_probe后,接着会为网络设备注册打开、关闭、开始传输、结束传输等操作。

ndev->netdev_ops = &stmmac_netdev_ops;

static const struct net_device_ops stmmac_netdev_ops = {
.ndo_open = stmmac_open,
.ndo_start_xmit = stmmac_xmit,
.ndo_stop = stmmac_release,
.ndo_change_mtu = stmmac_change_mtu,
.ndo_fix_features = stmmac_fix_features,
.ndo_set_rx_mode = stmmac_set_rx_mode,
.ndo_tx_timeout = stmmac_tx_timeout,
.ndo_do_ioctl = stmmac_ioctl,
.ndo_set_config = stmmac_config,
#ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = stmmac_poll_controller,
#endif
.ndo_set_mac_address = eth_mac_addr,
};

最后调用ret = stmmac_mdio_register(ndev)注册MAC与PHY之间的总线。

你可能感兴趣的:(NanoPC-T2 以太网分析(3))