4.2. Sincronización

El controlador se ejecuta como dos flujos de control de un sólo hilo independientes. Uno es la rutina de enviar paquetes, que fuerza el uso de un hilo simple por medio de la flag dev->tbusy. El otro hilo es el manejador de interrupciones, que es un hilo simple por culpa del hardware y de otro software.

El hilo de enviar paquetes tiene control parcial sobre el anillo Tx y sobre la bandera 'dev->tbusy'. Establece la bandera tbusy cuando está encolando un paquete Tx. Si el siguiente slot de la cola está vacío, límpia la bandera tbusy cuando ha acabado y en otro caso establece la bandera 'tp->tx_full'.

El manejador de interrupciones tiene un control exclusivo sobre el anillo Tx y las estadísticas grabadas para el anillo Tx. (La interrupción Tx-done no puede ser desconectada selectivamente, por lo tanto no podemos eliminar la interrupción sobre nosotros teniendo la rutina Tx recogiendo las estadísticas Tx.) Después de recoger las estadísticas, marca la cola de entrada como vacía estableciendo la 'base' a cero. Si la bandera 'tp->tx_full' está establecida, entonces limpia las banderas tx_full y tbusy.