1. 程式人生 > >(8)高通AP10.4開發者指南——WLAN(2.2 上下文及同步處理)

(8)高通AP10.4開發者指南——WLAN(2.2 上下文及同步處理)

2.2 上下文及同步處理

WLAN驅動在不同的上下文處理中執行,比如

  • ISR上下文
  • Softirq(軟中斷)/tasklet(核心軟中斷延遲機制)上下文
  • Process(程序)上下文

2.2.1 ISR處理

WLAN裝置成功附著之後(ath_attach函式呼叫),驅動會為這個裝置請求一個IRQ資源,並註冊ath_isr中斷服務例程(ISR)。驅動同時會初始化一個叫做ath_tasklet的tasklet資源。ath_isr首先會通過掃描WLAN硬體的待處理的中斷,來檢查這個中斷是否是來自這個裝置。一旦這個中斷被確認是來自WLAN裝置的中斷,他將根據中斷狀態暫存器,來運用tasklet,進行中斷對應的處理。有一些時間敏感的處理,比如軟體beacon alert處理,UAPSD觸發處理等,會在ISR上下文中直接處理。其中一些時間敏感的處理,可以在編譯時,指定其在tasklet上下文中執行,執行所需的時間可以設定。ath_isr處理的最後階段,如果tasklet開始執行,所有的WLAN裝置中斷會被禁用,除了那些時間敏感的中斷。

2.2.2 Softirq/Tasklet處理

ath_tasklet的處理,是在tasklet上下文中執行的。ath_tasklet檢查儲存的中斷狀態值(通過ath_isr),並執行相應的動作。一些ath_tasklet的功能包括:

  • 異常處理
  • 傳輸結束處理
  • 收到幀時的處理

在tasklet的最後,WLAN裝置中斷,會根據當前中斷mask的設定值,被再次使能。網路裝置上的網路幀傳輸,在NETIF softirq上下文中進行。所有的OS timers處理,都在TIMER softirq上下文中進行。

2.2.3 程序上下文(Process Context)

所有對驅動進行的訪問,都通過執行在程序上下文中的ioctl系統介面來進行。

2.2.4 同步處理(Synchronization)

上面提到的上下文(context)之間的同步處理是必須的,因為有一些data是各個context之間share的。
大多數WLAN驅動使用的同步方法是spin_lock。Linux提供了不同型別的spin_lock,比如spin_lock、spin_lock_bh、spin_lock_irq和spin_lock_irqsave。表2-1大體描述了各個context之間使用了何種spin_lock來完成同步機制。

Table 2-1 同步方法

- ISR Softirq/Tasklets Process context
ISR - spin_lock_irqsave spin_lock_irqsave
Softirq/Tasklets spin_lock_irqsave spin_lock spin_lock_bh
Process context spin_lock_irqsave spin_lock_bh -

驅動中使用到的其他一些同步技術有:

  • 原子操作(Atomic):任何主要的操作都是uninterruptable的。
  • 讀寫鎖(Read/write lock):讀寫鎖和spin_lock類似,但主要用於從driver中分離處理的read/write操作。Linux提供了許多和spin_lock相似的讀寫鎖來完成context之間的同步,他們的主要思想和用法都是類似的,主要是用於不同型別的read/write操作。