看来这两个内核之间有一段时间内很多数据结构发生了变化,它在几个地方打破了我的驱动程序。
首先,在2.6.21中,struct uart_port有一个字段“struct uart_info * info”,我在几个地方依赖它。我测试了几个地方以确保它是非空的,如果非空,我另外测试它的子字段(struct tty_struct * tty)是否为非空,并且我使用这些来检查是否启用了流量控制,如果我们停止传播。
在2.6.36中,信息返回指针已被删除,我不知道如何获取它,或者我正在尝试做的语义甚至是否有效,作为唯一的串行驱动程序甚至使用它似乎有ifdef'ed出处理它的代码,并另外将所有这些数据保存在自己的结构中(如何工作甚至正确维护内核状态)???
此外,缺少save_and_cli()和restore_flags()。我看到新函数local_irq_save()和local_irq_restore(),我可以切换到使用那些,还是有任何陷阱?
最后,缺少__ioremap。看起来ioremap_noncache可能是替代品,但我不确定是否存在任何语义差异或陷阱。我会假设我不想要ioremap(),因为我直接与硬件交谈,但其他一些驱动程序似乎这样做,我不知道为什么会这样。
答案 0 :(得分:2)
查看在两个版本之间使用相同功能的树内驱动程序如何发生变化通常是最好的方法。例如,ioc4_serial
驱动程序使用kernel 2.6.21中info
的{{1}}成员,但已切换为kernel 2.6.36使用struct uart_port
成员。
该驱动程序获取struct uart_state *state
:
tty_struct