【SA8295P 源码分析】35 - QNX侧 Marvell 88Q5152 Phy_Switch 导通实录(硬核)
系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总》
本文链接:《【SA8295P 源码分析】35 - QNX侧 Marvell 88Q5152 Phy_Switch 导通实录(硬核)》
今天下午把 Marvell 88Q5152 Phy_Switch
导通了,使用车载以太网转换器ping
测试OK
,接线方式如下:
电脑(RJ45
网口)
<
=
=
>
<==>
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.5782em; vertical-align: -0.0391em;"></span><span class="mrel"><==></span></span></span></span></span> (<code>RJ4</code>网口)车载以太网转换器(<code>100/1000BASE-T1</code>) <span class="katex--inline"><span class="katex"><span class="katex-mathml">
<
=
=
>
<==>
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.5782em; vertical-align: -0.0391em;"></span><span class="mrel"><==></span></span></span></span></span> (<code>100/1000BASE-T1</code>) <code>SOC</code>车机</p>
实测结果如下:
DHU SOC 端 ping 结果:
# ifconfig emac0 169.254.51.201
# ping 169.254.51.192
PING 169.254.51.192 (169.254.51.192): 56 data bytes
64 bytes from 169.254.51.192: icmp_seq=0 ttl=64 time=0 ms
64 bytes from 169.254.51.192: icmp_seq=1 ttl=64 time=0 ms
64 bytes from 169.254.51.192: icmp_seq=2 ttl=64 time=0 ms
64 bytes from 169.254.51.192: icmp_seq=3 ttl=64 time=0 ms
64 bytes from 169.254.51.192: icmp_seq=9 ttl=64 time=0 ms
64 bytes from 169.254.51.192: icmp_seq=10 ttl=64 time=0 ms
64 bytes from 169.254.51.192: icmp_seq=11 ttl=64 time=0 ms
PC 端 ping 结果:
$ ping 169.254.51.192
PING 169.254.51.192 (169.254.51.192) 56(84) bytes of data.
64 bytes from 169.254.51.192: icmp_seq=1 ttl=64 time=0.028 ms
64 bytes from 169.254.51.192: icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from 169.254.51.192: icmp_seq=3 ttl=64 time=0.045 ms
64 bytes from 169.254.51.192: icmp_seq=4 ttl=64 time=0.048 ms
64 bytes from 169.254.51.192: icmp_seq=5 ttl=64 time=0.047 ms
64 bytes from 169.254.51.192: icmp_seq=6 ttl=64 time=0.047 ms
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
以太网带宽测试:
客户端配置
iperf3 -c 169.254.51.110 -p 5201
- 1
服务端配置
# iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 169.254.51.192, port 60966
[ 5] local 169.254.51.110 port 5201 connected to 169.254.51.192 port 60968
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 107 MBytes 896 Mbits/sec
[ 5] 1.00-2.00 sec 112 MBytes 941 Mbits/sec
[ 5] 2.00-3.00 sec 112 MBytes 942 Mbits/sec
[ 5] 3.00-4.00 sec 112 MBytes 943 Mbits/sec
[ 5] 4.00-5.00 sec 112 MBytes 942 Mbits/sec
[ 5] 5.00-6.00 sec 112 MBytes 942 Mbits/sec
[ 5] 6.00-7.00 sec 112 MBytes 943 Mbits/sec
[ 5] 7.00-8.00 sec 112 MBytes 941 Mbits/sec
[ 5] 8.00-9.00 sec 112 MBytes 943 Mbits/sec
[ 5] 9.00-10.00 sec 112 MBytes 941 Mbits/sec
[ 5] 10.00-10.00 sec 451 KBytes 2.11 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate
[ 5] 0.00-10.00 sec 1.09 GBytes 938 Mbits/sec receiver
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
在前文《【SA8295P 源码分析】32 - QNX Ethernet Phy_Switch 驱动初始化 源码分析》中,
我们大致分析了下 EMAC MDIO
的源码初始化流程,同时根据初始化流程,我们也做了猜想,可以把 Swtich
初始化的代码放在 int emac_mdio_register(emac_dev_t *dev)
函数中来配置。
本文,我们根据导通后的修改总结总结,修改思路,其实跟前文分析差不多的。
一、硬件原理分析
先分析下原理框图,
可以看出,DHU SOC EMAC1
通过 Port 5
端口与 88Q5152 Switch
芯片相连接的,(需要配置 Switch Port 5
端口)
另一端,2x 1000M-T1
以太网 PHY
的两个接口,分别通过 P1
和 P2
连接在 88Q5152
上,(需要配置 Switch Port 1 、Port2
端口)
逻辑框图如下:
硬件原理图如下:
经过原理图分析,我们需要配置 P1
、P2
、P3
三个端口,配置 1000Mbps
、Slave
模式
二、88Q5152 芯片读写时序分析
2.1 Clause 22 读、写寄存器配置(配置 Port 5 采用C22条款)
C22 条款的读写方式相对简单,读写函数分别如下:
unsigned short emac_mdio_read( void *handle, unsigned char phyaddr, unsigned char phyreg) { int phydata=0, ret=0; struct emac_prv_data_t *pdata = (struct emac_prv_data_t*)handle; struct hw_if_struct *hw_if = &(pdata->hw_if);
<span class="token keyword">if</span> <span class="token punctuation">(</span>hw_if<span class="token operator">-></span>read_phy_regs<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> ret <span class="token operator">=</span> hw_if<span class="token operator">-></span><span class="token function">read_phy_regs</span><span class="token punctuation">(</span>phyaddr<span class="token punctuation">,</span> phyreg<span class="token punctuation">,</span> <span class="token operator">&</span>phydata<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">EMAC_MSG_INFO</span><span class="token punctuation">(</span><span class="token string">"%s: read from phyaddr=0x%x , phyreg=0x%x , phydata=0x%x \n"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> phyaddr<span class="token punctuation">,</span> phyreg<span class="token punctuation">,</span> phydata <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>ret <span class="token operator">!=</span> EMAC_SUCCESS<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"read_phy_regs failed"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> phydata<span class="token punctuation">;</span>
} /* emac_mdio_read */
void emac_mdio_write(void handle, unsigned char phyaddr, unsigned char phyreg, unsigned short phydata)
{
struct emac_prv_data_t pdata = (struct emac_prv_data_t)handle;
struct hw_if_struct hw_if = &(pdata->hw_if);
int ret;
<span class="token keyword">if</span> <span class="token punctuation">(</span>hw_if<span class="token operator">-></span>write_phy_regs<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
ret <span class="token operator">=</span> hw_if<span class="token operator">-></span><span class="token function">write_phy_regs</span><span class="token punctuation">(</span>phyaddr<span class="token punctuation">,</span> phyreg<span class="token punctuation">,</span> phydata<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_DEBUG2</span><span class="token punctuation">(</span><span class="token string">"%s: Write to phyaddr=0x%x , phyreg=0x%x , phydata=0x%x "</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> phyaddr<span class="token punctuation">,</span> phyreg<span class="token punctuation">,</span> phydata <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>ret <span class="token operator">!=</span> EMAC_SUCCESS<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"write_phy_regs failed"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
} /* emac_mdio_write */
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
2.1.1 88Q5152 P5 端口配置
88Q5152 P5
端口配置如下;
// 88Q5152 P5 0x1 Physical Control Register 0xe03e regvalue = emac_mdio_read(0x5, 0x01); EMAC_MSG_ERROR("[switch] P5 PHY_CTRL(0x01) = 0x%04x", regvalue); if(regvalue != 0xe03e) { emac_mdio_write(0x5, 0x1A, 0xA100); regvalue = emac_mdio_read(0x5, 0x1A); EMAC_MSG_ERROR("[switch] P5 GMAC(0x1A) = 0x%04x", regvalue);
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x4</span><span class="token punctuation">,</span> <span class="token number">0x1A</span><span class="token punctuation">,</span> <span class="token number">0xDEA0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x4</span><span class="token punctuation">,</span> <span class="token number">0x1A</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P4 GMAC(0x1A) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span> regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x00</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P5 PORT_STAT(0x00) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x00</span><span class="token punctuation">,</span> <span class="token number">0x0e07</span><span class="token punctuation">)</span><span class="token punctuation">;</span> regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x00</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P5 PORT_STAT(0x00) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x01</span><span class="token punctuation">,</span> <span class="token number">0xe03e</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P5 PHY_CTRL(0x01) RGMII Timing Control updating......"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x01</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P5 PHY_CTRL(0x01) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span> regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x04</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P5 PORT_CTRL(0x04) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>regvalue <span class="token operator">!=</span> <span class="token number">0x007f</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x04</span><span class="token punctuation">,</span> <span class="token number">0x007f</span><span class="token punctuation">)</span><span class="token punctuation">;</span> regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x04</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P5 PORT_CTRL(0x04) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
相关log如下:
# slog2info | grep switch
00:00:02.966 emac1 [switch] SwitchID Product Number: 0xb52, Revision: 2
00:00:02.968 emac1 [switch] P5 PHY_CTRL(0x01) = 0x0003
00:00:02.973 emac1 [switch] P5 GMAC(0x1A) = 0x2100
00:00:02.978 emac1 [switch] P4 GMAC(0x1A) = 0x5e00
00:00:02.980 emac1 [switch] P5 PORT_STAT(0x00) = 0x0e07
00:00:02.985 emac1 [switch] P5 PORT_STAT(0x00) = 0x0e07
00:00:02.987 emac1 [switch] P5 PHY_CTRL(0x01) RGMII Timing Control updating......
00:00:02.990 emac1 [switch] P5 PHY_CTRL(0x01) = 0xe03e
00:00:02.992 emac1 [switch] P5 PORT_CTRL(0x04) = 0x007f
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
2.2 Clause 45 读寄存器时序(配置 Port 1、Port 2 采用C45条款)
以读 P2
口,devaddr=3
的 0xFCAB
寄存器为例,读写时序如下:
Value = Phy_Switch_Clause45_read(2, 3, 0xFCAB);
读流程:
1. 读取 0x18 寄存器,直到 bit15 = 0, 再往下走 (1000次试错)
2. 写寄存器地址: 0xFCAB
写 0x19 地址, 0xFCAB
写 0x18 寄存器 0x8043
0x18 寄存器各bit 配置如下:
SMIBusy = 1
SMIFunc = 00
SMIMode = 0
SMIOp = 00 ––> 00 (写addr reg) 01(写 Data reg) 11(读寄存器)
DevAddr = 00010 ––> 配置 Port 口:00001 (Port 1) 00010 (Port 2)
RegAddr = 00011 ––> 配置 devaddr=3
3. 读取 0x18 寄存器,直到 bit15 = 0, 再往下走 (1000次试错)
4. 写读请求
写 0x18 寄存器 0x8C43
0x18 寄存器各bit 配置如下:
SMIBusy = 1
SMIFunc = 00
SMIMode = 0
SMIOp = 11 ––> 00 (写addr reg) 01(写 Data reg) 11(读寄存器)
DevAddr = 00010 ––> 配置 Port 口:00001 (Port 1) 00010 (Port 2)
RegAddr = 00011 ––> 配置 devaddr=3
5. 读取 0x19 寄存器,获取到寄存器值
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
2.2.1 Phy_Switch_Clause45_read() 函数实现
static int phy_switch_glb2_smi_busy(){ uint16_t value; uint16_t timeout = 1000; do{ value = emac_mdio_read(GLB2_SMI_DEV_ADDR, GLB2_SMI_PHY_CMD); if(!(value & (1 << 15))){ break; } usleep(100); } while(--timeout);
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>timeout<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
}
uint16_t Phy_Switch_Clause45_read(uint16_t phyaddr, uint16_t devaddr, uint16_t regaddr)
{
uint16_t cmd = PHY_SWITCH_INTERNAL_ADDR_WRITE;
cmd |= (phyaddr & 0x1F) << 5;
cmd |= devaddr & 0x1F;
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token number">0xDEAD</span><span class="token punctuation">;</span> <span class="token comment">// 读 0x18</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 写19</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 配置端口 读</span>
cmd <span class="token operator">=</span> PHY_SWITCH_INTERNAL_READ<span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token number">0xDEAD</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token number">0xDEAD</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
2.2.2 Switch Global 2 Register 0x18 0x19 寄存器描述
参考芯片手册:《88Q5152_88Q5151 Functional Specification.pdf》
Switch Global 2 Register 0x18
寄存器配置如下:
Switch Global 2 Register 0x19
寄存器配置如下:
2.3 Clause 45 写寄存器时序(配置 Port 1、Port 2 采用C45条款)
以写 P2
口,devaddr=3
的 0xFCAB
寄存器值 0x1054
为例:
Phy_Switch_Clause45(2, 3, 0xFCAB, 0x1054)
写流程:
1. 读取 0x18 寄存器,直到 bit15 = 0, 再往下走 (1000次试错)
2. 写寄存器地址: 0xFCAB
写 0x19 地址, 0xFCAB
写 0x18 寄存器 0x8043
0x18 寄存器各bit 配置如下:
SMIBusy = 1
SMIFunc = 00
SMIMode = 0
SMIOp = 00 ––> 00 (写addr reg) 01(写 Data reg) 11(读寄存器)
DevAddr = 00010 ––> 配置 Port 口:00001 (Port 1) 00010 (Port 2)
RegAddr = 00011 ––> 配置 devaddr=3
3. 读取 0x18 寄存器,直到 bit15 = 0, 再往下走 (1000次试错)
4. 写入寄存器值 0x1054
写 0x19 地址,0x1054
5. 写入写请求
写 0x18 寄存器 0x8443
0x18 寄存器各bit 配置如下:
SMIBusy = 1
SMIFunc = 00
SMIMode = 0
SMIOp = 01 ––> 00 (写addr reg) 01(写 Data reg) 11(读寄存器)
DevAddr = 00010 ––> 配置 Port 口:00001 (Port 1) 00010 (Port 2)
RegAddr = 00011 ––> 配置 devaddr=3
6. 读取 0x18 寄存器,直到 bit15 = 0, 说明写完毕
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
2.3.1 Phy_Switch_Clause45_write() 函数实现
static int phy_switch_glb2_smi_busy(){ uint16_t value; uint16_t timeout = 1000; do{ value = emac_mdio_read(GLB2_SMI_DEV_ADDR, GLB2_SMI_PHY_CMD); if(!(value & (1 << 15))){ break; } usleep(100); } while(--timeout);
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>timeout<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
}
void Phy_Switch_Clause45_write(uint16_t phyaddr, uint16_t devaddr, uint16_t regaddr, uint16_t regvalue)
{
uint16_t cmd = PHY_SWITCH_INTERNAL_ADDR_WRITE;
<span class="token class-name">uint16_t</span> tmp_before<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span> tmp_end<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
tmp_before <span class="token operator">=</span> <span class="token function">Phy_Switch_Clause45_read</span><span class="token punctuation">(</span>phyaddr<span class="token punctuation">,</span> devaddr<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>
<span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//0x19</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>
cmd <span class="token operator">=</span> PHY_SWITCH_INTERNAL_DATA_WRITE<span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>
<span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>
tmp_end <span class="token operator">=</span> <span class="token function">Phy_Switch_Clause45_read</span><span class="token punctuation">(</span>phyaddr<span class="token punctuation">,</span> devaddr<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[%s][%d] P%d Port, DevAddr(0x%x), Reg[0x%x]= (0x%x) set to => (0x%x) , right vlue(0x%x)"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span>
phyaddr<span class="token punctuation">,</span> devaddr<span class="token punctuation">,</span> regaddr<span class="token punctuation">,</span> tmp_before<span class="token punctuation">,</span> tmp_end<span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
2.3.2 88Q5152 P1、P2 端口配置 1000Mbps、Slave模式
88Q5152 P5
端口配置如下;
// 88Q5152 Port1 1000BT Slave Mode init Phy_Switch_Clause45_write( 1, 3, 0x8022, 0x0000 ); //disable passive sleep mode Phy_Switch_Clause45_write( 1, 3, 0xFFE4, 0x0007 ); Phy_Switch_Clause45_write( 1, 1, 0x0000, 0x0840 ); usleep(3000); // Delay for 3ms
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">0x0200</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFDB</span><span class="token punctuation">,</span> <span class="token number">0xFC10</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAD</span><span class="token punctuation">,</span> <span class="token number">0x030C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8032</span><span class="token punctuation">,</span> <span class="token number">0x6001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDFF</span><span class="token punctuation">,</span> <span class="token number">0x05A5</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDEC</span><span class="token punctuation">,</span> <span class="token number">0xDBAF</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAB</span><span class="token punctuation">,</span> <span class="token number">0x1054</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAC</span><span class="token punctuation">,</span> <span class="token number">0x1483</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">,</span> <span class="token number">0x8001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Slave 1G</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0900</span><span class="token punctuation">,</span> <span class="token number">0x8000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x000C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 88Q5152 Port2 1000BT Slave Mode init</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8022</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//disable passive sleep mode</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x0007</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0840</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">3000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Delay for 3ms</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">0x0200</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFDB</span><span class="token punctuation">,</span> <span class="token number">0xFC10</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAD</span><span class="token punctuation">,</span> <span class="token number">0x030C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8032</span><span class="token punctuation">,</span> <span class="token number">0x6001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDFF</span><span class="token punctuation">,</span> <span class="token number">0x05A5</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDEC</span><span class="token punctuation">,</span> <span class="token number">0xDBAF</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAB</span><span class="token punctuation">,</span> <span class="token number">0x1054</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAC</span><span class="token punctuation">,</span> <span class="token number">0x1483</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">,</span> <span class="token number">0x8001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Slave 1G</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0900</span><span class="token punctuation">,</span> <span class="token number">0x8000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x000C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
2.3.3 88Q5152 P1、P2 端口配置 1000Mbps、Master模式
// 88Q5152 Port1 1000BT Master Mode init Phy_Switch_Clause45_write( 1, 3, 0x8022, 0x0000 ); //disable passive sleep mode Phy_Switch_Clause45_write( 1, 3, 0xFFE4, 0x0007 ); Phy_Switch_Clause45_write( 1, 1, 0x0000, 0x0840 ); usleep(3000); //Delay for 3ms
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">0x0200</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFDB</span><span class="token punctuation">,</span> <span class="token number">0xFC10</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAD</span><span class="token punctuation">,</span> <span class="token number">0x030C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8032</span><span class="token punctuation">,</span> <span class="token number">0x6001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDFF</span><span class="token punctuation">,</span> <span class="token number">0x05A5</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDEC</span><span class="token punctuation">,</span> <span class="token number">0xDBAF</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAB</span><span class="token punctuation">,</span> <span class="token number">0x1054</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAC</span><span class="token punctuation">,</span> <span class="token number">0x1483</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">,</span> <span class="token number">0xC001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Master 1G</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0900</span><span class="token punctuation">,</span> <span class="token number">0x8000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x000C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 88Q5152 Port2 1000BT Master Mode init </span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8022</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//disable passive sleep mode</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x0007</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0840</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">3000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Delay for 3ms</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">0x0200</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFDB</span><span class="token punctuation">,</span> <span class="token number">0xFC10</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAD</span><span class="token punctuation">,</span> <span class="token number">0x030C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8032</span><span class="token punctuation">,</span> <span class="token number">0x6001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDFF</span><span class="token punctuation">,</span> <span class="token number">0x05A5</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDEC</span><span class="token punctuation">,</span> <span class="token number">0xDBAF</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAB</span><span class="token punctuation">,</span> <span class="token number">0x1054</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAC</span><span class="token punctuation">,</span> <span class="token number">0x1483</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">,</span> <span class="token number">0xC001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Master 1G</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0900</span><span class="token punctuation">,</span> <span class="token number">0x8000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x000C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
一般来说,100Mbps
默认不用配是OK 的,如果不行的话,可以找FAE 要下参数配置。
三、代码导通配置
3.1 配置 ether.c
# apps/qnx_ap/target/filesets/launcher_scripts/ether.c
static const char* iopkt_arg_air[] = {
"io-pkt-v6-hc",
"-u",
"bpf,37:37,0666",
"-S",
"-v",
"-D",
"-p",
"tcpip",
"pkt_typed_mem=/ram/mm_dma,stacksize=65536,mclbytes=4096,pagesize=65536,pkt_cache=1024,mbuf_cache=1024",
"-ppf-v6",
"-d",
"/ifs/lib64/libdevnp-emac-eth.so",
"inst=1,name=emac,unit=0,phy_switch=88Q5072", // 88Q5152 使用默认的代码 88Q5072
"-U",
create_string(IO_PKT_UID:IO_PKT_GIDS_REQ),
NULL
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
3.2 配置 emac1_config_Makena.conf
qnx/apps/qnx_ap/AMSS/amc/data/ethernet/emac/driver/board/makena/emac1_config_Makena.conf
emac_mac_address=02:00:00:00:10:01
- 1
- 2
- 3
3.3 配置GPIO 中断、RST脚
# qnx/apps/qnx_ap/boards/core/dalconfig/sa8295P_adp_air_v1.0.1/config/pin_config.c // {(TLMM_MODULE|54), "/dev/gpio/ephy1_soc_int", TLMM_GPIO_CFG_MASK_IGNORE, GPIO_PIN_CFG(GPIO_INPUT, GPIO_NO_PULL, GPIO_STRENGTH_8MA, 1), TLMM_GPIO_SLEEP_CFG_IGNORE, IGNORE}, // {(TLMM_MODULE|127), "/dev/gpio/ephy0_soc_int", TLMM_GPIO_CFG_MASK_IGNORE, GPIO_PIN_CFG(GPIO_INPUT, GPIO_NO_PULL, GPIO_STRENGTH_8MA, 1), TLMM_GPIO_SLEEP_CFG_IGNORE, IGNORE},
<span class="token punctuation">{<!-- --></span><span class="token punctuation">(</span>TLMM_MODULE<span class="token operator">|</span><span class="token number">31</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"/dev/gpio/ephy1_soc_int"</span><span class="token punctuation">,</span> TLMM_GPIO_CFG_MASK_IGNORE<span class="token punctuation">,</span> <span class="token function">GPIO_PIN_CFG</span><span class="token punctuation">(</span>GPIO_INPUT<span class="token punctuation">,</span> GPIO_NO_PULL<span class="token punctuation">,</span> GPIO_STRENGTH_8MA<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> TLMM_GPIO_SLEEP_CFG_IGNORE<span class="token punctuation">,</span> IGNORE<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{<!-- --></span><span class="token punctuation">(</span>TLMM_MODULE<span class="token operator">|</span><span class="token number">37</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"/dev/gpio/ephy0_soc_int"</span><span class="token punctuation">,</span> TLMM_GPIO_CFG_MASK_IGNORE<span class="token punctuation">,</span> <span class="token function">GPIO_PIN_CFG</span><span class="token punctuation">(</span>GPIO_INPUT<span class="token punctuation">,</span> GPIO_NO_PULL<span class="token punctuation">,</span> GPIO_STRENGTH_8MA<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> TLMM_GPIO_SLEEP_CFG_IGNORE<span class="token punctuation">,</span> IGNORE<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">//enet reset</span>
// {(PMIC_2_GPIO_MODULE|1), “/dev/gpio/soc_ephy0_rst”, PMIC_GPIO_SET_OUTPUT_CONF_MASK, PMIC_GPIO_OUTPUT_DEFAULT, TLMM_GPIO_SLEEP_CFG_IGNORE, IGNORE },
// {(PMIC_2_GPIO_MODULE|2), “/dev/gpio/soc_ephy1_rst”, PMIC_GPIO_SET_OUTPUT_CONF_MASK, PMIC_GPIO_OUTPUT_DEFAULT, TLMM_GPIO_SLEEP_CFG_IGNORE, IGNORE },
{
(TLMM_MODULE|36), “/dev/gpio/soc_ephy0_rst”, TLMM_GPIO_CFG_MASK_IGNORE, GPIO_PIN_CFG(GPIO_OUTPUT, GPIO_PULL_UP, GPIO_STRENGTH_8MA, 0), TLMM_GPIO_SLEEP_CFG_IGNORE, IGNORE},
{
(TLMM_MODULE|27), “/dev/gpio/soc_ephy1_rst”, TLMM_GPIO_CFG_MASK_IGNORE, GPIO_PIN_CFG(GPIO_OUTPUT, GPIO_PULL_UP, GPIO_STRENGTH_8MA, 0), TLMM_GPIO_SLEEP_CFG_IGNORE, IGNORE},
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
3.4 配置 qc.data.ethernet.early.build 拷贝库到 /ifs中
# qnx/apps/qnx_ap/target/filesets/qc.data.ethernet.early.build
lib64/libdevnp-emac-eth.so=aarch64le/lib/libdevnp-emac-eth.so
lib64/libdevnp-emac1-eth.so=aarch64le/lib/libdevnp-emac-eth.so
lib64/libphy_wrapper.so=aarch64le/lib/libphy_wrapper.so
- 1
- 2
- 3
- 4
- 5
3.5 配置启动 emac0 网卡
# qnx/apps/qnx_ap/target/hypervisor/host/startup.qvmhost.tmpl
brconfig bridge0 add emac0 up
ifconfig emac0 198.18.32.1/16 up
- 1
- 2
- 3
- 4
3.6 修改emac_mdio.c 添加初始化 88Q5152代码
int emac_mdio_register(emac_dev_t *dev){ ...... 省略...... do{ ...... 省略...... /* Establish a connection with the created channel */ pdata->co_id = ConnectAttach(0, 0, pdata->ch_id, _NTO_SIDE_CHANNEL, 0); /* Assign connection id to event */ memset(&mdi_event, 0, sizeof(struct sigevent)); mdi_event.sigev_coid = pdata->co_id;
<span class="token comment">/* Register with QNX MII mgmt library */</span> <span class="token function">Phy_Register_Extended</span><span class="token punctuation">(</span>pdata<span class="token punctuation">,</span> emac_mdio_write<span class="token punctuation">,</span> emac_mdio_read<span class="token punctuation">,</span> emac_mdio_callback<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token class-name">mdi_t</span> <span class="token operator">*</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token operator">&</span>pdata<span class="token operator">-></span>mdi_hdl<span class="token punctuation">,</span> <span class="token operator">&</span>mdi_event<span class="token punctuation">,</span> EMAC_MDI_PULSE_PRIO<span class="token punctuation">,</span> EMAC_MDI_PULSE_FREQ<span class="token punctuation">,</span> pdata<span class="token operator">-></span>phy_type<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/* For qdrive phy_index is 8 */</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>pdata<span class="token operator">-></span>phy_type <span class="token operator">==</span> MARVELL_88Q5072 <span class="token operator">||</span> pdata<span class="token operator">-></span>phy_type <span class="token operator">==</span> MARVELL_88EA1512<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> phy_indx <span class="token operator">=</span> pdata<span class="token operator">-></span>conf_data<span class="token punctuation">.</span>marvell_phy_index_qdrive<span class="token punctuation">;</span> <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch][%s][%d] enter phy_type=0x%x phy_index=0x%x \n"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span> pdata<span class="token operator">-></span>phy_type<span class="token punctuation">,</span> phy_indx<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">phy_and_switch_status_checking</span><span class="token punctuation">(</span>pdata<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 在此初始化 88Q5152 芯片</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span>pdata<span class="token operator">-></span>phy_type <span class="token operator">==</span> KSZ9131RNX<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> phy_indx <span class="token operator">=</span> pdata<span class="token operator">-></span>conf_data<span class="token punctuation">.</span>micrel_phy_index_adp <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> 省略<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
3.7 88Q5152驱动代码
/********************************************************************************/
/*********************** 88Q5152 Switch Code Begin ******************************/
/********************************************************************************/
#include "emac_globals.h"
#include <net/ifdrvcom.h>
#define ESM_PHY_R 0xC0
#define ESM_PHY_W 0xC1
#define ESM_SWITCH_R 0xD0
#define ESM_SWITCH_W 0xD1
#define ETH_PORT_1 0x01
#define ETH_PORT_2 0x02
#define ETH_PORT_3 0x03
#define ETH_PORT_4 0x04
#define ETH_PORT_5 0x05
#define ETH_PORT_6 0x06
#define ETH_PORT_7 0x07
#define ETH_PORT_8 0x08
typedef struct{
uint16_t smi_addr;
uint16_t reg_addr;
uint16_t reg_value;
} esm_switch_reg_t;
typedef struct{
uint16_t eth_port_no;
uint16_t dev_addr;
uint16_t reg_addr;
uint16_t reg_value;
}esm_phy_reg_t;
void phy_and_switch_status_checking(struct emac_prv_data_t *pdata);
/* definition for MARVELL PHY 88Qxxxx */
#define MARVELL_PHY_OUI 0x002B // Organizationally Unique Identifier
#define PMA_PMD_DEVICE_ID2 0x0981
#define PHY_PMA_PMD_DEV_ADDR 1
/* definition for Ethernet Switch 88Q5050 */
#define SWITCH_VERSION_5050 0xa510 //a51x
#define SWITCH_VERSION_5152 0xb520
#define SWITCH_VER_MASK 0xFFF0
#define Q5050_MULTI_CHIP_MODE 0
#define Q5050_SINGLE_CHIP_MODE 1
/* Access Ethernet Switch registers - multi-chip mode /
#define MULTI_CHIP_SMI_CMD 0x00
#define MULTI_CHIP_SMI_DATA 0x01
/ bit15 - SMIBusy
bit12 - SMIMode. Define SMI frame type.
0 - Not C22 SMI frames;
1 - C22 SMI frames.
bit11:10 - SMIOp. 0x1 - Write Data Register;
0x2 - Read Data Register.
bit9:5 - DevAddr. Used to select C22 SMI device to operate
bit4:0 - RegAddr. Used to select C22 SMI register to operate
/
#define MULTI_CHIP_SMI_CMD_READ ((1 << 15) | (1 << 12) | (2 << 10))
#define MULTI_CHIP_SMI_CMD_WRITE ((1 << 15) | (1 << 12) | (1 << 10))
/ Single-chip Addressing Mode: (SMI Address of Switch is 0)
88Q5050 responds to all the 32 possible SMI device addresses.
Internal PHY and SERDES, as well as external devices attached to the 88Q5050’s SMI_PHY interface,
can be accessed by using SMI PHY Cmd and SMI PHY Data register (GLB2 offset 0x18 and 0x19)
Multi-chip Addressing Mode:
88Q5050 responds to only 1 of the 32 possible SMI device addresses, can share the SMI with multiple other devices.
Only 2 registers are directly accessible: SMI cmd and SMI data register.
These 2 registers are used indirectly access all other registers of 88Q5050 (along with any PHY registers that attached to it).
Internal PHY and SERDES, as well as external devices attached to the 88Q5050’s SMI_PHY interface,
can be accessed by using SMI PHY Cmd and SMI PHY Data register (GLB2 offset 0x18 and 0x19)
*/
unsigned short g_smi_chipmode = Q5050_SINGLE_CHIP_MODE;
static bool bSwitchChipIsFound = TRUE;
/---- Access PHY which is integrated internally in Switch ----/
#define PHY_SWITCH_INTERNAL_READ ((1 << 15) | (0 << 12) | (2 << 10))
#define PHY_SWITCH_INTERNAL_ADDR_WRITE ((1 << 15) | (0 << 14) | (0 << 13) | (0 << 12)| (0 << 11) | (0 << 10))
#define PHY_SWITCH_INTERNAL_DATA_WRITE ((1 << 15) | (0 << 14) | (0 << 13) | (0 << 12)| (0 << 11) | (1 << 10))
/---- Access PHY which is controlled via switch SMI_PHY ----/
#define PHY_SWITCH_EXTERNAL_READ ((1 << 15) | (0 << 14) | (1 << 13) | (0 << 12) |(2 << 10))
#define PHY_SWITCH_EXTERNAL_ADDR_WRITE ((1 << 15) | (0 << 14) | (1 << 13) | (0 << 12) |(0 << 11) | (0 << 10))
#define PHY_SWITCH_EXETERNAL_DATA_WRITE ((1 << 15) | (0 << 14) | (1 << 13) | (0 << 12) |(0 << 11) | (1 << 10))
/* bit15 : SMIBusy - SMI PHY Unit Busy.
bit14:13 : SMIFunc
bit12 : SMIMode - define SMI frame type. 0 - C45; 1 - C22. Here we choose C45
bit11:10 : SMIOp (C45) : 0 - Write Address Reg; 1 - Write Data Reg; 0x2 -
bit9:5 - select port to operate
bit4:0 - select device class to operate
*/
#define GLB2_SMI_DEV_ADDR 0x1C
#define GLB2_SMI_PHY_CMD 0x18
#define GLB2_SMI_PHY_DATA 0x19
/---- Access single external PHY that is connected to EMAC directly ----/
#define EMAC_PHY_C45_CMD_ADDR 0x0d
#define EMAC_PHY_C45_DATA_ADDR 0x0e
/* SMI device address definition for Switch and PHY - dhu */
#define SWITCH_ADDR 3
#define P1_INT_PHY_ADDR 1
#define P7_EXT_PHY_ADDR 2
#define P8_EXT_PHY_ADDR 1
#define PHY_SINGLE_EXTERNAL_ADDR 1
static struct emac_prv_data_t *prv_data = NULL;
void phy_switch_reset1(){
int ret = EOK;
int fd = open(“/dev/gpio/soc_ephy1_rst/value”, O_RDWR);
if (fd < 0) {
EMAC_MSG_ERROR(“[switch]%s: open soc_ephy1_rst errors”, func);
ret = EINVAL;
}else {
EMAC_MSG_ERROR(“[switch]%s: open soc_ephy1_rst success!!”, func);
write(fd, “0”, sizeof(“0”));
usleep(100000);
<span class="token function">write</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span><span class="token string">"1"</span><span class="token punctuation">,</span><span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token string">"1"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//set to high</span>
<span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">200000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token number">0</span> <span class="token operator">!=</span> <span class="token function">lseek</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token constant">SEEK_SET</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// Read the pin value back and log it</span>
<span class="token punctuation">{<!-- --></span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"%s: Error setting seek "</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
ret <span class="token operator">=</span> EINVAL<span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{<!-- --></span>
<span class="token keyword">char</span> buf<span class="token punctuation">;</span>
<span class="token function">memset</span><span class="token punctuation">(</span><span class="token operator">&</span>buf<span class="token punctuation">,</span><span class="token char">'0'</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>buf<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">read</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span> <span class="token operator">&</span>buf<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>buf<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]PHY pin high = %c "</span><span class="token punctuation">,</span> buf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">close</span><span class="token punctuation">(</span>fd<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"%s: closing fd failed with %s"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span><span class="token function">strerror</span><span class="token punctuation">(</span>errno<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
ret <span class="token operator">=</span> EINVAL<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>ret <span class="token operator">==</span> EINVAL<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"%s: PHY reset encountered errors"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}
static int switch_glb2_smi_busy( )
{
uint16_t value;
uint16_t timeout = 1000;
do{
value = emac_mdio_read(prv_data, SWITCH_ADDR, 0x00);
if (!(value & (1 << 15))) {
break;
}
usleep(100);
} while(–timeout);
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>timeout<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
}
uint16_t switch_glb2_smi_read(int smiaddr, int reg)
{
uint16_t regval;
if (g_smi_chipmode == Q5050_SINGLE_CHIP_MODE) {
regval = emac_mdio_read(prv_data, smiaddr, reg);
} else {
uint16_t cmd = MULTI_CHIP_SMI_CMD_READ;
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>smiaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">5</span><span class="token punctuation">;</span> <span class="token comment">// bit9:5 DevAddr, select C22 SMI device to operate</span>
cmd <span class="token operator">|=</span> reg <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">;</span> <span class="token comment">// bit4:0 RegAddr, select C22 SMI register to operate</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">switch_glb2_smi_busy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> SWITCH_ADDR<span class="token punctuation">,</span> MULTI_CHIP_SMI_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// SMI Command Register. Accessible only when multi-chip addressing mode</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">switch_glb2_smi_busy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
regval <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> SWITCH_ADDR<span class="token punctuation">,</span> MULTI_CHIP_SMI_DATA<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// SMI Data Register. Accessible only when multi-chip addressing mode</span>
<span class="token function">EMAC_MSG_DEBUG2</span><span class="token punctuation">(</span><span class="token string">"GLB2_SMI_PHY_DATA 0x%x 0x%x = 0x%x "</span><span class="token punctuation">,</span> smiaddr<span class="token punctuation">,</span> reg<span class="token punctuation">,</span> regval<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> regval<span class="token punctuation">;</span>
}
uint16_t switch_glb2_smi_write(uint16_t smiaddr, uint16_t reg, uint16_t data)
{
if (g_smi_chipmode == Q5050_SINGLE_CHIP_MODE) {
emac_mdio_write(prv_data, smiaddr, reg, data);
} else{
uint16_t cmd = MULTI_CHIP_SMI_CMD_WRITE;
cmd |= (smiaddr & 0x1F) << 5;
cmd |= reg & 0x1F;
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">switch_glb2_smi_busy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> SWITCH_ADDR<span class="token punctuation">,</span> MULTI_CHIP_SMI_DATA<span class="token punctuation">,</span> data<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> SWITCH_ADDR<span class="token punctuation">,</span> MULTI_CHIP_SMI_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> EMAC_SUCCESS<span class="token punctuation">;</span>
}
static int phy_switch_glb2_smi_busy( )
{
uint16_t value;
uint16_t timeout = 1000;
do {
value = emac_mdio_read(GLB2_SMI_DEV_ADDR, GLB2_SMI_PHY_CMD);
if(!(value & (1 << 15))) {
break;
}
usleep(100);
} while(–timeout);
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>timeout<span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
}
uint16_t Phy_Switch_Clause45_read(uint16_t phyaddr, uint16_t devaddr, uint16_t regaddr)
{
uint16_t cmd = PHY_SWITCH_INTERNAL_ADDR_WRITE;
cmd |= (phyaddr & 0x1F) << 5;
cmd |= devaddr & 0x1F;
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token number">0xDEAD</span><span class="token punctuation">;</span> <span class="token comment">// 读 0x18</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 写19</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 配置端口 读</span>
cmd <span class="token operator">=</span> PHY_SWITCH_INTERNAL_READ<span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token number">0xDEAD</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token number">0xDEAD</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
void Phy_Switch_Clause45_write(uint16_t phyaddr, uint16_t devaddr, uint16_t regaddr, uint16_t regvalue)
{
uint16_t cmd = PHY_SWITCH_INTERNAL_ADDR_WRITE;
<span class="token class-name">uint16_t</span> tmp_before<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span> tmp_end<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
tmp_before <span class="token operator">=</span> <span class="token function">Phy_Switch_Clause45_read</span><span class="token punctuation">(</span>phyaddr<span class="token punctuation">,</span> devaddr<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>
<span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//0x19</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>
cmd <span class="token operator">=</span> PHY_SWITCH_INTERNAL_DATA_WRITE<span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>
<span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>
tmp_end <span class="token operator">=</span> <span class="token function">Phy_Switch_Clause45_read</span><span class="token punctuation">(</span>phyaddr<span class="token punctuation">,</span> devaddr<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[%s][%d] P%d Port, DevAddr(0x%x), Reg[0x%x]= (0x%x) set to => (0x%x) , right vlue(0x%x)"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span>
phyaddr<span class="token punctuation">,</span> devaddr<span class="token punctuation">,</span> regaddr<span class="token punctuation">,</span> tmp_before<span class="token punctuation">,</span> tmp_end<span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
uint16_t phy_switch_external_glb2_read(uint16_t phyaddr, uint16_t devaddr, uint16_t regaddr)
{
uint16_t cmd = PHY_SWITCH_EXTERNAL_ADDR_WRITE;
cmd |= (phyaddr & 0x1F) << 5;
cmd |= devaddr & 0x1F;
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>
cmd <span class="token operator">=</span> PHY_SWITCH_EXTERNAL_READ<span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
void phy_switch_external_glb2_write(uint16_t phyaddr, uint16_t devaddr, uint16_t regaddr, uint16_t regval)
{
uint16_t cmd = PHY_SWITCH_EXTERNAL_ADDR_WRITE;
cmd |= (phyaddr & 0x1F) << 5;
cmd |= devaddr & 0x1F;
<span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>
cmd <span class="token operator">=</span> PHY_SWITCH_EXETERNAL_DATA_WRITE<span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>
<span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regval<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
void phy_switch_status_checking( )
{
uint16_t regvalue = 0;
<span class="token comment">// 1.0002 - PMA_PMD_ID 1; 1.0003 - PMA_PMD_ID 2.</span>
regvalue <span class="token operator">=</span> <span class="token function">phy_switch_external_glb2_read</span><span class="token punctuation">(</span>P7_EXT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0002</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: regvalue =0x%x"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>regvalue <span class="token operator">==</span> MARVELL_PHY_OUI<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P7 External PhyID 1.0002 (MARVELL_OUI) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">phy_switch_external_glb2_read</span><span class="token punctuation">(</span>P7_EXT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0003</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P7 External PhyID 1.0003 = 0x%04x, Model Number: %x, Revision: %x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">>></span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token operator">&</span> <span class="token number">0x003F</span><span class="token punctuation">,</span> regvalue <span class="token operator">&</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P7 Could not find phy chip"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
regvalue <span class="token operator">=</span> <span class="token function">phy_switch_external_glb2_read</span><span class="token punctuation">(</span>P7_EXT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: regvalue =0x%x"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P7 External PHY 88Q2122 1.0834 = 0x%04x, Mode = %s, Speed = %s"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&</span> <span class="token number">0x4000</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string">"Master"</span><span class="token operator">:</span><span class="token string">"Slave"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token operator">?</span> <span class="token string">"1Gbps"</span><span class="token operator">:</span><span class="token string">"UNKNOW"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 1.0002 - PMA_PMD_ID 1; 1.0003 - PMA_PMD_ID 2.</span>
regvalue <span class="token operator">=</span> <span class="token function">phy_switch_external_glb2_read</span><span class="token punctuation">(</span>P8_EXT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0002</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: regvalue =0x%x"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>regvalue <span class="token operator">==</span> MARVELL_PHY_OUI<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P8 External PhyID 1.0002 (MARVELL_OUI) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">phy_switch_external_glb2_read</span><span class="token punctuation">(</span>P8_EXT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0003</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P8 External PhyID 1.0003 = 0x%04x, Model Number: %x, Revision: %x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">>></span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token operator">&</span> <span class="token number">0x003F</span><span class="token punctuation">,</span> regvalue <span class="token operator">&</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P8 Could not find phy chip"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
regvalue <span class="token operator">=</span> <span class="token function">phy_switch_external_glb2_read</span><span class="token punctuation">(</span>P8_EXT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: regvalue =0x%x"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P8 External PHY 88Q2120 1.0834 = 0x%04x, Mode = %s, Speed = %s"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&</span> <span class="token number">0x4000</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string">"Master"</span><span class="token operator">:</span><span class="token string">"Slave"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token operator">?</span> <span class="token string">"1Gbps"</span><span class="token operator">:</span><span class="token string">"UNKNOW"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">Phy_Switch_Clause45_read</span><span class="token punctuation">(</span>P1_INT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: regvalue =0x%x"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P1 Internal PHY 1.0834 = 0x%04x, Mode = %s, Speed = %s"</span><span class="token punctuation">,</span>regvalue<span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&</span> <span class="token number">0x4000</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string">"Master"</span><span class="token operator">:</span><span class="token string">"Slave"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token operator">?</span> <span class="token string">"UNKNOW"</span><span class="token operator">:</span><span class="token string">"100Mbps"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
}
/* API to read Clause 45 using Clause 22*/
uint16_t phy_single_external_read(uint16_t devaddr, uint16_t regaddr){
uint16_t phyaddr = PHY_SINGLE_EXTERNAL_ADDR;
/write FN=00 and device address to command reg, indicating address function/
emac_mdio_write(prv_data, phyaddr, EMAC_PHY_C45_CMD_ADDR, devaddr);
<span class="token comment">/*write address to be read to data port reg*/</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> phyaddr<span class="token punctuation">,</span> EMAC_PHY_C45_DATA_ADDR<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/*write FN =01 and device address to command register specifying data function*/</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> phyaddr<span class="token punctuation">,</span> EMAC_PHY_C45_CMD_ADDR<span class="token punctuation">,</span> devaddr <span class="token operator">|</span> <span class="token number">1</span> <span class="token operator"><<</span> <span class="token number">14</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> phyaddr<span class="token punctuation">,</span> EMAC_PHY_C45_DATA_ADDR<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
/* API to write Clause 45 using Clause 22 */
void phy_single_external_write(uint16_t devaddr, uint16_t regaddr, uint16_t regval)
{
uint16_t phyaddr = PHY_SINGLE_EXTERNAL_ADDR;
emac_mdio_write(prv_data, phyaddr, EMAC_PHY_C45_CMD_ADDR, devaddr);
emac_mdio_write(prv_data, phyaddr, EMAC_PHY_C45_DATA_ADDR, regaddr);
emac_mdio_write(prv_data, phyaddr, EMAC_PHY_C45_CMD_ADDR, devaddr | 1 << 14);
emac_mdio_write(prv_data, phyaddr, EMAC_PHY_C45_DATA_ADDR, regval);
}
void phy_single_status_checking()
{
uint16_t regvalue = 0;
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: enter+++++"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">phy_single_external_read</span><span class="token punctuation">(</span>PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0002</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]Single External PHY 88Q2120 1.0002 = 0x%04x. (MARVELL OUI is 0x002B)"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">phy_single_external_read</span><span class="token punctuation">(</span>PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]Single External PHY 88Q2120 1.0834 = 0x%04x, Mode = %s, Speed = %s"</span><span class="token punctuation">,</span>
regvalue<span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&</span> <span class="token number">0x4000</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string">"Master"</span><span class="token operator">:</span><span class="token string">"Slave"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token operator">?</span> <span class="token string">"1Gbps"</span><span class="token operator">:</span><span class="token string">"UNKNOW"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
}
void phy_and_switch_status_checking(struct emac_prv_data_t *pdata){
prv_data = pdata;
uint16_t regvalue = 0 ;
<span class="token function">phy_switch_reset1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x2</span><span class="token punctuation">,</span> <span class="token number">0x8</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>regvalue <span class="token operator">==</span> <span class="token number">0x2080</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
g_smi_chipmode <span class="token operator">=</span> Q5050_SINGLE_CHIP_MODE<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token keyword">else</span><span class="token punctuation">{<!-- --></span>
g_smi_chipmode <span class="token operator">=</span> Q5050_MULTI_CHIP_MODE<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]Switch Addressing Mode: %s, regvalue=0x%x"</span><span class="token punctuation">,</span> g_smi_chipmode <span class="token operator">?</span> <span class="token string">"Single-chip"</span> <span class="token operator">:</span> <span class="token string">"Multi-chip"</span> <span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// try to get SwitchID</span>
regvalue <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x0</span><span class="token punctuation">,</span> <span class="token number">0x03</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// device's Product Number</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: id regvalue=0x%x \n"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token punctuation">(</span>regvalue <span class="token operator">&</span> SWITCH_VER_MASK<span class="token punctuation">)</span> <span class="token operator">==</span> SWITCH_VERSION_5152<span class="token punctuation">)</span> <span class="token comment">// 88Q5152</span>
<span class="token punctuation">{<!-- --></span>
bSwitchChipIsFound <span class="token operator">=</span> TRUE<span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]SwitchID Product Number: 0x%x, Revision: %x"</span><span class="token punctuation">,</span> SWITCH_VERSION_5152 <span class="token operator">>></span> <span class="token number">4</span><span class="token punctuation">,</span> regvalue <span class="token operator">&</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 88Q5152 P5 0x1 Physical Control Register 0xe03e</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x01</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PHY_CTRL(0x01) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>regvalue <span class="token operator">!=</span> <span class="token number">0xe03e</span><span class="token punctuation">)</span>
<span class="token punctuation">{<!-- --></span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x1A</span><span class="token punctuation">,</span> <span class="token number">0xA100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x1A</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 GMAC(0x1A) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x4</span><span class="token punctuation">,</span> <span class="token number">0x1A</span><span class="token punctuation">,</span> <span class="token number">0xDEA0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x4</span><span class="token punctuation">,</span> <span class="token number">0x1A</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P4 GMAC(0x1A) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x00</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PORT_STAT(0x00) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x00</span><span class="token punctuation">,</span> <span class="token number">0x0e07</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x00</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PORT_STAT(0x00) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x01</span><span class="token punctuation">,</span> <span class="token number">0xe03e</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PHY_CTRL(0x01) RGMII Timing Control updating......"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x01</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PHY_CTRL(0x01) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x04</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PORT_CTRL(0x04) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>regvalue <span class="token operator">!=</span> <span class="token number">0x007f</span><span class="token punctuation">)</span>
<span class="token punctuation">{<!-- --></span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x04</span><span class="token punctuation">,</span> <span class="token number">0x007f</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x04</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PORT_CTRL(0x04) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 88Q5152 Port1 1000BT Slave Mode init</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8022</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//disable passive sleep mode</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x0007</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctu