// SPDX-License-Identifier: GPL-2.0 /* * xtsonic.c * * (C) 2001 - 2007 Tensilica Inc. * Kevin Chea <kchea@yahoo.com> * Marc Gauthier <marc@linux-xtensa.org> * Chris Zankel <chris@zankel.net> * * (C) 1996,1998 by Thomas Bogendoerfer (tsbogend@alpha.franken.de) * * This driver is based on work from Andreas Busse, but most of * the code is rewritten. * * (C) 1995 by Andreas Busse (andy@waldorf-gmbh.de) * * A driver for the onboard Sonic ethernet controller on the XT2000.
*/
/* * According to the documentation for the Sonic ethernet controller, * EOBC should be 760 words (1520 bytes) for 32-bit applications, and, * as such, 2 words less than the buffer size. The value for RBSIZE * defined in sonic.h, however is only 1520. * * (Note that in 16-bit configurations, EOBC is 759 words (1518 bytes) and * RBSIZE 1520 bytes)
*/ #undef SONIC_RBSIZE #define SONIC_RBSIZE 1524
/* * Macros to access SONIC registers
*/ #define SONIC_READ(reg) \
(0xffff & *((volatileunsignedint *)dev->base_addr+reg))
#define SONIC_WRITE(reg,val) \
*((volatileunsignedint *)dev->base_addr+reg) = val
/* * We cannot use station (ethernet) address prefixes to detect the * sonic controller since these are board manufacturer depended. * So we check for known Silicon Revision IDs instead.
*/ staticunsignedshort known_revisions[] =
{
0x101, /* SONIC 83934 */
0xffff /* end of list */
};
staticint xtsonic_open(struct net_device *dev)
{ int retval;
retval = request_irq(dev->irq, sonic_interrupt, 0, "sonic", dev); if (retval) {
printk(KERN_ERR "%s: unable to get IRQ %d.\n",
dev->name, dev->irq); return -EAGAIN;
}
retval = sonic_open(dev); if (retval)
free_irq(dev->irq, dev); return retval;
}
if (!request_mem_region(base_addr, 0x100, xtsonic_string)) return -EBUSY;
/* * get the Silicon Revision ID. If this is one of the known * one assume that we found a SONIC ethernet controller at * the expected location.
*/
silicon_revision = SONIC_READ(SONIC_SR);
i = 0; while ((known_revisions[i] != 0xffff) &&
(known_revisions[i] != silicon_revision))
i++;
if (known_revisions[i] == 0xffff) {
pr_info("SONIC ethernet controller not found (0x%4x)\n",
silicon_revision); return -ENODEV;
}
/* * Put the sonic into software reset, then retrieve ethernet address. * Note: we are assuming that the boot-loader has initialized the cam.
*/
SONIC_WRITE(SONIC_CMD,SONIC_CR_RST);
SONIC_WRITE(SONIC_DCR,
SONIC_DCR_WC0|SONIC_DCR_DW|SONIC_DCR_LBR|SONIC_DCR_SBUS);
SONIC_WRITE(SONIC_CEP,0);
SONIC_WRITE(SONIC_IMR,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.