?? motfccend.c
字號:
The only adjustable parameters are the number of TBDs and RBDs that will becreated at run-time. These parameters are given to the driver when motFccEndLoad() is called. There is one RBD associated with each received frame whereas a single transmit packet normally uses more than one TBD. For memory-limited applications, decreasing the number of RBDs may be desirable. Decreasing the number of TBDs below a certain point will provide substantial performance degradation, and is not reccomended. An adequate number of loaning buffers are also pre-allocated to provide more buffering before packets are dropped, but this is not configurable.The relative priority of the netTask and of the other tasks in the systemmay heavily affect performance of this driver. Usually the best performance is achieved when the netTask priority equals that of the other applications using the driver.SPECIAL CONSIDERATIONSSEE ALSO: ifLib,.I "MPC8260 Fast Ethernet Controller (Supplement to the MPC860 User's Manual)".I "Motorola MPC860 User's Manual",INTERNALThis driver contains conditional compilation switch MOT_FCC_DBG.If defined, adds debug output routines. Output is furtherselectable at run-time via the motFccEndDbg global variable.*/#include "vxWorks.h"#include "wdLib.h"#include "iv.h"#include "vme.h"#include "net/mbuf.h"#include "net/unixLib.h"#include "net/protosw.h"#include "sys/socket.h"#include "sys/ioctl.h"#include "errno.h"#include "memLib.h"#include "intLib.h"#include "net/route.h"#include "iosLib.h"#include "errnoLib.h"#include "vxLib.h"#include "private/funcBindP.h"#include "cacheLib.h"#include "logLib.h"#include "netLib.h"#include "stdio.h"#include "stdlib.h"#include "sysLib.h"#include "taskLib.h"#include "etherLib.h"#include "net/systm.h"#include "sys/times.h"#include "net/if_subr.h"#undef ETHER_MAP_IP_MULTICAST#include "etherMultiLib.h"#include "end.h"#include "semLib.h"#define END_MACROS#include "endLib.h"#include "miiLib.h"#include "lstLib.h"#include "m8260Int.h"#include "motFccEnd.h"#include "drvver.h"/* defines */#undef MOT_FCC_ZERO_COPY/* Driver debug control *//* for debugging */#define MOT_FCC_DBG #ifdef MOT_FCC_DBG #undef MOT_FCC_DBG #endif/* suwp *//* Driver debug control */#ifdef MOT_FCC_DBG#define MOT_FCC_DBG_OFF 0x0000#define MOT_FCC_DBG_RX 0x0001#define MOT_FCC_DBG_TX 0x0002#define MOT_FCC_DBG_POLL 0x0004#define MOT_FCC_DBG_MII 0x0008#define MOT_FCC_DBG_LOAD 0x0010#define MOT_FCC_DBG_IOCTL 0x0020#define MOT_FCC_DBG_INT 0x0040#define MOT_FCC_DBG_START 0x0080#define MOT_FCC_DBG_ANY 0xffffUINT32 motFccEndDbg = 0x00; UINT32 motFccRxBsyErr = 0x0;UINT32 motFccTxErr = 0x0;UINT32 motFccHbFailErr = 0x0;UINT32 motFccTxLcErr = 0x0;UINT32 motFccTxUrErr = 0x0;UINT32 motFccTxCslErr = 0x0;UINT32 motFccTxRlErr = 0x0;UINT32 motFccRxLgErr = 0x0;UINT32 motFccRxNoErr = 0x0;UINT32 motFccRxCrcErr = 0x0;UINT32 motFccRxOvErr = 0x0;UINT32 motFccRxShErr = 0x0;UINT32 motFccRxLcErr = 0x0;UINT32 motFccRxMemErr = 0x0;DRV_CTRL * pDrvCtrlDbg = NULL;#define MOT_FCC_RX_BSY_ADD \ motFccRxBsyErr++;#define MOT_FCC_TX_ERR_ADD \ motFccTxErr++;#define MOT_FCC_HB_FAIL_ADD \ motFccHbFailErr++;#define MOT_FCC_TX_LC_ADD \ motFccTxLcErr++;#define MOT_FCC_TX_UR_ADD \ motFccTxUrErr++;#define MOT_FCC_TX_CSL_ADD \ motFccTxCslErr++;#define MOT_FCC_TX_RL_ADD \ motFccTxRlErr++;#define MOT_FCC_RX_LG_ADD \ motFccRxLgErr++;#define MOT_FCC_RX_NO_ADD \ motFccRxNoErr++;#define MOT_FCC_RX_CRC_ADD \ motFccRxCrcErr++;#define MOT_FCC_RX_OV_ADD \ motFccRxOvErr++;#define MOT_FCC_RX_LC_ADD \ motFccRxLcErr++;#define MOT_FCC_RX_SH_ADD \ motFccRxShErr++;#define MOT_FCC_RX_MEM_ADD \ motFccRxMemErr++;#define MOT_FCC_LOG(FLG, X0, X1, X2, X3, X4, X5, X6) \ { \ if (motFccEndDbg & FLG) \ if (_func_logMsg != NULL) \ _func_logMsg (X0, X1, X2, X3, X4, X5, X6); \ }#else /* MOT_FCC_DBG */#define MOT_FCC_RX_BSY_ADD#define MOT_FCC_TX_ERR_ADD#define MOT_FCC_HB_FAIL_ADD#define MOT_FCC_TX_LC_ADD#define MOT_FCC_TX_UR_ADD#define MOT_FCC_TX_CSL_ADD#define MOT_FCC_TX_RL_ADD#define MOT_FCC_RX_MEM_ADD#define MOT_FCC_LOG(FLG, X0, X1, X2, X3, X4, X5, X6)#endif /* MOT_FCC_DBG *//* general macros for reading/writing from/to specified locations *//* Cache and virtual/physical memory related macros */#define MOT_FCC_PHYS_TO_VIRT(physAddr) \ CACHE_DRV_PHYS_TO_VIRT (&pDrvCtrl->bdCacheFuncs, (char *)(physAddr))#define MOT_FCC_VIRT_TO_PHYS(virtAddr) \ CACHE_DRV_VIRT_TO_PHYS (&pDrvCtrl->bdCacheFuncs, (char *)(virtAddr))#define MOT_FCC_BD_CACHE_INVAL(address, len) \ CACHE_DRV_INVALIDATE (&pDrvCtrl->bdCacheFuncs, (address), (len))#define MOT_FCC_CACHE_INVAL(address, len) \ CACHE_DRV_INVALIDATE (&pDrvCtrl->bufCacheFuncs, (address), (len))#define MOT_FCC_CACHE_FLUSH(address, len) \ CACHE_DRV_FLUSH (&pDrvCtrl->bufCacheFuncs, (address), (len))#undef EIEIO_SYNC#define EIEIO_SYNC __asm__(" eieio; sync")#if (CPU_FAMILY==PPC)# undef CACHE_PIPE_FLUSH# define CACHE_PIPE_FLUSH() EIEIO_SYNC#endif/* driver flags */#define MOT_FCC_OWN_BUF_MEM 0x01 /* internally provided memory for data*/#define MOT_FCC_INV_TBD_NUM 0x02 /* invalid tbdNum provided */#define MOT_FCC_INV_RBD_NUM 0x04 /* invalid rbdNum provided */#define MOT_FCC_POLLING 0x08 /* polling mode */#define MOT_FCC_PROM 0x20 /* promiscuous mode */#define MOT_FCC_MCAST 0x40 /* multicast addressing mode */#define MOT_FCC_FD 0x80 /* full duplex mode */#define MOT_FCC_OWN_BD_MEM 0x10 /* internally provided memory for BDs *//* shortcuts */#define MOT_FCC_FLAG_CLEAR(clearBits) \ (pDrvCtrl->flags &= ~(clearBits))#define MOT_FCC_FLAG_SET(setBits) \ (pDrvCtrl->flags |= (setBits))#define MOT_FCC_FLAG_GET() \ (pDrvCtrl->flags)#define MOT_FCC_FLAG_ISSET(setBits) \ (pDrvCtrl->flags & (setBits))#define MOT_FCC_PHY_FLAGS_SET(setBits) \ (pDrvCtrl->phyInfo->phyFlags |= (setBits))#define MOT_FCC_PHY_FLAGS_ISSET(setBits) \ (pDrvCtrl->phyInfo->phyFlags & (setBits))#define MOT_FCC_PHY_FLAGS_GET(setBits) \ (pDrvCtrl->phyInfo->phyFlags)#define MOT_FCC_PHY_FLAGS_CLEAR(clearBits) \ (pDrvCtrl->phyInfo->phyFlags &= ~(clearBits))#define MOT_FCC_USR_FLAG_ISSET(setBits) \ (pDrvCtrl->userFlags & (setBits))#define END_FLAGS_ISSET(setBits) \ ((&pDrvCtrl->endObj)->flags & (setBits))#define MOT_FCC_ADDR_GET(pEnd) \ ((pEnd)->mib2Tbl.ifPhysAddress.phyAddress)#define MOT_FCC_ADDR_LEN_GET(pEnd) \ ((pEnd)->mib2Tbl.ifPhysAddress.addrLength)/* some BDs definitions *//* * the total is 0x630 and it accounts for the required alignment * of receive data buffers, and the cluster overhead. */#define MOT_FCC_MAX_CL_LEN ((MII_ETH_MAX_PCK_SZ \ + (MOT_FCC_BUF_ALIGN - 1) \ + MOT_FCC_BUF_ALIGN \ + (CL_OVERHEAD - 1)) \ & (~ (CL_OVERHEAD - 1)))#define MOT_FCC_RX_CL_SZ (MOT_FCC_MAX_CL_LEN)#define MOT_FCC_TX_CL_SZ (MOT_FCC_MAX_CL_LEN)#define MOT_FCC_BUF_MEM_SZ(pDrvCtrl) \ ((pDrvCtrl)->bufSize)#define MOT_FCC_BD_MEM_SZ(pDrvCtrl) \ ((pDrvCtrl)->bdSize)#define MOT_FCC_LOAN_SZ \ (MOT_FCC_RX_CL_SZ * MOT_FCC_BD_LOAN_NUM)#define MOT_FCC_RX_MEM_SZ(pDrvCtrl) \ (MOT_FCC_RX_CL_SZ * ((pDrvCtrl)->rbdNum + MOT_FCC_BD_LOAN_NUM))#define MOT_FCC_TX_MEM_SZ(pDrvCtrl) \ (MOT_FCC_TX_CL_SZ * (MOT_FCC_TX_POLL_NUM + MOT_FCC_TX_CL_NUM))#define MOT_FCC_TBD_MEM(pDrvCtrl) \ (MOT_FCC_TBD_SZ * (pDrvCtrl)->tbdNum)#define MOT_FCC_RBD_MEM(pDrvCtrl) \ (MOT_FCC_RBD_SZ * (pDrvCtrl)->rbdNum)#define MOT_FCC_BD_MEM(pDrvCtrl) \ (MOT_FCC_TBD_MEM (pDrvCtrl) + MOT_FCC_RBD_MEM (pDrvCtrl))/* read/write macros to access internal memory */#define MOT_FCC_REG_LONG_WR(regAddr, regVal) \ { \ UINT32 temp = 0; \ \ temp = (UINT32) MOT_FCC_VIRT_TO_PHYS (regAddr); \ \ MOT_FCC_LONG_WR ((UINT32 *) (temp), (regVal)); \ } #define MOT_FCC_REG_LONG_RD(regAddr, regVal) \ { \ UINT32 temp = 0; \ \ temp = (UINT32) MOT_FCC_VIRT_TO_PHYS (regAddr); \ \ MOT_FCC_LONG_RD ((UINT32 *) (temp), (regVal)); \ } #define MOT_FCC_REG_WORD_WR(regAddr, regVal) \ { \ UINT32 temp = 0; \ \ temp = (UINT32) MOT_FCC_VIRT_TO_PHYS (regAddr); \ \ MOT_FCC_WORD_WR ((UINT16 *) (temp), (regVal)); \ } #define MOT_FCC_REG_WORD_RD(regAddr, regVal) \ { \ UINT32 temp = 0; \ \ temp = (UINT32) MOT_FCC_VIRT_TO_PHYS (regAddr); \ \ MOT_FCC_WORD_RD ((UINT16 *) (temp), (regVal)); \ } /* macros to read/write tx/rx buffer descriptors */#define MOT_FCC_BD_WORD_WR(bdAddr, bdOff, bdVal) \ { \ UINT32 temp = 0; \ \ temp = (UINT32) MOT_FCC_VIRT_TO_PHYS ((bdAddr) + (bdOff)); \ \ MOT_FCC_WORD_WR ((UINT16 *) (temp), (bdVal)); \ } /* here we're writing the data pointer, so it's a physical address */#define MOT_FCC_BD_LONG_WR(bdAddr, bdOff, bdVal) \ { \ UINT32 temp1 = 0; \ UINT32 temp2 = 0; \ \ temp1 = (UINT32) MOT_FCC_VIRT_TO_PHYS ((bdAddr) + (bdOff)); \ temp2 = (UINT32) MOT_FCC_VIRT_TO_PHYS (bdVal); \ \ MOT_FCC_LONG_WR ((UINT32 *) (temp1), (temp2)); \ } #define MOT_FCC_BD_WORD_RD(bdAddr, bdOff, bdVal) \ { \ UINT32 temp = 0; \ \ temp = (UINT32) MOT_FCC_VIRT_TO_PHYS ((bdAddr) + (bdOff)); \ \ MOT_FCC_WORD_RD ((UINT16 *) (temp), (bdVal)); \ } #define MOT_FCC_BD_LONG_RD(bdAddr, bdOff, bdVal) \ { \ UINT32 temp1 = 0; \ UINT32 temp2 = 0; \ \ temp1 = (UINT32) MOT_FCC_VIRT_TO_PHYS ((bdAddr) + (bdOff)); \ \ MOT_FCC_LONG_RD ((UINT32 *) (temp1), (temp2)); \ \ bdVal = (char *) MOT_FCC_PHYS_TO_VIRT (temp2); \ } #define MOT_FCC_NEXT_TBD(pDrvCtrl, pTbd) \ (pTbd) = (MOT_FCC_TBD_ID) ((pDrvCtrl)->tbdBase + \ ((pDrvCtrl)->tbdIndex * MOT_FCC_TBD_SZ))#define MOT_FCC_USED_TBD(pDrvCtrl, pTbd) \ (pTbd) = (MOT_FCC_TBD_ID) ((pDrvCtrl)->tbdBase + \ ((pDrvCtrl)->usedTbdIndex * MOT_FCC_TBD_SZ))#define MOT_FCC_NEXT_RBD(pDrvCtrl, pRbd) \
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -