/******************************************************************************/
/*                                                                            */
/* Broadcom BCM5700 Linux Network Driver, Copyright (c) 2000 Broadcom         */
/* Corporation.                                                               */
/* All rights reserved.                                                       */
/*                                                                            */
/* This program is free software; you can redistribute it and/or modify       */
/* it under the terms of the GNU General Public License as published by       */
/* the Free Software Foundation, located in the file LICENSE.                 */
/*                                                                            */
/* History:                                                                   */
/******************************************************************************/
#include <common.h>
#include <asm/types.h>

#ifdef CONFIG_BMW
#include <mpc824x.h>
#endif
#include <malloc.h>
#include <linux/byteorder/big_endian.h>
#include "bcm570x_mm.h"

#define EMBEDDED 1
/******************************************************************************/
/* Local functions. */
/******************************************************************************/

LM_STATUS LM_Abort (PLM_DEVICE_BLOCK pDevice);
LM_STATUS LM_QueueRxPackets (PLM_DEVICE_BLOCK pDevice);

static LM_STATUS LM_TranslateRequestedMediaType (LM_REQUESTED_MEDIA_TYPE
						 RequestedMediaType,
						 PLM_MEDIA_TYPE pMediaType,
						 PLM_LINE_SPEED pLineSpeed,
						 PLM_DUPLEX_MODE pDuplexMode);

static LM_STATUS LM_InitBcm540xPhy (PLM_DEVICE_BLOCK pDevice);

__inline static LM_VOID LM_ServiceRxInterrupt (PLM_DEVICE_BLOCK pDevice);
__inline static LM_VOID LM_ServiceTxInterrupt (PLM_DEVICE_BLOCK pDevice);

static LM_STATUS LM_ForceAutoNegBcm540xPhy (PLM_DEVICE_BLOCK pDevice,
					    LM_REQUESTED_MEDIA_TYPE
					    RequestedMediaType);
static LM_STATUS LM_ForceAutoNeg (PLM_DEVICE_BLOCK pDevice,
				  LM_REQUESTED_MEDIA_TYPE RequestedMediaType);
static LM_UINT32 GetPhyAdFlowCntrlSettings (PLM_DEVICE_BLOCK pDevice);
STATIC LM_STATUS LM_SetFlowControl (PLM_DEVICE_BLOCK pDevice,
				    LM_UINT32 LocalPhyAd,
				    LM_UINT32 RemotePhyAd);
#if INCLUDE_TBI_SUPPORT
STATIC LM_STATUS LM_SetupFiberPhy (PLM_DEVICE_BLOCK pDevice);
STATIC LM_STATUS LM_InitBcm800xPhy (PLM_DEVICE_BLOCK pDevice);
#endif
STATIC LM_STATUS LM_SetupCopperPhy (PLM_DEVICE_BLOCK pDevice);
STATIC PLM_ADAPTER_INFO LM_GetAdapterInfoBySsid (LM_UINT16 Svid,
						 LM_UINT16 Ssid);
STATIC LM_STATUS LM_DmaTest (PLM_DEVICE_BLOCK pDevice, PLM_UINT8 pBufferVirt,
			     LM_PHYSICAL_ADDRESS BufferPhy,
			     LM_UINT32 BufferSize);
STATIC LM_STATUS LM_HaltCpu (PLM_DEVICE_BLOCK pDevice, LM_UINT32 cpu_number);
STATIC LM_STATUS LM_ResetChip (PLM_DEVICE_BLOCK pDevice);
STATIC LM_STATUS LM_Test4GBoundary (PLM_DEVICE_BLOCK pDevice,
				    PLM_PACKET pPacket, PT3_SND_BD pSendBd);

/******************************************************************************/
/* External functions. */
/******************************************************************************/

LM_STATUS LM_LoadRlsFirmware (PLM_DEVICE_BLOCK pDevice);

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_UINT32 LM_RegRdInd (PLM_DEVICE_BLOCK pDevice, LM_UINT32 Register)
{
	LM_UINT32 Value32;

#if PCIX_TARGET_WORKAROUND
	MM_ACQUIRE_UNDI_LOCK (pDevice);
#endif
	MM_WriteConfig32 (pDevice, T3_PCI_REG_ADDR_REG, Register);
	MM_ReadConfig32 (pDevice, T3_PCI_REG_DATA_REG, &Value32);
#if PCIX_TARGET_WORKAROUND
	MM_RELEASE_UNDI_LOCK (pDevice);
#endif

	return Value32;
}				/* LM_RegRdInd */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_VOID
LM_RegWrInd (PLM_DEVICE_BLOCK pDevice, LM_UINT32 Register, LM_UINT32 Value32)
{

#if PCIX_TARGET_WORKAROUND
	MM_ACQUIRE_UNDI_LOCK (pDevice);
#endif
	MM_WriteConfig32 (pDevice, T3_PCI_REG_ADDR_REG, Register);
	MM_WriteConfig32 (pDevice, T3_PCI_REG_DATA_REG, Value32);
#if PCIX_TARGET_WORKAROUND
	MM_RELEASE_UNDI_LOCK (pDevice);
#endif
}				/* LM_RegWrInd */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_UINT32 LM_MemRdInd (PLM_DEVICE_BLOCK pDevice, LM_UINT32 MemAddr)
{
	LM_UINT32 Value32;

	MM_ACQUIRE_UNDI_LOCK (pDevice);
#ifdef BIG_ENDIAN_HOST
	MM_WriteConfig32 (pDevice, T3_PCI_MEM_WIN_ADDR_REG, MemAddr);
	Value32 = REG_RD (pDevice, PciCfg.MemWindowData);
	/*    Value32 = REG_RD(pDevice,uIntMem.Mbuf[(MemAddr & 0x7fff)/4]); */
#else
	MM_WriteConfig32 (pDevice, T3_PCI_MEM_WIN_ADDR_REG, MemAddr);
	MM_ReadConfig32 (pDevice, T3_PCI_MEM_WIN_DATA_REG, &Value32);
#endif
	MM_RELEASE_UNDI_LOCK (pDevice);

	return Value32;
}				/* LM_MemRdInd */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_VOID
LM_MemWrInd (PLM_DEVICE_BLOCK pDevice, LM_UINT32 MemAddr, LM_UINT32 Value32)
{
	MM_ACQUIRE_UNDI_LOCK (pDevice);
#ifdef BIG_ENDIAN_HOST
	REG_WR (pDevice, PciCfg.MemWindowBaseAddr, MemAddr);
	REG_WR (pDevice, uIntMem.Mbuf[(MemAddr & 0x7fff) / 4], Value32);
#else
	MM_WriteConfig32 (pDevice, T3_PCI_MEM_WIN_ADDR_REG, MemAddr);
	MM_WriteConfig32 (pDevice, T3_PCI_MEM_WIN_DATA_REG, Value32);
#endif
	MM_RELEASE_UNDI_LOCK (pDevice);
}				/* LM_MemWrInd */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_STATUS LM_QueueRxPackets (PLM_DEVICE_BLOCK pDevice)
{
	LM_STATUS Lmstatus;
	PLM_PACKET pPacket;
	PT3_RCV_BD pRcvBd;
	LM_UINT32 StdBdAdded = 0;
#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
	LM_UINT32 JumboBdAdded = 0;
#endif				/* T3_JUMBO_RCV_RCB_ENTRY_COUNT */

	Lmstatus = LM_STATUS_SUCCESS;

	pPacket = (PLM_PACKET) QQ_PopHead (&pDevice->RxPacketFreeQ.Container);
	while (pPacket) {
		switch (pPacket->u.Rx.RcvProdRing) {
#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
		case T3_JUMBO_RCV_PROD_RING:	/* Jumbo Receive Ring. */
			/* Initialize the buffer descriptor. */
			pRcvBd =
			    &pDevice->pRxJumboBdVirt[pDevice->RxJumboProdIdx];
			pRcvBd->Flags =
			    RCV_BD_FLAG_END | RCV_BD_FLAG_JUMBO_RING;
			pRcvBd->Len = (LM_UINT16) pDevice->RxJumboBufferSize;

			/* Initialize the receive buffer pointer */
#if 0				/* Jimmy, deleted in new */
			pRcvBd->HostAddr.Low = pPacket->u.Rx.RxBufferPhy.Low;
			pRcvBd->HostAddr.High = pPacket->u.Rx.RxBufferPhy.High;
#endif
			MM_MapRxDma (pDevice, pPacket, &pRcvBd->HostAddr);

			/* The opaque field may point to an offset from a fix addr. */
			pRcvBd->Opaque = (LM_UINT32) (MM_UINT_PTR (pPacket) -
						      MM_UINT_PTR (pDevice->
								   pPacketDescBase));

			/* Update the producer index. */
			pDevice->RxJumboProdIdx =
			    (pDevice->RxJumboProdIdx +
			     1) & T3_JUMBO_RCV_RCB_ENTRY_COUNT_MASK;

			JumboBdAdded++;
			break;
#endif				/* T3_JUMBO_RCV_RCB_ENTRY_COUNT */

		case T3_STD_RCV_PROD_RING:	/* Standard Receive Ring. */
			/* Initialize the buffer descriptor. */
			pRcvBd = &pDevice->pRxStdBdVirt[pDevice->RxStdProdIdx];
			pRcvBd->Flags = RCV_BD_FLAG_END;
			pRcvBd->Len = MAX_STD_RCV_BUFFER_SIZE;

			/* Initialize the receive buffer pointer */
#if 0				/* Jimmy, deleted in new replaced with MM_MapRxDma */
			pRcvBd->HostAddr.Low = pPacket->u.Rx.RxBufferPhy.Low;
			pRcvBd->HostAddr.High = pPacket->u.Rx.RxBufferPhy.High;
#endif
			MM_MapRxDma (pDevice, pPacket, &pRcvBd->HostAddr);

			/* The opaque field may point to an offset from a fix addr. */
			pRcvBd->Opaque = (LM_UINT32) (MM_UINT_PTR (pPacket) -
						      MM_UINT_PTR (pDevice->
								   pPacketDescBase));

			/* Update the producer index. */
			pDevice->RxStdProdIdx = (pDevice->RxStdProdIdx + 1) &
			    T3_STD_RCV_RCB_ENTRY_COUNT_MASK;

			StdBdAdded++;
			break;

		case T3_UNKNOWN_RCV_PROD_RING:
		default:
			Lmstatus = LM_STATUS_FAILURE;
			break;
		}		/* switch */

		/* Bail out if there is any error. */
		if (Lmstatus != LM_STATUS_SUCCESS) {
			break;
		}

		pPacket =
		    (PLM_PACKET) QQ_PopHead (&pDevice->RxPacketFreeQ.Container);
	}			/* while */

	wmb ();
	/* Update the procedure index. */
	if (StdBdAdded) {
		MB_REG_WR (pDevice, Mailbox.RcvStdProdIdx.Low,
			   pDevice->RxStdProdIdx);
	}
#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
	if (JumboBdAdded) {
		MB_REG_WR (pDevice, Mailbox.RcvJumboProdIdx.Low,
			   pDevice->RxJumboProdIdx);
	}
#endif				/* T3_JUMBO_RCV_RCB_ENTRY_COUNT */

	return Lmstatus;
}				/* LM_QueueRxPackets */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
STATIC LM_VOID LM_NvramInit (PLM_DEVICE_BLOCK pDevice)
{
	LM_UINT32 Value32;
	LM_UINT32 j;

	/* Intialize clock period and state machine. */
	Value32 = SEEPROM_ADDR_CLK_PERD (SEEPROM_CLOCK_PERIOD) |
	    SEEPROM_ADDR_FSM_RESET;
	REG_WR (pDevice, Grc.EepromAddr, Value32);

	for (j = 0; j < 100; j++) {
		MM_Wait (10);
	}

	/* Serial eeprom access using the Grc.EepromAddr/EepromData registers. */
	Value32 = REG_RD (pDevice, Grc.LocalCtrl);
	REG_WR (pDevice, Grc.LocalCtrl,
		Value32 | GRC_MISC_LOCAL_CTRL_AUTO_SEEPROM);

	/* Set the 5701 compatibility mode if we are using EEPROM. */
	if (T3_ASIC_REV (pDevice->ChipRevId) != T3_ASIC_REV_5700 &&
	    T3_ASIC_REV (pDevice->ChipRevId) != T3_ASIC_REV_5701) {
		Value32 = REG_RD (pDevice, Nvram.Config1);
		if ((Value32 & FLASH_INTERFACE_ENABLE) == 0) {
			/* Use the new interface to read EEPROM. */
			Value32 &= ~FLASH_COMPAT_BYPASS;

			REG_WR (pDevice, Nvram.Config1, Value32);
		}
	}
}				/* LM_NvRamInit */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
STATIC LM_STATUS
LM_EepromRead (PLM_DEVICE_BLOCK pDevice, LM_UINT32 Offset, LM_UINT32 * pData)
{
	LM_UINT32 Value32;
	LM_UINT32 Addr;
	LM_UINT32 Dev;
	LM_UINT32 j;

	if (Offset > SEEPROM_CHIP_SIZE) {
		return LM_STATUS_FAILURE;
	}

	Dev = Offset / SEEPROM_CHIP_SIZE;
	Addr = Offset % SEEPROM_CHIP_SIZE;

	Value32 = REG_RD (pDevice, Grc.EepromAddr);
	Value32 &= ~(SEEPROM_ADDR_ADDRESS_MASK | SEEPROM_ADDR_DEV_ID_MASK |
		     SEEPROM_ADDR_RW_MASK);
	REG_WR (pDevice, Grc.EepromAddr, Value32 | SEEPROM_ADDR_DEV_ID (Dev) |
		SEEPROM_ADDR_ADDRESS (Addr) | SEEPROM_ADDR_START |
		SEEPROM_ADDR_READ);

	for (j = 0; j < 1000; j++) {
		Value32 = REG_RD (pDevice, Grc.EepromAddr);
		if (Value32 & SEEPROM_ADDR_COMPLETE) {
			break;
		}
		MM_Wait (10);
	}

	if (Value32 & SEEPROM_ADDR_COMPLETE) {
		Value32 = REG_RD (pDevice, Grc.EepromData);
		*pData = Value32;

		return LM_STATUS_SUCCESS;
	}

	return LM_STATUS_FAILURE;
}				/* LM_EepromRead */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
STATIC LM_STATUS
LM_NvramRead (PLM_DEVICE_BLOCK pDevice, LM_UINT32 Offset, LM_UINT32 * pData)
{
	LM_UINT32 Value32;
	LM_STATUS Status;
	LM_UINT32 j;

	if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700 ||
	    T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5701) {
		Status = LM_EepromRead (pDevice, Offset, pData);
	} else {
		/* Determine if we have flash or EEPROM. */
		Value32 = REG_RD (pDevice, Nvram.Config1);
		if (Value32 & FLASH_INTERFACE_ENABLE) {
			if (Value32 & FLASH_SSRAM_BUFFERRED_MODE) {
				Offset = ((Offset / BUFFERED_FLASH_PAGE_SIZE) <<
					  BUFFERED_FLASH_PAGE_POS) +
				    (Offset % BUFFERED_FLASH_PAGE_SIZE);
			}
		}

		REG_WR (pDevice, Nvram.SwArb, SW_ARB_REQ_SET1);
		for (j = 0; j < 1000; j++) {
			if (REG_RD (pDevice, Nvram.SwArb) & SW_ARB_GNT1) {
				break;
			}
			MM_Wait (20);
		}
		if (j == 1000) {
			return LM_STATUS_FAILURE;
		}

		/* Read from flash or EEPROM with the new 5703/02 interface. */
		REG_WR (pDevice, Nvram.Addr, Offset & NVRAM_ADDRESS_MASK);

		REG_WR (pDevice, Nvram.Cmd, NVRAM_CMD_RD | NVRAM_CMD_DO_IT |
			NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_DONE);

		/* Wait for the done bit to clear. */
		for (j = 0; j < 500; j++) {
			MM_Wait (10);

			Value32 = REG_RD (pDevice, Nvram.Cmd);
			if (!(Value32 & NVRAM_CMD_DONE)) {
				break;
			}
		}

		/* Wait for the done bit. */
		if (!(Value32 & NVRAM_CMD_DONE)) {
			for (j = 0; j < 500; j++) {
				MM_Wait (10);

				Value32 = REG_RD (pDevice, Nvram.Cmd);
				if (Value32 & NVRAM_CMD_DONE) {
					MM_Wait (10);

					*pData =
					    REG_RD (pDevice, Nvram.ReadData);

					/* Change the endianess. */
					*pData =
					    ((*pData & 0xff) << 24) |
					    ((*pData & 0xff00) << 8) |
					    ((*pData & 0xff0000) >> 8) |
					    ((*pData >> 24) & 0xff);

					break;
				}
			}
		}

		REG_WR (pDevice, Nvram.SwArb, SW_ARB_REQ_CLR1);
		if (Value32 & NVRAM_CMD_DONE) {
			Status = LM_STATUS_SUCCESS;
		} else {
			Status = LM_STATUS_FAILURE;
		}
	}

	return Status;
}				/* LM_NvramRead */

STATIC void LM_ReadVPD (PLM_DEVICE_BLOCK pDevice)
{
	LM_UINT32 Vpd_arr[256 / 4];
	LM_UINT8 *Vpd = (LM_UINT8 *) & Vpd_arr[0];
	LM_UINT32 *Vpd_dptr = &Vpd_arr[0];
	LM_UINT32 Value32;
	unsigned int j;

	/* Read PN from VPD */
	for (j = 0; j < 256; j += 4, Vpd_dptr++) {
		if (LM_NvramRead (pDevice, 0x100 + j, &Value32) !=
		    LM_STATUS_SUCCESS) {
			printf ("BCM570x: LM_ReadVPD: VPD read failed"
				" (no EEPROM onboard)\n");
			return;
		}
		*Vpd_dptr = cpu_to_le32 (Value32);
	}
	for (j = 0; j < 256;) {
		unsigned int Vpd_r_len;
		unsigned int Vpd_r_end;

		if ((Vpd[j] == 0x82) || (Vpd[j] == 0x91)) {
			j = j + 3 + Vpd[j + 1] + (Vpd[j + 2] << 8);
		} else if (Vpd[j] == 0x90) {
			Vpd_r_len = Vpd[j + 1] + (Vpd[j + 2] << 8);
			j += 3;
			Vpd_r_end = Vpd_r_len + j;
			while (j < Vpd_r_end) {
				if ((Vpd[j] == 'P') && (Vpd[j + 1] == 'N')) {
					unsigned int len = Vpd[j + 2];

					if (len <= 24) {
						memcpy (pDevice->PartNo,
							&Vpd[j + 3], len);
					}
					break;
				} else {
					if (Vpd[j + 2] == 0) {
						break;
					}
					j = j + Vpd[j + 2];
				}
			}
			break;
		} else {
			break;
		}
	}
}

STATIC void LM_ReadBootCodeVersion (PLM_DEVICE_BLOCK pDevice)
{
	LM_UINT32 Value32, offset, ver_offset;
	int i;

	if (LM_NvramRead (pDevice, 0x0, &Value32) != LM_STATUS_SUCCESS)
		return;
	if (Value32 != 0xaa559966)
		return;
	if (LM_NvramRead (pDevice, 0xc, &offset) != LM_STATUS_SUCCESS)
		return;

	offset = ((offset & 0xff) << 24) | ((offset & 0xff00) << 8) |
	    ((offset & 0xff0000) >> 8) | ((offset >> 24) & 0xff);
	if (LM_NvramRead (pDevice, offset, &Value32) != LM_STATUS_SUCCESS)
		return;
	if ((Value32 == 0x0300000e) &&
	    (LM_NvramRead (pDevice, offset + 4, &Value32) == LM_STATUS_SUCCESS)
	    && (Value32 == 0)) {

		if (LM_NvramRead (pDevice, offset + 8, &ver_offset) !=
		    LM_STATUS_SUCCESS)
			return;
		ver_offset = ((ver_offset & 0xff0000) >> 8) |
		    ((ver_offset >> 24) & 0xff);
		for (i = 0; i < 16; i += 4) {
			if (LM_NvramRead
			    (pDevice, offset + ver_offset + i,
			     &Value32) != LM_STATUS_SUCCESS) {
				return;
			}
			*((LM_UINT32 *) & pDevice->BootCodeVer[i]) =
			    cpu_to_le32 (Value32);
		}
	} else {
		char c;

		if (LM_NvramRead (pDevice, 0x94, &Value32) != LM_STATUS_SUCCESS)
			return;

		i = 0;
		c = ((Value32 & 0xff0000) >> 16);

		if (c < 10) {
			pDevice->BootCodeVer[i++] = c + '0';
		} else {
			pDevice->BootCodeVer[i++] = (c / 10) + '0';
			pDevice->BootCodeVer[i++] = (c % 10) + '0';
		}
		pDevice->BootCodeVer[i++] = '.';
		c = (Value32 & 0xff000000) >> 24;
		if (c < 10) {
			pDevice->BootCodeVer[i++] = c + '0';
		} else {
			pDevice->BootCodeVer[i++] = (c / 10) + '0';
			pDevice->BootCodeVer[i++] = (c % 10) + '0';
		}
		pDevice->BootCodeVer[i] = 0;
	}
}

STATIC void LM_GetBusSpeed (PLM_DEVICE_BLOCK pDevice)
{
	LM_UINT32 PciState = pDevice->PciState;
	LM_UINT32 ClockCtrl;
	char *SpeedStr = "";

	if (PciState & T3_PCI_STATE_32BIT_PCI_BUS) {
		strcpy (pDevice->BusSpeedStr, "32-bit ");
	} else {
		strcpy (pDevice->BusSpeedStr, "64-bit ");
	}
	if (PciState & T3_PCI_STATE_CONVENTIONAL_PCI_MODE) {
		strcat (pDevice->BusSpeedStr, "PCI ");
		if (PciState & T3_PCI_STATE_HIGH_BUS_SPEED) {
			SpeedStr = "66MHz";
		} else {
			SpeedStr = "33MHz";
		}
	} else {
		strcat (pDevice->BusSpeedStr, "PCIX ");
		if (pDevice->BondId == GRC_MISC_BD_ID_5704CIOBE) {
			SpeedStr = "133MHz";
		} else {
			ClockCtrl = REG_RD (pDevice, PciCfg.ClockCtrl) & 0x1f;
			switch (ClockCtrl) {
			case 0:
				SpeedStr = "33MHz";
				break;

			case 2:
				SpeedStr = "50MHz";
				break;

			case 4:
				SpeedStr = "66MHz";
				break;

			case 6:
				SpeedStr = "100MHz";
				break;

			case 7:
				SpeedStr = "133MHz";
				break;
			}
		}
	}
	strcat (pDevice->BusSpeedStr, SpeedStr);
}

/******************************************************************************/
/* Description:                                                               */
/*    This routine initializes default parameters and reads the PCI           */
/*    configurations.                                                         */
/*                                                                            */
/* Return:                                                                    */
/*    LM_STATUS_SUCCESS                                                       */
/******************************************************************************/
LM_STATUS LM_GetAdapterInfo (PLM_DEVICE_BLOCK pDevice)
{
	PLM_ADAPTER_INFO pAdapterInfo;
	LM_UINT32 Value32;
	LM_STATUS Status;
	LM_UINT32 j;
	LM_UINT32 EeSigFound;
	LM_UINT32 EePhyTypeSerdes = 0;
	LM_UINT32 EePhyLedMode = 0;
	LM_UINT32 EePhyId = 0;

	/* Get Device Id and Vendor Id */
	Status = MM_ReadConfig32 (pDevice, PCI_VENDOR_ID_REG, &Value32);
	if (Status != LM_STATUS_SUCCESS) {
		return Status;
	}
	pDevice->PciVendorId = (LM_UINT16) Value32;
	pDevice->PciDeviceId = (LM_UINT16) (Value32 >> 16);

	/* If we are not getting the write adapter, exit. */
	if ((Value32 != T3_PCI_ID_BCM5700) &&
	    (Value32 != T3_PCI_ID_BCM5701) &&
	    (Value32 != T3_PCI_ID_BCM5702) &&
	    (Value32 != T3_PCI_ID_BCM5702x) &&
	    (Value32 != T3_PCI_ID_BCM5702FE) &&
	    (Value32 != T3_PCI_ID_BCM5703) &&
	    (Value32 != T3_PCI_ID_BCM5703x) && (Value32 != T3_PCI_ID_BCM5704)) {
		return LM_STATUS_FAILURE;
	}

	Status = MM_ReadConfig32 (pDevice, PCI_REV_ID_REG, &Value32);
	if (Status != LM_STATUS_SUCCESS) {
		return Status;
	}
	pDevice->PciRevId = (LM_UINT8) Value32;

	/* Get IRQ. */
	Status = MM_ReadConfig32 (pDevice, PCI_INT_LINE_REG, &Value32);
	if (Status != LM_STATUS_SUCCESS) {
		return Status;
	}
	pDevice->Irq = (LM_UINT8) Value32;

	/* Get interrupt pin. */
	pDevice->IntPin = (LM_UINT8) (Value32 >> 8);

	/* Get chip revision id. */
	Status = MM_ReadConfig32 (pDevice, T3_PCI_MISC_HOST_CTRL_REG, &Value32);
	pDevice->ChipRevId = Value32 >> 16;

	/* Get subsystem vendor. */
	Status =
	    MM_ReadConfig32 (pDevice, PCI_SUBSYSTEM_VENDOR_ID_REG, &Value32);
	if (Status != LM_STATUS_SUCCESS) {
		return Status;
	}
	pDevice->SubsystemVendorId = (LM_UINT16) Value32;

	/* Get PCI subsystem id. */
	pDevice->SubsystemId = (LM_UINT16) (Value32 >> 16);

	/* Get the cache line size. */
	MM_ReadConfig32 (pDevice, PCI_CACHE_LINE_SIZE_REG, &Value32);
	pDevice->CacheLineSize = (LM_UINT8) Value32;
	pDevice->SavedCacheLineReg = Value32;

	if (pDevice->ChipRevId != T3_CHIP_ID_5703_A1 &&
	    pDevice->ChipRevId != T3_CHIP_ID_5703_A2 &&
	    pDevice->ChipRevId != T3_CHIP_ID_5704_A0) {
		pDevice->UndiFix = FALSE;
	}
#if !PCIX_TARGET_WORKAROUND
	pDevice->UndiFix = FALSE;
#endif
	/* Map the memory base to system address space. */
	if (!pDevice->UndiFix) {
		Status = MM_MapMemBase (pDevice);
		if (Status != LM_STATUS_SUCCESS) {
			return Status;
		}
		/* Initialize the memory view pointer. */
		pDevice->pMemView = (PT3_STD_MEM_MAP) pDevice->pMappedMemBase;
	}
#if PCIX_TARGET_WORKAROUND
	/* store whether we are in PCI are PCI-X mode */
	pDevice->EnablePciXFix = FALSE;

	MM_ReadConfig32 (pDevice, T3_PCI_STATE_REG, &Value32);
	if ((Value32 & T3_PCI_STATE_CONVENTIONAL_PCI_MODE) == 0) {
		/* Enable PCI-X workaround only if we are running on 5700 BX. */
		if (T3_CHIP_REV (pDevice->ChipRevId) == T3_CHIP_REV_5700_BX) {
			pDevice->EnablePciXFix = TRUE;
		}
	}
	if (pDevice->UndiFix) {
		pDevice->EnablePciXFix = TRUE;
	}
#endif
	/* Bx bug: due to the "byte_enable bug" in PCI-X mode, the power */
	/* management register may be clobbered which may cause the */
	/* BCM5700 to go into D3 state.  While in this state, we will */
	/* not have memory mapped register access.  As a workaround, we */
	/* need to restore the device to D0 state. */
	MM_ReadConfig32 (pDevice, T3_PCI_PM_STATUS_CTRL_REG, &Value32);
	Value32 |= T3_PM_PME_ASSERTED;
	Value32 &= ~T3_PM_POWER_STATE_MASK;
	Value32 |= T3_PM_POWER_STATE_D0;
	MM_WriteConfig32 (pDevice, T3_PCI_PM_STATUS_CTRL_REG, Value32);

	/* read the current PCI command word */
	MM_ReadConfig32 (pDevice, PCI_COMMAND_REG, &Value32);

	/* Make sure bus-mastering is enabled. */
	Value32 |= PCI_BUSMASTER_ENABLE;

#if PCIX_TARGET_WORKAROUND
	/* if we are in PCI-X mode, also make sure mem-mapping and SERR#/PERR#
	   are enabled */
	if (pDevice->EnablePciXFix == TRUE) {
		Value32 |= (PCI_MEM_SPACE_ENABLE | PCI_SYSTEM_ERROR_ENABLE |
			    PCI_PARITY_ERROR_ENABLE);
	}
	if (pDevice->UndiFix) {
		Value32 &= ~PCI_MEM_SPACE_ENABLE;
	}
#endif

	if (pDevice->EnableMWI) {
		Value32 |= PCI_MEMORY_WRITE_INVALIDATE;
	} else {
		Value32 &= (~PCI_MEMORY_WRITE_INVALIDATE);
	}

	/* Error out if mem-mapping is NOT enabled for PCI systems */
	if (!(Value32 | PCI_MEM_SPACE_ENABLE)) {
		return LM_STATUS_FAILURE;
	}

	/* save the value we are going to write into the PCI command word */
	pDevice->PciCommandStatusWords = Value32;

	Status = MM_WriteConfig32 (pDevice, PCI_COMMAND_REG, Value32);
	if (Status != LM_STATUS_SUCCESS) {
		return Status;
	}

	/* Set power state to D0. */
	LM_SetPowerState (pDevice, LM_POWER_STATE_D0);

#ifdef BIG_ENDIAN_PCI
	pDevice->MiscHostCtrl =
	    MISC_HOST_CTRL_MASK_PCI_INT |
	    MISC_HOST_CTRL_ENABLE_INDIRECT_ACCESS |
	    MISC_HOST_CTRL_ENABLE_ENDIAN_WORD_SWAP |
	    MISC_HOST_CTRL_ENABLE_PCI_STATE_REG_RW;
#else				/* No CPU Swap modes for PCI IO */

	/* Setup the mode registers. */
	pDevice->MiscHostCtrl =
	    MISC_HOST_CTRL_MASK_PCI_INT |
	    MISC_HOST_CTRL_ENABLE_ENDIAN_WORD_SWAP |
#ifdef BIG_ENDIAN_HOST
	    MISC_HOST_CTRL_ENABLE_ENDIAN_BYTE_SWAP |
#endif				/* BIG_ENDIAN_HOST */
	    MISC_HOST_CTRL_ENABLE_INDIRECT_ACCESS |
	    MISC_HOST_CTRL_ENABLE_PCI_STATE_REG_RW;
#endif				/* !BIG_ENDIAN_PCI */

	/* write to PCI misc host ctr first in order to enable indirect accesses */
	MM_WriteConfig32 (pDevice, T3_PCI_MISC_HOST_CTRL_REG,
			  pDevice->MiscHostCtrl);

	REG_WR (pDevice, PciCfg.MiscHostCtrl, pDevice->MiscHostCtrl);

#ifdef BIG_ENDIAN_PCI
	Value32 = GRC_MODE_WORD_SWAP_DATA | GRC_MODE_WORD_SWAP_NON_FRAME_DATA;
#else
/* No CPU Swap modes for PCI IO */
#ifdef BIG_ENDIAN_HOST
	Value32 = GRC_MODE_BYTE_SWAP_NON_FRAME_DATA |
	    GRC_MODE_WORD_SWAP_NON_FRAME_DATA;
#else
	Value32 = GRC_MODE_BYTE_SWAP_NON_FRAME_DATA | GRC_MODE_BYTE_SWAP_DATA;
#endif
#endif				/* !BIG_ENDIAN_PCI */

	REG_WR (pDevice, Grc.Mode, Value32);

	if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700) {
		REG_WR (pDevice, Grc.LocalCtrl,
			GRC_MISC_LOCAL_CTRL_GPIO_OUTPUT1 |
			GRC_MISC_LOCAL_CTRL_GPIO_OE1);
	}
	MM_Wait (40);

	/* Enable indirect memory access */
	REG_WR (pDevice, MemArbiter.Mode, T3_MEM_ARBITER_MODE_ENABLE);

	if (REG_RD (pDevice, PciCfg.ClockCtrl) & T3_PCI_44MHZ_CORE_CLOCK) {
		REG_WR (pDevice, PciCfg.ClockCtrl, T3_PCI_44MHZ_CORE_CLOCK |
			T3_PCI_SELECT_ALTERNATE_CLOCK);
		REG_WR (pDevice, PciCfg.ClockCtrl,
			T3_PCI_SELECT_ALTERNATE_CLOCK);
		MM_Wait (40);	/* required delay is 27usec */
	}
	REG_WR (pDevice, PciCfg.ClockCtrl, 0);
	REG_WR (pDevice, PciCfg.MemWindowBaseAddr, 0);

