驱动程序变更¶
此文件详细说明了影响 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