Como os erros de leitura de registradores MII são manipulados para registradores 16bit phy?

1
O método

phy_read em /include/linux/phy.h retorna um valor de 32 bits. Para drivers phy, este método é usado para ler registros MII de 16 bits. No entanto, retorna um valor de 32 bits. armazenar um valor de 16 bits em um campo de 32 bits torna 0xFFFF como 0x0000FFFF, no campo de 16 bits que teria sido considerado como -1 (erro) e tratado dessa maneira, 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 parâmetros de link de alterações de maneira indesejada.
Observei isso para o método genphy_read_status , em que o valor retornado por phy_read é e int (4 bytes), no entanto, ele contém 0xFFFF no caso de as linhas de gerenciamento serem removidas ou ocorrer algum erro. Como o valor retornado é de 4 bytes, todas as verificações que verificam se ele é menor que zero falharão. Nesse cenário, a velocidade e a duplicidade do link são alteradas para a velocidade máxima possível (ou seja, 1000Mbps), mesmo que não seja capaz disso.
Então, como o driver phy lida com essa situação? É normal que o link altere sua configuração de tal maneira se tal erro de hardware ocorrer? Alterar o tamanho da leitura para u16 do int pode resolver o problema, então por que isso não é feito?
Todos esses problemas foram observados no kernel do Linux 3.8.13. A fonte mais recente do Linux parece ser semelhante, embora eu não tenha testado a situação do erro.

    
por chandola 30.11.2017 / 08:18

0 respostas