#if PCIX_TARGET_WORKAROUND
	MM_ReadConfig32 (pDevice, T3_PCI_STATE_REG, &Value32);
	if ((pDevice->EnablePciXFix == FALSE) &&
	    ((Value32 & T3_PCI_STATE_CONVENTIONAL_PCI_MODE) == 0)) {
		if (pDevice->ChipRevId == T3_CHIP_ID_5701_A0 ||
		    pDevice->ChipRevId == T3_CHIP_ID_5701_B0 ||
		    pDevice->ChipRevId == T3_CHIP_ID_5701_B2 ||
		    pDevice->ChipRevId == T3_CHIP_ID_5701_B5) {
			__raw_writel (0,
				      &(pDevice->pMemView->uIntMem.
					MemBlock32K[0x300]));
			__raw_writel (0,
				      &(pDevice->pMemView->uIntMem.
					MemBlock32K[0x301]));
			__raw_writel (0xffffffff,
				      &(pDevice->pMemView->uIntMem.
					MemBlock32K[0x301]));
			if (__raw_readl
			    (&(pDevice->pMemView->uIntMem.MemBlock32K[0x300])))
			{
				pDevice->EnablePciXFix = TRUE;
			}
		}
	}
#endif
#if 1
	/*
	 *  This code was at the beginning of else block below, but that's
	 *  a bug if node address in shared memory.
	 */
	MM_Wait (50);
	LM_NvramInit (pDevice);
#endif
	/* Get the node address.  First try to get in from the shared memory. */
	/* If the signature is not present, then get it from the NVRAM. */
	Value32 = MEM_RD_OFFSET (pDevice, T3_MAC_ADDR_HIGH_MAILBOX);
	if ((Value32 >> 16) == 0x484b) {

		pDevice->NodeAddress[0] = (LM_UINT8) (Value32 >> 8);
		pDevice->NodeAddress[1] = (LM_UINT8) Value32;

		Value32 = MEM_RD_OFFSET (pDevice, T3_MAC_ADDR_LOW_MAILBOX);

		pDevice->NodeAddress[2] = (LM_UINT8) (Value32 >> 24);
		pDevice->NodeAddress[3] = (LM_UINT8) (Value32 >> 16);
		pDevice->NodeAddress[4] = (LM_UINT8) (Value32 >> 8);
		pDevice->NodeAddress[5] = (LM_UINT8) Value32;

		Status = LM_STATUS_SUCCESS;
	} else {
		Status = LM_NvramRead (pDevice, 0x7c, &Value32);
		if (Status == LM_STATUS_SUCCESS) {
			pDevice->NodeAddress[0] = (LM_UINT8) (Value32 >> 16);
			pDevice->NodeAddress[1] = (LM_UINT8) (Value32 >> 24);

			Status = LM_NvramRead (pDevice, 0x80, &Value32);

			pDevice->NodeAddress[2] = (LM_UINT8) Value32;
			pDevice->NodeAddress[3] = (LM_UINT8) (Value32 >> 8);
			pDevice->NodeAddress[4] = (LM_UINT8) (Value32 >> 16);
			pDevice->NodeAddress[5] = (LM_UINT8) (Value32 >> 24);
		}
	}

	/* Assign a default address. */
	if (Status != LM_STATUS_SUCCESS) {
#ifndef EMBEDDED
		printk (KERN_ERR
			"Cannot get MAC addr from NVRAM. Using default.\n");
#endif
		pDevice->NodeAddress[0] = 0x00;
		pDevice->NodeAddress[1] = 0x10;
		pDevice->NodeAddress[2] = 0x18;
		pDevice->NodeAddress[3] = 0x68;
		pDevice->NodeAddress[4] = 0x61;
		pDevice->NodeAddress[5] = 0x76;
	}

	pDevice->PermanentNodeAddress[0] = pDevice->NodeAddress[0];
	pDevice->PermanentNodeAddress[1] = pDevice->NodeAddress[1];
	pDevice->PermanentNodeAddress[2] = pDevice->NodeAddress[2];
	pDevice->PermanentNodeAddress[3] = pDevice->NodeAddress[3];
	pDevice->PermanentNodeAddress[4] = pDevice->NodeAddress[4];
	pDevice->PermanentNodeAddress[5] = pDevice->NodeAddress[5];

	/* Initialize the default values. */
	pDevice->NoTxPseudoHdrChksum = FALSE;
	pDevice->NoRxPseudoHdrChksum = FALSE;
	pDevice->NicSendBd = FALSE;
	pDevice->TxPacketDescCnt = DEFAULT_TX_PACKET_DESC_COUNT;
	pDevice->RxStdDescCnt = DEFAULT_STD_RCV_DESC_COUNT;
	pDevice->RxCoalescingTicks = DEFAULT_RX_COALESCING_TICKS;
	pDevice->TxCoalescingTicks = DEFAULT_TX_COALESCING_TICKS;
	pDevice->RxMaxCoalescedFrames = DEFAULT_RX_MAX_COALESCED_FRAMES;
	pDevice->TxMaxCoalescedFrames = DEFAULT_TX_MAX_COALESCED_FRAMES;
	pDevice->RxCoalescingTicksDuringInt = BAD_DEFAULT_VALUE;
	pDevice->TxCoalescingTicksDuringInt = BAD_DEFAULT_VALUE;
	pDevice->RxMaxCoalescedFramesDuringInt = BAD_DEFAULT_VALUE;
	pDevice->TxMaxCoalescedFramesDuringInt = BAD_DEFAULT_VALUE;
	pDevice->StatsCoalescingTicks = DEFAULT_STATS_COALESCING_TICKS;
	pDevice->EnableMWI = FALSE;
	pDevice->TxMtu = MAX_ETHERNET_PACKET_SIZE_NO_CRC;
	pDevice->RxMtu = MAX_ETHERNET_PACKET_SIZE_NO_CRC;
	pDevice->DisableAutoNeg = FALSE;
	pDevice->PhyIntMode = T3_PHY_INT_MODE_AUTO;
	pDevice->LinkChngMode = T3_LINK_CHNG_MODE_AUTO;
	pDevice->LedMode = LED_MODE_AUTO;
	pDevice->ResetPhyOnInit = TRUE;
	pDevice->DelayPciGrant = TRUE;
	pDevice->UseTaggedStatus = FALSE;
	pDevice->OneDmaAtOnce = BAD_DEFAULT_VALUE;

	pDevice->DmaMbufLowMark = T3_DEF_DMA_MBUF_LOW_WMARK_JUMBO;
	pDevice->RxMacMbufLowMark = T3_DEF_RX_MAC_MBUF_LOW_WMARK_JUMBO;
	pDevice->MbufHighMark = T3_DEF_MBUF_HIGH_WMARK_JUMBO;

	pDevice->RequestedMediaType = LM_REQUESTED_MEDIA_TYPE_AUTO;
	pDevice->TaskOffloadCap = LM_TASK_OFFLOAD_NONE;
	pDevice->FlowControlCap = LM_FLOW_CONTROL_AUTO_PAUSE;
	pDevice->EnableTbi = FALSE;
#if INCLUDE_TBI_SUPPORT
	pDevice->PollTbiLink = BAD_DEFAULT_VALUE;
#endif

	switch (T3_ASIC_REV (pDevice->ChipRevId)) {
	case T3_ASIC_REV_5704:
		pDevice->MbufBase = T3_NIC_MBUF_POOL_ADDR;
		pDevice->MbufSize = T3_NIC_MBUF_POOL_SIZE64;
		break;
	default:
		pDevice->MbufBase = T3_NIC_MBUF_POOL_ADDR;
		pDevice->MbufSize = T3_NIC_MBUF_POOL_SIZE96;
		break;
	}

	pDevice->LinkStatus = LM_STATUS_LINK_DOWN;
	pDevice->QueueRxPackets = TRUE;

	pDevice->EnableWireSpeed = TRUE;

#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
	pDevice->RxJumboDescCnt = DEFAULT_JUMBO_RCV_DESC_COUNT;
#endif				/* T3_JUMBO_RCV_RCB_ENTRY_COUNT */

	/* Make this is a known adapter. */
	pAdapterInfo = LM_GetAdapterInfoBySsid (pDevice->SubsystemVendorId,
						pDevice->SubsystemId);

	pDevice->BondId = REG_RD (pDevice, Grc.MiscCfg) & GRC_MISC_BD_ID_MASK;
	if (pDevice->BondId != GRC_MISC_BD_ID_5700 &&
	    pDevice->BondId != GRC_MISC_BD_ID_5701 &&
	    pDevice->BondId != GRC_MISC_BD_ID_5702FE &&
	    pDevice->BondId != GRC_MISC_BD_ID_5703 &&
	    pDevice->BondId != GRC_MISC_BD_ID_5703S &&
	    pDevice->BondId != GRC_MISC_BD_ID_5704 &&
	    pDevice->BondId != GRC_MISC_BD_ID_5704CIOBE) {
		return LM_STATUS_UNKNOWN_ADAPTER;
	}

	pDevice->SplitModeEnable = SPLIT_MODE_DISABLE;
	if ((pDevice->ChipRevId == T3_CHIP_ID_5704_A0) &&
	    (pDevice->BondId == GRC_MISC_BD_ID_5704CIOBE)) {
		pDevice->SplitModeEnable = SPLIT_MODE_ENABLE;
		pDevice->SplitModeMaxReq = SPLIT_MODE_5704_MAX_REQ;
	}

	/* Get Eeprom info. */
	Value32 = MEM_RD_OFFSET (pDevice, T3_NIC_DATA_SIG_ADDR);
	if (Value32 == T3_NIC_DATA_SIG) {
		EeSigFound = TRUE;
		Value32 = MEM_RD_OFFSET (pDevice, T3_NIC_DATA_NIC_CFG_ADDR);

		/* Determine PHY type. */
		switch (Value32 & T3_NIC_CFG_PHY_TYPE_MASK) {
		case T3_NIC_CFG_PHY_TYPE_COPPER:
			EePhyTypeSerdes = FALSE;
			break;

		case T3_NIC_CFG_PHY_TYPE_FIBER:
			EePhyTypeSerdes = TRUE;
			break;

		default:
			EePhyTypeSerdes = FALSE;
			break;
		}

		/* Determine PHY led mode. */
		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700 ||
		    T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5701) {
			switch (Value32 & T3_NIC_CFG_LED_MODE_MASK) {
			case T3_NIC_CFG_LED_MODE_TRIPLE_SPEED:
				EePhyLedMode = LED_MODE_THREE_LINK;
				break;

			case T3_NIC_CFG_LED_MODE_LINK_SPEED:
				EePhyLedMode = LED_MODE_LINK10;
				break;

			default:
				EePhyLedMode = LED_MODE_AUTO;
				break;
			}
		} else {
			switch (Value32 & T3_NIC_CFG_LED_MODE_MASK) {
			case T3_NIC_CFG_LED_MODE_OPEN_DRAIN:
				EePhyLedMode = LED_MODE_OPEN_DRAIN;
				break;

			case T3_NIC_CFG_LED_MODE_OUTPUT:
				EePhyLedMode = LED_MODE_OUTPUT;
				break;

			default:
				EePhyLedMode = LED_MODE_AUTO;
				break;
			}
		}
		if (pDevice->ChipRevId == T3_CHIP_ID_5703_A1 ||
		    pDevice->ChipRevId == T3_CHIP_ID_5703_A2) {
			/* Enable EEPROM write protection. */
			if (Value32 & T3_NIC_EEPROM_WP) {
				pDevice->EepromWp = TRUE;
			}
		}

		/* Get the PHY Id. */
		Value32 = MEM_RD_OFFSET (pDevice, T3_NIC_DATA_PHY_ID_ADDR);
		if (Value32) {
			EePhyId = (((Value32 & T3_NIC_PHY_ID1_MASK) >> 16) &
				   PHY_ID1_OUI_MASK) << 10;

			Value32 = Value32 & T3_NIC_PHY_ID2_MASK;

			EePhyId |= ((Value32 & PHY_ID2_OUI_MASK) << 16) |
			    (Value32 & PHY_ID2_MODEL_MASK) | (Value32 &
							      PHY_ID2_REV_MASK);
		} else {
			EePhyId = 0;
		}
	} else {
		EeSigFound = FALSE;
	}

	/* Set the PHY address. */
	pDevice->PhyAddr = PHY_DEVICE_ID;

	/* Disable auto polling. */
	pDevice->MiMode = 0xc0000;
	REG_WR (pDevice, MacCtrl.MiMode, pDevice->MiMode);
	MM_Wait (40);

	/* Get the PHY id. */
	LM_ReadPhy (pDevice, PHY_ID1_REG, &Value32);
	pDevice->PhyId = (Value32 & PHY_ID1_OUI_MASK) << 10;

	LM_ReadPhy (pDevice, PHY_ID2_REG, &Value32);
	pDevice->PhyId |= ((Value32 & PHY_ID2_OUI_MASK) << 16) |
	    (Value32 & PHY_ID2_MODEL_MASK) | (Value32 & PHY_ID2_REV_MASK);

	/* Set the EnableTbi flag to false if we have a copper PHY. */
	switch (pDevice->PhyId & PHY_ID_MASK) {
	case PHY_BCM5400_PHY_ID:
		pDevice->EnableTbi = FALSE;
		break;

	case PHY_BCM5401_PHY_ID:
		pDevice->EnableTbi = FALSE;
		break;

	case PHY_BCM5411_PHY_ID:
		pDevice->EnableTbi = FALSE;
		break;

	case PHY_BCM5701_PHY_ID:
		pDevice->EnableTbi = FALSE;
		break;

	case PHY_BCM5703_PHY_ID:
		pDevice->EnableTbi = FALSE;
		break;

	case PHY_BCM5704_PHY_ID:
		pDevice->EnableTbi = FALSE;
		break;

	case PHY_BCM8002_PHY_ID:
		pDevice->EnableTbi = TRUE;
		break;

	default:

		if (pAdapterInfo) {
			pDevice->PhyId = pAdapterInfo->PhyId;
			pDevice->EnableTbi = pAdapterInfo->Serdes;
		} else if (EeSigFound) {
			pDevice->PhyId = EePhyId;
			pDevice->EnableTbi = EePhyTypeSerdes;
		}
		break;
	}

	/* Bail out if we don't know the copper PHY id. */
	if (UNKNOWN_PHY_ID (pDevice->PhyId) && !pDevice->EnableTbi) {
		return LM_STATUS_FAILURE;
	}

	if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5703) {
		if ((pDevice->SavedCacheLineReg & 0xff00) < 0x4000) {
			pDevice->SavedCacheLineReg &= 0xffff00ff;
			pDevice->SavedCacheLineReg |= 0x4000;
		}
	}
	/* Change driver parameters. */
	Status = MM_GetConfig (pDevice);
	if (Status != LM_STATUS_SUCCESS) {
		return Status;
	}
#if INCLUDE_5701_AX_FIX
	if (pDevice->ChipRevId == T3_CHIP_ID_5701_A0 ||
	    pDevice->ChipRevId == T3_CHIP_ID_5701_B0) {
		pDevice->ResetPhyOnInit = TRUE;
	}
#endif

	/* Save the current phy link status. */
	if (!pDevice->EnableTbi) {
		LM_ReadPhy (pDevice, PHY_STATUS_REG, &Value32);
		LM_ReadPhy (pDevice, PHY_STATUS_REG, &Value32);

		/* If we don't have link reset the PHY. */
		if (!(Value32 & PHY_STATUS_LINK_PASS)
		    || pDevice->ResetPhyOnInit) {

			LM_WritePhy (pDevice, PHY_CTRL_REG, PHY_CTRL_PHY_RESET);

			for (j = 0; j < 100; j++) {
				MM_Wait (10);

				LM_ReadPhy (pDevice, PHY_CTRL_REG, &Value32);
				if (Value32 && !(Value32 & PHY_CTRL_PHY_RESET)) {
					MM_Wait (40);
					break;
				}
			}

#if INCLUDE_5701_AX_FIX
			/* 5701_AX_BX bug:  only advertises 10mb speed. */
			if (pDevice->ChipRevId == T3_CHIP_ID_5701_A0 ||
			    pDevice->ChipRevId == T3_CHIP_ID_5701_B0) {

				Value32 = PHY_AN_AD_PROTOCOL_802_3_CSMA_CD |
				    PHY_AN_AD_10BASET_HALF |
				    PHY_AN_AD_10BASET_FULL |
				    PHY_AN_AD_100BASETX_FULL |
				    PHY_AN_AD_100BASETX_HALF;
				Value32 |= GetPhyAdFlowCntrlSettings (pDevice);
				LM_WritePhy (pDevice, PHY_AN_AD_REG, Value32);
				pDevice->advertising = Value32;

				Value32 = BCM540X_AN_AD_1000BASET_HALF |
				    BCM540X_AN_AD_1000BASET_FULL |
				    BCM540X_CONFIG_AS_MASTER |
				    BCM540X_ENABLE_CONFIG_AS_MASTER;
				LM_WritePhy (pDevice,
					     BCM540X_1000BASET_CTRL_REG,
					     Value32);
				pDevice->advertising1000 = Value32;

				LM_WritePhy (pDevice, PHY_CTRL_REG,
					     PHY_CTRL_AUTO_NEG_ENABLE |
					     PHY_CTRL_RESTART_AUTO_NEG);
			}
#endif
			if (T3_ASIC_REV (pDevice->ChipRevId) ==
			    T3_ASIC_REV_5703) {
				LM_WritePhy (pDevice, 0x18, 0x0c00);
				LM_WritePhy (pDevice, 0x17, 0x201f);
				LM_WritePhy (pDevice, 0x15, 0x2aaa);
			}
			if (pDevice->ChipRevId == T3_CHIP_ID_5704_A0) {
				LM_WritePhy (pDevice, 0x1c, 0x8d68);
				LM_WritePhy (pDevice, 0x1c, 0x8d68);
			}
			/* Enable Ethernet@WireSpeed. */
			if (pDevice->EnableWireSpeed) {
				LM_WritePhy (pDevice, 0x18, 0x7007);
				LM_ReadPhy (pDevice, 0x18, &Value32);
				LM_WritePhy (pDevice, 0x18,
					     Value32 | BIT_15 | BIT_4);
			}
		}
	}

	/* Turn off tap power management. */
	if ((pDevice->PhyId & PHY_ID_MASK) == PHY_BCM5401_PHY_ID) {
		LM_WritePhy (pDevice, BCM5401_AUX_CTRL, 0x0c20);
		LM_WritePhy (pDevice, BCM540X_DSP_ADDRESS_REG, 0x0012);
		LM_WritePhy (pDevice, BCM540X_DSP_RW_PORT, 0x1804);
		LM_WritePhy (pDevice, BCM540X_DSP_ADDRESS_REG, 0x0013);
		LM_WritePhy (pDevice, BCM540X_DSP_RW_PORT, 0x1204);
		LM_WritePhy (pDevice, BCM540X_DSP_ADDRESS_REG, 0x8006);
		LM_WritePhy (pDevice, BCM540X_DSP_RW_PORT, 0x0132);
		LM_WritePhy (pDevice, BCM540X_DSP_ADDRESS_REG, 0x8006);
		LM_WritePhy (pDevice, BCM540X_DSP_RW_PORT, 0x0232);
		LM_WritePhy (pDevice, BCM540X_DSP_ADDRESS_REG, 0x201f);
		LM_WritePhy (pDevice, BCM540X_DSP_RW_PORT, 0x0a20);

		MM_Wait (40);
	}
#if INCLUDE_TBI_SUPPORT
	pDevice->IgnoreTbiLinkChange = FALSE;

	if (pDevice->EnableTbi) {
		pDevice->WakeUpModeCap = LM_WAKE_UP_MODE_NONE;
		pDevice->PhyIntMode = T3_PHY_INT_MODE_LINK_READY;
		if ((pDevice->PollTbiLink == BAD_DEFAULT_VALUE) ||
		    pDevice->DisableAutoNeg) {
			pDevice->PollTbiLink = FALSE;
		}
	} else {
		pDevice->PollTbiLink = FALSE;
	}
#endif				/* INCLUDE_TBI_SUPPORT */

	/* UseTaggedStatus is only valid for 5701 and later. */
	if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700) {
		pDevice->UseTaggedStatus = FALSE;

		pDevice->CoalesceMode = 0;
	} else {
		pDevice->CoalesceMode =
		    HOST_COALESCE_CLEAR_TICKS_ON_RX_BD_EVENT |
		    HOST_COALESCE_CLEAR_TICKS_ON_TX_BD_EVENT;
	}

	/* Set the status block size. */
	if (T3_CHIP_REV (pDevice->ChipRevId) != T3_CHIP_REV_5700_AX &&
	    T3_CHIP_REV (pDevice->ChipRevId) != T3_CHIP_REV_5700_BX) {
		pDevice->CoalesceMode |= HOST_COALESCE_32_BYTE_STATUS_MODE;
	}

	/* Check the DURING_INT coalescing ticks parameters. */
	if (pDevice->UseTaggedStatus) {
		if (pDevice->RxCoalescingTicksDuringInt == BAD_DEFAULT_VALUE) {
			pDevice->RxCoalescingTicksDuringInt =
			    DEFAULT_RX_COALESCING_TICKS_DURING_INT;
		}

		if (pDevice->TxCoalescingTicksDuringInt == BAD_DEFAULT_VALUE) {
			pDevice->TxCoalescingTicksDuringInt =
			    DEFAULT_TX_COALESCING_TICKS_DURING_INT;
		}

		if (pDevice->RxMaxCoalescedFramesDuringInt == BAD_DEFAULT_VALUE) {
			pDevice->RxMaxCoalescedFramesDuringInt =
			    DEFAULT_RX_MAX_COALESCED_FRAMES_DURING_INT;
		}

		if (pDevice->TxMaxCoalescedFramesDuringInt == BAD_DEFAULT_VALUE) {
			pDevice->TxMaxCoalescedFramesDuringInt =
			    DEFAULT_TX_MAX_COALESCED_FRAMES_DURING_INT;
		}
	} else {
		if (pDevice->RxCoalescingTicksDuringInt == BAD_DEFAULT_VALUE) {
			pDevice->RxCoalescingTicksDuringInt = 0;
		}

		if (pDevice->TxCoalescingTicksDuringInt == BAD_DEFAULT_VALUE) {
			pDevice->TxCoalescingTicksDuringInt = 0;
		}

		if (pDevice->RxMaxCoalescedFramesDuringInt == BAD_DEFAULT_VALUE) {
			pDevice->RxMaxCoalescedFramesDuringInt = 0;
		}

		if (pDevice->TxMaxCoalescedFramesDuringInt == BAD_DEFAULT_VALUE) {
			pDevice->TxMaxCoalescedFramesDuringInt = 0;
		}
	}

#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
	if (pDevice->RxMtu <= (MAX_STD_RCV_BUFFER_SIZE - 8 /* CRC */ )) {
		pDevice->RxJumboDescCnt = 0;
		if (pDevice->RxMtu <= MAX_ETHERNET_PACKET_SIZE_NO_CRC) {
			pDevice->RxMtu = MAX_ETHERNET_PACKET_SIZE_NO_CRC;
		}
	} else {
		pDevice->RxJumboBufferSize =
		    (pDevice->RxMtu + 8 /* CRC + VLAN */  +
		     COMMON_CACHE_LINE_SIZE - 1) & ~COMMON_CACHE_LINE_MASK;

		if (pDevice->RxJumboBufferSize > MAX_JUMBO_RCV_BUFFER_SIZE) {
			pDevice->RxJumboBufferSize =
			    DEFAULT_JUMBO_RCV_BUFFER_SIZE;
			pDevice->RxMtu =
			    pDevice->RxJumboBufferSize - 8 /* CRC + VLAN */ ;
		}
		pDevice->TxMtu = pDevice->RxMtu;

	}
#else
	pDevice->RxMtu = MAX_ETHERNET_PACKET_SIZE_NO_CRC;
#endif				/* T3_JUMBO_RCV_RCB_ENTRY_COUNT */

	pDevice->RxPacketDescCnt =
#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
	    pDevice->RxJumboDescCnt +
