编写设备驱动程序

gldm_send() 入口点

int prefix_send(gld_mac_info_t *macinfo, mblk_t *mp);

gldm_send() 可将要发送到设备的包进行排队以进行传输。将向此例程传递包含要发送的包的 STREAMS 消息。此消息可能包括多个消息块。send() 例程必须遍历消息中的所有消息块,以访问要发送的整个包。应对驱动程序进行适当设置,以便处理并跳过链表中所有零长度的消息连续块。驱动程序还应该检查包是否未超过最大允许包大小。如有必要,驱动程序必须将包填充到最小允许包大小。如果发送例程成功传输包或对包排队,则应该返回 GLD_SUCCESS

如果无法立即接受要传输的包,则发送例程应该返回 GLD_NORESOURCES。在这种情况下,GLDv2 会稍后重试。如果 gldm_send() 曾经返回 GLD_NORESOURCES,则驱动程序必须在稍后资源变得可用时调用 gld_sched()。此 gld_sched() 调用会通知 GLDv2 重试驱动程序先前无法对其进行排队以进行传输的包。(如果调用驱动程序的 gldm_stop() 例程,则会为驱动程序免除这种职责,直到驱动程序从 gldm_send() 例程返回 GLD_NORESOURCES 为止。不过,再次调用 gld_sched() 也不会导致错误操作。)

如果驱动程序的发送例程返回 GLD_SUCCESS,则驱动程序会负责释放不再需要的消息。如果硬件使用 DMA 直接读取数据,则驱动程序在硬件完全读取数据之前不得释放消息。在这种情况下,驱动程序可以释放中断例程中的消息。或者,驱动程序可以在将来发送操作的开始回收缓冲区。如果发送例程返回 GLD_SUCCESS 之外的任何内容,则驱动程序不得释放消息。如果在不存在到网络或链路伙伴的物理连接时调用 gldm_send(),则会返回 GLD_NOLINK