I have been testing a product using the DP83848K transceiver to transmit TCP/UDP data for process monitoring, and I have been running into an issue when forcing network speed via an ethernet switch.
The transceiver is configured to auto-negotiate link speed and duplex mode. The microcontroller that interfaces with the transceiver has a dedicated thread that reads the BMSR register (0x01) to determine if the link is down or up (Bit 2 Link Status 0 or 1, respectively). If the link goes down, then the MAC interface is disabled until the link comes back up (Link Status set to 1), at which point auto-negotiation is started to determine link speed and duplex mode, which is used to configure the MAC interface.
When initially connecting the DUT to the network or after power cycling the DUT, communication proceeds as expected. Additionally, if the switch is changed from auto-negotiate to forced 10M or 100M, the DUT responds to the change in speed. However, if the switch is set to force 10M speed and is then set to force 100M speed, communication is lost and the switch reports that the link is down. It is possible to recover communciation, but it requires either power cycling the DUT, forcing network speed back to 10M, or setting the switch back to auto-negotiation. Operating the microcontroller in debug mode, when the network speed is forced from 10M to 100M, the BMSR register never reports that the link goes down, so the DUT never reconfigures the MAC interface.
Is there a reason why the transceiver never reports a link down state when forcing network speed from 10M to 100M operation and can this fixed? Alternatively, is there a better way of determining that the MAC needs to be reconfigured?