#endif				/* T3_JUMBO_RCV_RCB_ENTRY_COUNT */
	    pDevice->RxStdDescCnt;

	if (pDevice->TxMtu < MAX_ETHERNET_PACKET_SIZE_NO_CRC) {
		pDevice->TxMtu = MAX_ETHERNET_PACKET_SIZE_NO_CRC;
	}

	if (pDevice->TxMtu > MAX_JUMBO_TX_BUFFER_SIZE) {
		pDevice->TxMtu = MAX_JUMBO_TX_BUFFER_SIZE;
	}

	/* Configure the proper ways to get link change interrupt. */
	if (pDevice->PhyIntMode == T3_PHY_INT_MODE_AUTO) {
		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700) {
			pDevice->PhyIntMode = T3_PHY_INT_MODE_MI_INTERRUPT;
		} else {
			pDevice->PhyIntMode = T3_PHY_INT_MODE_LINK_READY;
		}
	} else if (pDevice->PhyIntMode == T3_PHY_INT_MODE_AUTO_POLLING) {
		/* Auto-polling does not work on 5700_AX and 5700_BX. */
		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700) {
			pDevice->PhyIntMode = T3_PHY_INT_MODE_MI_INTERRUPT;
		}
	}

	/* Determine the method to get link change status. */
	if (pDevice->LinkChngMode == T3_LINK_CHNG_MODE_AUTO) {
		/* The link status bit in the status block does not work on 5700_AX */
		/* and 5700_BX chips. */
		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700) {
			pDevice->LinkChngMode =
			    T3_LINK_CHNG_MODE_USE_STATUS_REG;
		} else {
			pDevice->LinkChngMode =
			    T3_LINK_CHNG_MODE_USE_STATUS_BLOCK;
		}
	}

	if (pDevice->PhyIntMode == T3_PHY_INT_MODE_MI_INTERRUPT ||
	    T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700) {
		pDevice->LinkChngMode = T3_LINK_CHNG_MODE_USE_STATUS_REG;
	}

	/* Configure PHY led mode. */
	if (pDevice->LedMode == LED_MODE_AUTO) {
		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700 ||
		    T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5701) {
			if (pDevice->SubsystemVendorId == T3_SVID_DELL) {
				pDevice->LedMode = LED_MODE_LINK10;
			} else {
				pDevice->LedMode = LED_MODE_THREE_LINK;

				if (EeSigFound && EePhyLedMode != LED_MODE_AUTO) {
					pDevice->LedMode = EePhyLedMode;
				}
			}

			/* bug? 5701 in LINK10 mode does not seem to work when */
			/* PhyIntMode is LINK_READY. */
			if (T3_ASIC_REV (pDevice->ChipRevId) != T3_ASIC_REV_5700
			    &&
#if INCLUDE_TBI_SUPPORT
			    pDevice->EnableTbi == FALSE &&
#endif
			    pDevice->LedMode == LED_MODE_LINK10) {
				pDevice->PhyIntMode =
				    T3_PHY_INT_MODE_MI_INTERRUPT;
				pDevice->LinkChngMode =
				    T3_LINK_CHNG_MODE_USE_STATUS_REG;
			}

			if (pDevice->EnableTbi) {
				pDevice->LedMode = LED_MODE_THREE_LINK;
			}
		} else {
			if (EeSigFound && EePhyLedMode != LED_MODE_AUTO) {
				pDevice->LedMode = EePhyLedMode;
			} else {
				pDevice->LedMode = LED_MODE_OPEN_DRAIN;
			}
		}
	}

	/* Enable OneDmaAtOnce. */
	if (pDevice->OneDmaAtOnce == BAD_DEFAULT_VALUE) {
		pDevice->OneDmaAtOnce = FALSE;
	}

	if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700 ||
	    pDevice->ChipRevId == T3_CHIP_ID_5701_A0 ||
	    pDevice->ChipRevId == T3_CHIP_ID_5701_B0 ||
	    pDevice->ChipRevId == T3_CHIP_ID_5701_B2) {
		pDevice->WolSpeed = WOL_SPEED_10MB;
	} else {
		pDevice->WolSpeed = WOL_SPEED_100MB;
	}

	/* Offloadings. */
	pDevice->TaskToOffload = LM_TASK_OFFLOAD_NONE;

	/* Turn off task offloading on Ax. */
	if (pDevice->ChipRevId == T3_CHIP_ID_5700_B0) {
		pDevice->TaskOffloadCap &= ~(LM_TASK_OFFLOAD_TX_TCP_CHECKSUM |
					     LM_TASK_OFFLOAD_TX_UDP_CHECKSUM);
	}
	pDevice->PciState = REG_RD (pDevice, PciCfg.PciState);
	LM_ReadVPD (pDevice);
	LM_ReadBootCodeVersion (pDevice);
	LM_GetBusSpeed (pDevice);

	return LM_STATUS_SUCCESS;
}				/* LM_GetAdapterInfo */

STATIC PLM_ADAPTER_INFO LM_GetAdapterInfoBySsid (LM_UINT16 Svid, LM_UINT16 Ssid)
{
	static LM_ADAPTER_INFO AdapterArr[] = {
		{T3_SVID_BROADCOM, T3_SSID_BROADCOM_BCM95700A6,
		 PHY_BCM5401_PHY_ID, 0},
		{T3_SVID_BROADCOM, T3_SSID_BROADCOM_BCM95701A5,
		 PHY_BCM5701_PHY_ID, 0},
		{T3_SVID_BROADCOM, T3_SSID_BROADCOM_BCM95700T6,
		 PHY_BCM8002_PHY_ID, 1},
		{T3_SVID_BROADCOM, T3_SSID_BROADCOM_BCM95700A9, 0, 1},
		{T3_SVID_BROADCOM, T3_SSID_BROADCOM_BCM95701T1,
		 PHY_BCM5701_PHY_ID, 0},
		{T3_SVID_BROADCOM, T3_SSID_BROADCOM_BCM95701T8,
		 PHY_BCM5701_PHY_ID, 0},
		{T3_SVID_BROADCOM, T3_SSID_BROADCOM_BCM95701A7, 0, 1},
		{T3_SVID_BROADCOM, T3_SSID_BROADCOM_BCM95701A10,
		 PHY_BCM5701_PHY_ID, 0},
		{T3_SVID_BROADCOM, T3_SSID_BROADCOM_BCM95701A12,
		 PHY_BCM5701_PHY_ID, 0},
		{T3_SVID_BROADCOM, T3_SSID_BROADCOM_BCM95703Ax1,
		 PHY_BCM5701_PHY_ID, 0},
		{T3_SVID_BROADCOM, T3_SSID_BROADCOM_BCM95703Ax2,
		 PHY_BCM5701_PHY_ID, 0},

		{T3_SVID_3COM, T3_SSID_3COM_3C996T, PHY_BCM5401_PHY_ID, 0},
		{T3_SVID_3COM, T3_SSID_3COM_3C996BT, PHY_BCM5701_PHY_ID, 0},
		{T3_SVID_3COM, T3_SSID_3COM_3C996SX, 0, 1},
		{T3_SVID_3COM, T3_SSID_3COM_3C1000T, PHY_BCM5701_PHY_ID, 0},
		{T3_SVID_3COM, T3_SSID_3COM_3C940BR01, PHY_BCM5701_PHY_ID, 0},

		{T3_SVID_DELL, T3_SSID_DELL_VIPER, PHY_BCM5401_PHY_ID, 0},
		{T3_SVID_DELL, T3_SSID_DELL_JAGUAR, PHY_BCM5401_PHY_ID, 0},
		{T3_SVID_DELL, T3_SSID_DELL_MERLOT, PHY_BCM5411_PHY_ID, 0},
		{T3_SVID_DELL, T3_SSID_DELL_SLIM_MERLOT, PHY_BCM5411_PHY_ID, 0},

		{T3_SVID_COMPAQ, T3_SSID_COMPAQ_BANSHEE, PHY_BCM5701_PHY_ID, 0},
		{T3_SVID_COMPAQ, T3_SSID_COMPAQ_BANSHEE_2, PHY_BCM5701_PHY_ID,
		 0},
		{T3_SVID_COMPAQ, T3_SSID_COMPAQ_CHANGELING, 0, 1},
		{T3_SVID_COMPAQ, T3_SSID_COMPAQ_NC7780, PHY_BCM5701_PHY_ID, 0},
		{T3_SVID_COMPAQ, T3_SSID_COMPAQ_NC7780_2, PHY_BCM5701_PHY_ID,
		 0},

	};
	LM_UINT32 j;

	for (j = 0; j < sizeof (AdapterArr) / sizeof (LM_ADAPTER_INFO); j++) {
		if (AdapterArr[j].Svid == Svid && AdapterArr[j].Ssid == Ssid) {
			return &AdapterArr[j];
		}
	}

	return NULL;
}

/******************************************************************************/
/* Description:                                                               */
/*    This routine sets up receive/transmit buffer descriptions queues.       */
/*                                                                            */
/* Return:                                                                    */
/*    LM_STATUS_SUCCESS                                                       */
/******************************************************************************/
LM_STATUS LM_InitializeAdapter (PLM_DEVICE_BLOCK pDevice)
{
	LM_PHYSICAL_ADDRESS MemPhy;
	PLM_UINT8 pMemVirt;
	PLM_PACKET pPacket;
	LM_STATUS Status;
	LM_UINT32 Size;
	LM_UINT32 j;

	/* Set power state to D0. */
	LM_SetPowerState (pDevice, LM_POWER_STATE_D0);

	/* Intialize the queues. */
	QQ_InitQueue (&pDevice->RxPacketReceivedQ.Container,
		      MAX_RX_PACKET_DESC_COUNT);
	QQ_InitQueue (&pDevice->RxPacketFreeQ.Container,
		      MAX_RX_PACKET_DESC_COUNT);

	QQ_InitQueue (&pDevice->TxPacketFreeQ.Container,
		      MAX_TX_PACKET_DESC_COUNT);
	QQ_InitQueue (&pDevice->TxPacketActiveQ.Container,
		      MAX_TX_PACKET_DESC_COUNT);
	QQ_InitQueue (&pDevice->TxPacketXmittedQ.Container,
		      MAX_TX_PACKET_DESC_COUNT);

	/* Allocate shared memory for: status block, the buffers for receive */
	/* rings -- standard, mini, jumbo, and return rings. */
	Size = T3_STATUS_BLOCK_SIZE + sizeof (T3_STATS_BLOCK) +
	    T3_STD_RCV_RCB_ENTRY_COUNT * sizeof (T3_RCV_BD) +
#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
	    T3_JUMBO_RCV_RCB_ENTRY_COUNT * sizeof (T3_RCV_BD) +
#endif				/* T3_JUMBO_RCV_RCB_ENTRY_COUNT */
	    T3_RCV_RETURN_RCB_ENTRY_COUNT * sizeof (T3_RCV_BD);

	/* Memory for host based Send BD. */
	if (pDevice->NicSendBd == FALSE) {
		Size += sizeof (T3_SND_BD) * T3_SEND_RCB_ENTRY_COUNT;
	}

	/* Allocate the memory block. */
	Status =
	    MM_AllocateSharedMemory (pDevice, Size, (PLM_VOID) & pMemVirt,
				     &MemPhy, FALSE);
	if (Status != LM_STATUS_SUCCESS) {
		return Status;
	}

	/* Program DMA Read/Write */
	if (pDevice->PciState & T3_PCI_STATE_NOT_PCI_X_BUS) {
		pDevice->DmaReadWriteCtrl = 0x763f000f;
	} else {
		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5704) {
			pDevice->DmaReadWriteCtrl = 0x761f0000;
		} else {
			pDevice->DmaReadWriteCtrl = 0x761b000f;
		}
		if (pDevice->ChipRevId == T3_CHIP_ID_5703_A1 ||
		    pDevice->ChipRevId == T3_CHIP_ID_5703_A2) {
			pDevice->OneDmaAtOnce = TRUE;
		}
	}
	if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5703) {
		pDevice->DmaReadWriteCtrl &= 0xfffffff0;
	}

	if (pDevice->OneDmaAtOnce) {
		pDevice->DmaReadWriteCtrl |= DMA_CTRL_WRITE_ONE_DMA_AT_ONCE;
	}
	REG_WR (pDevice, PciCfg.DmaReadWriteCtrl, pDevice->DmaReadWriteCtrl);

	if (LM_DmaTest (pDevice, pMemVirt, MemPhy, 0x400) != LM_STATUS_SUCCESS) {
		return LM_STATUS_FAILURE;
	}

	/* Status block. */
	pDevice->pStatusBlkVirt = (PT3_STATUS_BLOCK) pMemVirt;
	pDevice->StatusBlkPhy = MemPhy;
	pMemVirt += T3_STATUS_BLOCK_SIZE;
	LM_INC_PHYSICAL_ADDRESS (&MemPhy, T3_STATUS_BLOCK_SIZE);

	/* Statistics block. */
	pDevice->pStatsBlkVirt = (PT3_STATS_BLOCK) pMemVirt;
	pDevice->StatsBlkPhy = MemPhy;
	pMemVirt += sizeof (T3_STATS_BLOCK);
	LM_INC_PHYSICAL_ADDRESS (&MemPhy, sizeof (T3_STATS_BLOCK));

	/* Receive standard BD buffer. */
	pDevice->pRxStdBdVirt = (PT3_RCV_BD) pMemVirt;
	pDevice->RxStdBdPhy = MemPhy;

	pMemVirt += T3_STD_RCV_RCB_ENTRY_COUNT * sizeof (T3_RCV_BD);
	LM_INC_PHYSICAL_ADDRESS (&MemPhy,
				 T3_STD_RCV_RCB_ENTRY_COUNT *
				 sizeof (T3_RCV_BD));

#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
	/* Receive jumbo BD buffer. */
	pDevice->pRxJumboBdVirt = (PT3_RCV_BD) pMemVirt;
	pDevice->RxJumboBdPhy = MemPhy;

	pMemVirt += T3_JUMBO_RCV_RCB_ENTRY_COUNT * sizeof (T3_RCV_BD);
	LM_INC_PHYSICAL_ADDRESS (&MemPhy,
				 T3_JUMBO_RCV_RCB_ENTRY_COUNT *
				 sizeof (T3_RCV_BD));
#endif				/* T3_JUMBO_RCV_RCB_ENTRY_COUNT */

	/* Receive return BD buffer. */
	pDevice->pRcvRetBdVirt = (PT3_RCV_BD) pMemVirt;
	pDevice->RcvRetBdPhy = MemPhy;

	pMemVirt += T3_RCV_RETURN_RCB_ENTRY_COUNT * sizeof (T3_RCV_BD);
	LM_INC_PHYSICAL_ADDRESS (&MemPhy,
				 T3_RCV_RETURN_RCB_ENTRY_COUNT *
				 sizeof (T3_RCV_BD));

	/* Set up Send BD. */
	if (pDevice->NicSendBd == FALSE) {
		pDevice->pSendBdVirt = (PT3_SND_BD) pMemVirt;
		pDevice->SendBdPhy = MemPhy;

		pMemVirt += sizeof (T3_SND_BD) * T3_SEND_RCB_ENTRY_COUNT;
		LM_INC_PHYSICAL_ADDRESS (&MemPhy,
					 sizeof (T3_SND_BD) *
					 T3_SEND_RCB_ENTRY_COUNT);
	} else {
		pDevice->pSendBdVirt = (PT3_SND_BD)
		    pDevice->pMemView->uIntMem.First32k.BufferDesc;
		pDevice->SendBdPhy.High = 0;
		pDevice->SendBdPhy.Low = T3_NIC_SND_BUFFER_DESC_ADDR;
	}

	/* Allocate memory for packet descriptors. */
	Size = (pDevice->RxPacketDescCnt +
		pDevice->TxPacketDescCnt) * MM_PACKET_DESC_SIZE;
	Status = MM_AllocateMemory (pDevice, Size, (PLM_VOID *) & pPacket);
	if (Status != LM_STATUS_SUCCESS) {
		return Status;
	}
	pDevice->pPacketDescBase = (PLM_VOID) pPacket;

	/* Create transmit packet descriptors from the memory block and add them */
	/* to the TxPacketFreeQ for each send ring. */
	for (j = 0; j < pDevice->TxPacketDescCnt; j++) {
		/* Ring index. */
		pPacket->Flags = 0;

		/* Queue the descriptor in the TxPacketFreeQ of the 'k' ring. */
		QQ_PushTail (&pDevice->TxPacketFreeQ.Container, pPacket);

		/* Get the pointer to the next descriptor.  MM_PACKET_DESC_SIZE */
		/* is the total size of the packet descriptor including the */
		/* os-specific extensions in the UM_PACKET structure. */
		pPacket =
		    (PLM_PACKET) ((PLM_UINT8) pPacket + MM_PACKET_DESC_SIZE);
	}			/* for(j.. */

	/* Create receive packet descriptors from the memory block and add them */
	/* to the RxPacketFreeQ.  Create the Standard packet descriptors. */
	for (j = 0; j < pDevice->RxStdDescCnt; j++) {
		/* Receive producer ring. */
		pPacket->u.Rx.RcvProdRing = T3_STD_RCV_PROD_RING;

		/* Receive buffer size. */
		pPacket->u.Rx.RxBufferSize = MAX_STD_RCV_BUFFER_SIZE;

		/* Add the descriptor to RxPacketFreeQ. */
		QQ_PushTail (&pDevice->RxPacketFreeQ.Container, pPacket);

		/* Get the pointer to the next descriptor.  MM_PACKET_DESC_SIZE */
		/* is the total size of the packet descriptor including the */
		/* os-specific extensions in the UM_PACKET structure. */
		pPacket =
		    (PLM_PACKET) ((PLM_UINT8) pPacket + MM_PACKET_DESC_SIZE);
	}			/* for */

#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
	/* Create the Jumbo packet descriptors. */
	for (j = 0; j < pDevice->RxJumboDescCnt; j++) {
		/* Receive producer ring. */
		pPacket->u.Rx.RcvProdRing = T3_JUMBO_RCV_PROD_RING;

		/* Receive buffer size. */
		pPacket->u.Rx.RxBufferSize = pDevice->RxJumboBufferSize;

		/* Add the descriptor to RxPacketFreeQ. */
		QQ_PushTail (&pDevice->RxPacketFreeQ.Container, pPacket);

		/* Get the pointer to the next descriptor.  MM_PACKET_DESC_SIZE */
		/* is the total size of the packet descriptor including the */
		/* os-specific extensions in the UM_PACKET structure. */
		pPacket =
		    (PLM_PACKET) ((PLM_UINT8) pPacket + MM_PACKET_DESC_SIZE);
	}			/* for */
#endif				/* T3_JUMBO_RCV_RCB_ENTRY_COUNT */

	/* Initialize the rest of the packet descriptors. */
	Status = MM_InitializeUmPackets (pDevice);
	if (Status != LM_STATUS_SUCCESS) {
		return Status;
	}

	/* if */
	/* Default receive mask. */
	pDevice->ReceiveMask = LM_ACCEPT_MULTICAST | LM_ACCEPT_BROADCAST |
	    LM_ACCEPT_UNICAST;

	/* Make sure we are in the first 32k memory window or NicSendBd. */
	REG_WR (pDevice, PciCfg.MemWindowBaseAddr, 0);

	/* Initialize the hardware. */
	Status = LM_ResetAdapter (pDevice);
	if (Status != LM_STATUS_SUCCESS) {
		return Status;
	}

	/* We are done with initialization. */
	pDevice->InitDone = TRUE;

	return LM_STATUS_SUCCESS;
}				/* LM_InitializeAdapter */

/******************************************************************************/
/* Description:                                                               */
/*    This function Enables/Disables a given block.                          */
/*                                                                            */
/* Return:                                                                    */
/*    LM_STATUS_SUCCESS                                                       */
/******************************************************************************/
LM_STATUS
LM_CntrlBlock (PLM_DEVICE_BLOCK pDevice, LM_UINT32 mask, LM_UINT32 cntrl)
{
	LM_UINT32 j, i, data;
	LM_UINT32 MaxWaitCnt;

	MaxWaitCnt = 2;
	j = 0;

	for (i = 0; i < 32; i++) {
		if (!(mask & (1 << i)))
			continue;

		switch (1 << i) {
		case T3_BLOCK_DMA_RD:
			data = REG_RD (pDevice, DmaRead.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~DMA_READ_MODE_ENABLE;
				REG_WR (pDevice, DmaRead.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, DmaRead.Mode) &
					     DMA_READ_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, DmaRead.Mode,
					data | DMA_READ_MODE_ENABLE);
			break;

		case T3_BLOCK_DMA_COMP:
			data = REG_RD (pDevice, DmaComp.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~DMA_COMP_MODE_ENABLE;
				REG_WR (pDevice, DmaComp.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, DmaComp.Mode) &
					     DMA_COMP_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, DmaComp.Mode,
					data | DMA_COMP_MODE_ENABLE);
			break;

		case T3_BLOCK_RX_BD_INITIATOR:
			data = REG_RD (pDevice, RcvBdIn.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~RCV_BD_IN_MODE_ENABLE;
				REG_WR (pDevice, RcvBdIn.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, RcvBdIn.Mode) &
					     RCV_BD_IN_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, RcvBdIn.Mode,
					data | RCV_BD_IN_MODE_ENABLE);
			break;

		case T3_BLOCK_RX_BD_COMP:
			data = REG_RD (pDevice, RcvBdComp.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~RCV_BD_COMP_MODE_ENABLE;
				REG_WR (pDevice, RcvBdComp.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, RcvBdComp.Mode) &
					     RCV_BD_COMP_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, RcvBdComp.Mode,
					data | RCV_BD_COMP_MODE_ENABLE);
			break;

		case T3_BLOCK_DMA_WR:
			data = REG_RD (pDevice, DmaWrite.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~DMA_WRITE_MODE_ENABLE;
				REG_WR (pDevice, DmaWrite.Mode, data);

				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, DmaWrite.Mode) &
					     DMA_WRITE_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, DmaWrite.Mode,
					data | DMA_WRITE_MODE_ENABLE);
			break;

		case T3_BLOCK_MSI_HANDLER:
			data = REG_RD (pDevice, Msi.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~MSI_MODE_ENABLE;
				REG_WR (pDevice, Msi.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, Msi.Mode) &
					     MSI_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, Msi.Mode,
					data | MSI_MODE_ENABLE);
			break;

		case T3_BLOCK_RX_LIST_PLMT:
			data = REG_RD (pDevice, RcvListPlmt.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~RCV_LIST_PLMT_MODE_ENABLE;
				REG_WR (pDevice, RcvListPlmt.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, RcvListPlmt.Mode)
					     & RCV_LIST_PLMT_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, RcvListPlmt.Mode,
					data | RCV_LIST_PLMT_MODE_ENABLE);
			break;

		case T3_BLOCK_RX_LIST_SELECTOR:
			data = REG_RD (pDevice, RcvListSel.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~RCV_LIST_SEL_MODE_ENABLE;
				REG_WR (pDevice, RcvListSel.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, RcvListSel.Mode) &
					     RCV_LIST_SEL_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, RcvListSel.Mode,
					data | RCV_LIST_SEL_MODE_ENABLE);
			break;

		case T3_BLOCK_RX_DATA_INITIATOR:
			data = REG_RD (pDevice, RcvDataBdIn.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~RCV_DATA_BD_IN_MODE_ENABLE;
				REG_WR (pDevice, RcvDataBdIn.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, RcvDataBdIn.Mode)
					     & RCV_DATA_BD_IN_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, RcvDataBdIn.Mode,
					data | RCV_DATA_BD_IN_MODE_ENABLE);
			break;

		case T3_BLOCK_RX_DATA_COMP:
			data = REG_RD (pDevice, RcvDataComp.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~RCV_DATA_COMP_MODE_ENABLE;
				REG_WR (pDevice, RcvDataComp.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, RcvDataBdIn.Mode)
					     & RCV_DATA_COMP_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, RcvDataComp.Mode,
					data | RCV_DATA_COMP_MODE_ENABLE);
			break;

		case T3_BLOCK_HOST_COALESING:
			data = REG_RD (pDevice, HostCoalesce.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~HOST_COALESCE_ENABLE;
				REG_WR (pDevice, HostCoalesce.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, SndBdIn.Mode) &
					     HOST_COALESCE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, HostCoalesce.Mode,
					data | HOST_COALESCE_ENABLE);
			break;

		case T3_BLOCK_MAC_RX_ENGINE:
			if (cntrl == LM_DISABLE) {
				pDevice->RxMode &= ~RX_MODE_ENABLE;
				REG_WR (pDevice, MacCtrl.RxMode,
					pDevice->RxMode);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, MacCtrl.RxMode) &
					     RX_MODE_ENABLE)) {
						break;
					}
					MM_Wait (10);
				}
			} else {
				pDevice->RxMode |= RX_MODE_ENABLE;
				REG_WR (pDevice, MacCtrl.RxMode,
					pDevice->RxMode);
			}
			break;

		case T3_BLOCK_MBUF_CLUSTER_FREE:
			data = REG_RD (pDevice, MbufClusterFree.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~MBUF_CLUSTER_FREE_MODE_ENABLE;
				REG_WR (pDevice, MbufClusterFree.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD
					     (pDevice,
					      MbufClusterFree.
					      Mode) &
					     MBUF_CLUSTER_FREE_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, MbufClusterFree.Mode,
					data | MBUF_CLUSTER_FREE_MODE_ENABLE);
			break;

		case T3_BLOCK_SEND_BD_INITIATOR:
			data = REG_RD (pDevice, SndBdIn.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~SND_BD_IN_MODE_ENABLE;
				REG_WR (pDevice, SndBdIn.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, SndBdIn.Mode) &
					     SND_BD_IN_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, SndBdIn.Mode,
					data | SND_BD_IN_MODE_ENABLE);
			break;

		case T3_BLOCK_SEND_BD_COMP:
			data = REG_RD (pDevice, SndBdComp.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~SND_BD_COMP_MODE_ENABLE;
				REG_WR (pDevice, SndBdComp.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, SndBdComp.Mode) &
					     SND_BD_COMP_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, SndBdComp.Mode,
					data | SND_BD_COMP_MODE_ENABLE);
			break;

		case T3_BLOCK_SEND_BD_SELECTOR:
			data = REG_RD (pDevice, SndBdSel.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~SND_BD_SEL_MODE_ENABLE;
				REG_WR (pDevice, SndBdSel.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, SndBdSel.Mode) &
					     SND_BD_SEL_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, SndBdSel.Mode,
					data | SND_BD_SEL_MODE_ENABLE);
			break;

		case T3_BLOCK_SEND_DATA_INITIATOR:
			data = REG_RD (pDevice, SndDataIn.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~T3_SND_DATA_IN_MODE_ENABLE;
				REG_WR (pDevice, SndDataIn.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, SndDataIn.Mode) &
					     T3_SND_DATA_IN_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, SndDataIn.Mode,
					data | T3_SND_DATA_IN_MODE_ENABLE);
			break;

		case T3_BLOCK_SEND_DATA_COMP:
			data = REG_RD (pDevice, SndDataComp.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~SND_DATA_COMP_MODE_ENABLE;
				REG_WR (pDevice, SndDataComp.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, SndDataComp.Mode)
					     & SND_DATA_COMP_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, SndDataComp.Mode,
					data | SND_DATA_COMP_MODE_ENABLE);
			break;

		case T3_BLOCK_MAC_TX_ENGINE:
			if (cntrl == LM_DISABLE) {
				pDevice->TxMode &= ~TX_MODE_ENABLE;
				REG_WR (pDevice, MacCtrl.TxMode,
					pDevice->TxMode);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, MacCtrl.TxMode) &
					     TX_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else {
				pDevice->TxMode |= TX_MODE_ENABLE;
				REG_WR (pDevice, MacCtrl.TxMode,
					pDevice->TxMode);
			}
			break;

		case T3_BLOCK_MEM_ARBITOR:
			data = REG_RD (pDevice, MemArbiter.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~T3_MEM_ARBITER_MODE_ENABLE;
				REG_WR (pDevice, MemArbiter.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, MemArbiter.Mode) &
					     T3_MEM_ARBITER_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, MemArbiter.Mode,
					data | T3_MEM_ARBITER_MODE_ENABLE);
			break;

		case T3_BLOCK_MBUF_MANAGER:
			data = REG_RD (pDevice, BufMgr.Mode);
			if (cntrl == LM_DISABLE) {
				data &= ~BUFMGR_MODE_ENABLE;
				REG_WR (pDevice, BufMgr.Mode, data);
				for (j = 0; j < MaxWaitCnt; j++) {
					if (!
					    (REG_RD (pDevice, BufMgr.Mode) &
					     BUFMGR_MODE_ENABLE))
						break;
					MM_Wait (10);
				}
			} else
				REG_WR (pDevice, BufMgr.Mode,
					data | BUFMGR_MODE_ENABLE);
			break;

		case T3_BLOCK_MAC_GLOBAL:
			if (cntrl == LM_DISABLE) {
				pDevice->MacMode &= ~(MAC_MODE_ENABLE_TDE |
						      MAC_MODE_ENABLE_RDE |
						      MAC_MODE_ENABLE_FHDE);
			} else {
				pDevice->MacMode |= (MAC_MODE_ENABLE_TDE |
						     MAC_MODE_ENABLE_RDE |
						     MAC_MODE_ENABLE_FHDE);
			}
			REG_WR (pDevice, MacCtrl.Mode, pDevice->MacMode);
			break;

		default:
			return LM_STATUS_FAILURE;
		}		/* switch */

		if (j >= MaxWaitCnt) {
			return LM_STATUS_FAILURE;
		}
	}

	return LM_STATUS_SUCCESS;
}

