Como os erros de leitura do registro MII são tratados para registros phy de 16 bits?

Como os erros de leitura do registro MII são tratados para registros phy de 16 bits?

phy_readO método em /include/linux/phy.h retorna um valor de 32 bits. Os drivers phy usam esse método para ler registros MII de 16 bits. phy_readmétodo retorna um valor de 32 bits. armazenar um valor de 16 bits em um campo de 32 bits torna 0xFFFF como 0x0000FFFF, em um campo de 16 bits que teria sido considerado como -1 (erro) e tratado dessa forma, mas armazenar isso em 32 bits está tornando-o um grande valor positivo em vez de um erro. Isso altera o curso da execução do driver e cria alterações nos parâmetros do link de maneira indesejada.
Observei isso para genphy_read_statuso método em que o valor retornado por phy_readis e int (4 bytes), porém contém 0xFFFF caso as linhas de gerenciamento sejam removidas ou ocorra algum erro. Como o valor retornado é de 4 bytes, todas as verificações que verificam se é menor que zero falham. Nesse cenário, a velocidade e a duplicidade do link são alteradas para a velocidade máxima possível (ou seja, 1000 Mbps), mesmo que não seja capaz disso.
Então, como o driver físico lida com essa situação? É normal que o link altere sua configuração dessa maneira se ocorrer tal erro de hardware? Alterar o tamanho da leitura de int para u16 pode resolver o problema, então por que isso não é feito?
Todos esses problemas foram observados no kernel Linux 3.8.13. A fonte Linux mais recente parece ser semelhante, embora eu não tenha testado a situação de erro nisso.

informação relacionada