Realtek以太网卡DSM功能的实现

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。

你可能感兴趣的:(IO,OS,平台)