DSM:Deep Slumber Mode
Realtek公司2007年开始,在他们的以太网卡上推出了一项新技术,就是DSM功能,这项技术主要针对笔记本平台。简单来说,就是如果网线没有插时,就需要让网卡断电或者进入深度睡眠模式,以节省功耗来延长电池的使用寿命。整个流程很简单,但是我实现起来却走了不少弯路。网卡主要提供了一个DSM_en的bit(IO base + offset 6Dh bit 7), 还有2个GPIO,一个是LAN_Link, 另一个是LAN_DSM,分别对应SB GPIO8 和GPIO13.主要步骤如下:
(1)在POST过程中把DSM_en位置为1.
(2)在OS下,如果网线有插,LAN_LINK为高电平,否则为低电平。
当LAN_link的状态发生变化时,必须发出一个GPE event出来,然后在GPE event里去设置LAN_DSM位。
需要注意的地方有2点:
1. 南桥的GPIO只能水平触发GPE event(高电平或者低电平), 所以每次都必须在event完毕的时候更改GPIO8的触发模式。
2. ASL代码里,变量路径设置不对或者没有设置时,编译时不会报错,但是在执行这行代码时却会因为出错而跳过去。
Method(_L18) // GPIO8 = LAN link event
{
Store(0x18, P80H)
Xor(/_SB.PCI0.LPC0.GNV8, 1, /_SB.PCI0.LPC0.GNV8) //trigger SCI when GPIO8 value change
If(/_SB.PCI0.LPC0.GP08) //if cable plug
{
Store(0, /_SB.PCI0.LPC0.GO13)
Sleep(100) //need wait 100ms after VCC33 high
}
Else //if cable unplug
{
Store(1, /_SB.PCI0.LPC0.GO13)
}
Notify(/_SB.PCI0.EXP1,0)
}
(3)在S3回来时,需要去restore DSM_en这个bit。
在restore时,我遇到了麻烦,因为code一直跑到_WAK这个method里,网卡的IO 资源都处于丢失状态,而进入OS之后
, IO又有回来,证明是OS来管理网卡的资源的。所以在BIOS里,我们需要再给网卡分一次IO资源后,才能去访问到
DSM_en这个bit。