⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m8260fccend.c

📁 Embedded Planet公司的ep8260单板计算机的BSP包(VxWorks)
💻 C
📖 第 1 页 / 共 5 页
字号:
this variable to his own media initialization routine, tipically
in sysHwInit().
.IP `_func_motFccHbFail'
.CS
    FUNCPTR _func_motFccHbFail
.CE
The FCC may be configured to perform heartbeat check following end 
of transmission, and to report any fealure in the relevant TBD status field. 
If this is the case, and if the global variable `_func_motFccHbFail'
is not NULL, the routine referenced to by `_func_motFccHbFail' is called,
with a pointer to the driver control structure as parameter. Hence,
the user may set this variable to his own heart beat check fail routine,
where he can take any action he sees appropriate.
The default value for the global variable `_func_motFccHbFail' is NULL.
.LP

SYSTEM RESOURCE USAGE
If the driver allocates the memory for the BDs to share with the FCC,
it does so by calling the cacheDmaMalloc() routine.  For the default case
of 64 transmit buffers and 32 receive buffers, the total size requested 
is 776 bytes, and this includes the 8-byte alignment requirement of the 
device.  If a non-cacheable memory region is provided by the user, the 
size of this region should be this amount, unless the user has specified 
a different number of transmit or receive BDs. 

This driver can operate only if this memory region is non-cacheable
or if the hardware implements bus snooping.  The driver cannot maintain
cache coherency for the device because the BDs are asynchronously
modified by both the driver and the device, and these fields share 
the same cache line.

If the driver allocates the memory for the data buffers to share with the FCC,
it does so by calling the memalign () routine.  The driver does not need to
use cache-safe memory for data buffers, since the host CPU and the device are
not allowed to modify buffers asynchronously. The related cache lines
are flushed or invalidated as appropriate. For the default case
of 7 transmit clusters and 32 receive clusters, the total size requested 
for this memory region is 112751 bytes, and this includes the 32-byte 
alignment and the 32-byte pad-out area per buffer of the device.  If a 
non-cacheable memory region is provided by the user, the size of this region 
should be this amount, unless the user has specified a different number 
of transmit or receive BDs. 

TUNING HINTS

The only adjustable parameters are the number of TBDs and RBDs that will be
created 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 system
may 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 CONSIDERATIONS

SEE ALSO: ifLib,
.I "MPC8260 Fast Ethernet Controller (Supplement to the MPC860 User's Manual)"
.I "Motorola MPC860 User's Manual",

INTERNAL
This driver contains conditional compilation switch MOT_FCC_DBG.
If defined, adds debug output routines.  Output is further
selectable 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 "cacheLib.h"
#include "logLib.h"
#include "netLib.h"
#include "stdio.h"
#include "stdlib.h"
#include "sysLib.h"
#include "taskLib.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 "lstLib.h"
#include "miiLib.h"

#include "m8260IntrCtl.h"
#include "drv/sio/m8260Cp.h"
#include "drv/end/m8260Fcc.h"

#include "m8260FccEnd.h"
#include "sys82xxDpramLib.h"

/* defines */
/* Driver debug control */

/* for debugging */

#ifdef MOT_FCC_DBG 
#undef MOT_FCC_DBG 
#endif

/* 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_INT_RX_ERR	0x0100
#define MOT_FCC_DBG_INT_TX_ERR	0x0200
#define MOT_FCC_DBG_ANY		0xffff

UINT32	motFccEndDbg = MOT_FCC_DBG_INT_RX_ERR|MOT_FCC_DBG_INT_TX_ERR;
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_HB_FAIL_ADD	motFccHbFailErr++;
#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(p) (p)->Stats->motFccRxMemErr++;

#define MOT_FCC_LOG(FLG, X0, X1, X2, X3, X4, X5, X6)			\
    {									\
    if (motFccEndDbg & FLG)						\
        logMsg (X0, X1, X2, X3, X4, X5, X6);			        \
    }

#else /* MOT_FCC_DBG */

#define MOT_FCC_HB_FAIL_ADD
#define MOT_FCC_RX_MEM_ADD(p)
#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 XXX_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_MAX_CL_LEN      ROUND_UP(XXX_FCC_MAX_CL_LEN,MOT_FCC_BUF_ALIGN)

#define MOT_FCC_RX_CL_SZ       (MOT_FCC_MAX_CL_LEN)
#define MOT_FCC_TX_CL_SZ       (MOT_FCC_MAX_CL_LEN)

/* 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)			\
    {									\

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -