这两个内核之间的一段时间似乎改变了很多数据结构,这在几个地方破坏了我的驱动程序。
首先,在2.6.21中,结构信息有一个字段"struct uart_info * uart_port“,我在几个地方依赖它。我测试了几个地方,以确保它是非空的,如果非空,我还测试它的子字段(结构tty_struct *tty)是否为非空,并使用这些地方来检查是否启用了流控制,以及是否停止了传输。
在2.6.36中,info反向指针被删除了,我不确定如何获取它,或者我试图做的事情的语义是否还有效,因为唯一使用它的串行驱动程序似乎已经定义了处理它的代码,并另外将所有这些数据保存在自己的结构中(这如何工作,甚至正确地维护内核的状态)?
此外,缺少save_and_cli()和restore_flags()。我看到了新的函数local_irq_save()和local_irq_restore(),我可以直接改用它们吗,或者有什么问题吗?
最后,__ioremap不见了。看起来ioremap_noncache可能是替代品,但我还是不确定是否有任何语义差异或陷阱。我假设我不需要ioremap(),因为我直接与硬件对话,但其他一些驱动程序似乎是这样做的,我不知道为什么它会起作用。
发布于 2012-07-25 11:54:06
查看使用相同功能的树内驱动程序在两个版本之间的变化通常是最好的方法。例如,ioc4_serial驱动程序在kernel 2.6.21中使用struct uart_port的info成员,但已由kernel 2.6.36切换为使用struct uart_state *state成员。
该驱动程序通过以下方式获取tty_struct:
state = the_port->state;
tty = state->port.tty;https://stackoverflow.com/questions/11636860
复制相似问题