Files
zjui-ece385-final/ECE385_bsp/drivers/inc/altera_avalon_tse.h

1024 lines
44 KiB
C

/******************************************************************************
* *
* License Agreement *
* *
* Copyright (c) 2009 Altera Corporation, San Jose, California, USA. *
* All rights reserved. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the "Software"), *
* to deal in the Software without restriction, including without limitation *
* the rights to use, copy, modify, merge, publish, distribute, sublicense, *
* and/or sell copies of the Software, and to permit persons to whom the *
* Software is furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included in *
* all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
* DEALINGS IN THE SOFTWARE. *
* *
* This agreement shall be governed in all respects by the laws of the State *
* of California and by the laws of the United States of America. *
* *
******************************************************************************/
#ifndef __ALTERA_AVALON_TSE_H__
#define __ALTERA_AVALON_TSE_H__
#include "altera_eth_tse_regs.h"
#include "system.h" /* check if SGDMA is used */
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* TSE DEBUG Message Level */
/* Level 6 : Info
* Level 5 : Debug Info
* Level 4 : Warning
* Level 3 : Critical Warning
* Level 2 : Error
* Level 1 : Critical Error, eg: malloc() failed
*/
#ifndef TSE_DEBUG_LEVEL
#define TSE_DEBUG_LEVEL 6
#endif
/* definition without InterNiche */
#ifndef ALT_INICHE
#define SUCCESS 0 /* whatever the call was, it worked. */
#define ENP_RESOURCE -22 /* ran out of other queue-able resource */
#define ENP_PARAM -10 /* bad parameter */
#define MAXNETS 8 /* max ifaces to support at one time */
#ifdef ALT_DEBUG
#define tse_dprintf(level, fmt, rest...) \
if(level <= TSE_DEBUG_LEVEL) { \
printf (fmt, ## rest); \
} \
else { \
no_printf (fmt, ## rest); \
}
#else
#define tse_dprintf(level, fmt, rest...) no_printf (fmt, ## rest)
#endif /* ALT_DEBUG */
#else /* ALT_INICHE */
#include "ipport.h"
#define tse_dprintf(level, fmt, rest...) \
if(level <= TSE_DEBUG_LEVEL) { \
dprintf (fmt, ## rest); \
} \
else { \
no_printf (fmt, ## rest); \
}
#endif /* ALT_INICHE */
void no_printf (char *fmt, ...);
/* MSGDMA dependent */
#ifdef __ALTERA_MSGDMA
#include "altera_msgdma.h"
/* Device addressing struct for all hardware TSE MAC depends on */
typedef struct tse_mac_trans_info_struct {
np_tse_mac *base;
alt_msgdma_dev *tx_msgdma;
alt_msgdma_dev *rx_msgdma;
alt_u32 *rx_msgdma_desc_ram;
alt_u32 cfgflags; // flags or'ed during initialization of COMMAND_CONFIG
} tse_mac_trans_info;
/** @Function Description - Perform initialization steps on transaction info structure to prepare it for .
* use by the library functions with two MSGDMAs and extra initialization Flags
* @API Type: Internal
* @param mi Main Device Structure.
* @param mac_base Base Address of the Control interface for the TSE MAC
* @param tx_msgdma MSGDMA device handle for TSE transmit data path
* @param rx_msgdma MSGDMA device handle for TSE receive data path
* @param cfgflags initialization flags for the device
* @return SUCCESS
*/
alt_32 tse_mac_initTransInfo2( tse_mac_trans_info *mi,
alt_u32 mac_base,
alt_32 tx_msgdma,
alt_32 rx_msgdma,
alt_32 cfgflags);
/** @Function Description - Synchronous MSGDMA copy from buffer memory into transmit FIFO. Waits until
* MSGDMA has completed. Raw function without any error checks.
* @API Type: Internal
* @param mi Main Device Structure.
* @param txDesc Pointer to the transmit MSGDMA descriptor
* @return actual bytes transferred if ok else ENP_RESOURCE if error
*/
alt_32 tse_mac_sTxWrite( tse_mac_trans_info *mi,
alt_msgdma_standard_descriptor *txDesc);
/** @Function Description - Asynchronous MSGDMA copy from buffer memory into rxFIFO.
* Raw function without any transfer error checks.
*
* @API Type: Internal
* @param mi Main Device Structure.
* @param rxDesc Pointer to the receive MSGDMA descriptor
* @return SUCCESS if ok else -1 if error
*/
alt_32 tse_mac_aTxWrite( tse_mac_trans_info *mi,
alt_msgdma_prefetcher_standard_descriptor *txDesc);
/** @Function Description - Asynchronous MSGDMA copy from rxFIFO into given buffer memory area.
* Raw function without any error checks.
*
* @API Type: Internal
* @param mi Main Device Structure.
* @param rxDesc Pointer to the receive MSGDMA descriptor
* @return SUCCESS if ok else ENP_RESOURCE if error
*
* Note: At the point of this function call return,
* the MSGDMA asynchronous operation may not have been
* completed yet, so the function does not return
* the actual bytes transferred for current descriptor
*/
alt_32 tse_mac_aRxRead(tse_mac_trans_info *mi, alt_msgdma_prefetcher_standard_descriptor *rxDesc);
#endif /* __ALTERA_MSGDMA */
/*** Debug Definition *********/
/* change ENABLE_PHY_LOOPBACK to 1 to enable PHY loopback for debug purpose */
#ifndef ENABLE_PHY_LOOPBACK
#define ENABLE_PHY_LOOPBACK 0
#endif
#ifndef pnull
#define pnull ((void *)0)
#endif
/* Constant definition for tse_system_info.h */
#define TSE_EXT_DESC_MEM 1
#define TSE_INT_DESC_MEM 0
#define TSE_USE_SHARED_FIFO 1
#define TSE_NO_SHARED_FIFO 0
#define TSE_ENABLE_MDIO_SHARING 1
/* Multi-channel Shared FIFO Depth Settings */
#ifndef ALTERA_TSE_SHARED_FIFO_TX_DEPTH_DEFAULT
#define ALTERA_TSE_SHARED_FIFO_TX_DEPTH_DEFAULT 2040
#endif
#ifndef ALTERA_TSE_SHARED_FIFO_RX_DEPTH_DEFAULT
#define ALTERA_TSE_SHARED_FIFO_RX_DEPTH_DEFAULT 2040
#endif
/* PHY Status definition */
#define TSE_PHY_AUTO_ADDRESS -1
#define TSE_PHY_MAP_SUCCESS 0
#define TSE_PHY_MAP_ERROR -1
#define TSE_PHY_AN_NOT_COMPLETE -1
#define TSE_PHY_AN_NOT_CAPABLE -2
#define TSE_PHY_AN_COMPLETE 0
#define TSE_PHY_SPEED_INVALID 3
#define TSE_PHY_SPEED_1000 2
#define TSE_PHY_SPEED_100 1
#define TSE_PHY_SPEED_10 0
#define TSE_PHY_SPEED_NO_COMMON -1
#define TSE_PHY_DUPLEX_FULL 1
#define TSE_PHY_DUPLEX_HALF 0
/* getPHYSpeed return error */
enum {
ALT_TSE_E_NO_PMAC_FOUND = (1 << 23),
ALT_TSE_E_NO_MDIO = (1 << 22),
ALT_TSE_E_NO_PHY = (1 << 21),
ALT_TSE_E_NO_COMMON_SPEED = (1 << 20),
ALT_TSE_E_AN_NOT_COMPLETE = (1 << 19),
ALT_TSE_E_NO_PHY_PROFILE = (1 << 18),
ALT_TSE_E_PROFILE_INCORRECT_DEFINED = (1 << 17),
ALT_TSE_E_INVALID_SPEED = (1 << 16)
};
/* Maximum number of PHY that can be registered into PHY profile */
#define TSE_MAX_PHY_PROFILE 8
/* Maximum MAC in system */
#define TSE_MAX_MAC_IN_SYSTEM MAXNETS
#define TSE_MAX_CHANNEL MAXNETS
/* System Constant Definition Used in the TSE Driver Code */
#define ALTERA_TSE_SW_RESET_TIME_OUT_CNT 10000
#define ALTERA_TSE_MSGDMA_BUSY_TIME_OUT_CNT 1000000
//These values reflect useable chain size plus 1 for ending descriptor
#define ALTERA_TSE_MSGDMA_RX_DESC_CHAIN_SIZE 9
#define ALTERA_TSE_MSGDMA_TX_DESC_CHAIN_SIZE 2 /* currently only a value of 2 is supported */
#define ALTERA_TSE_MAC_MAX_FRAME_LENGTH 1518
#define ALTERA_TSE_FULL_MAC 0
#define ALTERA_TSE_MACLITE_10_100 1
#define ALTERA_TSE_MACLITE_1000 2
#define ALTERA_TSE_NO_INDEX_FOUND -1
#define ALTERA_TSE_SYSTEM_DEF_ERROR -1
#define ALTERA_TSE_MALLOC_FAILED -1
#define ALTERA_TSE_DUPLEX_MODE_DEFAULT TSE_PHY_DUPLEX_FULL
#define ALTERA_TSE_MAC_SPEED_DEFAULT TSE_PHY_SPEED_100
/* added as bsp public makefile settings
#define ALTERA_AUTONEG_TIMEOUT_THRESHOLD 2500
#define ALTERA_CHECKLINK_TIMEOUT_THRESHOLD 10000
#define ALTERA_NOMDIO_TIMEOUT_THRESHOLD 1000000
#define ALTERA_DISGIGA_TIMEOUT_THRESHOLD 5000000
*/
#define ALTERA_TSE_PCS_IF_MODE 0x14 /* 0x14th register of ALTERA PCS */
/* PHY ID, backward compatible */
#define NTL848PHY_ID 0x20005c90 /* National 83848, 10/100 */
#define MTIPPCS_ID 0x00010000 /* MTIP 1000 Base-X PCS */
#define TDKPHY_ID 0x0300e540 /* TDK 78Q2120 10/100 */
#define NTLPHY_ID 0x20005c7a /* National DP83865 */
#define MVLPHY_ID 0x0141 /* Marvell 88E1111 */
/* PHY ID */
/* Marvell PHY on PHYWORKX board */
enum {
MV88E1111_OUI = 0x005043,
MV88E1111_MODEL = 0x0c,
MV88E1111_REV = 0x2
};
/* Marvell Quad PHY on PHYWORKX board */
enum {
MV88E1145_OUI = 0x005043,
MV88E1145_MODEL = 0x0d,
MV88E1145_REV = 0x2
};
/* National PHY on PHYWORKX board */
enum {
DP83865_OUI = 0x080017,
DP83865_MODEL = 0x07,
DP83865_REV = 0xa
};
/* National 10/100 PHY on PHYWORKX board */
enum {
DP83848C_OUI = 0x080017,
DP83848C_MODEL = 0x09,
DP83848C_REV = 0x0
};
/* Intel PEF7071 Phy on C10 Devkit */
enum {
PEF7071_OUI = ((0xd565 << 6) | ((0xa401 >> 10) & 0x3f)),
PEF7071_MODEL = ((0xa401 >> 4) & 0x3f),
PEF7071_REV = (0xa401 & 0x0f)
};
/* PHY register definition */
enum {
TSE_PHY_MDIO_CONTROL = 0,
TSE_PHY_MDIO_STATUS = 1,
TSE_PHY_MDIO_PHY_ID1 = 2,
TSE_PHY_MDIO_PHY_ID2 = 3,
TSE_PHY_MDIO_ADV = 4,
TSE_PHY_MDIO_REMADV = 5,
TSE_PHY_MDIO_AN_EXT = 6,
TSE_PHY_MDIO_1000BASE_T_CTRL = 9,
TSE_PHY_MDIO_1000BASE_T_STATUS = 10,
TSE_PHY_MDIO_EXT_STATUS = 15
};
/* MDIO CONTROL bit number */
enum {
TSE_PHY_MDIO_CONTROL_RESET = 15,
TSE_PHY_MDIO_CONTROL_LOOPBACK = 14,
TSE_PHY_MDIO_CONTROL_SPEED_LSB = 13,
TSE_PHY_MDIO_CONTROL_AN_ENA = 12,
TSE_PHY_MDIO_CONTROL_POWER_DOWN = 11,
TSE_PHY_MDIO_CONTROL_ISOLATE = 10,
TSE_PHY_MDIO_CONTROL_RESTART_AN = 9,
TSE_PHY_MDIO_CONTROL_DUPLEX = 8,
TSE_PHY_MDIO_CONTROL_SPEED_MSB = 6
};
/* MDIO STATUS bit number */
enum {
TSE_PHY_MDIO_STATUS_100BASE_T4 = 15,
TSE_PHY_MDIO_STATUS_100BASE_X_FULL = 14,
TSE_PHY_MDIO_STATUS_100BASE_X_HALF = 13,
TSE_PHY_MDIO_STATUS_10BASE_T_FULL = 12,
TSE_PHY_MDIO_STATUS_10BASE_T_HALF = 11,
TSE_PHY_MDIO_STATUS_100BASE_T2_FULL = 10,
TSE_PHY_MDIO_STATUS_100BASE_T2_HALF = 9,
TSE_PHY_MDIO_STATUS_EXT_STATUS = 8,
TSE_PHY_MDIO_STATUS_AN_COMPLETE = 5,
TSE_PHY_MDIO_STATUS_AN_ABILITY = 3,
TSE_PHY_MDIO_STATUS_LINK_STATUS = 2
};
/* AN Advertisement bit number */
/* and also */
/* Link Partner Ability bit number */
enum {
TSE_PHY_MDIO_ADV_100BASE_T4 = 9,
TSE_PHY_MDIO_ADV_100BASE_TX_FULL = 8,
TSE_PHY_MDIO_ADV_100BASE_TX_HALF = 7,
TSE_PHY_MDIO_ADV_10BASE_TX_FULL = 6,
TSE_PHY_MDIO_ADV_10BASE_TX_HALF = 5
};
/* AN Expansion bit number */
enum {
TSE_PHY_MDIO_LP_AN_ABLE = 0
};
/* 1000BASE-T Control bit number */
enum {
TSE_PHY_MDIO_1000BASE_T_CTRL_FULL_ADV = 9,
TSE_PHY_MDIO_1000BASE_T_CTRL_HALF_ADV = 8
};
/* 1000BASE-T Status bit number */
enum {
TSE_PHY_MDIO_1000BASE_T_STATUS_LP_FULL_ADV = 11,
TSE_PHY_MDIO_1000BASE_T_STATUS_LP_HALF_ADV = 10
};
/* Extended Status bit number */
enum {
TSE_PHY_MDIO_EXT_STATUS_1000BASE_X_FULL = 15,
TSE_PHY_MDIO_EXT_STATUS_1000BASE_X_HALF = 14,
TSE_PHY_MDIO_EXT_STATUS_1000BASE_T_FULL = 13,
TSE_PHY_MDIO_EXT_STATUS_1000BASE_T_HALF = 12
};
/*
* macros to access MSGDMA prefetcher standard Descriptors used in the TSE driver
* - use the macros to assure cache coherancy
*/
#define IORD_ALTERA_TSE_MSGDMA_DESC_READ_ADDR(base) (IORD(base, 0x0) & 0xFFFFFFFF)
#define IOWR_ALTERA_TSE_MSGDMA_DESC_READ_ADDR(base, data) IOWR(base, 0x0, data)
#define IORD_ALTERA_TSE_MSGDMA_DESC_WRITE_ADDR(base) (IORD(base, 0x1) & 0xFFFFFFFF)
#define IOWR_ALTERA_TSE_MSGDMA_DESC_WRITE_ADDR(base, data) IOWR(base, 0x1, data)
#define IORD_ALTERA_TSE_MSGDMA_DESC_NEXT(base) (IORD(base, 0x3) & 0xFFFFFFFF)
#define IOWR_ALTERA_TSE_MSGDMA_DESC_NEXT(base, data) IOWR(base, 0x3, data)
#define IORD_ALTERA_TSE_MSGDMA_DESC_BYTES_TO_TRANSFER(base) (IORD(base, 0x2) & 0xFFFFFFFF)
#define IOWR_ALTERA_TSE_MSGDMA_DESC_BYTES_TO_TRANSFER(base, data) IOWR(base, 0x2, data))
#define IORD_ALTERA_TSE_MSGDMA_DESC_ACTUAL_BYTES_TRANSFERRED(base) (IORD(base, 0x4) & 0xFFFFFFFF)
#define IOWR_ALTERA_TSE_MSGDMA_DESC_ACTUAL_BYTES_TRANSFERRED(base, data) IOWR(base, 0x4, data))
#define IORD_ALTERA_TSE_MSGDMA_DESC_STATUS(base) (((IORD(base, 0x5)) >> 16) & 0xFFFF)
#define IOWR_ALTERA_TSE_MSGDMA_DESC_STATUS(base, data) IOWR(base, 0x5, (data & 0xffff))
#define IORD_ALTERA_TSE_MSGDMA_DESC_CONTROL(base) (((IORD(base, 0x7) >> 24) & 0xFF)
#define IOWR_ALTERA_TSE_MSGDMA_DESC_CONTROL(base, data) IOWR(base, 0x7, data)
/* TSE System Component Structure */
typedef struct alt_tse_system_mac_struct {
alt_u32 tse_mac_base; /* Base address of TSE MAC */
alt_u16 tse_tx_depth; /* TX Receive FIFO depth */
alt_u16 tse_rx_depth; /* RX Receive FIFO depth */
alt_u8 tse_use_mdio; /* is MDIO enabled */
alt_u8 tse_en_maclite; /* is Small MAC */
alt_u8 tse_maclite_gige; /* is Small MAC 1000 Mbps */
alt_u8 tse_multichannel_mac; /* MAC group together for MDIO block sharing */
alt_u8 tse_num_of_channel; /* Number of channel for Multi-channel MAC */
alt_u8 tse_mdio_shared; /* is MDIO block shared */
alt_u8 tse_number_of_mac_mdio_shared; /* Number of MAC sharing the MDIO block */
alt_u8 tse_pcs_ena; /* is MAC+PCS combination */
alt_u8 tse_pcs_sgmii; /* is SGMII mode of PCS enabled */
} alt_tse_system_mac;
typedef struct alt_tse_system_msgdma_struct {
char * tse_msgdma_tx; /* MSGDMA TX name */
char * tse_msgdma_rx; /* MSGDMA RX name */
alt_u16 tse_msgdma_rx_irq; /* MSGDMA RX IRQ */
} alt_tse_system_msgdma;
typedef struct alt_tse_system_desc_mem_struct {
alt_u8 ext_desc_mem; /* is dedicated memory used for descriptor */
alt_u32 desc_mem_base; /* Base address of Descriptor Memory if ext_desc_mem = 1 */
} alt_tse_system_desc_mem;
typedef struct alt_tse_system_shared_fifo_struct {
alt_u8 use_shared_fifo; /* is Shared FIFO used in the system */
alt_u32 tse_shared_fifo_tx_ctrl_base; /* Base address of TX Shared FIFO Ctrl */
alt_u32 tse_shared_fifo_tx_stat_base; /* Base address of TX Shared FIFO Fill Level */
alt_u32 tse_shared_fifo_tx_depth; /* Depth of TX Shared FIFO */
alt_u32 tse_shared_fifo_rx_ctrl_base; /* Base address of RX Shared FIFO Ctrl */
alt_u32 tse_shared_fifo_rx_stat_base; /* Base address of RX Shared FIFO Fill Level */
alt_u32 tse_shared_fifo_rx_depth; /* Depth of RX Shared FIFO */
} alt_tse_system_shared_fifo;
typedef struct alt_tse_system_phy_struct {
alt_32 tse_phy_mdio_address; /* PHY's MDIO address */
alt_32 (*tse_phy_cfg)(np_tse_mac *pmac); /* Function pointer to execute additional initialization */
} alt_tse_system_phy;
/* System Parameters for TSE System */
typedef struct alt_tse_system_info_struct {
alt_u32 tse_mac_base; /* Base address of TSE MAC */
alt_u32 tse_tx_depth; /* TX Receive FIFO depth */
alt_u32 tse_rx_depth; /* RX Receive FIFO depth */
alt_u8 tse_use_mdio; /* is MDIO enabled */
alt_u8 tse_en_maclite; /* is Small MAC */
alt_u8 tse_maclite_gige; /* is Small MAC 1000 Mbps */
alt_u8 tse_multichannel_mac; /* MAC group together for MDIO block sharing */
alt_u8 tse_num_of_channel; /* Number of channel for Multi-channel MAC */
alt_u8 tse_mdio_shared; /* is MDIO block shared */
alt_u8 tse_number_of_mac_mdio_shared; /* Number of MAC sharing the MDIO block */
alt_u8 tse_pcs_ena; /* is MAC+PCS combination */
alt_u8 tse_pcs_sgmii; /* is SGMII mode of PCS enabled */
char * tse_msgdma_tx; /* MSGDMA TX name */
char * tse_msgdma_rx; /* MSGDMA RX name */
alt_u16 tse_msgdma_rx_irq; /* MSGDMA TX IRQ */
alt_u8 ext_desc_mem; /* is dedicated memory used for descriptor */
alt_u32 desc_mem_base; /* Base address of Descriptor Memory if ext_desc_mem = 1 */
alt_u8 use_shared_fifo; /* is Shared FIFO used in the system */
alt_u32 tse_shared_fifo_tx_ctrl_base; /* Base address of TX Shared FIFO Ctrl */
alt_u32 tse_shared_fifo_tx_stat_base; /* Base address of TX Shared FIFO Fill Level */
alt_u32 tse_shared_fifo_tx_depth; /* Depth of TX Shared FIFO */
alt_u32 tse_shared_fifo_rx_ctrl_base; /* Base address of RX Shared FIFO Ctrl */
alt_u32 tse_shared_fifo_rx_stat_base; /* Base address of RX Shared FIFO Fill Level */
alt_u32 tse_shared_fifo_rx_depth; /* Depth of RX Shared FIFO */
alt_32 tse_phy_mdio_address; /* PHY's MDIO address */
alt_32 (*tse_phy_cfg)(np_tse_mac *pmac); /* Function pointer to execute additional initialization */
} alt_tse_system_info;
/* PHY structure for PHY detection */
typedef struct alt_tse_phy_profile_struct{
/* PHY name */
char name[80];
/* PHY OUI (Organizationally Unique Identififier) */
alt_u32 oui;
/* PHY model number */
alt_u8 model_number;
/* PHY revision number */
alt_u8 revision_number;
/* Location of PHY Specific Status Register */
alt_u8 status_reg_location;
/* Location of Speed Status bit in PHY Specific Status Register */
alt_u8 speed_lsb_location;
/* Location of Duplex Status bit in PHY Specific Status Register */
alt_u8 duplex_bit_location;
/* Location of Link Status bit in PHY Specific Status Register */
alt_u8 link_bit_location;
/* Function pointer to execute additional initialization */
/* Profile specific */
alt_32 (*phy_cfg)(np_tse_mac *pmac);
/** Function pointer to read the link status from the PHY specific status register
* Use this function pointer if the PHY is using different format to store link information in PHY specific status register
* The above _location variable will not be used if this function pointer is not NULL
* Table below show the format of the return value required by TSE driver PHY detection
* ----------------------------------------------------------------------------------
* | BIT | Value: Description |
* ----------------------------------------------------------------------------------
* | 31-17 | Reserved |
* | 16 | 1: Error:Invalid speed read from PHY |
* | 15- 4 | Reserved |
* | 3 | 1: 10 Mbps link |
* | 2 | 1: 100 Mbps link |
* | 1 | 1: 1000 Mbps link |
* | 0 | 1: Full Duplex 0: Half Duplex |
* ----------------------------------------------------------------------------------
*/
alt_u32 (*link_status_read)(np_tse_mac *pmac);
} alt_tse_phy_profile;
/* TSE Multi-Channel PHY detection */
typedef struct alt_tse_phy_link_cap_struct {
/* connected PHY capabilities */
alt_u8 cap_1000_base_x_full;
alt_u8 cap_1000_base_x_half;
alt_u8 cap_1000_base_t_full;
alt_u8 cap_1000_base_t_half;
alt_u8 cap_100_base_t4;
alt_u8 cap_100_base_x_full;
alt_u8 cap_100_base_x_half;
alt_u8 cap_100_base_t2_full;
alt_u8 cap_100_base_t2_half;
alt_u8 cap_10_base_t_full;
alt_u8 cap_10_base_t_half;
/* link partner capabilities */
alt_u8 lp_1000_base_t_full;
alt_u8 lp_1000_base_t_half;
alt_u8 lp_100_base_t4;
alt_u8 lp_100_base_tx_full;
alt_u8 lp_100_base_tx_half;
alt_u8 lp_10_base_tx_full;
alt_u8 lp_10_base_tx_half;
} alt_tse_phy_link_cap;
struct alt_tse_phy_info_struct;
struct alt_tse_mac_info_struct;
struct alt_tse_mac_group_struct;
struct alt_tse_phy_info_struct {
alt_u8 mdio_address; /* Actual PHY MDIO address detected */
alt_tse_phy_link_cap link_capability; /* structure to store link capability of PHY and link partner */
alt_tse_phy_profile *pphy_profile; /* Pointer to type of PHY profile */
struct alt_tse_mac_info_struct *pmac_info; /* Pointer to MAC info structure which connected to this PHY */
};
struct alt_tse_mac_info_struct {
alt_u8 mac_type; /* ALTERA_TSE_FULL_MAC, ALTERA_TSE_MACLITE_10_100, or ALTERA_TSE_MACLITE_1000 */
struct alt_tse_phy_info_struct *pphy_info; /* Pointer to PHY info structure which connected to this MAC */
alt_tse_system_info *psys_info; /* Pointer to alt_tse_system_info structure in alt_tse_system_info.h */
struct alt_tse_mac_group_struct *pmac_group; /* Pointer to the MAC group this MAC belongs to, all multi-channel MAC form a group */
};
struct alt_tse_mac_group_struct {
alt_u8 channel; /* Number of channel the MAC group has */
struct alt_tse_mac_info_struct *pmac_info[TSE_MAX_CHANNEL]; /* Pointer to hold MACs in the same group */
};
typedef struct alt_tse_phy_info_struct alt_tse_phy_info;
typedef struct alt_tse_mac_info_struct alt_tse_mac_info;
typedef struct alt_tse_mac_group_struct alt_tse_mac_group;
/*******************************
*
* Public API for TSE Driver
*
*******************************/
/* @Function Description: Perform a software Reset. Reset operation will ocur with some latency.
* COMMAND_CONFIG register is restored after reset.
* @API Type: Public
* @param pmac Pointer to the TSE MAC Control Interface Base address
* @return SUCCESS if ok, else if error return ENP_RESOURCE, ENP_LOGIC
*/
alt_32 tse_mac_SwReset( np_tse_mac *pmac);
/* @Function Description: Perform switching of the TSE MAC into MII (10/100) mode.
* COMMAND_CONFIG register is restored after reset.
* @API Type: Public
* @param pmac Pointer to the TSE MAC Control Interface Base address
* @return SUCCESS
*/
alt_32 tse_mac_setMIImode(np_tse_mac *pmac);
/* @Function Description: Perform switching of the TSE MAC into GMII (Gigabit) mode.
* COMMAND_CONFIG register is restored after reset.
* @API Type: Public
* @param pmac Pointer to the TSE MAC Control Interface Base address
* @return SUCCESS
*/
alt_32 tse_mac_setGMIImode(np_tse_mac *pmac);
/* @Function Description - Add additional PHYs which are not supported by default into PHY profile for PHY detection and auto negotiation
*
* @API TYPE - Public
* @param phy pointer to alt_tse_phy_profile structure describing PHY registers
* @return index of PHY added in PHY profile on success, else return ALTERA_TSE_MALLOC_FAILED if memory allocation failed
* PHY which are currently supported by default : Marvell 88E1111, Marvell Quad PHY 88E1145, National DP83865, and National DP83848C
*/
alt_32 alt_tse_phy_add_profile(alt_tse_phy_profile *phy);
/* @Function Description - Add TSE System to tse_mac_device[] array to customize TSE System
*
* @API TYPE - Public
* @param psys_mac pointer to alt_tse_system_mac structure describing MAC of the system
* @param psys_msgdma pointer to alt_tse_system_msgdma structure describing SGDMA of the system
* @param psys_mem pointer to alt_tse_system_desc_mem structure describing Descriptor Memory of the system
* @param psys_phy pointer to alt_tse_system_phy structure describing PHY of the system
* @return SUCCESS on success
* ALTERA_TSE_MALLOC_FAILED if memory allocation failed
* ALTERA_TSE_SYSTEM_DEF_ERROR if definition of system incorrect or pointer == NULL
*/
alt_32 alt_tse_system_add_sys(
alt_tse_system_mac *psys_mac,
alt_tse_system_msgdma *psys_msgdma,
alt_tse_system_desc_mem *psys_mem,
alt_tse_system_shared_fifo *psys_shared_fifo,
alt_tse_system_phy *psys_phy );
/* @Function Description - Enable MDIO sharing for multiple single channel MAC
*
* @API TYPE - Public
* @param psys_mac_list pointer to array of alt_tse_system_mac structure sharing MDIO block
* @param number_of_mac number of MAC sharing MDIO block
* @return SUCCESS on success
* ALTERA_TSE_SYSTEM_DEF_ERROR if definition of system incorrect or pointer == NULL
* Multi-channel MAC not supported
*/
alt_32 alt_tse_sys_enable_mdio_sharing(alt_tse_system_mac **psys_mac_list, alt_u8 number_of_mac);
/* @Function Description: Get the common speed supported by all PHYs connected to the MAC within the same group
* @API Type: Public
* @param pmac Pointer to the TSE MAC Control Interface Base address
* @return common speed supported by all PHYs connected to the MAC, return TSE_PHY_SPEED_NO_COMMON if no common speed found
*/
alt_32 alt_tse_mac_get_common_speed(np_tse_mac *pmac);
/* @Function Description: Set the common speed to all PHYs connected to the MAC within the same group
* @API Type: Public
* @param pmac Pointer to the TSE MAC Control Interface Base address
* common_speed common speed supported by all PHYs
* @return common speed supported by all PHYs connected to the MAC, return TSE_PHY_SPEED_NO_COMMON if invalid common speed specified
*/
alt_32 alt_tse_mac_set_common_speed(np_tse_mac *pmac, alt_32 common_speed);
/********************************
*
* Internal API for TSE Driver
*
*******************************/
/* @Function Description: Get the index of alt_tse_system_info structure in tse_mac_device[]
* @API Type: Internal
* @param psys_info Pointer to the alt_tse_system_info structure
* @return Index of TSE system structure in tse_mac_device[]
*/
alt_32 alt_tse_get_system_index(alt_tse_system_info *psys_info);
/* @Function Description: Get the index of alt_tse_mac_group structure in pmac_groups[]
* @API Type: Internal
* @param pmac_group Pointer to the alt_tse_mac_group structure
* @return Index of alt_tse_mac_group structure in pmac_groups[]
*/
alt_32 alt_tse_get_mac_group_index(alt_tse_mac_group *pmac_group);
/* @Function Description: Get the index of alt_tse_mac_info structure in pmac_groups[]->pmac_info[]
* @API Type: Internal
* @param pmac_group Pointer to the alt_tse_mac_info structure
* @return Index of alt_tse_mac_info structure in pmac_groups[]->pmac_info[]
*/
alt_32 alt_tse_get_mac_info_index(alt_tse_mac_info *pmac_info);
/* @Function Description: Get the pointer of alt_tse_mac_info structure in pmac_groups[]->pmac_info[]
* @API Type: Internal
* @param pmac Pointer to the TSE MAC Control Interface Base address
* @return Pointer to alt_tse_mac_info structure in pmac_groups[]->pmac_info[]
*/
alt_tse_mac_info *alt_tse_get_mac_info(np_tse_mac *pmac);
/* @Function Description: Perform switching of the TSE MAC speed.
* COMMAND_CONFIG register is restored after reset.
* @API Type: Internal
* @param pmac Pointer to the TSE MAC Control Interface Base address
* @param speed 2 = 1000 Mbps, 1 = 100 Mbps, 0 = 10 Mbps
*/
alt_32 alt_tse_mac_set_speed(np_tse_mac *pmac, alt_u8 speed);
/* @Function Description: Perform switching of the TSE MAC duplex mode.
* COMMAND_CONFIG register is restored after reset.
* @API Type: Internal
* @param pmac Pointer to the TSE MAC Control Interface Base address
* @param duplex 1 = Full Duplex, 0 = Half Duplex
*/
alt_32 alt_tse_mac_set_duplex(np_tse_mac *pmac, alt_u8 duplex);
/** @Function Description - Determine link speed our PHY negotiated with our link partner.
* This is fully vendor specific depending on the PHY you are using.
*
* @API TYPE - Internal
* @param tse.mi.base MAC register map.
* @return
* ----------------------------------------------------------------------------------
* | BIT | Value: Description |
* ----------------------------------------------------------------------------------
* | 31-23 | Reserved |
* | 23 | 1: Argument *pmac not found from the list of MAC detected during init |
* | 22 | 1: No MDIO used by the MAC |
* | 21 | 1: No PHY detected |
* | 20 | 1: No common speed found for Multi-port MAC |
* | 19 | 1: PHY auto-negotiation not completed |
* | 18 | 1: No PHY profile match the detected PHY |
* | 17 | 1: PHY Profile not defined correctly |
* | 16 | 1: Invalid speed read from PHY |
* | 4-15 | Reserved |
* | 3 | 1: 10 Mbps link |
* | 2 | 1: 100 Mbps link |
* | 1 | 1: 1000 Mbps link |
* | 0 | 1: Full Duplex 0: Half Duplex |
* ----------------------------------------------------------------------------------
*
* If the link speed cannot be determined, it is fall back to 100 Mbps (customizable by changing ALTERA_TSE_MAC_SPEED_DEFAULT)
* Full duplex (customizable by changing ALTERA_TSE_DUPLEX_MODE_DEFAULT)
*/
alt_32 getPHYSpeed(np_tse_mac *pmac);
/* @Function Description: Read MDIO address from the MDIO address1 register of first MAC within MAC group
* @API Type: Internal
* @param pmac Pointer to the alt_tse_phy_info structure
* @return return SUCCESS
*/
alt_32 alt_tse_phy_rd_mdio_addr(alt_tse_phy_info *pphy);
/* @Function Description: Write MDIO address to the MDIO address1 register of first MAC within MAC group
* @API Type: Internal
* @param pmac Pointer to the alt_tse_phy_info structure
* @param mdio_address MDIO address to be written
* @return return SUCCESS
*/
alt_32 alt_tse_phy_wr_mdio_addr(alt_tse_phy_info *pphy, alt_u8 mdio_address);
/** @Function Description - Write value of data with bit_length number of bits to mdio register based on register location reg_num
* and start from bit location lsb_num.
*
* @API TYPE - Internal
* @param pphy pointer to alt_tse_phy_info structure
* @param reg_num location of mdio register to be written.
* @param lsb_num least significant bit location of mdio register to be written.
* @param bit_length number of bits to be written to the register.
* @param data data to be written to the register at specific bit location of register.
* @return SUCCESS
*/
alt_32 alt_tse_phy_wr_mdio_reg(alt_tse_phy_info *pphy, alt_u8 reg_num, alt_u8 lsb_num, alt_u8 bit_length, alt_u16 data);
/** @Function Description - Read bit_length number of bits from mdio register based on register location reg_num
* and start from bit location lsb_num.
*
* @API TYPE - Internal
* @param pphy pointer to alt_tse_phy_info structure
* @param reg_num location of mdio register to be read.
* @param lsb_num least significant bit location of mdio register to be read.
* @param bit_length number of bits to be read from the register.
* @return data read from mdio register
*/
alt_u32 alt_tse_phy_rd_mdio_reg(alt_tse_phy_info *pphy, alt_u8 reg_num, alt_u8 lsb_num, alt_u8 bit_length);
/* @Function Description: Add supported PHY to profile
* @API Type: Internal
* @param pmac N/A
* @return Number of PHY in profile
*
* User might add their own PHY by calling alt_tse_phy_add_profile()
*/
alt_32 alt_tse_phy_add_profile_default();
/* @Function Description: Display PHYs available in profile
* @API Type: Internal
* @param pmac N/A
* @return Number of PHY in profile
*/
alt_32 alt_tse_phy_print_profile();
/* @Function Description: Store information of all the MAC available in the system
* @API Type: Internal
* @param pmac N/A
* @return return SUCCESS
* return ALTERA_TSE_SYSTEM_DEF_ERROR if alt_tse_system_info structure definition error
*/
alt_32 alt_tse_mac_group_init();
/* @Function Description: Store information of all the PHYs connected to MAC to phy_list
* @API Type: Internal
* @param pmac_group Pointer to the TSE MAC grouping structure
* @return Number of PHY not in profile
*/
alt_32 alt_tse_mac_get_phy(alt_tse_mac_group *pmac_group);
/* @Function Description: Associate the PHYs connected to the structure in alt_tse_system_info.h
* @API Type: Internal
* @param pmac_group Pointer to the TSE MAC grouping structure
* @param pphy Pointer to the TSE PHY info structure which hold information of PHY
* @return return TSE_PHY_MAP_ERROR if mapping error
* return TSE_PHY_MAP_SUCCESS otherwise
*/
alt_32 alt_tse_mac_associate_phy(alt_tse_mac_group *pmac_group, alt_tse_phy_info *pphy);
/* @Function Description: Configure operating mode of Altera PCS if available
* @API Type: Internal
* @param pmac_info pointer to MAC info variable
* @return return SUCCESS
*/
alt_32 alt_tse_phy_cfg_pcs(alt_tse_mac_info *pmac_info);
/* @Function Description: Detect and initialize all the PHYs connected
* @API Type: Internal
* @param pmac N/A
* @return SUCCESS
*/
alt_32 alt_tse_phy_init();
/* @Function Description: Restart Auto-Negotiation for the PHY
* @API Type: Internal
* @param pphy Pointer to the alt_tse_phy_info structure
* timeout_threshold timeout value of Auto-Negotiation
* @return return TSE_PHY_AN_COMPLETE if success
* return TSE_PHY_AN_NOT_COMPLETE if auto-negotiation not completed
* return TSE_PHY_AN_NOT_CAPABLE if the PHY not capable for AN
*/
alt_32 alt_tse_phy_restart_an(alt_tse_phy_info *pphy, alt_u32 timeout_threshold);
/* @Function Description: Check link status of PHY and start Auto-Negotiation if it has not yet done
* @API Type: Internal
* @param pphy Pointer to the alt_tse_phy_info structure
* timeout_threshold timeout value of Auto-Negotiation
* @return return TSE_PHY_AN_COMPLETE if success
* return TSE_PHY_AN_NOT_COMPLETE if auto-negotiation not completed
*/
alt_32 alt_tse_phy_check_link(alt_tse_phy_info *pphy, alt_u32 timeout_threshold);
/* @Function Description: Get link capability of PHY and link partner
* @API Type: Internal
* @param pmac Pointer to the alt_tse_phy_info structure
* @return return TSE_PHY_AN_COMPLETE if success
* return TSE_PHY_AN_NOT_COMPLETE if auto-negotiation not completed
* return TSE_PHY_AN_NOT_CAPABLE if the PHY not capable for AN
*/
alt_32 alt_tse_phy_get_cap(alt_tse_phy_info *pphy);
/* @Function Description: Set the advertisement of PHY for 1000 Mbps
* @API Type: Internal
* @param pmac Pointer to the alt_tse_phy_info structure
* enable set Enable = 1 to advertise this speed if the PHY capable
* set Enable = 0 to disable advertise of this speed
* @return return SUCCESS
*/
alt_32 alt_tse_phy_set_adv_1000(alt_tse_phy_info *pphy, alt_u8 enable);
/* @Function Description: Set the advertisement of PHY for 100 Mbps
* @API Type: Internal
* @param pmac Pointer to the alt_tse_phy_info structure
* enable set Enable = 1 to advertise this speed if the PHY capable
* set Enable = 0 to disable advertise of this speed
* @return return SUCCESS
*/
alt_32 alt_tse_phy_set_adv_100(alt_tse_phy_info *pphy, alt_u8 enable);
/* @Function Description: Set the advertisement of PHY for 10 Mbps
* @API Type: Internal
* @param pmac Pointer to the alt_tse_phy_info structure
* enable set Enable = 1 to advertise this speed if the PHY capable
* set Enable = 0 to disable advertise of this speed
* @return return SUCCESS
*/
alt_32 alt_tse_phy_set_adv_10(alt_tse_phy_info *pphy, alt_u8 enable);
/* @Function Description: Get the common speed supported by all PHYs connected to the MAC within the same group
* @API Type: Internal
* @param pmac_group Pointer to the TSE MAC Group structure which group all the MACs that should use the same speed
* @return common speed supported by all PHYs connected to the MAC, return TSE_PHY_SPEED_NO_COMMON if no common speed found
*/
alt_32 alt_tse_phy_get_common_speed(alt_tse_mac_group *pmac_group);
/* @Function Description: Set the common speed to all PHYs connected to the MAC within the same group
* @API Type: Internal
* @param pmac_group Pointer to the TSE MAC Group structure which group all the MACs that should use the same speed
* common_speed common speed supported by all PHYs
* @return common speed supported by all PHYs connected to the MAC, return TSE_PHY_SPEED_NO_COMMON if invalid common speed specified
*/
alt_32 alt_tse_phy_set_common_speed(alt_tse_mac_group *pmac_group, alt_32 common_speed);
/* @Function Description: Additional configuration for Marvell PHY
* @API Type: Internal
* @param pmac Pointer to the first TSE MAC Control Interface Base address of MAC group
*/
alt_32 marvell_phy_cfg(np_tse_mac *pmac);
/* @Function Description: Additional configuration for PEF7071 PHY
* @API Type: Internal
* @param pmac Pointer to the first TSE MAC Control Interface Base address of MAC group
*/
alt_32 PEF7071_config(np_tse_mac *pmac);
/* @Function Description: Change operating mode of Marvell PHY to GMII
* @API Type: Internal
* @param pmac Pointer to the first TSE MAC Control Interface Base address within MAC group
*/
alt_32 marvell_cfg_gmii(np_tse_mac *pmac);
/* @Function Description: Change operating mode of Marvell PHY to SGMII
* @API Type: Internal
* @param pmac Pointer to the first TSE MAC Control Interface Base address within MAC group
*/
alt_32 marvell_cfg_sgmii(np_tse_mac *pmac);
/* @Function Description: Change operating mode of Marvell PHY to RGMII
* @API Type: Internal
* @param pmac Pointer to the first TSE MAC Control Interface Base address within MAC group
*/
alt_32 marvell_cfg_rgmii(np_tse_mac *pmac);
/* @Function Description: Read link status from PHY specific status register of DP83848C
* @API Type: Internal
* @param pmac Pointer to the first TSE MAC Control Interface Base address within MAC group
*/
alt_u32 DP83848C_link_status_read(np_tse_mac *pmac);
/* @Function Description: Read link status from PHY specific status register of PEF7071
* @API Type: Internal
* @param pmac Pointer to the first TSE MAC Control Interface Base address within MAC group
*/
alt_u32 PEF7071_link_status_read(np_tse_mac *pmac);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __ALTERA_AVALON_TSE_H__ */