驅動程式變更¶
此檔案詳細說明了影響 PCMCIA 卡驅動程式作者的 2.6 中的更改
- pcmcia_loop_config() 和自動配置 (截至 2.6.36)
如果相應地設定了 struct pcmcia_device *p_dev->config_flags,則 pcmcia_loop_config() 現在會自動設定某些配置值,但驅動程式仍可以在回撥函式中覆蓋這些設定。 目前提供了以下自動配置選項
CONF_AUTO_CHECK_VCC:檢查匹配的 Vcc
CONF_AUTO_SET_VPP:設定 Vpp
CONF_AUTO_AUDIO:自動啟用音訊線路(如果需要)
CONF_AUTO_SET_IO:設定 ioport 資源 (->resource[0,1])
CONF_AUTO_SET_IOMEM:設定第一個 iomem 資源 (->resource[2])
- pcmcia_request_configuration -> pcmcia_enable_device (截至 2.6.36)
pcmcia_request_configuration() 已重新命名為 pcmcia_enable_device(),因為它與 pcmcia_disable_device() 相對應。 配置設定現在儲存在 struct pcmcia_device 中,例如,在欄位 config_flags、config_index、config_base、vpp 中。
- pcmcia_request_window 變更 (截至 2.6.36)
現在,驅動程式需要填寫 struct pcmcia_device *p_dev->resource[2,3,4,5] 來代替 win_req_t,最多可用於四個 ioport 範圍。 呼叫 pcmcia_request_window() 後,找到的區域將被保留並且可以立即使用 -- 直到呼叫 pcmcia_release_window()。
- pcmcia_request_io 變更 (截至 2.6.36)
現在,驅動程式需要填寫 struct pcmcia_device *p_dev->resource[0,1] 來代替 io_req_t,最多可用於兩個 ioport 範圍。 呼叫 pcmcia_request_io() 後,將保留找到的埠,在呼叫 pcmcia_request_configuration() 後,可以使用它們。
- 沒有 dev_info_t,沒有 cs_types.h (截至 2.6.36)
dev_info_t 和一些其他 typedef 已刪除。 不再在 PCMCIA 裝置驅動程式中使用它們。 此外,不要包含 pcmcia/cs_types.h,因為此檔案已刪除。
- 沒有 dev_node_t (截至 2.6.35)
不再需要填寫 “dev_node_t” 結構。
- 新的 IRQ 請求規則 (截至 2.6.35)
驅動程式現在可以在舊的 pcmcia_request_irq() 介面之間進行選擇
直接呼叫 request_irq/free_irq。 使用來自 *p_dev->irq 的 IRQ。
使用 pcmcia_request_irq(p_dev, handler_t); PCMCIA 核心將在呼叫 pcmcia_disable_device() 或裝置彈出時自動清理。
- 沒有 cs_error / CS_CHECK / CONFIG_PCMCIA_DEBUG (截至 2.6.33)
請使用 Linux 風格的返回值檢查來代替 cs_error() 回撥或 CS_CHECK() 宏,並且 - 如果必要 - 使用 “dev_dbg()” 或 “
pr_debug()” 的除錯訊息。
- 新的 CIS 元組訪問 (截至 2.6.33)
驅動程式應使用 “pcmcia_get_tuple()” 代替 pcmcia_get_{first,next}_tuple()、pcmcia_get_tuple_data() 和 pcmcia_parse_tuple(),如果它只對一個(原始)元組感興趣,或者如果它對一種型別的所有元組感興趣,則使用 “pcmcia_loop_tuple()”。 為了從 CISTPL_FUNCE 解碼 MAC,添加了一個新的助手 “pcmcia_get_mac_from_cis()”。
- 新的配置迴圈助手 (截至 2.6.28)
透過呼叫 pcmcia_loop_config(),驅動程式可以遍歷所有可用的配置選項。 在驅動程式的 probe() 階段,在大多數情況下(如果不是全部),不需要直接使用 pcmcia_get_{first,next}_tuple、pcmcia_get_tuple_data 和 pcmcia_parse_tuple。
- 新的釋放助手 (截至 2.6.17)
現在,代替呼叫 pcmcia_release_{configuration,io,irq,win},只需呼叫 pcmcia_disable_device。 由於沒有留下任何有效的理由來呼叫 pcmcia_release_io 和 pcmcia_release_irq,因此刪除了它們的匯出。
統一分離和 REMOVAL 事件程式碼,以及附加和 INSERTION 程式碼(截至 2.6.16)
void (*remove) (struct pcmcia_device *dev); int (*probe) (struct pcmcia_device *dev);
將暫停、恢復和重置移出事件處理程式 (截至 2.6.16)
int (*suspend) (struct pcmcia_device *dev); int (*resume) (struct pcmcia_device *dev);
應在 struct pcmcia_driver 中初始化,並處理 (SUSPEND == RESET_PHYSICAL) 和 (RESUME == CARD_RESET) 事件
- struct pcmcia_driver 中的事件處理程式初始化 (截至 2.6.13)
事件處理程式收到所有事件的通知,並且必須在驅動程式的 struct pcmcia_driver 中初始化為 event() 回撥。
- 不應使用 pcmcia/version.h (截至 2.6.13)
此檔案最終將被刪除。
- 核心裝置<->驅動程式匹配 (截至 2.6.13)
現在可以在核心空間中匹配 PCMCIA 裝置及其正確的驅動程式。 有關詳細資訊,請參見“裝置表”。
- 裝置模型整合 (截至 2.6.11)
struct pcmcia_device 註冊到裝置模型核心,並且可以透過使用 handle_to_dev(client_handle_t * handle) 來使用(例如,用於 SET_NETDEV_DEV)。
- 將內部 I/O 埠地址轉換為 unsigned int (截至 2.6.11)
ioaddr_t 應在 PCMCIA 卡驅動程式中替換為 unsigned int。
- irq_mask 和 irq_list 引數 (截至 2.6.11)
不應再在 PCMCIA 卡驅動程式中使用 irq_mask 和 irq_list 引數。 相反,PCMCIA 核心的工作是確定應使用哪個 IRQ。 因此,link->irq.IRQInfo2 被忽略。
- client->PendingEvents 已消失 (截至 2.6.11)
client->PendingEvents 不再可用。
- client->Attributes 已消失 (截至 2.6.11)
client->Attributes 未使用,因此已從所有 PCMCIA 卡驅動程式中刪除
- 核心函式不再可用 (截至 2.6.11)
由於核心驅動程式中未使用以下函式,並且沒有報告外部驅動程式依賴它們,因此已從核心原始碼中刪除它們
pcmcia_get_first_region() pcmcia_get_next_region() pcmcia_modify_window() pcmcia_set_event_mask() pcmcia_get_first_window() pcmcia_get_next_window()
- 模組刪除時的裝置列表迭代 (截至 2.6.10)
不再需要在模組刪除時迭代驅動程式的內部客戶端列表並呼叫 ->detach() 函式。
- 資源管理 (截至 2.6.8)
雖然 PCMCIA 子系統將為卡分配資源,但它不再將這些資源標記為忙碌。 這意味著驅動程式作者現在有責任像 Linux 中的其他驅動程式一樣宣告您的資源。 您應該使用 request_region() 來標記您的 IO 區域正在使用,並使用 request_mem_region() 來標記您的記憶體區域正在使用。 name 引數應是指向您的驅動程式名稱的指標。 例如,對於 pcnet_cs,name 應指向字串“pcnet_cs”。
CardServices 已消失 2.4 中的 CardServices() 只是一個大的 switch 語句,用於呼叫各種服務。 在 2.6 中,所有這些入口點都已匯出並直接呼叫(除了 pcmcia_report_error(),只需改用 cs_error())。
struct pcmcia_driver 您需要使用 struct pcmcia_driver 和 pcmcia_{un,}register_driver 而不是 {un,}register_pccard_driver