Version:  2.0.40 2.2.26 2.4.37 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2 4.3 4.4

Linux/drivers/staging/octeon/ethernet.c

  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 
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 
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 
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  */
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  */
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  */
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  */
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 
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  */
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  */
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 
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 
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 
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 
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 
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 
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 
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 
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 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us