cs8900網絡卡驅動簡要解析 5

2021-08-22 17:16:23 字數 1628 閱讀 9788

上次說到的cs8900_start函式中,完成了中斷申請任務。什麼是中斷?中斷是一種電訊號,由硬體裝置產生,並直接送入中斷控制器的輸入引腳上,然後再由中斷控制器向處理器傳送相應的訊號。

其中中斷處理函式cs8900_interrupt沒有講。中斷處理函式是中斷發生時系統要執行的函式。本文將主要介紹中斷處理函式的功能。我們不分析中斷實現機制,而是關心中斷發生時,要做哪些事情。要知道,中斷處理函式設計的好壞,會直接關心到效能乃至穩定問題。

雖然我不會講中斷的實現,但是你必須清楚中斷的兩種型別:

1.輪詢(polling

讓核心定期對裝置的狀態進行查詢,然後做出相應的處理;

2.中斷(interrupt

讓硬體在需要的時候向核心發出訊號(變核心主動為硬體主動)。

如果你對中斷的實現感興趣,你應該去了解hw_interrupt_type、irq_desc_t 和irqaction

這些資料結構。

我們的中斷處理函式通過switch/case語句判斷中斷型別,並進行相應處理。具體過程是:首先讀出isq暫存器的值,然後根據isq的值分別處理各種情況。當中斷發生時,這些中斷實際反映在相應的暫存器中,isq暫存器用低6位記錄了當前暫存器的編號,高10位記錄了當前暫存器的實際內容。**如下:

while ((status = cs8900_read (dev, pp_isq))) else if (priv->txlen)

priv->txlen = 0;

netif_wake_queue (dev);

break;

case bufevent:

//兩種情況,分別進行處理。

//當rxmiss置位,表示傳輸過程中丟幀,於是讀暫存器獲取丟失的包的數目。

if ((regcontent (status) & rxmiss))

//當txunderrun置位,表示在幀結束前網絡卡執行已過時。改變網路狀態結構體中對應元素的值,接著通知上層可往下傳送包資料。

if ((regcontent (status) & txunderrun))

/* fixme: if rdy4tx, transmit last sent packet (if any) */

break;

case txcol:

//當傳輸出現衝突錯誤時,通過讀暫存器值得到當前衝突的個數,加到統計結構體中的對應元素值上。

priv->stats.collisions += colcount (cs8900_read (dev,pp_txcol));

break;

case rxmiss:

//讀暫存器獲取丟失幀的個數。

status = misscount (cs8900_read (dev,pp_rxmiss));

priv->stats.rx_errors += status;

priv->stats.rx_missed_errors += status;

break;}

其中的細節我們下次再說。

一句話總結:中斷處理函式是中斷產生時執行的函式,它根據中斷種類進行處理。

cs8900網絡卡驅動簡要解析 4

我們最初分析的函式是 cs8900 init 並由此展開,跟蹤到了 cs8900 probe cs8900 read cs8900 write 等,現在收回來,還是回到 cs8900 init中。在 cs8900 init 裡找到如下一行 ndev open cs8900 start 如果你之前了解...

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是網路驅動中最為重要的乙個結構,需要認真閱讀,其原型...