我們最初分析的函式是
cs8900_init
,並由此展開,跟蹤到了
cs8900_probe
、cs8900_read
、cs8900_write
等,現在收回來,還是回到
cs8900_init中。在
cs8900_init
裡找到如下一行**:
ndev->open= cs8900_start;
如果你之前了解過字元裝置,你很容易聯想到
file_operation
中的open
。其實它們是一樣的。
open
函式在網路裝置被啟用時(
ifconfig
)呼叫。因此,我們在編寫網絡卡驅動時,要考慮網絡卡啟用時,需要完成哪些事情。通常要進行中斷的申請、資源的申請等。在
cs8900
的驅動中,主要完成兩件事情:啟用網絡卡和申請中斷。啟用網絡卡的**如下:
cs8900_set (dev,pp_rxcfg,rxokie | buffercrc | crcerrorie | runtie | extradataie);
cs8900_set (dev,pp_rxctl,rxoka | individuala | broadcasta);
cs8900_set (dev,pp_txcfg,txokie | out_of_windowie | jabberie);
cs8900_set (dev,pp_bufcfg,rdy4txie | rxmissie | txunderrunie | txcolovfie | missovfloie);
cs8900_set (dev,pp_linectl,serrxon | sertxon);
cs8900_set (dev,pp_busctl,enablerq);
申請中斷的方法和以前一樣:
request_irq (dev->irq, &cs8900_interrupt, 0, dev->name, dev))
顯然,我們下乙個任務就是完成中斷處理函式了
(cs8900_interrupt)
,我們後面再說。
當資源準備就緒後,需要呼叫
netif_start_queue
函式開啟網路介面的接收和傳送資料佇列。這個函式原型在
netdevivce.h
中。與它類似的還有乙個函式,叫
netif_wake_queue
。有人更喜歡使用
netif_wake_queue
函式,因為它可以通知網路系統可再次開始傳輸資料報。
static inline void netif_start_queue(struct net_device *dev)
static inline void netif_wake_queue(struct net_device *dev)
#endif
if (test_and_clear_bit(__link_state_xoff, &dev->state))
__netif_schedule(dev);
}一句話總結:我們需要實現乙個
open
函式,用來完成資源申請和開啟網路介面的資料佇列任務。
cs8900網絡卡驅動簡要解析 4
我們最初分析的函式是cs8900 init,並由此展開,跟蹤到了cs8900 probe cs8900 read cs8900 write等,現在收回來,還是回到cs8900 init中。ndev open cs8900 start 如果你之前了解過字元裝置,你很容易聯想到file operatio...
cs8900網絡卡驅動簡要解析 7
上一次講的cs8900 receive函式是在中斷處理函式中呼叫的,也就是當中斷到來,如果判斷出是資料接收情況,則通過這個函式進行資料接收。那麼如果中斷是由於其他事件觸發的呢,當然就需要其他 了,不過那些 並不難,大家自己看就是了。中斷的內容講完後,cs8900 start函式也算告一段落,我們回到...
cs8900網絡卡驅動簡要解析 1
和所有其他模組一樣,函式init module是cs8900的入口 module init cs8900 init module exit cs8900 cleanup cs8900 init函式填充net device結構體。net device是網路驅動中最為重要的乙個結構,需要認真閱讀,其原型...