blob: c6c54659f8d478b81b7b22f490856cf62e8cf1b0 [file] [log] [blame]
Anant Golea6286ee2009-05-18 15:19:01 -07001/*
2 * DaVinci Ethernet Medium Access Controller
3 *
4 * DaVinci EMAC is based upon CPPI 3.0 TI DMA engine
5 *
6 * Copyright (C) 2009 Texas Instruments.
7 *
8 * ---------------------------------------------------------------------------
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 * ---------------------------------------------------------------------------
24 * History:
25 * 0-5 A number of folks worked on this driver in bits and pieces but the major
26 * contribution came from Suraj Iyer and Anant Gole
27 * 6.0 Anant Gole - rewrote the driver as per Linux conventions
28 * 6.1 Chaithrika U S - added support for Gigabit and RMII features,
29 * PHY layer usage
30 */
31
Anant Golea6286ee2009-05-18 15:19:01 -070032#include <linux/module.h>
33#include <linux/kernel.h>
34#include <linux/sched.h>
35#include <linux/string.h>
36#include <linux/timer.h>
37#include <linux/errno.h>
38#include <linux/in.h>
39#include <linux/ioport.h>
40#include <linux/slab.h>
41#include <linux/mm.h>
42#include <linux/interrupt.h>
43#include <linux/init.h>
44#include <linux/netdevice.h>
45#include <linux/etherdevice.h>
46#include <linux/skbuff.h>
47#include <linux/ethtool.h>
48#include <linux/highmem.h>
49#include <linux/proc_fs.h>
50#include <linux/ctype.h>
Anant Golea6286ee2009-05-18 15:19:01 -070051#include <linux/spinlock.h>
52#include <linux/dma-mapping.h>
53#include <linux/clk.h>
54#include <linux/platform_device.h>
Tony Lindgrenf276c0c2015-01-28 11:33:06 -080055#include <linux/regmap.h>
Anant Golea6286ee2009-05-18 15:19:01 -070056#include <linux/semaphore.h>
57#include <linux/phy.h>
58#include <linux/bitops.h>
59#include <linux/io.h>
60#include <linux/uaccess.h>
Mark A. Greer3ba97382012-07-20 15:19:22 +000061#include <linux/pm_runtime.h>
Sriramakrishnan8ee2bf92009-11-19 15:58:25 +053062#include <linux/davinci_emac.h>
Heiko Schocher42f59962012-07-17 00:34:24 +000063#include <linux/of.h>
64#include <linux/of_address.h>
Tony Lindgrendd0df472013-12-03 15:13:02 -080065#include <linux/of_device.h>
Tony Lindgren1d82ffa2015-01-15 14:45:12 -080066#include <linux/of_mdio.h>
Heiko Schocher42f59962012-07-17 00:34:24 +000067#include <linux/of_irq.h>
68#include <linux/of_net.h>
Tony Lindgrenf276c0c2015-01-28 11:33:06 -080069#include <linux/mfd/syscon.h>
Heiko Schocher42f59962012-07-17 00:34:24 +000070
Anant Golea6286ee2009-05-18 15:19:01 -070071#include <asm/irq.h>
72#include <asm/page.h>
73
Tony Lindgren9120bd6e2015-01-28 11:33:05 -080074#include "cpsw.h"
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -040075#include "davinci_cpdma.h"
76
Anant Golea6286ee2009-05-18 15:19:01 -070077static int debug_level;
78module_param(debug_level, int, 0);
79MODULE_PARM_DESC(debug_level, "DaVinci EMAC debug level (NETIF_MSG bits)");
80
81/* Netif debug messages possible */
82#define DAVINCI_EMAC_DEBUG (NETIF_MSG_DRV | \
83 NETIF_MSG_PROBE | \
84 NETIF_MSG_LINK | \
85 NETIF_MSG_TIMER | \
86 NETIF_MSG_IFDOWN | \
87 NETIF_MSG_IFUP | \
88 NETIF_MSG_RX_ERR | \
89 NETIF_MSG_TX_ERR | \
90 NETIF_MSG_TX_QUEUED | \
91 NETIF_MSG_INTR | \
92 NETIF_MSG_TX_DONE | \
93 NETIF_MSG_RX_STATUS | \
94 NETIF_MSG_PKTDATA | \
95 NETIF_MSG_HW | \
96 NETIF_MSG_WOL)
97
98/* version info */
99#define EMAC_MAJOR_VERSION 6
100#define EMAC_MINOR_VERSION 1
101#define EMAC_MODULE_VERSION "6.1"
102MODULE_VERSION(EMAC_MODULE_VERSION);
103static const char emac_version_string[] = "TI DaVinci EMAC Linux v6.1";
104
105/* Configuration items */
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300106#define EMAC_DEF_PASS_CRC (0) /* Do not pass CRC up to frames */
Anant Golea6286ee2009-05-18 15:19:01 -0700107#define EMAC_DEF_QOS_EN (0) /* EMAC proprietary QoS disabled */
108#define EMAC_DEF_NO_BUFF_CHAIN (0) /* No buffer chain */
109#define EMAC_DEF_MACCTRL_FRAME_EN (0) /* Discard Maccontrol frames */
110#define EMAC_DEF_SHORT_FRAME_EN (0) /* Discard short frames */
111#define EMAC_DEF_ERROR_FRAME_EN (0) /* Discard error frames */
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300112#define EMAC_DEF_PROM_EN (0) /* Promiscuous disabled */
113#define EMAC_DEF_PROM_CH (0) /* Promiscuous channel is 0 */
Anant Golea6286ee2009-05-18 15:19:01 -0700114#define EMAC_DEF_BCAST_EN (1) /* Broadcast enabled */
115#define EMAC_DEF_BCAST_CH (0) /* Broadcast channel is 0 */
116#define EMAC_DEF_MCAST_EN (1) /* Multicast enabled */
117#define EMAC_DEF_MCAST_CH (0) /* Multicast channel is 0 */
118
119#define EMAC_DEF_TXPRIO_FIXED (1) /* TX Priority is fixed */
120#define EMAC_DEF_TXPACING_EN (0) /* TX pacing NOT supported*/
121
122#define EMAC_DEF_BUFFER_OFFSET (0) /* Buffer offset to DMA (future) */
123#define EMAC_DEF_MIN_ETHPKTSIZE (60) /* Minimum ethernet pkt size */
124#define EMAC_DEF_MAX_FRAME_SIZE (1500 + 14 + 4 + 4)
125#define EMAC_DEF_TX_CH (0) /* Default 0th channel */
126#define EMAC_DEF_RX_CH (0) /* Default 0th channel */
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -0400127#define EMAC_DEF_RX_NUM_DESC (128)
Anant Golea6286ee2009-05-18 15:19:01 -0700128#define EMAC_DEF_MAX_TX_CH (1) /* Max TX channels configured */
129#define EMAC_DEF_MAX_RX_CH (1) /* Max RX channels configured */
130#define EMAC_POLL_WEIGHT (64) /* Default NAPI poll weight */
131
132/* Buffer descriptor parameters */
133#define EMAC_DEF_TX_MAX_SERVICE (32) /* TX max service BD's */
134#define EMAC_DEF_RX_MAX_SERVICE (64) /* should = netdev->weight */
135
136/* EMAC register related defines */
137#define EMAC_ALL_MULTI_REG_VALUE (0xFFFFFFFF)
138#define EMAC_NUM_MULTICAST_BITS (64)
Anant Golea6286ee2009-05-18 15:19:01 -0700139#define EMAC_TX_CONTROL_TX_ENABLE_VAL (0x1)
140#define EMAC_RX_CONTROL_RX_ENABLE_VAL (0x1)
141#define EMAC_MAC_HOST_ERR_INTMASK_VAL (0x2)
142#define EMAC_RX_UNICAST_CLEAR_ALL (0xFF)
143#define EMAC_INT_MASK_CLEAR (0xFF)
144
145/* RX MBP register bit positions */
146#define EMAC_RXMBP_PASSCRC_MASK BIT(30)
147#define EMAC_RXMBP_QOSEN_MASK BIT(29)
148#define EMAC_RXMBP_NOCHAIN_MASK BIT(28)
149#define EMAC_RXMBP_CMFEN_MASK BIT(24)
150#define EMAC_RXMBP_CSFEN_MASK BIT(23)
151#define EMAC_RXMBP_CEFEN_MASK BIT(22)
152#define EMAC_RXMBP_CAFEN_MASK BIT(21)
153#define EMAC_RXMBP_PROMCH_SHIFT (16)
154#define EMAC_RXMBP_PROMCH_MASK (0x7 << 16)
155#define EMAC_RXMBP_BROADEN_MASK BIT(13)
156#define EMAC_RXMBP_BROADCH_SHIFT (8)
157#define EMAC_RXMBP_BROADCH_MASK (0x7 << 8)
158#define EMAC_RXMBP_MULTIEN_MASK BIT(5)
159#define EMAC_RXMBP_MULTICH_SHIFT (0)
160#define EMAC_RXMBP_MULTICH_MASK (0x7)
161#define EMAC_RXMBP_CHMASK (0x7)
162
163/* EMAC register definitions/bit maps used */
164# define EMAC_MBP_RXPROMISC (0x00200000)
165# define EMAC_MBP_PROMISCCH(ch) (((ch) & 0x7) << 16)
166# define EMAC_MBP_RXBCAST (0x00002000)
167# define EMAC_MBP_BCASTCHAN(ch) (((ch) & 0x7) << 8)
168# define EMAC_MBP_RXMCAST (0x00000020)
169# define EMAC_MBP_MCASTCHAN(ch) ((ch) & 0x7)
170
171/* EMAC mac_control register */
chaithrika@ti.com69ef9692009-10-01 10:25:19 +0000172#define EMAC_MACCONTROL_TXPTYPE BIT(9)
173#define EMAC_MACCONTROL_TXPACEEN BIT(6)
174#define EMAC_MACCONTROL_GMIIEN BIT(5)
175#define EMAC_MACCONTROL_GIGABITEN BIT(7)
176#define EMAC_MACCONTROL_FULLDUPLEXEN BIT(0)
Anant Golea6286ee2009-05-18 15:19:01 -0700177#define EMAC_MACCONTROL_RMIISPEED_MASK BIT(15)
178
179/* GIGABIT MODE related bits */
Anant Golea6286ee2009-05-18 15:19:01 -0700180#define EMAC_DM646X_MACCONTORL_GIG BIT(7)
181#define EMAC_DM646X_MACCONTORL_GIGFORCE BIT(17)
182
183/* EMAC mac_status register */
184#define EMAC_MACSTATUS_TXERRCODE_MASK (0xF00000)
185#define EMAC_MACSTATUS_TXERRCODE_SHIFT (20)
186#define EMAC_MACSTATUS_TXERRCH_MASK (0x7)
187#define EMAC_MACSTATUS_TXERRCH_SHIFT (16)
188#define EMAC_MACSTATUS_RXERRCODE_MASK (0xF000)
189#define EMAC_MACSTATUS_RXERRCODE_SHIFT (12)
190#define EMAC_MACSTATUS_RXERRCH_MASK (0x7)
191#define EMAC_MACSTATUS_RXERRCH_SHIFT (8)
192
193/* EMAC RX register masks */
194#define EMAC_RX_MAX_LEN_MASK (0xFFFF)
195#define EMAC_RX_BUFFER_OFFSET_MASK (0xFFFF)
196
197/* MAC_IN_VECTOR (0x180) register bit fields */
chaithrika@ti.com69ef9692009-10-01 10:25:19 +0000198#define EMAC_DM644X_MAC_IN_VECTOR_HOST_INT BIT(17)
199#define EMAC_DM644X_MAC_IN_VECTOR_STATPEND_INT BIT(16)
200#define EMAC_DM644X_MAC_IN_VECTOR_RX_INT_VEC BIT(8)
201#define EMAC_DM644X_MAC_IN_VECTOR_TX_INT_VEC BIT(0)
Anant Golea6286ee2009-05-18 15:19:01 -0700202
203/** NOTE:: For DM646x the IN_VECTOR has changed */
204#define EMAC_DM646X_MAC_IN_VECTOR_RX_INT_VEC BIT(EMAC_DEF_RX_CH)
205#define EMAC_DM646X_MAC_IN_VECTOR_TX_INT_VEC BIT(16 + EMAC_DEF_TX_CH)
Sriram43c2ed82009-09-24 19:15:18 +0000206#define EMAC_DM646X_MAC_IN_VECTOR_HOST_INT BIT(26)
207#define EMAC_DM646X_MAC_IN_VECTOR_STATPEND_INT BIT(27)
208
Anant Golea6286ee2009-05-18 15:19:01 -0700209/* CPPI bit positions */
210#define EMAC_CPPI_SOP_BIT BIT(31)
211#define EMAC_CPPI_EOP_BIT BIT(30)
212#define EMAC_CPPI_OWNERSHIP_BIT BIT(29)
213#define EMAC_CPPI_EOQ_BIT BIT(28)
214#define EMAC_CPPI_TEARDOWN_COMPLETE_BIT BIT(27)
215#define EMAC_CPPI_PASS_CRC_BIT BIT(26)
216#define EMAC_RX_BD_BUF_SIZE (0xFFFF)
217#define EMAC_BD_LENGTH_FOR_CACHE (16) /* only CPPI bytes */
218#define EMAC_RX_BD_PKT_LENGTH_MASK (0xFFFF)
219
220/* Max hardware defines */
221#define EMAC_MAX_TXRX_CHANNELS (8) /* Max hardware channels */
222#define EMAC_DEF_MAX_MULTICAST_ADDRESSES (64) /* Max mcast addr's */
223
224/* EMAC Peripheral Device Register Memory Layout structure */
Anant Golea6286ee2009-05-18 15:19:01 -0700225#define EMAC_MACINVECTOR 0x90
226
227#define EMAC_DM646X_MACEOIVECTOR 0x94
228
Anant Golea6286ee2009-05-18 15:19:01 -0700229#define EMAC_MACINTSTATRAW 0xB0
230#define EMAC_MACINTSTATMASKED 0xB4
231#define EMAC_MACINTMASKSET 0xB8
232#define EMAC_MACINTMASKCLEAR 0xBC
233
234#define EMAC_RXMBPENABLE 0x100
235#define EMAC_RXUNICASTSET 0x104
236#define EMAC_RXUNICASTCLEAR 0x108
237#define EMAC_RXMAXLEN 0x10C
238#define EMAC_RXBUFFEROFFSET 0x110
239#define EMAC_RXFILTERLOWTHRESH 0x114
240
241#define EMAC_MACCONTROL 0x160
242#define EMAC_MACSTATUS 0x164
243#define EMAC_EMCONTROL 0x168
244#define EMAC_FIFOCONTROL 0x16C
245#define EMAC_MACCONFIG 0x170
246#define EMAC_SOFTRESET 0x174
247#define EMAC_MACSRCADDRLO 0x1D0
248#define EMAC_MACSRCADDRHI 0x1D4
249#define EMAC_MACHASH1 0x1D8
250#define EMAC_MACHASH2 0x1DC
251#define EMAC_MACADDRLO 0x500
252#define EMAC_MACADDRHI 0x504
253#define EMAC_MACINDEX 0x508
254
Anant Golea6286ee2009-05-18 15:19:01 -0700255/* EMAC statistics registers */
256#define EMAC_RXGOODFRAMES 0x200
257#define EMAC_RXBCASTFRAMES 0x204
258#define EMAC_RXMCASTFRAMES 0x208
259#define EMAC_RXPAUSEFRAMES 0x20C
260#define EMAC_RXCRCERRORS 0x210
261#define EMAC_RXALIGNCODEERRORS 0x214
262#define EMAC_RXOVERSIZED 0x218
263#define EMAC_RXJABBER 0x21C
264#define EMAC_RXUNDERSIZED 0x220
265#define EMAC_RXFRAGMENTS 0x224
266#define EMAC_RXFILTERED 0x228
267#define EMAC_RXQOSFILTERED 0x22C
268#define EMAC_RXOCTETS 0x230
269#define EMAC_TXGOODFRAMES 0x234
270#define EMAC_TXBCASTFRAMES 0x238
271#define EMAC_TXMCASTFRAMES 0x23C
272#define EMAC_TXPAUSEFRAMES 0x240
273#define EMAC_TXDEFERRED 0x244
274#define EMAC_TXCOLLISION 0x248
275#define EMAC_TXSINGLECOLL 0x24C
276#define EMAC_TXMULTICOLL 0x250
277#define EMAC_TXEXCESSIVECOLL 0x254
278#define EMAC_TXLATECOLL 0x258
279#define EMAC_TXUNDERRUN 0x25C
280#define EMAC_TXCARRIERSENSE 0x260
281#define EMAC_TXOCTETS 0x264
282#define EMAC_NETOCTETS 0x280
283#define EMAC_RXSOFOVERRUNS 0x284
284#define EMAC_RXMOFOVERRUNS 0x288
285#define EMAC_RXDMAOVERRUNS 0x28C
286
287/* EMAC DM644x control registers */
288#define EMAC_CTRL_EWCTL (0x4)
289#define EMAC_CTRL_EWINTTCNT (0x8)
290
Sriram84da2652010-07-29 02:33:58 +0000291/* EMAC DM644x control module masks */
292#define EMAC_DM644X_EWINTCNT_MASK 0x1FFFF
293#define EMAC_DM644X_INTMIN_INTVL 0x1
294#define EMAC_DM644X_INTMAX_INTVL (EMAC_DM644X_EWINTCNT_MASK)
295
Anant Golea6286ee2009-05-18 15:19:01 -0700296/* EMAC DM646X control module registers */
Sriram84da2652010-07-29 02:33:58 +0000297#define EMAC_DM646X_CMINTCTRL 0x0C
298#define EMAC_DM646X_CMRXINTEN 0x14
299#define EMAC_DM646X_CMTXINTEN 0x18
300#define EMAC_DM646X_CMRXINTMAX 0x70
301#define EMAC_DM646X_CMTXINTMAX 0x74
302
303/* EMAC DM646X control module masks */
304#define EMAC_DM646X_INTPACEEN (0x3 << 16)
305#define EMAC_DM646X_INTPRESCALE_MASK (0x7FF << 0)
306#define EMAC_DM646X_CMINTMAX_CNT 63
307#define EMAC_DM646X_CMINTMIN_CNT 2
308#define EMAC_DM646X_CMINTMAX_INTVL (1000 / EMAC_DM646X_CMINTMIN_CNT)
309#define EMAC_DM646X_CMINTMIN_INTVL ((1000 / EMAC_DM646X_CMINTMAX_CNT) + 1)
310
Anant Golea6286ee2009-05-18 15:19:01 -0700311
312/* EMAC EOI codes for C0 */
313#define EMAC_DM646X_MAC_EOI_C0_RXEN (0x01)
314#define EMAC_DM646X_MAC_EOI_C0_TXEN (0x02)
315
Sriram0fe74632009-10-07 02:44:30 +0000316/* EMAC Stats Clear Mask */
317#define EMAC_STATS_CLR_MASK (0xFFFFFFFF)
318
Anant Golea6286ee2009-05-18 15:19:01 -0700319/* emac_priv: EMAC private data structure
320 *
321 * EMAC adapter private data structure
322 */
323struct emac_priv {
324 u32 msg_enable;
325 struct net_device *ndev;
326 struct platform_device *pdev;
327 struct napi_struct napi;
328 char mac_addr[6];
Anant Golea6286ee2009-05-18 15:19:01 -0700329 void __iomem *remap_addr;
330 u32 emac_base_phys;
331 void __iomem *emac_base;
332 void __iomem *ctrl_base;
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -0400333 struct cpdma_ctlr *dma;
334 struct cpdma_chan *txchan;
335 struct cpdma_chan *rxchan;
Anant Golea6286ee2009-05-18 15:19:01 -0700336 u32 link; /* 1=link on, 0=link off */
337 u32 speed; /* 0=Auto Neg, 1=No PHY, 10,100, 1000 - mbps */
338 u32 duplex; /* Link duplex: 0=Half, 1=Full */
339 u32 rx_buf_size;
340 u32 isr_count;
Sriram84da2652010-07-29 02:33:58 +0000341 u32 coal_intvl;
342 u32 bus_freq_mhz;
Anant Golea6286ee2009-05-18 15:19:01 -0700343 u8 rmii_en;
344 u8 version;
Anant Golea6286ee2009-05-18 15:19:01 -0700345 u32 mac_hash1;
346 u32 mac_hash2;
347 u32 multicast_hash_cnt[EMAC_NUM_MULTICAST_BITS];
348 u32 rx_addr_type;
Cyril Chemparathy5d69e002010-09-15 10:11:24 -0400349 const char *phy_id;
Heiko Schocher42f59962012-07-17 00:34:24 +0000350 struct device_node *phy_node;
Anant Golea6286ee2009-05-18 15:19:01 -0700351 spinlock_t lock;
Sriramakrishnan01a9af32009-11-19 15:58:26 +0530352 /*platform specific members*/
353 void (*int_enable) (void);
354 void (*int_disable) (void);
Anant Golea6286ee2009-05-18 15:19:01 -0700355};
356
Anant Golea6286ee2009-05-18 15:19:01 -0700357/* EMAC TX Host Error description strings */
358static char *emac_txhost_errcodes[16] = {
359 "No error", "SOP error", "Ownership bit not set in SOP buffer",
360 "Zero Next Buffer Descriptor Pointer Without EOP",
361 "Zero Buffer Pointer", "Zero Buffer Length", "Packet Length Error",
362 "Reserved", "Reserved", "Reserved", "Reserved", "Reserved",
363 "Reserved", "Reserved", "Reserved", "Reserved"
364};
365
366/* EMAC RX Host Error description strings */
367static char *emac_rxhost_errcodes[16] = {
368 "No error", "Reserved", "Ownership bit not set in input buffer",
369 "Reserved", "Zero Buffer Pointer", "Reserved", "Reserved",
370 "Reserved", "Reserved", "Reserved", "Reserved", "Reserved",
371 "Reserved", "Reserved", "Reserved", "Reserved"
372};
373
374/* Helper macros */
375#define emac_read(reg) ioread32(priv->emac_base + (reg))
376#define emac_write(reg, val) iowrite32(val, priv->emac_base + (reg))
377
378#define emac_ctrl_read(reg) ioread32((priv->ctrl_base + (reg)))
379#define emac_ctrl_write(reg, val) iowrite32(val, (priv->ctrl_base + (reg)))
380
Anant Golea6286ee2009-05-18 15:19:01 -0700381/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000382 * emac_dump_regs - Dump important EMAC registers to debug terminal
Anant Golea6286ee2009-05-18 15:19:01 -0700383 * @priv: The DaVinci EMAC private adapter structure
384 *
385 * Executes ethtool set cmd & sets phy mode
386 *
387 */
388static void emac_dump_regs(struct emac_priv *priv)
389{
390 struct device *emac_dev = &priv->ndev->dev;
391
392 /* Print important registers in EMAC */
393 dev_info(emac_dev, "EMAC Basic registers\n");
Srirame9947622010-07-29 02:34:00 +0000394 if (priv->version == EMAC_VERSION_1) {
395 dev_info(emac_dev, "EMAC: EWCTL: %08X, EWINTTCNT: %08X\n",
396 emac_ctrl_read(EMAC_CTRL_EWCTL),
397 emac_ctrl_read(EMAC_CTRL_EWINTTCNT));
398 }
Anant Golea6286ee2009-05-18 15:19:01 -0700399 dev_info(emac_dev, "EMAC: EmuControl:%08X, FifoControl: %08X\n",
400 emac_read(EMAC_EMCONTROL), emac_read(EMAC_FIFOCONTROL));
401 dev_info(emac_dev, "EMAC: MBPEnable:%08X, RXUnicastSet: %08X, "\
402 "RXMaxLen=%08X\n", emac_read(EMAC_RXMBPENABLE),
403 emac_read(EMAC_RXUNICASTSET), emac_read(EMAC_RXMAXLEN));
404 dev_info(emac_dev, "EMAC: MacControl:%08X, MacStatus: %08X, "\
405 "MacConfig=%08X\n", emac_read(EMAC_MACCONTROL),
406 emac_read(EMAC_MACSTATUS), emac_read(EMAC_MACCONFIG));
Anant Golea6286ee2009-05-18 15:19:01 -0700407 dev_info(emac_dev, "EMAC Statistics\n");
408 dev_info(emac_dev, "EMAC: rx_good_frames:%d\n",
409 emac_read(EMAC_RXGOODFRAMES));
410 dev_info(emac_dev, "EMAC: rx_broadcast_frames:%d\n",
411 emac_read(EMAC_RXBCASTFRAMES));
412 dev_info(emac_dev, "EMAC: rx_multicast_frames:%d\n",
413 emac_read(EMAC_RXMCASTFRAMES));
414 dev_info(emac_dev, "EMAC: rx_pause_frames:%d\n",
415 emac_read(EMAC_RXPAUSEFRAMES));
416 dev_info(emac_dev, "EMAC: rx_crcerrors:%d\n",
417 emac_read(EMAC_RXCRCERRORS));
418 dev_info(emac_dev, "EMAC: rx_align_code_errors:%d\n",
419 emac_read(EMAC_RXALIGNCODEERRORS));
420 dev_info(emac_dev, "EMAC: rx_oversized_frames:%d\n",
421 emac_read(EMAC_RXOVERSIZED));
422 dev_info(emac_dev, "EMAC: rx_jabber_frames:%d\n",
423 emac_read(EMAC_RXJABBER));
424 dev_info(emac_dev, "EMAC: rx_undersized_frames:%d\n",
425 emac_read(EMAC_RXUNDERSIZED));
426 dev_info(emac_dev, "EMAC: rx_fragments:%d\n",
427 emac_read(EMAC_RXFRAGMENTS));
428 dev_info(emac_dev, "EMAC: rx_filtered_frames:%d\n",
429 emac_read(EMAC_RXFILTERED));
430 dev_info(emac_dev, "EMAC: rx_qos_filtered_frames:%d\n",
431 emac_read(EMAC_RXQOSFILTERED));
432 dev_info(emac_dev, "EMAC: rx_octets:%d\n",
433 emac_read(EMAC_RXOCTETS));
434 dev_info(emac_dev, "EMAC: tx_goodframes:%d\n",
435 emac_read(EMAC_TXGOODFRAMES));
436 dev_info(emac_dev, "EMAC: tx_bcastframes:%d\n",
437 emac_read(EMAC_TXBCASTFRAMES));
438 dev_info(emac_dev, "EMAC: tx_mcastframes:%d\n",
439 emac_read(EMAC_TXMCASTFRAMES));
440 dev_info(emac_dev, "EMAC: tx_pause_frames:%d\n",
441 emac_read(EMAC_TXPAUSEFRAMES));
442 dev_info(emac_dev, "EMAC: tx_deferred_frames:%d\n",
443 emac_read(EMAC_TXDEFERRED));
444 dev_info(emac_dev, "EMAC: tx_collision_frames:%d\n",
445 emac_read(EMAC_TXCOLLISION));
446 dev_info(emac_dev, "EMAC: tx_single_coll_frames:%d\n",
447 emac_read(EMAC_TXSINGLECOLL));
448 dev_info(emac_dev, "EMAC: tx_mult_coll_frames:%d\n",
449 emac_read(EMAC_TXMULTICOLL));
450 dev_info(emac_dev, "EMAC: tx_excessive_collisions:%d\n",
451 emac_read(EMAC_TXEXCESSIVECOLL));
452 dev_info(emac_dev, "EMAC: tx_late_collisions:%d\n",
453 emac_read(EMAC_TXLATECOLL));
454 dev_info(emac_dev, "EMAC: tx_underrun:%d\n",
455 emac_read(EMAC_TXUNDERRUN));
456 dev_info(emac_dev, "EMAC: tx_carrier_sense_errors:%d\n",
457 emac_read(EMAC_TXCARRIERSENSE));
458 dev_info(emac_dev, "EMAC: tx_octets:%d\n",
459 emac_read(EMAC_TXOCTETS));
460 dev_info(emac_dev, "EMAC: net_octets:%d\n",
461 emac_read(EMAC_NETOCTETS));
462 dev_info(emac_dev, "EMAC: rx_sof_overruns:%d\n",
463 emac_read(EMAC_RXSOFOVERRUNS));
464 dev_info(emac_dev, "EMAC: rx_mof_overruns:%d\n",
465 emac_read(EMAC_RXMOFOVERRUNS));
466 dev_info(emac_dev, "EMAC: rx_dma_overruns:%d\n",
467 emac_read(EMAC_RXDMAOVERRUNS));
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -0400468
469 cpdma_ctlr_dump(priv->dma);
Anant Golea6286ee2009-05-18 15:19:01 -0700470}
471
Anant Golea6286ee2009-05-18 15:19:01 -0700472/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000473 * emac_get_drvinfo - Get EMAC driver information
Anant Golea6286ee2009-05-18 15:19:01 -0700474 * @ndev: The DaVinci EMAC network adapter
475 * @info: ethtool info structure containing name and version
476 *
477 * Returns EMAC driver information (name and version)
478 *
479 */
480static void emac_get_drvinfo(struct net_device *ndev,
481 struct ethtool_drvinfo *info)
482{
Jiri Pirko7826d432013-01-06 00:44:26 +0000483 strlcpy(info->driver, emac_version_string, sizeof(info->driver));
484 strlcpy(info->version, EMAC_MODULE_VERSION, sizeof(info->version));
Anant Golea6286ee2009-05-18 15:19:01 -0700485}
486
487/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000488 * emac_get_coalesce - Get interrupt coalesce settings for this device
Sriram84da2652010-07-29 02:33:58 +0000489 * @ndev : The DaVinci EMAC network adapter
490 * @coal : ethtool coalesce settings structure
491 *
492 * Fetch the current interrupt coalesce settings
493 *
494 */
495static int emac_get_coalesce(struct net_device *ndev,
496 struct ethtool_coalesce *coal)
497{
498 struct emac_priv *priv = netdev_priv(ndev);
499
500 coal->rx_coalesce_usecs = priv->coal_intvl;
501 return 0;
502
503}
504
505/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000506 * emac_set_coalesce - Set interrupt coalesce settings for this device
Sriram84da2652010-07-29 02:33:58 +0000507 * @ndev : The DaVinci EMAC network adapter
508 * @coal : ethtool coalesce settings structure
509 *
510 * Set interrupt coalesce parameters
511 *
512 */
513static int emac_set_coalesce(struct net_device *ndev,
514 struct ethtool_coalesce *coal)
515{
516 struct emac_priv *priv = netdev_priv(ndev);
517 u32 int_ctrl, num_interrupts = 0;
518 u32 prescale = 0, addnl_dvdr = 1, coal_intvl = 0;
519
520 if (!coal->rx_coalesce_usecs)
521 return -EINVAL;
522
523 coal_intvl = coal->rx_coalesce_usecs;
524
525 switch (priv->version) {
526 case EMAC_VERSION_2:
527 int_ctrl = emac_ctrl_read(EMAC_DM646X_CMINTCTRL);
528 prescale = priv->bus_freq_mhz * 4;
529
530 if (coal_intvl < EMAC_DM646X_CMINTMIN_INTVL)
531 coal_intvl = EMAC_DM646X_CMINTMIN_INTVL;
532
533 if (coal_intvl > EMAC_DM646X_CMINTMAX_INTVL) {
534 /*
535 * Interrupt pacer works with 4us Pulse, we can
536 * throttle further by dilating the 4us pulse.
537 */
538 addnl_dvdr = EMAC_DM646X_INTPRESCALE_MASK / prescale;
539
540 if (addnl_dvdr > 1) {
541 prescale *= addnl_dvdr;
542 if (coal_intvl > (EMAC_DM646X_CMINTMAX_INTVL
543 * addnl_dvdr))
544 coal_intvl = (EMAC_DM646X_CMINTMAX_INTVL
545 * addnl_dvdr);
546 } else {
547 addnl_dvdr = 1;
548 coal_intvl = EMAC_DM646X_CMINTMAX_INTVL;
549 }
550 }
551
552 num_interrupts = (1000 * addnl_dvdr) / coal_intvl;
553
554 int_ctrl |= EMAC_DM646X_INTPACEEN;
555 int_ctrl &= (~EMAC_DM646X_INTPRESCALE_MASK);
556 int_ctrl |= (prescale & EMAC_DM646X_INTPRESCALE_MASK);
557 emac_ctrl_write(EMAC_DM646X_CMINTCTRL, int_ctrl);
558
559 emac_ctrl_write(EMAC_DM646X_CMRXINTMAX, num_interrupts);
560 emac_ctrl_write(EMAC_DM646X_CMTXINTMAX, num_interrupts);
561
562 break;
563 default:
564 int_ctrl = emac_ctrl_read(EMAC_CTRL_EWINTTCNT);
565 int_ctrl &= (~EMAC_DM644X_EWINTCNT_MASK);
566 prescale = coal_intvl * priv->bus_freq_mhz;
567 if (prescale > EMAC_DM644X_EWINTCNT_MASK) {
568 prescale = EMAC_DM644X_EWINTCNT_MASK;
569 coal_intvl = prescale / priv->bus_freq_mhz;
570 }
571 emac_ctrl_write(EMAC_CTRL_EWINTTCNT, (int_ctrl | prescale));
572
573 break;
574 }
575
576 printk(KERN_INFO"Set coalesce to %d usecs.\n", coal_intvl);
577 priv->coal_intvl = coal_intvl;
578
579 return 0;
580
581}
582
583
Ben Hutchings1aa8b472012-07-10 10:56:59 +0000584/* ethtool_ops: DaVinci EMAC Ethtool structure
Anant Golea6286ee2009-05-18 15:19:01 -0700585 *
586 * Ethtool support for EMAC adapter
Anant Golea6286ee2009-05-18 15:19:01 -0700587 */
588static const struct ethtool_ops ethtool_ops = {
589 .get_drvinfo = emac_get_drvinfo,
Anant Golea6286ee2009-05-18 15:19:01 -0700590 .get_link = ethtool_op_get_link,
Sriram84da2652010-07-29 02:33:58 +0000591 .get_coalesce = emac_get_coalesce,
592 .set_coalesce = emac_set_coalesce,
Richard Cochran1fa68be2012-04-03 22:59:24 +0000593 .get_ts_info = ethtool_op_get_ts_info,
Philippe Reynesefb15c32016-07-02 00:02:35 +0200594 .get_link_ksettings = phy_ethtool_get_link_ksettings,
595 .set_link_ksettings = phy_ethtool_set_link_ksettings,
Anant Golea6286ee2009-05-18 15:19:01 -0700596};
597
598/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000599 * emac_update_phystatus - Update Phy status
Anant Golea6286ee2009-05-18 15:19:01 -0700600 * @priv: The DaVinci EMAC private adapter structure
601 *
602 * Updates phy status and takes action for network queue if required
603 * based upon link status
604 *
605 */
606static void emac_update_phystatus(struct emac_priv *priv)
607{
608 u32 mac_control;
609 u32 new_duplex;
610 u32 cur_duplex;
611 struct net_device *ndev = priv->ndev;
612
613 mac_control = emac_read(EMAC_MACCONTROL);
614 cur_duplex = (mac_control & EMAC_MACCONTROL_FULLDUPLEXEN) ?
615 DUPLEX_FULL : DUPLEX_HALF;
Philippe Reynesc3321772016-07-02 00:02:34 +0200616 if (ndev->phydev)
617 new_duplex = ndev->phydev->duplex;
Anant Golea6286ee2009-05-18 15:19:01 -0700618 else
619 new_duplex = DUPLEX_FULL;
620
621 /* We get called only if link has changed (speed/duplex/status) */
622 if ((priv->link) && (new_duplex != cur_duplex)) {
623 priv->duplex = new_duplex;
624 if (DUPLEX_FULL == priv->duplex)
625 mac_control |= (EMAC_MACCONTROL_FULLDUPLEXEN);
626 else
627 mac_control &= ~(EMAC_MACCONTROL_FULLDUPLEXEN);
628 }
629
630 if (priv->speed == SPEED_1000 && (priv->version == EMAC_VERSION_2)) {
631 mac_control = emac_read(EMAC_MACCONTROL);
chaithrika@ti.com69ef9692009-10-01 10:25:19 +0000632 mac_control |= (EMAC_DM646X_MACCONTORL_GIG |
Anant Golea6286ee2009-05-18 15:19:01 -0700633 EMAC_DM646X_MACCONTORL_GIGFORCE);
634 } else {
635 /* Clear the GIG bit and GIGFORCE bit */
636 mac_control &= ~(EMAC_DM646X_MACCONTORL_GIGFORCE |
637 EMAC_DM646X_MACCONTORL_GIG);
638
639 if (priv->rmii_en && (priv->speed == SPEED_100))
640 mac_control |= EMAC_MACCONTROL_RMIISPEED_MASK;
641 else
642 mac_control &= ~EMAC_MACCONTROL_RMIISPEED_MASK;
643 }
644
645 /* Update mac_control if changed */
646 emac_write(EMAC_MACCONTROL, mac_control);
647
648 if (priv->link) {
649 /* link ON */
650 if (!netif_carrier_ok(ndev))
651 netif_carrier_on(ndev);
652 /* reactivate the transmit queue if it is stopped */
653 if (netif_running(ndev) && netif_queue_stopped(ndev))
654 netif_wake_queue(ndev);
655 } else {
656 /* link OFF */
657 if (netif_carrier_ok(ndev))
658 netif_carrier_off(ndev);
659 if (!netif_queue_stopped(ndev))
660 netif_stop_queue(ndev);
661 }
662}
663
664/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000665 * hash_get - Calculate hash value from mac address
Anant Golea6286ee2009-05-18 15:19:01 -0700666 * @addr: mac address to delete from hash table
667 *
668 * Calculates hash value from mac address
669 *
670 */
671static u32 hash_get(u8 *addr)
672{
673 u32 hash;
674 u8 tmpval;
675 int cnt;
676 hash = 0;
677
678 for (cnt = 0; cnt < 2; cnt++) {
679 tmpval = *addr++;
680 hash ^= (tmpval >> 2) ^ (tmpval << 4);
681 tmpval = *addr++;
682 hash ^= (tmpval >> 4) ^ (tmpval << 2);
683 tmpval = *addr++;
684 hash ^= (tmpval >> 6) ^ (tmpval);
685 }
686
687 return hash & 0x3F;
688}
689
690/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000691 * hash_add - Hash function to add mac addr from hash table
Anant Golea6286ee2009-05-18 15:19:01 -0700692 * @priv: The DaVinci EMAC private adapter structure
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000693 * @mac_addr: mac address to delete from hash table
Anant Golea6286ee2009-05-18 15:19:01 -0700694 *
695 * Adds mac address to the internal hash table
696 *
697 */
698static int hash_add(struct emac_priv *priv, u8 *mac_addr)
699{
700 struct device *emac_dev = &priv->ndev->dev;
701 u32 rc = 0;
702 u32 hash_bit;
703 u32 hash_value = hash_get(mac_addr);
704
705 if (hash_value >= EMAC_NUM_MULTICAST_BITS) {
706 if (netif_msg_drv(priv)) {
707 dev_err(emac_dev, "DaVinci EMAC: hash_add(): Invalid "\
708 "Hash %08x, should not be greater than %08x",
709 hash_value, (EMAC_NUM_MULTICAST_BITS - 1));
710 }
711 return -1;
712 }
713
714 /* set the hash bit only if not previously set */
715 if (priv->multicast_hash_cnt[hash_value] == 0) {
716 rc = 1; /* hash value changed */
717 if (hash_value < 32) {
718 hash_bit = BIT(hash_value);
719 priv->mac_hash1 |= hash_bit;
720 } else {
721 hash_bit = BIT((hash_value - 32));
722 priv->mac_hash2 |= hash_bit;
723 }
724 }
725
726 /* incr counter for num of mcast addr's mapped to "this" hash bit */
727 ++priv->multicast_hash_cnt[hash_value];
728
729 return rc;
730}
731
732/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000733 * hash_del - Hash function to delete mac addr from hash table
Anant Golea6286ee2009-05-18 15:19:01 -0700734 * @priv: The DaVinci EMAC private adapter structure
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000735 * @mac_addr: mac address to delete from hash table
Anant Golea6286ee2009-05-18 15:19:01 -0700736 *
737 * Removes mac address from the internal hash table
738 *
739 */
740static int hash_del(struct emac_priv *priv, u8 *mac_addr)
741{
742 u32 hash_value;
743 u32 hash_bit;
744
745 hash_value = hash_get(mac_addr);
746 if (priv->multicast_hash_cnt[hash_value] > 0) {
747 /* dec cntr for num of mcast addr's mapped to this hash bit */
748 --priv->multicast_hash_cnt[hash_value];
749 }
750
751 /* if counter still > 0, at least one multicast address refers
752 * to this hash bit. so return 0 */
753 if (priv->multicast_hash_cnt[hash_value] > 0)
754 return 0;
755
756 if (hash_value < 32) {
757 hash_bit = BIT(hash_value);
758 priv->mac_hash1 &= ~hash_bit;
759 } else {
760 hash_bit = BIT((hash_value - 32));
761 priv->mac_hash2 &= ~hash_bit;
762 }
763
764 /* return 1 to indicate change in mac_hash registers reqd */
765 return 1;
766}
767
768/* EMAC multicast operation */
769#define EMAC_MULTICAST_ADD 0
770#define EMAC_MULTICAST_DEL 1
771#define EMAC_ALL_MULTI_SET 2
772#define EMAC_ALL_MULTI_CLR 3
773
774/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000775 * emac_add_mcast - Set multicast address in the EMAC adapter (Internal)
Anant Golea6286ee2009-05-18 15:19:01 -0700776 * @priv: The DaVinci EMAC private adapter structure
777 * @action: multicast operation to perform
778 * mac_addr: mac address to set
779 *
780 * Set multicast addresses in EMAC adapter - internal function
781 *
782 */
783static void emac_add_mcast(struct emac_priv *priv, u32 action, u8 *mac_addr)
784{
785 struct device *emac_dev = &priv->ndev->dev;
786 int update = -1;
787
788 switch (action) {
789 case EMAC_MULTICAST_ADD:
790 update = hash_add(priv, mac_addr);
791 break;
792 case EMAC_MULTICAST_DEL:
793 update = hash_del(priv, mac_addr);
794 break;
795 case EMAC_ALL_MULTI_SET:
796 update = 1;
797 priv->mac_hash1 = EMAC_ALL_MULTI_REG_VALUE;
798 priv->mac_hash2 = EMAC_ALL_MULTI_REG_VALUE;
799 break;
800 case EMAC_ALL_MULTI_CLR:
801 update = 1;
802 priv->mac_hash1 = 0;
803 priv->mac_hash2 = 0;
804 memset(&(priv->multicast_hash_cnt[0]), 0,
805 sizeof(priv->multicast_hash_cnt[0]) *
806 EMAC_NUM_MULTICAST_BITS);
807 break;
808 default:
809 if (netif_msg_drv(priv))
810 dev_err(emac_dev, "DaVinci EMAC: add_mcast"\
811 ": bad operation %d", action);
812 break;
813 }
814
815 /* write to the hardware only if the register status chances */
816 if (update > 0) {
817 emac_write(EMAC_MACHASH1, priv->mac_hash1);
818 emac_write(EMAC_MACHASH2, priv->mac_hash2);
819 }
820}
821
822/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000823 * emac_dev_mcast_set - Set multicast address in the EMAC adapter
Anant Golea6286ee2009-05-18 15:19:01 -0700824 * @ndev: The DaVinci EMAC network adapter
825 *
826 * Set multicast addresses in EMAC adapter
827 *
828 */
829static void emac_dev_mcast_set(struct net_device *ndev)
830{
831 u32 mbp_enable;
832 struct emac_priv *priv = netdev_priv(ndev);
833
834 mbp_enable = emac_read(EMAC_RXMBPENABLE);
835 if (ndev->flags & IFF_PROMISC) {
836 mbp_enable &= (~EMAC_MBP_PROMISCCH(EMAC_DEF_PROM_CH));
837 mbp_enable |= (EMAC_MBP_RXPROMISC);
838 } else {
839 mbp_enable = (mbp_enable & ~EMAC_MBP_RXPROMISC);
840 if ((ndev->flags & IFF_ALLMULTI) ||
Jiri Pirko4cd24ea2010-02-08 04:30:35 +0000841 netdev_mc_count(ndev) > EMAC_DEF_MAX_MULTICAST_ADDRESSES) {
Anant Golea6286ee2009-05-18 15:19:01 -0700842 mbp_enable = (mbp_enable | EMAC_MBP_RXMCAST);
843 emac_add_mcast(priv, EMAC_ALL_MULTI_SET, NULL);
Mariusz Ceierd69e0f72013-10-21 19:45:04 +0200844 } else if (!netdev_mc_empty(ndev)) {
Jiri Pirko22bedad32010-04-01 21:22:57 +0000845 struct netdev_hw_addr *ha;
846
Anant Golea6286ee2009-05-18 15:19:01 -0700847 mbp_enable = (mbp_enable | EMAC_MBP_RXMCAST);
848 emac_add_mcast(priv, EMAC_ALL_MULTI_CLR, NULL);
849 /* program multicast address list into EMAC hardware */
Jiri Pirko22bedad32010-04-01 21:22:57 +0000850 netdev_for_each_mc_addr(ha, ndev) {
Anant Golea6286ee2009-05-18 15:19:01 -0700851 emac_add_mcast(priv, EMAC_MULTICAST_ADD,
Jiri Pirko22bedad32010-04-01 21:22:57 +0000852 (u8 *) ha->addr);
Anant Golea6286ee2009-05-18 15:19:01 -0700853 }
854 } else {
855 mbp_enable = (mbp_enable & ~EMAC_MBP_RXMCAST);
856 emac_add_mcast(priv, EMAC_ALL_MULTI_CLR, NULL);
857 }
858 }
859 /* Set mbp config register */
860 emac_write(EMAC_RXMBPENABLE, mbp_enable);
861}
862
863/*************************************************************************
864 * EMAC Hardware manipulation
865 *************************************************************************/
866
867/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000868 * emac_int_disable - Disable EMAC module interrupt (from adapter)
Anant Golea6286ee2009-05-18 15:19:01 -0700869 * @priv: The DaVinci EMAC private adapter structure
870 *
871 * Disable EMAC interrupt on the adapter
872 *
873 */
874static void emac_int_disable(struct emac_priv *priv)
875{
876 if (priv->version == EMAC_VERSION_2) {
877 unsigned long flags;
878
879 local_irq_save(flags);
880
881 /* Program C0_Int_En to zero to turn off
882 * interrupts to the CPU */
883 emac_ctrl_write(EMAC_DM646X_CMRXINTEN, 0x0);
884 emac_ctrl_write(EMAC_DM646X_CMTXINTEN, 0x0);
885 /* NOTE: Rx Threshold and Misc interrupts are not disabled */
Sriramakrishnan01a9af32009-11-19 15:58:26 +0530886 if (priv->int_disable)
887 priv->int_disable();
Anant Golea6286ee2009-05-18 15:19:01 -0700888
Tony Lindgrencd2d6d32015-01-15 14:45:09 -0800889 /* NOTE: Rx Threshold and Misc interrupts are not enabled */
890
891 /* ack rxen only then a new pulse will be generated */
892 emac_write(EMAC_DM646X_MACEOIVECTOR,
893 EMAC_DM646X_MAC_EOI_C0_RXEN);
894
895 /* ack txen- only then a new pulse will be generated */
896 emac_write(EMAC_DM646X_MACEOIVECTOR,
897 EMAC_DM646X_MAC_EOI_C0_TXEN);
898
Anant Golea6286ee2009-05-18 15:19:01 -0700899 local_irq_restore(flags);
900
901 } else {
902 /* Set DM644x control registers for interrupt control */
903 emac_ctrl_write(EMAC_CTRL_EWCTL, 0x0);
904 }
905}
906
907/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000908 * emac_int_enable - Enable EMAC module interrupt (from adapter)
Anant Golea6286ee2009-05-18 15:19:01 -0700909 * @priv: The DaVinci EMAC private adapter structure
910 *
911 * Enable EMAC interrupt on the adapter
912 *
913 */
914static void emac_int_enable(struct emac_priv *priv)
915{
916 if (priv->version == EMAC_VERSION_2) {
Sriramakrishnan01a9af32009-11-19 15:58:26 +0530917 if (priv->int_enable)
918 priv->int_enable();
919
Anant Golea6286ee2009-05-18 15:19:01 -0700920 emac_ctrl_write(EMAC_DM646X_CMRXINTEN, 0xff);
921 emac_ctrl_write(EMAC_DM646X_CMTXINTEN, 0xff);
922
923 /* In addition to turning on interrupt Enable, we need
924 * ack by writing appropriate values to the EOI
925 * register */
926
927 /* NOTE: Rx Threshold and Misc interrupts are not enabled */
Anant Golea6286ee2009-05-18 15:19:01 -0700928 } else {
929 /* Set DM644x control registers for interrupt control */
930 emac_ctrl_write(EMAC_CTRL_EWCTL, 0x1);
931 }
932}
933
934/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +0000935 * emac_irq - EMAC interrupt handler
Anant Golea6286ee2009-05-18 15:19:01 -0700936 * @irq: interrupt number
937 * @dev_id: EMAC network adapter data structure ptr
938 *
939 * EMAC Interrupt handler - we only schedule NAPI and not process any packets
940 * here. EVen the interrupt status is checked (TX/RX/Err) in NAPI poll function
941 *
942 * Returns interrupt handled condition
943 */
944static irqreturn_t emac_irq(int irq, void *dev_id)
945{
946 struct net_device *ndev = (struct net_device *)dev_id;
947 struct emac_priv *priv = netdev_priv(ndev);
948
949 ++priv->isr_count;
950 if (likely(netif_running(priv->ndev))) {
951 emac_int_disable(priv);
952 napi_schedule(&priv->napi);
953 } else {
954 /* we are closing down, so dont process anything */
955 }
956 return IRQ_HANDLED;
957}
958
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -0400959static struct sk_buff *emac_rx_alloc(struct emac_priv *priv)
960{
Pradeep A. Dalvidae2e9f2012-02-06 11:16:13 +0000961 struct sk_buff *skb = netdev_alloc_skb(priv->ndev, priv->rx_buf_size);
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -0400962 if (WARN_ON(!skb))
963 return NULL;
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -0400964 skb_reserve(skb, NET_IP_ALIGN);
965 return skb;
966}
967
968static void emac_rx_handler(void *token, int len, int status)
969{
970 struct sk_buff *skb = token;
971 struct net_device *ndev = skb->dev;
972 struct emac_priv *priv = netdev_priv(ndev);
973 struct device *emac_dev = &ndev->dev;
974 int ret;
975
976 /* free and bail if we are shutting down */
Christian Riesch5d697032012-02-23 01:14:17 +0000977 if (unlikely(!netif_running(ndev))) {
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -0400978 dev_kfree_skb_any(skb);
979 return;
980 }
981
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300982 /* recycle on receive error */
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -0400983 if (status < 0) {
984 ndev->stats.rx_errors++;
985 goto recycle;
986 }
987
988 /* feed received packet up the stack */
989 skb_put(skb, len);
990 skb->protocol = eth_type_trans(skb, ndev);
991 netif_receive_skb(skb);
992 ndev->stats.rx_bytes += len;
993 ndev->stats.rx_packets++;
994
995 /* alloc a new packet for receive */
996 skb = emac_rx_alloc(priv);
997 if (!skb) {
998 if (netif_msg_rx_err(priv) && net_ratelimit())
999 dev_err(emac_dev, "failed rx buffer alloc\n");
1000 return;
1001 }
1002
1003recycle:
1004 ret = cpdma_chan_submit(priv->rxchan, skb, skb->data,
Sebastian Siewioraef614e2013-04-23 07:31:38 +00001005 skb_tailroom(skb), 0);
Christian Riesch5d697032012-02-23 01:14:17 +00001006
1007 WARN_ON(ret == -ENOMEM);
1008 if (unlikely(ret < 0))
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001009 dev_kfree_skb_any(skb);
1010}
1011
1012static void emac_tx_handler(void *token, int len, int status)
1013{
1014 struct sk_buff *skb = token;
1015 struct net_device *ndev = skb->dev;
Sascha Hauer86d8c072012-01-03 05:27:47 +00001016
Mugunthan V Nfae50822013-01-17 06:31:34 +00001017 /* Check whether the queue is stopped due to stalled tx dma, if the
1018 * queue is stopped then start the queue as we have free desc for tx
1019 */
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001020 if (unlikely(netif_queue_stopped(ndev)))
Mugunthan V N7e51cde2013-03-27 04:42:00 +00001021 netif_wake_queue(ndev);
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001022 ndev->stats.tx_packets++;
1023 ndev->stats.tx_bytes += len;
1024 dev_kfree_skb_any(skb);
1025}
1026
Anant Golea6286ee2009-05-18 15:19:01 -07001027/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001028 * emac_dev_xmit - EMAC Transmit function
Anant Golea6286ee2009-05-18 15:19:01 -07001029 * @skb: SKB pointer
1030 * @ndev: The DaVinci EMAC network adapter
1031 *
1032 * Called by the system to transmit a packet - we queue the packet in
1033 * EMAC hardware transmit queue
1034 *
1035 * Returns success(NETDEV_TX_OK) or error code (typically out of desc's)
1036 */
1037static int emac_dev_xmit(struct sk_buff *skb, struct net_device *ndev)
1038{
1039 struct device *emac_dev = &ndev->dev;
1040 int ret_code;
Anant Golea6286ee2009-05-18 15:19:01 -07001041 struct emac_priv *priv = netdev_priv(ndev);
1042
1043 /* If no link, return */
1044 if (unlikely(!priv->link)) {
1045 if (netif_msg_tx_err(priv) && net_ratelimit())
1046 dev_err(emac_dev, "DaVinci EMAC: No link to transmit");
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001047 goto fail_tx;
Anant Golea6286ee2009-05-18 15:19:01 -07001048 }
1049
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001050 ret_code = skb_padto(skb, EMAC_DEF_MIN_ETHPKTSIZE);
1051 if (unlikely(ret_code < 0)) {
1052 if (netif_msg_tx_err(priv) && net_ratelimit())
1053 dev_err(emac_dev, "DaVinci EMAC: packet pad failed");
1054 goto fail_tx;
1055 }
1056
Richard Cochran5bf0c192011-06-19 03:31:45 +00001057 skb_tx_timestamp(skb);
1058
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001059 ret_code = cpdma_chan_submit(priv->txchan, skb, skb->data, skb->len,
Sebastian Siewioraef614e2013-04-23 07:31:38 +00001060 0);
Anant Golea6286ee2009-05-18 15:19:01 -07001061 if (unlikely(ret_code != 0)) {
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001062 if (netif_msg_tx_err(priv) && net_ratelimit())
1063 dev_err(emac_dev, "DaVinci EMAC: desc submit failed");
1064 goto fail_tx;
Anant Golea6286ee2009-05-18 15:19:01 -07001065 }
1066
Mugunthan V Nfae50822013-01-17 06:31:34 +00001067 /* If there is no more tx desc left free then we need to
1068 * tell the kernel to stop sending us tx frames.
1069 */
Mugunthan V N75b9b612013-03-15 04:10:16 +00001070 if (unlikely(!cpdma_check_free_tx_desc(priv->txchan)))
Sascha Hauer86d8c072012-01-03 05:27:47 +00001071 netif_stop_queue(ndev);
1072
Anant Golea6286ee2009-05-18 15:19:01 -07001073 return NETDEV_TX_OK;
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001074
1075fail_tx:
1076 ndev->stats.tx_dropped++;
1077 netif_stop_queue(ndev);
1078 return NETDEV_TX_BUSY;
Anant Golea6286ee2009-05-18 15:19:01 -07001079}
1080
1081/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001082 * emac_dev_tx_timeout - EMAC Transmit timeout function
Anant Golea6286ee2009-05-18 15:19:01 -07001083 * @ndev: The DaVinci EMAC network adapter
1084 *
1085 * Called when system detects that a skb timeout period has expired
1086 * potentially due to a fault in the adapter in not being able to send
1087 * it out on the wire. We teardown the TX channel assuming a hardware
1088 * error and re-initialize the TX channel for hardware operation
1089 *
1090 */
1091static void emac_dev_tx_timeout(struct net_device *ndev)
1092{
1093 struct emac_priv *priv = netdev_priv(ndev);
1094 struct device *emac_dev = &ndev->dev;
1095
1096 if (netif_msg_tx_err(priv))
1097 dev_err(emac_dev, "DaVinci EMAC: xmit timeout, restarting TX");
1098
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001099 emac_dump_regs(priv);
1100
Kulikov Vasiliy78e8c532010-07-05 02:13:26 +00001101 ndev->stats.tx_errors++;
Anant Golea6286ee2009-05-18 15:19:01 -07001102 emac_int_disable(priv);
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001103 cpdma_chan_stop(priv->txchan);
1104 cpdma_chan_start(priv->txchan);
Anant Golea6286ee2009-05-18 15:19:01 -07001105 emac_int_enable(priv);
1106}
1107
1108/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001109 * emac_set_type0addr - Set EMAC Type0 mac address
Anant Golea6286ee2009-05-18 15:19:01 -07001110 * @priv: The DaVinci EMAC private adapter structure
1111 * @ch: RX channel number
1112 * @mac_addr: MAC address to set in device
1113 *
1114 * Called internally to set Type0 mac address of the adapter (Device)
1115 *
1116 * Returns success (0) or appropriate error code (none as of now)
1117 */
1118static void emac_set_type0addr(struct emac_priv *priv, u32 ch, char *mac_addr)
1119{
1120 u32 val;
1121 val = ((mac_addr[5] << 8) | (mac_addr[4]));
1122 emac_write(EMAC_MACSRCADDRLO, val);
1123
1124 val = ((mac_addr[3] << 24) | (mac_addr[2] << 16) | \
1125 (mac_addr[1] << 8) | (mac_addr[0]));
1126 emac_write(EMAC_MACSRCADDRHI, val);
1127 val = emac_read(EMAC_RXUNICASTSET);
1128 val |= BIT(ch);
1129 emac_write(EMAC_RXUNICASTSET, val);
1130 val = emac_read(EMAC_RXUNICASTCLEAR);
1131 val &= ~BIT(ch);
1132 emac_write(EMAC_RXUNICASTCLEAR, val);
1133}
1134
1135/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001136 * emac_set_type1addr - Set EMAC Type1 mac address
Anant Golea6286ee2009-05-18 15:19:01 -07001137 * @priv: The DaVinci EMAC private adapter structure
1138 * @ch: RX channel number
1139 * @mac_addr: MAC address to set in device
1140 *
1141 * Called internally to set Type1 mac address of the adapter (Device)
1142 *
1143 * Returns success (0) or appropriate error code (none as of now)
1144 */
1145static void emac_set_type1addr(struct emac_priv *priv, u32 ch, char *mac_addr)
1146{
1147 u32 val;
1148 emac_write(EMAC_MACINDEX, ch);
1149 val = ((mac_addr[5] << 8) | mac_addr[4]);
1150 emac_write(EMAC_MACADDRLO, val);
1151 val = ((mac_addr[3] << 24) | (mac_addr[2] << 16) | \
1152 (mac_addr[1] << 8) | (mac_addr[0]));
1153 emac_write(EMAC_MACADDRHI, val);
1154 emac_set_type0addr(priv, ch, mac_addr);
1155}
1156
1157/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001158 * emac_set_type2addr - Set EMAC Type2 mac address
Anant Golea6286ee2009-05-18 15:19:01 -07001159 * @priv: The DaVinci EMAC private adapter structure
1160 * @ch: RX channel number
1161 * @mac_addr: MAC address to set in device
1162 * @index: index into RX address entries
1163 * @match: match parameter for RX address matching logic
1164 *
1165 * Called internally to set Type2 mac address of the adapter (Device)
1166 *
1167 * Returns success (0) or appropriate error code (none as of now)
1168 */
1169static void emac_set_type2addr(struct emac_priv *priv, u32 ch,
1170 char *mac_addr, int index, int match)
1171{
1172 u32 val;
1173 emac_write(EMAC_MACINDEX, index);
1174 val = ((mac_addr[3] << 24) | (mac_addr[2] << 16) | \
1175 (mac_addr[1] << 8) | (mac_addr[0]));
1176 emac_write(EMAC_MACADDRHI, val);
1177 val = ((mac_addr[5] << 8) | mac_addr[4] | ((ch & 0x7) << 16) | \
1178 (match << 19) | BIT(20));
1179 emac_write(EMAC_MACADDRLO, val);
1180 emac_set_type0addr(priv, ch, mac_addr);
1181}
1182
1183/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001184 * emac_setmac - Set mac address in the adapter (internal function)
Anant Golea6286ee2009-05-18 15:19:01 -07001185 * @priv: The DaVinci EMAC private adapter structure
1186 * @ch: RX channel number
1187 * @mac_addr: MAC address to set in device
1188 *
1189 * Called internally to set the mac address of the adapter (Device)
1190 *
1191 * Returns success (0) or appropriate error code (none as of now)
1192 */
1193static void emac_setmac(struct emac_priv *priv, u32 ch, char *mac_addr)
1194{
1195 struct device *emac_dev = &priv->ndev->dev;
1196
1197 if (priv->rx_addr_type == 0) {
1198 emac_set_type0addr(priv, ch, mac_addr);
1199 } else if (priv->rx_addr_type == 1) {
1200 u32 cnt;
1201 for (cnt = 0; cnt < EMAC_MAX_TXRX_CHANNELS; cnt++)
1202 emac_set_type1addr(priv, ch, mac_addr);
1203 } else if (priv->rx_addr_type == 2) {
1204 emac_set_type2addr(priv, ch, mac_addr, ch, 1);
1205 emac_set_type0addr(priv, ch, mac_addr);
1206 } else {
1207 if (netif_msg_drv(priv))
1208 dev_err(emac_dev, "DaVinci EMAC: Wrong addressing\n");
1209 }
1210}
1211
1212/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001213 * emac_dev_setmac_addr - Set mac address in the adapter
Anant Golea6286ee2009-05-18 15:19:01 -07001214 * @ndev: The DaVinci EMAC network adapter
1215 * @addr: MAC address to set in device
1216 *
1217 * Called by the system to set the mac address of the adapter (Device)
1218 *
1219 * Returns success (0) or appropriate error code (none as of now)
1220 */
1221static int emac_dev_setmac_addr(struct net_device *ndev, void *addr)
1222{
1223 struct emac_priv *priv = netdev_priv(ndev);
Anant Golea6286ee2009-05-18 15:19:01 -07001224 struct device *emac_dev = &priv->ndev->dev;
1225 struct sockaddr *sa = addr;
Anant Golea6286ee2009-05-18 15:19:01 -07001226
Pablo Bitton64c81652009-07-07 19:11:10 -07001227 if (!is_valid_ether_addr(sa->sa_data))
Danny Kukawka504f9b52012-02-21 02:07:49 +00001228 return -EADDRNOTAVAIL;
Pablo Bitton64c81652009-07-07 19:11:10 -07001229
Anant Golea6286ee2009-05-18 15:19:01 -07001230 /* Store mac addr in priv and rx channel and set it in EMAC hw */
1231 memcpy(priv->mac_addr, sa->sa_data, ndev->addr_len);
Anant Golea6286ee2009-05-18 15:19:01 -07001232 memcpy(ndev->dev_addr, sa->sa_data, ndev->addr_len);
Pablo Bitton64c81652009-07-07 19:11:10 -07001233
Pablo Bitton64c81652009-07-07 19:11:10 -07001234 /* MAC address is configured only after the interface is enabled. */
1235 if (netif_running(ndev)) {
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001236 emac_setmac(priv, EMAC_DEF_RX_CH, priv->mac_addr);
Pablo Bitton64c81652009-07-07 19:11:10 -07001237 }
Anant Golea6286ee2009-05-18 15:19:01 -07001238
1239 if (netif_msg_drv(priv))
Chaithrika U S5c726162009-06-03 21:54:29 -07001240 dev_notice(emac_dev, "DaVinci EMAC: emac_dev_setmac_addr %pM\n",
1241 priv->mac_addr);
Anant Golea6286ee2009-05-18 15:19:01 -07001242
1243 return 0;
1244}
1245
1246/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001247 * emac_hw_enable - Enable EMAC hardware for packet transmission/reception
Anant Golea6286ee2009-05-18 15:19:01 -07001248 * @priv: The DaVinci EMAC private adapter structure
1249 *
1250 * Enables EMAC hardware for packet processing - enables PHY, enables RX
1251 * for packet reception and enables device interrupts and then NAPI
1252 *
1253 * Returns success (0) or appropriate error code (none right now)
1254 */
1255static int emac_hw_enable(struct emac_priv *priv)
1256{
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001257 u32 val, mbp_enable, mac_control;
Anant Golea6286ee2009-05-18 15:19:01 -07001258
1259 /* Soft reset */
1260 emac_write(EMAC_SOFTRESET, 1);
1261 while (emac_read(EMAC_SOFTRESET))
1262 cpu_relax();
1263
1264 /* Disable interrupt & Set pacing for more interrupts initially */
1265 emac_int_disable(priv);
1266
1267 /* Full duplex enable bit set when auto negotiation happens */
1268 mac_control =
1269 (((EMAC_DEF_TXPRIO_FIXED) ? (EMAC_MACCONTROL_TXPTYPE) : 0x0) |
1270 ((priv->speed == 1000) ? EMAC_MACCONTROL_GIGABITEN : 0x0) |
1271 ((EMAC_DEF_TXPACING_EN) ? (EMAC_MACCONTROL_TXPACEEN) : 0x0) |
1272 ((priv->duplex == DUPLEX_FULL) ? 0x1 : 0));
1273 emac_write(EMAC_MACCONTROL, mac_control);
1274
1275 mbp_enable =
1276 (((EMAC_DEF_PASS_CRC) ? (EMAC_RXMBP_PASSCRC_MASK) : 0x0) |
1277 ((EMAC_DEF_QOS_EN) ? (EMAC_RXMBP_QOSEN_MASK) : 0x0) |
1278 ((EMAC_DEF_NO_BUFF_CHAIN) ? (EMAC_RXMBP_NOCHAIN_MASK) : 0x0) |
1279 ((EMAC_DEF_MACCTRL_FRAME_EN) ? (EMAC_RXMBP_CMFEN_MASK) : 0x0) |
1280 ((EMAC_DEF_SHORT_FRAME_EN) ? (EMAC_RXMBP_CSFEN_MASK) : 0x0) |
1281 ((EMAC_DEF_ERROR_FRAME_EN) ? (EMAC_RXMBP_CEFEN_MASK) : 0x0) |
1282 ((EMAC_DEF_PROM_EN) ? (EMAC_RXMBP_CAFEN_MASK) : 0x0) |
1283 ((EMAC_DEF_PROM_CH & EMAC_RXMBP_CHMASK) << \
1284 EMAC_RXMBP_PROMCH_SHIFT) |
1285 ((EMAC_DEF_BCAST_EN) ? (EMAC_RXMBP_BROADEN_MASK) : 0x0) |
1286 ((EMAC_DEF_BCAST_CH & EMAC_RXMBP_CHMASK) << \
1287 EMAC_RXMBP_BROADCH_SHIFT) |
1288 ((EMAC_DEF_MCAST_EN) ? (EMAC_RXMBP_MULTIEN_MASK) : 0x0) |
1289 ((EMAC_DEF_MCAST_CH & EMAC_RXMBP_CHMASK) << \
1290 EMAC_RXMBP_MULTICH_SHIFT));
1291 emac_write(EMAC_RXMBPENABLE, mbp_enable);
1292 emac_write(EMAC_RXMAXLEN, (EMAC_DEF_MAX_FRAME_SIZE &
1293 EMAC_RX_MAX_LEN_MASK));
1294 emac_write(EMAC_RXBUFFEROFFSET, (EMAC_DEF_BUFFER_OFFSET &
1295 EMAC_RX_BUFFER_OFFSET_MASK));
1296 emac_write(EMAC_RXFILTERLOWTHRESH, 0);
1297 emac_write(EMAC_RXUNICASTCLEAR, EMAC_RX_UNICAST_CLEAR_ALL);
1298 priv->rx_addr_type = (emac_read(EMAC_MACCONFIG) >> 8) & 0xFF;
1299
Anant Golea6286ee2009-05-18 15:19:01 -07001300 emac_write(EMAC_MACINTMASKSET, EMAC_MAC_HOST_ERR_INTMASK_VAL);
1301
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001302 emac_setmac(priv, EMAC_DEF_RX_CH, priv->mac_addr);
Anant Golea6286ee2009-05-18 15:19:01 -07001303
1304 /* Enable MII */
1305 val = emac_read(EMAC_MACCONTROL);
chaithrika@ti.com69ef9692009-10-01 10:25:19 +00001306 val |= (EMAC_MACCONTROL_GMIIEN);
Anant Golea6286ee2009-05-18 15:19:01 -07001307 emac_write(EMAC_MACCONTROL, val);
1308
1309 /* Enable NAPI and interrupts */
1310 napi_enable(&priv->napi);
1311 emac_int_enable(priv);
1312 return 0;
1313
1314}
1315
1316/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001317 * emac_poll - EMAC NAPI Poll function
Anant Golea6286ee2009-05-18 15:19:01 -07001318 * @ndev: The DaVinci EMAC network adapter
1319 * @budget: Number of receive packets to process (as told by NAPI layer)
1320 *
1321 * NAPI Poll function implemented to process packets as per budget. We check
1322 * the type of interrupt on the device and accordingly call the TX or RX
1323 * packet processing functions. We follow the budget for RX processing and
1324 * also put a cap on number of TX pkts processed through config param. The
1325 * NAPI schedule function is called if more packets pending.
1326 *
1327 * Returns number of packets received (in most cases; else TX pkts - rarely)
1328 */
1329static int emac_poll(struct napi_struct *napi, int budget)
1330{
1331 unsigned int mask;
1332 struct emac_priv *priv = container_of(napi, struct emac_priv, napi);
1333 struct net_device *ndev = priv->ndev;
1334 struct device *emac_dev = &ndev->dev;
1335 u32 status = 0;
Sriram3725b1f2010-07-29 02:33:59 +00001336 u32 num_tx_pkts = 0, num_rx_pkts = 0;
Anant Golea6286ee2009-05-18 15:19:01 -07001337
Anant Golea6286ee2009-05-18 15:19:01 -07001338 /* Check interrupt vectors and call packet processing */
1339 status = emac_read(EMAC_MACINVECTOR);
1340
1341 mask = EMAC_DM644X_MAC_IN_VECTOR_TX_INT_VEC;
1342
1343 if (priv->version == EMAC_VERSION_2)
1344 mask = EMAC_DM646X_MAC_IN_VECTOR_TX_INT_VEC;
1345
1346 if (status & mask) {
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001347 num_tx_pkts = cpdma_chan_process(priv->txchan,
1348 EMAC_DEF_TX_MAX_SERVICE);
Anant Golea6286ee2009-05-18 15:19:01 -07001349 } /* TX processing */
1350
Anant Golea6286ee2009-05-18 15:19:01 -07001351 mask = EMAC_DM644X_MAC_IN_VECTOR_RX_INT_VEC;
1352
1353 if (priv->version == EMAC_VERSION_2)
1354 mask = EMAC_DM646X_MAC_IN_VECTOR_RX_INT_VEC;
1355
1356 if (status & mask) {
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001357 num_rx_pkts = cpdma_chan_process(priv->rxchan, budget);
Anant Golea6286ee2009-05-18 15:19:01 -07001358 } /* RX processing */
1359
Sriram43c2ed82009-09-24 19:15:18 +00001360 mask = EMAC_DM644X_MAC_IN_VECTOR_HOST_INT;
1361 if (priv->version == EMAC_VERSION_2)
1362 mask = EMAC_DM646X_MAC_IN_VECTOR_HOST_INT;
1363
1364 if (unlikely(status & mask)) {
Anant Golea6286ee2009-05-18 15:19:01 -07001365 u32 ch, cause;
1366 dev_err(emac_dev, "DaVinci EMAC: Fatal Hardware Error\n");
1367 netif_stop_queue(ndev);
1368 napi_disable(&priv->napi);
1369
1370 status = emac_read(EMAC_MACSTATUS);
1371 cause = ((status & EMAC_MACSTATUS_TXERRCODE_MASK) >>
1372 EMAC_MACSTATUS_TXERRCODE_SHIFT);
1373 if (cause) {
1374 ch = ((status & EMAC_MACSTATUS_TXERRCH_MASK) >>
1375 EMAC_MACSTATUS_TXERRCH_SHIFT);
1376 if (net_ratelimit()) {
1377 dev_err(emac_dev, "TX Host error %s on ch=%d\n",
1378 &emac_txhost_errcodes[cause][0], ch);
1379 }
1380 }
1381 cause = ((status & EMAC_MACSTATUS_RXERRCODE_MASK) >>
1382 EMAC_MACSTATUS_RXERRCODE_SHIFT);
1383 if (cause) {
1384 ch = ((status & EMAC_MACSTATUS_RXERRCH_MASK) >>
1385 EMAC_MACSTATUS_RXERRCH_SHIFT);
1386 if (netif_msg_hw(priv) && net_ratelimit())
1387 dev_err(emac_dev, "RX Host error %s on ch=%d\n",
1388 &emac_rxhost_errcodes[cause][0], ch);
1389 }
Sriram3725b1f2010-07-29 02:33:59 +00001390 } else if (num_rx_pkts < budget) {
1391 napi_complete(napi);
1392 emac_int_enable(priv);
1393 }
Anant Golea6286ee2009-05-18 15:19:01 -07001394
Sriram3725b1f2010-07-29 02:33:59 +00001395 return num_rx_pkts;
Anant Golea6286ee2009-05-18 15:19:01 -07001396}
1397
1398#ifdef CONFIG_NET_POLL_CONTROLLER
1399/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001400 * emac_poll_controller - EMAC Poll controller function
Anant Golea6286ee2009-05-18 15:19:01 -07001401 * @ndev: The DaVinci EMAC network adapter
1402 *
1403 * Polled functionality used by netconsole and others in non interrupt mode
1404 *
1405 */
Wei Yongjune052a582013-03-20 05:01:45 +00001406static void emac_poll_controller(struct net_device *ndev)
Anant Golea6286ee2009-05-18 15:19:01 -07001407{
1408 struct emac_priv *priv = netdev_priv(ndev);
1409
1410 emac_int_disable(priv);
Tonyliuc8ee5532009-11-04 05:45:02 -08001411 emac_irq(ndev->irq, ndev);
Anant Golea6286ee2009-05-18 15:19:01 -07001412 emac_int_enable(priv);
1413}
1414#endif
1415
Anant Golea6286ee2009-05-18 15:19:01 -07001416static void emac_adjust_link(struct net_device *ndev)
1417{
1418 struct emac_priv *priv = netdev_priv(ndev);
Philippe Reynesc3321772016-07-02 00:02:34 +02001419 struct phy_device *phydev = ndev->phydev;
Anant Golea6286ee2009-05-18 15:19:01 -07001420 unsigned long flags;
1421 int new_state = 0;
1422
1423 spin_lock_irqsave(&priv->lock, flags);
1424
1425 if (phydev->link) {
1426 /* check the mode of operation - full/half duplex */
1427 if (phydev->duplex != priv->duplex) {
1428 new_state = 1;
1429 priv->duplex = phydev->duplex;
1430 }
1431 if (phydev->speed != priv->speed) {
1432 new_state = 1;
1433 priv->speed = phydev->speed;
1434 }
1435 if (!priv->link) {
1436 new_state = 1;
1437 priv->link = 1;
1438 }
1439
1440 } else if (priv->link) {
1441 new_state = 1;
1442 priv->link = 0;
1443 priv->speed = 0;
1444 priv->duplex = ~0;
1445 }
1446 if (new_state) {
1447 emac_update_phystatus(priv);
Philippe Reynesc3321772016-07-02 00:02:34 +02001448 phy_print_status(ndev->phydev);
Anant Golea6286ee2009-05-18 15:19:01 -07001449 }
1450
1451 spin_unlock_irqrestore(&priv->lock, flags);
1452}
1453
1454/*************************************************************************
1455 * Linux Driver Model
1456 *************************************************************************/
1457
1458/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001459 * emac_devioctl - EMAC adapter ioctl
Anant Golea6286ee2009-05-18 15:19:01 -07001460 * @ndev: The DaVinci EMAC network adapter
1461 * @ifrq: request parameter
1462 * @cmd: command parameter
1463 *
1464 * EMAC driver ioctl function
1465 *
1466 * Returns success(0) or appropriate error code
1467 */
1468static int emac_devioctl(struct net_device *ndev, struct ifreq *ifrq, int cmd)
1469{
Anant Golea6286ee2009-05-18 15:19:01 -07001470 if (!(netif_running(ndev)))
1471 return -EINVAL;
1472
1473 /* TODO: Add phy read and write and private statistics get feature */
1474
Philippe Reynesc3321772016-07-02 00:02:34 +02001475 if (ndev->phydev)
1476 return phy_mii_ioctl(ndev->phydev, ifrq, cmd);
Neil Armstrong62522ef2016-04-25 19:41:38 +02001477 else
1478 return -EOPNOTSUPP;
Anant Golea6286ee2009-05-18 15:19:01 -07001479}
1480
Cyril Chemparathy5d69e002010-09-15 10:11:24 -04001481static int match_first_device(struct device *dev, void *data)
1482{
Anatolij Gustschin1ab8be42012-04-23 12:06:43 +00001483 return !strncmp(dev_name(dev), "davinci_mdio", 12);
Cyril Chemparathy5d69e002010-09-15 10:11:24 -04001484}
1485
Anant Golea6286ee2009-05-18 15:19:01 -07001486/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001487 * emac_dev_open - EMAC device open
Anant Golea6286ee2009-05-18 15:19:01 -07001488 * @ndev: The DaVinci EMAC network adapter
1489 *
1490 * Called when system wants to start the interface. We init TX/RX channels
1491 * and enable the hardware for packet reception/transmission and start the
1492 * network queue.
1493 *
1494 * Returns 0 for a successful open, or appropriate error code
1495 */
1496static int emac_dev_open(struct net_device *ndev)
1497{
1498 struct device *emac_dev = &ndev->dev;
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001499 u32 cnt;
Anant Golea6286ee2009-05-18 15:19:01 -07001500 struct resource *res;
Christian Riesch33b71072014-03-24 13:46:26 +01001501 int q, m, ret;
Christian Rieschcd11cf52014-03-24 13:46:27 +01001502 int res_num = 0, irq_num = 0;
Anant Golea6286ee2009-05-18 15:19:01 -07001503 int i = 0;
Anant Golea6286ee2009-05-18 15:19:01 -07001504 struct emac_priv *priv = netdev_priv(ndev);
Philippe Reynesc3321772016-07-02 00:02:34 +02001505 struct phy_device *phydev = NULL;
Anant Golea6286ee2009-05-18 15:19:01 -07001506
Tony Lindgrenb5133e72015-01-15 14:45:10 -08001507 ret = pm_runtime_get_sync(&priv->pdev->dev);
1508 if (ret < 0) {
1509 pm_runtime_put_noidle(&priv->pdev->dev);
1510 dev_err(&priv->pdev->dev, "%s: failed to get_sync(%d)\n",
1511 __func__, ret);
1512 return ret;
1513 }
Mark A. Greer3ba97382012-07-20 15:19:22 +00001514
Anant Golea6286ee2009-05-18 15:19:01 -07001515 netif_carrier_off(ndev);
Dan Carpenter4d27b872010-03-02 21:07:24 +00001516 for (cnt = 0; cnt < ETH_ALEN; cnt++)
Anant Golea6286ee2009-05-18 15:19:01 -07001517 ndev->dev_addr[cnt] = priv->mac_addr[cnt];
1518
1519 /* Configuration items */
1520 priv->rx_buf_size = EMAC_DEF_MAX_FRAME_SIZE + NET_IP_ALIGN;
1521
Anant Golea6286ee2009-05-18 15:19:01 -07001522 priv->mac_hash1 = 0;
1523 priv->mac_hash2 = 0;
1524 emac_write(EMAC_MACHASH1, 0);
1525 emac_write(EMAC_MACHASH2, 0);
1526
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001527 for (i = 0; i < EMAC_DEF_RX_NUM_DESC; i++) {
1528 struct sk_buff *skb = emac_rx_alloc(priv);
1529
1530 if (!skb)
1531 break;
1532
1533 ret = cpdma_chan_submit(priv->rxchan, skb, skb->data,
Sebastian Siewioraef614e2013-04-23 07:31:38 +00001534 skb_tailroom(skb), 0);
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001535 if (WARN_ON(ret < 0))
1536 break;
Anant Golea6286ee2009-05-18 15:19:01 -07001537 }
1538
1539 /* Request IRQ */
Christian Rieschcd11cf52014-03-24 13:46:27 +01001540 while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ,
1541 res_num))) {
1542 for (irq_num = res->start; irq_num <= res->end; irq_num++) {
Christian Rieschcd11cf52014-03-24 13:46:27 +01001543 if (request_irq(irq_num, emac_irq, 0, ndev->name,
1544 ndev)) {
1545 dev_err(emac_dev,
1546 "DaVinci EMAC: request_irq() failed\n");
1547 ret = -EBUSY;
Anant Golea6286ee2009-05-18 15:19:01 -07001548
Anant Golea6286ee2009-05-18 15:19:01 -07001549 goto rollback;
Christian Rieschcd11cf52014-03-24 13:46:27 +01001550 }
Anant Golea6286ee2009-05-18 15:19:01 -07001551 }
Christian Rieschcd11cf52014-03-24 13:46:27 +01001552 res_num++;
Anant Golea6286ee2009-05-18 15:19:01 -07001553 }
Christian Rieschcd11cf52014-03-24 13:46:27 +01001554 /* prepare counters for rollback in case of an error */
1555 res_num--;
1556 irq_num--;
Anant Golea6286ee2009-05-18 15:19:01 -07001557
1558 /* Start/Enable EMAC hardware */
1559 emac_hw_enable(priv);
1560
Sriram84da2652010-07-29 02:33:58 +00001561 /* Enable Interrupt pacing if configured */
1562 if (priv->coal_intvl != 0) {
1563 struct ethtool_coalesce coal;
1564
1565 coal.rx_coalesce_usecs = (priv->coal_intvl << 4);
1566 emac_set_coalesce(ndev, &coal);
1567 }
1568
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001569 cpdma_ctlr_start(priv->dma);
1570
Tony Lindgren1d82ffa2015-01-15 14:45:12 -08001571 if (priv->phy_node) {
Philippe Reynesc3321772016-07-02 00:02:34 +02001572 phydev = of_phy_connect(ndev, priv->phy_node,
1573 &emac_adjust_link, 0, 0);
1574 if (!phydev) {
Tony Lindgren1d82ffa2015-01-15 14:45:12 -08001575 dev_err(emac_dev, "could not connect to phy %s\n",
1576 priv->phy_node->full_name);
1577 ret = -ENODEV;
1578 goto err;
1579 }
1580 }
1581
Cyril Chemparathy5d69e002010-09-15 10:11:24 -04001582 /* use the first phy on the bus if pdata did not give us a phy id */
Philippe Reynesc3321772016-07-02 00:02:34 +02001583 if (!phydev && !priv->phy_id) {
Cyril Chemparathy5d69e002010-09-15 10:11:24 -04001584 struct device *phy;
Anant Golea6286ee2009-05-18 15:19:01 -07001585
Cyril Chemparathy5d69e002010-09-15 10:11:24 -04001586 phy = bus_find_device(&mdio_bus_type, NULL, NULL,
1587 match_first_device);
1588 if (phy)
1589 priv->phy_id = dev_name(phy);
1590 }
Anant Golea6286ee2009-05-18 15:19:01 -07001591
Philippe Reynesc3321772016-07-02 00:02:34 +02001592 if (!phydev && priv->phy_id && *priv->phy_id) {
1593 phydev = phy_connect(ndev, priv->phy_id,
1594 &emac_adjust_link,
1595 PHY_INTERFACE_MODE_MII);
Anant Golea6286ee2009-05-18 15:19:01 -07001596
Philippe Reynesc3321772016-07-02 00:02:34 +02001597 if (IS_ERR(phydev)) {
Cyril Chemparathy5d69e002010-09-15 10:11:24 -04001598 dev_err(emac_dev, "could not connect to phy %s\n",
1599 priv->phy_id);
Philippe Reynesc3321772016-07-02 00:02:34 +02001600 ret = PTR_ERR(phydev);
Mark A. Greer3ba97382012-07-20 15:19:22 +00001601 goto err;
Anant Golea6286ee2009-05-18 15:19:01 -07001602 }
1603
1604 priv->link = 0;
1605 priv->speed = 0;
1606 priv->duplex = ~0;
1607
Philippe Reynesc3321772016-07-02 00:02:34 +02001608 phy_attached_info(phydev);
Tony Lindgren1d82ffa2015-01-15 14:45:12 -08001609 }
1610
Philippe Reynesc3321772016-07-02 00:02:34 +02001611 if (!phydev) {
Anant Golea6286ee2009-05-18 15:19:01 -07001612 /* No PHY , fix the link, speed and duplex settings */
Cyril Chemparathy5d69e002010-09-15 10:11:24 -04001613 dev_notice(emac_dev, "no phy, defaulting to 100/full\n");
Anant Golea6286ee2009-05-18 15:19:01 -07001614 priv->link = 1;
1615 priv->speed = SPEED_100;
1616 priv->duplex = DUPLEX_FULL;
1617 emac_update_phystatus(priv);
1618 }
1619
1620 if (!netif_running(ndev)) /* debug only - to avoid compiler warning */
1621 emac_dump_regs(priv);
1622
1623 if (netif_msg_drv(priv))
1624 dev_notice(emac_dev, "DaVinci EMAC: Opened %s\n", ndev->name);
1625
Philippe Reynesc3321772016-07-02 00:02:34 +02001626 if (phydev)
1627 phy_start(phydev);
Anant Golea6286ee2009-05-18 15:19:01 -07001628
1629 return 0;
1630
Mark A. Greer3ba97382012-07-20 15:19:22 +00001631err:
Christian Rieschcd11cf52014-03-24 13:46:27 +01001632 emac_int_disable(priv);
1633 napi_disable(&priv->napi);
1634
1635rollback:
1636 for (q = res_num; q >= 0; q--) {
1637 res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, q);
1638 /* at the first iteration, irq_num is already set to the
1639 * right value
1640 */
1641 if (q != res_num)
1642 irq_num = res->end;
1643
1644 for (m = irq_num; m >= res->start; m--)
1645 free_irq(m, ndev);
1646 }
1647 cpdma_ctlr_stop(priv->dma);
Mark A. Greer3ba97382012-07-20 15:19:22 +00001648 pm_runtime_put(&priv->pdev->dev);
1649 return ret;
Anant Golea6286ee2009-05-18 15:19:01 -07001650}
1651
1652/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001653 * emac_dev_stop - EMAC device stop
Anant Golea6286ee2009-05-18 15:19:01 -07001654 * @ndev: The DaVinci EMAC network adapter
1655 *
1656 * Called when system wants to stop or down the interface. We stop the network
1657 * queue, disable interrupts and cleanup TX/RX channels.
1658 *
1659 * We return the statistics in net_device_stats structure pulled from emac
1660 */
1661static int emac_dev_stop(struct net_device *ndev)
1662{
Christian Riesch33b71072014-03-24 13:46:26 +01001663 struct resource *res;
1664 int i = 0;
1665 int irq_num;
Anant Golea6286ee2009-05-18 15:19:01 -07001666 struct emac_priv *priv = netdev_priv(ndev);
1667 struct device *emac_dev = &ndev->dev;
1668
1669 /* inform the upper layers. */
1670 netif_stop_queue(ndev);
1671 napi_disable(&priv->napi);
1672
1673 netif_carrier_off(ndev);
1674 emac_int_disable(priv);
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001675 cpdma_ctlr_stop(priv->dma);
Anant Golea6286ee2009-05-18 15:19:01 -07001676 emac_write(EMAC_SOFTRESET, 1);
1677
Philippe Reynesc3321772016-07-02 00:02:34 +02001678 if (ndev->phydev)
1679 phy_disconnect(ndev->phydev);
Anant Golea6286ee2009-05-18 15:19:01 -07001680
Christian Riesch33b71072014-03-24 13:46:26 +01001681 /* Free IRQ */
1682 while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, i))) {
1683 for (irq_num = res->start; irq_num <= res->end; irq_num++)
1684 free_irq(irq_num, priv->ndev);
1685 i++;
1686 }
1687
Anant Golea6286ee2009-05-18 15:19:01 -07001688 if (netif_msg_drv(priv))
1689 dev_notice(emac_dev, "DaVinci EMAC: %s stopped\n", ndev->name);
1690
Mark A. Greer3ba97382012-07-20 15:19:22 +00001691 pm_runtime_put(&priv->pdev->dev);
Anant Golea6286ee2009-05-18 15:19:01 -07001692 return 0;
1693}
1694
1695/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001696 * emac_dev_getnetstats - EMAC get statistics function
Anant Golea6286ee2009-05-18 15:19:01 -07001697 * @ndev: The DaVinci EMAC network adapter
1698 *
1699 * Called when system wants to get statistics from the device.
1700 *
1701 * We return the statistics in net_device_stats structure pulled from emac
1702 */
1703static struct net_device_stats *emac_dev_getnetstats(struct net_device *ndev)
1704{
1705 struct emac_priv *priv = netdev_priv(ndev);
Sriram0fe74632009-10-07 02:44:30 +00001706 u32 mac_control;
1707 u32 stats_clear_mask;
Tony Lindgrenb5133e72015-01-15 14:45:10 -08001708 int err;
1709
1710 err = pm_runtime_get_sync(&priv->pdev->dev);
1711 if (err < 0) {
1712 pm_runtime_put_noidle(&priv->pdev->dev);
1713 dev_err(&priv->pdev->dev, "%s: failed to get_sync(%d)\n",
1714 __func__, err);
1715 return &ndev->stats;
1716 }
Anant Golea6286ee2009-05-18 15:19:01 -07001717
1718 /* update emac hardware stats and reset the registers*/
1719
Sriram0fe74632009-10-07 02:44:30 +00001720 mac_control = emac_read(EMAC_MACCONTROL);
1721
1722 if (mac_control & EMAC_MACCONTROL_GMIIEN)
1723 stats_clear_mask = EMAC_STATS_CLR_MASK;
1724 else
1725 stats_clear_mask = 0;
1726
Kulikov Vasiliy78e8c532010-07-05 02:13:26 +00001727 ndev->stats.multicast += emac_read(EMAC_RXMCASTFRAMES);
Sriram0fe74632009-10-07 02:44:30 +00001728 emac_write(EMAC_RXMCASTFRAMES, stats_clear_mask);
Anant Golea6286ee2009-05-18 15:19:01 -07001729
Kulikov Vasiliy78e8c532010-07-05 02:13:26 +00001730 ndev->stats.collisions += (emac_read(EMAC_TXCOLLISION) +
Anant Golea6286ee2009-05-18 15:19:01 -07001731 emac_read(EMAC_TXSINGLECOLL) +
1732 emac_read(EMAC_TXMULTICOLL));
Sriram0fe74632009-10-07 02:44:30 +00001733 emac_write(EMAC_TXCOLLISION, stats_clear_mask);
1734 emac_write(EMAC_TXSINGLECOLL, stats_clear_mask);
1735 emac_write(EMAC_TXMULTICOLL, stats_clear_mask);
Anant Golea6286ee2009-05-18 15:19:01 -07001736
Kulikov Vasiliy78e8c532010-07-05 02:13:26 +00001737 ndev->stats.rx_length_errors += (emac_read(EMAC_RXOVERSIZED) +
Anant Golea6286ee2009-05-18 15:19:01 -07001738 emac_read(EMAC_RXJABBER) +
1739 emac_read(EMAC_RXUNDERSIZED));
Sriram0fe74632009-10-07 02:44:30 +00001740 emac_write(EMAC_RXOVERSIZED, stats_clear_mask);
1741 emac_write(EMAC_RXJABBER, stats_clear_mask);
1742 emac_write(EMAC_RXUNDERSIZED, stats_clear_mask);
Anant Golea6286ee2009-05-18 15:19:01 -07001743
Kulikov Vasiliy78e8c532010-07-05 02:13:26 +00001744 ndev->stats.rx_over_errors += (emac_read(EMAC_RXSOFOVERRUNS) +
Anant Golea6286ee2009-05-18 15:19:01 -07001745 emac_read(EMAC_RXMOFOVERRUNS));
Sriram0fe74632009-10-07 02:44:30 +00001746 emac_write(EMAC_RXSOFOVERRUNS, stats_clear_mask);
1747 emac_write(EMAC_RXMOFOVERRUNS, stats_clear_mask);
Anant Golea6286ee2009-05-18 15:19:01 -07001748
Kulikov Vasiliy78e8c532010-07-05 02:13:26 +00001749 ndev->stats.rx_fifo_errors += emac_read(EMAC_RXDMAOVERRUNS);
Sriram0fe74632009-10-07 02:44:30 +00001750 emac_write(EMAC_RXDMAOVERRUNS, stats_clear_mask);
Anant Golea6286ee2009-05-18 15:19:01 -07001751
Kulikov Vasiliy78e8c532010-07-05 02:13:26 +00001752 ndev->stats.tx_carrier_errors +=
Anant Golea6286ee2009-05-18 15:19:01 -07001753 emac_read(EMAC_TXCARRIERSENSE);
Sriram0fe74632009-10-07 02:44:30 +00001754 emac_write(EMAC_TXCARRIERSENSE, stats_clear_mask);
Anant Golea6286ee2009-05-18 15:19:01 -07001755
Thomas Lange60aeba22011-03-09 04:41:16 +00001756 ndev->stats.tx_fifo_errors += emac_read(EMAC_TXUNDERRUN);
Sriram0fe74632009-10-07 02:44:30 +00001757 emac_write(EMAC_TXUNDERRUN, stats_clear_mask);
Anant Golea6286ee2009-05-18 15:19:01 -07001758
Tony Lindgrenb5133e72015-01-15 14:45:10 -08001759 pm_runtime_put(&priv->pdev->dev);
1760
Kulikov Vasiliy78e8c532010-07-05 02:13:26 +00001761 return &ndev->stats;
Anant Golea6286ee2009-05-18 15:19:01 -07001762}
1763
1764static const struct net_device_ops emac_netdev_ops = {
1765 .ndo_open = emac_dev_open,
1766 .ndo_stop = emac_dev_stop,
1767 .ndo_start_xmit = emac_dev_xmit,
Jiri Pirkoafc4b132011-08-16 06:29:01 +00001768 .ndo_set_rx_mode = emac_dev_mcast_set,
Anant Golea6286ee2009-05-18 15:19:01 -07001769 .ndo_set_mac_address = emac_dev_setmac_addr,
1770 .ndo_do_ioctl = emac_devioctl,
1771 .ndo_tx_timeout = emac_dev_tx_timeout,
1772 .ndo_get_stats = emac_dev_getnetstats,
1773#ifdef CONFIG_NET_POLL_CONTROLLER
1774 .ndo_poll_controller = emac_poll_controller,
1775#endif
1776};
1777
Tony Lindgrendd0df472013-12-03 15:13:02 -08001778static const struct of_device_id davinci_emac_of_match[];
1779
Lad, Prabhakar151328c2013-06-25 21:24:52 +05301780static struct emac_platform_data *
1781davinci_emac_of_get_pdata(struct platform_device *pdev, struct emac_priv *priv)
Heiko Schocher42f59962012-07-17 00:34:24 +00001782{
1783 struct device_node *np;
Tony Lindgrendd0df472013-12-03 15:13:02 -08001784 const struct of_device_id *match;
1785 const struct emac_platform_data *auxdata;
Heiko Schocher42f59962012-07-17 00:34:24 +00001786 struct emac_platform_data *pdata = NULL;
1787 const u8 *mac_addr;
Heiko Schocher42f59962012-07-17 00:34:24 +00001788
Lad, Prabhakar151328c2013-06-25 21:24:52 +05301789 if (!IS_ENABLED(CONFIG_OF) || !pdev->dev.of_node)
Jingoo Han20e6f332013-08-30 12:29:57 +09001790 return dev_get_platdata(&pdev->dev);
Lad, Prabhakar151328c2013-06-25 21:24:52 +05301791
1792 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
1793 if (!pdata)
1794 return NULL;
Heiko Schocher42f59962012-07-17 00:34:24 +00001795
1796 np = pdev->dev.of_node;
Lad, Prabhakar151328c2013-06-25 21:24:52 +05301797 pdata->version = EMAC_VERSION_2;
Heiko Schocher42f59962012-07-17 00:34:24 +00001798
1799 if (!is_valid_ether_addr(pdata->mac_addr)) {
1800 mac_addr = of_get_mac_address(np);
1801 if (mac_addr)
Tony Lindgren9120bd6e2015-01-28 11:33:05 -08001802 ether_addr_copy(pdata->mac_addr, mac_addr);
Heiko Schocher42f59962012-07-17 00:34:24 +00001803 }
1804
Lad, Prabhakar151328c2013-06-25 21:24:52 +05301805 of_property_read_u32(np, "ti,davinci-ctrl-reg-offset",
1806 &pdata->ctrl_reg_offset);
Heiko Schocher42f59962012-07-17 00:34:24 +00001807
Lad, Prabhakar151328c2013-06-25 21:24:52 +05301808 of_property_read_u32(np, "ti,davinci-ctrl-mod-reg-offset",
1809 &pdata->ctrl_mod_reg_offset);
Heiko Schocher42f59962012-07-17 00:34:24 +00001810
Lad, Prabhakar151328c2013-06-25 21:24:52 +05301811 of_property_read_u32(np, "ti,davinci-ctrl-ram-offset",
1812 &pdata->ctrl_ram_offset);
Heiko Schocher42f59962012-07-17 00:34:24 +00001813
Lad, Prabhakar151328c2013-06-25 21:24:52 +05301814 of_property_read_u32(np, "ti,davinci-ctrl-ram-size",
1815 &pdata->ctrl_ram_size);
Heiko Schocher42f59962012-07-17 00:34:24 +00001816
Lad, Prabhakar151328c2013-06-25 21:24:52 +05301817 of_property_read_u8(np, "ti,davinci-rmii-en", &pdata->rmii_en);
Heiko Schocher42f59962012-07-17 00:34:24 +00001818
Lad, Prabhakar151328c2013-06-25 21:24:52 +05301819 pdata->no_bd_ram = of_property_read_bool(np, "ti,davinci-no-bd-ram");
Heiko Schocher42f59962012-07-17 00:34:24 +00001820
1821 priv->phy_node = of_parse_phandle(np, "phy-handle", 0);
Neil Armstrong1bb6aa52015-09-22 10:57:04 +02001822 if (!priv->phy_node) {
1823 if (!of_phy_is_fixed_link(np))
1824 pdata->phy_id = NULL;
1825 else if (of_phy_register_fixed_link(np) >= 0)
1826 priv->phy_node = of_node_get(np);
1827 }
Tony Lindgrendd0df472013-12-03 15:13:02 -08001828
1829 auxdata = pdev->dev.platform_data;
1830 if (auxdata) {
1831 pdata->interrupt_enable = auxdata->interrupt_enable;
1832 pdata->interrupt_disable = auxdata->interrupt_disable;
1833 }
1834
1835 match = of_match_device(davinci_emac_of_match, &pdev->dev);
1836 if (match && match->data) {
1837 auxdata = match->data;
1838 pdata->version = auxdata->version;
1839 pdata->hw_ram_addr = auxdata->hw_ram_addr;
1840 }
Heiko Schocher42f59962012-07-17 00:34:24 +00001841
Heiko Schocher42f59962012-07-17 00:34:24 +00001842 return pdata;
1843}
Lad, Prabhakar151328c2013-06-25 21:24:52 +05301844
Tony Lindgren9120bd6e2015-01-28 11:33:05 -08001845static int davinci_emac_try_get_mac(struct platform_device *pdev,
1846 int instance, u8 *mac_addr)
1847{
Tony Lindgren9120bd6e2015-01-28 11:33:05 -08001848 if (!pdev->dev.of_node)
Mugunthan V Nb6745f62015-09-21 15:56:50 +05301849 return -EINVAL;
Tony Lindgren9120bd6e2015-01-28 11:33:05 -08001850
Mugunthan V Nb6745f62015-09-21 15:56:50 +05301851 return ti_cm_get_macid(&pdev->dev, instance, mac_addr);
Tony Lindgren9120bd6e2015-01-28 11:33:05 -08001852}
1853
Anant Golea6286ee2009-05-18 15:19:01 -07001854/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00001855 * davinci_emac_probe - EMAC device probe
Anant Golea6286ee2009-05-18 15:19:01 -07001856 * @pdev: The DaVinci EMAC device that we are removing
1857 *
1858 * Called when probing for emac devicesr. We get details of instances and
1859 * resource information from platform init and register a network device
1860 * and allocate resources necessary for driver to perform
1861 */
Bill Pembertone38921d2012-12-03 09:24:03 -05001862static int davinci_emac_probe(struct platform_device *pdev)
Anant Golea6286ee2009-05-18 15:19:01 -07001863{
1864 int rc = 0;
Tony Lindgrena1594322015-01-15 14:45:13 -08001865 struct resource *res, *res_ctrl;
Anant Golea6286ee2009-05-18 15:19:01 -07001866 struct net_device *ndev;
1867 struct emac_priv *priv;
Lad, Prabhakar6892b412013-06-25 21:24:51 +05301868 unsigned long hw_ram_addr;
Anant Golea6286ee2009-05-18 15:19:01 -07001869 struct emac_platform_data *pdata;
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001870 struct cpdma_params dma_params;
Mark A. Greer3ba97382012-07-20 15:19:22 +00001871 struct clk *emac_clk;
1872 unsigned long emac_bus_frequency;
1873
Anant Golea6286ee2009-05-18 15:19:01 -07001874
1875 /* obtain emac clock from kernel */
Sekhar Norib8092862013-03-24 23:25:46 +00001876 emac_clk = devm_clk_get(&pdev->dev, NULL);
Anant Golea6286ee2009-05-18 15:19:01 -07001877 if (IS_ERR(emac_clk)) {
Johan Hovold240b2622011-05-26 04:37:32 +00001878 dev_err(&pdev->dev, "failed to get EMAC clock\n");
Anant Golea6286ee2009-05-18 15:19:01 -07001879 return -EBUSY;
1880 }
1881 emac_bus_frequency = clk_get_rate(emac_clk);
Tony Lindgren0f537272015-01-15 14:45:11 -08001882 devm_clk_put(&pdev->dev, emac_clk);
Mark A. Greer3ba97382012-07-20 15:19:22 +00001883
Anant Golea6286ee2009-05-18 15:19:01 -07001884 /* TODO: Probe PHY here if possible */
1885
1886 ndev = alloc_etherdev(sizeof(struct emac_priv));
Sekhar Norib8092862013-03-24 23:25:46 +00001887 if (!ndev)
1888 return -ENOMEM;
Anant Golea6286ee2009-05-18 15:19:01 -07001889
1890 platform_set_drvdata(pdev, ndev);
1891 priv = netdev_priv(ndev);
1892 priv->pdev = pdev;
1893 priv->ndev = ndev;
1894 priv->msg_enable = netif_msg_init(debug_level, DAVINCI_EMAC_DEBUG);
1895
Anant Golea6286ee2009-05-18 15:19:01 -07001896 spin_lock_init(&priv->lock);
1897
Heiko Schocher42f59962012-07-17 00:34:24 +00001898 pdata = davinci_emac_of_get_pdata(pdev, priv);
Anant Golea6286ee2009-05-18 15:19:01 -07001899 if (!pdata) {
Johan Hovold240b2622011-05-26 04:37:32 +00001900 dev_err(&pdev->dev, "no platform data\n");
Julia Lawallb722dbf2011-06-01 07:10:10 +00001901 rc = -ENODEV;
Sekhar Norib8092862013-03-24 23:25:46 +00001902 goto no_pdata;
Anant Golea6286ee2009-05-18 15:19:01 -07001903 }
1904
1905 /* MAC addr and PHY mask , RMII enable info from platform_data */
Joe Perchesd458cdf2013-10-01 19:04:40 -07001906 memcpy(priv->mac_addr, pdata->mac_addr, ETH_ALEN);
Cyril Chemparathy5d69e002010-09-15 10:11:24 -04001907 priv->phy_id = pdata->phy_id;
Anant Golea6286ee2009-05-18 15:19:01 -07001908 priv->rmii_en = pdata->rmii_en;
1909 priv->version = pdata->version;
Sriramakrishnan01a9af32009-11-19 15:58:26 +05301910 priv->int_enable = pdata->interrupt_enable;
1911 priv->int_disable = pdata->interrupt_disable;
1912
Sriram84da2652010-07-29 02:33:58 +00001913 priv->coal_intvl = 0;
1914 priv->bus_freq_mhz = (u32)(emac_bus_frequency / 1000000);
1915
Anant Golea6286ee2009-05-18 15:19:01 -07001916 /* Get EMAC platform data */
1917 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
Anant Golea6286ee2009-05-18 15:19:01 -07001918 priv->emac_base_phys = res->start + pdata->ctrl_reg_offset;
Lad, Prabhakar6892b412013-06-25 21:24:51 +05301919 priv->remap_addr = devm_ioremap_resource(&pdev->dev, res);
1920 if (IS_ERR(priv->remap_addr)) {
Lad, Prabhakar6892b412013-06-25 21:24:51 +05301921 rc = PTR_ERR(priv->remap_addr);
Sekhar Norib8092862013-03-24 23:25:46 +00001922 goto no_pdata;
Anant Golea6286ee2009-05-18 15:19:01 -07001923 }
Tony Lindgrena1594322015-01-15 14:45:13 -08001924
1925 res_ctrl = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1926 if (res_ctrl) {
1927 priv->ctrl_base =
1928 devm_ioremap_resource(&pdev->dev, res_ctrl);
Julia Lawall1ef53eb2015-08-23 02:11:14 +02001929 if (IS_ERR(priv->ctrl_base)) {
1930 rc = PTR_ERR(priv->ctrl_base);
Tony Lindgrena1594322015-01-15 14:45:13 -08001931 goto no_pdata;
Julia Lawall1ef53eb2015-08-23 02:11:14 +02001932 }
Tony Lindgrena1594322015-01-15 14:45:13 -08001933 } else {
1934 priv->ctrl_base = priv->remap_addr + pdata->ctrl_mod_reg_offset;
1935 }
1936
Anant Golea6286ee2009-05-18 15:19:01 -07001937 priv->emac_base = priv->remap_addr + pdata->ctrl_reg_offset;
1938 ndev->base_addr = (unsigned long)priv->remap_addr;
1939
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001940 hw_ram_addr = pdata->hw_ram_addr;
1941 if (!hw_ram_addr)
1942 hw_ram_addr = (u32 __force)res->start + pdata->ctrl_ram_offset;
1943
1944 memset(&dma_params, 0, sizeof(dma_params));
Sekhar Nori68bc74f2014-05-20 15:41:37 +05301945 dma_params.dev = &pdev->dev;
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001946 dma_params.dmaregs = priv->emac_base;
1947 dma_params.rxthresh = priv->emac_base + 0x120;
1948 dma_params.rxfree = priv->emac_base + 0x140;
1949 dma_params.txhdp = priv->emac_base + 0x600;
1950 dma_params.rxhdp = priv->emac_base + 0x620;
1951 dma_params.txcp = priv->emac_base + 0x640;
1952 dma_params.rxcp = priv->emac_base + 0x660;
1953 dma_params.num_chan = EMAC_MAX_TXRX_CHANNELS;
1954 dma_params.min_packet_size = EMAC_DEF_MIN_ETHPKTSIZE;
Sriram6a1fef62011-03-22 02:31:03 +00001955 dma_params.desc_hw_addr = hw_ram_addr;
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001956 dma_params.desc_mem_size = pdata->ctrl_ram_size;
1957 dma_params.desc_align = 16;
1958
Sriram6a1fef62011-03-22 02:31:03 +00001959 dma_params.desc_mem_phys = pdata->no_bd_ram ? 0 :
1960 (u32 __force)res->start + pdata->ctrl_ram_offset;
1961
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001962 priv->dma = cpdma_ctlr_create(&dma_params);
1963 if (!priv->dma) {
Johan Hovold240b2622011-05-26 04:37:32 +00001964 dev_err(&pdev->dev, "error initializing DMA\n");
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001965 rc = -ENOMEM;
Sekhar Norib8092862013-03-24 23:25:46 +00001966 goto no_pdata;
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001967 }
1968
1969 priv->txchan = cpdma_chan_create(priv->dma, tx_chan_num(EMAC_DEF_TX_CH),
1970 emac_tx_handler);
1971 priv->rxchan = cpdma_chan_create(priv->dma, rx_chan_num(EMAC_DEF_RX_CH),
1972 emac_rx_handler);
1973 if (WARN_ON(!priv->txchan || !priv->rxchan)) {
1974 rc = -ENOMEM;
Sekhar Norib8092862013-03-24 23:25:46 +00001975 goto no_cpdma_chan;
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04001976 }
Sriramakrishnanad021ae2009-11-19 15:58:27 +05301977
Anant Golea6286ee2009-05-18 15:19:01 -07001978 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
1979 if (!res) {
Johan Hovold240b2622011-05-26 04:37:32 +00001980 dev_err(&pdev->dev, "error getting irq res\n");
Anant Golea6286ee2009-05-18 15:19:01 -07001981 rc = -ENOENT;
Sekhar Norib8092862013-03-24 23:25:46 +00001982 goto no_cpdma_chan;
Anant Golea6286ee2009-05-18 15:19:01 -07001983 }
1984 ndev->irq = res->start;
1985
Tony Lindgren9120bd6e2015-01-28 11:33:05 -08001986 rc = davinci_emac_try_get_mac(pdev, res_ctrl ? 0 : 1, priv->mac_addr);
1987 if (!rc)
1988 ether_addr_copy(ndev->dev_addr, priv->mac_addr);
1989
Anant Golea6286ee2009-05-18 15:19:01 -07001990 if (!is_valid_ether_addr(priv->mac_addr)) {
Anant Golea6286ee2009-05-18 15:19:01 -07001991 /* Use random MAC if none passed */
Danny Kukawkabaf1d372012-02-17 05:43:24 +00001992 eth_hw_addr_random(ndev);
1993 memcpy(priv->mac_addr, ndev->dev_addr, ndev->addr_len);
Johan Hovold240b2622011-05-26 04:37:32 +00001994 dev_warn(&pdev->dev, "using random MAC addr: %pM\n",
1995 priv->mac_addr);
Anant Golea6286ee2009-05-18 15:19:01 -07001996 }
1997
1998 ndev->netdev_ops = &emac_netdev_ops;
Wilfried Klaebe7ad24ea2014-05-11 00:12:32 +00001999 ndev->ethtool_ops = &ethtool_ops;
Anant Golea6286ee2009-05-18 15:19:01 -07002000 netif_napi_add(ndev, &priv->napi, emac_poll, EMAC_POLL_WEIGHT);
2001
Tony Lindgrenb5133e72015-01-15 14:45:10 -08002002 pm_runtime_enable(&pdev->dev);
2003 rc = pm_runtime_get_sync(&pdev->dev);
2004 if (rc < 0) {
2005 pm_runtime_put_noidle(&pdev->dev);
2006 dev_err(&pdev->dev, "%s: failed to get_sync(%d)\n",
2007 __func__, rc);
2008 goto no_cpdma_chan;
2009 }
2010
Anant Golea6286ee2009-05-18 15:19:01 -07002011 /* register the network device */
2012 SET_NETDEV_DEV(ndev, &pdev->dev);
2013 rc = register_netdev(ndev);
2014 if (rc) {
Johan Hovold240b2622011-05-26 04:37:32 +00002015 dev_err(&pdev->dev, "error in register_netdev\n");
Anant Golea6286ee2009-05-18 15:19:01 -07002016 rc = -ENODEV;
Tony Lindgrenb5133e72015-01-15 14:45:10 -08002017 pm_runtime_put(&pdev->dev);
Sekhar Norib8092862013-03-24 23:25:46 +00002018 goto no_cpdma_chan;
Anant Golea6286ee2009-05-18 15:19:01 -07002019 }
2020
Anant Golea6286ee2009-05-18 15:19:01 -07002021
Anant Golea6286ee2009-05-18 15:19:01 -07002022 if (netif_msg_probe(priv)) {
Sekhar Nori68bc74f2014-05-20 15:41:37 +05302023 dev_notice(&pdev->dev, "DaVinci EMAC Probe found device "
Anant Golea6286ee2009-05-18 15:19:01 -07002024 "(regs: %p, irq: %d)\n",
2025 (void *)priv->emac_base_phys, ndev->irq);
2026 }
Tony Lindgrenb5133e72015-01-15 14:45:10 -08002027 pm_runtime_put(&pdev->dev);
Mark A. Greer3ba97382012-07-20 15:19:22 +00002028
Anant Golea6286ee2009-05-18 15:19:01 -07002029 return 0;
2030
Sekhar Norib8092862013-03-24 23:25:46 +00002031no_cpdma_chan:
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04002032 if (priv->txchan)
2033 cpdma_chan_destroy(priv->txchan);
2034 if (priv->rxchan)
2035 cpdma_chan_destroy(priv->rxchan);
2036 cpdma_ctlr_destroy(priv->dma);
Sekhar Norib8092862013-03-24 23:25:46 +00002037no_pdata:
Anant Golea6286ee2009-05-18 15:19:01 -07002038 free_netdev(ndev);
2039 return rc;
2040}
2041
2042/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00002043 * davinci_emac_remove - EMAC device remove
Anant Golea6286ee2009-05-18 15:19:01 -07002044 * @pdev: The DaVinci EMAC device that we are removing
2045 *
2046 * Called when removing the device driver. We disable clock usage and release
2047 * the resources taken up by the driver and unregister network device
2048 */
Bill Pembertone38921d2012-12-03 09:24:03 -05002049static int davinci_emac_remove(struct platform_device *pdev)
Anant Golea6286ee2009-05-18 15:19:01 -07002050{
Anant Golea6286ee2009-05-18 15:19:01 -07002051 struct net_device *ndev = platform_get_drvdata(pdev);
2052 struct emac_priv *priv = netdev_priv(ndev);
2053
2054 dev_notice(&ndev->dev, "DaVinci EMAC: davinci_emac_remove()\n");
2055
Cyril Chemparathy3ef0fdb2010-09-15 10:11:29 -04002056 if (priv->txchan)
2057 cpdma_chan_destroy(priv->txchan);
2058 if (priv->rxchan)
2059 cpdma_chan_destroy(priv->rxchan);
2060 cpdma_ctlr_destroy(priv->dma);
2061
Anant Golea6286ee2009-05-18 15:19:01 -07002062 unregister_netdev(ndev);
Neil Armstrong99164f92016-04-20 10:56:13 +02002063 pm_runtime_disable(&pdev->dev);
Stefan Weil2a1bc0d2010-08-03 08:53:45 +00002064 free_netdev(ndev);
Anant Golea6286ee2009-05-18 15:19:01 -07002065
Anant Golea6286ee2009-05-18 15:19:01 -07002066 return 0;
2067}
2068
chaithrika@ti.comd4fdcd92010-03-10 22:37:56 +00002069static int davinci_emac_suspend(struct device *dev)
Ranjith Lohithakshan8d044fe2009-11-04 22:06:20 -08002070{
chaithrika@ti.comd4fdcd92010-03-10 22:37:56 +00002071 struct platform_device *pdev = to_platform_device(dev);
2072 struct net_device *ndev = platform_get_drvdata(pdev);
Ranjith Lohithakshan8d044fe2009-11-04 22:06:20 -08002073
chaithrika@ti.comd4fdcd92010-03-10 22:37:56 +00002074 if (netif_running(ndev))
2075 emac_dev_stop(ndev);
Ranjith Lohithakshan8d044fe2009-11-04 22:06:20 -08002076
Ranjith Lohithakshan8d044fe2009-11-04 22:06:20 -08002077 return 0;
2078}
2079
chaithrika@ti.comd4fdcd92010-03-10 22:37:56 +00002080static int davinci_emac_resume(struct device *dev)
Ranjith Lohithakshan8d044fe2009-11-04 22:06:20 -08002081{
chaithrika@ti.comd4fdcd92010-03-10 22:37:56 +00002082 struct platform_device *pdev = to_platform_device(dev);
2083 struct net_device *ndev = platform_get_drvdata(pdev);
Ranjith Lohithakshan8d044fe2009-11-04 22:06:20 -08002084
chaithrika@ti.comd4fdcd92010-03-10 22:37:56 +00002085 if (netif_running(ndev))
2086 emac_dev_open(ndev);
Ranjith Lohithakshan8d044fe2009-11-04 22:06:20 -08002087
2088 return 0;
2089}
2090
chaithrika@ti.comd4fdcd92010-03-10 22:37:56 +00002091static const struct dev_pm_ops davinci_emac_pm_ops = {
2092 .suspend = davinci_emac_suspend,
2093 .resume = davinci_emac_resume,
2094};
2095
Lad, Prabhakar151328c2013-06-25 21:24:52 +05302096#if IS_ENABLED(CONFIG_OF)
Tony Lindgrendd0df472013-12-03 15:13:02 -08002097static const struct emac_platform_data am3517_emac_data = {
2098 .version = EMAC_VERSION_2,
2099 .hw_ram_addr = 0x01e20000,
2100};
2101
Tony Lindgrende390082015-01-15 14:45:14 -08002102static const struct emac_platform_data dm816_emac_data = {
2103 .version = EMAC_VERSION_2,
2104};
2105
Heiko Schocher42f59962012-07-17 00:34:24 +00002106static const struct of_device_id davinci_emac_of_match[] = {
2107 {.compatible = "ti,davinci-dm6467-emac", },
Tony Lindgrendd0df472013-12-03 15:13:02 -08002108 {.compatible = "ti,am3517-emac", .data = &am3517_emac_data, },
Tony Lindgrende390082015-01-15 14:45:14 -08002109 {.compatible = "ti,dm816-emac", .data = &dm816_emac_data, },
Heiko Schocher42f59962012-07-17 00:34:24 +00002110 {},
2111};
2112MODULE_DEVICE_TABLE(of, davinci_emac_of_match);
Lad, Prabhakar151328c2013-06-25 21:24:52 +05302113#endif
Heiko Schocher42f59962012-07-17 00:34:24 +00002114
Ben Hutchings1aa8b472012-07-10 10:56:59 +00002115/* davinci_emac_driver: EMAC platform driver structure */
Anant Golea6286ee2009-05-18 15:19:01 -07002116static struct platform_driver davinci_emac_driver = {
2117 .driver = {
2118 .name = "davinci_emac",
chaithrika@ti.comd4fdcd92010-03-10 22:37:56 +00002119 .pm = &davinci_emac_pm_ops,
Heiko Schocher42f59962012-07-17 00:34:24 +00002120 .of_match_table = of_match_ptr(davinci_emac_of_match),
Anant Golea6286ee2009-05-18 15:19:01 -07002121 },
2122 .probe = davinci_emac_probe,
Bill Pembertone38921d2012-12-03 09:24:03 -05002123 .remove = davinci_emac_remove,
Anant Golea6286ee2009-05-18 15:19:01 -07002124};
2125
2126/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00002127 * davinci_emac_init - EMAC driver module init
Anant Golea6286ee2009-05-18 15:19:01 -07002128 *
2129 * Called when initializing the driver. We register the driver with
2130 * the platform.
2131 */
2132static int __init davinci_emac_init(void)
2133{
2134 return platform_driver_register(&davinci_emac_driver);
2135}
Rajashekhara, Sudhakar2db95172009-08-19 10:39:55 +00002136late_initcall(davinci_emac_init);
Anant Golea6286ee2009-05-18 15:19:01 -07002137
2138/**
Ben Hutchings49ce9c22012-07-10 10:56:00 +00002139 * davinci_emac_exit - EMAC driver module exit
Anant Golea6286ee2009-05-18 15:19:01 -07002140 *
2141 * Called when exiting the driver completely. We unregister the driver with
2142 * the platform and exit
2143 */
2144static void __exit davinci_emac_exit(void)
2145{
2146 platform_driver_unregister(&davinci_emac_driver);
2147}
2148module_exit(davinci_emac_exit);
2149
2150MODULE_LICENSE("GPL");
2151MODULE_AUTHOR("DaVinci EMAC Maintainer: Anant Gole <anantgole@ti.com>");
2152MODULE_AUTHOR("DaVinci EMAC Maintainer: Chaithrika U S <chaithrika@ti.com>");
2153MODULE_DESCRIPTION("DaVinci EMAC Ethernet driver");