/******************************************************************************/
/* Description:                                                               */
/*    This function reinitializes the adapter.                                */
/*                                                                            */
/* Return:                                                                    */
/*    LM_STATUS_SUCCESS                                                       */
/******************************************************************************/
LM_STATUS LM_ResetAdapter (PLM_DEVICE_BLOCK pDevice)
{
	LM_UINT32 Value32;
	LM_UINT16 Value16;
	LM_UINT32 j, k;

	/* Disable interrupt. */
	LM_DisableInterrupt (pDevice);

	/* May get a spurious interrupt */
	pDevice->pStatusBlkVirt->Status = STATUS_BLOCK_UPDATED;

	/* Disable transmit and receive DMA engines.  Abort all pending requests. */
	if (pDevice->InitDone) {
		LM_Abort (pDevice);
	}

	pDevice->ShuttingDown = FALSE;

	LM_ResetChip (pDevice);

	/* Bug: Athlon fix for B3 silicon only.  This bit does not do anything */
	/* in other chip revisions. */
	if (pDevice->DelayPciGrant) {
		Value32 = REG_RD (pDevice, PciCfg.ClockCtrl);
		REG_WR (pDevice, PciCfg.ClockCtrl, Value32 | BIT_31);
	}

	if (pDevice->ChipRevId == T3_CHIP_ID_5704_A0) {
		if (!(pDevice->PciState & T3_PCI_STATE_CONVENTIONAL_PCI_MODE)) {
			Value32 = REG_RD (pDevice, PciCfg.PciState);
			Value32 |= T3_PCI_STATE_RETRY_SAME_DMA;
			REG_WR (pDevice, PciCfg.PciState, Value32);
		}
	}

	/* Enable TaggedStatus mode. */
	if (pDevice->UseTaggedStatus) {
		pDevice->MiscHostCtrl |=
		    MISC_HOST_CTRL_ENABLE_TAGGED_STATUS_MODE;
	}

	/* Restore PCI configuration registers. */
	MM_WriteConfig32 (pDevice, PCI_CACHE_LINE_SIZE_REG,
			  pDevice->SavedCacheLineReg);
	MM_WriteConfig32 (pDevice, PCI_SUBSYSTEM_VENDOR_ID_REG,
			  (pDevice->SubsystemId << 16) | pDevice->
			  SubsystemVendorId);

	/* Clear the statistics block. */
	for (j = 0x0300; j < 0x0b00; j++) {
		MEM_WR_OFFSET (pDevice, j, 0);
	}

	/* Initialize the statistis Block */
	pDevice->pStatusBlkVirt->Status = 0;
	pDevice->pStatusBlkVirt->RcvStdConIdx = 0;
	pDevice->pStatusBlkVirt->RcvJumboConIdx = 0;
	pDevice->pStatusBlkVirt->RcvMiniConIdx = 0;

	for (j = 0; j < 16; j++) {
		pDevice->pStatusBlkVirt->Idx[j].RcvProdIdx = 0;
		pDevice->pStatusBlkVirt->Idx[j].SendConIdx = 0;
	}

	for (k = 0; k < T3_STD_RCV_RCB_ENTRY_COUNT; k++) {
		pDevice->pRxStdBdVirt[k].HostAddr.High = 0;
		pDevice->pRxStdBdVirt[k].HostAddr.Low = 0;
	}

#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
	/* Receive jumbo BD buffer. */
	for (k = 0; k < T3_JUMBO_RCV_RCB_ENTRY_COUNT; k++) {
		pDevice->pRxJumboBdVirt[k].HostAddr.High = 0;
		pDevice->pRxJumboBdVirt[k].HostAddr.Low = 0;
	}
#endif

	REG_WR (pDevice, PciCfg.DmaReadWriteCtrl, pDevice->DmaReadWriteCtrl);

	/* GRC mode control register. */
#ifdef BIG_ENDIAN_PCI		/* Jimmy, this ifdef block deleted in new code! */
	Value32 =
	    GRC_MODE_WORD_SWAP_DATA |
	    GRC_MODE_WORD_SWAP_NON_FRAME_DATA |
	    GRC_MODE_INT_ON_MAC_ATTN | GRC_MODE_HOST_STACK_UP;
#else
	/* No CPU Swap modes for PCI IO */
	Value32 =
#ifdef BIG_ENDIAN_HOST
	    GRC_MODE_BYTE_SWAP_NON_FRAME_DATA |
	    GRC_MODE_WORD_SWAP_NON_FRAME_DATA |
	    GRC_MODE_BYTE_SWAP_DATA | GRC_MODE_WORD_SWAP_DATA |
#else
	    GRC_MODE_WORD_SWAP_NON_FRAME_DATA |
	    GRC_MODE_BYTE_SWAP_DATA | GRC_MODE_WORD_SWAP_DATA |
#endif
	    GRC_MODE_INT_ON_MAC_ATTN | GRC_MODE_HOST_STACK_UP;
#endif				/* !BIG_ENDIAN_PCI */

	/* Configure send BD mode. */
	if (pDevice->NicSendBd == FALSE) {
		Value32 |= GRC_MODE_HOST_SEND_BDS;
	} else {
		Value32 |= GRC_MODE_4X_NIC_BASED_SEND_RINGS;
	}

	/* Configure pseudo checksum mode. */
	if (pDevice->NoTxPseudoHdrChksum) {
		Value32 |= GRC_MODE_TX_NO_PSEUDO_HEADER_CHKSUM;
	}

	if (pDevice->NoRxPseudoHdrChksum) {
		Value32 |= GRC_MODE_RX_NO_PSEUDO_HEADER_CHKSUM;
	}

	REG_WR (pDevice, Grc.Mode, Value32);

	/* Setup the timer prescalar register. */
	REG_WR (pDevice, Grc.MiscCfg, 65 << 1);	/* Clock is alwasy 66MHz. */

	/* Set up the MBUF pool base address and size. */
	REG_WR (pDevice, BufMgr.MbufPoolAddr, pDevice->MbufBase);
	REG_WR (pDevice, BufMgr.MbufPoolSize, pDevice->MbufSize);

	/* Set up the DMA descriptor pool base address and size. */
	REG_WR (pDevice, BufMgr.DmaDescPoolAddr, T3_NIC_DMA_DESC_POOL_ADDR);
	REG_WR (pDevice, BufMgr.DmaDescPoolSize, T3_NIC_DMA_DESC_POOL_SIZE);

	/* Configure MBUF and Threshold watermarks */
	/* Configure the DMA read MBUF low water mark. */
	if (pDevice->DmaMbufLowMark) {
		REG_WR (pDevice, BufMgr.MbufReadDmaLowWaterMark,
			pDevice->DmaMbufLowMark);
	} else {
		if (pDevice->TxMtu < MAX_ETHERNET_PACKET_BUFFER_SIZE) {
			REG_WR (pDevice, BufMgr.MbufReadDmaLowWaterMark,
				T3_DEF_DMA_MBUF_LOW_WMARK);
		} else {
			REG_WR (pDevice, BufMgr.MbufReadDmaLowWaterMark,
				T3_DEF_DMA_MBUF_LOW_WMARK_JUMBO);
		}
	}

	/* Configure the MAC Rx MBUF low water mark. */
	if (pDevice->RxMacMbufLowMark) {
		REG_WR (pDevice, BufMgr.MbufMacRxLowWaterMark,
			pDevice->RxMacMbufLowMark);
	} else {
		if (pDevice->TxMtu < MAX_ETHERNET_PACKET_BUFFER_SIZE) {
			REG_WR (pDevice, BufMgr.MbufMacRxLowWaterMark,
				T3_DEF_RX_MAC_MBUF_LOW_WMARK);
		} else {
			REG_WR (pDevice, BufMgr.MbufMacRxLowWaterMark,
				T3_DEF_RX_MAC_MBUF_LOW_WMARK_JUMBO);
		}
	}

	/* Configure the MBUF high water mark. */
	if (pDevice->MbufHighMark) {
		REG_WR (pDevice, BufMgr.MbufHighWaterMark,
			pDevice->MbufHighMark);
	} else {
		if (pDevice->TxMtu < MAX_ETHERNET_PACKET_BUFFER_SIZE) {
			REG_WR (pDevice, BufMgr.MbufHighWaterMark,
				T3_DEF_MBUF_HIGH_WMARK);
		} else {
			REG_WR (pDevice, BufMgr.MbufHighWaterMark,
				T3_DEF_MBUF_HIGH_WMARK_JUMBO);
		}
	}

	REG_WR (pDevice, BufMgr.DmaLowWaterMark, T3_DEF_DMA_DESC_LOW_WMARK);
	REG_WR (pDevice, BufMgr.DmaHighWaterMark, T3_DEF_DMA_DESC_HIGH_WMARK);

	/* Enable buffer manager. */
	REG_WR (pDevice, BufMgr.Mode,
		BUFMGR_MODE_ENABLE | BUFMGR_MODE_ATTN_ENABLE);

	for (j = 0; j < 2000; j++) {
		if (REG_RD (pDevice, BufMgr.Mode) & BUFMGR_MODE_ENABLE)
			break;
		MM_Wait (10);
	}

	if (j >= 2000) {
		return LM_STATUS_FAILURE;
	}

	/* Enable the FTQs. */
	REG_WR (pDevice, Ftq.Reset, 0xffffffff);
	REG_WR (pDevice, Ftq.Reset, 0);

	/* Wait until FTQ is ready */
	for (j = 0; j < 2000; j++) {
		if (REG_RD (pDevice, Ftq.Reset) == 0)
			break;
		MM_Wait (10);
	}

	if (j >= 2000) {
		return LM_STATUS_FAILURE;
	}

	/* Initialize the Standard Receive RCB. */
	REG_WR (pDevice, RcvDataBdIn.StdRcvRcb.HostRingAddr.High,
		pDevice->RxStdBdPhy.High);
	REG_WR (pDevice, RcvDataBdIn.StdRcvRcb.HostRingAddr.Low,
		pDevice->RxStdBdPhy.Low);
	REG_WR (pDevice, RcvDataBdIn.StdRcvRcb.u.MaxLen_Flags,
		MAX_STD_RCV_BUFFER_SIZE << 16);

	/* Initialize the Jumbo Receive RCB. */
	REG_WR (pDevice, RcvDataBdIn.JumboRcvRcb.u.MaxLen_Flags,
		T3_RCB_FLAG_RING_DISABLED);
#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
	REG_WR (pDevice, RcvDataBdIn.JumboRcvRcb.HostRingAddr.High,
		pDevice->RxJumboBdPhy.High);
	REG_WR (pDevice, RcvDataBdIn.JumboRcvRcb.HostRingAddr.Low,
		pDevice->RxJumboBdPhy.Low);

	REG_WR (pDevice, RcvDataBdIn.JumboRcvRcb.u.MaxLen_Flags, 0);

#endif				/* T3_JUMBO_RCV_RCB_ENTRY_COUNT */

	/* Initialize the Mini Receive RCB. */
	REG_WR (pDevice, RcvDataBdIn.MiniRcvRcb.u.MaxLen_Flags,
		T3_RCB_FLAG_RING_DISABLED);

	{
		REG_WR (pDevice, RcvDataBdIn.StdRcvRcb.NicRingAddr,
			(LM_UINT32) T3_NIC_STD_RCV_BUFFER_DESC_ADDR);
		REG_WR (pDevice, RcvDataBdIn.JumboRcvRcb.NicRingAddr,
			(LM_UINT32) T3_NIC_JUMBO_RCV_BUFFER_DESC_ADDR);
	}

	/* Receive BD Ring replenish threshold. */
	REG_WR (pDevice, RcvBdIn.StdRcvThreshold, pDevice->RxStdDescCnt / 8);
#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
	REG_WR (pDevice, RcvBdIn.JumboRcvThreshold,
		pDevice->RxJumboDescCnt / 8);
#endif				/* T3_JUMBO_RCV_RCB_ENTRY_COUNT */

	/* Disable all the unused rings. */
	for (j = 0; j < T3_MAX_SEND_RCB_COUNT; j++) {
		MEM_WR (pDevice, SendRcb[j].u.MaxLen_Flags,
			T3_RCB_FLAG_RING_DISABLED);
	}			/* for */

	/* Initialize the indices. */
	pDevice->SendProdIdx = 0;
	pDevice->SendConIdx = 0;

	MB_REG_WR (pDevice, Mailbox.SendHostProdIdx[0].Low, 0);
	MB_REG_WR (pDevice, Mailbox.SendNicProdIdx[0].Low, 0);

	/* Set up host or NIC based send RCB. */
	if (pDevice->NicSendBd == FALSE) {
		MEM_WR (pDevice, SendRcb[0].HostRingAddr.High,
			pDevice->SendBdPhy.High);
		MEM_WR (pDevice, SendRcb[0].HostRingAddr.Low,
			pDevice->SendBdPhy.Low);

		/* Set up the NIC ring address in the RCB. */
		MEM_WR (pDevice, SendRcb[0].NicRingAddr,
			T3_NIC_SND_BUFFER_DESC_ADDR);

		/* Setup the RCB. */
		MEM_WR (pDevice, SendRcb[0].u.MaxLen_Flags,
			T3_SEND_RCB_ENTRY_COUNT << 16);

		for (k = 0; k < T3_SEND_RCB_ENTRY_COUNT; k++) {
			pDevice->pSendBdVirt[k].HostAddr.High = 0;
			pDevice->pSendBdVirt[k].HostAddr.Low = 0;
		}
	} else {
		MEM_WR (pDevice, SendRcb[0].HostRingAddr.High, 0);
		MEM_WR (pDevice, SendRcb[0].HostRingAddr.Low, 0);
		MEM_WR (pDevice, SendRcb[0].NicRingAddr,
			pDevice->SendBdPhy.Low);

		for (k = 0; k < T3_SEND_RCB_ENTRY_COUNT; k++) {
			__raw_writel (0,
				      &(pDevice->pSendBdVirt[k].HostAddr.High));
			__raw_writel (0,
				      &(pDevice->pSendBdVirt[k].HostAddr.Low));
			__raw_writel (0,
				      &(pDevice->pSendBdVirt[k].u1.Len_Flags));
			pDevice->ShadowSendBd[k].HostAddr.High = 0;
			pDevice->ShadowSendBd[k].u1.Len_Flags = 0;
		}
	}
	atomic_set (&pDevice->SendBdLeft, T3_SEND_RCB_ENTRY_COUNT - 1);

	/* Configure the receive return rings. */
	for (j = 0; j < T3_MAX_RCV_RETURN_RCB_COUNT; j++) {
		MEM_WR (pDevice, RcvRetRcb[j].u.MaxLen_Flags,
			T3_RCB_FLAG_RING_DISABLED);
	}

	pDevice->RcvRetConIdx = 0;

	MEM_WR (pDevice, RcvRetRcb[0].HostRingAddr.High,
		pDevice->RcvRetBdPhy.High);
	MEM_WR (pDevice, RcvRetRcb[0].HostRingAddr.Low,
		pDevice->RcvRetBdPhy.Low);

	/* Set up the NIC ring address in the RCB. */
	/* Not very clear from the spec.  I am guessing that for Receive */
	/* Return Ring, NicRingAddr is not used. */
	MEM_WR (pDevice, RcvRetRcb[0].NicRingAddr, 0);

	/* Setup the RCB. */
	MEM_WR (pDevice, RcvRetRcb[0].u.MaxLen_Flags,
		T3_RCV_RETURN_RCB_ENTRY_COUNT << 16);

	/* Reinitialize RX ring producer index */
	MB_REG_WR (pDevice, Mailbox.RcvStdProdIdx.Low, 0);
	MB_REG_WR (pDevice, Mailbox.RcvJumboProdIdx.Low, 0);
	MB_REG_WR (pDevice, Mailbox.RcvMiniProdIdx.Low, 0);

#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
	pDevice->RxJumboProdIdx = 0;
	pDevice->RxJumboQueuedCnt = 0;
#endif

	/* Reinitialize our copy of the indices. */
	pDevice->RxStdProdIdx = 0;
	pDevice->RxStdQueuedCnt = 0;

#if T3_JUMBO_RCV_ENTRY_COUNT
	pDevice->RxJumboProdIdx = 0;
#endif				/* T3_JUMBO_RCV_ENTRY_COUNT */

	/* Configure the MAC address. */
	LM_SetMacAddress (pDevice);

	/* Initialize the transmit random backoff seed. */
	Value32 = (pDevice->NodeAddress[0] + pDevice->NodeAddress[1] +
		   pDevice->NodeAddress[2] + pDevice->NodeAddress[3] +
		   pDevice->NodeAddress[4] + pDevice->NodeAddress[5]) &
	    MAC_TX_BACKOFF_SEED_MASK;
	REG_WR (pDevice, MacCtrl.TxBackoffSeed, Value32);

	/* Receive MTU.  Frames larger than the MTU is marked as oversized. */
	REG_WR (pDevice, MacCtrl.MtuSize, pDevice->RxMtu + 8);	/* CRC + VLAN. */

	/* Configure Time slot/IPG per 802.3 */
	REG_WR (pDevice, MacCtrl.TxLengths, 0x2620);

	/*
	 * Configure Receive Rules so that packets don't match
	 * Programmble rule will be queued to Return Ring 1
	 */
	REG_WR (pDevice, MacCtrl.RcvRuleCfg, RX_RULE_DEFAULT_CLASS);

	/*
	 * Configure to have 16 Classes of Services (COS) and one
	 * queue per class.  Bad frames are queued to RRR#1.
	 * And frames don't match rules are also queued to COS#1.
	 */
	REG_WR (pDevice, RcvListPlmt.Config, 0x181);

	/* Enable Receive Placement Statistics */
	REG_WR (pDevice, RcvListPlmt.StatsEnableMask, 0xffffff);
	REG_WR (pDevice, RcvListPlmt.StatsCtrl, RCV_LIST_STATS_ENABLE);

	/* Enable Send Data Initator Statistics */
	REG_WR (pDevice, SndDataIn.StatsEnableMask, 0xffffff);
	REG_WR (pDevice, SndDataIn.StatsCtrl,
		T3_SND_DATA_IN_STATS_CTRL_ENABLE |
		T3_SND_DATA_IN_STATS_CTRL_FASTER_UPDATE);

	/* Disable the host coalescing state machine before configuring it's */
	/* parameters. */
	REG_WR (pDevice, HostCoalesce.Mode, 0);
	for (j = 0; j < 2000; j++) {
		Value32 = REG_RD (pDevice, HostCoalesce.Mode);
		if (!(Value32 & HOST_COALESCE_ENABLE)) {
			break;
		}
		MM_Wait (10);
	}

	/* Host coalescing configurations. */
	REG_WR (pDevice, HostCoalesce.RxCoalescingTicks,
		pDevice->RxCoalescingTicks);
	REG_WR (pDevice, HostCoalesce.TxCoalescingTicks,
		pDevice->TxCoalescingTicks);
	REG_WR (pDevice, HostCoalesce.RxMaxCoalescedFrames,
		pDevice->RxMaxCoalescedFrames);
	REG_WR (pDevice, HostCoalesce.TxMaxCoalescedFrames,
		pDevice->TxMaxCoalescedFrames);
	REG_WR (pDevice, HostCoalesce.RxCoalescedTickDuringInt,
		pDevice->RxCoalescingTicksDuringInt);
	REG_WR (pDevice, HostCoalesce.TxCoalescedTickDuringInt,
		pDevice->TxCoalescingTicksDuringInt);
	REG_WR (pDevice, HostCoalesce.RxMaxCoalescedFramesDuringInt,
		pDevice->RxMaxCoalescedFramesDuringInt);
	REG_WR (pDevice, HostCoalesce.TxMaxCoalescedFramesDuringInt,
		pDevice->TxMaxCoalescedFramesDuringInt);

	/* Initialize the address of the status block.  The NIC will DMA */
	/* the status block to this memory which resides on the host. */
	REG_WR (pDevice, HostCoalesce.StatusBlkHostAddr.High,
		pDevice->StatusBlkPhy.High);
	REG_WR (pDevice, HostCoalesce.StatusBlkHostAddr.Low,
		pDevice->StatusBlkPhy.Low);

	/* Initialize the address of the statistics block.  The NIC will DMA */
	/* the statistics to this block of memory. */
	REG_WR (pDevice, HostCoalesce.StatsBlkHostAddr.High,
		pDevice->StatsBlkPhy.High);
	REG_WR (pDevice, HostCoalesce.StatsBlkHostAddr.Low,
		pDevice->StatsBlkPhy.Low);

	REG_WR (pDevice, HostCoalesce.StatsCoalescingTicks,
		pDevice->StatsCoalescingTicks);

	REG_WR (pDevice, HostCoalesce.StatsBlkNicAddr, 0x300);
	REG_WR (pDevice, HostCoalesce.StatusBlkNicAddr, 0xb00);

	/* Enable Host Coalesing state machine */
	REG_WR (pDevice, HostCoalesce.Mode, HOST_COALESCE_ENABLE |
		pDevice->CoalesceMode);

	/* Enable the Receive BD Completion state machine. */
	REG_WR (pDevice, RcvBdComp.Mode, RCV_BD_COMP_MODE_ENABLE |
		RCV_BD_COMP_MODE_ATTN_ENABLE);

	/* Enable the Receive List Placement state machine. */
	REG_WR (pDevice, RcvListPlmt.Mode, RCV_LIST_PLMT_MODE_ENABLE);

	/* Enable the Receive List Selector state machine. */
	REG_WR (pDevice, RcvListSel.Mode, RCV_LIST_SEL_MODE_ENABLE |
		RCV_LIST_SEL_MODE_ATTN_ENABLE);

	/* Enable transmit DMA, clear statistics. */
	pDevice->MacMode = MAC_MODE_ENABLE_TX_STATISTICS |
	    MAC_MODE_ENABLE_RX_STATISTICS | MAC_MODE_ENABLE_TDE |
	    MAC_MODE_ENABLE_RDE | MAC_MODE_ENABLE_FHDE;
	REG_WR (pDevice, MacCtrl.Mode, pDevice->MacMode |
		MAC_MODE_CLEAR_RX_STATISTICS | MAC_MODE_CLEAR_TX_STATISTICS);

	/* GRC miscellaneous local control register. */
	pDevice->GrcLocalCtrl = GRC_MISC_LOCAL_CTRL_INT_ON_ATTN |
	    GRC_MISC_LOCAL_CTRL_AUTO_SEEPROM;

	if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700) {
		pDevice->GrcLocalCtrl |= GRC_MISC_LOCAL_CTRL_GPIO_OE1 |
		    GRC_MISC_LOCAL_CTRL_GPIO_OUTPUT1;
	}

	REG_WR (pDevice, Grc.LocalCtrl, pDevice->GrcLocalCtrl);
	MM_Wait (40);

	/* Reset RX counters. */
	for (j = 0; j < sizeof (LM_RX_COUNTERS); j++) {
		((PLM_UINT8) & pDevice->RxCounters)[j] = 0;
	}

	/* Reset TX counters. */
	for (j = 0; j < sizeof (LM_TX_COUNTERS); j++) {
		((PLM_UINT8) & pDevice->TxCounters)[j] = 0;
	}

	MB_REG_WR (pDevice, Mailbox.Interrupt[0].Low, 0);

	/* Enable the DMA Completion state machine. */
	REG_WR (pDevice, DmaComp.Mode, DMA_COMP_MODE_ENABLE);

	/* Enable the DMA Write state machine. */
	Value32 = DMA_WRITE_MODE_ENABLE |
	    DMA_WRITE_MODE_TARGET_ABORT_ATTN_ENABLE |
	    DMA_WRITE_MODE_MASTER_ABORT_ATTN_ENABLE |
	    DMA_WRITE_MODE_PARITY_ERROR_ATTN_ENABLE |
	    DMA_WRITE_MODE_ADDR_OVERFLOW_ATTN_ENABLE |
	    DMA_WRITE_MODE_FIFO_OVERRUN_ATTN_ENABLE |
	    DMA_WRITE_MODE_FIFO_UNDERRUN_ATTN_ENABLE |
	    DMA_WRITE_MODE_FIFO_OVERREAD_ATTN_ENABLE |
	    DMA_WRITE_MODE_LONG_READ_ATTN_ENABLE;
	REG_WR (pDevice, DmaWrite.Mode, Value32);

	if (!(pDevice->PciState & T3_PCI_STATE_CONVENTIONAL_PCI_MODE)) {
		if (pDevice->ChipRevId == T3_CHIP_ID_5704_A0) {
			Value16 = REG_RD (pDevice, PciCfg.PciXCommand);
			Value16 &=
			    ~(PCIX_CMD_MAX_SPLIT_MASK |
			      PCIX_CMD_MAX_BURST_MASK);
			Value16 |=
			    ((PCIX_CMD_MAX_BURST_CPIOB <<
			      PCIX_CMD_MAX_BURST_SHL) &
			     PCIX_CMD_MAX_BURST_MASK);
			if (pDevice->SplitModeEnable == SPLIT_MODE_ENABLE) {
				Value16 |=
				    (pDevice->
				     SplitModeMaxReq << PCIX_CMD_MAX_SPLIT_SHL)
				    & PCIX_CMD_MAX_SPLIT_MASK;
			}
			REG_WR (pDevice, PciCfg.PciXCommand, Value16);
		}
	}

	/* Enable the Read DMA state machine. */
	Value32 = DMA_READ_MODE_ENABLE |
	    DMA_READ_MODE_TARGET_ABORT_ATTN_ENABLE |
	    DMA_READ_MODE_MASTER_ABORT_ATTN_ENABLE |
	    DMA_READ_MODE_PARITY_ERROR_ATTN_ENABLE |
	    DMA_READ_MODE_ADDR_OVERFLOW_ATTN_ENABLE |
	    DMA_READ_MODE_FIFO_OVERRUN_ATTN_ENABLE |
	    DMA_READ_MODE_FIFO_UNDERRUN_ATTN_ENABLE |
	    DMA_READ_MODE_FIFO_OVERREAD_ATTN_ENABLE |
	    DMA_READ_MODE_LONG_READ_ATTN_ENABLE;

	if (pDevice->SplitModeEnable == SPLIT_MODE_ENABLE) {
		Value32 |= DMA_READ_MODE_SPLIT_ENABLE;
	}
	REG_WR (pDevice, DmaRead.Mode, Value32);

	/* Enable the Receive Data Completion state machine. */
	REG_WR (pDevice, RcvDataComp.Mode, RCV_DATA_COMP_MODE_ENABLE |
		RCV_DATA_COMP_MODE_ATTN_ENABLE);

	/* Enable the Mbuf Cluster Free state machine. */
	REG_WR (pDevice, MbufClusterFree.Mode, MBUF_CLUSTER_FREE_MODE_ENABLE);

	/* Enable the Send Data Completion state machine. */
	REG_WR (pDevice, SndDataComp.Mode, SND_DATA_COMP_MODE_ENABLE);

	/* Enable the Send BD Completion state machine. */
	REG_WR (pDevice, SndBdComp.Mode, SND_BD_COMP_MODE_ENABLE |
		SND_BD_COMP_MODE_ATTN_ENABLE);

	/* Enable the Receive BD Initiator state machine. */
	REG_WR (pDevice, RcvBdIn.Mode, RCV_BD_IN_MODE_ENABLE |
		RCV_BD_IN_MODE_BD_IN_DIABLED_RCB_ATTN_ENABLE);

	/* Enable the Receive Data and Receive BD Initiator state machine. */
	REG_WR (pDevice, RcvDataBdIn.Mode, RCV_DATA_BD_IN_MODE_ENABLE |
		RCV_DATA_BD_IN_MODE_INVALID_RING_SIZE);

	/* Enable the Send Data Initiator state machine. */
	REG_WR (pDevice, SndDataIn.Mode, T3_SND_DATA_IN_MODE_ENABLE);

	/* Enable the Send BD Initiator state machine. */
	REG_WR (pDevice, SndBdIn.Mode, SND_BD_IN_MODE_ENABLE |
		SND_BD_IN_MODE_ATTN_ENABLE);

	/* Enable the Send BD Selector state machine. */
	REG_WR (pDevice, SndBdSel.Mode, SND_BD_SEL_MODE_ENABLE |
		SND_BD_SEL_MODE_ATTN_ENABLE);

#if INCLUDE_5701_AX_FIX
	/* Load the firmware for the 5701_A0 workaround. */
	if (pDevice->ChipRevId == T3_CHIP_ID_5701_A0) {
		LM_LoadRlsFirmware (pDevice);
	}
#endif

	/* Enable the transmitter. */
	pDevice->TxMode = TX_MODE_ENABLE;
	REG_WR (pDevice, MacCtrl.TxMode, pDevice->TxMode);

	/* Enable the receiver. */
	pDevice->RxMode = RX_MODE_ENABLE;
	REG_WR (pDevice, MacCtrl.RxMode, pDevice->RxMode);

	if (pDevice->RestoreOnWakeUp) {
		pDevice->RestoreOnWakeUp = FALSE;
		pDevice->DisableAutoNeg = pDevice->WakeUpDisableAutoNeg;
		pDevice->RequestedMediaType = pDevice->WakeUpRequestedMediaType;
	}

	/* Disable auto polling. */
	pDevice->MiMode = 0xc0000;
	REG_WR (pDevice, MacCtrl.MiMode, pDevice->MiMode);

	if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700 ||
	    T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5701) {
		Value32 = LED_CTRL_PHY_MODE_1;
	} else {
		if (pDevice->LedMode == LED_MODE_OUTPUT) {
			Value32 = LED_CTRL_PHY_MODE_2;
		} else {
			Value32 = LED_CTRL_PHY_MODE_1;
		}
	}
	REG_WR (pDevice, MacCtrl.LedCtrl, Value32);

	/* Activate Link to enable MAC state machine */
	REG_WR (pDevice, MacCtrl.MiStatus, MI_STATUS_ENABLE_LINK_STATUS_ATTN);

	if (pDevice->EnableTbi) {
		REG_WR (pDevice, MacCtrl.RxMode, RX_MODE_RESET);
		MM_Wait (10);
		REG_WR (pDevice, MacCtrl.RxMode, pDevice->RxMode);
		if (pDevice->ChipRevId == T3_CHIP_ID_5703_A1) {
			REG_WR (pDevice, MacCtrl.SerdesCfg, 0x616000);
		}
	}
	/* Setup the phy chip. */
	LM_SetupPhy (pDevice);

	if (!pDevice->EnableTbi) {
		/* Clear CRC stats */
		LM_ReadPhy (pDevice, 0x1e, &Value32);
		LM_WritePhy (pDevice, 0x1e, Value32 | 0x8000);
		LM_ReadPhy (pDevice, 0x14, &Value32);
	}

	/* Set up the receive mask. */
	LM_SetReceiveMask (pDevice, pDevice->ReceiveMask);

	/* Queue Rx packet buffers. */
	if (pDevice->QueueRxPackets) {
		LM_QueueRxPackets (pDevice);
	}

	/* Enable interrupt to the host. */
	if (pDevice->InitDone) {
		LM_EnableInterrupt (pDevice);
	}

	return LM_STATUS_SUCCESS;
}				/* LM_ResetAdapter */

/******************************************************************************/
/* Description:                                                               */
/*    This routine disables the adapter from generating interrupts.           */
/*                                                                            */
/* Return:                                                                    */
/*    LM_STATUS_SUCCESS                                                       */
/******************************************************************************/
LM_STATUS LM_DisableInterrupt (PLM_DEVICE_BLOCK pDevice)
{
	REG_WR (pDevice, PciCfg.MiscHostCtrl, pDevice->MiscHostCtrl |
		MISC_HOST_CTRL_MASK_PCI_INT);
	MB_REG_WR (pDevice, Mailbox.Interrupt[0].Low, 1);

	return LM_STATUS_SUCCESS;
}

