]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[realtek] Enable DAC only when built as a 64-bit binary
authorMichael Brown <mcb30@ipxe.org>
Thu, 23 Aug 2012 12:35:19 +0000 (13:35 +0100)
committerMichael Brown <mcb30@ipxe.org>
Thu, 23 Aug 2012 14:15:43 +0000 (15:15 +0100)
Some RTL8169 cards (observed with an RTL8169SC) crash and burn if DAC
is enabled, even if only 32-bit addresses are used.  Observed
behaviour includes system lockups and repeated transmission of garbage
data onto the wire.

This seems to be a known problem.  The Linux r8169 driver disables DAC
by default and provides a "use_dac" module parameter.

There appears to be no known test for determining whether or not DAC
will work.  As a workaround, enable DAC only if we are built as as
64-bit binary.  This at least eliminates the problem in the common
case of a 32-bit build, which will never use 64-bit addresses anyway.

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

index f63f25f27473ef03c5bb5f425f5ae96aaf869337..98fc02f44c689a39ea2bfaf02009d64d1e40315e 100644 (file)
@@ -878,10 +878,15 @@ static void realtek_detect ( struct realtek_nic *rtl ) {
        /* The C+ Command register is present only on 8169 and 8139C+.
         * Try to enable C+ mode and PCI Dual Address Cycle (for
         * 64-bit systems), if supported.
+        *
+        * Note that enabling DAC seems to cause bizarre behaviour
+        * (lockups, garbage data on the wire) on some systems, even
+        * if only 32-bit addresses are used.
         */
        cpcr = readw ( rtl->regs + RTL_CPCR );
-       cpcr |= ( RTL_CPCR_DAC | RTL_CPCR_MULRW | RTL_CPCR_CPRX |
-                 RTL_CPCR_CPTX );
+       cpcr |= ( RTL_CPCR_MULRW | RTL_CPCR_CPRX | RTL_CPCR_CPTX );
+       if ( sizeof ( physaddr_t ) > sizeof ( uint32_t ) )
+               cpcr |= RTL_CPCR_DAC;
        writew ( cpcr, rtl->regs + RTL_CPCR );
        check_cpcr = readw ( rtl->regs + RTL_CPCR );