RTL8201CP linux driver

Linux 2009. 4. 28. 09:28
테스트 S/W로 linux가 결정되었고, tftp/nfsroot조합을 사용하려고 했다.  RTL8201CP linux driver를 찾기 위해 백방으로 발품을 팔았으나 망할 RealTek의 홈페이지에 써 있는 글은 대략 다음과 같았다.

Phyceiver는 MAC이 따로 관리해주니까, 우리 소관은 아니고 그 칩 가져다 달은데에서 달라고 해~
  • Q9: Why don't I find RTL8201x driver on the website?
  • A9: 
    RTL8201, RTL8201BL, RTL8201CL, RTL8201CP, RTL8201N and RTL8211B(L) are all PHYceiver. That is a driverless hardware device. Software driver are relative to Network controller ( MAC ) which is integrated into chipset in such case mostly. Please contact your mother board maker or chipset manufacturer to obtain proper driver support.


아놔.. 스켈렉톤 코드라도 주던가.. (내가 몰라서 그런건지... 이게 드라이버가 필요없는 아닌거 같다.. -.-)

쩝.  어쨌뜬.. 또 백방으로 발품을 팔았으나 의외로 없다.  에씨.. 사실 다른 phyceiver 드라이버로도 잘 동작할 것 같은데 (-_-;;) 한가지 찜찜한거는 RTL8201CP가 MDIINT가 없는 거라서... 그게 좀 찜찜했다.  어쨌든간에.. driver/ney/phy에 있는  다른 phydriver하나를 골라서 아래와 같이 고쳤다.

     #include <linux/delay.h>
     #include <linux/skbuff.h>
     #include <linux/phy.h>
    
     static struct phy_driver rtl8201cp_phy_driver = {
             .phy_id         = 0x00008201,
             .name           = "RealTek 8201CP",
             .phy_id_mask    = 0x01ffffff,
             .features       = PHY_BASIC_FEATURES,
             .flags          = PHY_POLL,
             .config_aneg    = genphy_config_aneg,
             .read_status    = genphy_read_status,
             .ack_interrupt  = NULL,
             .config_intr    = NULL,
             .driver = {
                     .owner  = THIS_MODULE,
             },
     };
    
     static int __init rtl8201cp_phy_init(void)
     {
             int ret;
    
             ret = phy_driver_register(&rtl8201cp_phy_driver);
    
             return ret;
     }
    
     static void __exit rtl8201cp_phy_exit(void)
     {
             phy_driver_unregister(&rtl8201cp_phy_driver);
     }
    
     module_init(rtl8201cp_phy_init);
     module_exit(rtl8201cp_phy_exit);


ㅋㅋ 회사에 올릴 때는 맘대로 AUTHOR에 내 이름도 넣었다 -.-  어쨌든 나름 중요하다고 생각한 포인트는 PHY_POLL과 .ack_interrup와 .ctrl_intr를 NULL로 처리한 2부분이라고 생각된다.  물론 이거 말고도 각 board 별로의 configuration도 있지만 그건 올릴만한 내용은 아니라고 생각된다...  PHY_POLL은 phy.h에 지정되어 있고 주석에 나와있길 PHY가 interrupt를 support하지 않으면 쓰라고 한다.  자세한 메카니즘이 궁금하긴 하지만 동작은 대충 알 것 같다.  (main application 에서 실제로 task로 처리함) 

뭐 어찌되었던 잘 동작하니 잘 되었구려~~
Posted by 강군님

댓글을 달아 주세요