/******************************************************************************/
/* Description:                                                               */
/*    This routine enables the adapter to generate interrupts.                */
/*                                                                            */
/* Return:                                                                    */
/*    LM_STATUS_SUCCESS                                                       */
/******************************************************************************/
LM_STATUS LM_EnableInterrupt (PLM_DEVICE_BLOCK pDevice)
{
	REG_WR (pDevice, PciCfg.MiscHostCtrl, pDevice->MiscHostCtrl &
		~MISC_HOST_CTRL_MASK_PCI_INT);
	MB_REG_WR (pDevice, Mailbox.Interrupt[0].Low, 0);

	if (pDevice->pStatusBlkVirt->Status & STATUS_BLOCK_UPDATED) {
		REG_WR (pDevice, Grc.LocalCtrl, pDevice->GrcLocalCtrl |
			GRC_MISC_LOCAL_CTRL_SET_INT);
	}

	return LM_STATUS_SUCCESS;
}

/******************************************************************************/
/* Description:                                                               */
/*    This routine puts a packet on the wire if there is a transmit DMA       */
/*    descriptor available; otherwise the packet is queued for later          */
/*    transmission.  If the second argue is NULL, this routine will put       */
/*    the queued packet on the wire if possible.                              */
/*                                                                            */
/* Return:                                                                    */
/*    LM_STATUS_SUCCESS                                                       */
/******************************************************************************/
#if 0
LM_STATUS LM_SendPacket (PLM_DEVICE_BLOCK pDevice, PLM_PACKET pPacket)
{
	LM_UINT32 FragCount;
	PT3_SND_BD pSendBd;
	PT3_SND_BD pShadowSendBd;
	LM_UINT32 Value32, Len;
	LM_UINT32 Idx;

	if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700) {
		return LM_5700SendPacket (pDevice, pPacket);
	}

	/* Update the SendBdLeft count. */
	atomic_sub (pPacket->u.Tx.FragCount, &pDevice->SendBdLeft);

	/* Initalize the send buffer descriptors. */
	Idx = pDevice->SendProdIdx;

	pSendBd = &pDevice->pSendBdVirt[Idx];

	/* Next producer index. */
	if (pDevice->NicSendBd == TRUE) {
		T3_64BIT_HOST_ADDR paddr;

		pShadowSendBd = &pDevice->ShadowSendBd[Idx];
		for (FragCount = 0;;) {
			MM_MapTxDma (pDevice, pPacket, &paddr, &Len, FragCount);
			/* Initialize the pointer to the send buffer fragment. */
			if (paddr.High != pShadowSendBd->HostAddr.High) {
				__raw_writel (paddr.High,
					      &(pSendBd->HostAddr.High));
				pShadowSendBd->HostAddr.High = paddr.High;
			}
			__raw_writel (paddr.Low, &(pSendBd->HostAddr.Low));

			/* Setup the control flags and send buffer size. */
			Value32 = (Len << 16) | pPacket->Flags;

			Idx = (Idx + 1) & T3_SEND_RCB_ENTRY_COUNT_MASK;

			FragCount++;
			if (FragCount >= pPacket->u.Tx.FragCount) {
				Value32 |= SND_BD_FLAG_END;
				if (Value32 != pShadowSendBd->u1.Len_Flags) {
					__raw_writel (Value32,
						      &(pSendBd->u1.Len_Flags));
					pShadowSendBd->u1.Len_Flags = Value32;
				}
				if (pPacket->Flags & SND_BD_FLAG_VLAN_TAG) {
					__raw_writel (pPacket->VlanTag,
						      &(pSendBd->u2.VlanTag));
				}
				break;
			} else {
				if (Value32 != pShadowSendBd->u1.Len_Flags) {
					__raw_writel (Value32,
						      &(pSendBd->u1.Len_Flags));
					pShadowSendBd->u1.Len_Flags = Value32;
				}
				if (pPacket->Flags & SND_BD_FLAG_VLAN_TAG) {
					__raw_writel (pPacket->VlanTag,
						      &(pSendBd->u2.VlanTag));
				}
			}

			pSendBd++;
			pShadowSendBd++;
			if (Idx == 0) {
				pSendBd = &pDevice->pSendBdVirt[0];
				pShadowSendBd = &pDevice->ShadowSendBd[0];
			}
		}		/* for */

		/* Put the packet descriptor in the ActiveQ. */
		QQ_PushTail (&pDevice->TxPacketActiveQ.Container, pPacket);

		wmb ();
		MB_REG_WR (pDevice, Mailbox.SendNicProdIdx[0].Low, Idx);

	} else {
		for (FragCount = 0;;) {
			/* Initialize the pointer to the send buffer fragment. */
			MM_MapTxDma (pDevice, pPacket, &pSendBd->HostAddr, &Len,
				     FragCount);

			pSendBd->u2.VlanTag = pPacket->VlanTag;

			/* Setup the control flags and send buffer size. */
			Value32 = (Len << 16) | pPacket->Flags;

			Idx = (Idx + 1) & T3_SEND_RCB_ENTRY_COUNT_MASK;

			FragCount++;
			if (FragCount >= pPacket->u.Tx.FragCount) {
				pSendBd->u1.Len_Flags =
				    Value32 | SND_BD_FLAG_END;
				break;
			} else {
				pSendBd->u1.Len_Flags = Value32;
			}
			pSendBd++;
			if (Idx == 0) {
				pSendBd = &pDevice->pSendBdVirt[0];
			}
		}		/* for */

		/* Put the packet descriptor in the ActiveQ. */
		QQ_PushTail (&pDevice->TxPacketActiveQ.Container, pPacket);

		wmb ();
		MB_REG_WR (pDevice, Mailbox.SendHostProdIdx[0].Low, Idx);

	}

	/* Update the producer index. */
	pDevice->SendProdIdx = Idx;

	return LM_STATUS_SUCCESS;
}
#endif

LM_STATUS LM_SendPacket (PLM_DEVICE_BLOCK pDevice, PLM_PACKET pPacket)
{
	LM_UINT32 FragCount;
	PT3_SND_BD pSendBd, pTmpSendBd, pShadowSendBd;
	T3_SND_BD NicSendBdArr[MAX_FRAGMENT_COUNT];
	LM_UINT32 StartIdx, Idx;

	while (1) {
		/* Initalize the send buffer descriptors. */
		StartIdx = Idx = pDevice->SendProdIdx;

		if (pDevice->NicSendBd) {
			pTmpSendBd = pSendBd = &NicSendBdArr[0];
		} else {
			pTmpSendBd = pSendBd = &pDevice->pSendBdVirt[Idx];
		}

		/* Next producer index. */
		for (FragCount = 0;;) {
			LM_UINT32 Value32, Len;

			/* Initialize the pointer to the send buffer fragment. */
			MM_MapTxDma (pDevice, pPacket, &pSendBd->HostAddr, &Len,
				     FragCount);

			pSendBd->u2.VlanTag = pPacket->VlanTag;

			/* Setup the control flags and send buffer size. */
			Value32 = (Len << 16) | pPacket->Flags;

			Idx = (Idx + 1) & T3_SEND_RCB_ENTRY_COUNT_MASK;

			FragCount++;
			if (FragCount >= pPacket->u.Tx.FragCount) {
				pSendBd->u1.Len_Flags =
				    Value32 | SND_BD_FLAG_END;
				break;
			} else {
				pSendBd->u1.Len_Flags = Value32;
			}
			pSendBd++;
			if ((Idx == 0) && !pDevice->NicSendBd) {
				pSendBd = &pDevice->pSendBdVirt[0];
			}
		}		/* for */
		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700) {
			if (LM_Test4GBoundary (pDevice, pPacket, pTmpSendBd) ==
			    LM_STATUS_SUCCESS) {
				if (MM_CoalesceTxBuffer (pDevice, pPacket) !=
				    LM_STATUS_SUCCESS) {
					QQ_PushHead (&pDevice->TxPacketFreeQ.
						     Container, pPacket);
					return LM_STATUS_FAILURE;
				}
				continue;
			}
		}
		break;
	}
	/* Put the packet descriptor in the ActiveQ. */
	QQ_PushTail (&pDevice->TxPacketActiveQ.Container, pPacket);

	if (pDevice->NicSendBd) {
		pSendBd = &pDevice->pSendBdVirt[StartIdx];
		pShadowSendBd = &pDevice->ShadowSendBd[StartIdx];

		while (StartIdx != Idx) {
			LM_UINT32 Value32;

			if ((Value32 = pTmpSendBd->HostAddr.High) !=
			    pShadowSendBd->HostAddr.High) {
				__raw_writel (Value32,
					      &(pSendBd->HostAddr.High));
				pShadowSendBd->HostAddr.High = Value32;
			}

			__raw_writel (pTmpSendBd->HostAddr.Low,
				      &(pSendBd->HostAddr.Low));

			if ((Value32 = pTmpSendBd->u1.Len_Flags) !=
			    pShadowSendBd->u1.Len_Flags) {
				__raw_writel (Value32,
					      &(pSendBd->u1.Len_Flags));
				pShadowSendBd->u1.Len_Flags = Value32;
			}

			if (pPacket->Flags & SND_BD_FLAG_VLAN_TAG) {
				__raw_writel (pTmpSendBd->u2.VlanTag,
					      &(pSendBd->u2.VlanTag));
			}

			StartIdx =
			    (StartIdx + 1) & T3_SEND_RCB_ENTRY_COUNT_MASK;
			if (StartIdx == 0)
				pSendBd = &pDevice->pSendBdVirt[0];
			else
				pSendBd++;
			pTmpSendBd++;
		}
		wmb ();
		MB_REG_WR (pDevice, Mailbox.SendNicProdIdx[0].Low, Idx);

		if (T3_CHIP_REV (pDevice->ChipRevId) == T3_CHIP_REV_5700_BX) {
			MB_REG_WR (pDevice, Mailbox.SendNicProdIdx[0].Low, Idx);
		}
	} else {
		wmb ();
		MB_REG_WR (pDevice, Mailbox.SendHostProdIdx[0].Low, Idx);

		if (T3_CHIP_REV (pDevice->ChipRevId) == T3_CHIP_REV_5700_BX) {
			MB_REG_WR (pDevice, Mailbox.SendHostProdIdx[0].Low,
				   Idx);
		}
	}

	/* Update the SendBdLeft count. */
	atomic_sub (pPacket->u.Tx.FragCount, &pDevice->SendBdLeft);

	/* Update the producer index. */
	pDevice->SendProdIdx = Idx;

	return LM_STATUS_SUCCESS;
}

STATIC LM_STATUS
LM_Test4GBoundary (PLM_DEVICE_BLOCK pDevice, PLM_PACKET pPacket,
		   PT3_SND_BD pSendBd)
{
	int FragCount;
	LM_UINT32 Idx, Base, Len;

	Idx = pDevice->SendProdIdx;
	for (FragCount = 0;;) {
		Len = pSendBd->u1.Len_Flags >> 16;
		if (((Base = pSendBd->HostAddr.Low) > 0xffffdcc0) &&
		    (pSendBd->HostAddr.High == 0) &&
		    ((Base + 8 + Len) < Base)) {
			return LM_STATUS_SUCCESS;
		}
		FragCount++;
		if (FragCount >= pPacket->u.Tx.FragCount) {
			break;
		}
		pSendBd++;
		if (!pDevice->NicSendBd) {
			Idx = (Idx + 1) & T3_SEND_RCB_ENTRY_COUNT_MASK;
			if (Idx == 0) {
				pSendBd = &pDevice->pSendBdVirt[0];
			}
		}
	}
	return LM_STATUS_FAILURE;
}

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
__inline static unsigned long
ComputeCrc32 (unsigned char *pBuffer, unsigned long BufferSize)
{
	unsigned long Reg;
	unsigned long Tmp;
	unsigned long j, k;

	Reg = 0xffffffff;

	for (j = 0; j < BufferSize; j++) {
		Reg ^= pBuffer[j];

		for (k = 0; k < 8; k++) {
			Tmp = Reg & 0x01;

			Reg >>= 1;

			if (Tmp) {
				Reg ^= 0xedb88320;
			}
		}
	}

	return ~Reg;
}				/* ComputeCrc32 */

/******************************************************************************/
/* Description:                                                               */
/*    This routine sets the receive control register according to ReceiveMask */
/*                                                                            */
/* Return:                                                                    */
/*    LM_STATUS_SUCCESS                                                       */
/******************************************************************************/
LM_STATUS LM_SetReceiveMask (PLM_DEVICE_BLOCK pDevice, LM_UINT32 Mask)
{
	LM_UINT32 ReceiveMask;
	LM_UINT32 RxMode;
	LM_UINT32 j, k;

	ReceiveMask = Mask;

	RxMode = pDevice->RxMode;

	if (Mask & LM_ACCEPT_UNICAST) {
		Mask &= ~LM_ACCEPT_UNICAST;
	}

	if (Mask & LM_ACCEPT_MULTICAST) {
		Mask &= ~LM_ACCEPT_MULTICAST;
	}

	if (Mask & LM_ACCEPT_ALL_MULTICAST) {
		Mask &= ~LM_ACCEPT_ALL_MULTICAST;
	}

	if (Mask & LM_ACCEPT_BROADCAST) {
		Mask &= ~LM_ACCEPT_BROADCAST;
	}

	RxMode &= ~RX_MODE_PROMISCUOUS_MODE;
	if (Mask & LM_PROMISCUOUS_MODE) {
		RxMode |= RX_MODE_PROMISCUOUS_MODE;
		Mask &= ~LM_PROMISCUOUS_MODE;
	}

	RxMode &= ~(RX_MODE_ACCEPT_RUNTS | RX_MODE_ACCEPT_OVERSIZED);
	if (Mask & LM_ACCEPT_ERROR_PACKET) {
		RxMode |= RX_MODE_ACCEPT_RUNTS | RX_MODE_ACCEPT_OVERSIZED;
		Mask &= ~LM_ACCEPT_ERROR_PACKET;
	}

	/* Make sure all the bits are valid before committing changes. */
	if (Mask) {
		return LM_STATUS_FAILURE;
	}

	/* Commit the new filter. */
	pDevice->RxMode = RxMode;
	REG_WR (pDevice, MacCtrl.RxMode, RxMode);

	pDevice->ReceiveMask = ReceiveMask;

	/* Set up the MC hash table. */
	if (ReceiveMask & LM_ACCEPT_ALL_MULTICAST) {
		for (k = 0; k < 4; k++) {
			REG_WR (pDevice, MacCtrl.HashReg[k], 0xffffffff);
		}
	} else if (ReceiveMask & LM_ACCEPT_MULTICAST) {
		LM_UINT32 HashReg[4];

		HashReg[0] = 0;
		HashReg[1] = 0;
		HashReg[2] = 0;
		HashReg[3] = 0;
		for (j = 0; j < pDevice->McEntryCount; j++) {
			LM_UINT32 RegIndex;
			LM_UINT32 Bitpos;
			LM_UINT32 Crc32;

			Crc32 =
			    ComputeCrc32 (pDevice->McTable[j],
					  ETHERNET_ADDRESS_SIZE);

			/* The most significant 7 bits of the CRC32 (no inversion), */
			/* are used to index into one of the possible 128 bit positions. */
			Bitpos = ~Crc32 & 0x7f;

			/* Hash register index. */
			RegIndex = (Bitpos & 0x60) >> 5;

			/* Bit to turn on within a hash register. */
			Bitpos &= 0x1f;

			/* Enable the multicast bit. */
			HashReg[RegIndex] |= (1 << Bitpos);
		}

		/* REV_AX has problem with multicast filtering where it uses both */
		/* DA and SA to perform hashing. */
		for (k = 0; k < 4; k++) {
			REG_WR (pDevice, MacCtrl.HashReg[k], HashReg[k]);
		}
	} else {
		/* Reject all multicast frames. */
		for (j = 0; j < 4; j++) {
			REG_WR (pDevice, MacCtrl.HashReg[j], 0);
		}
	}

	/* By default, Tigon3 will accept broadcast frames.  We need to setup */
	if (ReceiveMask & LM_ACCEPT_BROADCAST) {
		REG_WR (pDevice,
			MacCtrl.RcvRules[RCV_RULE1_REJECT_BROADCAST_IDX].Rule,
			REJECT_BROADCAST_RULE1_RULE & RCV_DISABLE_RULE_MASK);
		REG_WR (pDevice,
			MacCtrl.RcvRules[RCV_RULE1_REJECT_BROADCAST_IDX].Value,
			REJECT_BROADCAST_RULE1_VALUE & RCV_DISABLE_RULE_MASK);
		REG_WR (pDevice,
			MacCtrl.RcvRules[RCV_RULE2_REJECT_BROADCAST_IDX].Rule,
			REJECT_BROADCAST_RULE1_RULE & RCV_DISABLE_RULE_MASK);
		REG_WR (pDevice,
			MacCtrl.RcvRules[RCV_RULE2_REJECT_BROADCAST_IDX].Value,
			REJECT_BROADCAST_RULE1_VALUE & RCV_DISABLE_RULE_MASK);
	} else {
		REG_WR (pDevice,
			MacCtrl.RcvRules[RCV_RULE1_REJECT_BROADCAST_IDX].Rule,
			REJECT_BROADCAST_RULE1_RULE);
		REG_WR (pDevice,
			MacCtrl.RcvRules[RCV_RULE1_REJECT_BROADCAST_IDX].Value,
			REJECT_BROADCAST_RULE1_VALUE);
		REG_WR (pDevice,
			MacCtrl.RcvRules[RCV_RULE2_REJECT_BROADCAST_IDX].Rule,
			REJECT_BROADCAST_RULE2_RULE);
		REG_WR (pDevice,
			MacCtrl.RcvRules[RCV_RULE2_REJECT_BROADCAST_IDX].Value,
			REJECT_BROADCAST_RULE2_VALUE);
	}

	/* disable the rest of the rules. */
	for (j = RCV_LAST_RULE_IDX; j < 16; j++) {
		REG_WR (pDevice, MacCtrl.RcvRules[j].Rule, 0);
		REG_WR (pDevice, MacCtrl.RcvRules[j].Value, 0);
	}

	return LM_STATUS_SUCCESS;
}				/* LM_SetReceiveMask */

/******************************************************************************/
/* Description:                                                               */
/*    Disable the interrupt and put the transmitter and receiver engines in   */
/*    an idle state.  Also aborts all pending send requests and receive       */
/*    buffers.                                                                */
/*                                                                            */
/* Return:                                                                    */
/*    LM_STATUS_SUCCESS                                                       */
/******************************************************************************/
LM_STATUS LM_Abort (PLM_DEVICE_BLOCK pDevice)
{
	PLM_PACKET pPacket;
	LM_UINT Idx;

	LM_DisableInterrupt (pDevice);

	/* Disable all the state machines. */
	LM_CntrlBlock (pDevice, T3_BLOCK_MAC_RX_ENGINE, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_RX_BD_INITIATOR, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_RX_LIST_PLMT, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_RX_LIST_SELECTOR, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_RX_DATA_INITIATOR, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_RX_DATA_COMP, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_RX_BD_COMP, LM_DISABLE);

	LM_CntrlBlock (pDevice, T3_BLOCK_SEND_BD_SELECTOR, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_SEND_BD_INITIATOR, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_SEND_DATA_INITIATOR, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_DMA_RD, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_SEND_DATA_COMP, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_DMA_COMP, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_SEND_BD_COMP, LM_DISABLE);

	/* Clear TDE bit */
	pDevice->MacMode &= ~MAC_MODE_ENABLE_TDE;
	REG_WR (pDevice, MacCtrl.Mode, pDevice->MacMode);

	LM_CntrlBlock (pDevice, T3_BLOCK_MAC_TX_ENGINE, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_HOST_COALESING, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_DMA_WR, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_MBUF_CLUSTER_FREE, LM_DISABLE);

	/* Reset all FTQs */
	REG_WR (pDevice, Ftq.Reset, 0xffffffff);
	REG_WR (pDevice, Ftq.Reset, 0x0);

	LM_CntrlBlock (pDevice, T3_BLOCK_MBUF_MANAGER, LM_DISABLE);
	LM_CntrlBlock (pDevice, T3_BLOCK_MEM_ARBITOR, LM_DISABLE);

	MM_ACQUIRE_INT_LOCK (pDevice);

	/* Abort packets that have already queued to go out. */
	pPacket = (PLM_PACKET) QQ_PopHead (&pDevice->TxPacketActiveQ.Container);
	while (pPacket) {

		pPacket->PacketStatus = LM_STATUS_TRANSMIT_ABORTED;
		pDevice->TxCounters.TxPacketAbortedCnt++;

		atomic_add (pPacket->u.Tx.FragCount, &pDevice->SendBdLeft);

		QQ_PushTail (&pDevice->TxPacketXmittedQ.Container, pPacket);

		pPacket = (PLM_PACKET)
		    QQ_PopHead (&pDevice->TxPacketActiveQ.Container);
	}

	/* Cleanup the receive return rings. */
	LM_ServiceRxInterrupt (pDevice);

	/* Don't want to indicate rx packets in Ndis miniport shutdown context. */
	/* Doing so may cause system crash. */
	if (!pDevice->ShuttingDown) {
		/* Indicate packets to the protocol. */
		MM_IndicateTxPackets (pDevice);

		/* Indicate received packets to the protocols. */
		MM_IndicateRxPackets (pDevice);
	} else {
		/* Move the receive packet descriptors in the ReceivedQ to the */
		/* free queue. */
		for (;;) {
			pPacket =
			    (PLM_PACKET) QQ_PopHead (&pDevice->
						     RxPacketReceivedQ.
						     Container);
			if (pPacket == NULL) {
				break;
			}
			QQ_PushTail (&pDevice->RxPacketFreeQ.Container,
				     pPacket);
		}
	}

	/* Clean up the Std Receive Producer ring. */
	Idx = pDevice->pStatusBlkVirt->RcvStdConIdx;

	while (Idx != pDevice->RxStdProdIdx) {
		pPacket = (PLM_PACKET) (MM_UINT_PTR (pDevice->pPacketDescBase) +
					MM_UINT_PTR (pDevice->pRxStdBdVirt[Idx].
						     Opaque));

		QQ_PushTail (&pDevice->RxPacketFreeQ.Container, pPacket);

		Idx = (Idx + 1) & T3_STD_RCV_RCB_ENTRY_COUNT_MASK;
	}			/* while */

	/* Reinitialize our copy of the indices. */
	pDevice->RxStdProdIdx = 0;

#if T3_JUMBO_RCV_RCB_ENTRY_COUNT
	/* Clean up the Jumbo Receive Producer ring. */
	Idx = pDevice->pStatusBlkVirt->RcvJumboConIdx;

	while (Idx != pDevice->RxJumboProdIdx) {
		pPacket = (PLM_PACKET) (MM_UINT_PTR (pDevice->pPacketDescBase) +
					MM_UINT_PTR (pDevice->
						     pRxJumboBdVirt[Idx].
						     Opaque));

		QQ_PushTail (&pDevice->RxPacketFreeQ.Container, pPacket);

		Idx = (Idx + 1) & T3_JUMBO_RCV_RCB_ENTRY_COUNT_MASK;
	}			/* while */

	/* Reinitialize our copy of the indices. */
	pDevice->RxJumboProdIdx = 0;
#endif				/* T3_JUMBO_RCV_RCB_ENTRY_COUNT */

	MM_RELEASE_INT_LOCK (pDevice);

	/* Initialize the statistis Block */
	pDevice->pStatusBlkVirt->Status = 0;
	pDevice->pStatusBlkVirt->RcvStdConIdx = 0;
	pDevice->pStatusBlkVirt->RcvJumboConIdx = 0;
	pDevice->pStatusBlkVirt->RcvMiniConIdx = 0;

	return LM_STATUS_SUCCESS;
}				/* LM_Abort */

/******************************************************************************/
/* Description:                                                               */
/*    Disable the interrupt and put the transmitter and receiver engines in   */
/*    an idle state.  Aborts all pending send requests and receive buffers.   */
/*    Also free all the receive buffers.                                      */
/*                                                                            */
/* Return:                                                                    */
/*    LM_STATUS_SUCCESS                                                       */
/******************************************************************************/
LM_STATUS LM_Halt (PLM_DEVICE_BLOCK pDevice)
{
	PLM_PACKET pPacket;
	LM_UINT32 EntryCnt;

	LM_Abort (pDevice);

	/* Get the number of entries in the queue. */
	EntryCnt = QQ_GetEntryCnt (&pDevice->RxPacketFreeQ.Container);

	/* Make sure all the packets have been accounted for. */
	for (EntryCnt = 0; EntryCnt < pDevice->RxPacketDescCnt; EntryCnt++) {
		pPacket =
		    (PLM_PACKET) QQ_PopHead (&pDevice->RxPacketFreeQ.Container);
		if (pPacket == 0)
			break;

		MM_FreeRxBuffer (pDevice, pPacket);

		QQ_PushTail (&pDevice->RxPacketFreeQ.Container, pPacket);
	}

	LM_ResetChip (pDevice);

	/* Restore PCI configuration registers. */
	MM_WriteConfig32 (pDevice, PCI_CACHE_LINE_SIZE_REG,
			  pDevice->SavedCacheLineReg);
	LM_RegWrInd (pDevice, PCI_SUBSYSTEM_VENDOR_ID_REG,
		     (pDevice->SubsystemId << 16) | pDevice->SubsystemVendorId);

	/* Reprogram the MAC address. */
	LM_SetMacAddress (pDevice);

	return LM_STATUS_SUCCESS;
}				/* LM_Halt */

