/******************************************************************************/ /* */ /* 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: */ /* 02/25/00 Hav Khauv Initial version. */ /******************************************************************************/ #ifndef LM_H #define LM_H #include "bcm570x_queue.h" #include "bcm570x_bits.h" /******************************************************************************/ /* Basic types. */ /******************************************************************************/ typedef char LM_CHAR, *PLM_CHAR; typedef unsigned int LM_UINT, *PLM_UINT; typedef unsigned char LM_UINT8, *PLM_UINT8; typedef unsigned short LM_UINT16, *PLM_UINT16; typedef unsigned int LM_UINT32, *PLM_UINT32; typedef unsigned int LM_COUNTER, *PLM_COUNTER; typedef void LM_VOID, *PLM_VOID; typedef char LM_BOOL, *PLM_BOOL; /* 64bit value. */ typedef struct { #ifdef BIG_ENDIAN_HOST LM_UINT32 High; LM_UINT32 Low; #else /* BIG_ENDIAN_HOST */ LM_UINT32 Low; LM_UINT32 High; #endif /* !BIG_ENDIAN_HOST */ } LM_UINT64, *PLM_UINT64; typedef LM_UINT64 LM_PHYSICAL_ADDRESS, *PLM_PHYSICAL_ADDRESS; /* void LM_INC_PHYSICAL_ADDRESS(PLM_PHYSICAL_ADDRESS pAddr,LM_UINT32 IncSize) */ #define LM_INC_PHYSICAL_ADDRESS(pAddr, IncSize) \ { \ LM_UINT32 OrgLow; \ \ OrgLow = (pAddr)->Low; \ (pAddr)->Low += IncSize; \ if((pAddr)->Low < OrgLow) { \ (pAddr)->High++; /* Wrap around. */ \ } \ } #ifndef NULL #define NULL ((void *) 0) #endif /* NULL */ #ifndef OFFSETOF #define OFFSETOF(_s, _m) (MM_UINT_PTR(&(((_s *) 0)->_m))) #endif /* OFFSETOF */ /******************************************************************************/ /* Simple macros. */ /******************************************************************************/ #define IS_ETH_BROADCAST(_pEthAddr) \ (((unsigned char *) (_pEthAddr))[0] == ((unsigned char) 0xff)) #define IS_ETH_MULTICAST(_pEthAddr) \ (((unsigned char *) (_pEthAddr))[0] & ((unsigned char) 0x01)) #define IS_ETH_ADDRESS_EQUAL(_pEtherAddr1, _pEtherAddr2) \ ((((unsigned char *) (_pEtherAddr1))[0] == \ ((unsigned char *) (_pEtherAddr2))[0]) && \ (((unsigned char *) (_pEtherAddr1))[1] == \ ((unsigned char *) (_pEtherAddr2))[1]) && \ (((unsigned char *) (_pEtherAddr1))[2] == \ ((unsigned char *) (_pEtherAddr2))[2]) && \ (((unsigned char *) (_pEtherAddr1))[3] == \ ((unsigned char *) (_pEtherAddr2))[3]) && \ (((unsigned char *) (_pEtherAddr1))[4] == \ ((unsigned char *) (_pEtherAddr2))[4]) && \ (((unsigned char *) (_pEtherAddr1))[5] == \ ((unsigned char *) (_pEtherAddr2))[5])) #define COPY_ETH_ADDRESS(_Src, _Dst) \ ((unsigned char *) (_Dst))[0] = ((unsigned char *) (_Src))[0]; \ ((unsigned char *) (_Dst))[1] = ((unsigned char *) (_Src))[1]; \ ((unsigned char *) (_Dst))[2] = ((unsigned char *) (_Src))[2]; \ ((unsigned char *) (_Dst))[3] = ((unsigned char *) (_Src))[3]; \ ((unsigned char *) (_Dst))[4] = ((unsigned char *) (_Src))[4]; \ ((unsigned char *) (_Dst))[5] = ((unsigned char *) (_Src))[5]; /******************************************************************************/ /* Constants. */ /******************************************************************************/ #define ETHERNET_ADDRESS_SIZE 6 #define ETHERNET_PACKET_HEADER_SIZE 14 #define MIN_ETHERNET_PACKET_SIZE 64 /* with 4 byte crc. */ #define MAX_ETHERNET_PACKET_SIZE 1518 /* with 4 byte crc. */ #define MIN_ETHERNET_PACKET_SIZE_NO_CRC 60 #define MAX_ETHERNET_PACKET_SIZE_NO_CRC 1514 #define MAX_ETHERNET_PACKET_BUFFER_SIZE 1536 /* A nice even number. */ #ifndef LM_MAX_MC_TABLE_SIZE #define LM_MAX_MC_TABLE_SIZE 32 #endif /* LM_MAX_MC_TABLE_SIZE */ #define LM_MC_ENTRY_SIZE (ETHERNET_ADDRESS_SIZE+1) #define LM_MC_INSTANCE_COUNT_INDEX (LM_MC_ENTRY_SIZE-1) /* Receive filter masks. */ #define LM_ACCEPT_UNICAST 0x0001 #define LM_ACCEPT_MULTICAST 0x0002 #define LM_ACCEPT_ALL_MULTICAST 0x0004 #define LM_ACCEPT_BROADCAST 0x0008 #define LM_ACCEPT_ERROR_PACKET 0x0010 #define LM_PROMISCUOUS_MODE 0x10000 /******************************************************************************/ /* PCI registers. */ /******************************************************************************/ #define PCI_VENDOR_ID_REG 0x00 #define PCI_DEVICE_ID_REG 0x02 #define PCI_COMMAND_REG 0x04 #define PCI_IO_SPACE_ENABLE 0x0001 #define PCI_MEM_SPACE_ENABLE 0x0002 #define PCI_BUSMASTER_ENABLE 0x0004 #define PCI_MEMORY_WRITE_INVALIDATE 0x0010 #define PCI_PARITY_ERROR_ENABLE 0x0040 #define PCI_SYSTEM_ERROR_ENABLE 0x0100 #define PCI_FAST_BACK_TO_BACK_ENABLE 0x0200 #define PCI_STATUS_REG 0x06 #define PCI_REV_ID_REG 0x08 #define PCI_CACHE_LINE_SIZE_REG 0x0c #define PCI_IO_BASE_ADDR_REG 0x10 #define PCI_IO_BASE_ADDR_MASK 0xfffffff0 #define PCI_MEM_BASE_ADDR_LOW 0x10 #define PCI_MEM_BASE_ADDR_HIGH 0x14 #define PCI_SUBSYSTEM_VENDOR_ID_REG 0x2c #define PCI_SUBSYSTEM_ID_REG 0x2e #define PCI_INT_LINE_REG 0x3c #define PCIX_CAP_REG 0x40 #define PCIX_ENABLE_RELAXED_ORDERING BIT_17 /******************************************************************************/ /* Fragment structure. */ /******************************************************************************/ typedef struct { LM_UINT32 FragSize; LM_PHYSICAL_ADDRESS FragBuf; } LM_FRAG, *PLM_FRAG; typedef struct { /* FragCount is initialized for the caller to the maximum array size, on */ /* return FragCount is the number of the actual fragments in the array. */ LM_UINT32 FragCount; /* Total buffer size. */ LM_UINT32 TotalSize; /* Fragment array buffer. */ LM_FRAG Fragments[1]; } LM_FRAG_LIST, *PLM_FRAG_LIST; #define DECLARE_FRAG_LIST_BUFFER_TYPE(_FRAG_LIST_TYPE_NAME, _MAX_FRAG_COUNT) \ typedef struct { \ LM_FRAG_LIST FragList; \ LM_FRAG FragListBuffer[_MAX_FRAG_COUNT-1]; \ } _FRAG_LIST_TYPE_NAME, *P##_FRAG_LIST_TYPE_NAME /******************************************************************************/ /* Status codes. */ /******************************************************************************/ #define LM_STATUS_SUCCESS 0 #define LM_STATUS_FAILURE 1 #define LM_STATUS_INTERRUPT_ACTIVE 2 #define LM_STATUS_INTERRUPT_NOT_ACTIVE 3 #define LM_STATUS_LINK_ACTIVE 4 #define LM_STATUS_LINK_DOWN 5 #define LM_STATUS_LINK_SETTING_MISMATCH 6 #define LM_STATUS_TOO_MANY_FRAGMENTS 7 #define LM_STATUS_TRANSMIT_ABORTED 8 #define LM_STATUS_TRANSMIT_ERROR 9 #define LM_STATUS_RECEIVE_ABORTED 10 #define LM_STATUS_RECEIVE_ERROR 11 #define LM_STATUS_INVALID_PACKET_SIZE 12 #define LM_STATUS_OUT_OF_MAP_REGISTERS 13 #define LM_STATUS_UNKNOWN_ADAPTER 14 typedef LM_UINT LM_STATUS, *PLM_STATUS; /******************************************************************************/ /* Requested media type. */ /******************************************************************************/ #define LM_REQUESTED_MEDIA_TYPE_AUTO 0 #define LM_REQUESTED_MEDIA_TYPE_BNC 1 #define LM_REQUESTED_MEDIA_TYPE_UTP_AUTO 2 #define LM_REQUESTED_MEDIA_TYPE_UTP_10MBPS 3 #define LM_REQUESTED_MEDIA_TYPE_UTP_10MBPS_FULL_DUPLEX 4 #define LM_REQUESTED_MEDIA_TYPE_UTP_100MBPS 5 #define LM_REQUESTED_MEDIA_TYPE_UTP_100MBPS_FULL_DUPLEX 6 #define LM_REQUESTED_MEDIA_TYPE_UTP_1000MBPS 7 #define LM_REQUESTED_MEDIA_TYPE_UTP_1000MBPS_FULL_DUPLEX 8 #define LM_REQUESTED_MEDIA_TYPE_FIBER_100MBPS 9 #define LM_REQUESTED_MEDIA_TYPE_FIBER_100MBPS_FULL_DUPLEX 10 #define LM_REQUESTED_MEDIA_TYPE_FIBER_1000MBPS 11 #define LM_REQUESTED_MEDIA_TYPE_FIBER_1000MBPS_FULL_DUPLEX 12 #define LM_REQUESTED_MEDIA_TYPE_MAC_LOOPBACK 0xfffe #define LM_REQUESTED_MEDIA_TYPE_PHY_LOOPBACK 0xffff typedef LM_UINT32 LM_REQUESTED_MEDIA_TYPE, *PLM_REQUESTED_MEDIA_TYPE; /******************************************************************************/ /* Media type. */ /******************************************************************************/ #define LM_MEDIA_TYPE_UNKNOWN -1 #define LM_MEDIA_TYPE_AUTO 0 #define LM_MEDIA_TYPE_UTP 1 #define LM_MEDIA_TYPE_BNC 2 #define LM_MEDIA_TYPE_AUI 3 #define LM_MEDIA_TYPE_FIBER 4 typedef LM_UINT32 LM_MEDIA_TYPE, *PLM_MEDIA_TYPE; /******************************************************************************/ /* Line speed. */ /******************************************************************************/ #define LM_LINE_SPEED_UNKNOWN 0 #define LM_LINE_SPEED_10MBPS 1 #define LM_LINE_SPEED_100MBPS 2 #define LM_LINE_SPEED_1000MBPS 3 typedef LM_UINT32 LM_LINE_SPEED, *PLM_LINE_SPEED; /******************************************************************************/ /* Duplex mode. */ /******************************************************************************/ #define LM_DUPLEX_MODE_UNKNOWN 0 #define LM_DUPLEX_MODE_HALF 1 #define LM_DUPLEX_MODE_FULL 2 typedef LM_UINT32 LM_DUPLEX_MODE, *PLM_DUPLEX_MODE; /******************************************************************************/ /* Power state. */ /******************************************************************************/ #define LM_POWER_STATE_D0 0 #define LM_POWER_STATE_D1 1 #define LM_POWER_STATE_D2 2 #define LM_POWER_STATE_D3 3 typedef LM_UINT32 LM_POWER_STATE, *PLM_POWER_STATE; /******************************************************************************/ /* Task offloading. */ /******************************************************************************/ #define LM_TASK_OFFLOAD_NONE 0x0000 #define LM_TASK_OFFLOAD_TX_IP_CHECKSUM 0x0001 #define LM_TASK_OFFLOAD_RX_IP_CHECKSUM 0x0002 #define LM_TASK_OFFLOAD_TX_TCP_CHECKSUM 0x0004 #define LM_TASK_OFFLOAD_RX_TCP_CHECKSUM 0x0008 #define LM_TASK_OFFLOAD_TX_UDP_CHECKSUM 0x0010 #define LM_TASK_OFFLOAD_RX_UDP_CHECKSUM 0x0020 #define LM_TASK_OFFLOAD_TCP_SEGMENTATION 0x0040 typedef LM_UINT32 LM_TASK_OFFLOAD, *PLM_TASK_OFFLOAD; /******************************************************************************/ /* Flow control. */ /******************************************************************************/ #define LM_FLOW_CONTROL_NONE 0x00 #define LM_FLOW_CONTROL_RECEIVE_PAUSE 0x01 #define LM_FLOW_CONTROL_TRANSMIT_PAUSE 0x02 #define LM_FLOW_CONTROL_RX_TX_PAUSE (LM_FLOW_CONTROL_RECEIVE_PAUSE | \ LM_FLOW_CONTROL_TRANSMIT_PAUSE) /* This value can be or-ed with RECEIVE_PAUSE and TRANSMIT_PAUSE. If the */ /* auto-negotiation is disabled and the RECEIVE_PAUSE and TRANSMIT_PAUSE */ /* bits are set, then flow control is enabled regardless of link partner's */ /* flow control capability. */ #define LM_FLOW_CONTROL_AUTO_PAUSE 0x80000000 typedef LM_UINT32 LM_FLOW_CONTROL, *PLM_FLOW_CONTROL; /******************************************************************************/ /* Wake up mode. */ /******************************************************************************/ #define LM_WAKE_UP_MODE_NONE 0 #define LM_WAKE_UP_MODE_MAGIC_PACKET 1 #define LM_WAKE_UP_MODE_NWUF 2 #define LM_WAKE_UP_MODE_LINK_CHANGE 4 typedef LM_UINT32 LM_WAKE_UP_MODE, *PLM_WAKE_UP_MODE; /******************************************************************************/ /* Counters. */ /******************************************************************************/ #define LM_COUNTER_FRAMES_XMITTED_OK 0 #define LM_COUNTER_FRAMES_RECEIVED_OK 1 #define LM_COUNTER_ERRORED_TRANSMIT_COUNT 2 #define LM_COUNTER_ERRORED_RECEIVE_COUNT 3 #define LM_COUNTER_RCV_CRC_ERROR 4 #define LM_COUNTER_ALIGNMENT_ERROR 5 #define LM_COUNTER_SINGLE_COLLISION_FRAMES 6 #define LM_COUNTER_MULTIPLE_COLLISION_FRAMES 7 #define LM_COUNTER_FRAMES_DEFERRED 8 #define LM_COUNTER_MAX_COLLISIONS 9 #define LM_COUNTER_RCV_OVERRUN 10 #define LM_COUNTER_XMIT_UNDERRUN 11 #define LM_COUNTER_UNICAST_FRAMES_XMIT 12 #define LM_COUNTER_MULTICAST_FRAMES_XMIT 13 #define LM_COUNTER_BROADCAST_FRAMES_XMIT 14 #define LM_COUNTER_UNICAST_FRAMES_RCV 15 #define LM_COUNTER_MULTICAST_FRAMES_RCV 16 #define LM_COUNTER_BROADCAST_FRAMES_RCV 17 typedef LM_UINT32 LM_COUNTER_TYPE, *PLM_COUNTER_TYPE; /******************************************************************************/ /* Forward definition. */ /******************************************************************************/ typedef struct _LM_DEVICE_BLOCK *PLM_DEVICE_BLOCK; typedef struct _LM_PACKET *PLM_PACKET; /******************************************************************************/ /* Function prototypes. */ /******************************************************************************/ LM_STATUS LM_GetAdapterInfo(PLM_DEVICE_BLOCK pDevice); LM_STATUS LM_InitializeAdapter(PLM_DEVICE_BLOCK pDevice); LM_STATUS LM_ResetAdapter(PLM_DEVICE_BLOCK pDevice); LM_STATUS LM_DisableInterrupt(PLM_DEVICE_BLOCK pDevice); LM_STATUS LM_EnableInterrupt(PLM_DEVICE_BLOCK pDevice); LM_STATUS LM_SendPacket(PLM_DEVICE_BLOCK pDevice, PLM_PACKET pPacket); LM_STATUS LM_ServiceInterrupts(PLM_DEVICE_BLOCK pDevice); LM_STATUS LM_QueueRxPackets(PLM_DEVICE_BLOCK pDevice); LM_STATUS LM_SetReceiveMask(PLM_DEVICE_BLOCK pDevice, LM_UINT32 Mask); LM_STATUS LM_Halt(PLM_DEVICE_BLOCK pDevice); LM_STATUS LM_Abort(PLM_DEVICE_BLOCK pDevice); LM_STATUS LM_MulticastAdd(PLM_DEVICE_BLOCK pDevice, PLM_UINT8 pMcAddress); LM_STATUS LM_MulticastDel(PLM_DEVICE_BLOCK pDevice, PLM_UINT8 pMcAddress); LM_STATUS LM_MulticastClear(PLM_DEVICE_BLOCK pDevice); LM_STATUS LM_SetMacAddress(PLM_DEVICE_BLOCK pDevice, PLM_UINT8 pMacAddress); LM_STATUS LM_LoopbackAddress(PLM_DEVICE_BLOCK pDevice, PLM_UINT8 pAddress); LM_UINT32 LM_GetCrcCounter(PLM_DEVICE_BLOCK pDevice); LM_WAKE_UP_MODE LM_PMCapabilities(PLM_DEVICE_BLOCK pDevice); LM_STATUS LM_NwufAdd(PLM_DEVICE_BLOCK pDevice, LM_UINT32 ByteMaskSize, LM_UINT8 *pByteMask, LM_UINT8 *pPattern); LM_STATUS LM_NwufRemove(PLM_DEVICE_BLOCK pDevice, LM_UINT32 ByteMaskSize, LM_UINT8 *pByteMask, LM_UINT8 *pPattern); LM_STATUS LM_SetPowerState(PLM_DEVICE_BLOCK pDevice, LM_POWER_STATE PowerLevel); LM_VOID LM_ReadPhy(PLM_DEVICE_BLOCK pDevice, LM_UINT32 PhyReg, PLM_UINT32 pData32); LM_VOID LM_WritePhy(PLM_DEVICE_BLOCK pDevice, LM_UINT32 PhyReg, LM_UINT32 Data32); LM_STATUS LM_ControlLoopBack(PLM_DEVICE_BLOCK pDevice, LM_UINT32 Control); LM_STATUS LM_SetupPhy(PLM_DEVICE_BLOCK pDevice); int LM_BlinkLED(PLM_DEVICE_BLOCK pDevice, LM_UINT32 BlinkDuration); /******************************************************************************/ /* These are the OS specific functions called by LMAC. */ /******************************************************************************/ LM_STATUS MM_ReadConfig16(PLM_DEVICE_BLOCK pDevice, LM_UINT32 Offset, LM_UINT16 *pValue16); LM_STATUS MM_WriteConfig16(PLM_DEVICE_BLOCK pDevice, LM_UINT32 Offset, LM_UINT16 Value16); LM_STATUS MM_ReadConfig32(PLM_DEVICE_BLOCK pDevice, LM_UINT32 Offset, LM_UINT32 *pValue32); LM_STATUS MM_WriteConfig32(PLM_DEVICE_BLOCK pDevice, LM_UINT32 Offset, LM_UINT32 Value32); LM_STATUS MM_MapMemBase(PLM_DEVICE_BLOCK pDevice); LM_STATUS MM_MapIoBase(PLM_DEVICE_BLOCK pDevice); LM_STATUS MM_IndicateRxPackets(PLM_DEVICE_BLOCK pDevice); LM_STATUS MM_IndicateTxPackets(PLM_DEVICE_BLOCK pDevice); LM_STATUS MM_StartTxDma(PLM_DEVICE_BLOCK pDevice, PLM_PACKET pPacket); LM_STATUS MM_CompleteTxDma(PLM_DEVICE_BLOCK pDevice, PLM_PACKET pPacket); LM_STATUS MM_AllocateMemory(PLM_DEVICE_BLOCK pDevice, LM_UINT32 BlockSize, PLM_VOID *pMemoryBlockVirt); LM_STATUS MM_AllocateSharedMemory(PLM_DEVICE_BLOCK pDevice, LM_UINT32 BlockSize, PLM_VOID *pMemoryBlockVirt, PLM_PHYSICAL_ADDRESS pMemoryBlockPhy, LM_BOOL Cached); LM_STATUS MM_GetConfig(PLM_DEVICE_BLOCK pDevice); LM_STATUS MM_IndicateStatus(PLM_DEVICE_BLOCK pDevice, LM_STATUS Status); LM_STATUS MM_InitializeUmPackets(PLM_DEVICE_BLOCK pDevice); LM_STATUS MM_FreeRxBuffer(PLM_DEVICE_BLOCK pDevice, PLM_PACKET pPacket); LM_STATUS MM_CoalesceTxBuffer(PLM_DEVICE_BLOCK pDevice, PLM_PACKET pPacket); LM_STATUS LM_MbufWorkAround(PLM_DEVICE_BLOCK pDevice); LM_STATUS LM_SetLinkSpeed(PLM_DEVICE_BLOCK pDevice, LM_REQUESTED_MEDIA_TYPE RequestedMediaType); #if INCLUDE_5703_A0_FIX LM_STATUS LM_Load5703DmaWFirmware(PLM_DEVICE_BLOCK pDevice); #endif #endif /* LM_H */