工具/软件:Linux
您好,
我们将系统移至TI DP8.3867万IR PHY,我似乎遇到了配置问题。 我正在寻找一些帮助来验证我的PHY是否按预期工作。 我的最终目标是解决从DHCP服务器获取IP失败的问题。 我认为这个问题与我无法正确接收数据有关。 此故障仅在Linux中出现。 详情如下。 (MAC地址被故意隐藏)
问题:
正在发送发现...
正在发送发现...
没有租约,放弃了背景
输出:
此输出显示系统能够通过DHCP获取地址,下载引导映像以及从u-boot成功引导目标。
U-Boot 2015.07
gem.e000b000:12连接到gem.e000b000。 正在重新连接到Gem。e000b000
gem.e000b000正在等待PHY自动协商完成.......完成
BOOTP广播1
BOOTP广播2
DHCP客户端绑定到地址XXX.XXX.XXX.XXX 6 (547毫秒)
U-boot>引导
gem.e000b000正在等待PHY自动协商完成.......完成
使用Gem.e000b000设备
TFTP来自服务器10.10 .0.2 ;我们的IP地址是10.10 .0.1
文件名'myfile'。
加载地址:0x3e0万
正在加载:T ######################################################################.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#..
######################################################
######################################################
######################################################
######################################################
######################################################
######################################################
######################################################
######################################################
######################################################
###########
1.3 MIB/s
完成
此输出显示MAC和PHY已在系统中正确注册。 我使用的是4.0 内核中的dp8.3867万驱动程序。
[ 1.29.2814万 ] macb e000b000.ethernet eth0:cadence GEM rev 0x2.0118万 at 0xe000b000 IRQ 148 (XX:XX:XX:XX:XX:XX)
[ PHY] macb e000b000.ethernet eth0:连接的1.30.2722万 驱动程序[TI DP8.3867万](MII_bus:phy_addr=e000b000.etherne:0c, IRQ=-1)
此输出显示已创建接口,但无法通过DHCP获取IP地址。
root@root# ifconfig
Eth0链路加密:以太网HWaddr XX:XX:XX:XX:XX
运行多播MTU的UP广播:1500度量:1
Rx数据包:0错误:0丢弃:0溢出:0帧:0
Tx数据包:8错误:0已丢弃:0溢出:0运营商:0
冲突:0 queutxelen:1000
RX字节:0 (0.0 B) TX字节:2736 (2.6 KiB)
中断:148基本地址:0xb000
此输出显示有关PHY和链路状态的信息。
root@root# mII-tool -v
ETH0:协商的1000BaseT- FD流控制,链路正常
产品信息:供应商08:00:28,型号35 rev 1
基本模式:自动协商已启用
基本状态:自动协商完成,链路正常
功能:1000BaseT-HD 1000BaseT-FD 100BaseTX-FD 100BaseTX-HD 10baseT-FD 10baseT-HD
广告:1000BaseT-FD 100BaseTX-FD 100BaseTX-HD 10baseT-FD 10baseT-HD
链接合作伙伴:1000BaseT-HD 1000BaseT-FD 100BaseTX-FD 100BaseTX-HD 10baseT-FD 10baseT-HD流量控制
root@root
此输出显示有关事务/数据包的信息。 我认为该问题以红色突出显示。 这让我相信我只是在处理系统RX的计时问题。
root@root# ethtool -S eth0
NIC统计信息:
TX_八 位字节:42.8148万
TX_frames:6641
TX_BROADCAST_FRAMES:14
TX_multicast_frames:0
TX_PAUSE_FRAMES:0
TX_64_byte_frames:6629
TX_65_127_Byte_frames:1.
TX_128_255_Byte_frames:0
TX_256_511_BYTE_FRAMES:11
TX_512_1023_byte_frames:0
TX_1024_1518_byte_frames:1518:0
TX_greater大于1518_Byte_frames:0
TX_欠载运行:0
TX_singLE_collision_frames:0
tx_multiple_collision_frames:0
TX_exital_collisions:0
TX_LATE_Collisions:0
TX_延期 帧:0
TX_CARRER_SENSE错误:0
RX_八 位字节:1006.5099万
Rx_frames:6721
Rx_broadcast_frames:93
RX_multicast_frames:0
Rx_pause_frames:0
RX_64_Byte_frames:54
RX_65_127_Byte_frames:29
RX_128_255_byte_frames:6.
RX_256_511_Byte_frames:7
RX_512_1023_byte_frames:1.
RX_1024_1518_byte_frames:1518:6624
RX_Greate_Than 1518_Byte_frames:0
RX_undesized帧数:0
RX_USATMEL_FRAMES:0
Rx_jabbers:0
Rx_frame_check_sequence_errors:0
Rx_length_ffield_frame_errors:0
Rx_symbol_errors:0
RX_alignation_errors:0
Rx_resource_errors:0
Rx_溢出:0
RX_IP_HEADER_checksum_errors:0
RX_tcp_checksum_errors:0
RX_UDP_checksum_errors:0
root@root#
如果我手动为eth0接口分配IP地址,我就可以查看来自设备的ARP广播。 此外,如果我ping,我会看到使用数据包分析器(Wireshark )的请求和回复。 我的问题是我的系统看不到回复。
root@root:~# ping 10.10 .0.2
Ping 10.10 .0.2 (10.10 .0.2):56个数据字节
^C
-- 10.10 .0.2 ping统计数据--
传输28个数据包,接收0个数据包,100 % 数据包丢失
根@根:~#
PHY寄存器设置。 我尝试将寄存器0x86修改为不同的值以调整Rx/TX计时,但没有运气。 寄存器的工作方式就像RO一样,而它应该是RW吗?
| 0x00 | 0x1140 |
| 0x01 | 0x796d |
| 0x02 | 0x2000 |
| 0x03 | 0xa231 |
| 0x04 | 0x01e1 |
| 0x05 | 0xc5e1 |
| 0x09 | 0x0300 |
| 0x0A | 0x3800 |
| 0x10 | 0x5048 |
| 0x11 | 0xbc02 |
| 0x14 | 0x29c7 |
| 0x1E | 0x0002 |
| 0x32 | 0x0000 |
| 0x6e | 0x00a8. |
| 0x86 | 0x006d |
具有调试打印件的TI DP8.3867万驱动程序
/*
*用于Texas Instruments DP8.3867万 PHY的驱动程序
*
版权所有(C) 2015 Texas Instruments Inc.
*
*此程序是免费软件;您可以根据
* Free Software Foundation发布的GNU通用公共许可证的条款重新分发和/或修改*它; 许可证的版本2。
*
*发布本程序的目的是希望它能发挥作用
,*但不作任何保证;甚至不作
*适销性或特定用途适用性的暗示保证。 有关
详细信息,请参阅* GNU通用公共许可证。
*/
#include <linux/ethtool.h>
#include <linux/kernel.h>
#include
<linux/module.h>
#include <linux/of_h>
#include <linux/phy.h>
#include <linux/phy.h>#include <dt-bindings/net/ti-dp8.3867万.h>#define DP867_DP8PH67#define
DP8DP832#DP8DP1810_DP338PH_DP1810#DP338PH_DP1810#DP338PH_DR_DP338PH338120</s>1810 181033.812万
MICR中断位*/
#define MII_DP8.3867万_MICR_AN_ERR_INT_EN 位(15)
#define MII_DP8.3867万_MICR_SPEED CHNG_INT_EN 位(14)
#define MII_DP8.3867万_MIC_DP8_INT_BI_DP867_INT_BI_DEFALTE_MI38M38_MIC_MIC_DP8_MIC_MIC_DP7_MIC_MIC_MIC_MIC_MI_MIC_MI_MIC_DP8_MI_MI_MIC_MIC_MIC_MIC_MIC_MI_MI_MI_MI_MI_MI_867_MI_MI_MI_MI_BI_BI_DELBRO_MI_DEBRO_MI_MI_MI38_MI_MI38_MI_MI_MI_MI_867_MI_MI_MI_MI_MI_MI_MI_DEL_MI_MI_MI_MI_MI_MI_MI38_MI_MI38_MI_MI_MI_MI_MI_MI_MI_MI_867_BI_BI_BI_
/* PHY CTRL Bits */
#define DP8.3867万_PHYCR_FIFO_DEPTY_SHIFE 14
#define DP8.3867万_MDI_crossover 5
#define DP8.3867万_MDI_Crossing_Auto 1
/* RGMIIDCTL位*/
#define DP8.3867万_RGMII_TX_CLK_DELAY_SHIFT 4
结构dp8.3867万_private {
int rx_id_delay;
int tx_id_delay;
int fifo_depth;
};
静态int dp8.3867万_ack_interrupt (struct statut_device *phydev)
{ int r_dev_return
<_diphiph = 0; r_diphiphiph; r_status_diphiphiph = r_r_r_diphiphiph; r_status_int_diphiphiphiph; r_int_status_diph
= r_diph =
如果(phydev->interrupts == PHY_ENABLED){
MICR_STATUS = phy_read (phydev,MII_DP8.3867万_MICR);
如果(MICR_STATUS < 0)
返回MICR_STATUS;
MICR_STATUS |=(MII_DP8.3867万_MIC_MIC_INT_PHY_INT_DP3867_EN
|3867 |
MIC_MIC_MIC_DI_DI_DI_DI38r_DI_DI_DI_DI3867_DI_DI_DI_DI_DI_DIB_DIB_DI3867_DEF_DIB_DI_DI3867_DI_DIB_DI_DI_DI3867_DIB_DIB_DIB_DIB_DI_DIB_DIB_DIB_DIB_DIB_DIB_DI3867_DI38_DI_DI_DIB_DIB_DIB_DI3867_DIB_DI_DI_DIB_DIB_DIB_DIB_DI3867_DI_DI38_DIB_DIB_DIB_DIB_DI38</s>3867 38673867386738673867
struct device *dev =&phydev->dev;
struct device_node *of_node = dev->of_node;
int ret;
if (!of_node &&dev->parent->of_node)
of_node = dev->parent->of_node = dev->of_node;
if (!phydev->dev.of_node)
返回-ENDEFip_DET,
parit_8ip_DEP32; parit_DET, parit_DET, parit_DET, parit_DEP67_DET, parit_DEP32; parit_DEDIDEPART, parit_DEP32; parit_DEDIDEPART, parit_DEPART_DEPART, parit_DEP32, parit_DEP38DE38DEP38DE, parit_DEPART, parit_DEP38DE, parit_DE38DE38DE, parit_DET
#else
static int dp8.3867万_of_init(struct phy_device *phydev)
{
return 0;
}
#endif /* config_of_mdio */
static int dp8.3867万_config_init(sizt phy_device *pydev)
{
struct dp8.3867万_priv*dp83867;
int8.3867万 int ret;
int ret; ustruct py, pydev-{sizt
pref, sizt=8.3867万_dev)
gfp_kernel);
if (!dp8.3867万)
返回-ENOMEM;
phydev->priv= dp8.3867万;
ret = dp8.3867万_of_init(pydev);
if (ret)
返回ret;
} else {
dp8.3867万=(struct dp8.3867万_private *)phydev->priv;
}
printk ("phy fifo depth %x\n",dp8.3867万->fifo_depth);
if (phy_interface_is_RGMII (phydev)){
ret = phy_write (phyret,MII_DP8.3867万_PHYCTRL,
DP8.3867万_TRIP_AUTO<< DP8.3867万_PHYDEF_DI_DI_DEPTH <);
p_8gf_1_p_p_1_1g_p_p_1f_p_p_<)
;<podrgf_<) p_p_1_1_<p_<p_<) p_p_<p_<p_<p_<podrgf_<= p_<p_<p_<) print_<p_<p_<p_<= p_<p<= p<= p<) print_p<= p<p_
(phydev->接口<= PHY_INTERFACE_MODE_RGMII_RXID){
val = phy_read_MMD_INDIRECT (phydev,DP8.3867万_RGMIICCL,
DP8.3867万_DEVADDR, phydev->addr);
printk ("old reg 0x32 val:%x\n",val);
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
val ||(DP8.3867万_RGMII_TX_CLK_DELAY _EN | DP8.3867万_RGMII_RDEF_CLIM_CLIM_R67_DP8_CLIM_RDEF_CLIM_CLIM_8_CLIM_CDIRECT_DR_DP38DEF_CLIM_CLIM_C_8_CLIM_I=
DP8.3867万_DEVADDR, phydev->addr, val);
printk ("DTS Rx id Delay %x\n",dp8.3867万->rx_id_delay);
printk ("DTS TX id delay %x\n",dp8.3867万->TX_id_delay);
Delay =(dp8.3867万->Rx_id_delay |
(dp8.3867万->TX_id_delay << DP8.3867万_RGMII_TX_CLK_Delay_shift));
printk ("Delay %x\n",delay);
phy_write_MMD_indirect (phydev,DP8.3867万_RGMIIDCTL,
DP8.3867万_DEVADDR,phydev->addr,delay);
val = phy_read_MMD_indirect (phydev,DP8.3867万_RGMIICCL,
DP8.3867万_DEVADDR, phydev->addr);
printk ("新reg 0x32 val:%x\n",val);
val = phy_read_md_indirect (phydev,DP8.3867万_RGMIIDCTL,
DP8.3867万_DEVADDR, phydev->addr);
printk (“new reg 0x86 val:%x\n",val);
}
返回0;
}
静态int dp8.3867万_phy_reset (struct phy_device *phydev)
{
int err;
err = phy_write(pydev, DP8.3867万_CTRL, DP8.3867万_SW_reset);
如果(错误<0)
返回错误;
printk ("phy reset ... succeed\n");
return dp8.3867万_config_init(pydev);
}
静态结构phy_driver dp8.3867万_driver[]={
.phy_id = DP8.3867万_phy_ID,
.phy_id_mask = 0xfffffff0,
.name ="TI DP8.3867万_driver dp3867_driver[],py_init_py_p_p_cut_cut_d3867=,
fy_rit_p_init_p_p_p3867=
/* IRQ相关*/
.ack_interrupt = dp8.3867万_ack_interrupt,
.config_intr = dp8.3867万_config_intr,
.config_aneg = genphy_config_aneg,
.read_status = genphy_read_status,
.suspend = genphy_suspend,
.resume = genphy_resume,
.driver ={.owner = his_module,}
,
};
module_phy_driver (dp8.3867万_driver);
静态结构midio_device_id __mer_unused dp8.3867万_tbl[]={
DP8.3867万_PHY_ID,0xfffffff0,
{}
;
模块d38bl
module_description ("Texas Instruments DP8.3867万 PHY驱动程序");
module_author ("Dan Murphy <dmurphy@ti.com);
module_license ("GPL");
从代码输出(播放延迟)
[ 1.29.2634万 ] libphy:MACB_MI_BUS:探测
[ 1.30.0599万 ] phy reset ...成功
[ 1.30.375万 ] phy fifo depth 0
[ 1.30.6668万 ] reg 0x10 val:20
[ 1.30.953万 ] old reg 0x32 val:d3
[ DTS] 1.31.2696万 Rx id延迟b
[ DTS] 1.31.5576万 TX ID延迟8.
[ 1.31.8543万 ]延迟8b
[ 1.32.0925万 ] new reg 0x32 val:d3
[ 1.32.4092万 ] new reg 0x86 val:8b
谢谢,期待您的专业知识。
-Daniel