STATIC LM_STATUS LM_ResetChip (PLM_DEVICE_BLOCK pDevice)
{
	LM_UINT32 Value32;
	LM_UINT32 j;

	/* Wait for access to the nvram interface before resetting.  This is */
	/* a workaround to prevent EEPROM corruption. */
	if (T3_ASIC_REV (pDevice->ChipRevId) != T3_ASIC_REV_5700 &&
	    T3_ASIC_REV (pDevice->ChipRevId) != T3_ASIC_REV_5701) {
		/* Request access to the flash interface. */
		REG_WR (pDevice, Nvram.SwArb, SW_ARB_REQ_SET1);

		for (j = 0; j < 100000; j++) {
			Value32 = REG_RD (pDevice, Nvram.SwArb);
			if (Value32 & SW_ARB_GNT1) {
				break;
			}
			MM_Wait (10);
		}
	}

	/* Global reset. */
	REG_WR (pDevice, Grc.MiscCfg, GRC_MISC_CFG_CORE_CLOCK_RESET);
	MM_Wait (40);
	MM_Wait (40);
	MM_Wait (40);

	/* make sure we re-enable indirect accesses */
	MM_WriteConfig32 (pDevice, T3_PCI_MISC_HOST_CTRL_REG,
			  pDevice->MiscHostCtrl);

	/* Set MAX PCI retry to zero. */
	Value32 =
	    T3_PCI_STATE_PCI_ROM_ENABLE | T3_PCI_STATE_PCI_ROM_RETRY_ENABLE;
	if (pDevice->ChipRevId == T3_CHIP_ID_5704_A0) {
		if (!(pDevice->PciState & T3_PCI_STATE_CONVENTIONAL_PCI_MODE)) {
			Value32 |= T3_PCI_STATE_RETRY_SAME_DMA;
		}
	}
	MM_WriteConfig32 (pDevice, T3_PCI_STATE_REG, Value32);

	/* Restore PCI command register. */
	MM_WriteConfig32 (pDevice, PCI_COMMAND_REG,
			  pDevice->PciCommandStatusWords);

	/* Disable PCI-X relaxed ordering bit. */
	MM_ReadConfig32 (pDevice, PCIX_CAP_REG, &Value32);
	Value32 &= ~PCIX_ENABLE_RELAXED_ORDERING;
	MM_WriteConfig32 (pDevice, PCIX_CAP_REG, Value32);

	/* Enable memory arbiter. */
	REG_WR (pDevice, MemArbiter.Mode, T3_MEM_ARBITER_MODE_ENABLE);

#ifdef BIG_ENDIAN_PCI		/* This from jfd */
	Value32 = GRC_MODE_WORD_SWAP_DATA | GRC_MODE_WORD_SWAP_NON_FRAME_DATA;
#else
#ifdef BIG_ENDIAN_HOST
	/* Reconfigure the mode register. */
	Value32 = GRC_MODE_BYTE_SWAP_NON_FRAME_DATA |
	    GRC_MODE_WORD_SWAP_NON_FRAME_DATA |
	    GRC_MODE_BYTE_SWAP_DATA | GRC_MODE_WORD_SWAP_DATA;
#else
	/* Reconfigure the mode register. */
	Value32 = GRC_MODE_BYTE_SWAP_NON_FRAME_DATA | GRC_MODE_BYTE_SWAP_DATA;
#endif
#endif
	REG_WR (pDevice, Grc.Mode, Value32);

	/* Prevent PXE from restarting. */
	MEM_WR_OFFSET (pDevice, 0x0b50, T3_MAGIC_NUM);

	if (pDevice->EnableTbi) {
		pDevice->MacMode = MAC_MODE_PORT_MODE_TBI;
		REG_WR (pDevice, MacCtrl.Mode, MAC_MODE_PORT_MODE_TBI);
	} else {
		REG_WR (pDevice, MacCtrl.Mode, 0);
	}

	/* Wait for the firmware to finish initialization. */
	for (j = 0; j < 100000; j++) {
		MM_Wait (10);

		Value32 = MEM_RD_OFFSET (pDevice, 0x0b50);
		if (Value32 == ~T3_MAGIC_NUM) {
			break;
		}
	}
	return LM_STATUS_SUCCESS;
}

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
__inline static void LM_ServiceTxInterrupt (PLM_DEVICE_BLOCK pDevice)
{
	PLM_PACKET pPacket;
	LM_UINT32 HwConIdx;
	LM_UINT32 SwConIdx;

	HwConIdx = pDevice->pStatusBlkVirt->Idx[0].SendConIdx;

	/* Get our copy of the consumer index.  The buffer descriptors */
	/* that are in between the consumer indices are freed. */
	SwConIdx = pDevice->SendConIdx;

	/* Move the packets from the TxPacketActiveQ that are sent out to */
	/* the TxPacketXmittedQ.  Packets that are sent use the */
	/* descriptors that are between SwConIdx and HwConIdx. */
	while (SwConIdx != HwConIdx) {
		/* Get the packet that was sent from the TxPacketActiveQ. */
		pPacket =
		    (PLM_PACKET) QQ_PopHead (&pDevice->TxPacketActiveQ.
					     Container);

		/* Set the return status. */
		pPacket->PacketStatus = LM_STATUS_SUCCESS;

		/* Put the packet in the TxPacketXmittedQ for indication later. */
		QQ_PushTail (&pDevice->TxPacketXmittedQ.Container, pPacket);

		/* Move to the next packet's BD. */
		SwConIdx = (SwConIdx + pPacket->u.Tx.FragCount) &
		    T3_SEND_RCB_ENTRY_COUNT_MASK;

		/* Update the number of unused BDs. */
		atomic_add (pPacket->u.Tx.FragCount, &pDevice->SendBdLeft);

		/* Get the new updated HwConIdx. */
		HwConIdx = pDevice->pStatusBlkVirt->Idx[0].SendConIdx;
	}			/* while */

	/* Save the new SwConIdx. */
	pDevice->SendConIdx = SwConIdx;

}				/* LM_ServiceTxInterrupt */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
__inline static void LM_ServiceRxInterrupt (PLM_DEVICE_BLOCK pDevice)
{
	PLM_PACKET pPacket;
	PT3_RCV_BD pRcvBd;
	LM_UINT32 HwRcvRetProdIdx;
	LM_UINT32 SwRcvRetConIdx;

	/* Loop thru the receive return rings for received packets. */
	HwRcvRetProdIdx = pDevice->pStatusBlkVirt->Idx[0].RcvProdIdx;

	SwRcvRetConIdx = pDevice->RcvRetConIdx;
	while (SwRcvRetConIdx != HwRcvRetProdIdx) {
		pRcvBd = &pDevice->pRcvRetBdVirt[SwRcvRetConIdx];

		/* Get the received packet descriptor. */
		pPacket = (PLM_PACKET) (MM_UINT_PTR (pDevice->pPacketDescBase) +
					MM_UINT_PTR (pRcvBd->Opaque));

		/* Check the error flag. */
		if (pRcvBd->ErrorFlag &&
		    pRcvBd->ErrorFlag != RCV_BD_ERR_ODD_NIBBLED_RCVD_MII) {
			pPacket->PacketStatus = LM_STATUS_FAILURE;

			pDevice->RxCounters.RxPacketErrCnt++;

			if (pRcvBd->ErrorFlag & RCV_BD_ERR_BAD_CRC) {
				pDevice->RxCounters.RxErrCrcCnt++;
			}

			if (pRcvBd->ErrorFlag & RCV_BD_ERR_COLL_DETECT) {
				pDevice->RxCounters.RxErrCollCnt++;
			}

			if (pRcvBd->ErrorFlag & RCV_BD_ERR_LINK_LOST_DURING_PKT) {
				pDevice->RxCounters.RxErrLinkLostCnt++;
			}

			if (pRcvBd->ErrorFlag & RCV_BD_ERR_PHY_DECODE_ERR) {
				pDevice->RxCounters.RxErrPhyDecodeCnt++;
			}

			if (pRcvBd->ErrorFlag & RCV_BD_ERR_ODD_NIBBLED_RCVD_MII) {
				pDevice->RxCounters.RxErrOddNibbleCnt++;
			}

			if (pRcvBd->ErrorFlag & RCV_BD_ERR_MAC_ABORT) {
				pDevice->RxCounters.RxErrMacAbortCnt++;
			}

			if (pRcvBd->ErrorFlag & RCV_BD_ERR_LEN_LT_64) {
				pDevice->RxCounters.RxErrShortPacketCnt++;
			}

			if (pRcvBd->ErrorFlag & RCV_BD_ERR_TRUNC_NO_RESOURCES) {
				pDevice->RxCounters.RxErrNoResourceCnt++;
			}

			if (pRcvBd->ErrorFlag & RCV_BD_ERR_GIANT_FRAME_RCVD) {
				pDevice->RxCounters.RxErrLargePacketCnt++;
			}
		} else {
			pPacket->PacketStatus = LM_STATUS_SUCCESS;
			pPacket->PacketSize = pRcvBd->Len - 4;

			pPacket->Flags = pRcvBd->Flags;
			if (pRcvBd->Flags & RCV_BD_FLAG_VLAN_TAG) {
				pPacket->VlanTag = pRcvBd->VlanTag;
			}

			pPacket->u.Rx.TcpUdpChecksum = pRcvBd->TcpUdpCksum;
		}

		/* Put the packet descriptor containing the received packet */
		/* buffer in the RxPacketReceivedQ for indication later. */
		QQ_PushTail (&pDevice->RxPacketReceivedQ.Container, pPacket);

		/* Go to the next buffer descriptor. */
		SwRcvRetConIdx = (SwRcvRetConIdx + 1) &
		    T3_RCV_RETURN_RCB_ENTRY_COUNT_MASK;

		/* Get the updated HwRcvRetProdIdx. */
		HwRcvRetProdIdx = pDevice->pStatusBlkVirt->Idx[0].RcvProdIdx;
	}			/* while */

	pDevice->RcvRetConIdx = SwRcvRetConIdx;

	/* Update the receive return ring consumer index. */
	MB_REG_WR (pDevice, Mailbox.RcvRetConIdx[0].Low, SwRcvRetConIdx);
}				/* LM_ServiceRxInterrupt */

/******************************************************************************/
/* Description:                                                               */
/*    This is the interrupt event handler routine. It acknowledges all        */
/*    pending interrupts and process all pending events.                      */
/*                                                                            */
/* Return:                                                                    */
/*    LM_STATUS_SUCCESS                                                       */
/******************************************************************************/
LM_STATUS LM_ServiceInterrupts (PLM_DEVICE_BLOCK pDevice)
{
	LM_UINT32 Value32;
	int ServicePhyInt = FALSE;

	/* Setup the phy chip whenever the link status changes. */
	if (pDevice->LinkChngMode == T3_LINK_CHNG_MODE_USE_STATUS_REG) {
		Value32 = REG_RD (pDevice, MacCtrl.Status);
		if (pDevice->PhyIntMode == T3_PHY_INT_MODE_MI_INTERRUPT) {
			if (Value32 & MAC_STATUS_MI_INTERRUPT) {
				ServicePhyInt = TRUE;
			}
		} else if (Value32 & MAC_STATUS_LINK_STATE_CHANGED) {
			ServicePhyInt = TRUE;
		}
	} else {
		if (pDevice->pStatusBlkVirt->
		    Status & STATUS_BLOCK_LINK_CHANGED_STATUS) {
			pDevice->pStatusBlkVirt->Status =
			    STATUS_BLOCK_UPDATED | (pDevice->pStatusBlkVirt->
						    Status &
						    ~STATUS_BLOCK_LINK_CHANGED_STATUS);
			ServicePhyInt = TRUE;
		}
	}
#if INCLUDE_TBI_SUPPORT
	if (pDevice->IgnoreTbiLinkChange == TRUE) {
		ServicePhyInt = FALSE;
	}
#endif
	if (ServicePhyInt == TRUE) {
		LM_SetupPhy (pDevice);
	}

	/* Service receive and transmit interrupts. */
	LM_ServiceRxInterrupt (pDevice);
	LM_ServiceTxInterrupt (pDevice);

	/* No spinlock for this queue since this routine is serialized. */
	if (!QQ_Empty (&pDevice->RxPacketReceivedQ.Container)) {
		/* Indicate receive packets. */
		MM_IndicateRxPackets (pDevice);
		/*       LM_QueueRxPackets(pDevice); */
	}

	/* No spinlock for this queue since this routine is serialized. */
	if (!QQ_Empty (&pDevice->TxPacketXmittedQ.Container)) {
		MM_IndicateTxPackets (pDevice);
	}

	return LM_STATUS_SUCCESS;
}				/* LM_ServiceInterrupts */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_STATUS LM_MulticastAdd (PLM_DEVICE_BLOCK pDevice, PLM_UINT8 pMcAddress)
{
	PLM_UINT8 pEntry;
	LM_UINT32 j;

	pEntry = pDevice->McTable[0];
	for (j = 0; j < pDevice->McEntryCount; j++) {
		if (IS_ETH_ADDRESS_EQUAL (pEntry, pMcAddress)) {
			/* Found a match, increment the instance count. */
			pEntry[LM_MC_INSTANCE_COUNT_INDEX] += 1;

			return LM_STATUS_SUCCESS;
		}

		pEntry += LM_MC_ENTRY_SIZE;
	}

	if (pDevice->McEntryCount >= LM_MAX_MC_TABLE_SIZE) {
		return LM_STATUS_FAILURE;
	}

	pEntry = pDevice->McTable[pDevice->McEntryCount];

	COPY_ETH_ADDRESS (pMcAddress, pEntry);
	pEntry[LM_MC_INSTANCE_COUNT_INDEX] = 1;

	pDevice->McEntryCount++;

	LM_SetReceiveMask (pDevice, pDevice->ReceiveMask | LM_ACCEPT_MULTICAST);

	return LM_STATUS_SUCCESS;
}				/* LM_MulticastAdd */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_STATUS LM_MulticastDel (PLM_DEVICE_BLOCK pDevice, PLM_UINT8 pMcAddress)
{
	PLM_UINT8 pEntry;
	LM_UINT32 j;

	pEntry = pDevice->McTable[0];
	for (j = 0; j < pDevice->McEntryCount; j++) {
		if (IS_ETH_ADDRESS_EQUAL (pEntry, pMcAddress)) {
			/* Found a match, decrement the instance count. */
			pEntry[LM_MC_INSTANCE_COUNT_INDEX] -= 1;

			/* No more instance left, remove the address from the table. */
			/* Move the last entry in the table to the delete slot. */
			if (pEntry[LM_MC_INSTANCE_COUNT_INDEX] == 0 &&
			    pDevice->McEntryCount > 1) {

				COPY_ETH_ADDRESS (pDevice->
						  McTable[pDevice->
							  McEntryCount - 1],
						  pEntry);
				pEntry[LM_MC_INSTANCE_COUNT_INDEX] =
				    pDevice->McTable[pDevice->McEntryCount - 1]
				    [LM_MC_INSTANCE_COUNT_INDEX];
			}
			pDevice->McEntryCount--;

			/* Update the receive mask if the table is empty. */
			if (pDevice->McEntryCount == 0) {
				LM_SetReceiveMask (pDevice,
						   pDevice->
						   ReceiveMask &
						   ~LM_ACCEPT_MULTICAST);
			}

			return LM_STATUS_SUCCESS;
		}

		pEntry += LM_MC_ENTRY_SIZE;
	}

	return LM_STATUS_FAILURE;
}				/* LM_MulticastDel */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_STATUS LM_MulticastClear (PLM_DEVICE_BLOCK pDevice)
{
	pDevice->McEntryCount = 0;

	LM_SetReceiveMask (pDevice,
			   pDevice->ReceiveMask & ~LM_ACCEPT_MULTICAST);

	return LM_STATUS_SUCCESS;
}				/* LM_MulticastClear */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_STATUS LM_SetMacAddress (PLM_DEVICE_BLOCK pDevice)
{
	LM_UINT32 j;
	PLM_UINT8 pMacAddress = pDevice->NodeAddress;

	for (j = 0; j < 4; j++) {
		REG_WR (pDevice, MacCtrl.MacAddr[j].High,
			(pMacAddress[0] << 8) | pMacAddress[1]);
		REG_WR (pDevice, MacCtrl.MacAddr[j].Low,
			(pMacAddress[2] << 24) | (pMacAddress[3] << 16) |
			(pMacAddress[4] << 8) | pMacAddress[5]);
	}

	return LM_STATUS_SUCCESS;
}

/******************************************************************************/
/* Description:                                                               */
/*    Sets up the default line speed, and duplex modes based on the requested */
/*    media type.                                                             */
/*                                                                            */
/* Return:                                                                    */
/*    None.                                                                   */
/******************************************************************************/
static LM_STATUS
LM_TranslateRequestedMediaType (LM_REQUESTED_MEDIA_TYPE RequestedMediaType,
				PLM_MEDIA_TYPE pMediaType,
				PLM_LINE_SPEED pLineSpeed,
				PLM_DUPLEX_MODE pDuplexMode)
{
	*pMediaType = LM_MEDIA_TYPE_AUTO;
	*pLineSpeed = LM_LINE_SPEED_UNKNOWN;
	*pDuplexMode = LM_DUPLEX_MODE_UNKNOWN;

	/* determine media type */
	switch (RequestedMediaType) {
	case LM_REQUESTED_MEDIA_TYPE_BNC:
		*pMediaType = LM_MEDIA_TYPE_BNC;
		*pLineSpeed = LM_LINE_SPEED_10MBPS;
		*pDuplexMode = LM_DUPLEX_MODE_HALF;
		break;

	case LM_REQUESTED_MEDIA_TYPE_UTP_AUTO:
		*pMediaType = LM_MEDIA_TYPE_UTP;
		break;

	case LM_REQUESTED_MEDIA_TYPE_UTP_10MBPS:
		*pMediaType = LM_MEDIA_TYPE_UTP;
		*pLineSpeed = LM_LINE_SPEED_10MBPS;
		*pDuplexMode = LM_DUPLEX_MODE_HALF;
		break;

	case LM_REQUESTED_MEDIA_TYPE_UTP_10MBPS_FULL_DUPLEX:
		*pMediaType = LM_MEDIA_TYPE_UTP;
		*pLineSpeed = LM_LINE_SPEED_10MBPS;
		*pDuplexMode = LM_DUPLEX_MODE_FULL;
		break;

	case LM_REQUESTED_MEDIA_TYPE_UTP_100MBPS:
		*pMediaType = LM_MEDIA_TYPE_UTP;
		*pLineSpeed = LM_LINE_SPEED_100MBPS;
		*pDuplexMode = LM_DUPLEX_MODE_HALF;
		break;

	case LM_REQUESTED_MEDIA_TYPE_UTP_100MBPS_FULL_DUPLEX:
		*pMediaType = LM_MEDIA_TYPE_UTP;
		*pLineSpeed = LM_LINE_SPEED_100MBPS;
		*pDuplexMode = LM_DUPLEX_MODE_FULL;
		break;

	case LM_REQUESTED_MEDIA_TYPE_UTP_1000MBPS:
		*pMediaType = LM_MEDIA_TYPE_UTP;
		*pLineSpeed = LM_LINE_SPEED_1000MBPS;
		*pDuplexMode = LM_DUPLEX_MODE_HALF;
		break;

	case LM_REQUESTED_MEDIA_TYPE_UTP_1000MBPS_FULL_DUPLEX:
		*pMediaType = LM_MEDIA_TYPE_UTP;
		*pLineSpeed = LM_LINE_SPEED_1000MBPS;
		*pDuplexMode = LM_DUPLEX_MODE_FULL;
		break;

	case LM_REQUESTED_MEDIA_TYPE_FIBER_100MBPS:
		*pMediaType = LM_MEDIA_TYPE_FIBER;
		*pLineSpeed = LM_LINE_SPEED_100MBPS;
		*pDuplexMode = LM_DUPLEX_MODE_HALF;
		break;

	case LM_REQUESTED_MEDIA_TYPE_FIBER_100MBPS_FULL_DUPLEX:
		*pMediaType = LM_MEDIA_TYPE_FIBER;
		*pLineSpeed = LM_LINE_SPEED_100MBPS;
		*pDuplexMode = LM_DUPLEX_MODE_FULL;
		break;

	case LM_REQUESTED_MEDIA_TYPE_FIBER_1000MBPS:
		*pMediaType = LM_MEDIA_TYPE_FIBER;
		*pLineSpeed = LM_LINE_SPEED_1000MBPS;
		*pDuplexMode = LM_DUPLEX_MODE_HALF;
		break;

	case LM_REQUESTED_MEDIA_TYPE_FIBER_1000MBPS_FULL_DUPLEX:
		*pMediaType = LM_MEDIA_TYPE_FIBER;
		*pLineSpeed = LM_LINE_SPEED_1000MBPS;
		*pDuplexMode = LM_DUPLEX_MODE_FULL;
		break;

	default:
		break;
	}			/* switch */

	return LM_STATUS_SUCCESS;
}				/* LM_TranslateRequestedMediaType */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/*    LM_STATUS_LINK_ACTIVE                                                   */
/*    LM_STATUS_LINK_DOWN                                                     */
/******************************************************************************/
static LM_STATUS LM_InitBcm540xPhy (PLM_DEVICE_BLOCK pDevice)
{
	LM_LINE_SPEED CurrentLineSpeed;
	LM_DUPLEX_MODE CurrentDuplexMode;
	LM_STATUS CurrentLinkStatus;
	LM_UINT32 Value32;
	LM_UINT32 j;

#if 1				/* jmb: bugfix -- moved here, out of code that sets initial pwr state */
	LM_WritePhy (pDevice, BCM5401_AUX_CTRL, 0x2);
#endif
	if ((pDevice->PhyId & PHY_ID_MASK) == PHY_BCM5401_PHY_ID) {
		LM_ReadPhy (pDevice, PHY_STATUS_REG, &Value32);
		LM_ReadPhy (pDevice, PHY_STATUS_REG, &Value32);

		if (!pDevice->InitDone) {
			Value32 = 0;
		}

		if (!(Value32 & PHY_STATUS_LINK_PASS)) {
			LM_WritePhy (pDevice, BCM5401_AUX_CTRL, 0x0c20);

			LM_WritePhy (pDevice, BCM540X_DSP_ADDRESS_REG, 0x0012);
			LM_WritePhy (pDevice, BCM540X_DSP_RW_PORT, 0x1804);

			LM_WritePhy (pDevice, BCM540X_DSP_ADDRESS_REG, 0x0013);
			LM_WritePhy (pDevice, BCM540X_DSP_RW_PORT, 0x1204);

			LM_WritePhy (pDevice, BCM540X_DSP_ADDRESS_REG, 0x8006);
			LM_WritePhy (pDevice, BCM540X_DSP_RW_PORT, 0x0132);

			LM_WritePhy (pDevice, BCM540X_DSP_ADDRESS_REG, 0x8006);
			LM_WritePhy (pDevice, BCM540X_DSP_RW_PORT, 0x0232);

			LM_WritePhy (pDevice, BCM540X_DSP_ADDRESS_REG, 0x201f);
			LM_WritePhy (pDevice, BCM540X_DSP_RW_PORT, 0x0a20);

			LM_ReadPhy (pDevice, PHY_STATUS_REG, &Value32);
			for (j = 0; j < 1000; j++) {
				MM_Wait (10);

				LM_ReadPhy (pDevice, PHY_STATUS_REG, &Value32);
				if (Value32 & PHY_STATUS_LINK_PASS) {
					MM_Wait (40);
					break;
				}
			}

			if ((pDevice->PhyId & PHY_ID_REV_MASK) ==
			    PHY_BCM5401_B0_REV) {
				if (!(Value32 & PHY_STATUS_LINK_PASS)
				    && (pDevice->OldLineSpeed ==
					LM_LINE_SPEED_1000MBPS)) {
					LM_WritePhy (pDevice, PHY_CTRL_REG,
						     PHY_CTRL_PHY_RESET);
					for (j = 0; j < 100; j++) {
						MM_Wait (10);

						LM_ReadPhy (pDevice,
							    PHY_CTRL_REG,
							    &Value32);
						if (!
						    (Value32 &
						     PHY_CTRL_PHY_RESET)) {
							MM_Wait (40);
							break;
						}
					}

					LM_WritePhy (pDevice, BCM5401_AUX_CTRL,
						     0x0c20);

					LM_WritePhy (pDevice,
						     BCM540X_DSP_ADDRESS_REG,
						     0x0012);
					LM_WritePhy (pDevice,
						     BCM540X_DSP_RW_PORT,
						     0x1804);

					LM_WritePhy (pDevice,
						     BCM540X_DSP_ADDRESS_REG,
						     0x0013);
					LM_WritePhy (pDevice,
						     BCM540X_DSP_RW_PORT,
						     0x1204);

					LM_WritePhy (pDevice,
						     BCM540X_DSP_ADDRESS_REG,
						     0x8006);
					LM_WritePhy (pDevice,
						     BCM540X_DSP_RW_PORT,
						     0x0132);

					LM_WritePhy (pDevice,
						     BCM540X_DSP_ADDRESS_REG,
						     0x8006);
					LM_WritePhy (pDevice,
						     BCM540X_DSP_RW_PORT,
						     0x0232);

					LM_WritePhy (pDevice,
						     BCM540X_DSP_ADDRESS_REG,
						     0x201f);
					LM_WritePhy (pDevice,
						     BCM540X_DSP_RW_PORT,
						     0x0a20);
				}
			}
		}
	} else if (pDevice->ChipRevId == T3_CHIP_ID_5701_A0 ||
		   pDevice->ChipRevId == T3_CHIP_ID_5701_B0) {
		/* Bug: 5701 A0, B0 TX CRC workaround. */
		LM_WritePhy (pDevice, 0x15, 0x0a75);
		LM_WritePhy (pDevice, 0x1c, 0x8c68);
		LM_WritePhy (pDevice, 0x1c, 0x8d68);
		LM_WritePhy (pDevice, 0x1c, 0x8c68);
	}

	/* Acknowledge interrupts. */
	LM_ReadPhy (pDevice, BCM540X_INT_STATUS_REG, &Value32);
	LM_ReadPhy (pDevice, BCM540X_INT_STATUS_REG, &Value32);

	/* Configure the interrupt mask. */
	if (pDevice->PhyIntMode == T3_PHY_INT_MODE_MI_INTERRUPT) {
		LM_WritePhy (pDevice, BCM540X_INT_MASK_REG,
			     ~BCM540X_INT_LINK_CHANGE);
	}

	/* Configure PHY led mode. */
	if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5701 ||
	    (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700)) {
		if (pDevice->LedMode == LED_MODE_THREE_LINK) {
			LM_WritePhy (pDevice, BCM540X_EXT_CTRL_REG,
				     BCM540X_EXT_CTRL_LINK3_LED_MODE);
		} else {
			LM_WritePhy (pDevice, BCM540X_EXT_CTRL_REG, 0);
		}
	}

	CurrentLinkStatus = LM_STATUS_LINK_DOWN;

	/* Get current link and duplex mode. */
	for (j = 0; j < 100; j++) {
		LM_ReadPhy (pDevice, PHY_STATUS_REG, &Value32);
		LM_ReadPhy (pDevice, PHY_STATUS_REG, &Value32);

		if (Value32 & PHY_STATUS_LINK_PASS) {
			break;
		}
		MM_Wait (40);
	}

	if (Value32 & PHY_STATUS_LINK_PASS) {

		/* Determine the current line and duplex settings. */
		LM_ReadPhy (pDevice, BCM540X_AUX_STATUS_REG, &Value32);
		for (j = 0; j < 2000; j++) {
			MM_Wait (10);

			LM_ReadPhy (pDevice, BCM540X_AUX_STATUS_REG, &Value32);
			if (Value32) {
				break;
			}
		}

		switch (Value32 & BCM540X_AUX_SPEED_MASK) {
		case BCM540X_AUX_10BASET_HD:
			CurrentLineSpeed = LM_LINE_SPEED_10MBPS;
			CurrentDuplexMode = LM_DUPLEX_MODE_HALF;
			break;

		case BCM540X_AUX_10BASET_FD:
			CurrentLineSpeed = LM_LINE_SPEED_10MBPS;
			CurrentDuplexMode = LM_DUPLEX_MODE_FULL;
			break;

		case BCM540X_AUX_100BASETX_HD:
			CurrentLineSpeed = LM_LINE_SPEED_100MBPS;
			CurrentDuplexMode = LM_DUPLEX_MODE_HALF;
			break;

		case BCM540X_AUX_100BASETX_FD:
			CurrentLineSpeed = LM_LINE_SPEED_100MBPS;
			CurrentDuplexMode = LM_DUPLEX_MODE_FULL;
			break;

		case BCM540X_AUX_100BASET_HD:
			CurrentLineSpeed = LM_LINE_SPEED_1000MBPS;
			CurrentDuplexMode = LM_DUPLEX_MODE_HALF;
			break;

		case BCM540X_AUX_100BASET_FD:
			CurrentLineSpeed = LM_LINE_SPEED_1000MBPS;
			CurrentDuplexMode = LM_DUPLEX_MODE_FULL;
			break;

		default:

			CurrentLineSpeed = LM_LINE_SPEED_UNKNOWN;
			CurrentDuplexMode = LM_DUPLEX_MODE_UNKNOWN;
			break;
		}

		/* Make sure we are in auto-neg mode. */
		for (j = 0; j < 200; j++) {
			LM_ReadPhy (pDevice, PHY_CTRL_REG, &Value32);
			if (Value32 && Value32 != 0x7fff) {
				break;
			}

			if (Value32 == 0 && pDevice->RequestedMediaType ==
			    LM_REQUESTED_MEDIA_TYPE_UTP_10MBPS) {
				break;
			}

			MM_Wait (10);
		}

		/* Use the current line settings for "auto" mode. */
		if (pDevice->RequestedMediaType == LM_REQUESTED_MEDIA_TYPE_AUTO
		    || pDevice->RequestedMediaType ==
		    LM_REQUESTED_MEDIA_TYPE_UTP_AUTO) {
			if (Value32 & PHY_CTRL_AUTO_NEG_ENABLE) {
				CurrentLinkStatus = LM_STATUS_LINK_ACTIVE;

				/* We may be exiting low power mode and the link is in */
				/* 10mb.  In this case, we need to restart autoneg. */
				LM_ReadPhy (pDevice, BCM540X_1000BASET_CTRL_REG,
					    &Value32);
				pDevice->advertising1000 = Value32;
				/* 5702FE supports 10/100Mb only. */
				if (T3_ASIC_REV (pDevice->ChipRevId) !=
				    T3_ASIC_REV_5703
				    || pDevice->BondId !=
				    GRC_MISC_BD_ID_5702FE) {
					if (!
					    (Value32 &
					     (BCM540X_AN_AD_1000BASET_HALF |
					      BCM540X_AN_AD_1000BASET_FULL))) {
						CurrentLinkStatus =
						    LM_STATUS_LINK_SETTING_MISMATCH;
					}
				}
			} else {
				CurrentLinkStatus =
				    LM_STATUS_LINK_SETTING_MISMATCH;
			}
		} else {
			/* Force line settings. */
			/* Use the current setting if it matches the user's requested */
			/* setting. */
			LM_ReadPhy (pDevice, PHY_CTRL_REG, &Value32);
			if ((pDevice->LineSpeed == CurrentLineSpeed) &&
			    (pDevice->DuplexMode == CurrentDuplexMode)) {
				if ((pDevice->DisableAutoNeg &&
				     !(Value32 & PHY_CTRL_AUTO_NEG_ENABLE)) ||
				    (!pDevice->DisableAutoNeg &&
				     (Value32 & PHY_CTRL_AUTO_NEG_ENABLE))) {
					CurrentLinkStatus =
					    LM_STATUS_LINK_ACTIVE;
				} else {
					CurrentLinkStatus =
					    LM_STATUS_LINK_SETTING_MISMATCH;
				}
			} else {
				CurrentLinkStatus =
				    LM_STATUS_LINK_SETTING_MISMATCH;
			}
		}

		/* Save line settings. */
		pDevice->LineSpeed = CurrentLineSpeed;
		pDevice->DuplexMode = CurrentDuplexMode;
		pDevice->MediaType = LM_MEDIA_TYPE_UTP;
	}

	return CurrentLinkStatus;
}				/* LM_InitBcm540xPhy */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_STATUS
LM_SetFlowControl (PLM_DEVICE_BLOCK pDevice,
		   LM_UINT32 LocalPhyAd, LM_UINT32 RemotePhyAd)
{
	LM_FLOW_CONTROL FlowCap;

	/* Resolve flow control. */
	FlowCap = LM_FLOW_CONTROL_NONE;

	/* See Table 28B-3 of 802.3ab-1999 spec. */
	if (pDevice->FlowControlCap & LM_FLOW_CONTROL_AUTO_PAUSE) {
		if (LocalPhyAd & PHY_AN_AD_PAUSE_CAPABLE) {
			if (LocalPhyAd & PHY_AN_AD_ASYM_PAUSE) {
				if (RemotePhyAd &
				    PHY_LINK_PARTNER_PAUSE_CAPABLE) {
					FlowCap =
					    LM_FLOW_CONTROL_TRANSMIT_PAUSE |
					    LM_FLOW_CONTROL_RECEIVE_PAUSE;
				} else if (RemotePhyAd &
					   PHY_LINK_PARTNER_ASYM_PAUSE) {
					FlowCap = LM_FLOW_CONTROL_RECEIVE_PAUSE;
				}
			} else {
				if (RemotePhyAd &
				    PHY_LINK_PARTNER_PAUSE_CAPABLE) {
					FlowCap =
					    LM_FLOW_CONTROL_TRANSMIT_PAUSE |
					    LM_FLOW_CONTROL_RECEIVE_PAUSE;
				}
			}
		} else if (LocalPhyAd & PHY_AN_AD_ASYM_PAUSE) {
			if ((RemotePhyAd & PHY_LINK_PARTNER_PAUSE_CAPABLE) &&
			    (RemotePhyAd & PHY_LINK_PARTNER_ASYM_PAUSE)) {
				FlowCap = LM_FLOW_CONTROL_TRANSMIT_PAUSE;
			}
		}
	} else {
		FlowCap = pDevice->FlowControlCap;
	}

	/* Enable/disable rx PAUSE. */
	pDevice->RxMode &= ~RX_MODE_ENABLE_FLOW_CONTROL;
	if (FlowCap & LM_FLOW_CONTROL_RECEIVE_PAUSE &&
	    (pDevice->FlowControlCap == LM_FLOW_CONTROL_AUTO_PAUSE ||
	     pDevice->FlowControlCap & LM_FLOW_CONTROL_RECEIVE_PAUSE)) {
		pDevice->FlowControl |= LM_FLOW_CONTROL_RECEIVE_PAUSE;
		pDevice->RxMode |= RX_MODE_ENABLE_FLOW_CONTROL;

	}
	REG_WR (pDevice, MacCtrl.RxMode, pDevice->RxMode);

	/* Enable/disable tx PAUSE. */
	pDevice->TxMode &= ~TX_MODE_ENABLE_FLOW_CONTROL;
	if (FlowCap & LM_FLOW_CONTROL_TRANSMIT_PAUSE &&
	    (pDevice->FlowControlCap == LM_FLOW_CONTROL_AUTO_PAUSE ||
	     pDevice->FlowControlCap & LM_FLOW_CONTROL_TRANSMIT_PAUSE)) {
		pDevice->FlowControl |= LM_FLOW_CONTROL_TRANSMIT_PAUSE;
		pDevice->TxMode |= TX_MODE_ENABLE_FLOW_CONTROL;

	}
	REG_WR (pDevice, MacCtrl.TxMode, pDevice->TxMode);

	return LM_STATUS_SUCCESS;
}

