ethernet-common.c (215959) | ethernet-common.c (215974) |
---|---|
1/************************************************************************* 2Copyright (c) 2003-2007 Cavium Networks (support@cavium.com). All rights 3reserved. 4 5 6Redistribution and use in source and binary forms, with or without 7modification, are permitted provided that the following conditions are 8met: --- 14 unchanged lines hidden (view full) --- 23This 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. 24 25TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" 26AND 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. 27 28*************************************************************************/ 29 30#include <sys/cdefs.h> | 1/************************************************************************* 2Copyright (c) 2003-2007 Cavium Networks (support@cavium.com). All rights 3reserved. 4 5 6Redistribution and use in source and binary forms, with or without 7modification, are permitted provided that the following conditions are 8met: --- 14 unchanged lines hidden (view full) --- 23This 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. 24 25TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" 26AND 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. 27 28*************************************************************************/ 29 30#include <sys/cdefs.h> |
31__FBSDID("$FreeBSD: head/sys/mips/cavium/octe/ethernet-common.c 215959 2010-11-28 00:26:08Z jmallett $"); | 31__FBSDID("$FreeBSD: head/sys/mips/cavium/octe/ethernet-common.c 215974 2010-11-28 05:57:24Z jmallett $"); |
32 33#include <sys/param.h> 34#include <sys/systm.h> 35#include <sys/bus.h> 36#include <sys/endian.h> 37#include <sys/kernel.h> 38#include <sys/mbuf.h> 39#include <sys/socket.h> --- 4 unchanged lines hidden (view full) --- 44#include "wrapper-cvmx-includes.h" 45#include "ethernet-headers.h" 46 47extern int octeon_is_simulation(void); 48extern cvmx_bootinfo_t *octeon_bootinfo; 49 50 51/** | 32 33#include <sys/param.h> 34#include <sys/systm.h> 35#include <sys/bus.h> 36#include <sys/endian.h> 37#include <sys/kernel.h> 38#include <sys/mbuf.h> 39#include <sys/socket.h> --- 4 unchanged lines hidden (view full) --- 44#include "wrapper-cvmx-includes.h" 45#include "ethernet-headers.h" 46 47extern int octeon_is_simulation(void); 48extern cvmx_bootinfo_t *octeon_bootinfo; 49 50 51/** |
52 * Get the low level ethernet statistics 53 * 54 * @param dev Device to get the statistics from 55 * @return Pointer to the statistics 56 */ 57#if 0 58static struct ifnet_stats *cvm_oct_common_get_stats(struct ifnet *ifp) 59{ 60 cvmx_pip_port_status_t rx_status; 61 cvmx_pko_port_status_t tx_status; 62 cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; 63 64 if (priv->port < CVMX_PIP_NUM_INPUT_PORTS) { 65 if (octeon_is_simulation()) { 66 /* The simulator doesn't support statistics */ 67 memset(&rx_status, 0, sizeof(rx_status)); 68 memset(&tx_status, 0, sizeof(tx_status)); 69 } else { 70 cvmx_pip_get_port_status(priv->port, 1, &rx_status); 71 cvmx_pko_get_port_status(priv->port, 1, &tx_status); 72 } 73 74 priv->stats.rx_packets += rx_status.inb_packets; 75 priv->stats.tx_packets += tx_status.packets; 76 priv->stats.rx_bytes += rx_status.inb_octets; 77 priv->stats.tx_bytes += tx_status.octets; 78 priv->stats.multicast += rx_status.multicast_packets; 79 priv->stats.rx_crc_errors += rx_status.inb_errors; 80 priv->stats.rx_frame_errors += rx_status.fcs_align_err_packets; 81 82 /* The drop counter must be incremented atomically since the RX 83 tasklet also increments it */ 84#ifdef CONFIG_64BIT 85 cvmx_atomic_add64_nosync(&priv->stats.rx_dropped, rx_status.dropped_packets); 86#else 87 cvmx_atomic_add32_nosync((int32_t *)&priv->stats.rx_dropped, rx_status.dropped_packets); 88#endif 89 } 90 91 return &priv->stats; 92} 93#endif 94 95 96/** | |
97 * Set the multicast list. Currently unimplemented. 98 * 99 * @param dev Device to work on 100 */ 101void cvm_oct_common_set_multicast_list(struct ifnet *ifp) 102{ 103 cvmx_gmxx_prtx_cfg_t gmx_cfg; 104 cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; --- 109 unchanged lines hidden (view full) --- 214 jabber register must be set to a multiple of 8 bytes, so round up */ 215 cvmx_write_csr(CVMX_GMXX_RXX_JABBER(index, interface), (max_packet + 7) & ~7u); 216 } 217 return 0; 218} 219 220 221/** | 52 * Set the multicast list. Currently unimplemented. 53 * 54 * @param dev Device to work on 55 */ 56void cvm_oct_common_set_multicast_list(struct ifnet *ifp) 57{ 58 cvmx_gmxx_prtx_cfg_t gmx_cfg; 59 cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; --- 109 unchanged lines hidden (view full) --- 169 jabber register must be set to a multiple of 8 bytes, so round up */ 170 cvmx_write_csr(CVMX_GMXX_RXX_JABBER(index, interface), (max_packet + 7) & ~7u); 171 } 172 return 0; 173} 174 175 176/** |
177 * Enable port. 178 */ 179int cvm_oct_common_open(struct ifnet *ifp) 180{ 181 cvmx_gmxx_prtx_cfg_t gmx_cfg; 182 cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; 183 int interface = INTERFACE(priv->port); 184 int index = INDEX(priv->port); 185 cvmx_helper_link_info_t link_info; 186 187 gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface)); 188 gmx_cfg.s.en = 1; 189 cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64); 190 191 if (!octeon_is_simulation()) { 192 link_info = cvmx_helper_link_get(priv->port); 193 if (!link_info.s.link_up) 194 if_link_state_change(ifp, LINK_STATE_DOWN); 195 else 196 if_link_state_change(ifp, LINK_STATE_UP); 197 } 198 199 return 0; 200} 201 202 203/** 204 * Disable port. 205 */ 206int cvm_oct_common_stop(struct ifnet *ifp) 207{ 208 cvmx_gmxx_prtx_cfg_t gmx_cfg; 209 cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; 210 int interface = INTERFACE(priv->port); 211 int index = INDEX(priv->port); 212 213 gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface)); 214 gmx_cfg.s.en = 0; 215 cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64); 216 return 0; 217} 218 219/** 220 * Poll for link status change. 221 */ 222void cvm_oct_common_poll(struct ifnet *ifp) 223{ 224 cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; 225 cvmx_helper_link_info_t link_info; 226 227 link_info = cvmx_helper_link_get(priv->port); 228 if (link_info.u64 == priv->link_info) 229 return; 230 231 link_info = cvmx_helper_link_autoconf(priv->port); 232 priv->link_info = link_info.u64; 233 priv->need_link_update = 1; 234} 235 236 237/** |
|
222 * Per network device initialization 223 * 224 * @param dev Device to initialize 225 * @return Zero on success 226 */ 227int cvm_oct_common_init(struct ifnet *ifp) 228{ 229 static int count; --- 5 unchanged lines hidden (view full) --- 235 octeon_bootinfo->mac_addr_base[4], 236 octeon_bootinfo->mac_addr_base[5] + count}; 237 cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; 238 239 ifp->if_mtu = ETHERMTU; 240 241 count++; 242 | 238 * Per network device initialization 239 * 240 * @param dev Device to initialize 241 * @return Zero on success 242 */ 243int cvm_oct_common_init(struct ifnet *ifp) 244{ 245 static int count; --- 5 unchanged lines hidden (view full) --- 251 octeon_bootinfo->mac_addr_base[4], 252 octeon_bootinfo->mac_addr_base[5] + count}; 253 cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; 254 255 ifp->if_mtu = ETHERMTU; 256 257 count++; 258 |
243#if 0 244 ifp->get_stats = cvm_oct_common_get_stats; 245#ifdef CONFIG_NET_POLL_CONTROLLER 246 ifp->poll_controller = cvm_oct_poll_controller; 247#endif 248#endif 249 | |
250 cvm_oct_mdio_setup_device(ifp); 251 252 cvm_oct_common_set_mac_address(ifp, mac); 253 cvm_oct_common_change_mtu(ifp, ifp->if_mtu); 254 | 259 cvm_oct_mdio_setup_device(ifp); 260 261 cvm_oct_common_set_mac_address(ifp, mac); 262 cvm_oct_common_change_mtu(ifp, ifp->if_mtu); 263 |
255#if 0 256 /* Zero out stats for port so we won't mistakenly show counters from the 257 bootloader */ 258 memset(ifp->get_stats(ifp), 0, sizeof(struct ifnet_stats)); 259#endif 260 | |
261 /* 262 * Do any last-minute board-specific initialization. 263 */ 264 switch (cvmx_sysinfo_get()->board_type) { 265#if defined(OCTEON_VENDOR_LANNER) 266 case CVMX_BOARD_TYPE_CUST_LANNER_MR320: 267 if (priv->phy_id == 16) 268 cvm_oct_mv88e61xx_setup_device(ifp); --- 16 unchanged lines hidden --- | 264 /* 265 * Do any last-minute board-specific initialization. 266 */ 267 switch (cvmx_sysinfo_get()->board_type) { 268#if defined(OCTEON_VENDOR_LANNER) 269 case CVMX_BOARD_TYPE_CUST_LANNER_MR320: 270 if (priv->phy_id == 16) 271 cvm_oct_mv88e61xx_setup_device(ifp); --- 16 unchanged lines hidden --- |