]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[lan78xx] Always enable automatic speed and duplex detection
authorMichael Brown <mcb30@ipxe.org>
Sun, 29 Sep 2019 19:59:22 +0000 (20:59 +0100)
committerMichael Brown <mcb30@ipxe.org>
Sun, 29 Sep 2019 19:59:22 +0000 (20:59 +0100)
On devices with no EEPROM or OTP, the MAC_CR register defaults to not
using automatic link speed detection, with the result that no packets
are successfully sent or received.

Fix by always enabling automatic speed and duplex detection, since
iPXE provides no mechanism for manual configuration of either link
speed or duplex.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/net/lan78xx.c
src/drivers/net/lan78xx.h

index a8cf574088587f3d9879281e9f000d3b767b85f0..3f4f21b60206cbecb5093afde6bb89518d10c7d2 100644 (file)
@@ -198,6 +198,13 @@ static int lan78xx_open ( struct net_device *netdev ) {
                                     LAN78XX_BULK_IN_DLY_SET ( 0 ) ) ) != 0 )
                goto err_bulk_in_dly;
 
+       /* Enable automatic speed and duplex detection */
+       if ( ( rc = smscusb_writel ( smscusb, LAN78XX_MAC_CR,
+                                    ( LAN78XX_MAC_CR_ADP |
+                                      LAN78XX_MAC_CR_ADD |
+                                      LAN78XX_MAC_CR_ASD ) ) ) != 0 )
+               goto err_mac_cr;
+
        /* Configure receive filters */
        if ( ( rc = smscusb_writel ( smscusb, LAN78XX_RFE_CTL,
                                     ( LAN78XX_RFE_CTL_AB |
@@ -256,6 +263,7 @@ static int lan78xx_open ( struct net_device *netdev ) {
  err_fct_tx_ctl:
  err_fct_rx_ctl:
  err_rfe_ctl:
+ err_mac_cr:
  err_bulk_in_dly:
  err_int_ep_ctl:
        usbnet_close ( &smscusb->usbnet );
index 6ae17238e149508e3f29aeddca019e7f90b029b0..39422aec026c10a8a8073196e39a08d037c3bdd0 100644 (file)
@@ -49,6 +49,12 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 #define LAN78XX_FCT_TX_CTL 0x00c4
 #define LAN78XX_FCT_TX_CTL_EN          0x80000000UL    /**< FCT TX enable */
 
+/** MAC control register */
+#define LAN78XX_MAC_CR 0x0100
+#define LAN78XX_MAC_CR_ADP             0x00002000UL    /**< Duplex polarity */
+#define LAN78XX_MAC_CR_ADD             0x00001000UL    /**< Auto duplex */
+#define LAN78XX_MAC_CR_ASD             0x00000800UL    /**< Auto speed */
+
 /** MAC receive register */
 #define LAN78XX_MAC_RX 0x0104
 #define LAN78XX_MAC_RX_MAX_SIZE(mtu)   ( (mtu) << 16 ) /**< Max frame size */