| /* | |
| * Copyright(c) 2015 EZchip Technologies. | |
| * | |
| * This program is free software; you can redistribute it and/or modify it | |
| * under the terms and conditions of the GNU General Public License, | |
| * version 2, as published by the Free Software Foundation. | |
| * | |
| * This program is distributed in the hope it will be useful, but WITHOUT | |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
| * more details. | |
| * | |
| * The full GNU General Public License is included in this distribution in | |
| * the file called "COPYING". | |
| */ | |
| #ifndef _NPS_ENET_H | |
| #define _NPS_ENET_H | |
| /* default values */ | |
| #define NPS_ENET_NAPI_POLL_WEIGHT 0x2 | |
| #define NPS_ENET_MAX_FRAME_LENGTH 0x3FFF | |
| #define NPS_ENET_GE_MAC_CFG_0_TX_FC_RETR 0x7 | |
| #define NPS_ENET_GE_MAC_CFG_0_RX_IFG 0x5 | |
| #define NPS_ENET_GE_MAC_CFG_0_TX_IFG 0xC | |
| #define NPS_ENET_GE_MAC_CFG_0_TX_PR_LEN 0x7 | |
| #define NPS_ENET_GE_MAC_CFG_2_STAT_EN 0x3 | |
| #define NPS_ENET_GE_MAC_CFG_3_RX_IFG_TH 0x14 | |
| #define NPS_ENET_GE_MAC_CFG_3_MAX_LEN 0x3FFC | |
| #define NPS_ENET_ENABLE 1 | |
| #define NPS_ENET_DISABLE 0 | |
| /* register definitions */ | |
| #define NPS_ENET_REG_TX_CTL 0x800 | |
| #define NPS_ENET_REG_TX_BUF 0x808 | |
| #define NPS_ENET_REG_RX_CTL 0x810 | |
| #define NPS_ENET_REG_RX_BUF 0x818 | |
| #define NPS_ENET_REG_BUF_INT_ENABLE 0x8C0 | |
| #define NPS_ENET_REG_GE_MAC_CFG_0 0x1000 | |
| #define NPS_ENET_REG_GE_MAC_CFG_1 0x1004 | |
| #define NPS_ENET_REG_GE_MAC_CFG_2 0x1008 | |
| #define NPS_ENET_REG_GE_MAC_CFG_3 0x100C | |
| #define NPS_ENET_REG_GE_RST 0x1400 | |
| #define NPS_ENET_REG_PHASE_FIFO_CTL 0x1404 | |
| /* Tx control register */ | |
| struct nps_enet_tx_ctl { | |
| union { | |
| /* ct: SW sets to indicate frame ready in Tx buffer for | |
| * transmission. HW resets to when transmission done | |
| * et: Transmit error | |
| * nt: Length in bytes of Tx frame loaded to Tx buffer | |
| */ | |
| struct { | |
| u32 | |
| __reserved_1:16, | |
| ct:1, | |
| et:1, | |
| __reserved_2:3, | |
| nt:11; | |
| }; | |
| u32 value; | |
| }; | |
| }; | |
| /* Rx control register */ | |
| struct nps_enet_rx_ctl { | |
| union { | |
| /* cr: HW sets to indicate frame ready in Rx buffer. | |
| * SW resets to indicate host read received frame | |
| * and new frames can be written to Rx buffer | |
| * er: Rx error indication | |
| * crc: Rx CRC error indication | |
| * nr: Length in bytes of Rx frame loaded by MAC to Rx buffer | |
| */ | |
| struct { | |
| u32 | |
| __reserved_1:16, | |
| cr:1, | |
| er:1, | |
| crc:1, | |
| __reserved_2:2, | |
| nr:11; | |
| }; | |
| u32 value; | |
| }; | |
| }; | |
| /* Interrupt enable for data buffer events register */ | |
| struct nps_enet_buf_int_enable { | |
| union { | |
| /* tx_done: Interrupt generation in the case when new frame | |
| * is ready in Rx buffer | |
| * rx_rdy: Interrupt generation in the case when current frame | |
| * was read from TX buffer | |
| */ | |
| struct { | |
| u32 | |
| __reserved:30, | |
| tx_done:1, | |
| rx_rdy:1; | |
| }; | |
| u32 value; | |
| }; | |
| }; | |
| /* Gbps Eth MAC Configuration 0 register */ | |
| struct nps_enet_ge_mac_cfg_0 { | |
| union { | |
| /* tx_pr_len: Transmit preamble length in bytes | |
| * tx_ifg_nib: Tx idle pattern | |
| * nib_mode: Nibble (4-bit) Mode | |
| * rx_pr_check_en: Receive preamble Check Enable | |
| * tx_ifg: Transmit inter-Frame Gap | |
| * rx_ifg: Receive inter-Frame Gap | |
| * tx_fc_retr: Transmit Flow Control Retransmit Mode | |
| * rx_length_check_en: Receive Length Check Enable | |
| * rx_crc_ignore: Results of the CRC check are ignored | |
| * rx_crc_strip: MAC strips the CRC from received frames | |
| * rx_fc_en: Receive Flow Control Enable | |
| * tx_crc_en: Transmit CRC Enabled | |
| * tx_pad_en: Transmit Padding Enable | |
| * tx_cf_en: Transmit Flow Control Enable | |
| * tx_en: Transmit Enable | |
| * rx_en: Receive Enable | |
| */ | |
| struct { | |
| u32 | |
| tx_pr_len:4, | |
| tx_ifg_nib:4, | |
| nib_mode:1, | |
| rx_pr_check_en:1, | |
| tx_ifg:6, | |
| rx_ifg:4, | |
| tx_fc_retr:3, | |
| rx_length_check_en:1, | |
| rx_crc_ignore:1, | |
| rx_crc_strip:1, | |
| rx_fc_en:1, | |
| tx_crc_en:1, | |
| tx_pad_en:1, | |
| tx_fc_en:1, | |
| tx_en:1, | |
| rx_en:1; | |
| }; | |
| u32 value; | |
| }; | |
| }; | |
| /* Gbps Eth MAC Configuration 1 register */ | |
| struct nps_enet_ge_mac_cfg_1 { | |
| union { | |
| /* octet_3: MAC address octet 3 | |
| * octet_2: MAC address octet 2 | |
| * octet_1: MAC address octet 1 | |
| * octet_0: MAC address octet 0 | |
| */ | |
| struct { | |
| u32 | |
| octet_3:8, | |
| octet_2:8, | |
| octet_1:8, | |
| octet_0:8; | |
| }; | |
| u32 value; | |
| }; | |
| }; | |
| /* Gbps Eth MAC Configuration 2 register */ | |
| struct nps_enet_ge_mac_cfg_2 { | |
| union { | |
| /* transmit_flush_en: MAC flush enable | |
| * stat_en: RMON statistics interface enable | |
| * disc_da: Discard frames with DA different | |
| * from MAC address | |
| * disc_bc: Discard broadcast frames | |
| * disc_mc: Discard multicast frames | |
| * octet_5: MAC address octet 5 | |
| * octet_4: MAC address octet 4 | |
| */ | |
| struct { | |
| u32 | |
| transmit_flush_en:1, | |
| __reserved_1:5, | |
| stat_en:2, | |
| __reserved_2:1, | |
| disc_da:1, | |
| disc_bc:1, | |
| disc_mc:1, | |
| __reserved_3:4, | |
| octet_5:8, | |
| octet_4:8; | |
| }; | |
| u32 value; | |
| }; | |
| }; | |
| /* Gbps Eth MAC Configuration 3 register */ | |
| struct nps_enet_ge_mac_cfg_3 { | |
| union { | |
| /* ext_oob_cbfc_sel: Selects one of the 4 profiles for | |
| * extended OOB in-flow-control indication | |
| * max_len: Maximum receive frame length in bytes | |
| * tx_cbfc_en: Enable transmission of class-based | |
| * flow control packets | |
| * rx_ifg_th: Threshold for IFG status reporting via OOB | |
| * cf_timeout: Configurable time to decrement FC counters | |
| * cf_drop: Drop control frames | |
| * redirect_cbfc_sel: Selects one of CBFC redirect profiles | |
| * rx_cbfc_redir_en: Enable Rx class-based flow | |
| * control redirect | |
| * rx_cbfc_en: Enable Rx class-based flow control | |
| * tm_hd_mode: TM header mode | |
| */ | |
| struct { | |
| u32 | |
| ext_oob_cbfc_sel:2, | |
| max_len:14, | |
| tx_cbfc_en:1, | |
| rx_ifg_th:5, | |
| cf_timeout:4, | |
| cf_drop:1, | |
| redirect_cbfc_sel:2, | |
| rx_cbfc_redir_en:1, | |
| rx_cbfc_en:1, | |
| tm_hd_mode:1; | |
| }; | |
| u32 value; | |
| }; | |
| }; | |
| /* GE MAC, PCS reset control register */ | |
| struct nps_enet_ge_rst { | |
| union { | |
| /* gmac_0: GE MAC reset | |
| * spcs_0: SGMII PCS reset | |
| */ | |
| struct { | |
| u32 | |
| __reserved_1:23, | |
| gmac_0:1, | |
| __reserved_2:7, | |
| spcs_0:1; | |
| }; | |
| u32 value; | |
| }; | |
| }; | |
| /* Tx phase sync FIFO control register */ | |
| struct nps_enet_phase_fifo_ctl { | |
| union { | |
| /* init: initialize serdes TX phase sync FIFO pointers | |
| * rst: reset serdes TX phase sync FIFO | |
| */ | |
| struct { | |
| u32 | |
| __reserved:30, | |
| init:1, | |
| rst:1; | |
| }; | |
| u32 value; | |
| }; | |
| }; | |
| /** | |
| * struct nps_enet_priv - Storage of ENET's private information. | |
| * @regs_base: Base address of ENET memory-mapped control registers. | |
| * @irq: For RX/TX IRQ number. | |
| * @tx_packet_sent: SW indication if frame is being sent. | |
| * @tx_skb: socket buffer of sent frame. | |
| * @napi: Structure for NAPI. | |
| */ | |
| struct nps_enet_priv { | |
| void __iomem *regs_base; | |
| s32 irq; | |
| bool tx_packet_sent; | |
| struct sk_buff *tx_skb; | |
| struct napi_struct napi; | |
| struct nps_enet_ge_mac_cfg_2 ge_mac_cfg_2; | |
| struct nps_enet_ge_mac_cfg_3 ge_mac_cfg_3; | |
| }; | |
| /** | |
| * nps_reg_set - Sets ENET register with provided value. | |
| * @priv: Pointer to EZchip ENET private data structure. | |
| * @reg: Register offset from base address. | |
| * @value: Value to set in register. | |
| */ | |
| static inline void nps_enet_reg_set(struct nps_enet_priv *priv, | |
| s32 reg, s32 value) | |
| { | |
| iowrite32be(value, priv->regs_base + reg); | |
| } | |
| /** | |
| * nps_reg_get - Gets value of specified ENET register. | |
| * @priv: Pointer to EZchip ENET private data structure. | |
| * @reg: Register offset from base address. | |
| * | |
| * returns: Value of requested register. | |
| */ | |
| static inline u32 nps_enet_reg_get(struct nps_enet_priv *priv, s32 reg) | |
| { | |
| return ioread32be(priv->regs_base + reg); | |
| } | |
| #endif /* _NPS_ENET_H */ |