// SPDX-License-Identifier: GPL-2.0-or-later /* * drivers/net/ethernet/ibm/emac/rgmii.c * * Driver for PowerPC 4xx on-chip ethernet controller, RGMII bridge support. * * Copyright 2007 Benjamin Herrenschmidt, IBM Corp. * <benh@kernel.crashing.org> * * Based on the arch/ppc version of the driver: * * Copyright (c) 2004, 2005 Zultys Technologies. * Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net> * * Based on original work by * Matt Porter <mporter@kernel.crashing.org> * Copyright 2004 MontaVista Software, Inc.
*/ #include <linux/slab.h> #include <linux/kernel.h> #include <linux/ethtool.h> #include <linux/of.h> #include <linux/of_address.h> #include <linux/platform_device.h> #include <asm/io.h>
#include"emac.h" #include"debug.h"
// XXX FIXME: Axon seems to support a subset of the RGMII, we // thus need to take that into account and possibly change some // of the bit settings below that don't seem to quite match the // AXON spec
staticinline u32 rgmii_mode_mask(int mode, int input)
{ switch (mode) { case PHY_INTERFACE_MODE_RGMII: case PHY_INTERFACE_MODE_RGMII_ID: case PHY_INTERFACE_MODE_RGMII_RXID: case PHY_INTERFACE_MODE_RGMII_TXID: return RGMII_FER_RGMII(input); case PHY_INTERFACE_MODE_TBI: return RGMII_FER_TBI(input); case PHY_INTERFACE_MODE_GMII: return RGMII_FER_GMII(input); case PHY_INTERFACE_MODE_MII: return RGMII_FER_MII(input); case PHY_INTERFACE_MODE_RTBI: return RGMII_FER_RTBI(input); default:
BUG();
}
}
int rgmii_attach(struct platform_device *ofdev, int input, int mode)
{ struct rgmii_instance *dev = platform_get_drvdata(ofdev); struct rgmii_regs __iomem *p = dev->base;
RGMII_DBG(dev, "attach(%d)" NL, input);
/* Check if we need to attach to a RGMII */ if (input < 0 || !rgmii_valid_mode(mode)) {
printk(KERN_ERR "%pOF: unsupported settings !\n",
ofdev->dev.of_node); return -ENODEV;
}
mutex_lock(&dev->lock);
/* Enable this input */
out_be32(&p->fer, in_be32(&p->fer) | rgmii_mode_mask(mode, input));
printk(KERN_NOTICE "%pOF: input %d in %s mode\n",
ofdev->dev.of_node, input, phy_modes(mode));
hdr->version = 0;
hdr->index = 0; /* for now, are there chips with more than one * rgmii ? if yes, then we'll add a cell_index * like we do for emac
*/
memcpy_fromio(regs, dev->base, sizeof(struct rgmii_regs)); return regs + 1;
}
staticint rgmii_probe(struct platform_device *ofdev)
{ struct rgmii_instance *dev; int err;
dev = devm_kzalloc(&ofdev->dev, sizeof(struct rgmii_instance),
GFP_KERNEL); if (!dev) return -ENOMEM;
err = devm_mutex_init(&ofdev->dev, &dev->lock); if (err) return err;
/* Check for RGMII flags */ if (of_property_read_bool(ofdev->dev.of_node, "has-mdio"))
dev->flags |= EMAC_RGMII_FLAG_HAS_MDIO;
/* CAB lacks the right properties, fix this up */ if (of_device_is_compatible(ofdev->dev.of_node, "ibm,rgmii-axon"))
dev->flags |= EMAC_RGMII_FLAG_HAS_MDIO;
DBG2(dev, " Boot FER = 0x%08x, SSR = 0x%08x\n",
in_be32(&dev->base->fer), in_be32(&dev->base->ssr));
/* Disable all inputs by default */
out_be32(&dev->base->fer, 0);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.