#if INCLUDE_TBI_SUPPORT
/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
STATIC LM_STATUS LM_InitBcm800xPhy (PLM_DEVICE_BLOCK pDevice)
{
	LM_UINT32 Value32;
	LM_UINT32 j;

	Value32 = REG_RD (pDevice, MacCtrl.Status);

	/* Reset the SERDES during init and when we have link. */
	if (!pDevice->InitDone || Value32 & MAC_STATUS_PCS_SYNCED) {
		/* Set PLL lock range. */
		LM_WritePhy (pDevice, 0x16, 0x8007);

		/* Software reset. */
		LM_WritePhy (pDevice, 0x00, 0x8000);

		/* Wait for reset to complete. */
		for (j = 0; j < 500; j++) {
			MM_Wait (10);
		}

		/* Config mode; seletct PMA/Ch 1 regs. */
		LM_WritePhy (pDevice, 0x10, 0x8411);

		/* Enable auto-lock and comdet, select txclk for tx. */
		LM_WritePhy (pDevice, 0x11, 0x0a10);

		LM_WritePhy (pDevice, 0x18, 0x00a0);
		LM_WritePhy (pDevice, 0x16, 0x41ff);

		/* Assert and deassert POR. */
		LM_WritePhy (pDevice, 0x13, 0x0400);
		MM_Wait (40);
		LM_WritePhy (pDevice, 0x13, 0x0000);

		LM_WritePhy (pDevice, 0x11, 0x0a50);
		MM_Wait (40);
		LM_WritePhy (pDevice, 0x11, 0x0a10);

		/* Delay for signal to stabilize. */
		for (j = 0; j < 15000; j++) {
			MM_Wait (10);
		}

		/* Deselect the channel register so we can read the PHY id later. */
		LM_WritePhy (pDevice, 0x10, 0x8011);
	}

	return LM_STATUS_SUCCESS;
}

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
STATIC LM_STATUS LM_SetupFiberPhy (PLM_DEVICE_BLOCK pDevice)
{
	LM_STATUS CurrentLinkStatus;
	AUTONEG_STATUS AnStatus = 0;
	LM_UINT32 Value32;
	LM_UINT32 Cnt;
	LM_UINT32 j, k;

	pDevice->MacMode &= ~(MAC_MODE_HALF_DUPLEX | MAC_MODE_PORT_MODE_MASK);

	/* Initialize the send_config register. */
	REG_WR (pDevice, MacCtrl.TxAutoNeg, 0);

	/* Enable TBI and full duplex mode. */
	pDevice->MacMode |= MAC_MODE_PORT_MODE_TBI;
	REG_WR (pDevice, MacCtrl.Mode, pDevice->MacMode);

	/* Initialize the BCM8002 SERDES PHY. */
	switch (pDevice->PhyId & PHY_ID_MASK) {
	case PHY_BCM8002_PHY_ID:
		LM_InitBcm800xPhy (pDevice);
		break;

	default:
		break;
	}

	/* Enable link change interrupt. */
	REG_WR (pDevice, MacCtrl.MacEvent,
		MAC_EVENT_ENABLE_LINK_STATE_CHANGED_ATTN);

	/* Default to link down. */
	CurrentLinkStatus = LM_STATUS_LINK_DOWN;

	/* Get the link status. */
	Value32 = REG_RD (pDevice, MacCtrl.Status);
	if (Value32 & MAC_STATUS_PCS_SYNCED) {
		if ((pDevice->RequestedMediaType ==
		     LM_REQUESTED_MEDIA_TYPE_AUTO)
		    || (pDevice->DisableAutoNeg == FALSE)) {
			/* auto-negotiation mode. */
			/* Initialize the autoneg default capaiblities. */
			AutonegInit (&pDevice->AnInfo);

			/* Set the context pointer to point to the main device structure. */
			pDevice->AnInfo.pContext = pDevice;

			/* Setup flow control advertisement register. */
			Value32 = GetPhyAdFlowCntrlSettings (pDevice);
			if (Value32 & PHY_AN_AD_PAUSE_CAPABLE) {
				pDevice->AnInfo.mr_adv_sym_pause = 1;
			} else {
				pDevice->AnInfo.mr_adv_sym_pause = 0;
			}

			if (Value32 & PHY_AN_AD_ASYM_PAUSE) {
				pDevice->AnInfo.mr_adv_asym_pause = 1;
			} else {
				pDevice->AnInfo.mr_adv_asym_pause = 0;
			}

			/* Try to autoneg up to six times. */
			if (pDevice->IgnoreTbiLinkChange) {
				Cnt = 1;
			} else {
				Cnt = 6;
			}
			for (j = 0; j < Cnt; j++) {
				REG_WR (pDevice, MacCtrl.TxAutoNeg, 0);

				Value32 =
				    pDevice->MacMode & ~MAC_MODE_PORT_MODE_MASK;
				REG_WR (pDevice, MacCtrl.Mode, Value32);
				MM_Wait (20);

				REG_WR (pDevice, MacCtrl.Mode,
					pDevice->
					MacMode | MAC_MODE_SEND_CONFIGS);

				MM_Wait (20);

				pDevice->AnInfo.State = AN_STATE_UNKNOWN;
				pDevice->AnInfo.CurrentTime_us = 0;

				REG_WR (pDevice, Grc.Timer, 0);
				for (k = 0;
				     (pDevice->AnInfo.CurrentTime_us < 75000)
				     && (k < 75000); k++) {
					AnStatus =
					    Autoneg8023z (&pDevice->AnInfo);

					if ((AnStatus == AUTONEG_STATUS_DONE) ||
					    (AnStatus == AUTONEG_STATUS_FAILED))
					{
						break;
					}

					pDevice->AnInfo.CurrentTime_us =
					    REG_RD (pDevice, Grc.Timer);

				}
				if ((AnStatus == AUTONEG_STATUS_DONE) ||
				    (AnStatus == AUTONEG_STATUS_FAILED)) {
					break;
				}
				if (j >= 1) {
					if (!(REG_RD (pDevice, MacCtrl.Status) &
					      MAC_STATUS_PCS_SYNCED)) {
						break;
					}
				}
			}

			/* Stop sending configs. */
			MM_AnTxIdle (&pDevice->AnInfo);

			/* Resolve flow control settings. */
			if ((AnStatus == AUTONEG_STATUS_DONE) &&
			    pDevice->AnInfo.mr_an_complete
			    && pDevice->AnInfo.mr_link_ok
			    && pDevice->AnInfo.mr_lp_adv_full_duplex) {
				LM_UINT32 RemotePhyAd;
				LM_UINT32 LocalPhyAd;

				LocalPhyAd = 0;
				if (pDevice->AnInfo.mr_adv_sym_pause) {
					LocalPhyAd |= PHY_AN_AD_PAUSE_CAPABLE;
				}

				if (pDevice->AnInfo.mr_adv_asym_pause) {
					LocalPhyAd |= PHY_AN_AD_ASYM_PAUSE;
				}

				RemotePhyAd = 0;
				if (pDevice->AnInfo.mr_lp_adv_sym_pause) {
					RemotePhyAd |=
					    PHY_LINK_PARTNER_PAUSE_CAPABLE;
				}

				if (pDevice->AnInfo.mr_lp_adv_asym_pause) {
					RemotePhyAd |=
					    PHY_LINK_PARTNER_ASYM_PAUSE;
				}

				LM_SetFlowControl (pDevice, LocalPhyAd,
						   RemotePhyAd);

				CurrentLinkStatus = LM_STATUS_LINK_ACTIVE;
			}
			for (j = 0; j < 30; j++) {
				MM_Wait (20);
				REG_WR (pDevice, MacCtrl.Status,
					MAC_STATUS_SYNC_CHANGED |
					MAC_STATUS_CFG_CHANGED);
				MM_Wait (20);
				if ((REG_RD (pDevice, MacCtrl.Status) &
				     (MAC_STATUS_SYNC_CHANGED |
				      MAC_STATUS_CFG_CHANGED)) == 0)
					break;
			}
			if (pDevice->PollTbiLink) {
				Value32 = REG_RD (pDevice, MacCtrl.Status);
				if (Value32 & MAC_STATUS_RECEIVING_CFG) {
					pDevice->IgnoreTbiLinkChange = TRUE;
				} else {
					pDevice->IgnoreTbiLinkChange = FALSE;
				}
			}
			Value32 = REG_RD (pDevice, MacCtrl.Status);
			if (CurrentLinkStatus == LM_STATUS_LINK_DOWN &&
			    (Value32 & MAC_STATUS_PCS_SYNCED) &&
			    ((Value32 & MAC_STATUS_RECEIVING_CFG) == 0)) {
				CurrentLinkStatus = LM_STATUS_LINK_ACTIVE;
			}
		} else {
			/* We are forcing line speed. */
			pDevice->FlowControlCap &= ~LM_FLOW_CONTROL_AUTO_PAUSE;
			LM_SetFlowControl (pDevice, 0, 0);

			CurrentLinkStatus = LM_STATUS_LINK_ACTIVE;
			REG_WR (pDevice, MacCtrl.Mode, pDevice->MacMode |
				MAC_MODE_SEND_CONFIGS);
		}
	}
	/* Set the link polarity bit. */
	pDevice->MacMode &= ~MAC_MODE_LINK_POLARITY;
	REG_WR (pDevice, MacCtrl.Mode, pDevice->MacMode);

	pDevice->pStatusBlkVirt->Status = STATUS_BLOCK_UPDATED |
	    (pDevice->pStatusBlkVirt->
	     Status & ~STATUS_BLOCK_LINK_CHANGED_STATUS);

	for (j = 0; j < 100; j++) {
		REG_WR (pDevice, MacCtrl.Status, MAC_STATUS_SYNC_CHANGED |
			MAC_STATUS_CFG_CHANGED);
		MM_Wait (5);
		if ((REG_RD (pDevice, MacCtrl.Status) &
		     (MAC_STATUS_SYNC_CHANGED | MAC_STATUS_CFG_CHANGED)) == 0)
			break;
	}

	Value32 = REG_RD (pDevice, MacCtrl.Status);
	if ((Value32 & MAC_STATUS_PCS_SYNCED) == 0) {
		CurrentLinkStatus = LM_STATUS_LINK_DOWN;
		if (pDevice->DisableAutoNeg == FALSE) {
			REG_WR (pDevice, MacCtrl.Mode, pDevice->MacMode |
				MAC_MODE_SEND_CONFIGS);
			MM_Wait (1);
			REG_WR (pDevice, MacCtrl.Mode, pDevice->MacMode);
		}
	}

	/* Initialize the current link status. */
	if (CurrentLinkStatus == LM_STATUS_LINK_ACTIVE) {
		pDevice->LineSpeed = LM_LINE_SPEED_1000MBPS;
		pDevice->DuplexMode = LM_DUPLEX_MODE_FULL;
		REG_WR (pDevice, MacCtrl.LedCtrl, LED_CTRL_OVERRIDE_LINK_LED |
			LED_CTRL_1000MBPS_LED_ON);
	} else {
		pDevice->LineSpeed = LM_LINE_SPEED_UNKNOWN;
		pDevice->DuplexMode = LM_DUPLEX_MODE_UNKNOWN;
		REG_WR (pDevice, MacCtrl.LedCtrl, LED_CTRL_OVERRIDE_LINK_LED |
			LED_CTRL_OVERRIDE_TRAFFIC_LED);
	}

	/* Indicate link status. */
	if (pDevice->LinkStatus != CurrentLinkStatus) {
		pDevice->LinkStatus = CurrentLinkStatus;
		MM_IndicateStatus (pDevice, CurrentLinkStatus);
	}

	return LM_STATUS_SUCCESS;
}
#endif				/* INCLUDE_TBI_SUPPORT */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_STATUS LM_SetupCopperPhy (PLM_DEVICE_BLOCK pDevice)
{
	LM_STATUS CurrentLinkStatus;
	LM_UINT32 Value32;

	/* Assume there is not link first. */
	CurrentLinkStatus = LM_STATUS_LINK_DOWN;

	/* Disable phy link change attention. */
	REG_WR (pDevice, MacCtrl.MacEvent, 0);

	/* Clear link change attention. */
	REG_WR (pDevice, MacCtrl.Status, MAC_STATUS_SYNC_CHANGED |
		MAC_STATUS_CFG_CHANGED);

	/* Disable auto-polling for the moment. */
	pDevice->MiMode = 0xc0000;
	REG_WR (pDevice, MacCtrl.MiMode, pDevice->MiMode);
	MM_Wait (40);

	/* Determine the requested line speed and duplex. */
	pDevice->OldLineSpeed = pDevice->LineSpeed;
	LM_TranslateRequestedMediaType (pDevice->RequestedMediaType,
					&pDevice->MediaType,
					&pDevice->LineSpeed,
					&pDevice->DuplexMode);

	/* Initialize the phy chip. */
	switch (pDevice->PhyId & PHY_ID_MASK) {
	case PHY_BCM5400_PHY_ID:
	case PHY_BCM5401_PHY_ID:
	case PHY_BCM5411_PHY_ID:
	case PHY_BCM5701_PHY_ID:
	case PHY_BCM5703_PHY_ID:
	case PHY_BCM5704_PHY_ID:
		CurrentLinkStatus = LM_InitBcm540xPhy (pDevice);
		break;

	default:
		break;
	}

	if (CurrentLinkStatus == LM_STATUS_LINK_SETTING_MISMATCH) {
		CurrentLinkStatus = LM_STATUS_LINK_DOWN;
	}

	/* Setup flow control. */
	pDevice->FlowControl = LM_FLOW_CONTROL_NONE;
	if (CurrentLinkStatus == LM_STATUS_LINK_ACTIVE) {
		LM_FLOW_CONTROL FlowCap;	/* Flow control capability. */

		FlowCap = LM_FLOW_CONTROL_NONE;

		if (pDevice->DuplexMode == LM_DUPLEX_MODE_FULL) {
			if (pDevice->DisableAutoNeg == FALSE ||
			    pDevice->RequestedMediaType ==
			    LM_REQUESTED_MEDIA_TYPE_AUTO
			    || pDevice->RequestedMediaType ==
			    LM_REQUESTED_MEDIA_TYPE_UTP_AUTO) {
				LM_UINT32 ExpectedPhyAd;
				LM_UINT32 LocalPhyAd;
				LM_UINT32 RemotePhyAd;

				LM_ReadPhy (pDevice, PHY_AN_AD_REG,
					    &LocalPhyAd);
				pDevice->advertising = LocalPhyAd;
				LocalPhyAd &=
				    (PHY_AN_AD_ASYM_PAUSE |
				     PHY_AN_AD_PAUSE_CAPABLE);

				ExpectedPhyAd =
				    GetPhyAdFlowCntrlSettings (pDevice);

				if (LocalPhyAd != ExpectedPhyAd) {
					CurrentLinkStatus = LM_STATUS_LINK_DOWN;
				} else {
					LM_ReadPhy (pDevice,
						    PHY_LINK_PARTNER_ABILITY_REG,
						    &RemotePhyAd);

					LM_SetFlowControl (pDevice, LocalPhyAd,
							   RemotePhyAd);
				}
			} else {
				pDevice->FlowControlCap &=
				    ~LM_FLOW_CONTROL_AUTO_PAUSE;
				LM_SetFlowControl (pDevice, 0, 0);
			}
		}
	}

	if (CurrentLinkStatus == LM_STATUS_LINK_DOWN) {
		LM_ForceAutoNeg (pDevice, pDevice->RequestedMediaType);

		/* If we force line speed, we make get link right away. */
		LM_ReadPhy (pDevice, PHY_STATUS_REG, &Value32);
		LM_ReadPhy (pDevice, PHY_STATUS_REG, &Value32);
		if (Value32 & PHY_STATUS_LINK_PASS) {
			CurrentLinkStatus = LM_STATUS_LINK_ACTIVE;
		}
	}

	/* GMII interface. */
	pDevice->MacMode &= ~MAC_MODE_PORT_MODE_MASK;
	if (CurrentLinkStatus == LM_STATUS_LINK_ACTIVE) {
		if (pDevice->LineSpeed == LM_LINE_SPEED_100MBPS ||
		    pDevice->LineSpeed == LM_LINE_SPEED_10MBPS) {
			pDevice->MacMode |= MAC_MODE_PORT_MODE_MII;
		} else {
			pDevice->MacMode |= MAC_MODE_PORT_MODE_GMII;
		}
	} else {
		pDevice->MacMode |= MAC_MODE_PORT_MODE_GMII;
	}

	/* Set the MAC to operate in the appropriate duplex mode. */
	pDevice->MacMode &= ~MAC_MODE_HALF_DUPLEX;
	if (pDevice->DuplexMode == LM_DUPLEX_MODE_HALF) {
		pDevice->MacMode |= MAC_MODE_HALF_DUPLEX;
	}

	/* Set the link polarity bit. */
	pDevice->MacMode &= ~MAC_MODE_LINK_POLARITY;
	if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700) {
		if ((pDevice->LedMode == LED_MODE_LINK10) ||
		    (CurrentLinkStatus == LM_STATUS_LINK_ACTIVE &&
		     pDevice->LineSpeed == LM_LINE_SPEED_10MBPS)) {
			pDevice->MacMode |= MAC_MODE_LINK_POLARITY;
		}
	} else {
		if (CurrentLinkStatus == LM_STATUS_LINK_ACTIVE) {
			pDevice->MacMode |= MAC_MODE_LINK_POLARITY;
		}

		/* Set LED mode. */
		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700 ||
		    T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5701) {
			Value32 = LED_CTRL_PHY_MODE_1;
		} else {
			if (pDevice->LedMode == LED_MODE_OUTPUT) {
				Value32 = LED_CTRL_PHY_MODE_2;
			} else {
				Value32 = LED_CTRL_PHY_MODE_1;
			}
		}
		REG_WR (pDevice, MacCtrl.LedCtrl, Value32);
	}

	REG_WR (pDevice, MacCtrl.Mode, pDevice->MacMode);

	/* Enable auto polling. */
	if (pDevice->PhyIntMode == T3_PHY_INT_MODE_AUTO_POLLING) {
		pDevice->MiMode |= MI_MODE_AUTO_POLLING_ENABLE;
		REG_WR (pDevice, MacCtrl.MiMode, pDevice->MiMode);
	}

	/* Enable phy link change attention. */
	if (pDevice->PhyIntMode == T3_PHY_INT_MODE_MI_INTERRUPT) {
		REG_WR (pDevice, MacCtrl.MacEvent,
			MAC_EVENT_ENABLE_MI_INTERRUPT);
	} else {
		REG_WR (pDevice, MacCtrl.MacEvent,
			MAC_EVENT_ENABLE_LINK_STATE_CHANGED_ATTN);
	}
	if ((T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700) &&
	    (CurrentLinkStatus == LM_STATUS_LINK_ACTIVE) &&
	    (pDevice->LineSpeed == LM_LINE_SPEED_1000MBPS) &&
	    (((pDevice->PciState & T3_PCI_STATE_CONVENTIONAL_PCI_MODE) &&
	      (pDevice->PciState & T3_PCI_STATE_BUS_SPEED_HIGH)) ||
	     !(pDevice->PciState & T3_PCI_STATE_CONVENTIONAL_PCI_MODE))) {
		MM_Wait (120);
		REG_WR (pDevice, MacCtrl.Status, MAC_STATUS_SYNC_CHANGED |
			MAC_STATUS_CFG_CHANGED);
		MEM_WR_OFFSET (pDevice, T3_FIRMWARE_MAILBOX,
			       T3_MAGIC_NUM_DISABLE_DMAW_ON_LINK_CHANGE);
	}

	/* Indicate link status. */
	if (pDevice->LinkStatus != CurrentLinkStatus) {
		pDevice->LinkStatus = CurrentLinkStatus;
		MM_IndicateStatus (pDevice, CurrentLinkStatus);
	}

	return LM_STATUS_SUCCESS;
}				/* LM_SetupCopperPhy */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_STATUS LM_SetupPhy (PLM_DEVICE_BLOCK pDevice)
{
	LM_STATUS LmStatus;
	LM_UINT32 Value32;

#if INCLUDE_TBI_SUPPORT
	if (pDevice->EnableTbi) {
		LmStatus = LM_SetupFiberPhy (pDevice);
	} else
#endif				/* INCLUDE_TBI_SUPPORT */
	{
		LmStatus = LM_SetupCopperPhy (pDevice);
	}
	if (pDevice->ChipRevId == T3_CHIP_ID_5704_A0) {
		if (!(pDevice->PciState & T3_PCI_STATE_CONVENTIONAL_PCI_MODE)) {
			Value32 = REG_RD (pDevice, PciCfg.PciState);
			REG_WR (pDevice, PciCfg.PciState,
				Value32 | T3_PCI_STATE_RETRY_SAME_DMA);
		}
	}
	if ((pDevice->LineSpeed == LM_LINE_SPEED_1000MBPS) &&
	    (pDevice->DuplexMode == LM_DUPLEX_MODE_HALF)) {
		REG_WR (pDevice, MacCtrl.TxLengths, 0x26ff);
	} else {
		REG_WR (pDevice, MacCtrl.TxLengths, 0x2620);
	}

	return LmStatus;
}

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_VOID
LM_ReadPhy (PLM_DEVICE_BLOCK pDevice, LM_UINT32 PhyReg, PLM_UINT32 pData32)
{
	LM_UINT32 Value32;
	LM_UINT32 j;

	if (pDevice->PhyIntMode == T3_PHY_INT_MODE_AUTO_POLLING) {
		REG_WR (pDevice, MacCtrl.MiMode, pDevice->MiMode &
			~MI_MODE_AUTO_POLLING_ENABLE);
		MM_Wait (40);
	}

	Value32 = (pDevice->PhyAddr << MI_COM_FIRST_PHY_ADDR_BIT) |
	    ((PhyReg & MI_COM_PHY_REG_ADDR_MASK) <<
	     MI_COM_FIRST_PHY_REG_ADDR_BIT) | MI_COM_CMD_READ | MI_COM_START;

	REG_WR (pDevice, MacCtrl.MiCom, Value32);

	for (j = 0; j < 20; j++) {
		MM_Wait (25);

		Value32 = REG_RD (pDevice, MacCtrl.MiCom);

		if (!(Value32 & MI_COM_BUSY)) {
			MM_Wait (5);
			Value32 = REG_RD (pDevice, MacCtrl.MiCom);
			Value32 &= MI_COM_PHY_DATA_MASK;
			break;
		}
	}

	if (Value32 & MI_COM_BUSY) {
		Value32 = 0;
	}

	*pData32 = Value32;

	if (pDevice->PhyIntMode == T3_PHY_INT_MODE_AUTO_POLLING) {
		REG_WR (pDevice, MacCtrl.MiMode, pDevice->MiMode);
		MM_Wait (40);
	}
}				/* LM_ReadPhy */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_VOID
LM_WritePhy (PLM_DEVICE_BLOCK pDevice, LM_UINT32 PhyReg, LM_UINT32 Data32)
{
	LM_UINT32 Value32;
	LM_UINT32 j;

	if (pDevice->PhyIntMode == T3_PHY_INT_MODE_AUTO_POLLING) {
		REG_WR (pDevice, MacCtrl.MiMode, pDevice->MiMode &
			~MI_MODE_AUTO_POLLING_ENABLE);
		MM_Wait (40);
	}

	Value32 = (pDevice->PhyAddr << MI_COM_FIRST_PHY_ADDR_BIT) |
	    ((PhyReg & MI_COM_PHY_REG_ADDR_MASK) <<
	     MI_COM_FIRST_PHY_REG_ADDR_BIT) | (Data32 & MI_COM_PHY_DATA_MASK) |
	    MI_COM_CMD_WRITE | MI_COM_START;

	REG_WR (pDevice, MacCtrl.MiCom, Value32);

	for (j = 0; j < 20; j++) {
		MM_Wait (25);

		Value32 = REG_RD (pDevice, MacCtrl.MiCom);

		if (!(Value32 & MI_COM_BUSY)) {
			MM_Wait (5);
			break;
		}
	}

	if (pDevice->PhyIntMode == T3_PHY_INT_MODE_AUTO_POLLING) {
		REG_WR (pDevice, MacCtrl.MiMode, pDevice->MiMode);
		MM_Wait (40);
	}
}				/* LM_WritePhy */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_STATUS LM_SetPowerState (PLM_DEVICE_BLOCK pDevice, LM_POWER_STATE PowerLevel)
{
	LM_UINT32 PmeSupport;
	LM_UINT32 Value32;
	LM_UINT32 PmCtrl;

	/* make sureindirect accesses are enabled */
	MM_WriteConfig32 (pDevice, T3_PCI_MISC_HOST_CTRL_REG,
			  pDevice->MiscHostCtrl);

	/* Clear the PME_ASSERT bit and the power state bits.  Also enable */
	/* the PME bit. */
	MM_ReadConfig32 (pDevice, T3_PCI_PM_STATUS_CTRL_REG, &PmCtrl);

	PmCtrl |= T3_PM_PME_ASSERTED;
	PmCtrl &= ~T3_PM_POWER_STATE_MASK;

	/* Set the appropriate power state. */
	if (PowerLevel == LM_POWER_STATE_D0) {

		/* Bring the card out of low power mode. */
		PmCtrl |= T3_PM_POWER_STATE_D0;
		MM_WriteConfig32 (pDevice, T3_PCI_PM_STATUS_CTRL_REG, PmCtrl);

		REG_WR (pDevice, Grc.LocalCtrl, pDevice->GrcLocalCtrl);
		MM_Wait (40);
#if 0				/* Bugfix by jmb...can't call WritePhy here because pDevice not fully initialized */
		LM_WritePhy (pDevice, BCM5401_AUX_CTRL, 0x02);
#endif

		return LM_STATUS_SUCCESS;
	} else if (PowerLevel == LM_POWER_STATE_D1) {
		PmCtrl |= T3_PM_POWER_STATE_D1;
	} else if (PowerLevel == LM_POWER_STATE_D2) {
		PmCtrl |= T3_PM_POWER_STATE_D2;
	} else if (PowerLevel == LM_POWER_STATE_D3) {
		PmCtrl |= T3_PM_POWER_STATE_D3;
	} else {
		return LM_STATUS_FAILURE;
	}
	PmCtrl |= T3_PM_PME_ENABLE;

	/* Mask out all interrupts so LM_SetupPhy won't be called while we are */
	/* setting new line speed. */
	Value32 = REG_RD (pDevice, PciCfg.MiscHostCtrl);
	REG_WR (pDevice, PciCfg.MiscHostCtrl,
		Value32 | MISC_HOST_CTRL_MASK_PCI_INT);

	if (!pDevice->RestoreOnWakeUp) {
		pDevice->RestoreOnWakeUp = TRUE;
		pDevice->WakeUpDisableAutoNeg = pDevice->DisableAutoNeg;
		pDevice->WakeUpRequestedMediaType = pDevice->RequestedMediaType;
	}

	/* Force auto-negotiation to 10 line speed. */
	pDevice->DisableAutoNeg = FALSE;
	pDevice->RequestedMediaType = LM_REQUESTED_MEDIA_TYPE_UTP_10MBPS;
	LM_SetupPhy (pDevice);

	/* Put the driver in the initial state, and go through the power down */
	/* sequence. */
	LM_Halt (pDevice);

	MM_ReadConfig32 (pDevice, T3_PCI_PM_CAP_REG, &PmeSupport);

	if (pDevice->WakeUpModeCap != LM_WAKE_UP_MODE_NONE) {

		/* Enable WOL. */
		LM_WritePhy (pDevice, BCM5401_AUX_CTRL, 0x5a);
		MM_Wait (40);

		/* Set LED mode. */
		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700 ||
		    T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5701) {
			Value32 = LED_CTRL_PHY_MODE_1;
		} else {
			if (pDevice->LedMode == LED_MODE_OUTPUT) {
				Value32 = LED_CTRL_PHY_MODE_2;
			} else {
				Value32 = LED_CTRL_PHY_MODE_1;
			}
		}

		Value32 = MAC_MODE_PORT_MODE_MII;
		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700) {
			if (pDevice->LedMode == LED_MODE_LINK10 ||
			    pDevice->WolSpeed == WOL_SPEED_10MB) {
				Value32 |= MAC_MODE_LINK_POLARITY;
			}
		} else {
			Value32 |= MAC_MODE_LINK_POLARITY;
		}
		REG_WR (pDevice, MacCtrl.Mode, Value32);
		MM_Wait (40);
		MM_Wait (40);
		MM_Wait (40);

		/* Always enable magic packet wake-up if we have vaux. */
		if ((PmeSupport & T3_PCI_PM_CAP_PME_D3COLD) &&
		    (pDevice->WakeUpModeCap & LM_WAKE_UP_MODE_MAGIC_PACKET)) {
			Value32 |= MAC_MODE_DETECT_MAGIC_PACKET_ENABLE;
		}

		REG_WR (pDevice, MacCtrl.Mode, Value32);

		/* Enable the receiver. */
		REG_WR (pDevice, MacCtrl.RxMode, RX_MODE_ENABLE);
	}

	/* Disable tx/rx clocks, and seletect an alternate clock. */
	if (pDevice->WolSpeed == WOL_SPEED_100MB) {
		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700 ||
		    T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5701) {
			Value32 =
			    T3_PCI_DISABLE_RX_CLOCK | T3_PCI_DISABLE_TX_CLOCK |
			    T3_PCI_SELECT_ALTERNATE_CLOCK;
		} else {
			Value32 = T3_PCI_SELECT_ALTERNATE_CLOCK;
		}
		REG_WR (pDevice, PciCfg.ClockCtrl, Value32);

		MM_Wait (40);

		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700 ||
		    T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5701) {
			Value32 =
			    T3_PCI_DISABLE_RX_CLOCK | T3_PCI_DISABLE_TX_CLOCK |
			    T3_PCI_SELECT_ALTERNATE_CLOCK |
			    T3_PCI_44MHZ_CORE_CLOCK;
		} else {
			Value32 = T3_PCI_SELECT_ALTERNATE_CLOCK |
			    T3_PCI_44MHZ_CORE_CLOCK;
		}

		REG_WR (pDevice, PciCfg.ClockCtrl, Value32);

		MM_Wait (40);

		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700 ||
		    T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5701) {
			Value32 =
			    T3_PCI_DISABLE_RX_CLOCK | T3_PCI_DISABLE_TX_CLOCK |
			    T3_PCI_44MHZ_CORE_CLOCK;
		} else {
			Value32 = T3_PCI_44MHZ_CORE_CLOCK;
		}

		REG_WR (pDevice, PciCfg.ClockCtrl, Value32);
	} else {
		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700 ||
		    T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5701) {
			Value32 =
			    T3_PCI_DISABLE_RX_CLOCK | T3_PCI_DISABLE_TX_CLOCK |
			    T3_PCI_SELECT_ALTERNATE_CLOCK |
			    T3_PCI_POWER_DOWN_PCI_PLL133;
		} else {
			Value32 = T3_PCI_SELECT_ALTERNATE_CLOCK |
			    T3_PCI_POWER_DOWN_PCI_PLL133;
		}

		REG_WR (pDevice, PciCfg.ClockCtrl, Value32);
	}

	MM_Wait (40);

	if (!pDevice->EepromWp
	    && (pDevice->WakeUpModeCap != LM_WAKE_UP_MODE_NONE)) {
		/* Switch adapter to auxilliary power. */
		if (T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5700 ||
		    T3_ASIC_REV (pDevice->ChipRevId) == T3_ASIC_REV_5701) {
			/* GPIO0 = 1, GPIO1 = 1, GPIO2 = 0. */
			REG_WR (pDevice, Grc.LocalCtrl, pDevice->GrcLocalCtrl |
				GRC_MISC_LOCAL_CTRL_GPIO_OE0 |
				GRC_MISC_LOCAL_CTRL_GPIO_OE1 |
				GRC_MISC_LOCAL_CTRL_GPIO_OE2 |
				GRC_MISC_LOCAL_CTRL_GPIO_OUTPUT0 |
				GRC_MISC_LOCAL_CTRL_GPIO_OUTPUT1);
			MM_Wait (40);
		} else {
			/* GPIO0 = 0, GPIO1 = 1, GPIO2 = 1. */
			REG_WR (pDevice, Grc.LocalCtrl, pDevice->GrcLocalCtrl |
				GRC_MISC_LOCAL_CTRL_GPIO_OE0 |
				GRC_MISC_LOCAL_CTRL_GPIO_OE1 |
				GRC_MISC_LOCAL_CTRL_GPIO_OE2 |
				GRC_MISC_LOCAL_CTRL_GPIO_OUTPUT1 |
				GRC_MISC_LOCAL_CTRL_GPIO_OUTPUT2);
			MM_Wait (40);

			/* GPIO0 = 1, GPIO1 = 1, GPIO2 = 1. */
			REG_WR (pDevice, Grc.LocalCtrl, pDevice->GrcLocalCtrl |
				GRC_MISC_LOCAL_CTRL_GPIO_OE0 |
				GRC_MISC_LOCAL_CTRL_GPIO_OE1 |
				GRC_MISC_LOCAL_CTRL_GPIO_OE2 |
				GRC_MISC_LOCAL_CTRL_GPIO_OUTPUT0 |
				GRC_MISC_LOCAL_CTRL_GPIO_OUTPUT1 |
				GRC_MISC_LOCAL_CTRL_GPIO_OUTPUT2);
			MM_Wait (40);

			/* GPIO0 = 1, GPIO1 = 1, GPIO2 = 0. */
			REG_WR (pDevice, Grc.LocalCtrl, pDevice->GrcLocalCtrl |
				GRC_MISC_LOCAL_CTRL_GPIO_OE0 |
				GRC_MISC_LOCAL_CTRL_GPIO_OE1 |
				GRC_MISC_LOCAL_CTRL_GPIO_OE2 |
				GRC_MISC_LOCAL_CTRL_GPIO_OUTPUT0 |
				GRC_MISC_LOCAL_CTRL_GPIO_OUTPUT1);
			MM_Wait (40);
		}
	}

	/* Set the phy to low power mode. */
	/* Put the the hardware in low power mode. */
	MM_WriteConfig32 (pDevice, T3_PCI_PM_STATUS_CTRL_REG, PmCtrl);

	return LM_STATUS_SUCCESS;
}				/* LM_SetPowerState */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
static LM_UINT32 GetPhyAdFlowCntrlSettings (PLM_DEVICE_BLOCK pDevice)
{
	LM_UINT32 Value32;

	Value32 = 0;

	/* Auto negotiation flow control only when autonegotiation is enabled. */
	if (pDevice->DisableAutoNeg == FALSE ||
	    pDevice->RequestedMediaType == LM_REQUESTED_MEDIA_TYPE_AUTO ||
	    pDevice->RequestedMediaType == LM_REQUESTED_MEDIA_TYPE_UTP_AUTO) {
		/* Please refer to Table 28B-3 of the 802.3ab-1999 spec. */
		if ((pDevice->FlowControlCap == LM_FLOW_CONTROL_AUTO_PAUSE) ||
		    ((pDevice->FlowControlCap & LM_FLOW_CONTROL_RECEIVE_PAUSE)
		     && (pDevice->
			 FlowControlCap & LM_FLOW_CONTROL_TRANSMIT_PAUSE))) {
			Value32 |= PHY_AN_AD_PAUSE_CAPABLE;
		} else if (pDevice->
			   FlowControlCap & LM_FLOW_CONTROL_TRANSMIT_PAUSE) {
			Value32 |= PHY_AN_AD_ASYM_PAUSE;
		} else if (pDevice->
			   FlowControlCap & LM_FLOW_CONTROL_RECEIVE_PAUSE) {
			Value32 |=
			    PHY_AN_AD_PAUSE_CAPABLE | PHY_AN_AD_ASYM_PAUSE;
		}
	}

	return Value32;
}

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/*    LM_STATUS_FAILURE                                                       */
/*    LM_STATUS_SUCCESS                                                       */
/*                                                                            */
/******************************************************************************/
static LM_STATUS
LM_ForceAutoNegBcm540xPhy (PLM_DEVICE_BLOCK pDevice,
			   LM_REQUESTED_MEDIA_TYPE RequestedMediaType)
{
	LM_MEDIA_TYPE MediaType;
	LM_LINE_SPEED LineSpeed;
	LM_DUPLEX_MODE DuplexMode;
	LM_UINT32 NewPhyCtrl;
	LM_UINT32 Value32;
	LM_UINT32 Cnt;

	/* Get the interface type, line speed, and duplex mode. */
	LM_TranslateRequestedMediaType (RequestedMediaType, &MediaType,
					&LineSpeed, &DuplexMode);

	if (pDevice->RestoreOnWakeUp) {
		LM_WritePhy (pDevice, BCM540X_1000BASET_CTRL_REG, 0);
		pDevice->advertising1000 = 0;
		Value32 = PHY_AN_AD_10BASET_FULL | PHY_AN_AD_10BASET_HALF;
		if (pDevice->WolSpeed == WOL_SPEED_100MB) {
			Value32 |=
			    PHY_AN_AD_100BASETX_FULL | PHY_AN_AD_100BASETX_HALF;
		}
		Value32 |= PHY_AN_AD_PROTOCOL_802_3_CSMA_CD;
		Value32 |= GetPhyAdFlowCntrlSettings (pDevice);
		LM_WritePhy (pDevice, PHY_AN_AD_REG, Value32);
		pDevice->advertising = Value32;
	}
	/* Setup the auto-negotiation advertisement register. */
	else if (LineSpeed == LM_LINE_SPEED_UNKNOWN) {
		/* Setup the 10/100 Mbps auto-negotiation advertisement register. */
		Value32 = PHY_AN_AD_PROTOCOL_802_3_CSMA_CD |
		    PHY_AN_AD_10BASET_HALF | PHY_AN_AD_10BASET_FULL |
		    PHY_AN_AD_100BASETX_FULL | PHY_AN_AD_100BASETX_HALF;
		Value32 |= GetPhyAdFlowCntrlSettings (pDevice);

		LM_WritePhy (pDevice, PHY_AN_AD_REG, Value32);
		pDevice->advertising = Value32;

		/* Advertise 1000Mbps */
		Value32 =
		    BCM540X_AN_AD_1000BASET_HALF | BCM540X_AN_AD_1000BASET_FULL;

#if INCLUDE_5701_AX_FIX
		/* Bug: workaround for CRC error in gigabit mode when we are in */
		/* slave mode.  This will force the PHY to operate in */
		/* master mode. */
		if (pDevice->ChipRevId == T3_CHIP_ID_5701_A0 ||
		    pDevice->ChipRevId == T3_CHIP_ID_5701_B0) {
			Value32 |= BCM540X_CONFIG_AS_MASTER |
			    BCM540X_ENABLE_CONFIG_AS_MASTER;
		}
#endif

		LM_WritePhy (pDevice, BCM540X_1000BASET_CTRL_REG, Value32);
		pDevice->advertising1000 = Value32;
	} else {
		if (LineSpeed == LM_LINE_SPEED_1000MBPS) {
			Value32 = PHY_AN_AD_PROTOCOL_802_3_CSMA_CD;
			Value32 |= GetPhyAdFlowCntrlSettings (pDevice);

			LM_WritePhy (pDevice, PHY_AN_AD_REG, Value32);
			pDevice->advertising = Value32;

			if (DuplexMode != LM_DUPLEX_MODE_FULL) {
				Value32 = BCM540X_AN_AD_1000BASET_HALF;
			} else {
				Value32 = BCM540X_AN_AD_1000BASET_FULL;
			}

			LM_WritePhy (pDevice, BCM540X_1000BASET_CTRL_REG,
				     Value32);
			pDevice->advertising1000 = Value32;
		} else if (LineSpeed == LM_LINE_SPEED_100MBPS) {
			LM_WritePhy (pDevice, BCM540X_1000BASET_CTRL_REG, 0);
			pDevice->advertising1000 = 0;

			if (DuplexMode != LM_DUPLEX_MODE_FULL) {
				Value32 = PHY_AN_AD_100BASETX_HALF;
			} else {
				Value32 = PHY_AN_AD_100BASETX_FULL;
			}

			Value32 |= PHY_AN_AD_PROTOCOL_802_3_CSMA_CD;
			Value32 |= GetPhyAdFlowCntrlSettings (pDevice);

			LM_WritePhy (pDevice, PHY_AN_AD_REG, Value32);
			pDevice->advertising = Value32;
		} else if (LineSpeed == LM_LINE_SPEED_10MBPS) {
			LM_WritePhy (pDevice, BCM540X_1000BASET_CTRL_REG, 0);
			pDevice->advertising1000 = 0;

			if (DuplexMode != LM_DUPLEX_MODE_FULL) {
				Value32 = PHY_AN_AD_10BASET_HALF;
			} else {
				Value32 = PHY_AN_AD_10BASET_FULL;
			}

			Value32 |= PHY_AN_AD_PROTOCOL_802_3_CSMA_CD;
			Value32 |= GetPhyAdFlowCntrlSettings (pDevice);

			LM_WritePhy (pDevice, PHY_AN_AD_REG, Value32);
			pDevice->advertising = Value32;
		}
	}

	/* Force line speed if auto-negotiation is disabled. */
	if (pDevice->DisableAutoNeg && LineSpeed != LM_LINE_SPEED_UNKNOWN) {
		/* This code path is executed only when there is link. */
		pDevice->MediaType = MediaType;
		pDevice->LineSpeed = LineSpeed;
		pDevice->DuplexMode = DuplexMode;

		/* Force line seepd. */
		NewPhyCtrl = 0;
		switch (LineSpeed) {
		case LM_LINE_SPEED_10MBPS:
			NewPhyCtrl |= PHY_CTRL_SPEED_SELECT_10MBPS;
			break;
		case LM_LINE_SPEED_100MBPS:
			NewPhyCtrl |= PHY_CTRL_SPEED_SELECT_100MBPS;
			break;
		case LM_LINE_SPEED_1000MBPS:
			NewPhyCtrl |= PHY_CTRL_SPEED_SELECT_1000MBPS;
			break;
		default:
			NewPhyCtrl |= PHY_CTRL_SPEED_SELECT_1000MBPS;
			break;
		}

		if (DuplexMode == LM_DUPLEX_MODE_FULL) {
			NewPhyCtrl |= PHY_CTRL_FULL_DUPLEX_MODE;
		}

		/* Don't do anything if the PHY_CTRL is already what we wanted. */
		LM_ReadPhy (pDevice, PHY_CTRL_REG, &Value32);
		if (Value32 != NewPhyCtrl) {
			/* Temporary bring the link down before forcing line speed. */
			LM_WritePhy (pDevice, PHY_CTRL_REG,
				     PHY_CTRL_LOOPBACK_MODE);

			/* Wait for link to go down. */
			for (Cnt = 0; Cnt < 15000; Cnt++) {
				MM_Wait (10);

				LM_ReadPhy (pDevice, PHY_STATUS_REG, &Value32);
				LM_ReadPhy (pDevice, PHY_STATUS_REG, &Value32);

				if (!(Value32 & PHY_STATUS_LINK_PASS)) {
					MM_Wait (40);
					break;
				}
			}

			LM_WritePhy (pDevice, PHY_CTRL_REG, NewPhyCtrl);
			MM_Wait (40);
		}
	} else {
		LM_WritePhy (pDevice, PHY_CTRL_REG, PHY_CTRL_AUTO_NEG_ENABLE |
			     PHY_CTRL_RESTART_AUTO_NEG);
	}

	return LM_STATUS_SUCCESS;
}				/* LM_ForceAutoNegBcm540xPhy */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
static LM_STATUS
LM_ForceAutoNeg (PLM_DEVICE_BLOCK pDevice,
		 LM_REQUESTED_MEDIA_TYPE RequestedMediaType)
{
	LM_STATUS LmStatus;

	/* Initialize the phy chip. */
	switch (pDevice->PhyId & PHY_ID_MASK) {
	case PHY_BCM5400_PHY_ID:
	case PHY_BCM5401_PHY_ID:
	case PHY_BCM5411_PHY_ID:
	case PHY_BCM5701_PHY_ID:
	case PHY_BCM5703_PHY_ID:
	case PHY_BCM5704_PHY_ID:
		LmStatus =
		    LM_ForceAutoNegBcm540xPhy (pDevice, RequestedMediaType);
		break;

	default:
		LmStatus = LM_STATUS_FAILURE;
		break;
	}

	return LmStatus;
}				/* LM_ForceAutoNeg */

