333 lines
11 KiB
C
333 lines
11 KiB
C
|
/*
|
|||
|
* Copyright : (C) 2022 Phytium Information Technology, Inc.
|
|||
|
* All Rights Reserved.
|
|||
|
*
|
|||
|
* This program is OPEN SOURCE software: you can redistribute it and/or modify it
|
|||
|
* under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
|
|||
|
* either version 1.0 of the License, or (at your option) any later version.
|
|||
|
*
|
|||
|
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
|
|||
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|||
|
* See the Phytium Public License for more details.
|
|||
|
*
|
|||
|
*
|
|||
|
* FilePath: fxmac.h
|
|||
|
* Date: 2022-04-06 14:46:52
|
|||
|
* LastEditTime: 2022-04-06 14:46:58
|
|||
|
* Description: This file is for
|
|||
|
*
|
|||
|
* Modify History:
|
|||
|
* Ver Who Date Changes
|
|||
|
* ----- ------ -------- --------------------------------------
|
|||
|
*/
|
|||
|
|
|||
|
#ifndef DRIVERS_ETH_F_XMAC_H
|
|||
|
#define DRIVERS_ETH_F_XMAC_H
|
|||
|
|
|||
|
#ifdef __cplusplus
|
|||
|
extern "C"
|
|||
|
{
|
|||
|
#endif
|
|||
|
|
|||
|
#include "ftypes.h"
|
|||
|
#include "fassert.h"
|
|||
|
#include "ferror_code.h"
|
|||
|
|
|||
|
#include "fxmac_hw.h"
|
|||
|
#include "fxmac_bdring.h"
|
|||
|
#include "fparameters.h"
|
|||
|
|
|||
|
#define FXMAC_ERR_INVALID_PARAM FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x1u)
|
|||
|
#define FXMAC_ERR_SG_LIST FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x2u)
|
|||
|
#define FXMAC_ERR_GENERAL FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x4u)
|
|||
|
#define FXMAC_ERR_SG_NO_LIST FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x5u)
|
|||
|
#define FXMAC_ERR_PHY_BUSY FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x6u)
|
|||
|
#define FXMAC_PHY_IS_NOT_FOUND FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x7u)
|
|||
|
#define FXMAC_PHY_AUTO_AUTONEGOTIATION_FAILED FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x8u)
|
|||
|
#define FXMAC_ERR_MAC_IS_PROCESSING FT_MAKE_ERRCODE(ErrModBsp, ErrBspEth, 0x9u)
|
|||
|
|
|||
|
/** @name Configuration options
|
|||
|
*
|
|||
|
* Device configuration options. See the FXMAC_SetOptions(),
|
|||
|
* FXMACClearOptions() and FXMAC_GetOptions() for information on how to
|
|||
|
* use options.
|
|||
|
*
|
|||
|
* The default state of the options are noted and are what the device and
|
|||
|
* driver will be set to after calling FXMAC_Reset() or
|
|||
|
* FXMAC_Initialize().
|
|||
|
*
|
|||
|
* @{
|
|||
|
*/
|
|||
|
|
|||
|
#define FXMAC_PROMISC_OPTION 0x00000001U
|
|||
|
/* Accept all incoming packets.
|
|||
|
* This option defaults to disabled (cleared) */
|
|||
|
|
|||
|
#define FXMAC_FRAME1536_OPTION 0x00000002U
|
|||
|
/* Frame larger than 1516 support for Tx & Rx.x
|
|||
|
* This option defaults to disabled (cleared) */
|
|||
|
|
|||
|
#define FXMAC_VLAN_OPTION 0x00000004U
|
|||
|
/* VLAN Rx & Tx frame support.
|
|||
|
* This option defaults to disabled (cleared) */
|
|||
|
|
|||
|
#define FXMAC_FLOW_CONTROL_OPTION 0x00000010U
|
|||
|
/* Enable recognition of flow control frames on Rx
|
|||
|
* This option defaults to enabled (set) */
|
|||
|
|
|||
|
#define FXMAC_FCS_STRIP_OPTION 0x00000020U
|
|||
|
/* Strip FCS and PAD from incoming frames. Note: PAD from VLAN frames is not
|
|||
|
* stripped.
|
|||
|
* This option defaults to enabled (set) */
|
|||
|
|
|||
|
#define FXMAC_FCS_INSERT_OPTION 0x00000040U
|
|||
|
/* Generate FCS field and add PAD automatically for outgoing frames.
|
|||
|
* This option defaults to disabled (cleared) */
|
|||
|
|
|||
|
#define FXMAC_LENTYPE_ERR_OPTION 0x00000080U
|
|||
|
/* Enable Length/Type error checking for incoming frames. When this option is
|
|||
|
* set, the MAC will filter frames that have a mismatched type/length field
|
|||
|
* and if FXMAC_REPORT_RXERR_OPTION is set, the user is notified when these
|
|||
|
* types of frames are encountered. When this option is cleared, the MAC will
|
|||
|
* allow these types of frames to be received.
|
|||
|
*
|
|||
|
* This option defaults to disabled (cleared) */
|
|||
|
|
|||
|
#define FXMAC_TRANSMITTER_ENABLE_OPTION 0x00000100U
|
|||
|
/* Enable the transmitter.
|
|||
|
* This option defaults to enabled (set) */
|
|||
|
|
|||
|
#define FXMAC_RECEIVER_ENABLE_OPTION 0x00000200U
|
|||
|
/* Enable the receiver
|
|||
|
* This option defaults to enabled (set) */
|
|||
|
|
|||
|
#define FXMAC_BROADCAST_OPTION 0x00000400U
|
|||
|
/* Allow reception of the broadcast address
|
|||
|
* This option defaults to enabled (set) */
|
|||
|
|
|||
|
#define FXMAC_MULTICAST_OPTION 0x00000800U
|
|||
|
/* Allows reception of multicast addresses programmed into hash
|
|||
|
* This option defaults to disabled (clear) */
|
|||
|
|
|||
|
#define FXMAC_RX_CHKSUM_ENABLE_OPTION 0x00001000U
|
|||
|
/* Enable the RX checksum offload
|
|||
|
* This option defaults to enabled (set) */
|
|||
|
|
|||
|
#define FXMAC_TX_CHKSUM_ENABLE_OPTION 0x00002000U
|
|||
|
/* Enable the TX checksum offload
|
|||
|
* This option defaults to enabled (set) */
|
|||
|
|
|||
|
#define FXMAC_JUMBO_ENABLE_OPTION 0x00004000U
|
|||
|
#define FXMAC_SGMII_ENABLE_OPTION 0x00008000U
|
|||
|
|
|||
|
#define FXMAC_LOOPBACK_NO_MII_OPTION 0x00010000U
|
|||
|
#define FXMAC_LOOPBACK_USXGMII_OPTION 0x00020000U
|
|||
|
|
|||
|
#define FXMAC_GET_TXRING(instance) (instance.tx_bd_queue.bdring)
|
|||
|
#define FXMAC_GET_RXRING(instance) (instance.rx_bd_queue.bdring)
|
|||
|
|
|||
|
#define FXMAC_DEFAULT_OPTIONS \
|
|||
|
((u32)FXMAC_FLOW_CONTROL_OPTION | \
|
|||
|
(u32)FXMAC_FCS_INSERT_OPTION | \
|
|||
|
(u32)FXMAC_FCS_STRIP_OPTION | \
|
|||
|
(u32)FXMAC_BROADCAST_OPTION | \
|
|||
|
(u32)FXMAC_LENTYPE_ERR_OPTION | \
|
|||
|
(u32)FXMAC_TRANSMITTER_ENABLE_OPTION | \
|
|||
|
(u32)FXMAC_RECEIVER_ENABLE_OPTION | \
|
|||
|
(u32)FXMAC_RX_CHKSUM_ENABLE_OPTION | \
|
|||
|
(u32)FXMAC_TX_CHKSUM_ENABLE_OPTION)
|
|||
|
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
FXMAC_LINKDOWN = 0,
|
|||
|
FXMAC_LINKUP = 1,
|
|||
|
FXMAC_NEGOTIATING = 2
|
|||
|
} FXmacLinkStatus;
|
|||
|
|
|||
|
/* The next few constants help upper layers determine the size of memory
|
|||
|
* pools used for Ethernet buffers and descriptor lists.
|
|||
|
*/
|
|||
|
#define FXMAC_MAC_ADDR_SIZE 6U /* size of Ethernet header */
|
|||
|
|
|||
|
#define FXMAC_MTU 1500U /* max MTU size of Ethernet frame */
|
|||
|
#define FXMAC_MTU_JUMBO 10240U /* max MTU size of jumbo frame */
|
|||
|
#define FXMAC_HDR_SIZE 14U /* size of Ethernet header , DA + SA + TYPE*/
|
|||
|
#define FXMAC_HDR_VLAN_SIZE 18U /* size of Ethernet header with VLAN */
|
|||
|
#define FXMAC_TRL_SIZE 4U /* size of Ethernet trailer (FCS) */
|
|||
|
#define FXMAC_MAX_FRAME_SIZE (FXMAC_MTU + FXMAC_HDR_SIZE + \
|
|||
|
FXMAC_TRL_SIZE)
|
|||
|
#define FXMAC_MAX_VLAN_FRAME_SIZE (FXMAC_MTU + FXMAC_HDR_SIZE + \
|
|||
|
FXMAC_HDR_VLAN_SIZE + FXMAC_TRL_SIZE)
|
|||
|
#define FXMAC_MAX_VLAN_FRAME_SIZE_JUMBO (FXMAC_MTU_JUMBO + FXMAC_HDR_SIZE + \
|
|||
|
FXMAC_HDR_VLAN_SIZE + FXMAC_TRL_SIZE)
|
|||
|
|
|||
|
#define FXMAC_MAX_FRAME_SIZE_JUMBO (FXMAC_MTU_JUMBO + FXMAC_HDR_SIZE + FXMAC_TRL_SIZE)
|
|||
|
|
|||
|
/** @name Callback identifiers
|
|||
|
*
|
|||
|
* These constants are used as parameters to FXMAC_SetHandler()
|
|||
|
* @{
|
|||
|
*/
|
|||
|
#define FXMAC_HANDLER_DMASEND 1U /* 发送中断 */
|
|||
|
#define FXMAC_HANDLER_DMARECV 2U /* 接收中断 */
|
|||
|
#define FXMAC_HANDLER_ERROR 3U /* 异常中断 */
|
|||
|
#define FXMAC_HANDLER_LINKCHANGE 4U /* 连接状态 */
|
|||
|
#define FXMAC_HANDLER_RESTART 5U /* 发送描述符队列发生异常 */
|
|||
|
/*@}*/
|
|||
|
|
|||
|
#define FXMAC_DMA_SG_IS_STARTED 0
|
|||
|
#define FXMAC_DMA_SG_IS_STOPED 1
|
|||
|
|
|||
|
#define FXMAC_SPEED_10 10U
|
|||
|
#define FXMAC_SPEED_100 100U
|
|||
|
#define FXMAC_SPEED_1000 1000U
|
|||
|
#define FXMAC_SPEED_2500 2500U
|
|||
|
#define FXMAC_SPEED_5000 5000U
|
|||
|
#define FXMAC_SPEED_10000 10000U
|
|||
|
#define FXMAC_SPEED_25000 25000U
|
|||
|
|
|||
|
/** @name Direction identifiers
|
|||
|
*
|
|||
|
* These are used by several functions and callbacks that need
|
|||
|
* to specify whether an operation specifies a send or receive channel.
|
|||
|
* @{
|
|||
|
*/
|
|||
|
#define FXMAC_SEND 1U /* send direction */
|
|||
|
#define FXMAC_RECV 2U /* receive direction */
|
|||
|
|
|||
|
/****************************************************************************/
|
|||
|
/**
|
|||
|
*
|
|||
|
* This macro triggers trasmit circuit to send data currently in TX buffer(s).
|
|||
|
*
|
|||
|
* @param instance_p is a pointer to the FXmac instance to be worked on.
|
|||
|
*
|
|||
|
* @return
|
|||
|
*
|
|||
|
* @note
|
|||
|
*
|
|||
|
* Signature: void FXmacTransmit(FXmac *instance_p)
|
|||
|
*
|
|||
|
*****************************************************************************/
|
|||
|
#define FXmacTransmit(instance_p) \
|
|||
|
FXMAC_WRITEREG32((instance_p)->config.base_address, \
|
|||
|
FXMAC_NWCTRL_OFFSET, \
|
|||
|
(FXMAC_READREG32((instance_p)->config.base_address, \
|
|||
|
FXMAC_NWCTRL_OFFSET) | \
|
|||
|
FXMAC_NWCTRL_STARTTX_MASK))
|
|||
|
|
|||
|
typedef void (*FXmacIrqHandler)(void *args);
|
|||
|
typedef void (*FXmacErrorIrqHandler)(void *args, u32 direction, u32 error_word);
|
|||
|
/* Interface Mode definitions */
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
FXMAC_PHY_INTERFACE_MODE_SGMII,
|
|||
|
FXMAC_PHY_INTERFACE_MODE_RMII,
|
|||
|
FXMAC_PHY_INTERFACE_MODE_RGMII,
|
|||
|
FXMAC_PHY_INTERFACE_MODE_XGMII,
|
|||
|
FXMAC_PHY_INTERFACE_MODE_USXGMII,
|
|||
|
} FXmacPhyInterface;
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
u32 instance_id; /* Id of device*/
|
|||
|
volatile uintptr_t base_address;
|
|||
|
volatile uintptr_t extral_mode_base;
|
|||
|
volatile uintptr_t extral_loopback_base;
|
|||
|
FXmacPhyInterface interface;
|
|||
|
u32 speed; /* FXMAC_SPEED_XXX */
|
|||
|
u32 duplex; /* 1 is full-duplex , 0 is half-duplex */
|
|||
|
u32 auto_neg; /* Enable auto-negotiation - when set active high, autonegotiation operation is enabled. */
|
|||
|
u32 pclk_hz;
|
|||
|
u32 max_queue_num; /* Number of Xmac Controller Queues */
|
|||
|
u32 tx_queue_id; /* 0 ~ FT_XMAC_QUEUE_MAX_NUM ,Index queue number */
|
|||
|
u32 rx_queue_id; /* 0 ~ FT_XMAC_QUEUE_MAX_NUM ,Index queue number */
|
|||
|
u32 hotplug_irq_num;
|
|||
|
u32 dma_brust_length; /* burst length */
|
|||
|
u32 network_default_config;
|
|||
|
u32 queue_irq_num[FT_XMAC_QUEUE_MAX_NUM]; /* mac0 8个 ,其他的 4个 */
|
|||
|
} FXmacConfig;
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
u32 queue_id;
|
|||
|
FXmacBdRing bdring;
|
|||
|
} FXmacQueue;
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
FXmacConfig config;
|
|||
|
u32 is_ready; /* Device is ininitialized and ready*/
|
|||
|
u32 is_started;
|
|||
|
u32 link_status; /* indicates link status ,FXMAC_LINKUP is link up ,FXMAC_LINKDOWN is link down,FXMAC_NEGOTIATING is need to negotiating*/
|
|||
|
u32 options;
|
|||
|
|
|||
|
FXmacQueue tx_bd_queue; /* Transmit Queue */
|
|||
|
FXmacQueue rx_bd_queue; /* Receive Queue */
|
|||
|
|
|||
|
FXmacIrqHandler send_irq_handler;
|
|||
|
void *send_args;
|
|||
|
|
|||
|
FXmacIrqHandler recv_irq_handler;
|
|||
|
void *recv_args;
|
|||
|
|
|||
|
FXmacErrorIrqHandler error_irq_handler;
|
|||
|
void *error_args;
|
|||
|
|
|||
|
FXmacIrqHandler link_change_handler;
|
|||
|
void *link_change_args;
|
|||
|
|
|||
|
FXmacIrqHandler restart_handler;
|
|||
|
void *restart_args;
|
|||
|
|
|||
|
u32 moudle_id; /* Module identification number */
|
|||
|
u32 max_mtu_size;
|
|||
|
u32 max_frame_size;
|
|||
|
|
|||
|
u32 phy_address; /* phy address */
|
|||
|
u32 rxbuf_mask; /* 1000,100,10 */
|
|||
|
|
|||
|
} FXmac;
|
|||
|
|
|||
|
/* fxmac_sinit.c */
|
|||
|
const FXmacConfig *FXmacLookupConfig(u32 instance_id);
|
|||
|
|
|||
|
/* fgmac.c */
|
|||
|
FError FXmacCfgInitialize(FXmac *instance_p, const FXmacConfig *config_p);
|
|||
|
|
|||
|
void FXmacInitInterface(FXmac *instance_p);
|
|||
|
|
|||
|
void FXmacGetMacAddress(FXmac *instance_p, u8 *address_ptr, u8 index);
|
|||
|
FError FXmacSetMacAddress(FXmac *instance_p, u8 *address_ptr, u8 index);
|
|||
|
|
|||
|
FError FXmacSetOptions(FXmac *instance_p, u32 options, u32 queue_num);
|
|||
|
FError FXmacClearOptions(FXmac *instance_p, u32 options, u32 queue_num);
|
|||
|
|
|||
|
void FXmacStart(FXmac *instance_p);
|
|||
|
void FXmacStop(FXmac *instance_p);
|
|||
|
void FXmacSetQueuePtr(FXmac *instance_p, uintptr QPtr, u8 QueueNum,
|
|||
|
u32 direction);
|
|||
|
|
|||
|
/* phy interface */
|
|||
|
FError FXmacPhyWrite(FXmac *instance_p, u32 phy_address,
|
|||
|
u32 register_num, u16 phy_data);
|
|||
|
|
|||
|
FError FXmacPhyRead(FXmac *instance_p, u32 phy_address,
|
|||
|
u32 register_num, u16 *phydat_aptr);
|
|||
|
|
|||
|
FError FXmacPhyInit(FXmac *instance_p, u32 speed, u32 duplex_mode, u32 autonegotiation_en);
|
|||
|
|
|||
|
void FXmacSelectClk(FXmac *instance_p);
|
|||
|
|
|||
|
FError FXmacSetHandler(FXmac *instance_p, u32 handler_type, void *func_pointer, void *call_back_ref);
|
|||
|
/* interrupt */
|
|||
|
void FXmacIntrHandler(s32 vector, void *args);
|
|||
|
|
|||
|
void FXmacClearHash(FXmac *instance_p);
|
|||
|
|
|||
|
#ifdef __cplusplus
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
#endif // !
|