编写设备驱动程序

gldm_intr() 入口点

int prefix_intr(gld_mac_info_t *macinfo);

当设备可能已中断时,便会调用 gldm_intr()。由于其他设备可以共享中断,因此,驱动程序必须检查设备状态以确定此设备是否实际导致了中断。如果驱动程序所控制的设备并未导致中断,则此例程必须返回 DDI_INTR_UNCLAIMED。否则,驱动程序必须修复中断并返回 DDI_INTR_CLAIMED。如果中断由成功接收包导致,则此例程应该将已接收的包放入类型为 M_DATA 的 STREAMS 消息中,并将此消息传递给 gld_recv()

gld_recv() 将传入包向上游传递到网络协议栈的相应下一层。在调用 gld_recv 之前,此例程必须正确设置 STREAMS 消息的 b_rptrb_wptr() 成员。

在调用 gld_recv() 期间,驱动程序应该避免持有互斥锁或其他锁。需要特别指出的是,在调用 gld_recv() 期间,不得持有传输线程可使用的锁。在某些情况下,调用 gld_recv() 的中断线程可发送传出包,这会导致调用驱动程序的 gldm_send() 例程。如果在调用 gld_recv()gldm_send() 尝试获取 gldm_intr() 持有的互斥锁,则会由于存在递归互斥锁入口操作而出现紧急情况。在调用 gld_recv() 时,如果其他驱动程序入口点尝试获取驱动程序所持有的互斥锁,则会导致死锁。

中断代码应该针对所有错误递增统计计数器。这些错误包括分配已接收数据所需的缓冲区时出现的故障,以及所有特定于硬件的错误(如 CRC 错误或帧错误)。