/******************************************************************************/
/*                                                                            */
/* 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 /* CFG_CMD_NET, !CONFIG_NET_MULTI, CONFIG_TIGON3 */
