[3c90x] Clean up reset code
authorThomas Miletich <thomas.miletich@gmail.com>
Tue, 1 Feb 2011 22:08:45 +0000 (23:08 +0100)
committerMarty Connor <mdc@etherboot.org>
Fri, 10 Jun 2011 12:56:37 +0000 (08:56 -0400)
Removes duplicate hardware resets, remove network interface logic reset.

This also fixes a bug where some 3c905C variants would return bogus
EEPROM values because of a too short delay after the network reset.

Signed-off-by: Thomas Miletich <thomas.miletich@gmail.com>
Reported-by: Peter Huewe <peterhuewe@gmx.de>
Tested-by: Peter Huewe <peterhuewe@gmx.de>
Signed-off-by: Marty Connor <mdc@etherboot.org>
src/drivers/net/3c90x.c
src/drivers/net/3c90x.h

index edb3672..010df89 100644 (file)
@@ -206,7 +206,14 @@ static void a3c90x_reset(struct INF_3C90X *inf_3c90x)
        DBGP("a3c90x_reset\n");
        /* Send the reset command to the card */
        DBG2("3c90x: Issuing RESET\n");
-       a3c90x_internal_IssueCommand(inf_3c90x->IOAddr, cmdGlobalReset, 0);
+
+       /* reset of the receiver on B-revision cards re-negotiates the link
+        * takes several seconds (a computer eternity), so we don't reset
+        * it here.
+        */
+       a3c90x_internal_IssueCommand(inf_3c90x->IOAddr,
+                                    cmdGlobalReset,
+                                    globalResetMaskNetwork);
 
        /* global reset command resets station mask, non-B revision cards
         * require explicit reset of values
@@ -216,26 +223,14 @@ static void a3c90x_reset(struct INF_3C90X *inf_3c90x)
        outw(0, inf_3c90x->IOAddr + regStationMask_2_3w + 2);
        outw(0, inf_3c90x->IOAddr + regStationMask_2_3w + 4);
 
-       /* Issue transmit reset, wait for command completion */
-       a3c90x_internal_IssueCommand(inf_3c90x->IOAddr, cmdTxReset, 0);
-
        a3c90x_internal_IssueCommand(inf_3c90x->IOAddr, cmdTxEnable, 0);
-
-       /*
-        * reset of the receiver on B-revision cards re-negotiates the link
-        * takes several seconds (a computer eternity)
-        */
-       a3c90x_internal_IssueCommand(inf_3c90x->IOAddr, cmdRxReset,
-                                    inf_3c90x->isBrev ? 0x04 : 0x00);
-
        a3c90x_internal_IssueCommand(inf_3c90x->IOAddr, cmdRxEnable, 0);
 
-       a3c90x_internal_IssueCommand(inf_3c90x->IOAddr,
-                                    cmdSetInterruptEnable, 0);
-       /* enable rxComplete and txComplete */
+       /* enable rxComplete and txComplete indications */
        a3c90x_internal_IssueCommand(inf_3c90x->IOAddr,
                                     cmdSetIndicationEnable,
                                     INT_TXCOMPLETE | INT_UPCOMPLETE);
+
        /* acknowledge any pending status flags */
        a3c90x_internal_IssueCommand(inf_3c90x->IOAddr,
                                     cmdAcknowledgeInterrupt, 0x661);
index acbb29d..5edadae 100644 (file)
@@ -193,6 +193,12 @@ enum Commands {
        cmdSetHashFilterBit = 0x19,     /*                                   */
 };
 
+enum GlobalResetParams {
+       globalResetAll = 0,
+       globalResetMaskNetwork = (1<<2),
+       globalResetMaskAll = 0x1ff,
+};
+
 enum FrameStartHeader {
        fshTxIndicate = 0x8000,
        fshDnComplete = 0x10000,