/******************************************************************************/
/*                                                                            */
/* 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>
#if defined(CONFIG_CMD_NET) && !defined(CONFIG_NET_MULTI) && \
	defined(CONFIG_TIGON3)
#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, pDevice->NodeAddress);

	/* 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, pDevice->NodeAddress);

	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, PLM_UINT8 pMacAddress)
{
	LM_UINT32 j;

	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;
}

#endif
