Deleted Added
full compact
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 ---