| #ifndef _PFE_ETH_H_ |
| #define _PFE_ETH_H_ |
| #include <linux/kernel.h> |
| #include <linux/netdevice.h> |
| #include <linux/etherdevice.h> |
| #include <linux/ethtool.h> |
| #include <linux/mii.h> |
| #include <linux/phy.h> |
| #include <linux/clk.h> |
| #include <linux/interrupt.h> |
| #include <linux/time.h> |
| |
| #define PFE_ETH_TSO_STATS |
| #define PFE_ETH_LRO_STATS |
| #define PFE_ETH_NAPI_STATS |
| #define PFE_ETH_TX_STATS |
| |
| #define LRO_LEN_COUNT_MAX 32 |
| #define LRO_NB_COUNT_MAX 32 |
| |
| #if defined(CONFIG_PLATFORM_PCI) || defined(CONFIG_PLATFORM_EMULATION) |
| |
| #define CONFIG_COMCERTO_GEMAC 1 |
| |
| #define CONFIG_COMCERTO_USE_MII 1 |
| #define CONFIG_COMCERTO_USE_RMII 2 |
| #define CONFIG_COMCERTO_USE_GMII 4 |
| #define CONFIG_COMCERTO_USE_RGMII 8 |
| #define CONFIG_COMCERTO_USE_SGMII 16 |
| |
| #define GEMAC_SW_CONF (1 << 8) | (1 << 11) // GEMAC configured by SW |
| #define GEMAC_PHY_CONF 0 // GEMAC configured by phy lines (not for MII/GMII) |
| #define GEMAC_SW_FULL_DUPLEX (1 << 9) |
| #define GEMAC_SW_SPEED_10M (0 << 12) |
| #define GEMAC_SW_SPEED_100M (1 << 12) |
| #define GEMAC_SW_SPEED_1G (2 << 12) |
| |
| #define GEMAC_NO_PHY (1 << 0) // set if no phy connected to MAC (ex ethernet switch). In this case use MAC fixed configuration |
| #define GEMAC_PHY_RGMII_ADD_DELAY (1 << 1) |
| |
| /* gemac to interface name assignment */ |
| #define GEMAC0_ITF_NAME "eth5" |
| #define GEMAC1_ITF_NAME "eth6" |
| #define GEMAC2_ITF_NAME "eth7" |
| |
| #define GEMAC0_MAC { 0x00, 0xED, 0xCD, 0xEF, 0xAA, 0xCC } |
| #define GEMAC1_MAC { 0x00, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E } |
| |
| struct comcerto_eth_platform_data { |
| /* device specific information */ |
| u32 device_flags; |
| char name[16]; |
| |
| |
| /* board specific information */ |
| u32 mii_config; |
| u32 gemac_mode; |
| u32 phy_flags; |
| u32 gem_id; |
| u32 bus_id; |
| u32 phy_id; |
| u8 *mac_addr; |
| }; |
| |
| struct comcerto_mdio_platform_data { |
| int enabled; |
| int irq[32]; |
| u32 phy_mask; |
| int mdc_div; |
| }; |
| |
| struct comcerto_pfe_platform_data |
| { |
| struct comcerto_eth_platform_data comcerto_eth_pdata[3]; |
| struct comcerto_mdio_platform_data comcerto_mdio_pdata[3]; |
| }; |
| |
| static struct comcerto_pfe_platform_data comcerto_pfe_pdata = { |
| .comcerto_eth_pdata[0] = { |
| .name = GEMAC0_ITF_NAME, |
| .device_flags = CONFIG_COMCERTO_GEMAC, |
| .mii_config = CONFIG_COMCERTO_USE_MII, |
| .gemac_mode = GEMAC_SW_CONF | GEMAC_SW_FULL_DUPLEX | GEMAC_SW_SPEED_100M, |
| #if defined(CONFIG_PLATFORM_EMULATION) || defined(CONFIG_PLATFORM_PCI) |
| .phy_flags = GEMAC_NO_PHY, |
| #else |
| .phy_flags = GEMAC_PHY_RGMII_ADD_DELAY, |
| #endif |
| .bus_id = 0, |
| .phy_id = 0, |
| .gem_id = 0, |
| .mac_addr = (u8[])GEMAC0_MAC, |
| }, |
| |
| .comcerto_eth_pdata[1] = { |
| .name = GEMAC1_ITF_NAME, |
| .device_flags = CONFIG_COMCERTO_GEMAC, |
| .mii_config = CONFIG_COMCERTO_USE_RGMII, |
| .gemac_mode = GEMAC_SW_CONF | GEMAC_SW_FULL_DUPLEX | GEMAC_SW_SPEED_1G, |
| .phy_flags = GEMAC_NO_PHY, |
| .gem_id = 1, |
| .mac_addr = (u8[])GEMAC1_MAC, |
| }, |
| |
| .comcerto_eth_pdata[2] = { |
| .name = GEMAC2_ITF_NAME, |
| }, |
| |
| .comcerto_mdio_pdata[0] = { |
| .enabled = 1, |
| .phy_mask = 0xFFFFFFFE, |
| .mdc_div = 96, |
| .irq = { |
| [0] = PHY_POLL, |
| }, |
| }, |
| }; |
| #endif |
| |
| #define NUM_GEMAC_SUPPORT 3 |
| #define DRV_NAME "c2000-geth" |
| #define COMCERTO_INFOSTR_LEN 32 |
| #define COMCERTO_TX_RECOVERY_TIMEOUT_MS 500 |
| #define COMCERTO_TX_FAST_RECOVERY_TIMEOUT_MS 3 |
| |
| #define EMAC_TXQ_CNT 16 |
| #define EMAC_TXQ_DEPTH (HIF_TX_DESC_NT) |
| |
| #define JUMBO_FRAME_SIZE 10258 |
| /** |
| * Client Tx queue threshold, for txQ flush condition. |
| * It must be smaller than the queue size (in case we ever change it in the future). |
| */ |
| #define HIF_CL_TX_FLUSH_MARK 32 |
| |
| /** |
| * Max number of TX resources (HIF descriptors or skbs) that will be released |
| * in a single go during batch recycling. |
| * Should be lower than the flush mark so the SW can provide the HW with a |
| * continuous stream of packets instead of bursts. |
| */ |
| #define TX_FREE_MAX_COUNT 16 |
| #define EMAC_RXQ_CNT 3 |
| #define EMAC_RXQ_DEPTH HIF_RX_DESC_NT /* make sure clients can receive a full burst of packets */ |
| #define EMAC_RMON_TXBYTES_POS 0x00 |
| #define EMAC_RMON_RXBYTES_POS 0x14 |
| |
| #define EMAC_QUEUENUM_MASK (EMAC_TXQ_CNT - 1) |
| #define EMAC_MDIO_TIMEOUT 1000 |
| #define MAX_UC_SPEC_ADDR_REG 31 |
| |
| #define ETH_HIF_NODMA_MAP 1 |
| |
| #ifdef ETH_HIF_NODMA_MAP |
| struct hif_frag_dma_map_s { |
| dma_addr_t data; |
| int len; |
| }; |
| |
| struct hif_frag_info_s { |
| struct hif_frag_dma_map_s *map; |
| int frag_count; |
| }; |
| #endif |
| |
| /* The set of statistics registers implemented in the Cadence MAC. |
| * The statistics registers implemented are a subset of all the statistics |
| * available, but contains all the compulsory ones. |
| * For full descriptions on the registers, refer to the Cadence MAC programmers |
| * guide or the IEEE 802.3 specifications. |
| */ |
| struct gemac_stats{ |
| u32 octets_tx_bot; /* Lower 32-bits for number of octets tx'd */ |
| u32 octets_tx_top; /* Upper 16-bits for number of octets tx'd */ |
| u32 frames_tx; /* Number of frames transmitted OK */ |
| u32 broadcast_tx; /* Number of broadcast frames transmitted */ |
| u32 multicast_tx; /* Number of multicast frames transmitted */ |
| u32 pause_tx; /* Number of pause frames transmitted. */ |
| u32 frame64_tx; /* Number of 64byte frames transmitted */ |
| u32 frame65_127_tx; /* Number of 65-127 byte frames transmitted */ |
| u32 frame128_255_tx; /* Number of 128-255 byte frames transmitted */ |
| u32 frame256_511_tx; /* Number of 256-511 byte frames transmitted */ |
| u32 frame512_1023_tx; /* Number of 512-1023 byte frames transmitted */ |
| u32 frame1024_1518_tx; /* Number of 1024-1518 byte frames transmitted*/ |
| u32 frame1519_tx; /* Number of frames greater than 1518 bytes tx*/ |
| u32 tx_urun; /* Transmit underrun errors due to DMA */ |
| u32 single_col; /* Number of single collision frames */ |
| u32 multi_col; /* Number of multi collision frames */ |
| u32 excess_col; /* Number of excessive collision frames. */ |
| u32 late_col; /* Collisions occuring after slot time */ |
| u32 def_tx; /* Frames deferred due to crs */ |
| u32 crs_errors; /* Errors caused by crs not being asserted. */ |
| u32 octets_rx_bot; /* Lower 32-bits for number of octets rx'd */ |
| u32 octets_rx_top; /* Upper 16-bits for number of octets rx'd */ |
| u32 frames_rx; /* Number of frames received OK */ |
| u32 broadcast_rx; /* Number of broadcast frames received */ |
| u32 multicast_rx; /* Number of multicast frames received */ |
| u32 pause_rx; /* Number of pause frames received. */ |
| u32 frame64_rx; /* Number of 64byte frames received */ |
| u32 frame65_127_rx; /* Number of 65-127 byte frames received */ |
| u32 frame128_255_rx; /* Number of 128-255 byte frames received */ |
| u32 frame256_511_rx; /* Number of 256-511 byte frames received */ |
| u32 frame512_1023_rx; /* Number of 512-1023 byte frames received */ |
| u32 frame1024_1518_rx; /* Number of 1024-1518 byte frames received*/ |
| u32 frame1519_rx; /* Number of frames greater than 1518 bytes rx*/ |
| u32 usize_frames; /* Frames received less than min of 64 bytes */ |
| u32 excess_length; /* Number of excessive length frames rx */ |
| u32 jabbers; /* Excessive length + crc or align errors. */ |
| u32 fcs_errors; /* Number of frames received with crc errors */ |
| u32 length_check_errors;/* Number of frames with incorrect length */ |
| u32 rx_symbol_errors; /* Number of times rx_er asserted during rx */ |
| u32 align_errors; /* Frames received without integer no. bytes */ |
| u32 rx_res_errors; /* Number of times buffers ran out during rx */ |
| u32 rx_orun; /* Receive overrun errors due to DMA */ |
| u32 ip_cksum; /* IP header checksum errors */ |
| u32 tcp_cksum; /* TCP checksum errors */ |
| u32 udp_cksum; /* UDP checksum errors */ |
| }; |
| |
| #define EMAC_REG_SPACE sizeof(struct gemac_reg) |
| #define EMAC_RMON_LEN (sizeof(struct gemac_stats)/sizeof(u32)) |
| |
| |
| struct pfe_eth_fast_timer { |
| int queuenum; |
| struct hrtimer timer; |
| void * base; |
| }; |
| |
| #include "pfe_tso.h" |
| typedef struct pfe_eth_priv_s |
| { |
| struct pfe *pfe; |
| struct hif_client_s client; |
| struct napi_struct lro_napi; |
| struct napi_struct low_napi; |
| struct napi_struct high_napi; |
| int low_tmuQ; |
| int high_tmuQ; |
| struct net_device_stats stats; |
| struct net_device *dev; |
| int id; |
| int promisc; |
| unsigned int msg_enable; |
| |
| spinlock_t lock; |
| unsigned int event_status; |
| int irq; |
| void* EMAC_baseaddr; |
| void* GPI_baseaddr; |
| /* PHY stuff */ |
| struct phy_device *phydev; |
| int oldspeed; |
| int oldduplex; |
| int oldlink; |
| /* mdio info */ |
| int mdc_div; |
| struct mii_bus *mii_bus; |
| /* gemac tc clock */ |
| struct clk *gemtx_clk; |
| |
| int default_priority; |
| struct timer_list tx_timer; |
| struct pfe_eth_fast_timer fast_tx_timeout[EMAC_TXQ_CNT]; |
| int cpu_id; |
| |
| #ifdef ETH_HIF_NODMA_MAP |
| /* This array is used to store the dma mapping for skb fragments */ |
| struct hif_frag_info_s dma_map_array[EMAC_TXQ_CNT][EMAC_TXQ_DEPTH]; |
| #endif |
| struct comcerto_eth_platform_data *einfo; |
| struct sk_buff *skb_inflight[EMAC_RXQ_CNT + 6]; |
| |
| #ifdef PFE_ETH_LRO_STATS |
| unsigned int lro_len_counters[LRO_LEN_COUNT_MAX]; |
| unsigned int lro_nb_counters[LRO_NB_COUNT_MAX]; //TODO change to exact max number when RX scatter done |
| #endif |
| |
| struct tso_cb_s tso; |
| |
| #ifdef PFE_ETH_TX_STATS |
| unsigned int stop_queue_total[EMAC_TXQ_CNT]; |
| unsigned int stop_queue_hif[EMAC_TXQ_CNT]; |
| unsigned int stop_queue_hif_client[EMAC_TXQ_CNT]; |
| unsigned int stop_queue_credit[EMAC_TXQ_CNT]; |
| unsigned int clean_fail[EMAC_TXQ_CNT]; |
| unsigned int was_stopped[EMAC_TXQ_CNT]; |
| #endif |
| |
| #ifdef PFE_ETH_NAPI_STATS |
| unsigned int napi_counters[NAPI_MAX_COUNT]; |
| #endif |
| |
| }pfe_eth_priv_t; |
| |
| struct pfe_eth { |
| struct pfe_eth_priv_s *eth_priv[3]; |
| }; |
| |
| int pfe_eth_init(struct pfe *pfe); |
| void pfe_eth_exit(struct pfe *pfe); |
| |
| |
| |
| #endif /* _PFE_ETH_H_ */ |