ethernet-xaui.c revision f696a10838ffab85e5bc07e7cff0d0e1870a30d7
180ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney/**********************************************************************
280ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * Author: Cavium Networks
380ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney *
480ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * Contact: support@caviumnetworks.com
580ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * This file is part of the OCTEON SDK
680ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney *
780ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * Copyright (c) 2003-2007 Cavium Networks
880ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney *
980ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * This file is free software; you can redistribute it and/or modify
1080ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * it under the terms of the GNU General Public License, Version 2, as
1180ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * published by the Free Software Foundation.
1280ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney *
1380ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * This file is distributed in the hope that it will be useful, but
1480ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
1580ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
1680ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * NONINFRINGEMENT.  See the GNU General Public License for more
1780ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * details.
1880ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney *
1980ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * You should have received a copy of the GNU General Public License
2080ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * along with this file; if not, write to the Free Software
2180ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
2280ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * or visit http://www.gnu.org/licenses/.
2380ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney *
2480ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * This file may also be available under a different license from Cavium.
2580ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney * Contact Cavium Networks for more information
2680ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney**********************************************************************/
2780ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney#include <linux/kernel.h>
2880ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney#include <linux/netdevice.h>
2980ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney#include <linux/mii.h>
3080ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney#include <net/dst.h>
3180ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
3280ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney#include <asm/octeon/octeon.h>
3380ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
3480ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney#include "ethernet-defines.h"
3580ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney#include "octeon-ethernet.h"
3680ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney#include "ethernet-util.h"
3780ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
3880ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney#include "cvmx-helper.h"
3980ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
4080ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney#include "cvmx-gmxx-defs.h"
4180ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
42f696a10838ffab85e5bc07e7cff0d0e1870a30d7David Daneyint cvm_oct_xaui_open(struct net_device *dev)
4380ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney{
4480ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	union cvmx_gmxx_prtx_cfg gmx_cfg;
4580ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	struct octeon_ethernet *priv = netdev_priv(dev);
4680ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	int interface = INTERFACE(priv->port);
4780ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	int index = INDEX(priv->port);
4880ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	cvmx_helper_link_info_t link_info;
4980ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
5080ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
5180ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	gmx_cfg.s.en = 1;
5280ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
5380ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
5480ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	if (!octeon_is_simulation()) {
5580ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney		link_info = cvmx_helper_link_get(priv->port);
5680ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney		if (!link_info.s.link_up)
5780ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney			netif_carrier_off(dev);
5880ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	}
5980ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	return 0;
6080ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney}
6180ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
62f696a10838ffab85e5bc07e7cff0d0e1870a30d7David Daneyint cvm_oct_xaui_stop(struct net_device *dev)
6380ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney{
6480ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	union cvmx_gmxx_prtx_cfg gmx_cfg;
6580ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	struct octeon_ethernet *priv = netdev_priv(dev);
6680ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	int interface = INTERFACE(priv->port);
6780ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	int index = INDEX(priv->port);
6880ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
6980ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
7080ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	gmx_cfg.s.en = 0;
7180ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
7280ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	return 0;
7380ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney}
7480ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
7580ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daneystatic void cvm_oct_xaui_poll(struct net_device *dev)
7680ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney{
7780ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	struct octeon_ethernet *priv = netdev_priv(dev);
7880ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	cvmx_helper_link_info_t link_info;
7980ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
8080ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	link_info = cvmx_helper_link_get(priv->port);
8180ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	if (link_info.u64 == priv->link_info)
8280ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney		return;
8380ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
8480ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	link_info = cvmx_helper_link_autoconf(priv->port);
8580ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	priv->link_info = link_info.u64;
8680ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
8780ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	/* Tell Linux */
8880ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	if (link_info.s.link_up) {
8980ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
9080ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney		if (!netif_carrier_ok(dev))
9180ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney			netif_carrier_on(dev);
9280ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney		if (priv->queue != -1)
9380ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney			DEBUGPRINT
9480ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney			    ("%s: %u Mbps %s duplex, port %2d, queue %2d\n",
9580ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney			     dev->name, link_info.s.speed,
9680ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney			     (link_info.s.full_duplex) ? "Full" : "Half",
9780ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney			     priv->port, priv->queue);
9880ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney		else
9980ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney			DEBUGPRINT("%s: %u Mbps %s duplex, port %2d, POW\n",
10080ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney				   dev->name, link_info.s.speed,
10180ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney				   (link_info.s.full_duplex) ? "Full" : "Half",
10280ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney				   priv->port);
10380ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	} else {
10480ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney		if (netif_carrier_ok(dev))
10580ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney			netif_carrier_off(dev);
10680ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney		DEBUGPRINT("%s: Link down\n", dev->name);
10780ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	}
10880ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney}
10980ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
11080ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daneyint cvm_oct_xaui_init(struct net_device *dev)
11180ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney{
11280ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	struct octeon_ethernet *priv = netdev_priv(dev);
11380ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	cvm_oct_common_init(dev);
114f696a10838ffab85e5bc07e7cff0d0e1870a30d7David Daney	dev->netdev_ops->ndo_stop(dev);
11580ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	if (!octeon_is_simulation())
11680ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney		priv->poll = cvm_oct_xaui_poll;
11780ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
11880ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	return 0;
11980ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney}
12080ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney
12180ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daneyvoid cvm_oct_xaui_uninit(struct net_device *dev)
12280ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney{
12380ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney	cvm_oct_common_uninit(dev);
12480ff0fd3ab6451407a20c19b80c1643c4a6d6434David Daney}
125