Problema no driver LAN9500A Linux USB Ethernet!

2

Estou trabalhando em uma placa personalizada equipada com um módulo iMX28 e o controlador LAN9500A USB para Ethernet sem EEPROM para a interface de rede. O sistema operacional é Linux (kernel v3.16). O LAN9500A está conectado a uma tomada RJ45 com Magnetics e LEDs integrados.

Verifico os esquemas de referência do Microchip em relação ao meu design. http://ww1.microchip.com/downloads/en/DeviceDoc/9500a_sch.pdf

Posso ver que o LAN9500A foi detectado e o driver correto foi carregado ...,

# dmesg | grep -i smsc
[    1.549126] usbcore: registered new interface driver smsc95xx
[    2.186356] smsc95xx v1.0.4
[    2.258622] smsc95xx 1-1:1.0 eth2: register 'smsc95xx' at usb-ci_hdrc.1-1, smsc95xx USB 2.0 Ethernet, 62:94:6a:f1:ec:26
[    9.588663] fec 800f0000.ethernet eth0: Freescale FEC PHY driver [SMSC LAN8710/LAN8720] (mii_bus:phy_addr=800f0000.etherne:00, irq=-1)

Depois que o sistema é ligado, os LEDs de link e atividade acendem ...

# ifconfig eth2 up
IPv6: ADDRCONF(NETDEV_UP): eth2: link is not ready
root@imx28evk:~# IPv6: ADDRCONF(NETDEV_CHANGE): eth2: link becomes ready
smsc95xx 1-1:1.0 eth2: link up, 100Mbps, full-duplex, lpa 0x4DE1
IPv6: eth2: IPv6 duplicate address fe80::fa:25ff:fe59:cf38 detected!

# ifconfig eth2 down

Os LEDs ainda estão acesos ...

# ifconfig eth2 up
smsc95xx 1-1:1.0 eth2: link up, 100Mbps, full-duplex, lpa 0xC5E1

# ifconfig eth2 down 

Os LEDs ainda estão acesos ...

$ ifconfig eth2 up 

Agora os LEDs estão apagados ...

# ethtool eth2
Settings for eth2:
        Supported ports: [ TP MII ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
        Advertised pause frame use: Symmetric Receive-only
        Advertised auto-negotiation: Yes
        Speed: 10Mb/s
        Duplex: Half
        Port: MII
        PHYAD: 1
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: pumbag
        Wake-on: d
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: no

# mii-tool eth2
eth2: no link

# ifconfig eth2 down 

$ ifconfig eth2 up
smsc95xx 1-1:1.0 eth2: link up, 100Mbps, full-duplex, lpa 0xC5E1

LEDs acendem

ethtool eth2
Settings for eth2:
        Supported ports: [ TP MII ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
        Advertised pause frame use: Symmetric Receive-only
        Advertised auto-negotiation: Yes
        Link partner advertised link modes:  10baseT/Half 10baseT/Full
                                             100baseT/Half 100baseT/Full
        Link partner advertised pause frame use: Symmetric
        Link partner advertised auto-negotiation: Yes
        Speed: 100Mb/s
        Duplex: Full
        Port: MII
        PHYAD: 1
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: pumbag
        Wake-on: d
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes

# mii-tool eth2
eth2: negotiated 1000baseT-HD flow-control, link ok

Outra questão é que, quando eu desconecto e conecto o cabo Ethernet do soquete RJ45, o Linux não o detecta, ...

alguém mais viu isso? Eu realmente aprecio qualquer ajuda que você possa fornecer.

BachehKaraji
fonte
1
Seu kernel é muito antigo, a 3.16 não era hoje. Agora, chegamos às 4,12. Sugiro atualizar seu kernel.
Peterh 31/08/19
Eu testei 4.4 e 4.9 ... O problema ainda ocorre.
BachehKaraji
Eu não poderia compilar kernel do 4.12 para imx28 ...
BachehKaraji
Então parece um problema de driver. Se for, então - a menos que você não seja um hacker hardcore do kernel, com habilidades de engenharia reversa de drivers do Windows - você não tem chance. Uma solução possível seria 1) usar o ndiswrapper OR 2) para instalar um winxp de configuração mínima em uma máquina virtual, fornecendo acesso direto ao dispositivo usb. No entanto, se eu o entendo bem, você está em uma arquitetura incorporada, não x86, torna as coisas muito mais difíceis (embora ainda não sejam impossíveis).
Peterh 31/08/19
Você também pode executar um linux x86 virtual em um qemu e usar o ndiswrapper nele.
Peterh 31/08/19

Respostas:

0

Sei que esse problema foi resolvido de alguma forma no Linux Kernel 3.16.48 .

BachehKaraji
fonte