blob: 217546e5714aea490c4250ea7b61cc6ea18e268e [file] [log] [blame]
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -07001/* Applied Micro X-Gene SoC Ethernet Driver
2 *
3 * Copyright (c) 2014, Applied Micro Circuits Corporation
4 * Authors: Iyappan Subramanian <isubramanian@apm.com>
5 * Ravi Patel <rapatel@apm.com>
6 * Keyur Chudgar <kchudgar@apm.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#ifndef __XGENE_ENET_MAIN_H__
23#define __XGENE_ENET_MAIN_H__
24
Feng Kande7b5b3d2015-01-06 15:41:33 -070025#include <linux/acpi.h>
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -070026#include <linux/clk.h>
Feng Kande7b5b3d2015-01-06 15:41:33 -070027#include <linux/efi.h>
Iyappan Subramanianb5d7a062016-01-21 16:07:41 -080028#include <linux/irq.h>
Feng Kande7b5b3d2015-01-06 15:41:33 -070029#include <linux/io.h>
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -070030#include <linux/of_platform.h>
31#include <linux/of_net.h>
32#include <linux/of_mdio.h>
33#include <linux/module.h>
34#include <net/ip.h>
35#include <linux/prefetch.h>
36#include <linux/if_vlan.h>
37#include <linux/phy.h>
38#include "xgene_enet_hw.h"
Iyappan Subramanian76f94a92016-02-17 15:00:39 -080039#include "xgene_enet_cle.h"
Iyappan Subramanianbc1b7c12015-04-28 13:52:39 -070040#include "xgene_enet_ring2.h"
Iyappan Subramanian8089a962016-07-25 17:12:41 -070041#include "../../../phy/mdio-xgene.h"
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -070042
43#define XGENE_DRV_VERSION "v1.0"
44#define XGENE_ENET_MAX_MTU 1536
45#define SKB_BUFFER_SIZE (XGENE_ENET_MAX_MTU - NET_IP_ALIGN)
Iyappan Subramanian949c40b2015-08-26 11:48:05 -070046#define BUFLEN_16K (16 * 1024)
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -070047#define NUM_PKT_BUF 64
48#define NUM_BUFPOOL 32
Iyappan Subramanian9b00eb42015-08-26 11:48:06 -070049#define MAX_EXP_BUFFS 256
50#define XGENE_ENET_MSS 1448
51#define XGENE_MIN_ENET_FRAME_SIZE 60
Keyur Chudgarca626452015-03-17 11:27:13 -070052
Iyappan Subramanian1b090a42016-05-13 16:52:59 -070053#define XGENE_MAX_ENET_IRQ 16
54#define XGENE_NUM_RX_RING 8
55#define XGENE_NUM_TX_RING 8
56#define XGENE_NUM_TXC_RING 8
Iyappan Subramanian107dec22016-02-17 15:00:41 -080057
Keyur Chudgarca626452015-03-17 11:27:13 -070058#define START_CPU_BUFNUM_0 0
59#define START_ETH_BUFNUM_0 2
60#define START_BP_BUFNUM_0 0x22
61#define START_RING_NUM_0 8
62#define START_CPU_BUFNUM_1 12
63#define START_ETH_BUFNUM_1 10
64#define START_BP_BUFNUM_1 0x2A
65#define START_RING_NUM_1 264
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -070066
Iyappan Subramanian149e9ab2015-09-08 15:50:26 -070067#define XG_START_CPU_BUFNUM_1 12
68#define XG_START_ETH_BUFNUM_1 2
69#define XG_START_BP_BUFNUM_1 0x22
70#define XG_START_RING_NUM_1 264
71
Iyappan Subramanianbc1b7c12015-04-28 13:52:39 -070072#define X2_START_CPU_BUFNUM_0 0
73#define X2_START_ETH_BUFNUM_0 0
74#define X2_START_BP_BUFNUM_0 0x20
75#define X2_START_RING_NUM_0 0
Iyappan Subramanianbc1b7c12015-04-28 13:52:39 -070076#define X2_START_CPU_BUFNUM_1 0xc
77#define X2_START_ETH_BUFNUM_1 0
78#define X2_START_BP_BUFNUM_1 0x20
79#define X2_START_RING_NUM_1 256
80
Iyappan Subramanian6772b652015-03-25 12:19:12 -070081#define IRQ_ID_SIZE 16
Iyappan Subramanian6772b652015-03-25 12:19:12 -070082
Iyappan Subramanian32f784b2014-10-13 17:05:34 -070083#define PHY_POLL_LINK_ON (10 * HZ)
84#define PHY_POLL_LINK_OFF (PHY_POLL_LINK_ON / 5)
85
Iyappan Subramanianbc1b7c12015-04-28 13:52:39 -070086enum xgene_enet_id {
87 XGENE_ENET1 = 1,
88 XGENE_ENET2
89};
90
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -070091/* software context of a descriptor ring */
92struct xgene_enet_desc_ring {
93 struct net_device *ndev;
94 u16 id;
95 u16 num;
96 u16 head;
97 u16 tail;
Iyappan Subramanian9b00eb42015-08-26 11:48:06 -070098 u16 exp_buf_tail;
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -070099 u16 slots;
100 u16 irq;
Iyappan Subramanian6772b652015-03-25 12:19:12 -0700101 char irq_name[IRQ_ID_SIZE];
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700102 u32 size;
Iyappan Subramanian9dd3c792015-04-30 16:09:17 -0700103 u32 state[X2_NUM_RING_CONFIG];
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700104 void __iomem *cmd_base;
105 void __iomem *cmd;
106 dma_addr_t dma;
Iyappan Subramanianed9b7da2015-04-28 13:52:38 -0700107 dma_addr_t irq_mbox_dma;
108 void *irq_mbox_addr;
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700109 u16 dst_ring_num;
110 u8 nbufpool;
Iyappan Subramanian107dec22016-02-17 15:00:41 -0800111 u8 index;
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700112 struct sk_buff *(*rx_skb);
113 struct sk_buff *(*cp_skb);
Iyappan Subramanian9b00eb42015-08-26 11:48:06 -0700114 dma_addr_t *frag_dma_addr;
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700115 enum xgene_enet_ring_cfgsize cfgsize;
116 struct xgene_enet_desc_ring *cp_ring;
117 struct xgene_enet_desc_ring *buf_pool;
118 struct napi_struct napi;
119 union {
120 void *desc_addr;
121 struct xgene_enet_raw_desc *raw_desc;
122 struct xgene_enet_raw_desc16 *raw_desc16;
123 };
Iyappan Subramanian9b00eb42015-08-26 11:48:06 -0700124 __le64 *exp_bufs;
Iyappan Subramanian3bb502f2016-05-13 16:53:00 -0700125 u64 tx_packets;
126 u64 tx_bytes;
127 u64 rx_packets;
128 u64 rx_bytes;
129 u64 rx_dropped;
130 u64 rx_errors;
131 u64 rx_length_errors;
132 u64 rx_crc_errors;
133 u64 rx_frame_errors;
134 u64 rx_fifo_errors;
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700135};
136
Iyappan Subramaniand0eb7452014-10-09 18:32:05 -0700137struct xgene_mac_ops {
138 void (*init)(struct xgene_enet_pdata *pdata);
139 void (*reset)(struct xgene_enet_pdata *pdata);
140 void (*tx_enable)(struct xgene_enet_pdata *pdata);
141 void (*rx_enable)(struct xgene_enet_pdata *pdata);
142 void (*tx_disable)(struct xgene_enet_pdata *pdata);
143 void (*rx_disable)(struct xgene_enet_pdata *pdata);
Iyappan Subramanian9a8c5dd2016-07-25 17:12:36 -0700144 void (*set_speed)(struct xgene_enet_pdata *pdata);
Iyappan Subramaniand0eb7452014-10-09 18:32:05 -0700145 void (*set_mac_addr)(struct xgene_enet_pdata *pdata);
Iyappan Subramanian9b00eb42015-08-26 11:48:06 -0700146 void (*set_mss)(struct xgene_enet_pdata *pdata);
Iyappan Subramaniandc8385f2014-10-13 17:05:33 -0700147 void (*link_state)(struct work_struct *work);
Iyappan Subramaniand0eb7452014-10-09 18:32:05 -0700148};
149
150struct xgene_port_ops {
Iyappan Subramanianc3f44652014-11-03 11:59:55 -0800151 int (*reset)(struct xgene_enet_pdata *pdata);
Iyappan Subramaniancb11c062016-07-25 17:12:37 -0700152 void (*clear)(struct xgene_enet_pdata *pdata,
153 struct xgene_enet_desc_ring *ring);
Iyappan Subramaniand0eb7452014-10-09 18:32:05 -0700154 void (*cle_bypass)(struct xgene_enet_pdata *pdata,
155 u32 dst_ring_num, u16 bufpool_id);
156 void (*shutdown)(struct xgene_enet_pdata *pdata);
157};
158
Iyappan Subramanian81cefb82015-04-28 13:52:37 -0700159struct xgene_ring_ops {
160 u8 num_ring_config;
161 u8 num_ring_id_shift;
162 struct xgene_enet_desc_ring * (*setup)(struct xgene_enet_desc_ring *);
163 void (*clear)(struct xgene_enet_desc_ring *);
164 void (*wr_cmd)(struct xgene_enet_desc_ring *, int);
165 u32 (*len)(struct xgene_enet_desc_ring *);
Iyappan Subramanian107dec22016-02-17 15:00:41 -0800166 void (*coalesce)(struct xgene_enet_desc_ring *);
Iyappan Subramanian81cefb82015-04-28 13:52:37 -0700167};
168
Iyappan Subramanian76f94a92016-02-17 15:00:39 -0800169struct xgene_cle_ops {
170 int (*cle_init)(struct xgene_enet_pdata *pdata);
171};
172
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700173/* ethernet private data */
174struct xgene_enet_pdata {
175 struct net_device *ndev;
176 struct mii_bus *mdio_bus;
177 struct phy_device *phy_dev;
178 int phy_speed;
179 struct clk *clk;
180 struct platform_device *pdev;
Iyappan Subramanianbc1b7c12015-04-28 13:52:39 -0700181 enum xgene_enet_id enet_id;
Iyappan Subramanian107dec22016-02-17 15:00:41 -0800182 struct xgene_enet_desc_ring *tx_ring[XGENE_NUM_TX_RING];
183 struct xgene_enet_desc_ring *rx_ring[XGENE_NUM_RX_RING];
184 u16 tx_level[XGENE_NUM_TX_RING];
185 u16 txc_level[XGENE_NUM_TX_RING];
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700186 char *dev_name;
187 u32 rx_buff_cnt;
188 u32 tx_qcnt_hi;
Iyappan Subramanian107dec22016-02-17 15:00:41 -0800189 u32 irqs[XGENE_MAX_ENET_IRQ];
190 u8 rxq_cnt;
191 u8 txq_cnt;
Iyappan Subramanian6772b652015-03-25 12:19:12 -0700192 u8 cq_cnt;
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700193 void __iomem *eth_csr_addr;
194 void __iomem *eth_ring_if_addr;
195 void __iomem *eth_diag_csr_addr;
196 void __iomem *mcx_mac_addr;
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700197 void __iomem *mcx_mac_csr_addr;
198 void __iomem *base_addr;
199 void __iomem *ring_csr_addr;
200 void __iomem *ring_cmd_addr;
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700201 int phy_mode;
Iyappan Subramanian0148d382014-10-09 18:32:06 -0700202 enum xgene_enet_rm rm;
Iyappan Subramanian76f94a92016-02-17 15:00:39 -0800203 struct xgene_enet_cle cle;
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700204 struct rtnl_link_stats64 stats;
Julia Lawall3cdb7302015-12-08 21:18:25 +0100205 const struct xgene_mac_ops *mac_ops;
206 const struct xgene_port_ops *port_ops;
Iyappan Subramanian81cefb82015-04-28 13:52:37 -0700207 struct xgene_ring_ops *ring_ops;
Julia Lawallb555a3d2016-05-01 14:36:28 +0200208 const struct xgene_cle_ops *cle_ops;
Iyappan Subramanian0148d382014-10-09 18:32:06 -0700209 struct delayed_work link_work;
Keyur Chudgarca626452015-03-17 11:27:13 -0700210 u32 port_id;
211 u8 cpu_bufnum;
212 u8 eth_bufnum;
213 u8 bp_bufnum;
214 u16 ring_num;
Iyappan Subramanian9b00eb42015-08-26 11:48:06 -0700215 u32 mss;
Iyappan Subramanian16615a4c2015-10-26 15:25:15 -0700216 u8 tx_delay;
217 u8 rx_delay;
Iyappan Subramanian8089a962016-07-25 17:12:41 -0700218 bool mdio_driver;
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700219};
220
Iyappan Subramanian32f784b2014-10-13 17:05:34 -0700221struct xgene_indirect_ctl {
222 void __iomem *addr;
223 void __iomem *ctl;
224 void __iomem *cmd;
225 void __iomem *cmd_done;
226};
227
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700228static inline struct device *ndev_to_dev(struct net_device *ndev)
229{
230 return ndev->dev.parent;
231}
232
Iyappan Subramanian76f94a92016-02-17 15:00:39 -0800233static inline u16 xgene_enet_dst_ring_num(struct xgene_enet_desc_ring *ring)
234{
235 struct xgene_enet_pdata *pdata = netdev_priv(ring->ndev);
236
237 return ((u16)pdata->rm << 10) | ring->num;
238}
239
Iyappan Subramaniane6ad7672014-08-07 15:14:28 -0700240void xgene_enet_set_ethtool_ops(struct net_device *netdev);
241
242#endif /* __XGENE_ENET_MAIN_H__ */