¿Cómo se manejan los errores de lectura de registros MII para registros phy de 16 bits?

¿Cómo se manejan los errores de lectura de registros MII para registros phy de 16 bits?

phy_readEl método en /include/linux/phy.h devuelve un valor de 32 bits. Los controladores phy utilizan este método para leer registros MII que son de 16 bits. phy_readEl método devuelve un valor de 32 bits. almacenar un valor de 16 bits en un campo de 32 bits hace que 0xFFFF sea 0x0000FFFF, en un campo de 16 bits eso se habría considerado como -1 (error) y se habría tratado de esa manera, pero almacenarlo en 32 bits lo convierte en un valor positivo grande en lugar de un error. Esto cambia el curso de la ejecución del controlador y crea cambios en los parámetros del enlace de manera no deseada.
Observé esto para genphy_read_statusel método donde el valor devuelto por phy_reades e int(4 bytes), sin embargo, contiene 0xFFFF en caso de que se eliminen las líneas de administración o se produzca algún error. Dado que el valor devuelto es de 4 bytes, todas las comprobaciones que comprueban si es menor que cero fallan. En tal escenario, la velocidad y la duplicidad del enlace se cambian a la velocidad máxima posible (es decir, 1000 Mbps), incluso si no es capaz de hacerlo.
Entonces, ¿cómo maneja el controlador phy tal situación? ¿Es normal que el enlace cambie su configuración de esa manera si se produce dicho error de hardware? Cambiar el tamaño de lectura a u16 desde int podría resolver el problema, entonces, ¿por qué no se hace?
Todos estos problemas se observaron en el kernel de Linux 3.8.13. La última fuente de Linux parece ser similar, aunque no probé la situación de error al respecto.

información relacionada