11edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* 10G controller driver for Samsung SoCs 21edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * 31edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * Copyright (C) 2013 Samsung Electronics Co., Ltd. 41edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * http://www.samsung.com 51edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * 61edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * Author: Siva Reddy Kallam <siva.kallam@samsung.com> 71edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * 81edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * This program is free software; you can redistribute it and/or modify 91edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * it under the terms of the GNU General Public License version 2 as 101edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * published by the Free Software Foundation. 111edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy */ 121edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 131edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#ifndef __SXGBE_COMMON_H__ 141edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define __SXGBE_COMMON_H__ 151edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 161edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* forward references */ 171edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_desc_ops; 181edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_dma_ops; 191edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_mtl_ops; 201edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 211edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_RESOURCE_NAME "sam_sxgbeeth" 221edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define DRV_MODULE_VERSION "November_2013" 231edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 241edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* MAX HW feature words */ 251edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_HW_WORDS 3 261edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 271edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_RX_COE_NONE 0 281edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 291edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* CSR Frequency Access Defines*/ 301edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_CSR_F_150M 150000000 311edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_CSR_F_250M 250000000 321edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_CSR_F_300M 300000000 331edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_CSR_F_350M 350000000 341edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_CSR_F_400M 400000000 351edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_CSR_F_500M 500000000 361edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 371edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* pause time */ 381edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_PAUSE_TIME 0x200 391edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 401edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* tx queues */ 411edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_TX_QUEUES 8 421edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_RX_QUEUES 16 431edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 441edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* Calculated based how much time does it take to fill 256KB Rx memory 451edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * at 10Gb speed at 156MHz clock rate and considered little less then 461edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * the actual value. 471edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy */ 481edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_MAX_DMA_RIWT 0x70 491edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_MIN_DMA_RIWT 0x01 501edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 511edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* Tx coalesce parameters */ 521edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_COAL_TX_TIMER 40000 531edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_MAX_COAL_TX_TICK 100000 541edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_TX_MAX_FRAMES 512 551edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_TX_FRAMES 128 561edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 571edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* SXGBE TX FIFO is 8K, Rx FIFO is 16K */ 581edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define BUF_SIZE_16KiB 16384 591edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define BUF_SIZE_8KiB 8192 601edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define BUF_SIZE_4KiB 4096 611edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define BUF_SIZE_2KiB 2048 621edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 631edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_DEFAULT_LIT_LS 0x3E8 641edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_DEFAULT_TWT_LS 0x0 651edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 661edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* Flow Control defines */ 671edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FLOW_OFF 0 681edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FLOW_RX 1 691edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FLOW_TX 2 701edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FLOW_AUTO (SXGBE_FLOW_TX | SXGBE_FLOW_RX) 711edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 721edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SF_DMA_MODE 1 /* DMA STORE-AND-FORWARD Operation Mode */ 731edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 741edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* errors */ 751edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_GMII_ERR 0x01 761edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_WATCHDOG_ERR 0x02 771edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_CRC_ERR 0x03 781edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_GAINT_ERR 0x04 791edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IP_HDR_ERR 0x05 801edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PAYLOAD_ERR 0x06 811edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_OVERFLOW_ERR 0x07 821edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 831edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* pkt type */ 841edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_LEN_PKT 0x00 851edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_MACCTL_PKT 0x01 861edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_DCBCTL_PKT 0x02 871edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_ARP_PKT 0x03 881edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_OAM_PKT 0x04 891edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_UNTAG_PKT 0x05 901edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_OTHER_PKT 0x07 911edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_SVLAN_PKT 0x08 921edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_CVLAN_PKT 0x09 931edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_DVLAN_OCVLAN_ICVLAN_PKT 0x0A 941edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_DVLAN_OSVLAN_ISVLAN_PKT 0x0B 951edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_DVLAN_OSVLAN_ICVLAN_PKT 0x0C 961edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_DVLAN_OCVLAN_ISVLAN_PKT 0x0D 971edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 981edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_NOT_IP_PKT 0x00 991edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV4_TCP_PKT 0x01 1001edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV4_UDP_PKT 0x02 1011edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV4_ICMP_PKT 0x03 1021edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV4_UNKNOWN_PKT 0x07 1031edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV6_TCP_PKT 0x09 1041edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV6_UDP_PKT 0x0A 1051edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV6_ICMP_PKT 0x0B 1061edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_IPV6_UNKNOWN_PKT 0x0F 1071edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 1081edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_NO_PTP 0x00 1091edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_SYNC 0x01 1101edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_FOLLOW_UP 0x02 1111edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_DELAY_REQ 0x03 1121edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_DELAY_RESP 0x04 1131edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_PDELAY_REQ 0x05 1141edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_PDELAY_RESP 0x06 1151edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_PDELAY_FOLLOW_UP 0x07 1161edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_ANNOUNCE 0x08 1171edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_MGMT 0x09 1181edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_SIGNAL 0x0A 1191edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define RX_PTP_RESV_MSG 0x0F 1201edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 121acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S/* EEE-LPI mode flags*/ 122acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define TX_ENTRY_LPI_MODE 0x10 123acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define TX_EXIT_LPI_MODE 0x20 124acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define RX_ENTRY_LPI_MODE 0x40 125acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define RX_EXIT_LPI_MODE 0x80 126acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S 127acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S/* EEE-LPI Interrupt status flag */ 128acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_INT_STATUS BIT(5) 129acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S 130acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S/* EEE-LPI Default timer values */ 131acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_LINK_STATUS_TIMER 0x3E8 132acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_MAC_WAIT_TIMER 0x00 133acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S 134acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S/* EEE-LPI Control and status definitions */ 135acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_TXA BIT(19) 136acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_PLSDIS BIT(18) 137acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_PLS BIT(17) 138acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_LPIEN BIT(16) 139acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_TXRSTP BIT(11) 140acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_RXRSTP BIT(10) 141acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_RLPIST BIT(9) 142acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_TLPIST BIT(8) 143acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_RLPIEX BIT(3) 144acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_RLPIEN BIT(2) 145acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_TLPIEX BIT(1) 146acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S#define LPI_CTRL_STATUS_TLPIEN BIT(0) 147acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S 1481edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyenum dma_irq_status { 1491edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy tx_hard_error = BIT(0), 1501edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy tx_bump_tc = BIT(1), 1511edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy handle_tx = BIT(2), 1521edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy rx_hard_error = BIT(3), 1531edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy rx_bump_tc = BIT(4), 1541edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy handle_rx = BIT(5), 1551edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy}; 1561edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 1571edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define NETIF_F_HW_VLAN_ALL (NETIF_F_HW_VLAN_CTAG_RX | \ 1581edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy NETIF_F_HW_VLAN_STAG_RX | \ 1591edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy NETIF_F_HW_VLAN_CTAG_TX | \ 1601edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy NETIF_F_HW_VLAN_STAG_TX | \ 1611edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy NETIF_F_HW_VLAN_CTAG_FILTER | \ 1621edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy NETIF_F_HW_VLAN_STAG_FILTER) 1631edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 1641edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* MMC control defines */ 1651edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_MMC_CTRL_CNT_FRZ 0x00000008 1661edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 1671edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* SXGBE HW ADDR regs */ 1681edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_ADDR_HIGH(reg) (((reg > 15) ? 0x00000800 : 0x00000040) + \ 1691edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy (reg * 8)) 1701edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_ADDR_LOW(reg) (((reg > 15) ? 0x00000804 : 0x00000044) + \ 1711edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy (reg * 8)) 1721edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_MAX_PERFECT_ADDRESSES 32 /* Maximum unicast perfect filtering */ 1731edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER 0x00000004 /* Frame Filter */ 1741edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 1751edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* SXGBE Frame Filter defines */ 1761edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_PR 0x00000001 /* Promiscuous Mode */ 1771edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_HUC 0x00000002 /* Hash Unicast */ 1781edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_HMC 0x00000004 /* Hash Multicast */ 1791edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_DAIF 0x00000008 /* DA Inverse Filtering */ 1801edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_PM 0x00000010 /* Pass all multicast */ 1811edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_DBF 0x00000020 /* Disable Broadcast frames */ 1821edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_SAIF 0x00000100 /* Inverse Filtering */ 1831edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_SAF 0x00000200 /* Source Address Filter */ 1841edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_HPF 0x00000400 /* Hash or perfect Filter */ 1851edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FRAME_FILTER_RA 0x80000000 /* Receive all mode */ 1861edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 1871edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_HASH_TABLE_SIZE 64 1881edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_HASH_HIGH 0x00000008 /* Multicast Hash Table High */ 1891edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_HASH_LOW 0x0000000c /* Multicast Hash Table Low */ 1901edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 1911edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_HI_REG_AE 0x80000000 1921edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 1931edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* Minimum and maximum MTU */ 1941edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define MIN_MTU 68 1951edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define MAX_MTU 9000 1961edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 1971edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num) \ 1981edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy for (queue_num = 0; queue_num < max_queues; queue_num++) 1991edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 20025f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define DRV_VERSION "1.0.0" 20125f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya 20225f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define SXGBE_MAX_RX_CHANNELS 16 20325f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define SXGBE_MAX_TX_CHANNELS 16 20425f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya 20525f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define START_MAC_REG_OFFSET 0x0000 20625f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define MAX_MAC_REG_OFFSET 0x0DFC 20725f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define START_MTL_REG_OFFSET 0x1000 20825f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define MAX_MTL_REG_OFFSET 0x18FC 20925f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define START_DMA_REG_OFFSET 0x3000 21025f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define MAX_DMA_REG_OFFSET 0x38FC 21125f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya 21225f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya#define REG_SPACE_SIZE 0x2000 21325f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya 2141edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* sxgbe statistics counters */ 2151edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_extra_stats { 2161edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* TX/RX IRQ events */ 2171edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long tx_underflow_irq; 2181edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long tx_process_stopped_irq; 2191edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long tx_ctxt_desc_err; 2201edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long tx_threshold; 2211edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_threshold; 2221edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long tx_pkt_n; 2231edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_pkt_n; 2241edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long normal_irq_n; 2251edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long tx_normal_irq_n; 2261edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_normal_irq_n; 2271edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long napi_poll; 2281edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long tx_clean; 2291edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long tx_reset_ic_bit; 2301edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_process_stopped_irq; 2311edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_underflow_irq; 2321edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 2331edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* Bus access errors */ 2341edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long fatal_bus_error_irq; 2351edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long tx_read_transfer_err; 2361edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long tx_write_transfer_err; 2371edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long tx_desc_access_err; 2381edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long tx_buffer_access_err; 2391edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long tx_data_transfer_err; 2401edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_read_transfer_err; 2411edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_write_transfer_err; 2421edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_desc_access_err; 2431edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_buffer_access_err; 2441edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_data_transfer_err; 2451edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 246acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S /* EEE-LPI stats */ 247acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S unsigned long tx_lpi_entry_n; 248acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S unsigned long tx_lpi_exit_n; 249acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S unsigned long rx_lpi_entry_n; 250acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S unsigned long rx_lpi_exit_n; 251acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S unsigned long eee_wakeup_error_n; 252acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S 2531edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* RX specific */ 2541edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* L2 error */ 2551edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_code_gmii_err; 2561edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_watchdog_err; 2571edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_crc_err; 2581edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_gaint_pkt_err; 2591edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long ip_hdr_err; 2601edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long ip_payload_err; 2611edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long overflow_error; 2621edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 2631edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* L2 Pkt type */ 2641edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long len_pkt; 2651edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long mac_ctl_pkt; 2661edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long dcb_ctl_pkt; 2671edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long arp_pkt; 2681edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long oam_pkt; 2691edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long untag_okt; 2701edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long other_pkt; 2711edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long svlan_tag_pkt; 2721edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long cvlan_tag_pkt; 2731edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long dvlan_ocvlan_icvlan_pkt; 2741edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long dvlan_osvlan_isvlan_pkt; 2751edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long dvlan_osvlan_icvlan_pkt; 2761edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long dvan_ocvlan_icvlan_pkt; 2771edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 2781edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* L3/L4 Pkt type */ 2791edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long not_ip_pkt; 2801edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long ip4_tcp_pkt; 2811edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long ip4_udp_pkt; 2821edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long ip4_icmp_pkt; 2831edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long ip4_unknown_pkt; 2841edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long ip6_tcp_pkt; 2851edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long ip6_udp_pkt; 2861edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long ip6_icmp_pkt; 2871edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long ip6_unknown_pkt; 2881edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 2891edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* Filter specific */ 2901edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long vlan_filter_match; 2911edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long sa_filter_fail; 2921edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long da_filter_fail; 2931edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long hash_filter_pass; 2941edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long l3_filter_match; 2951edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long l4_filter_match; 2961edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 2971edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* RX context specific */ 2981edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long timestamp_dropped; 2991edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_msg_type_no_ptp; 3001edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_ptp_type_sync; 3011edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_ptp_type_follow_up; 3021edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_ptp_type_delay_req; 3031edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_ptp_type_delay_resp; 3041edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_ptp_type_pdelay_req; 3051edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_ptp_type_pdelay_resp; 3061edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_ptp_type_pdelay_follow_up; 3071edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_ptp_announce; 3081edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_ptp_mgmt; 3091edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_ptp_signal; 3101edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned long rx_ptp_resv_msg_type; 3111edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy}; 3121edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 3131edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct mac_link { 3141edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int port; 3151edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int duplex; 3161edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int speed; 3171edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy}; 3181edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 3191edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct mii_regs { 3201edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int addr; /* MII Address */ 3211edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int data; /* MII Data */ 3221edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy}; 3231edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 3241edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_core_ops { 3251edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* MAC core initialization */ 3261edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy void (*core_init)(void __iomem *ioaddr); 3271edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* Dump MAC registers */ 3281edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy void (*dump_regs)(void __iomem *ioaddr); 3291edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* Handle extra events on specific interrupts hw dependent */ 3301edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int (*host_irq_status)(void __iomem *ioaddr, 3311edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sxgbe_extra_stats *x); 3321edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* Set power management mode (e.g. magic frame) */ 3331edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy void (*pmt)(void __iomem *ioaddr, unsigned long mode); 3341edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* Set/Get Unicast MAC addresses */ 3351edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy void (*set_umac_addr)(void __iomem *ioaddr, unsigned char *addr, 3361edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int reg_n); 3371edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy void (*get_umac_addr)(void __iomem *ioaddr, unsigned char *addr, 3381edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int reg_n); 3391edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy void (*enable_rx)(void __iomem *ioaddr, bool enable); 3401edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy void (*enable_tx)(void __iomem *ioaddr, bool enable); 3411edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 3421edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* controller version specific operations */ 3431edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int (*get_controller_version)(void __iomem *ioaddr); 3441edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 3451edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* If supported then get the optional core features */ 3461edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int (*get_hw_feature)(void __iomem *ioaddr, 3471edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned char feature_index); 3481edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* adjust SXGBE speed */ 3491edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy void (*set_speed)(void __iomem *ioaddr, unsigned char speed); 350acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S 351acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S /* EEE-LPI specific operations */ 352acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S void (*set_eee_mode)(void __iomem *ioaddr); 353acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S void (*reset_eee_mode)(void __iomem *ioaddr); 354acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S void (*set_eee_timer)(void __iomem *ioaddr, const int ls, 355acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S const int tw); 356acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S void (*set_eee_pls)(void __iomem *ioaddr, const int link); 3578f7807ae41bb57e003b7dc07e83e186d11747bdeVipul Pandya 3588f7807ae41bb57e003b7dc07e83e186d11747bdeVipul Pandya /* Enable disable checksum offload operations */ 3598f7807ae41bb57e003b7dc07e83e186d11747bdeVipul Pandya void (*enable_rx_csum)(void __iomem *ioaddr); 3608f7807ae41bb57e003b7dc07e83e186d11747bdeVipul Pandya void (*disable_rx_csum)(void __iomem *ioaddr); 361325b94f7e63080f3e371e35f063a8be138c1873bByungho An void (*enable_rxqueue)(void __iomem *ioaddr, int queue_num); 362325b94f7e63080f3e371e35f063a8be138c1873bByungho An void (*disable_rxqueue)(void __iomem *ioaddr, int queue_num); 3631edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy}; 3641edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 3651edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyconst struct sxgbe_core_ops *sxgbe_get_core_ops(void); 3661edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 3671edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_ops { 3681edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy const struct sxgbe_core_ops *mac; 3691edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy const struct sxgbe_desc_ops *desc; 3701edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy const struct sxgbe_dma_ops *dma; 3711edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy const struct sxgbe_mtl_ops *mtl; 3721edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct mii_regs mii; /* MII register Addresses */ 3731edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct mac_link link; 3741edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int ctrl_uid; 3751edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int ctrl_id; 3761edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy}; 3771edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 3781edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* SXGBE private data structures */ 3791edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_tx_queue { 3801edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int irq_no; 3811edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sxgbe_priv_data *priv_ptr; 3821edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sxgbe_tx_norm_desc *dma_tx; 3831edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy dma_addr_t dma_tx_phy; 3841edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy dma_addr_t *tx_skbuff_dma; 3851edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sk_buff **tx_skbuff; 3861edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct timer_list txtimer; 3871edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy spinlock_t tx_lock; /* lock for tx queues */ 3881edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int cur_tx; 3891edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int dirty_tx; 3901edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy u32 tx_count_frames; 3911edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy u32 tx_coal_frames; 3921edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy u32 tx_coal_timer; 3931edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int hwts_tx_en; 3941051125d8d57b6ff074d450c10ccbe0e39856456Vipul Pandya u16 prev_mss; 3951edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy u8 queue_no; 3961edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy}; 3971edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 3981edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_rx_queue { 3991edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sxgbe_priv_data *priv_ptr; 4001edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sxgbe_rx_norm_desc *dma_rx; 4011edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sk_buff **rx_skbuff; 4021edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int cur_rx; 4031edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int dirty_rx; 4041edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int irq_no; 4051edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy u32 rx_riwt; 4061edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy dma_addr_t *rx_skbuff_dma; 4071edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy dma_addr_t dma_rx_phy; 4081edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy u8 queue_no; 4091edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy}; 4101edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 4111edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* SXGBE HW capabilities */ 4121edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_hw_features { 4131edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /****** CAP [0] *******/ 4141edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int pmt_remote_wake_up; 4151edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int pmt_magic_frame; 4161edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* IEEE 1588-2008 */ 4171edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int atime_stamp; 4181edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 419acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S unsigned int eee; 420acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S 4211edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int tx_csum_offload; 4221edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int rx_csum_offload; 4231edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int multi_macaddr; 4241edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int tstamp_srcselect; 4251edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int sa_vlan_insert; 4261edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 4271edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /****** CAP [1] *******/ 4281edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int rxfifo_size; 4291edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int txfifo_size; 4301edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int atstmap_hword; 4311edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int dcb_enable; 4321edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int splithead_enable; 4331edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int tcpseg_offload; 4341edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int debug_mem; 4351edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int rss_enable; 4361edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int hash_tsize; 4371edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int l3l4_filer_size; 4381edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 4391edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* This value is in bytes and 4401edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * as mentioned in HW features 4411edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy * of SXGBE data book 4421edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy */ 4431edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int rx_mtl_qsize; 4441edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int tx_mtl_qsize; 4451edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 4461edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /****** CAP [2] *******/ 4471edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* TX and RX number of channels */ 4481edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int rx_mtl_queues; 4491edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int tx_mtl_queues; 4501edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int rx_dma_channels; 4511edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int tx_dma_channels; 4521edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int pps_output_count; 4531edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int aux_input_count; 4541edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy}; 4551edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 4561edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_priv_data { 4571edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* DMA descriptos */ 4581edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sxgbe_tx_queue *txq[SXGBE_TX_QUEUES]; 4591edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sxgbe_rx_queue *rxq[SXGBE_RX_QUEUES]; 4601edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy u8 cur_rx_qnum; 4611edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 4621edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int dma_tx_size; 4631edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int dma_rx_size; 4641edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int dma_buf_sz; 4651edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy u32 rx_riwt; 4661edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 4671edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct napi_struct napi; 4681edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 4691edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy void __iomem *ioaddr; 4701edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct net_device *dev; 4711edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct device *device; 4721edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sxgbe_ops *hw; /* sxgbe specific ops */ 4731edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int no_csum_insertion; 4741edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int irq; 4758f7807ae41bb57e003b7dc07e83e186d11747bdeVipul Pandya int rxcsum_insertion; 4761edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy spinlock_t stats_lock; /* lock for tx/rx statatics */ 4771edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 4781edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct phy_device *phydev; 4791edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int oldlink; 4801edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int speed; 4811edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int oldduplex; 4821edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct mii_bus *mii; 4831edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int mii_irq[PHY_MAX_ADDR]; 4841edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy u8 rx_pause; 4851edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy u8 tx_pause; 4861edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 4871edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sxgbe_extra_stats xstats; 4881edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sxgbe_plat_data *plat; 4891edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sxgbe_hw_features hw_cap; 4901edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 4911edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy u32 msg_enable; 4921edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 4931edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct clk *sxgbe_clk; 4941edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int clk_csr; 4951edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int mode; 4961edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy unsigned int default_addend; 4971edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 4981edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* advanced time stamp support */ 4991edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy u32 adv_ts; 5001edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int use_riwt; 50125f72a746aca07d0d9cae7e093fe15613fc62ee3Vipul Pandya struct ptp_clock *ptp_clock; 5021edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 5031edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy /* tc control */ 5041edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int tx_tc; 5051edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy int rx_tc; 506acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S /* EEE-LPI specific members */ 507acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S struct timer_list eee_ctrl_timer; 508acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S bool tx_path_in_lpi_mode; 509acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S int lpi_irq; 510acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S int eee_enabled; 511acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S int eee_active; 512acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K S int tx_lpi_timer; 5131edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy}; 5141edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 5151edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy/* Function prototypes */ 5161edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddystruct sxgbe_priv_data *sxgbe_drv_probe(struct device *device, 5171edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy struct sxgbe_plat_data *plat_dat, 5181edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy void __iomem *addr); 5191edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_drv_remove(struct net_device *ndev); 5201edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyvoid sxgbe_set_ethtool_ops(struct net_device *netdev); 5211edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_mdio_unregister(struct net_device *ndev); 5221edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_mdio_register(struct net_device *ndev); 5231edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_register_platform(void); 5241edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyvoid sxgbe_unregister_platform(void); 5251edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 5261edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#ifdef CONFIG_PM 5271edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_suspend(struct net_device *ndev); 5281edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_resume(struct net_device *ndev); 5291edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_freeze(struct net_device *ndev); 5301edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyint sxgbe_restore(struct net_device *ndev); 5311edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#endif /* CONFIG_PM */ 5321edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 5331edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddyconst struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void); 5341edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy 535acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K Svoid sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv); 536acc18c147b2281ff85f93862eb8c768df1bfb7dfGirish K Sbool sxgbe_eee_init(struct sxgbe_priv_data * const priv); 5371edb9ca69e8a7988900fc0283e10550b5592164dSiva Reddy#endif /* __SXGBE_COMMON_H__ */ 538