[ipxe-devel] [PATCH 2/2] [3c90x] Clean up reset code.

Thomas Miletich thomas.miletich at gmail.com
Tue Feb 1 22:10:18 UTC 2011


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 at gmail.com>
Reported-by: Peter Huewe <peterhuewe at gmx.de>
Tested-by: Peter Huewe <peterhuewe at gmx.de>
---
 src/drivers/net/3c90x.c |   25 ++++++++++---------------
 src/drivers/net/3c90x.h |    6 ++++++
 2 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/src/drivers/net/3c90x.c b/src/drivers/net/3c90x.c
index edb3672..010df89 100644
--- a/src/drivers/net/3c90x.c
+++ b/src/drivers/net/3c90x.c
@@ -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);
diff --git a/src/drivers/net/3c90x.h b/src/drivers/net/3c90x.h
index acbb29d..5edadae 100644
--- a/src/drivers/net/3c90x.h
+++ b/src/drivers/net/3c90x.h
@@ -193,6 +193,12 @@ enum Commands {
 	cmdSetHashFilterBit = 0x19,	/*                                   */
 };
 
+enum GlobalResetParams {
+	globalResetAll = 0,
+	globalResetMaskNetwork = (1<<2),
+	globalResetMaskAll = 0x1ff,
+};
+
 enum FrameStartHeader {
 	fshTxIndicate = 0x8000,
 	fshDnComplete = 0x10000,
-- 
1.7.1




More information about the ipxe-devel mailing list