17.15. 幾個(gè)其他細(xì)節(jié)

2018-02-24 15:50 更新

17.15.?幾個(gè)其他細(xì)節(jié)

本節(jié)涵蓋了幾個(gè)其他主題, 對(duì)網(wǎng)絡(luò)驅(qū)動(dòng)作者感興趣的. 在每種情況, 我們?cè)囍?jiǎn)單指點(diǎn)你正確的方向. 獲取了一個(gè)主題的完整描繪可能還需要花費(fèi)一些時(shí)間深入內(nèi)核源碼.

17.15.1.?獨(dú)立于媒介的接口支持

媒介獨(dú)立接口(或 MII) 是一個(gè) IEEE 802.3 標(biāo)準(zhǔn), 描述以太網(wǎng)收發(fā)器如何與網(wǎng)絡(luò)控制器接口; 很多市場(chǎng)上的產(chǎn)品遵守這個(gè)接口. 如果你在編寫(xiě)一個(gè)驅(qū)動(dòng)為一個(gè) MII 兼容控制器, 內(nèi)核輸出了一個(gè)通用 MII 支持層, 可能會(huì)使你易做一些.

為使用通用 MII 層, 你應(yīng)當(dāng)包含 <linux/mii.h>. 你需要填充一個(gè) mii_if_info 結(jié)構(gòu)使用收發(fā)器的物理 ID 信息, 如是否全雙工有效. 還要求 mii_if_info 結(jié)構(gòu)的 2 個(gè)方法:


int (*mdio_read) (struct net_device *dev, int phy_id, int location);
void (*mdio_write) (struct net_device *dev, int phy_id, int location, int val); 

如你可能預(yù)料的, 這些方法應(yīng)當(dāng)實(shí)現(xiàn)與你的特殊 MII 接口的通訊.

通用的 MII 代碼提供一套函數(shù), 來(lái)查詢和改變收發(fā)器的操作模式; 許多設(shè)計(jì)成與 ethtool 工具一起工作( 下一節(jié)描述 ). 在 <linux/mii.h> 和 drivers/net/mii.c 中查看細(xì)節(jié).

17.15.2.?ethtool 支持

ethtool 是一個(gè)實(shí)用工具, 設(shè)計(jì)來(lái)給系統(tǒng)管理員以大量的控制網(wǎng)絡(luò)接口的操作. 用 ethtool, 可能來(lái)控制各種接口參數(shù), 包括速度, 介質(zhì)類型, 雙工模式, DMA 環(huán)設(shè)置, 硬件校驗(yàn)和, LAN 喚醒操作, 等等, 但是只有當(dāng) ethtool 被驅(qū)動(dòng)支持. ethtool 可以從 http://sf.net/projects/gkernel/. 下載.

對(duì) ethtool 支持的相關(guān)聲明可在 <linux/ethtool.h> 中找到. 它的核心是一個(gè) ethtool_ops 類型的結(jié)構(gòu), 里面包含一個(gè)全部 24 個(gè)不同方法來(lái)支持 ethtool. 大部分這些方法是相對(duì)直接地; 細(xì)節(jié)看 <linux/ethtool.h>. 如果你的驅(qū)動(dòng)使用 MII 層, 你能使用 mii_ethtool_gset 和 mii_ethtool_sset 來(lái)實(shí)現(xiàn) get_settings 和 set_settings 方法, 分別地.

對(duì)于和你的設(shè)備一起工作的 ethtool, 你必須放置一個(gè)指向你的 ethtool_ops 結(jié)構(gòu)的指針在 net_devcie 結(jié)構(gòu)中. 宏定義 SET_ETHTOOL_OPS( 在 <linux/netdevice.h> 中定義)應(yīng)當(dāng)用作這個(gè)目的. 注意你的 ethtool 方法可能會(huì)在接口關(guān)閉時(shí)被調(diào)用.

Netpoll

17.15.3.?netpoll

"netpoll" 是相對(duì)遲的增加到網(wǎng)絡(luò)協(xié)議棧中; 它的目的是使內(nèi)核能夠發(fā)送和接收?qǐng)?bào)文, 在完整的網(wǎng)絡(luò)和I/O子系統(tǒng)不可用的情況下. 它用來(lái)給如遠(yuǎn)程網(wǎng)絡(luò)控制臺(tái)和遠(yuǎn)程內(nèi)核調(diào)試等特色使用的. 無(wú)論如何, 你的驅(qū)動(dòng)不必支持 netpoll, 但是它可能使你的驅(qū)動(dòng)在某些情況下更有用. 在大部分情況下支持 netpoll 也相對(duì)容易.

實(shí)現(xiàn) netpoll 的驅(qū)動(dòng)應(yīng)當(dāng)實(shí)現(xiàn) poll_controller 方法. 它的工作是跟上控制器上可能發(fā)生的任何東西, 在缺乏設(shè)備中斷時(shí). 幾乎所有的 poll_controller 方法采用下面形式:


void my_poll_controller(struct net_device *dev)
{
    disable_device_interrupts(dev);
    call_interrupt_handler(dev->irq, dev, NULL);
    reenable_device_interrupts(dev);
}

poll_controller 方法, 實(shí)際上, 是簡(jiǎn)單模擬自給定設(shè)備的中斷.

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)