• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * This file is based on code from OCTEON SDK by Cavium Networks.
3  *
4  * Copyright (c) 2003-2007 Cavium Networks
5  *
6  * This file is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License, Version 2, as
8  * published by the Free Software Foundation.
9  */
10 
11 #include <linux/platform_device.h>
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/netdevice.h>
15 #include <linux/etherdevice.h>
16 #include <linux/phy.h>
17 #include <linux/slab.h>
18 #include <linux/interrupt.h>
19 #include <linux/of_net.h>
20 
21 #include <net/dst.h>
22 
23 #include <asm/octeon/octeon.h>
24 
25 #include "ethernet-defines.h"
26 #include "octeon-ethernet.h"
27 #include "ethernet-mem.h"
28 #include "ethernet-rx.h"
29 #include "ethernet-tx.h"
30 #include "ethernet-mdio.h"
31 #include "ethernet-util.h"
32 
33 #include <asm/octeon/cvmx-pip.h>
34 #include <asm/octeon/cvmx-pko.h>
35 #include <asm/octeon/cvmx-fau.h>
36 #include <asm/octeon/cvmx-ipd.h>
37 #include <asm/octeon/cvmx-helper.h>
38 
39 #include <asm/octeon/cvmx-gmxx-defs.h>
40 #include <asm/octeon/cvmx-smix-defs.h>
41 
42 static int num_packet_buffers = 1024;
43 module_param(num_packet_buffers, int, 0444);
44 MODULE_PARM_DESC(num_packet_buffers, "\n"
45 	"\tNumber of packet buffers to allocate and store in the\n"
46 	"\tFPA. By default, 1024 packet buffers are used.\n");
47 
48 int pow_receive_group = 15;
49 module_param(pow_receive_group, int, 0444);
50 MODULE_PARM_DESC(pow_receive_group, "\n"
51 	"\tPOW group to receive packets from. All ethernet hardware\n"
52 	"\twill be configured to send incoming packets to this POW\n"
53 	"\tgroup. Also any other software can submit packets to this\n"
54 	"\tgroup for the kernel to process.");
55 
56 int pow_send_group = -1;
57 module_param(pow_send_group, int, 0644);
58 MODULE_PARM_DESC(pow_send_group, "\n"
59 	"\tPOW group to send packets to other software on. This\n"
60 	"\tcontrols the creation of the virtual device pow0.\n"
61 	"\talways_use_pow also depends on this value.");
62 
63 int always_use_pow;
64 module_param(always_use_pow, int, 0444);
65 MODULE_PARM_DESC(always_use_pow, "\n"
66 	"\tWhen set, always send to the pow group. This will cause\n"
67 	"\tpackets sent to real ethernet devices to be sent to the\n"
68 	"\tPOW group instead of the hardware. Unless some other\n"
69 	"\tapplication changes the config, packets will still be\n"
70 	"\treceived from the low level hardware. Use this option\n"
71 	"\tto allow a CVMX app to intercept all packets from the\n"
72 	"\tlinux kernel. You must specify pow_send_group along with\n"
73 	"\tthis option.");
74 
75 char pow_send_list[128] = "";
76 module_param_string(pow_send_list, pow_send_list, sizeof(pow_send_list), 0444);
77 MODULE_PARM_DESC(pow_send_list, "\n"
78 	"\tComma separated list of ethernet devices that should use the\n"
79 	"\tPOW for transmit instead of the actual ethernet hardware. This\n"
80 	"\tis a per port version of always_use_pow. always_use_pow takes\n"
81 	"\tprecedence over this list. For example, setting this to\n"
82 	"\t\"eth2,spi3,spi7\" would cause these three devices to transmit\n"
83 	"\tusing the pow_send_group.");
84 
85 int rx_napi_weight = 32;
86 module_param(rx_napi_weight, int, 0444);
87 MODULE_PARM_DESC(rx_napi_weight, "The NAPI WEIGHT parameter.");
88 
89 /*
90  * cvm_oct_poll_queue - Workqueue for polling operations.
91  */
92 struct workqueue_struct *cvm_oct_poll_queue;
93 
94 /*
95  * cvm_oct_poll_queue_stopping - flag to indicate polling should stop.
96  *
97  * Set to one right before cvm_oct_poll_queue is destroyed.
98  */
99 atomic_t cvm_oct_poll_queue_stopping = ATOMIC_INIT(0);
100 
101 /*
102  * Array of every ethernet device owned by this driver indexed by
103  * the ipd input port number.
104  */
105 struct net_device *cvm_oct_device[TOTAL_NUMBER_OF_PORTS];
106 
107 u64 cvm_oct_tx_poll_interval;
108 
109 static void cvm_oct_rx_refill_worker(struct work_struct *work);
110 static DECLARE_DELAYED_WORK(cvm_oct_rx_refill_work, cvm_oct_rx_refill_worker);
111 
cvm_oct_rx_refill_worker(struct work_struct * work)112 static void cvm_oct_rx_refill_worker(struct work_struct *work)
113 {
114 	/*
115 	 * FPA 0 may have been drained, try to refill it if we need
116 	 * more than num_packet_buffers / 2, otherwise normal receive
117 	 * processing will refill it.  If it were drained, no packets
118 	 * could be received so cvm_oct_napi_poll would never be
119 	 * invoked to do the refill.
120 	 */
121 	cvm_oct_rx_refill_pool(num_packet_buffers / 2);
122 
123 	if (!atomic_read(&cvm_oct_poll_queue_stopping))
124 		queue_delayed_work(cvm_oct_poll_queue,
125 				   &cvm_oct_rx_refill_work, HZ);
126 }
127 
cvm_oct_periodic_worker(struct work_struct * work)128 static void cvm_oct_periodic_worker(struct work_struct *work)
129 {
130 	struct octeon_ethernet *priv = container_of(work,
131 						    struct octeon_ethernet,
132 						    port_periodic_work.work);
133 
134 	if (priv->poll)
135 		priv->poll(cvm_oct_device[priv->port]);
136 
137 	cvm_oct_device[priv->port]->netdev_ops->ndo_get_stats(
138 						cvm_oct_device[priv->port]);
139 
140 	if (!atomic_read(&cvm_oct_poll_queue_stopping))
141 		queue_delayed_work(cvm_oct_poll_queue,
142 						&priv->port_periodic_work, HZ);
143 }
144 
cvm_oct_configure_common_hw(void)145 static void cvm_oct_configure_common_hw(void)
146 {
147 	/* Setup the FPA */
148 	cvmx_fpa_enable();
149 	cvm_oct_mem_fill_fpa(CVMX_FPA_PACKET_POOL, CVMX_FPA_PACKET_POOL_SIZE,
150 			     num_packet_buffers);
151 	cvm_oct_mem_fill_fpa(CVMX_FPA_WQE_POOL, CVMX_FPA_WQE_POOL_SIZE,
152 			     num_packet_buffers);
153 	if (CVMX_FPA_OUTPUT_BUFFER_POOL != CVMX_FPA_PACKET_POOL)
154 		cvm_oct_mem_fill_fpa(CVMX_FPA_OUTPUT_BUFFER_POOL,
155 				     CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE, 1024);
156 
157 #ifdef __LITTLE_ENDIAN
158 	{
159 		union cvmx_ipd_ctl_status ipd_ctl_status;
160 
161 		ipd_ctl_status.u64 = cvmx_read_csr(CVMX_IPD_CTL_STATUS);
162 		ipd_ctl_status.s.pkt_lend = 1;
163 		ipd_ctl_status.s.wqe_lend = 1;
164 		cvmx_write_csr(CVMX_IPD_CTL_STATUS, ipd_ctl_status.u64);
165 	}
166 #endif
167 
168 	cvmx_helper_setup_red(num_packet_buffers / 4, num_packet_buffers / 8);
169 }
170 
171 /**
172  * cvm_oct_free_work- Free a work queue entry
173  *
174  * @work_queue_entry: Work queue entry to free
175  *
176  * Returns Zero on success, Negative on failure.
177  */
cvm_oct_free_work(void * work_queue_entry)178 int cvm_oct_free_work(void *work_queue_entry)
179 {
180 	cvmx_wqe_t *work = work_queue_entry;
181 
182 	int segments = work->word2.s.bufs;
183 	union cvmx_buf_ptr segment_ptr = work->packet_ptr;
184 
185 	while (segments--) {
186 		union cvmx_buf_ptr next_ptr = *(union cvmx_buf_ptr *)
187 			cvmx_phys_to_ptr(segment_ptr.s.addr - 8);
188 		if (unlikely(!segment_ptr.s.i))
189 			cvmx_fpa_free(cvm_oct_get_buffer_ptr(segment_ptr),
190 				      segment_ptr.s.pool,
191 				      CVMX_FPA_PACKET_POOL_SIZE / 128);
192 		segment_ptr = next_ptr;
193 	}
194 	cvmx_fpa_free(work, CVMX_FPA_WQE_POOL, 1);
195 
196 	return 0;
197 }
198 EXPORT_SYMBOL(cvm_oct_free_work);
199 
200 /**
201  * cvm_oct_common_get_stats - get the low level ethernet statistics
202  * @dev:    Device to get the statistics from
203  *
204  * Returns Pointer to the statistics
205  */
cvm_oct_common_get_stats(struct net_device * dev)206 static struct net_device_stats *cvm_oct_common_get_stats(struct net_device *dev)
207 {
208 	cvmx_pip_port_status_t rx_status;
209 	cvmx_pko_port_status_t tx_status;
210 	struct octeon_ethernet *priv = netdev_priv(dev);
211 
212 	if (priv->port < CVMX_PIP_NUM_INPUT_PORTS) {
213 		if (octeon_is_simulation()) {
214 			/* The simulator doesn't support statistics */
215 			memset(&rx_status, 0, sizeof(rx_status));
216 			memset(&tx_status, 0, sizeof(tx_status));
217 		} else {
218 			cvmx_pip_get_port_status(priv->port, 1, &rx_status);
219 			cvmx_pko_get_port_status(priv->port, 1, &tx_status);
220 		}
221 
222 		priv->stats.rx_packets += rx_status.inb_packets;
223 		priv->stats.tx_packets += tx_status.packets;
224 		priv->stats.rx_bytes += rx_status.inb_octets;
225 		priv->stats.tx_bytes += tx_status.octets;
226 		priv->stats.multicast += rx_status.multicast_packets;
227 		priv->stats.rx_crc_errors += rx_status.inb_errors;
228 		priv->stats.rx_frame_errors += rx_status.fcs_align_err_packets;
229 
230 		/*
231 		 * The drop counter must be incremented atomically
232 		 * since the RX tasklet also increments it.
233 		 */
234 #ifdef CONFIG_64BIT
235 		atomic64_add(rx_status.dropped_packets,
236 			     (atomic64_t *)&priv->stats.rx_dropped);
237 #else
238 		atomic_add(rx_status.dropped_packets,
239 			     (atomic_t *)&priv->stats.rx_dropped);
240 #endif
241 	}
242 
243 	return &priv->stats;
244 }
245 
246 /**
247  * cvm_oct_common_change_mtu - change the link MTU
248  * @dev:     Device to change
249  * @new_mtu: The new MTU
250  *
251  * Returns Zero on success
252  */
cvm_oct_common_change_mtu(struct net_device * dev,int new_mtu)253 static int cvm_oct_common_change_mtu(struct net_device *dev, int new_mtu)
254 {
255 	struct octeon_ethernet *priv = netdev_priv(dev);
256 	int interface = INTERFACE(priv->port);
257 	int index = INDEX(priv->port);
258 #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
259 	int vlan_bytes = 4;
260 #else
261 	int vlan_bytes = 0;
262 #endif
263 
264 	/*
265 	 * Limit the MTU to make sure the ethernet packets are between
266 	 * 64 bytes and 65535 bytes.
267 	 */
268 	if ((new_mtu + 14 + 4 + vlan_bytes < 64)
269 	    || (new_mtu + 14 + 4 + vlan_bytes > 65392)) {
270 		pr_err("MTU must be between %d and %d.\n",
271 		       64 - 14 - 4 - vlan_bytes, 65392 - 14 - 4 - vlan_bytes);
272 		return -EINVAL;
273 	}
274 	dev->mtu = new_mtu;
275 
276 	if ((interface < 2)
277 	    && (cvmx_helper_interface_get_mode(interface) !=
278 		CVMX_HELPER_INTERFACE_MODE_SPI)) {
279 		/* Add ethernet header and FCS, and VLAN if configured. */
280 		int max_packet = new_mtu + 14 + 4 + vlan_bytes;
281 
282 		if (OCTEON_IS_MODEL(OCTEON_CN3XXX)
283 		    || OCTEON_IS_MODEL(OCTEON_CN58XX)) {
284 			/* Signal errors on packets larger than the MTU */
285 			cvmx_write_csr(CVMX_GMXX_RXX_FRM_MAX(index, interface),
286 				       max_packet);
287 		} else {
288 			/*
289 			 * Set the hardware to truncate packets larger
290 			 * than the MTU and smaller the 64 bytes.
291 			 */
292 			union cvmx_pip_frm_len_chkx frm_len_chk;
293 
294 			frm_len_chk.u64 = 0;
295 			frm_len_chk.s.minlen = 64;
296 			frm_len_chk.s.maxlen = max_packet;
297 			cvmx_write_csr(CVMX_PIP_FRM_LEN_CHKX(interface),
298 				       frm_len_chk.u64);
299 		}
300 		/*
301 		 * Set the hardware to truncate packets larger than
302 		 * the MTU. The jabber register must be set to a
303 		 * multiple of 8 bytes, so round up.
304 		 */
305 		cvmx_write_csr(CVMX_GMXX_RXX_JABBER(index, interface),
306 			       (max_packet + 7) & ~7u);
307 	}
308 	return 0;
309 }
310 
311 /**
312  * cvm_oct_common_set_multicast_list - set the multicast list
313  * @dev:    Device to work on
314  */
cvm_oct_common_set_multicast_list(struct net_device * dev)315 static void cvm_oct_common_set_multicast_list(struct net_device *dev)
316 {
317 	union cvmx_gmxx_prtx_cfg gmx_cfg;
318 	struct octeon_ethernet *priv = netdev_priv(dev);
319 	int interface = INTERFACE(priv->port);
320 	int index = INDEX(priv->port);
321 
322 	if ((interface < 2)
323 	    && (cvmx_helper_interface_get_mode(interface) !=
324 		CVMX_HELPER_INTERFACE_MODE_SPI)) {
325 		union cvmx_gmxx_rxx_adr_ctl control;
326 
327 		control.u64 = 0;
328 		control.s.bcst = 1;	/* Allow broadcast MAC addresses */
329 
330 		if (!netdev_mc_empty(dev) || (dev->flags & IFF_ALLMULTI) ||
331 		    (dev->flags & IFF_PROMISC))
332 			/* Force accept multicast packets */
333 			control.s.mcst = 2;
334 		else
335 			/* Force reject multicast packets */
336 			control.s.mcst = 1;
337 
338 		if (dev->flags & IFF_PROMISC)
339 			/*
340 			 * Reject matches if promisc. Since CAM is
341 			 * shut off, should accept everything.
342 			 */
343 			control.s.cam_mode = 0;
344 		else
345 			/* Filter packets based on the CAM */
346 			control.s.cam_mode = 1;
347 
348 		gmx_cfg.u64 =
349 		    cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
350 		cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface),
351 			       gmx_cfg.u64 & ~1ull);
352 
353 		cvmx_write_csr(CVMX_GMXX_RXX_ADR_CTL(index, interface),
354 			       control.u64);
355 		if (dev->flags & IFF_PROMISC)
356 			cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM_EN
357 				       (index, interface), 0);
358 		else
359 			cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM_EN
360 				       (index, interface), 1);
361 
362 		cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface),
363 			       gmx_cfg.u64);
364 	}
365 }
366 
cvm_oct_set_mac_filter(struct net_device * dev)367 static int cvm_oct_set_mac_filter(struct net_device *dev)
368 {
369 	struct octeon_ethernet *priv = netdev_priv(dev);
370 	union cvmx_gmxx_prtx_cfg gmx_cfg;
371 	int interface = INTERFACE(priv->port);
372 	int index = INDEX(priv->port);
373 
374 	if ((interface < 2)
375 	    && (cvmx_helper_interface_get_mode(interface) !=
376 		CVMX_HELPER_INTERFACE_MODE_SPI)) {
377 		int i;
378 		u8 *ptr = dev->dev_addr;
379 		u64 mac = 0;
380 
381 		for (i = 0; i < 6; i++)
382 			mac = (mac << 8) | (u64)ptr[i];
383 
384 		gmx_cfg.u64 =
385 		    cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
386 		cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface),
387 			       gmx_cfg.u64 & ~1ull);
388 
389 		cvmx_write_csr(CVMX_GMXX_SMACX(index, interface), mac);
390 		cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM0(index, interface),
391 			       ptr[0]);
392 		cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM1(index, interface),
393 			       ptr[1]);
394 		cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM2(index, interface),
395 			       ptr[2]);
396 		cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM3(index, interface),
397 			       ptr[3]);
398 		cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM4(index, interface),
399 			       ptr[4]);
400 		cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM5(index, interface),
401 			       ptr[5]);
402 		cvm_oct_common_set_multicast_list(dev);
403 		cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface),
404 			       gmx_cfg.u64);
405 	}
406 	return 0;
407 }
408 
409 /**
410  * cvm_oct_common_set_mac_address - set the hardware MAC address for a device
411  * @dev:    The device in question.
412  * @addr:   Socket address.
413  *
414  * Returns Zero on success
415  */
cvm_oct_common_set_mac_address(struct net_device * dev,void * addr)416 static int cvm_oct_common_set_mac_address(struct net_device *dev, void *addr)
417 {
418 	int r = eth_mac_addr(dev, addr);
419 
420 	if (r)
421 		return r;
422 	return cvm_oct_set_mac_filter(dev);
423 }
424 
425 /**
426  * cvm_oct_common_init - per network device initialization
427  * @dev:    Device to initialize
428  *
429  * Returns Zero on success
430  */
cvm_oct_common_init(struct net_device * dev)431 int cvm_oct_common_init(struct net_device *dev)
432 {
433 	struct octeon_ethernet *priv = netdev_priv(dev);
434 	const u8 *mac = NULL;
435 
436 	if (priv->of_node)
437 		mac = of_get_mac_address(priv->of_node);
438 
439 	if (mac)
440 		ether_addr_copy(dev->dev_addr, mac);
441 	else
442 		eth_hw_addr_random(dev);
443 
444 	/*
445 	 * Force the interface to use the POW send if always_use_pow
446 	 * was specified or it is in the pow send list.
447 	 */
448 	if ((pow_send_group != -1)
449 	    && (always_use_pow || strstr(pow_send_list, dev->name)))
450 		priv->queue = -1;
451 
452 	if (priv->queue != -1)
453 		dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
454 
455 	/* We do our own locking, Linux doesn't need to */
456 	dev->features |= NETIF_F_LLTX;
457 	dev->ethtool_ops = &cvm_oct_ethtool_ops;
458 
459 	cvm_oct_set_mac_filter(dev);
460 	dev->netdev_ops->ndo_change_mtu(dev, dev->mtu);
461 
462 	/*
463 	 * Zero out stats for port so we won't mistakenly show
464 	 * counters from the bootloader.
465 	 */
466 	memset(dev->netdev_ops->ndo_get_stats(dev), 0,
467 	       sizeof(struct net_device_stats));
468 
469 	if (dev->netdev_ops->ndo_stop)
470 		dev->netdev_ops->ndo_stop(dev);
471 
472 	return 0;
473 }
474 
cvm_oct_common_uninit(struct net_device * dev)475 void cvm_oct_common_uninit(struct net_device *dev)
476 {
477 	struct octeon_ethernet *priv = netdev_priv(dev);
478 
479 	if (priv->phydev)
480 		phy_disconnect(priv->phydev);
481 }
482 
cvm_oct_common_open(struct net_device * dev,void (* link_poll)(struct net_device *))483 int cvm_oct_common_open(struct net_device *dev,
484 			void (*link_poll)(struct net_device *))
485 {
486 	union cvmx_gmxx_prtx_cfg gmx_cfg;
487 	struct octeon_ethernet *priv = netdev_priv(dev);
488 	int interface = INTERFACE(priv->port);
489 	int index = INDEX(priv->port);
490 	cvmx_helper_link_info_t link_info;
491 	int rv;
492 
493 	rv = cvm_oct_phy_setup_device(dev);
494 	if (rv)
495 		return rv;
496 
497 	gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
498 	gmx_cfg.s.en = 1;
499 	cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
500 
501 	if (octeon_is_simulation())
502 		return 0;
503 
504 	if (priv->phydev) {
505 		int r = phy_read_status(priv->phydev);
506 
507 		if (r == 0 && priv->phydev->link == 0)
508 			netif_carrier_off(dev);
509 		cvm_oct_adjust_link(dev);
510 	} else {
511 		link_info = cvmx_helper_link_get(priv->port);
512 		if (!link_info.s.link_up)
513 			netif_carrier_off(dev);
514 		priv->poll = link_poll;
515 		link_poll(dev);
516 	}
517 
518 	return 0;
519 }
520 
cvm_oct_link_poll(struct net_device * dev)521 void cvm_oct_link_poll(struct net_device *dev)
522 {
523 	struct octeon_ethernet *priv = netdev_priv(dev);
524 	cvmx_helper_link_info_t link_info;
525 
526 	link_info = cvmx_helper_link_get(priv->port);
527 	if (link_info.u64 == priv->link_info)
528 		return;
529 
530 	link_info = cvmx_helper_link_autoconf(priv->port);
531 	priv->link_info = link_info.u64;
532 
533 	if (link_info.s.link_up) {
534 		if (!netif_carrier_ok(dev))
535 			netif_carrier_on(dev);
536 	} else if (netif_carrier_ok(dev)) {
537 		netif_carrier_off(dev);
538 	}
539 	cvm_oct_note_carrier(priv, link_info);
540 }
541 
cvm_oct_xaui_open(struct net_device * dev)542 static int cvm_oct_xaui_open(struct net_device *dev)
543 {
544 	return cvm_oct_common_open(dev, cvm_oct_link_poll);
545 }
546 
547 static const struct net_device_ops cvm_oct_npi_netdev_ops = {
548 	.ndo_init		= cvm_oct_common_init,
549 	.ndo_uninit		= cvm_oct_common_uninit,
550 	.ndo_start_xmit		= cvm_oct_xmit,
551 	.ndo_set_rx_mode	= cvm_oct_common_set_multicast_list,
552 	.ndo_set_mac_address	= cvm_oct_common_set_mac_address,
553 	.ndo_do_ioctl		= cvm_oct_ioctl,
554 	.ndo_change_mtu		= cvm_oct_common_change_mtu,
555 	.ndo_get_stats		= cvm_oct_common_get_stats,
556 #ifdef CONFIG_NET_POLL_CONTROLLER
557 	.ndo_poll_controller	= cvm_oct_poll_controller,
558 #endif
559 };
560 static const struct net_device_ops cvm_oct_xaui_netdev_ops = {
561 	.ndo_init		= cvm_oct_common_init,
562 	.ndo_uninit		= cvm_oct_common_uninit,
563 	.ndo_open		= cvm_oct_xaui_open,
564 	.ndo_stop		= cvm_oct_common_stop,
565 	.ndo_start_xmit		= cvm_oct_xmit,
566 	.ndo_set_rx_mode	= cvm_oct_common_set_multicast_list,
567 	.ndo_set_mac_address	= cvm_oct_common_set_mac_address,
568 	.ndo_do_ioctl		= cvm_oct_ioctl,
569 	.ndo_change_mtu		= cvm_oct_common_change_mtu,
570 	.ndo_get_stats		= cvm_oct_common_get_stats,
571 #ifdef CONFIG_NET_POLL_CONTROLLER
572 	.ndo_poll_controller	= cvm_oct_poll_controller,
573 #endif
574 };
575 static const struct net_device_ops cvm_oct_sgmii_netdev_ops = {
576 	.ndo_init		= cvm_oct_sgmii_init,
577 	.ndo_uninit		= cvm_oct_common_uninit,
578 	.ndo_open		= cvm_oct_sgmii_open,
579 	.ndo_stop		= cvm_oct_common_stop,
580 	.ndo_start_xmit		= cvm_oct_xmit,
581 	.ndo_set_rx_mode	= cvm_oct_common_set_multicast_list,
582 	.ndo_set_mac_address	= cvm_oct_common_set_mac_address,
583 	.ndo_do_ioctl		= cvm_oct_ioctl,
584 	.ndo_change_mtu		= cvm_oct_common_change_mtu,
585 	.ndo_get_stats		= cvm_oct_common_get_stats,
586 #ifdef CONFIG_NET_POLL_CONTROLLER
587 	.ndo_poll_controller	= cvm_oct_poll_controller,
588 #endif
589 };
590 static const struct net_device_ops cvm_oct_spi_netdev_ops = {
591 	.ndo_init		= cvm_oct_spi_init,
592 	.ndo_uninit		= cvm_oct_spi_uninit,
593 	.ndo_start_xmit		= cvm_oct_xmit,
594 	.ndo_set_rx_mode	= cvm_oct_common_set_multicast_list,
595 	.ndo_set_mac_address	= cvm_oct_common_set_mac_address,
596 	.ndo_do_ioctl		= cvm_oct_ioctl,
597 	.ndo_change_mtu		= cvm_oct_common_change_mtu,
598 	.ndo_get_stats		= cvm_oct_common_get_stats,
599 #ifdef CONFIG_NET_POLL_CONTROLLER
600 	.ndo_poll_controller	= cvm_oct_poll_controller,
601 #endif
602 };
603 static const struct net_device_ops cvm_oct_rgmii_netdev_ops = {
604 	.ndo_init		= cvm_oct_rgmii_init,
605 	.ndo_uninit		= cvm_oct_rgmii_uninit,
606 	.ndo_open		= cvm_oct_rgmii_open,
607 	.ndo_stop		= cvm_oct_common_stop,
608 	.ndo_start_xmit		= cvm_oct_xmit,
609 	.ndo_set_rx_mode	= cvm_oct_common_set_multicast_list,
610 	.ndo_set_mac_address	= cvm_oct_common_set_mac_address,
611 	.ndo_do_ioctl		= cvm_oct_ioctl,
612 	.ndo_change_mtu		= cvm_oct_common_change_mtu,
613 	.ndo_get_stats		= cvm_oct_common_get_stats,
614 #ifdef CONFIG_NET_POLL_CONTROLLER
615 	.ndo_poll_controller	= cvm_oct_poll_controller,
616 #endif
617 };
618 static const struct net_device_ops cvm_oct_pow_netdev_ops = {
619 	.ndo_init		= cvm_oct_common_init,
620 	.ndo_start_xmit		= cvm_oct_xmit_pow,
621 	.ndo_set_rx_mode	= cvm_oct_common_set_multicast_list,
622 	.ndo_set_mac_address	= cvm_oct_common_set_mac_address,
623 	.ndo_do_ioctl		= cvm_oct_ioctl,
624 	.ndo_change_mtu		= cvm_oct_common_change_mtu,
625 	.ndo_get_stats		= cvm_oct_common_get_stats,
626 #ifdef CONFIG_NET_POLL_CONTROLLER
627 	.ndo_poll_controller	= cvm_oct_poll_controller,
628 #endif
629 };
630 
cvm_oct_of_get_child(const struct device_node * parent,int reg_val)631 static struct device_node *cvm_oct_of_get_child(
632 				const struct device_node *parent, int reg_val)
633 {
634 	struct device_node *node = NULL;
635 	int size;
636 	const __be32 *addr;
637 
638 	for (;;) {
639 		node = of_get_next_child(parent, node);
640 		if (!node)
641 			break;
642 		addr = of_get_property(node, "reg", &size);
643 		if (addr && (be32_to_cpu(*addr) == reg_val))
644 			break;
645 	}
646 	return node;
647 }
648 
cvm_oct_node_for_port(struct device_node * pip,int interface,int port)649 static struct device_node *cvm_oct_node_for_port(struct device_node *pip,
650 							int interface, int port)
651 {
652 	struct device_node *ni, *np;
653 
654 	ni = cvm_oct_of_get_child(pip, interface);
655 	if (!ni)
656 		return NULL;
657 
658 	np = cvm_oct_of_get_child(ni, port);
659 	of_node_put(ni);
660 
661 	return np;
662 }
663 
cvm_oct_probe(struct platform_device * pdev)664 static int cvm_oct_probe(struct platform_device *pdev)
665 {
666 	int num_interfaces;
667 	int interface;
668 	int fau = FAU_NUM_PACKET_BUFFERS_TO_FREE;
669 	int qos;
670 	struct device_node *pip;
671 
672 	octeon_mdiobus_force_mod_depencency();
673 
674 	pip = pdev->dev.of_node;
675 	if (!pip) {
676 		pr_err("Error: No 'pip' in /aliases\n");
677 		return -EINVAL;
678 	}
679 
680 	cvm_oct_poll_queue = create_singlethread_workqueue("octeon-ethernet");
681 	if (!cvm_oct_poll_queue) {
682 		pr_err("octeon-ethernet: Cannot create workqueue");
683 		return -ENOMEM;
684 	}
685 
686 	cvm_oct_configure_common_hw();
687 
688 	cvmx_helper_initialize_packet_io_global();
689 
690 	/* Change the input group for all ports before input is enabled */
691 	num_interfaces = cvmx_helper_get_number_of_interfaces();
692 	for (interface = 0; interface < num_interfaces; interface++) {
693 		int num_ports = cvmx_helper_ports_on_interface(interface);
694 		int port;
695 
696 		for (port = cvmx_helper_get_ipd_port(interface, 0);
697 		     port < cvmx_helper_get_ipd_port(interface, num_ports);
698 		     port++) {
699 			union cvmx_pip_prt_tagx pip_prt_tagx;
700 
701 			pip_prt_tagx.u64 =
702 			    cvmx_read_csr(CVMX_PIP_PRT_TAGX(port));
703 			pip_prt_tagx.s.grp = pow_receive_group;
704 			cvmx_write_csr(CVMX_PIP_PRT_TAGX(port),
705 				       pip_prt_tagx.u64);
706 		}
707 	}
708 
709 	cvmx_helper_ipd_and_packet_input_enable();
710 
711 	memset(cvm_oct_device, 0, sizeof(cvm_oct_device));
712 
713 	/*
714 	 * Initialize the FAU used for counting packet buffers that
715 	 * need to be freed.
716 	 */
717 	cvmx_fau_atomic_write32(FAU_NUM_PACKET_BUFFERS_TO_FREE, 0);
718 
719 	/* Initialize the FAU used for counting tx SKBs that need to be freed */
720 	cvmx_fau_atomic_write32(FAU_TOTAL_TX_TO_CLEAN, 0);
721 
722 	if ((pow_send_group != -1)) {
723 		struct net_device *dev;
724 
725 		pr_info("\tConfiguring device for POW only access\n");
726 		dev = alloc_etherdev(sizeof(struct octeon_ethernet));
727 		if (dev) {
728 			/* Initialize the device private structure. */
729 			struct octeon_ethernet *priv = netdev_priv(dev);
730 
731 			dev->netdev_ops = &cvm_oct_pow_netdev_ops;
732 			priv->imode = CVMX_HELPER_INTERFACE_MODE_DISABLED;
733 			priv->port = CVMX_PIP_NUM_INPUT_PORTS;
734 			priv->queue = -1;
735 			strcpy(dev->name, "pow%d");
736 			for (qos = 0; qos < 16; qos++)
737 				skb_queue_head_init(&priv->tx_free_list[qos]);
738 
739 			if (register_netdev(dev) < 0) {
740 				pr_err("Failed to register ethernet device for POW\n");
741 				free_netdev(dev);
742 			} else {
743 				cvm_oct_device[CVMX_PIP_NUM_INPUT_PORTS] = dev;
744 				pr_info("%s: POW send group %d, receive group %d\n",
745 					dev->name, pow_send_group,
746 					pow_receive_group);
747 			}
748 		} else {
749 			pr_err("Failed to allocate ethernet device for POW\n");
750 		}
751 	}
752 
753 	num_interfaces = cvmx_helper_get_number_of_interfaces();
754 	for (interface = 0; interface < num_interfaces; interface++) {
755 		cvmx_helper_interface_mode_t imode =
756 		    cvmx_helper_interface_get_mode(interface);
757 		int num_ports = cvmx_helper_ports_on_interface(interface);
758 		int port;
759 		int port_index;
760 
761 		for (port_index = 0,
762 		     port = cvmx_helper_get_ipd_port(interface, 0);
763 		     port < cvmx_helper_get_ipd_port(interface, num_ports);
764 		     port_index++, port++) {
765 			struct octeon_ethernet *priv;
766 			struct net_device *dev =
767 			    alloc_etherdev(sizeof(struct octeon_ethernet));
768 			if (!dev) {
769 				pr_err("Failed to allocate ethernet device for port %d\n",
770 				       port);
771 				continue;
772 			}
773 
774 			/* Initialize the device private structure. */
775 			priv = netdev_priv(dev);
776 			priv->netdev = dev;
777 			priv->of_node = cvm_oct_node_for_port(pip, interface,
778 								port_index);
779 
780 			INIT_DELAYED_WORK(&priv->port_periodic_work,
781 					  cvm_oct_periodic_worker);
782 			priv->imode = imode;
783 			priv->port = port;
784 			priv->queue = cvmx_pko_get_base_queue(priv->port);
785 			priv->fau = fau - cvmx_pko_get_num_queues(port) * 4;
786 			for (qos = 0; qos < 16; qos++)
787 				skb_queue_head_init(&priv->tx_free_list[qos]);
788 			for (qos = 0; qos < cvmx_pko_get_num_queues(port);
789 			     qos++)
790 				cvmx_fau_atomic_write32(priv->fau + qos * 4, 0);
791 
792 			switch (priv->imode) {
793 
794 			/* These types don't support ports to IPD/PKO */
795 			case CVMX_HELPER_INTERFACE_MODE_DISABLED:
796 			case CVMX_HELPER_INTERFACE_MODE_PCIE:
797 			case CVMX_HELPER_INTERFACE_MODE_PICMG:
798 				break;
799 
800 			case CVMX_HELPER_INTERFACE_MODE_NPI:
801 				dev->netdev_ops = &cvm_oct_npi_netdev_ops;
802 				strcpy(dev->name, "npi%d");
803 				break;
804 
805 			case CVMX_HELPER_INTERFACE_MODE_XAUI:
806 				dev->netdev_ops = &cvm_oct_xaui_netdev_ops;
807 				strcpy(dev->name, "xaui%d");
808 				break;
809 
810 			case CVMX_HELPER_INTERFACE_MODE_LOOP:
811 				dev->netdev_ops = &cvm_oct_npi_netdev_ops;
812 				strcpy(dev->name, "loop%d");
813 				break;
814 
815 			case CVMX_HELPER_INTERFACE_MODE_SGMII:
816 				dev->netdev_ops = &cvm_oct_sgmii_netdev_ops;
817 				strcpy(dev->name, "eth%d");
818 				break;
819 
820 			case CVMX_HELPER_INTERFACE_MODE_SPI:
821 				dev->netdev_ops = &cvm_oct_spi_netdev_ops;
822 				strcpy(dev->name, "spi%d");
823 				break;
824 
825 			case CVMX_HELPER_INTERFACE_MODE_RGMII:
826 			case CVMX_HELPER_INTERFACE_MODE_GMII:
827 				dev->netdev_ops = &cvm_oct_rgmii_netdev_ops;
828 				strcpy(dev->name, "eth%d");
829 				break;
830 			}
831 
832 			if (!dev->netdev_ops) {
833 				free_netdev(dev);
834 			} else if (register_netdev(dev) < 0) {
835 				pr_err("Failed to register ethernet device for interface %d, port %d\n",
836 					 interface, priv->port);
837 				free_netdev(dev);
838 			} else {
839 				cvm_oct_device[priv->port] = dev;
840 				fau -=
841 				    cvmx_pko_get_num_queues(priv->port) *
842 				    sizeof(u32);
843 				queue_delayed_work(cvm_oct_poll_queue,
844 						&priv->port_periodic_work, HZ);
845 			}
846 		}
847 	}
848 
849 	cvm_oct_tx_initialize();
850 	cvm_oct_rx_initialize();
851 
852 	/*
853 	 * 150 uS: about 10 1500-byte packets at 1GE.
854 	 */
855 	cvm_oct_tx_poll_interval = 150 * (octeon_get_clock_rate() / 1000000);
856 
857 	queue_delayed_work(cvm_oct_poll_queue, &cvm_oct_rx_refill_work, HZ);
858 
859 	return 0;
860 }
861 
cvm_oct_remove(struct platform_device * pdev)862 static int cvm_oct_remove(struct platform_device *pdev)
863 {
864 	int port;
865 
866 	/* Disable POW interrupt */
867 	if (OCTEON_IS_MODEL(OCTEON_CN68XX))
868 		cvmx_write_csr(CVMX_SSO_WQ_INT_THRX(pow_receive_group), 0);
869 	else
870 		cvmx_write_csr(CVMX_POW_WQ_INT_THRX(pow_receive_group), 0);
871 
872 	cvmx_ipd_disable();
873 
874 	/* Free the interrupt handler */
875 	free_irq(OCTEON_IRQ_WORKQ0 + pow_receive_group, cvm_oct_device);
876 
877 	atomic_inc_return(&cvm_oct_poll_queue_stopping);
878 	cancel_delayed_work_sync(&cvm_oct_rx_refill_work);
879 
880 	cvm_oct_rx_shutdown();
881 	cvm_oct_tx_shutdown();
882 
883 	cvmx_pko_disable();
884 
885 	/* Free the ethernet devices */
886 	for (port = 0; port < TOTAL_NUMBER_OF_PORTS; port++) {
887 		if (cvm_oct_device[port]) {
888 			struct net_device *dev = cvm_oct_device[port];
889 			struct octeon_ethernet *priv = netdev_priv(dev);
890 
891 			cancel_delayed_work_sync(&priv->port_periodic_work);
892 
893 			cvm_oct_tx_shutdown_dev(dev);
894 			unregister_netdev(dev);
895 			free_netdev(dev);
896 			cvm_oct_device[port] = NULL;
897 		}
898 	}
899 
900 	destroy_workqueue(cvm_oct_poll_queue);
901 
902 	cvmx_pko_shutdown();
903 
904 	cvmx_ipd_free_ptr();
905 
906 	/* Free the HW pools */
907 	cvm_oct_mem_empty_fpa(CVMX_FPA_PACKET_POOL, CVMX_FPA_PACKET_POOL_SIZE,
908 			      num_packet_buffers);
909 	cvm_oct_mem_empty_fpa(CVMX_FPA_WQE_POOL, CVMX_FPA_WQE_POOL_SIZE,
910 			      num_packet_buffers);
911 	if (CVMX_FPA_OUTPUT_BUFFER_POOL != CVMX_FPA_PACKET_POOL)
912 		cvm_oct_mem_empty_fpa(CVMX_FPA_OUTPUT_BUFFER_POOL,
913 				      CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE, 128);
914 	return 0;
915 }
916 
917 static const struct of_device_id cvm_oct_match[] = {
918 	{
919 		.compatible = "cavium,octeon-3860-pip",
920 	},
921 	{},
922 };
923 MODULE_DEVICE_TABLE(of, cvm_oct_match);
924 
925 static struct platform_driver cvm_oct_driver = {
926 	.probe		= cvm_oct_probe,
927 	.remove		= cvm_oct_remove,
928 	.driver		= {
929 		.name	= KBUILD_MODNAME,
930 		.of_match_table = cvm_oct_match,
931 	},
932 };
933 
934 module_platform_driver(cvm_oct_driver);
935 
936 MODULE_LICENSE("GPL");
937 MODULE_AUTHOR("Cavium Networks <support@caviumnetworks.com>");
938 MODULE_DESCRIPTION("Cavium Networks Octeon ethernet driver.");
939