驱动程序更改

此文件详细介绍了 2.6 版本中影响 PCMCIA 卡驱动程序作者的更改

  • 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_disable_device,而不是调用 pcmcia_release_{configuration,io,irq,win}。由于没有理由再调用 pcmcia_release_io 和 pcmcia_release_irq,因此删除了它们的导出。

  • 统一 detach 和 REMOVAL 事件代码,以及 attach 和 INSERTION 代码(截至 2.6.16)

    void (*remove)          (struct pcmcia_device *dev);
    int (*probe)            (struct pcmcia_device *dev);
    
  • 将 suspend、resume 和 reset 移出事件处理程序(截至 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)

    在 PCMCIA 卡驱动程序中,ioaddr_t 应替换为 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