Fix the hangs people have been seeing. For some reason, the

atomic operation change caused this, so backout it until I
can figure out what's wrong with it.
This commit is contained in:
Maxime Henrion 2003-04-08 13:05:11 +00:00
parent 302d51fcb2
commit 50d81222d8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=113252

View File

@ -57,7 +57,6 @@ __FBSDID("$FreeBSD$");
#include <net/ethernet.h>
#include <net/if_arp.h>
#include <machine/atomic.h>
#include <machine/clock.h> /* for DELAY */
#include <net/if_types.h>
@ -1208,7 +1207,7 @@ static void
fxp_start(struct ifnet *ifp)
{
struct fxp_softc *sc = ifp->if_softc;
struct fxp_tx *txp, *last;
struct fxp_tx *txp;
struct mbuf *mb_head;
int error;
@ -1378,21 +1377,18 @@ fxp_start(struct ifnet *ifp)
* Advance the end of list forward.
*/
#ifdef __alpha__
/*
* On platforms which can't access memory in 16-bit
* granularities, we must prevent the card from DMA'ing
* up the status while we update the command field.
* This could cause us to overwrite the completion status.
*
* This is a bit tricky, because we want to avoid using
* atomic operations on 16bits values, since they may not
* be available on any architecture or may be very
* inefficient.
*/
last = sc->fxp_desc.tx_last;
atomic_clear_32((u_int32_t *)&last->tx_cb->cb_status,
htobe32(bswap16(FXP_CB_COMMAND_S)));
atomic_clear_short(&sc->fxp_desc.tx_last->tx_cb->cb_command,
FXP_CB_COMMAND_S);
#else
sc->fxp_desc.tx_last->tx_cb->cb_command &= ~FXP_CB_COMMAND_S;
#endif /*__alpha__*/
sc->fxp_desc.tx_last = txp;
/*