summaryrefslogtreecommitdiffstats
path: root/src/drivers/net/3c90x.c
diff options
context:
space:
mode:
authorThomas Miletich2011-02-01 23:10:18 +0100
committerMichael Brown2011-02-08 20:10:55 +0100
commit72d387eac134618058993e0efec16e907f1661a1 (patch)
tree15d4c0d7141099199a7ffee7923ae60e08a648f4 /src/drivers/net/3c90x.c
parent[3c90x] More fine-grained debugging levels (diff)
downloadipxe-72d387eac134618058993e0efec16e907f1661a1.tar.gz
ipxe-72d387eac134618058993e0efec16e907f1661a1.tar.xz
ipxe-72d387eac134618058993e0efec16e907f1661a1.zip
[3c90x] Clean up reset code
Remove 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: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/net/3c90x.c')
-rw-r--r--src/drivers/net/3c90x.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/src/drivers/net/3c90x.c b/src/drivers/net/3c90x.c
index 0371af26..f606ac12 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);