123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536 |
- /* Altera Triple-Speed Ethernet MAC driver
- * Copyright (C) 2008-2014 Altera Corporation. All rights reserved
- *
- * Contributors:
- * Dalon Westergreen
- * Thomas Chou
- * Ian Abbott
- * Yuriy Kozlov
- * Tobias Klauser
- * Andriy Smolskyy
- * Roman Bulgakov
- * Dmytro Mytarchuk
- * Matthew Gerlach
- *
- * Original driver contributed by SLS.
- * Major updates contributed by GlobalLogic
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program. If not, see <http://www.gnu.org/licenses/>.
- */
- #ifndef __ALTERA_TSE_H__
- #define __ALTERA_TSE_H__
- #define ALTERA_TSE_RESOURCE_NAME "altera_tse"
- #include <linux/bitops.h>
- #include <linux/if_vlan.h>
- #include <linux/list.h>
- #include <linux/netdevice.h>
- #include <linux/phy.h>
- #define ALTERA_TSE_SW_RESET_WATCHDOG_CNTR 10000
- #define ALTERA_TSE_MAC_FIFO_WIDTH 4 /* TX/RX FIFO width in
- * bytes
- */
- /* Rx FIFO default settings */
- #define ALTERA_TSE_RX_SECTION_EMPTY 16
- #define ALTERA_TSE_RX_SECTION_FULL 0
- #define ALTERA_TSE_RX_ALMOST_EMPTY 8
- #define ALTERA_TSE_RX_ALMOST_FULL 8
- /* Tx FIFO default settings */
- #define ALTERA_TSE_TX_SECTION_EMPTY 16
- #define ALTERA_TSE_TX_SECTION_FULL 0
- #define ALTERA_TSE_TX_ALMOST_EMPTY 8
- #define ALTERA_TSE_TX_ALMOST_FULL 3
- /* MAC function configuration default settings */
- #define ALTERA_TSE_TX_IPG_LENGTH 12
- #define ALTERA_TSE_PAUSE_QUANTA 0xffff
- #define GET_BIT_VALUE(v, bit) (((v) >> (bit)) & 0x1)
- /* MAC Command_Config Register Bit Definitions
- */
- #define MAC_CMDCFG_TX_ENA BIT(0)
- #define MAC_CMDCFG_RX_ENA BIT(1)
- #define MAC_CMDCFG_XON_GEN BIT(2)
- #define MAC_CMDCFG_ETH_SPEED BIT(3)
- #define MAC_CMDCFG_PROMIS_EN BIT(4)
- #define MAC_CMDCFG_PAD_EN BIT(5)
- #define MAC_CMDCFG_CRC_FWD BIT(6)
- #define MAC_CMDCFG_PAUSE_FWD BIT(7)
- #define MAC_CMDCFG_PAUSE_IGNORE BIT(8)
- #define MAC_CMDCFG_TX_ADDR_INS BIT(9)
- #define MAC_CMDCFG_HD_ENA BIT(10)
- #define MAC_CMDCFG_EXCESS_COL BIT(11)
- #define MAC_CMDCFG_LATE_COL BIT(12)
- #define MAC_CMDCFG_SW_RESET BIT(13)
- #define MAC_CMDCFG_MHASH_SEL BIT(14)
- #define MAC_CMDCFG_LOOP_ENA BIT(15)
- #define MAC_CMDCFG_TX_ADDR_SEL(v) (((v) & 0x7) << 16)
- #define MAC_CMDCFG_MAGIC_ENA BIT(19)
- #define MAC_CMDCFG_SLEEP BIT(20)
- #define MAC_CMDCFG_WAKEUP BIT(21)
- #define MAC_CMDCFG_XOFF_GEN BIT(22)
- #define MAC_CMDCFG_CNTL_FRM_ENA BIT(23)
- #define MAC_CMDCFG_NO_LGTH_CHECK BIT(24)
- #define MAC_CMDCFG_ENA_10 BIT(25)
- #define MAC_CMDCFG_RX_ERR_DISC BIT(26)
- #define MAC_CMDCFG_DISABLE_READ_TIMEOUT BIT(27)
- #define MAC_CMDCFG_CNT_RESET BIT(31)
- #define MAC_CMDCFG_TX_ENA_GET(v) GET_BIT_VALUE(v, 0)
- #define MAC_CMDCFG_RX_ENA_GET(v) GET_BIT_VALUE(v, 1)
- #define MAC_CMDCFG_XON_GEN_GET(v) GET_BIT_VALUE(v, 2)
- #define MAC_CMDCFG_ETH_SPEED_GET(v) GET_BIT_VALUE(v, 3)
- #define MAC_CMDCFG_PROMIS_EN_GET(v) GET_BIT_VALUE(v, 4)
- #define MAC_CMDCFG_PAD_EN_GET(v) GET_BIT_VALUE(v, 5)
- #define MAC_CMDCFG_CRC_FWD_GET(v) GET_BIT_VALUE(v, 6)
- #define MAC_CMDCFG_PAUSE_FWD_GET(v) GET_BIT_VALUE(v, 7)
- #define MAC_CMDCFG_PAUSE_IGNORE_GET(v) GET_BIT_VALUE(v, 8)
- #define MAC_CMDCFG_TX_ADDR_INS_GET(v) GET_BIT_VALUE(v, 9)
- #define MAC_CMDCFG_HD_ENA_GET(v) GET_BIT_VALUE(v, 10)
- #define MAC_CMDCFG_EXCESS_COL_GET(v) GET_BIT_VALUE(v, 11)
- #define MAC_CMDCFG_LATE_COL_GET(v) GET_BIT_VALUE(v, 12)
- #define MAC_CMDCFG_SW_RESET_GET(v) GET_BIT_VALUE(v, 13)
- #define MAC_CMDCFG_MHASH_SEL_GET(v) GET_BIT_VALUE(v, 14)
- #define MAC_CMDCFG_LOOP_ENA_GET(v) GET_BIT_VALUE(v, 15)
- #define MAC_CMDCFG_TX_ADDR_SEL_GET(v) (((v) >> 16) & 0x7)
- #define MAC_CMDCFG_MAGIC_ENA_GET(v) GET_BIT_VALUE(v, 19)
- #define MAC_CMDCFG_SLEEP_GET(v) GET_BIT_VALUE(v, 20)
- #define MAC_CMDCFG_WAKEUP_GET(v) GET_BIT_VALUE(v, 21)
- #define MAC_CMDCFG_XOFF_GEN_GET(v) GET_BIT_VALUE(v, 22)
- #define MAC_CMDCFG_CNTL_FRM_ENA_GET(v) GET_BIT_VALUE(v, 23)
- #define MAC_CMDCFG_NO_LGTH_CHECK_GET(v) GET_BIT_VALUE(v, 24)
- #define MAC_CMDCFG_ENA_10_GET(v) GET_BIT_VALUE(v, 25)
- #define MAC_CMDCFG_RX_ERR_DISC_GET(v) GET_BIT_VALUE(v, 26)
- #define MAC_CMDCFG_DISABLE_READ_TIMEOUT_GET(v) GET_BIT_VALUE(v, 27)
- #define MAC_CMDCFG_CNT_RESET_GET(v) GET_BIT_VALUE(v, 31)
- /* MDIO registers within MAC register Space
- */
- struct altera_tse_mdio {
- u32 control; /* PHY device operation control register */
- u32 status; /* PHY device operation status register */
- u32 phy_id1; /* Bits 31:16 of PHY identifier */
- u32 phy_id2; /* Bits 15:0 of PHY identifier */
- u32 auto_negotiation_advertisement; /* Auto-negotiation
- * advertisement
- * register
- */
- u32 remote_partner_base_page_ability;
- u32 reg6;
- u32 reg7;
- u32 reg8;
- u32 reg9;
- u32 rega;
- u32 regb;
- u32 regc;
- u32 regd;
- u32 rege;
- u32 regf;
- u32 reg10;
- u32 reg11;
- u32 reg12;
- u32 reg13;
- u32 reg14;
- u32 reg15;
- u32 reg16;
- u32 reg17;
- u32 reg18;
- u32 reg19;
- u32 reg1a;
- u32 reg1b;
- u32 reg1c;
- u32 reg1d;
- u32 reg1e;
- u32 reg1f;
- };
- /* MAC register Space. Note that some of these registers may or may not be
- * present depending upon options chosen by the user when the core was
- * configured and built. Please consult the Altera Triple Speed Ethernet User
- * Guide for details.
- */
- struct altera_tse_mac {
- /* Bits 15:0: MegaCore function revision (0x0800). Bit 31:16: Customer
- * specific revision
- */
- u32 megacore_revision;
- /* Provides a memory location for user applications to test the device
- * memory operation.
- */
- u32 scratch_pad;
- /* The host processor uses this register to control and configure the
- * MAC block
- */
- u32 command_config;
- /* 32-bit primary MAC address word 0 bits 0 to 31 of the primary
- * MAC address
- */
- u32 mac_addr_0;
- /* 32-bit primary MAC address word 1 bits 32 to 47 of the primary
- * MAC address
- */
- u32 mac_addr_1;
- /* 14-bit maximum frame length. The MAC receive logic */
- u32 frm_length;
- /* The pause quanta is used in each pause frame sent to a remote
- * Ethernet device, in increments of 512 Ethernet bit times
- */
- u32 pause_quanta;
- /* 12-bit receive FIFO section-empty threshold */
- u32 rx_section_empty;
- /* 12-bit receive FIFO section-full threshold */
- u32 rx_section_full;
- /* 12-bit transmit FIFO section-empty threshold */
- u32 tx_section_empty;
- /* 12-bit transmit FIFO section-full threshold */
- u32 tx_section_full;
- /* 12-bit receive FIFO almost-empty threshold */
- u32 rx_almost_empty;
- /* 12-bit receive FIFO almost-full threshold */
- u32 rx_almost_full;
- /* 12-bit transmit FIFO almost-empty threshold */
- u32 tx_almost_empty;
- /* 12-bit transmit FIFO almost-full threshold */
- u32 tx_almost_full;
- /* MDIO address of PHY Device 0. Bits 0 to 4 hold a 5-bit PHY address */
- u32 mdio_phy0_addr;
- /* MDIO address of PHY Device 1. Bits 0 to 4 hold a 5-bit PHY address */
- u32 mdio_phy1_addr;
- /* Bit[15:0]—16-bit holdoff quanta */
- u32 holdoff_quant;
- /* only if 100/1000 BaseX PCS, reserved otherwise */
- u32 reserved1[5];
- /* Minimum IPG between consecutive transmit frame in terms of bytes */
- u32 tx_ipg_length;
- /* IEEE 802.3 oEntity Managed Object Support */
- /* The MAC addresses */
- u32 mac_id_1;
- u32 mac_id_2;
- /* Number of frames transmitted without error including pause frames */
- u32 frames_transmitted_ok;
- /* Number of frames received without error including pause frames */
- u32 frames_received_ok;
- /* Number of frames received with a CRC error */
- u32 frames_check_sequence_errors;
- /* Frame received with an alignment error */
- u32 alignment_errors;
- /* Sum of payload and padding octets of frames transmitted without
- * error
- */
- u32 octets_transmitted_ok;
- /* Sum of payload and padding octets of frames received without error */
- u32 octets_received_ok;
- /* IEEE 802.3 oPausedEntity Managed Object Support */
- /* Number of transmitted pause frames */
- u32 tx_pause_mac_ctrl_frames;
- /* Number of Received pause frames */
- u32 rx_pause_mac_ctrl_frames;
- /* IETF MIB (MIB-II) Object Support */
- /* Number of frames received with error */
- u32 if_in_errors;
- /* Number of frames transmitted with error */
- u32 if_out_errors;
- /* Number of valid received unicast frames */
- u32 if_in_ucast_pkts;
- /* Number of valid received multicasts frames (without pause) */
- u32 if_in_multicast_pkts;
- /* Number of valid received broadcast frames */
- u32 if_in_broadcast_pkts;
- u32 if_out_discards;
- /* The number of valid unicast frames transmitted */
- u32 if_out_ucast_pkts;
- /* The number of valid multicast frames transmitted,
- * excluding pause frames
- */
- u32 if_out_multicast_pkts;
- u32 if_out_broadcast_pkts;
- /* IETF RMON MIB Object Support */
- /* Counts the number of dropped packets due to internal errors
- * of the MAC client.
- */
- u32 ether_stats_drop_events;
- /* Total number of bytes received. Good and bad frames. */
- u32 ether_stats_octets;
- /* Total number of packets received. Counts good and bad packets. */
- u32 ether_stats_pkts;
- /* Number of packets received with less than 64 bytes. */
- u32 ether_stats_undersize_pkts;
- /* The number of frames received that are longer than the
- * value configured in the frm_length register
- */
- u32 ether_stats_oversize_pkts;
- /* Number of received packet with 64 bytes */
- u32 ether_stats_pkts_64_octets;
- /* Frames (good and bad) with 65 to 127 bytes */
- u32 ether_stats_pkts_65to127_octets;
- /* Frames (good and bad) with 128 to 255 bytes */
- u32 ether_stats_pkts_128to255_octets;
- /* Frames (good and bad) with 256 to 511 bytes */
- u32 ether_stats_pkts_256to511_octets;
- /* Frames (good and bad) with 512 to 1023 bytes */
- u32 ether_stats_pkts_512to1023_octets;
- /* Frames (good and bad) with 1024 to 1518 bytes */
- u32 ether_stats_pkts_1024to1518_octets;
- /* Any frame length from 1519 to the maximum length configured in the
- * frm_length register, if it is greater than 1518
- */
- u32 ether_stats_pkts_1519tox_octets;
- /* Too long frames with CRC error */
- u32 ether_stats_jabbers;
- /* Too short frames with CRC error */
- u32 ether_stats_fragments;
- u32 reserved2;
- /* FIFO control register */
- u32 tx_cmd_stat;
- u32 rx_cmd_stat;
- /* Extended Statistics Counters */
- u32 msb_octets_transmitted_ok;
- u32 msb_octets_received_ok;
- u32 msb_ether_stats_octets;
- u32 reserved3;
- /* Multicast address resolution table, mapped in the controller address
- * space
- */
- u32 hash_table[64];
- /* Registers 0 to 31 within PHY device 0/1 connected to the MDIO PHY
- * management interface
- */
- struct altera_tse_mdio mdio_phy0;
- struct altera_tse_mdio mdio_phy1;
- /* 4 Supplemental MAC Addresses */
- u32 supp_mac_addr_0_0;
- u32 supp_mac_addr_0_1;
- u32 supp_mac_addr_1_0;
- u32 supp_mac_addr_1_1;
- u32 supp_mac_addr_2_0;
- u32 supp_mac_addr_2_1;
- u32 supp_mac_addr_3_0;
- u32 supp_mac_addr_3_1;
- u32 reserved4[8];
- /* IEEE 1588v2 Feature */
- u32 tx_period;
- u32 tx_adjust_fns;
- u32 tx_adjust_ns;
- u32 rx_period;
- u32 rx_adjust_fns;
- u32 rx_adjust_ns;
- u32 reserved5[42];
- };
- #define tse_csroffs(a) (offsetof(struct altera_tse_mac, a))
- /* Transmit and Receive Command Registers Bit Definitions
- */
- #define ALTERA_TSE_TX_CMD_STAT_OMIT_CRC BIT(17)
- #define ALTERA_TSE_TX_CMD_STAT_TX_SHIFT16 BIT(18)
- #define ALTERA_TSE_RX_CMD_STAT_RX_SHIFT16 BIT(25)
- /* Wrapper around a pointer to a socket buffer,
- * so a DMA handle can be stored along with the buffer
- */
- struct tse_buffer {
- struct list_head lh;
- struct sk_buff *skb;
- dma_addr_t dma_addr;
- u32 len;
- int mapped_as_page;
- };
- struct altera_tse_private;
- #define ALTERA_DTYPE_SGDMA 1
- #define ALTERA_DTYPE_MSGDMA 2
- /* standard DMA interface for SGDMA and MSGDMA */
- struct altera_dmaops {
- int altera_dtype;
- int dmamask;
- void (*reset_dma)(struct altera_tse_private *);
- void (*enable_txirq)(struct altera_tse_private *);
- void (*enable_rxirq)(struct altera_tse_private *);
- void (*disable_txirq)(struct altera_tse_private *);
- void (*disable_rxirq)(struct altera_tse_private *);
- void (*clear_txirq)(struct altera_tse_private *);
- void (*clear_rxirq)(struct altera_tse_private *);
- int (*tx_buffer)(struct altera_tse_private *, struct tse_buffer *);
- u32 (*tx_completions)(struct altera_tse_private *);
- void (*add_rx_desc)(struct altera_tse_private *, struct tse_buffer *);
- u32 (*get_rx_status)(struct altera_tse_private *);
- int (*init_dma)(struct altera_tse_private *);
- void (*uninit_dma)(struct altera_tse_private *);
- void (*start_rxdma)(struct altera_tse_private *);
- };
- /* This structure is private to each device.
- */
- struct altera_tse_private {
- struct net_device *dev;
- struct device *device;
- struct napi_struct napi;
- /* MAC address space */
- struct altera_tse_mac __iomem *mac_dev;
- /* TSE Revision */
- u32 revision;
- /* mSGDMA Rx Dispatcher address space */
- void __iomem *rx_dma_csr;
- void __iomem *rx_dma_desc;
- void __iomem *rx_dma_resp;
- /* mSGDMA Tx Dispatcher address space */
- void __iomem *tx_dma_csr;
- void __iomem *tx_dma_desc;
- /* Rx buffers queue */
- struct tse_buffer *rx_ring;
- u32 rx_cons;
- u32 rx_prod;
- u32 rx_ring_size;
- u32 rx_dma_buf_sz;
- /* Tx ring buffer */
- struct tse_buffer *tx_ring;
- u32 tx_prod;
- u32 tx_cons;
- u32 tx_ring_size;
- /* Interrupts */
- u32 tx_irq;
- u32 rx_irq;
- /* RX/TX MAC FIFO configs */
- u32 tx_fifo_depth;
- u32 rx_fifo_depth;
- u32 max_mtu;
- /* Hash filter settings */
- u32 hash_filter;
- u32 added_unicast;
- /* Descriptor memory info for managing SGDMA */
- u32 txdescmem;
- u32 rxdescmem;
- dma_addr_t rxdescmem_busaddr;
- dma_addr_t txdescmem_busaddr;
- u32 txctrlreg;
- u32 rxctrlreg;
- dma_addr_t rxdescphys;
- dma_addr_t txdescphys;
- struct list_head txlisthd;
- struct list_head rxlisthd;
- /* MAC command_config register protection */
- spinlock_t mac_cfg_lock;
- /* Tx path protection */
- spinlock_t tx_lock;
- /* Rx DMA & interrupt control protection */
- spinlock_t rxdma_irq_lock;
- /* PHY */
- int phy_addr; /* PHY's MDIO address, -1 for autodetection */
- phy_interface_t phy_iface;
- struct mii_bus *mdio;
- struct phy_device *phydev;
- int oldspeed;
- int oldduplex;
- int oldlink;
- /* ethtool msglvl option */
- u32 msg_enable;
- struct altera_dmaops *dmaops;
- };
- /* Function prototypes
- */
- void altera_tse_set_ethtool_ops(struct net_device *);
- static inline
- u32 csrrd32(void __iomem *mac, size_t offs)
- {
- void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs);
- return readl(paddr);
- }
- static inline
- u16 csrrd16(void __iomem *mac, size_t offs)
- {
- void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs);
- return readw(paddr);
- }
- static inline
- u8 csrrd8(void __iomem *mac, size_t offs)
- {
- void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs);
- return readb(paddr);
- }
- static inline
- void csrwr32(u32 val, void __iomem *mac, size_t offs)
- {
- void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs);
- writel(val, paddr);
- }
- static inline
- void csrwr16(u16 val, void __iomem *mac, size_t offs)
- {
- void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs);
- writew(val, paddr);
- }
- static inline
- void csrwr8(u8 val, void __iomem *mac, size_t offs)
- {
- void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs);
- writeb(val, paddr);
- }
- #endif /* __ALTERA_TSE_H__ */
|