Skip to content

Commit

Permalink
[3c90x] Clean up reset code
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
thomil authored and mcb30 committed Feb 8, 2011
1 parent db331b5 commit 72d387e
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 15 deletions.
25 changes: 10 additions & 15 deletions src/drivers/net/3c90x.c
Expand Up @@ -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
Expand All @@ -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);
Expand Down
6 changes: 6 additions & 0 deletions src/drivers/net/3c90x.h
Expand Up @@ -193,6 +193,12 @@ enum Commands {
cmdSetHashFilterBit = 0x19, /* */
};

enum GlobalResetParams {
globalResetAll = 0,
globalResetMaskNetwork = (1<<2),
globalResetMaskAll = 0x1ff,
};

enum FrameStartHeader {
fshTxIndicate = 0x8000,
fshDnComplete = 0x10000,
Expand Down

0 comments on commit 72d387e

Please sign in to comment.