三 Linux 网络驱动-MAC、PHY层驱动框架( 四 )

< 0) {76pdata = http://www.kingceram.com/post/dev_get_platdata(&pdev->dev);77if (pdata)78fep->phy_interface = pdata->phy;79else80fep->phy_interface = PHY_INTERFACE_MODE_MII;81} else {82fep->phy_interface = ret;83}84 85fep->clk_ipg = devm_clk_get(&pdev->dev, "ipg");86if (IS_ERR(fep->clk_ipg)) {87ret = PTR_ERR(fep->clk_ipg);88goto failed_clk;89}90 91fep->clk_ahb = devm_clk_get(&pdev->dev, "ahb");92if (IS_ERR(fep->clk_ahb)) {93ret = PTR_ERR(fep->clk_ahb);94goto failed_clk;95}96 97fep->itr_clk_rate = clk_get_rate(fep->clk_ahb);98 99/* enet_out is optional, depends on board */100fep->clk_enet_out = devm_clk_get(&pdev->dev, "enet_out");101if (IS_ERR(fep->clk_enet_out))102fep->clk_enet_out = NULL;103104fep->ptp_clk_on = false;105mutex_init(&fep->ptp_clk_mutex);106107/* clk_ref is optional, depends on board */108fep->clk_ref = devm_clk_get(&pdev->dev, "enet_clk_ref");109if (IS_ERR(fep->clk_ref))110fep->clk_ref = NULL;111112fep->bufdesc_ex = fep->quirks & FEC_QUIRK_HAS_BUFDESC_EX;113fep->clk_ptp = devm_clk_get(&pdev->dev, "ptp");114if (IS_ERR(fep->clk_ptp)) {115fep->clk_ptp = NULL;116fep->bufdesc_ex = false;117}118119pm_runtime_enable(&pdev->dev);120ret = fec_enet_clk_enable(ndev, true);121if (ret)122goto failed_clk;123124fep->reg_phy = devm_regulator_get(&pdev->dev, "phy");125if (!IS_ERR(fep->reg_phy)) {126ret = regulator_enable(fep->reg_phy);127if (ret) {128dev_err(&pdev->dev,129"Failed to enable phy regulator: %d\n", ret);130goto failed_regulator;131}132 } else {133fep->reg_phy = NULL;134 }135136fec_reset_phy(pdev);137138if (fep->bufdesc_ex)139fec_ptp_init(pdev);140141ret = fec_enet_init(ndev);142if (ret)143goto failed_init;144145for (i = 0; i < FEC_IRQ_NUM; i++) {146irq = platform_get_irq(pdev, i);147if (irq < 0) {148if (i)149break;150ret = irq;151goto failed_irq;152}153ret = devm_request_irq(&pdev->dev, irq, fec_enet_interrupt,1540, pdev->name, ndev);155if (ret)156goto failed_irq;157158fep->irq[i] = irq;159}160161ret = of_property_read_u32(np, "fsl,wakeup_irq", &irq);162if (!ret && irq < FEC_IRQ_NUM)163fep->wake_irq = fep->irq[irq];164else165fep->wake_irq = fep->irq[0];166167init_completion(&fep->mdio_done);168ret = fec_enet_mii_init(pdev);169if (ret)170goto failed_mii_init;171172/* Carrier starts down, phylib will bring it up */173netif_carrier_off(ndev);174fec_enet_clk_enable(ndev, false);175pinctrl_pm_select_sleep_state(&pdev->dev);176177ret = register_netdev(ndev);178if (ret)179goto failed_register;180181device_init_wakeup(&ndev->dev, fep->wol_flag &182FEC_WOL_HAS_MAGIC_PACKET);183184if (fep->bufdesc_ex && fep->ptp_clock)185netdev_info(ndev, "registered PHC device %d\n", fep->dev_id);186187fep->rx_copybreak = COPYBREAK_DEFAULT;188INIT_WORK(&fep->tx_timeout_work, fec_enet_timeout_work);189return 0;......206return ret;207 }
第 14 行 , 使用 um 函数来获取设备树中的“fsl,num-tx-”和 “fsl,num-rx-”这两个属性值 , 也就是发送队列和接收队列的大小 , 设备树中这两个属性 都设置为 1 。
第 17 行 , 使用函数申请。
第 25 行 , 获取中私有数据内存首地址 ,  中的私有数据用来存放 I. 网络设备结构体 , 此结构体为。
第 30 行 , 接下来所有以“fep->”开头的代码行就是初始化网络设备结构体各个成员变量 ,  结构体类型为  , 这个结构体是 NXP 自己定义的 。
第 45 行 , 获取设备树中 I. 网络外设(ENET)相关寄存器起始地址 , ENET1 的寄存 器起始地址  , ENET2 的寄存器起始地址。
第 46 行 , 对第 45 行获取到的地址做虚拟地址转换 , 转换后的 ENET 虚拟寄存器起始地址 保存在 fep 的 hwp 成员中 。
第 57 行 , 使用函数解析设备树中关于 ENET 的停止模式属性 值 , 属性名字为“stop-mode” , 我们没有用到 。
第 59 行 , 从设备树查找“fsl,magic-”属性是否存在 , 如果存在的话就说明有魔术包 ,  有魔术包的话就将 fep 的成员与 CKET 进行或运算 , 也 就是在中做登记 , 登记支持魔术包 。