2011年くらいからルーターなどに入っているEthernet Switchチップのサポートを 作っていたようです。当初は一緒にやっていたようなのですが、二つに分かれてしまい StefanBethkeが作られていていたものがheadに入り、ZRouterのOleksandrRybalko のものは外されてしまいました。当初サポート範囲が違っていて混乱していたのですが ほぼほぼheadの方に移行してあります。
一般的なEtherNetのハードはMACとPHYにより構成されますが、ルータなどで使われる SOCではMACをSOCに内蔵してPHYの代わりにSWITCHを接続しています。
AtherosのMIPS SOCの場合最初の頃のAR5312には二つMACがありWANとLANを別々に設定 できた。この後のSOCのAR5315はMACが一つになりWAN,LANを区別するためにVLANが 必須になった。ところがAR7系以降またMACが二つになり、VLANの必要がなくなっている。
AR531xのポートをしたのはこのSOCにはいろいろなスイッチが付いたモジュールが あったからだったりもします。
世の中的はGigaな時代になっているのですが、私はジャンク専門なので100なターゲット が多く偏った資料になっています。
Qiitrでもいろいろ書いています。etherswitchを試してみる
2017/2までにいろいろいじったものをレビュー出してheadに入れてもらいました。
Realtek | rtl8366sr,rb rtl830xsb,sc | rtl8366rbの方はおそらくTP-Link TL-WR1043NDの最初のモデル がターゲットと思われます。日本ではバッファローのWZR-HP-G301NHが同じ構成の ようです。rtl8366rbより一世代古いrtl8366srというチップもあり仕様が違っていて、 headのコードでは動作しないようです。データーシートはネットでダウンロードできる ものもるがRBのものがなかったりSRのものも完全なものは手に入りません。 おそらくRTL8366,RTL8366SR,RTL8366RB,RTL8367RBいうよな感じでリリースされてきた ようです。 srでも使えるようにしたコードレビュー出してheadに入れてもらいました。 100の方のRTL830xはRTL8305SB,SC,RTL8306SDとリリースされたようですが、SBの プロトタイプは作ってみたのですが、SCが手元にないので放置してあります。 | MII/I2C | 1000/100 | |
IC Plus | IP175C | コードがあります。Ether関係のチップメーカーなので単体チップです。 データシートはネットで入手できます。 | MII | 1000/100 | |
Qualcomm (Atheros) | ar8x16 | AR5系の頃は他のメーカのスイッチを使うようにしていたのだが、 AR7系は自社製品に移行した模様。AR8316は1000の外付けの チップですがSOCのAR7240には100のスイッチが内蔵されています。 データシートはネットでは手に入りません。 headにいろいろコードが入っています。 | MII | 1000/100 | |
Broadcom | bcm5325 | 単体チップとMIPS SOCでは100のSwitchが内蔵になったものがあります。 データシートはネットではSOCを含め手に入りません。 ロシアのコミッターのMchaelがいじっていますが、headには入ってません。 | MII | 1000/100 | |
MediaTek (Ralink) | rt305x | Mediatekを再実装した、ユーゴスラビアの方のコードがheadに入っています。 RT3050はportベースのuntaged/tagedでしたが、これ以降はvlan tableベースに なっています。データシートはネットで入手できます。 | MEMIO | 100 | |
Infineon (Admtek) | adm5120 amd6996f adm6996fc/m |
Infineonはドイツの会社で2004年にADMtekを買収してEthernetプロダクトを 製品ラインにしました。しかし現在のホームページを見るとEthernet関係の プロダクトは止めてしまったようです。 amd6996f,fcは単体チップです。fとfcは全くレジスタの構成が違います。 対応のコードを作ってレビューしてheadに入れてもらいました。 データシートはネットで入手できます。 | MII | 100 | |
Marvell | 88E6060 | FON2201などで広く使われていたチップ。コードはありません。 88E6060は.1Qではなく、独自仕様のポート識別をおこなっているので、ちょっと 厄介です。 対応のコードを作ってレビューしてheadに入れてもらいました。独自仕様のtagに ついては対応していません。vlan(4)が使えないのでこれに似たコードが必要に なります。netgraphで作っても良いかもしれません。 ちょうどこのページを書いている時にheadのetherswitchに88E6352,88E6172,88E6176 のコードが追加されていました。88E6060データシートはネットで入手できまが、 新しいチップのデータシートはNDAが必要なようです。 .1Qに対応した6065のコードも6060のコードに入れました。 Gigaのチップのコードもありますが、私は試していません。 | MII | 1000/100 | |
Micrel (KENDIN) | KSZ8995 | コードはいまのところなさそうです。KS8995XAのような単体のチップもありますが ARM SOCに内蔵されたチップもあります。データシートはネットで入手できます。 対応のコードを作ってレビューしてheadに入れてもらいました。 MicrelはMicrochipに買収されたようです。 | SPI | 100 | |
Davicom | DM8806 | なぜか日本国内ではほとんど出回ってない気がします。 | |||
Microsemi (Vitesse) | VSC7385 | コードはいまのところなさそうです。この会社はGigaのチップしか作っていない ように思われます。単体ではよく使われているようですが、現在ではSOCメーカーが ほとんど独自にSwitchのソリューションを持っているのでルータではあまり使われて いません。Vitesseは2015/4にMicrosemiに買収されたようです。 | MII/SPI | 1000 | |
Lantiq | PSB6970 | ドイツの会社で2015年にIntelに買収されたようです。ほとんど日本では使われた 製品は見当たりません。openwrtにはコードがある模様。 | Tamarack | TC9205M | IC Plusに2002年に買収されたようです。 |
2000年より前のSwitchチップにはVLANの機能はありません。VLANはportベースと tagベース(.1q)という仕組みがあります。.1qの仕様の チップが出始めたのは2002年位からだと思う。FreeBSDで内蔵の.1qなVLAN対応の Switchを使うとインターフェースが複数あるように使う事ができる。 データの流れはこんなふうになる。
RTL8366SRが入っているWZR-HP-G300NHをいじってみた。ところがheadに入っている コードはRTL8366RBのコードでRTL8366SRでは動かなかった。RBが入ったルータも 手元にあるが、せっかくなので調べてみたらopenwrtにRBとSRなコードがあり比較 してみたところ、微妙にコントロールレジスタのアドレスが違っていたりした。
そもそもこの機種はGPIOのどこにRTL8366SRがいるのかわからなく1日くらい調べた ところ、19,20ピンにいることがopenwrtなどの情報で分かった。基板のチェック用の パターンがあり、gpioctlでon/offを試し、オシロで信号が確認できた。
ヘッダーファイルをコピーして違っているところ修正して試してみたところ、 Chip Identifierはすぐに拾えるようになったが、その後の処理がまったくおこなわれ ない。デバッグライトをもりもり入れて調べたところI2CのACKが返ってこなくてエラー になっているようだ。I2Cは2本の信号線でデータの読み込みと書き込みをおこなうが、 送ったデータにACKが返ってくる仕組みになっている。
RTL8366SRのI2Cは2バイトのアドレスのレジスタ空間で2バイトの読み書きをする仕様の ようだ。
Chip IdentifierのI2Cの処理とその後の処理は違っていて、分割してコーディング されている。startのackが返ってこないとこでエラーになっていてChip Identifier の方の同様の処理を見るとなにやらあやしげなコメントが書いてあって、同じような 処理を入れてみたとこどうにか動くようになった。ただなぜか最初のリセットだけは まだエラーを起こしているが、とりあえず動いているので、そのうち調べてみたい。 後日追記:リセットはACKが返らない仕様のようです。
rtl8366rbのドライバは以下のような構成になる。
どうにかSR用の修正 を入れて下記の設定でLAN側とarge0がタグ無し設定で使えるように なった。
# etherswitchcfg etherswitch0: VLAN mode: DOT1Q port0: pvid: 1 flags=0<> media: Ethernet autoselect (100baseTX <full-duplex>) status: active port1: pvid: 1 flags=0<> media: Ethernet autoselect (none) status: no carrier port2: pvid: 1 flags=0<> media: Ethernet autoselect (none) status: no carrier port3: pvid: 1 flags=0<> media: Ethernet autoselect (none) status: no carrier port4: pvid: 0 flags=0<> media: Ethernet autoselect (none) status: no carrier port5: pvid: 1 flags=1<CPUPORT> media: Ethernet 1000baseT <full-duplex,rxpause,txpause> status: active vlangroup0: vlan: 1 members 0,1,2,3,5 vlangroup1: vlan: 2 members none
残りのTodoとしては、タグ付きVLAN確認、WAN側の設定機能、GreenEtherサポート、 MIBサポートかな。
NATとしてWZR-HP-G301NHを使う事にした。何故かWZR-HP-G300NH(SR)だと対向のMOTOROLA SB5101Jと相性が悪いのかDHCPでアドレス拾えない事があり、RBのWZR-HP-G301NHだと 問題が起きない。まったく同じfirmware(FreeBSD 12-CURRENT)を焼いていたのでSwitch しか違わないはずなのだが。SR固有な問題かこのモジュールだけの問題かは不明。 (2017/2)