diff options
author | Thomas Miletich | 2011-02-01 23:10:18 +0100 |
---|---|---|
committer | Michael Brown | 2011-02-08 20:10:55 +0100 |
commit | 72d387eac134618058993e0efec16e907f1661a1 (patch) | |
tree | 15d4c0d7141099199a7ffee7923ae60e08a648f4 /src/drivers/net/3c90x.c | |
parent | [3c90x] More fine-grained debugging levels (diff) | |
download | ipxe-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.c | 25 |
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); |