トップ 最新 追記
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2011年03月09日

linux/ax88796ドライバ

Linux-2.6標準の ax88796.c ドライバでは MII通信がうまくいかず、Link UP/DOWN が取れなかったり autoneg をオフにできなかったりした。
結局 asix.com.tw が提供している ax88796b.c を見て解決した。
 ・AX88796BLIのデータシート(P61 6.5 CPU Access MII Serial Management Interface)
   見てもよくわからないのだが、Preamble部は1を32bit送出する。
 ・Read/Write共にTA部は2bit。つまり TA 2bit + DATA 16 bit => 18bitリードして下位16bitを採用する。
   標準ドライバで17bitリードしているのは誤り
 ・CLOCK は常に L -> H の順で統一する。
パッチ
 --- linux-2.6.32-cat_20110225/drivers/net/ax88796.c     2010-08-06 19:26:52.000000000 +0900
 +++ linux-2.6.32-cat_20110309/drivers/net/ax88796.c     2011-03-10 00:00:34.000000000 +0900
 @@ -342,20 +342,17 @@
                 else
                         memr &= ~AX_MEMR_MDO;
 
 +               /* clock low */
                 ei_outb(memr, memr_addr);
 
                 /* clock high */
 -
                 ei_outb(memr | AX_MEMR_MDC, memr_addr);
 -               udelay(1);
 -
 -               /* clock low */
 -               ei_outb(memr, memr_addr);
         }
 -
 +#if 0
         /* leaves the clock line low, mdir input */
         memr |= AX_MEMR_MDIR;
         ei_outb(memr, (void __iomem *)dev->base_addr + AX_MEMR);
 +#endif
  }
 
  /* ax_phy_ei_inbits
 @@ -378,14 +375,16 @@
         ei_outb(memr, memr_addr);
 
         for (no--; no >= 0; no--) {
 -               ei_outb(memr | AX_MEMR_MDC, memr_addr);
 +               /* clock low */
 +               ei_outb(memr, memr_addr);
 
                 udelay(1);
 
                 if (ei_inb(memr_addr) & AX_MEMR_MDI)
                         result |= (1<page_lock, flags);
ethtool を使うといろいろできる
cat /sys/class/net/eth0/carrier
 
ethtool eth0       状態表示
ethtool -r eth0    autonegやり直し
ethtool -s eth0 autoneg off
ethtool -s eth0 speed 10
ethtool -s eth0 speed 100
ethtool -s eth0 duplex half
ethtool -s eth0 duplex full