From owner-svn-src-user@FreeBSD.ORG Thu Apr 22 02:53:50 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 44EF4106564A; Thu, 22 Apr 2010 02:53:50 +0000 (UTC) (envelope-from jmallett@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3257F8FC12; Thu, 22 Apr 2010 02:53:50 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o3M2roOe046858; Thu, 22 Apr 2010 02:53:50 GMT (envelope-from jmallett@svn.freebsd.org) Received: (from jmallett@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o3M2roBv046847; Thu, 22 Apr 2010 02:53:50 GMT (envelope-from jmallett@svn.freebsd.org) Message-Id: <201004220253.o3M2roBv046847@svn.freebsd.org> From: Juli Mallett Date: Thu, 22 Apr 2010 02:53:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r207050 - user/jmallett/octeon/sys/mips/cavium/octe X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Apr 2010 02:53:50 -0000 Author: jmallett Date: Thu Apr 22 02:53:49 2010 New Revision: 207050 URL: http://svn.freebsd.org/changeset/base/207050 Log: Add the BSD-licensed version of the Linux Octeon Ethernet driver. I'll be porting this to FreeBSD in the coming days. Submitted by: imp Added: user/jmallett/octeon/sys/mips/cavium/octe/ user/jmallett/octeon/sys/mips/cavium/octe/Kconfig user/jmallett/octeon/sys/mips/cavium/octe/Makefile user/jmallett/octeon/sys/mips/cavium/octe/cavium-ethernet.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet-defines.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet-headers.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.c user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mem.c user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mem.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet-proc.c user/jmallett/octeon/sys/mips/cavium/octe/ethernet-proc.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet-rgmii.c user/jmallett/octeon/sys/mips/cavium/octe/ethernet-rx.c user/jmallett/octeon/sys/mips/cavium/octe/ethernet-rx.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet-sgmii.c user/jmallett/octeon/sys/mips/cavium/octe/ethernet-spi.c user/jmallett/octeon/sys/mips/cavium/octe/ethernet-tx.c user/jmallett/octeon/sys/mips/cavium/octe/ethernet-tx.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet-util.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet-xaui.c user/jmallett/octeon/sys/mips/cavium/octe/ethernet.c user/jmallett/octeon/sys/mips/cavium/octe/wrapper-cvmx-includes.h Added: user/jmallett/octeon/sys/mips/cavium/octe/Kconfig ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/jmallett/octeon/sys/mips/cavium/octe/Kconfig Thu Apr 22 02:53:49 2010 (r207050) @@ -0,0 +1,12 @@ +config CAVIUM_ETHERNET + tristate "Cavium Networks Octeon Ethernet support" + depends on CPU_CAVIUM_OCTEON + select MII + help + This driver supports the builtin ethernet ports on Cavium + Networks products in the Octeon family. This driver supports the + CN3XXX and CN5XXX Octeon processors. + + To compile this driver as a module, choose M here. The module + will be called cavium-ethernet. + Added: user/jmallett/octeon/sys/mips/cavium/octe/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/jmallett/octeon/sys/mips/cavium/octe/Makefile Thu Apr 22 02:53:49 2010 (r207050) @@ -0,0 +1,56 @@ +# Author: Cavium Networks info@caviumnetworks.com +# +# Copyright (c) 2003-2007 Cavium Networks (support@cavium.com). All rights +# reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# +# * Neither the name of Cavium Networks nor the names of +# its contributors may be used to endorse or promote products +# derived from this software without specific prior written +# permission. +# +# TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" +# AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS +# OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH +# RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY +# REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT +# DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES +# OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR +# PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET +# POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT +# OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + +# Common flags to be passed for driver compilation +EXTRA_CFLAGS += -Winline -Wall \ + -I arch/mips/cavium-octeon/gpl-executive/config \ + -I $(srctree)/arch/mips/cavium-octeon/gpl-executive/config \ + -I ${OCTEON_ROOT}/target/include + +obj-${CONFIG_CAVIUM_ETHERNET} := cavium-ethernet.o + +cavium-ethernet-objs := ethernet.o +cavium-ethernet-objs += ethernet-common.o +cavium-ethernet-objs += ethernet-mdio.o +cavium-ethernet-objs += ethernet-mem.o +cavium-ethernet-objs += ethernet-proc.o +cavium-ethernet-objs += ethernet-rgmii.o +cavium-ethernet-objs += ethernet-rx.o +cavium-ethernet-objs += ethernet-sgmii.o +cavium-ethernet-objs += ethernet-spi.o +cavium-ethernet-objs += ethernet-tx.o +cavium-ethernet-objs += ethernet-xaui.o + +clean: + rm -rf .*.cmd *.mod.c *.o *.ko .tmp_versions + Added: user/jmallett/octeon/sys/mips/cavium/octe/cavium-ethernet.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/jmallett/octeon/sys/mips/cavium/octe/cavium-ethernet.h Thu Apr 22 02:53:49 2010 (r207050) @@ -0,0 +1,167 @@ +/************************************************************************* +Copyright (c) 2003-2007 Cavium Networks (support@cavium.com). All rights +reserved. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Cavium Networks nor the names of + its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +This Software, including technical data, may be subject to U.S. export control laws, including the U.S. Export Administration Act and its associated regulations, and may be subject to export or import regulations in other countries. + +TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" +AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + +*************************************************************************/ + +/** + * @file + * External interface for the Cavium Octeon ethernet driver. + * + * $Id: cavium-ethernet.h 41589 2009-03-19 19:58:58Z cchavva $ + * + */ +#ifndef CAVIUM_ETHERNET_H +#define CAVIUM_ETHERNET_H + +/** + * These enumerations are the return codes for the Ethernet + * driver intercept callback. Depending on the return code, + * the ethernet driver will continue processing in different + * ways. + */ +typedef enum { + CVM_OCT_PASS, /**< The ethernet driver will pass the packet + to the kernel, just as if the intercept + callback didn't exist */ + CVM_OCT_DROP, /**< The ethernet driver will drop the packet, + cleaning of the work queue entry and the + skbuff */ + CVM_OCT_TAKE_OWNERSHIP_WORK,/**< The intercept callback takes over + ownership of the work queue entry. It is + the responsibility of the callback to free + the work queue entry and all associated + packet buffers. The ethernet driver will + dispose of the skbuff without affecting the + work queue entry */ + CVM_OCT_TAKE_OWNERSHIP_SKB /**< The intercept callback takes over + ownership of the skbuff. The work queue + entry and packet buffer will be disposed of + in a way keeping the skbuff valid */ +} cvm_oct_callback_result_t; + + +/** + * The is the definition of the Ethernet driver intercept + * callback. The callback receives three parameters and + * returns a struct cvm_oct_callback_result code. + * + * The first parameter is the linux device for the ethernet + * port the packet came in on. + * The second parameter is the raw work queue entry from the + * hardware. + * Th third parameter is the packet converted into a Linux + * skbuff. + */ +typedef cvm_oct_callback_result_t (*cvm_oct_callback_t)(struct net_device *dev, void *work_queue_entry, struct sk_buff *skb); + +/** + * This is the definition of the Ethernet driver's private + * driver state stored in netdev_priv(dev). + */ +typedef struct { + int port; /* PKO hardware output port */ + int queue; /* PKO hardware queue for the port */ + int fau; /* Hardware fetch and add to count outstanding tx buffers */ + int imode; /* Type of port. This is one of the enums in cvmx_helper_interface_mode_t */ + struct sk_buff_head tx_free_list[16];/* List of outstanding tx buffers per queue */ + /* Keeping intercept_cb close the the part of stats that is most often modified helps throughput. */ + cvm_oct_callback_t intercept_cb; /* Optional intecept callback defined above */ + struct net_device_stats stats; /* Device statistics */ + struct mii_if_info mii_info; /* Generic MII info structure */ + uint64_t link_info; /* Last negotiated link state */ + void (*poll)(struct net_device *dev); /* Called periodically to check link status */ +} cvm_oct_private_t; + + +/** + * Registers a intercept callback for the names ethernet + * device. It returns the Linux device structure for the + * ethernet port. Usign a callback of NULL will remove + * the callback. Note that this callback must not disturb + * scratch. It will be called with SYNCIOBDMAs in progress + * and userspace may be using scratch. It also must not + * disturb the group mask. + * + * @param device_name + * Device name to register for. (Example: "eth0") + * @param callback Intercept callback to set. + * @return Device structure for the ethernet port or NULL on failure. + */ +struct net_device *cvm_oct_register_callback(const char *device_name, cvm_oct_callback_t callback); + + +/** + * Free a work queue entry received in a intercept callback. + * + * @param work_queue_entry + * Work queue entry to free + * @return Zero on success, Negative on failure. + */ +int cvm_oct_free_work(void *work_queue_entry); + + +/** + * Transmit a work queue entry out of the ethernet port. Both + * the work queue entry and the packet data can optionally be + * freed. The work will be freed on error as well. + * + * @param dev Device to transmit out. + * @param work_queue_entry + * Work queue entry to send + * @param do_free True if the work queue entry and packet data should be + * freed. If false, neither will be freed. + * @param qos Index into the queues for this port to transmit on. This + * is used to implement QoS if their are multiple queues per + * port. This parameter must be between 0 and the number of + * queues per port minus 1. Values outside of this range will + * be change to zero. + * + * @return Zero on success, negative on failure. + */ +int cvm_oct_transmit_qos(struct net_device *dev, void *work_queue_entry, int do_free, int qos); + + +/** + * Transmit a work queue entry out of the ethernet port. Both + * the work queue entry and the packet data can optionally be + * freed. The work will be freed on error as well. This simply + * wraps cvmx_oct_transmit_qos() for backwards compatability. + * + * @param dev Device to transmit out. + * @param work_queue_entry + * Work queue entry to send + * @param do_free True if the work queue entry and packet data should be + * freed. If false, neither will be freed. + * + * @return Zero on success, negative on failure. + */ +static inline int cvm_oct_transmit(struct net_device *dev, void *work_queue_entry, int do_free) +{ + return cvm_oct_transmit_qos(dev, work_queue_entry, do_free, 0); +} + +#endif Added: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c Thu Apr 22 02:53:49 2010 (r207050) @@ -0,0 +1,275 @@ +/************************************************************************* +Copyright (c) 2003-2007 Cavium Networks (support@cavium.com). All rights +reserved. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Cavium Networks nor the names of + its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +This Software, including technical data, may be subject to U.S. export control laws, including the U.S. Export Administration Act and its associated regulations, and may be subject to export or import regulations in other countries. + +TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" +AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + +*************************************************************************/ +#include +#include +#include + +#include "wrapper-cvmx-includes.h" +#include "ethernet-headers.h" + +extern int octeon_is_simulation(void); +extern cvmx_bootinfo_t *octeon_bootinfo; +extern int pow_send_group; +extern int always_use_pow; +extern char pow_send_list[]; + + +/** + * Get the low level ethernet statistics + * + * @param dev Device to get the statistics from + * @return Pointer to the statistics + */ +static struct net_device_stats *cvm_oct_common_get_stats(struct net_device *dev) +{ + cvmx_pip_port_status_t rx_status; + cvmx_pko_port_status_t tx_status; + cvm_oct_private_t *priv = (cvm_oct_private_t *)netdev_priv(dev); + + if (priv->port < CVMX_PIP_NUM_INPUT_PORTS) { + if (octeon_is_simulation()) { + /* The simulator doesn't support statistics */ + memset(&rx_status, 0, sizeof(rx_status)); + memset(&tx_status, 0, sizeof(tx_status)); + } else { + cvmx_pip_get_port_status(priv->port, 1, &rx_status); + cvmx_pko_get_port_status(priv->port, 1, &tx_status); + } + + priv->stats.rx_packets += rx_status.inb_packets; + priv->stats.tx_packets += tx_status.packets; + priv->stats.rx_bytes += rx_status.inb_octets; + priv->stats.tx_bytes += tx_status.octets; + priv->stats.multicast += rx_status.multicast_packets; + priv->stats.rx_crc_errors += rx_status.inb_errors; + priv->stats.rx_frame_errors += rx_status.fcs_align_err_packets; + + /* The drop counter must be incremented atomically since the RX + tasklet also increments it */ +#ifdef CONFIG_64BIT + cvmx_atomic_add64_nosync(&priv->stats.rx_dropped, rx_status.dropped_packets); +#else + cvmx_atomic_add32_nosync((int32_t *)&priv->stats.rx_dropped, rx_status.dropped_packets); +#endif + } + + return &priv->stats; +} + + +/** + * Set the multicast list. Currently unimplemented. + * + * @param dev Device to work on + */ +static void cvm_oct_common_set_multicast_list(struct net_device *dev) +{ + cvmx_gmxx_prtx_cfg_t gmx_cfg; + cvm_oct_private_t *priv = (cvm_oct_private_t *)netdev_priv(dev); + int interface = INTERFACE(priv->port); + int index = INDEX(priv->port); + + if ((interface < 2) && (cvmx_helper_interface_get_mode(interface) != CVMX_HELPER_INTERFACE_MODE_SPI)) { + cvmx_gmxx_rxx_adr_ctl_t control; + control.u64 = 0; + control.s.bcst = 1; /* Allow broadcast MAC addresses */ + + if (dev->mc_list || (dev->flags&IFF_ALLMULTI) || + (dev->flags & IFF_PROMISC)) + control.s.mcst = 2; /* Force accept multicast packets */ + else + control.s.mcst = 1; /* Force reject multicat packets */ + + if (dev->flags & IFF_PROMISC) + control.s.cam_mode = 0; /* Reject matches if promisc. Since CAM is shut off, should accept everything */ + else + control.s.cam_mode = 1; /* Filter packets based on the CAM */ + + gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface)); + cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64 & ~1ull); + + cvmx_write_csr(CVMX_GMXX_RXX_ADR_CTL(index, interface), control.u64); + if (dev->flags&IFF_PROMISC) + cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM_EN(index, interface), 0); + else + cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM_EN(index, interface), 1); + + cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64); + } +} + + +/** + * Set the hardware MAC address for a device + * + * @param dev Device to change the MAC address for + * @param addr Address structure to change it too. MAC address is addr + 2. + * @return Zero on success + */ +static int cvm_oct_common_set_mac_address(struct net_device *dev, void *addr) +{ + cvm_oct_private_t *priv = (cvm_oct_private_t *)netdev_priv(dev); + cvmx_gmxx_prtx_cfg_t gmx_cfg; + int interface = INTERFACE(priv->port); + int index = INDEX(priv->port); + + memcpy(dev->dev_addr, addr + 2, 6); + + if ((interface < 2) && (cvmx_helper_interface_get_mode(interface) != CVMX_HELPER_INTERFACE_MODE_SPI)) { + int i; + uint8_t *ptr = addr; + uint64_t mac = 0; + for (i = 0; i < 6; i++) + mac = (mac<<8) | (uint64_t)(ptr[i+2]); + + gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface)); + cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64 & ~1ull); + + cvmx_write_csr(CVMX_GMXX_SMACX(index, interface), mac); + cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM0(index, interface), ptr[2]); + cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM1(index, interface), ptr[3]); + cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM2(index, interface), ptr[4]); + cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM3(index, interface), ptr[5]); + cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM4(index, interface), ptr[6]); + cvmx_write_csr(CVMX_GMXX_RXX_ADR_CAM5(index, interface), ptr[7]); + cvm_oct_common_set_multicast_list(dev); + cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64); + } + return 0; +} + + +/** + * Change the link MTU. Unimplemented + * + * @param dev Device to change + * @param new_mtu The new MTU + * @return Zero on success + */ +static int cvm_oct_common_change_mtu(struct net_device *dev, int new_mtu) +{ + cvm_oct_private_t *priv = (cvm_oct_private_t *)netdev_priv(dev); + int interface = INTERFACE(priv->port); + int index = INDEX(priv->port); +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + int vlan_bytes = 4; +#else + int vlan_bytes = 0; +#endif + + /* Limit the MTU to make sure the ethernet packets are between 64 bytes + and 65535 bytes */ + if ((new_mtu + 14 + 4 + vlan_bytes < 64) || (new_mtu + 14 + 4 + vlan_bytes > 65392)) { + printk("MTU must be between %d and %d.\n", 64-14-4-vlan_bytes, 65392-14-4-vlan_bytes); + return -EINVAL; + } + dev->mtu = new_mtu; + + if ((interface < 2) && (cvmx_helper_interface_get_mode(interface) != CVMX_HELPER_INTERFACE_MODE_SPI)) { + int max_packet = new_mtu + 14 + 4 + vlan_bytes; /* Add ethernet header and FCS, and VLAN if configured. */ + + if (OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN58XX)) { + /* Signal errors on packets larger than the MTU */ + cvmx_write_csr(CVMX_GMXX_RXX_FRM_MAX(index, interface), max_packet); + } else { + /* Set the hardware to truncate packets larger than the MTU and + smaller the 64 bytes */ + cvmx_pip_frm_len_chkx_t frm_len_chk; + frm_len_chk.u64 = 0; + frm_len_chk.s.minlen = 64; + frm_len_chk.s.maxlen = max_packet; + cvmx_write_csr(CVMX_PIP_FRM_LEN_CHKX(interface), frm_len_chk.u64); + } + /* Set the hardware to truncate packets larger than the MTU. The + jabber register must be set to a multiple of 8 bytes, so round up */ + cvmx_write_csr(CVMX_GMXX_RXX_JABBER(index, interface), (max_packet + 7) & ~7u); + } + return 0; +} + + +/** + * Per network device initialization + * + * @param dev Device to initialize + * @return Zero on success + */ +int cvm_oct_common_init(struct net_device *dev) +{ + static int count; + char mac[8] = {0x00, 0x00, + octeon_bootinfo->mac_addr_base[0], + octeon_bootinfo->mac_addr_base[1], + octeon_bootinfo->mac_addr_base[2], + octeon_bootinfo->mac_addr_base[3], + octeon_bootinfo->mac_addr_base[4], + octeon_bootinfo->mac_addr_base[5] + count}; + cvm_oct_private_t *priv = (cvm_oct_private_t *)netdev_priv(dev); + + + /* Force the interface to use the POW send if always_use_pow was + specified or it is in the pow send list */ + if ((pow_send_group != -1) && (always_use_pow || strstr(pow_send_list, dev->name))) + priv->queue = -1; + + if (priv->queue != -1) { + dev->hard_start_xmit = cvm_oct_xmit; + if (USE_HW_TCPUDP_CHECKSUM) + dev->features |= NETIF_F_IP_CSUM; + } else + dev->hard_start_xmit = cvm_oct_xmit_pow; + count++; + + dev->get_stats = cvm_oct_common_get_stats; + dev->set_mac_address = cvm_oct_common_set_mac_address; + dev->set_multicast_list = cvm_oct_common_set_multicast_list; + dev->change_mtu = cvm_oct_common_change_mtu; + dev->do_ioctl = cvm_oct_ioctl; + dev->features |= NETIF_F_LLTX; /* We do our own locking, Linux doesn't need to */ + SET_ETHTOOL_OPS(dev, &cvm_oct_ethtool_ops); +#ifdef CONFIG_NET_POLL_CONTROLLER + dev->poll_controller = cvm_oct_poll_controller; +#endif + + cvm_oct_mdio_setup_device(dev); + dev->set_mac_address(dev, mac); + dev->change_mtu(dev, dev->mtu); + + /* Zero out stats for port so we won't mistakenly show counters from the + bootloader */ + memset(dev->get_stats(dev), 0, sizeof(struct net_device_stats)); + + return 0; +} + +void cvm_oct_common_uninit(struct net_device *dev) +{ + /* Currently nothing to do */ +} + Added: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.h Thu Apr 22 02:53:49 2010 (r207050) @@ -0,0 +1,32 @@ +/************************************************************************* +Copyright (c) 2003-2007 Cavium Networks (support@cavium.com). All rights +reserved. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Cavium Networks nor the names of + its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +This Software, including technical data, may be subject to U.S. export control laws, including the U.S. Export Administration Act and its associated regulations, and may be subject to export or import regulations in other countries. + +TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" +AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + +*************************************************************************/ + +int cvm_oct_common_init(struct net_device *dev); +void cvm_oct_common_uninit(struct net_device *dev); + Added: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-defines.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-defines.h Thu Apr 22 02:53:49 2010 (r207050) @@ -0,0 +1,108 @@ +/************************************************************************* +Copyright (c) 2003-2007 Cavium Networks (support@cavium.com). All rights +reserved. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Cavium Networks nor the names of + its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +This Software, including technical data, may be subject to U.S. export control laws, including the U.S. Export Administration Act and its associated regulations, and may be subject to export or import regulations in other countries. + +TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" +AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + +*************************************************************************/ + +/* + * A few defines are used to control the operation of this driver: + * CONFIG_CAVIUM_RESERVE32 + * This kernel config options controls the amount of memory configured + * in a wired TLB entry for all processes to share. If this is set, the + * driver will use this memory instead of kernel memory for pools. This + * allows 32bit userspace application to access the buffers, but also + * requires all received packets to be copied. + * CONFIG_CAVIUM_OCTEON_NUM_PACKET_BUFFERS + * This kernel config option allows the user to control the number of + * packet and work queue buffers allocated by the driver. If this is zero, + * the driver uses the default from below. + * USE_SKBUFFS_IN_HW + * Tells the driver to populate the packet buffers with kernel skbuffs. + * This allows the driver to receive packets without copying them. It also + * means that 32bit userspace can't access the packet buffers. + * USE_32BIT_SHARED + * This define tells the driver to allocate memory for buffers from the + * 32bit sahred region instead of the kernel memory space. + * USE_HW_TCPUDP_CHECKSUM + * Controls if the Octeon TCP/UDP checksum engine is used for packet + * output. If this is zero, the kernel will perform the checksum in + * software. + * USE_MULTICORE_RECEIVE + * Process receive interrupts on multiple cores. This spreads the network + * load across the first 8 processors. If ths is zero, only one core + * processes incomming packets. + * USE_ASYNC_IOBDMA + * Use asynchronous IO access to hardware. This uses Octeon's asynchronous + * IOBDMAs to issue IO accesses without stalling. Set this to zero + * to disable this. Note that IOBDMAs require CVMSEG. + * REUSE_SKBUFFS_WITHOUT_FREE + * Allows the TX path to free an skbuff into the FPA hardware pool. This + * can significantly improve performance for forwarding and bridging, but + * may be somewhat dangerous. Checks are made, but if any buffer is reused + * without the proper Linux cleanup, the networking stack may have very + * bizarre bugs. + */ +#ifndef CONFIG_CAVIUM_RESERVE32 +#define CONFIG_CAVIUM_RESERVE32 0 +#endif + +#if CONFIG_CAVIUM_RESERVE32 + #define USE_32BIT_SHARED 1 + #define USE_SKBUFFS_IN_HW 0 + #define REUSE_SKBUFFS_WITHOUT_FREE 0 +#else + #define USE_32BIT_SHARED 0 + #define USE_SKBUFFS_IN_HW 1 + #ifdef CONFIG_NETFILTER + #define REUSE_SKBUFFS_WITHOUT_FREE 0 + #else + #define REUSE_SKBUFFS_WITHOUT_FREE 1 + #endif +#endif + +#define INTERRUPT_LIMIT 10000 /* Max interrupts per second per core */ +/*#define INTERRUPT_LIMIT 0 *//* Don't limit the number of interrupts */ +#define USE_HW_TCPUDP_CHECKSUM 1 +#define USE_MULTICORE_RECEIVE 1 +#define USE_RED 1 /* Enable Random Early Dropping under load */ +#define USE_ASYNC_IOBDMA (CONFIG_CAVIUM_OCTEON_CVMSEG_SIZE > 0) +#define USE_10MBPS_PREAMBLE_WORKAROUND 1 /* Allow SW based preamble removal at 10Mbps to workaround PHYs giving us bad preambles */ +#define DONT_WRITEBACK(x) (x) /* Use this to have all FPA frees also tell the L2 not to write data to memory */ +/*#define DONT_WRITEBACK(x) 0 *//* Use this to not have FPA frees control L2 */ + +#define MAX_RX_PACKETS 120 /* Maximum number of packets to process per interrupt. */ +#define MAX_OUT_QUEUE_DEPTH 1000 + +#ifndef CONFIG_SMP +#undef USE_MULTICORE_RECEIVE +#define USE_MULTICORE_RECEIVE 0 +#endif + +#define IP_PROTOCOL_TCP 6 +#define IP_PROTOCOL_UDP 0x11 +#define FAU_NUM_PACKET_BUFFERS_TO_FREE (CVMX_FAU_REG_END - sizeof(uint32_t)) +#define TOTAL_NUMBER_OF_PORTS (CVMX_PIP_NUM_INPUT_PORTS+1) + Added: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-headers.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-headers.h Thu Apr 22 02:53:49 2010 (r207050) @@ -0,0 +1,42 @@ +/************************************************************************* +Copyright (c) 2003-2007 Cavium Networks (support@cavium.com). All rights +reserved. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Cavium Networks nor the names of + its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +This Software, including technical data, may be subject to U.S. export control laws, including the U.S. Export Administration Act and its associated regulations, and may be subject to export or import regulations in other countries. + +TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" +AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + +*************************************************************************/ +#ifndef __ETHERNET_HEADERS_H__ +#define __ETHERNET_HEADERS_H__ + +#include "cavium-ethernet.h" +#include "ethernet-common.h" +#include "ethernet-defines.h" +#include "ethernet-mdio.h" +#include "ethernet-mem.h" +#include "ethernet-proc.h" +#include "ethernet-rx.h" +#include "ethernet-tx.h" +#include "ethernet-util.h" + +#endif Added: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.c Thu Apr 22 02:53:49 2010 (r207050) @@ -0,0 +1,234 @@ +/************************************************************************* +Copyright (c) 2003-2007 Cavium Networks (support@cavium.com). All rights +reserved. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Cavium Networks nor the names of + its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +This Software, including technical data, may be subject to U.S. export control laws, including the U.S. Export Administration Act and its associated regulations, and may be subject to export or import regulations in other countries. + +TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" +AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + +*************************************************************************/ +#include +#include +#include +#include + +#include "cvmx-sysinfo.h" +#include "wrapper-cvmx-includes.h" +#include "ethernet-headers.h" + +DECLARE_MUTEX(mdio_sem); + + +/** + * Perform an MII read. Called by the generic MII routines + * + * @param dev Device to perform read for + * @param phy_id The MII phy id + * @param location Register location to read + * @return Result from the read or zero on failure + */ +static int cvm_oct_mdio_read(struct net_device *dev, int phy_id, int location) +{ + cvmx_smi_cmd_t smi_cmd; + cvmx_smi_rd_dat_t smi_rd; + + smi_cmd.u64 = 0; + smi_cmd.s.phy_op = 1; + smi_cmd.s.phy_adr = phy_id; + smi_cmd.s.reg_adr = location; + cvmx_write_csr(CVMX_SMI_CMD, smi_cmd.u64); + + do { + if (!in_interrupt()) + yield(); + smi_rd.u64 = cvmx_read_csr(CVMX_SMI_RD_DAT); + } while (smi_rd.s.pending); + + if (smi_rd.s.val) + return smi_rd.s.dat; + else + return 0; +} + +static int cvm_oct_mdio_dummy_read(struct net_device *dev, int phy_id, int location) +{ + return 0xffff; +} + + +/** + * Perform an MII write. Called by the generic MII routines + * + * @param dev Device to perform write for + * @param phy_id The MII phy id + * @param location Register location to write + * @param val Value to write + */ +static void cvm_oct_mdio_write(struct net_device *dev, int phy_id, int location, int val) +{ + cvmx_smi_cmd_t smi_cmd; + cvmx_smi_wr_dat_t smi_wr; + + smi_wr.u64 = 0; + smi_wr.s.dat = val; + cvmx_write_csr(CVMX_SMI_WR_DAT, smi_wr.u64); + + smi_cmd.u64 = 0; + smi_cmd.s.phy_op = 0; + smi_cmd.s.phy_adr = phy_id; + smi_cmd.s.reg_adr = location; + cvmx_write_csr(CVMX_SMI_CMD, smi_cmd.u64); + + do { + if (!in_interrupt()) + yield(); + smi_wr.u64 = cvmx_read_csr(CVMX_SMI_WR_DAT); + } while (smi_wr.s.pending); +} + +static void cvm_oct_mdio_dummy_write(struct net_device *dev, int phy_id, int location, int val) +{ +} + + +static void cvm_oct_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) +{ + strcpy(info->driver, "cavium-ethernet"); + strcpy(info->version, OCTEON_SDK_VERSION_STRING); + strcpy(info->bus_info, "Builtin"); +} + + +static int cvm_oct_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + cvm_oct_private_t *priv = (cvm_oct_private_t *)netdev_priv(dev); + int ret; + + down(&mdio_sem); + ret = mii_ethtool_gset(&priv->mii_info, cmd); + up(&mdio_sem); + + return ret; +} + + +static int cvm_oct_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + cvm_oct_private_t *priv = (cvm_oct_private_t *)netdev_priv(dev); + int ret; + + down(&mdio_sem); + ret = mii_ethtool_sset(&priv->mii_info, cmd); + up(&mdio_sem); + + return ret; +} + + +static int cvm_oct_nway_reset(struct net_device *dev) +{ + cvm_oct_private_t *priv = (cvm_oct_private_t *)netdev_priv(dev); + int ret; + + down(&mdio_sem); + ret = mii_nway_restart(&priv->mii_info); + up(&mdio_sem); + + return ret; +} + + +static u32 cvm_oct_get_link(struct net_device *dev) +{ + cvm_oct_private_t *priv = (cvm_oct_private_t *)netdev_priv(dev); + u32 ret; + + down(&mdio_sem); + ret = mii_link_ok(&priv->mii_info); + up(&mdio_sem); + + return ret; +} + + +struct ethtool_ops cvm_oct_ethtool_ops = { + .get_drvinfo = cvm_oct_get_drvinfo, + .get_settings = cvm_oct_get_settings, + .set_settings = cvm_oct_set_settings, + .nway_reset = cvm_oct_nway_reset, + .get_link = cvm_oct_get_link, + .get_sg = ethtool_op_get_sg, + .get_tx_csum = ethtool_op_get_tx_csum, +}; + + +/** + * IOCTL support for PHY control + * + * @param dev Device to change + * @param rq the request + * @param cmd the command + * @return Zero on success + */ +int cvm_oct_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +{ + cvm_oct_private_t *priv = (cvm_oct_private_t *)netdev_priv(dev); + struct mii_ioctl_data *data = if_mii(rq); + unsigned int duplex_chg; + int ret; + + down(&mdio_sem); + ret = generic_mii_ioctl(&priv->mii_info, data, cmd, &duplex_chg); + up(&mdio_sem); + + return ret; +} + + +/** + * Setup the MDIO device structures + * + * @param dev Device to setup + * + * @return Zero on success, negative on failure + */ +int cvm_oct_mdio_setup_device(struct net_device *dev) +{ + cvm_oct_private_t *priv = (cvm_oct_private_t *)netdev_priv(dev); + int phy_id = cvmx_helper_board_get_mii_address(priv->port); + if (phy_id != -1) { + priv->mii_info.dev = dev; + priv->mii_info.phy_id = phy_id; + priv->mii_info.phy_id_mask = 0xff; + priv->mii_info.supports_gmii = 1; + priv->mii_info.reg_num_mask = 0x1f; + priv->mii_info.mdio_read = cvm_oct_mdio_read; + priv->mii_info.mdio_write = cvm_oct_mdio_write; + } else { + /* Supply dummy MDIO routines so the kernel won't crash + if the user tries to read them */ + priv->mii_info.mdio_read = cvm_oct_mdio_dummy_read; + priv->mii_info.mdio_write = cvm_oct_mdio_dummy_write; + } + return 0; +} + Added: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.h Thu Apr 22 02:53:49 2010 (r207050) @@ -0,0 +1,49 @@ +/************************************************************************* +Copyright (c) 2003-2007 Cavium Networks (support@cavium.com). All rights +reserved. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Cavium Networks nor the names of + its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +This Software, including technical data, may be subject to U.S. export control laws, including the U.S. Export Administration Act and its associated regulations, and may be subject to export or import regulations in other countries. + +TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" +AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + +*************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_XFRM +#include +#include +#endif /* CONFIG_XFRM */ + +extern struct ethtool_ops cvm_oct_ethtool_ops; +int cvm_oct_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***