/******************************************************************************/
/* Description:                                                               */
/*                                                                            */
/* Return:                                                                    */
/******************************************************************************/
LM_STATUS LM_LoadFirmware (PLM_DEVICE_BLOCK pDevice,
			   PT3_FWIMG_INFO pFwImg,
			   LM_UINT32 LoadCpu, LM_UINT32 StartCpu)
{
	LM_UINT32 i;
	LM_UINT32 address;

	if (LoadCpu & T3_RX_CPU_ID) {
		if (LM_HaltCpu (pDevice, T3_RX_CPU_ID) != LM_STATUS_SUCCESS) {
			return LM_STATUS_FAILURE;
		}

		/* First of all clear scrach pad memory */
		for (i = 0; i < T3_RX_CPU_SPAD_SIZE; i += 4) {
			LM_RegWrInd (pDevice, T3_RX_CPU_SPAD_ADDR + i, 0);
		}

		/* Copy code first */
		address = T3_RX_CPU_SPAD_ADDR + (pFwImg->Text.Offset & 0xffff);
		for (i = 0; i <= pFwImg->Text.Length; i += 4) {
			LM_RegWrInd (pDevice, address + i,
				     ((LM_UINT32 *) pFwImg->Text.Buffer)[i /
									 4]);
		}

		address =
		    T3_RX_CPU_SPAD_ADDR + (pFwImg->ROnlyData.Offset & 0xffff);
		for (i = 0; i <= pFwImg->ROnlyData.Length; i += 4) {
			LM_RegWrInd (pDevice, address + i,
				     ((LM_UINT32 *) pFwImg->ROnlyData.
				      Buffer)[i / 4]);
		}

		address = T3_RX_CPU_SPAD_ADDR + (pFwImg->Data.Offset & 0xffff);
		for (i = 0; i <= pFwImg->Data.Length; i += 4) {
			LM_RegWrInd (pDevice, address + i,
				     ((LM_UINT32 *) pFwImg->Data.Buffer)[i /
									 4]);
		}
	}

	if (LoadCpu & T3_TX_CPU_ID) {
		if (LM_HaltCpu (pDevice, T3_TX_CPU_ID) != LM_STATUS_SUCCESS) {
			return LM_STATUS_FAILURE;
		}

		/* First of all clear scrach pad memory */
		for (i = 0; i < T3_TX_CPU_SPAD_SIZE; i += 4) {
			LM_RegWrInd (pDevice, T3_TX_CPU_SPAD_ADDR + i, 0);
		}

		/* Copy code first */
		address = T3_TX_CPU_SPAD_ADDR + (pFwImg->Text.Offset & 0xffff);
		for (i = 0; i <= pFwImg->Text.Length; i += 4) {
			LM_RegWrInd (pDevice, address + i,
				     ((LM_UINT32 *) pFwImg->Text.Buffer)[i /
									 4]);
		}

		address =
		    T3_TX_CPU_SPAD_ADDR + (pFwImg->ROnlyData.Offset & 0xffff);
		for (i = 0; i <= pFwImg->ROnlyData.Length; i += 4) {
			LM_RegWrInd (pDevice, address + i,
				     ((LM_UINT32 *) pFwImg->ROnlyData.
				      Buffer)[i / 4]);
		}

		address = T3_TX_CPU_SPAD_ADDR + (pFwImg->Data.Offset & 0xffff);
		for (i = 0; i <= pFwImg->Data.Length; i += 4) {
			LM_RegWrInd (pDevice, address + i,
				     ((LM_UINT32 *) pFwImg->Data.Buffer)[i /
									 4]);
		}
	}

	if (StartCpu & T3_RX_CPU_ID) {
		/* Start Rx CPU */
		REG_WR (pDevice, rxCpu.reg.state, 0xffffffff);
		REG_WR (pDevice, rxCpu.reg.PC, pFwImg->StartAddress);
		for (i = 0; i < 5; i++) {
			if (pFwImg->StartAddress ==
			    REG_RD (pDevice, rxCpu.reg.PC))
				break;

			REG_WR (pDevice, rxCpu.reg.state, 0xffffffff);
			REG_WR (pDevice, rxCpu.reg.mode, CPU_MODE_HALT);
			REG_WR (pDevice, rxCpu.reg.PC, pFwImg->StartAddress);
			MM_Wait (1000);
		}

		REG_WR (pDevice, rxCpu.reg.state, 0xffffffff);
		REG_WR (pDevice, rxCpu.reg.mode, 0);
	}

	if (StartCpu & T3_TX_CPU_ID) {
		/* Start Tx CPU */
		REG_WR (pDevice, txCpu.reg.state, 0xffffffff);
		REG_WR (pDevice, txCpu.reg.PC, pFwImg->StartAddress);
		for (i = 0; i < 5; i++) {
			if (pFwImg->StartAddress ==
			    REG_RD (pDevice, txCpu.reg.PC))
				break;

			REG_WR (pDevice, txCpu.reg.state, 0xffffffff);
			REG_WR (pDevice, txCpu.reg.mode, CPU_MODE_HALT);
			REG_WR (pDevice, txCpu.reg.PC, pFwImg->StartAddress);
			MM_Wait (1000);
		}

		REG_WR (pDevice, txCpu.reg.state, 0xffffffff);
		REG_WR (pDevice, txCpu.reg.mode, 0);
	}

	return LM_STATUS_SUCCESS;
}

STATIC LM_STATUS LM_HaltCpu (PLM_DEVICE_BLOCK pDevice, LM_UINT32 cpu_number)
{
	LM_UINT32 i;

	if (cpu_number == T3_RX_CPU_ID) {
		for (i = 0; i < 10000; i++) {
			REG_WR (pDevice, rxCpu.reg.state, 0xffffffff);
			REG_WR (pDevice, rxCpu.reg.mode, CPU_MODE_HALT);

			if (REG_RD (pDevice, rxCpu.reg.mode) & CPU_MODE_HALT)
				break;
		}

		REG_WR (pDevice, rxCpu.reg.state, 0xffffffff);
		REG_WR (pDevice, rxCpu.reg.mode, CPU_MODE_HALT);
		MM_Wait (10);
	} else {
		for (i = 0; i < 10000; i++) {
			REG_WR (pDevice, txCpu.reg.state, 0xffffffff);
			REG_WR (pDevice, txCpu.reg.mode, CPU_MODE_HALT);

			if (REG_RD (pDevice, txCpu.reg.mode) & CPU_MODE_HALT)
				break;
		}
	}

	return ((i == 10000) ? LM_STATUS_FAILURE : LM_STATUS_SUCCESS);
}

int LM_BlinkLED (PLM_DEVICE_BLOCK pDevice, LM_UINT32 BlinkDurationSec)
{
	LM_UINT32 Oldcfg;
	int j;
	int ret = 0;

	if (BlinkDurationSec == 0) {
		return 0;
	}
	if (BlinkDurationSec > 120) {
		BlinkDurationSec = 120;
	}

	Oldcfg = REG_RD (pDevice, MacCtrl.LedCtrl);
	for (j = 0; j < BlinkDurationSec * 2; j++) {
		if (j % 2) {
			/* Turn on the LEDs. */
			REG_WR (pDevice, MacCtrl.LedCtrl,
				LED_CTRL_OVERRIDE_LINK_LED |
				LED_CTRL_1000MBPS_LED_ON |
				LED_CTRL_100MBPS_LED_ON |
				LED_CTRL_10MBPS_LED_ON |
				LED_CTRL_OVERRIDE_TRAFFIC_LED |
				LED_CTRL_BLINK_TRAFFIC_LED |
				LED_CTRL_TRAFFIC_LED);
		} else {
			/* Turn off the LEDs. */
			REG_WR (pDevice, MacCtrl.LedCtrl,
				LED_CTRL_OVERRIDE_LINK_LED |
				LED_CTRL_OVERRIDE_TRAFFIC_LED);
		}

#ifndef EMBEDDED
		current->state = TASK_INTERRUPTIBLE;
		if (schedule_timeout (HZ / 2) != 0) {
			ret = -EINTR;
			break;
		}
#else
		udelay (100000);	/* 1s sleep */
#endif
	}
	REG_WR (pDevice, MacCtrl.LedCtrl, Oldcfg);
	return ret;
}

int t3_do_dma (PLM_DEVICE_BLOCK pDevice,
	       LM_PHYSICAL_ADDRESS host_addr_phy, int length, int dma_read)
{
	T3_DMA_DESC dma_desc;
	int i;
	LM_UINT32 dma_desc_addr;
	LM_UINT32 value32;

	REG_WR (pDevice, BufMgr.Mode, 0);
	REG_WR (pDevice, Ftq.Reset, 0);

	dma_desc.host_addr.High = host_addr_phy.High;
	dma_desc.host_addr.Low = host_addr_phy.Low;
	dma_desc.nic_mbuf = 0x2100;
	dma_desc.len = length;
	dma_desc.flags = 0x00000004;	/* Generate Rx-CPU event */

	if (dma_read) {
		dma_desc.cqid_sqid = (T3_QID_RX_BD_COMP << 8) |
		    T3_QID_DMA_HIGH_PRI_READ;
		REG_WR (pDevice, DmaRead.Mode, DMA_READ_MODE_ENABLE);
	} else {
		dma_desc.cqid_sqid = (T3_QID_RX_DATA_COMP << 8) |
		    T3_QID_DMA_HIGH_PRI_WRITE;
		REG_WR (pDevice, DmaWrite.Mode, DMA_WRITE_MODE_ENABLE);
	}

	dma_desc_addr = T3_NIC_DMA_DESC_POOL_ADDR;

	/* Writing this DMA descriptor to DMA memory */
	for (i = 0; i < sizeof (T3_DMA_DESC); i += 4) {
		value32 = *((PLM_UINT32) (((PLM_UINT8) & dma_desc) + i));
		MM_WriteConfig32 (pDevice, T3_PCI_MEM_WIN_ADDR_REG,
				  dma_desc_addr + i);
		MM_WriteConfig32 (pDevice, T3_PCI_MEM_WIN_DATA_REG,
				  cpu_to_le32 (value32));
	}
	MM_WriteConfig32 (pDevice, T3_PCI_MEM_WIN_ADDR_REG, 0);

	if (dma_read)
		REG_WR (pDevice, Ftq.DmaHighReadFtqFifoEnqueueDequeue,
			dma_desc_addr);
	else
		REG_WR (pDevice, Ftq.DmaHighWriteFtqFifoEnqueueDequeue,
			dma_desc_addr);

	for (i = 0; i < 40; i++) {
		if (dma_read)
			value32 =
			    REG_RD (pDevice,
				    Ftq.RcvBdCompFtqFifoEnqueueDequeue);
		else
			value32 =
			    REG_RD (pDevice,
				    Ftq.RcvDataCompFtqFifoEnqueueDequeue);

		if ((value32 & 0xffff) == dma_desc_addr)
			break;

		MM_Wait (10);
	}

	return LM_STATUS_SUCCESS;
}

STATIC LM_STATUS
LM_DmaTest (PLM_DEVICE_BLOCK pDevice, PLM_UINT8 pBufferVirt,
	    LM_PHYSICAL_ADDRESS BufferPhy, LM_UINT32 BufferSize)
{
	int j;
	LM_UINT32 *ptr;
	int dma_success = 0;

	if (T3_ASIC_REV (pDevice->ChipRevId) != T3_ASIC_REV_5700 &&
	    T3_ASIC_REV (pDevice->ChipRevId) != T3_ASIC_REV_5701) {
		return LM_STATUS_SUCCESS;
	}
	while (!dma_success) {
		/* Fill data with incremental patterns */
		ptr = (LM_UINT32 *) pBufferVirt;
		for (j = 0; j < BufferSize / 4; j++)
			*ptr++ = j;

		if (t3_do_dma (pDevice, BufferPhy, BufferSize, 1) ==
		    LM_STATUS_FAILURE) {
			return LM_STATUS_FAILURE;
		}

		MM_Wait (40);
		ptr = (LM_UINT32 *) pBufferVirt;
		/* Fill data with zero */
		for (j = 0; j < BufferSize / 4; j++)
			*ptr++ = 0;

		if (t3_do_dma (pDevice, BufferPhy, BufferSize, 0) ==
		    LM_STATUS_FAILURE) {
			return LM_STATUS_FAILURE;
		}

		MM_Wait (40);
		/* Check for data */
		ptr = (LM_UINT32 *) pBufferVirt;
		for (j = 0; j < BufferSize / 4; j++) {
			if (*ptr++ != j) {
				if ((pDevice->
				     DmaReadWriteCtrl &
				     DMA_CTRL_WRITE_BOUNDARY_MASK)
				    == DMA_CTRL_WRITE_BOUNDARY_DISABLE) {
					pDevice->DmaReadWriteCtrl =
					    (pDevice->
					     DmaReadWriteCtrl &
					     ~DMA_CTRL_WRITE_BOUNDARY_MASK) |
					    DMA_CTRL_WRITE_BOUNDARY_16;
					REG_WR (pDevice,
						PciCfg.DmaReadWriteCtrl,
						pDevice->DmaReadWriteCtrl);
					break;
				} else {
					return LM_STATUS_FAILURE;
				}
			}
		}
		if (j == (BufferSize / 4))
			dma_success = 1;
	}
	return LM_STATUS_SUCCESS;
}
