![Eugene Surovegin](/assets/img/avatar_default.png)
This patch replaces current PowerPC 4xx EMAC driver with new, re-written from the scratch version. This patch is quite big (~234K) because there is virtualy 0% of common code between old and new version. New driver uses NAPI, it solves stability problems under heavy packet load and low memory, corrects chip register access and fixes numerous small bugs I don't even remember now. This patch has been tested on all supported in 2.6 PPC 4xx boards. It's been used in production for almost a year now on custom 4xx hardware. PPC32 specific parts are already upstream. Patch was acked by the current EMAC driver maintainer (Matt Porter). I will be maintaining this new version. Signed-off-by: Eugene Surovegin <ebs@ebshome.net> -- Kconfig | 72 ibm_emac/Makefile | 13 ibm_emac/ibm_emac.h | 418 +++-- ibm_emac/ibm_emac_core.c | 3414 ++++++++++++++++++++++++---------------------- ibm_emac/ibm_emac_core.h | 313 ++-- ibm_emac/ibm_emac_debug.c | 377 ++--- ibm_emac/ibm_emac_debug.h | 63 ibm_emac/ibm_emac_mal.c | 674 +++++---- ibm_emac/ibm_emac_mal.h | 336 +++- ibm_emac/ibm_emac_phy.c | 335 ++-- ibm_emac/ibm_emac_phy.h | 105 - ibm_emac/ibm_emac_rgmii.c | 201 ++ ibm_emac/ibm_emac_rgmii.h | 68 ibm_emac/ibm_emac_tah.c | 111 + ibm_emac/ibm_emac_tah.h | 96 - ibm_emac/ibm_emac_zmii.c | 255 +++ ibm_emac/ibm_emac_zmii.h | 114 - 17 files changed, 4114 insertions(+), 2851 deletions(-) Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
84 lines
2.3 KiB
C
84 lines
2.3 KiB
C
/*
|
|
* drivers/net/ibm_emac/ibm_emac_zmii.h
|
|
*
|
|
* Driver for PowerPC 4xx on-chip ethernet controller, ZMII bridge support.
|
|
*
|
|
* Copyright (c) 2004, 2005 Zultys Technologies.
|
|
* Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
|
|
*
|
|
* Based on original work by
|
|
* Armin Kuster <akuster@mvista.com>
|
|
* Copyright 2001 MontaVista Softare Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
*/
|
|
#ifndef _IBM_EMAC_ZMII_H_
|
|
#define _IBM_EMAC_ZMII_H_
|
|
|
|
#include <linux/config.h>
|
|
#include <linux/init.h>
|
|
#include <asm/ocp.h>
|
|
|
|
/* ZMII bridge registers */
|
|
struct zmii_regs {
|
|
u32 fer; /* Function enable reg */
|
|
u32 ssr; /* Speed select reg */
|
|
u32 smiirs; /* SMII status reg */
|
|
};
|
|
|
|
/* ZMII device */
|
|
struct ibm_ocp_zmii {
|
|
struct zmii_regs *base;
|
|
int mode; /* subset of PHY_MODE_XXXX */
|
|
int users; /* number of EMACs using this ZMII bridge */
|
|
u32 fer_save; /* FER value left by firmware */
|
|
};
|
|
|
|
#ifdef CONFIG_IBM_EMAC_ZMII
|
|
int zmii_attach(void *emac) __init;
|
|
|
|
void __zmii_fini(struct ocp_device *ocpdev, int input) __exit;
|
|
static inline void zmii_fini(struct ocp_device *ocpdev, int input)
|
|
{
|
|
if (ocpdev)
|
|
__zmii_fini(ocpdev, input);
|
|
}
|
|
|
|
void __zmii_enable_mdio(struct ocp_device *ocpdev, int input);
|
|
static inline void zmii_enable_mdio(struct ocp_device *ocpdev, int input)
|
|
{
|
|
if (ocpdev)
|
|
__zmii_enable_mdio(ocpdev, input);
|
|
}
|
|
|
|
void __zmii_set_speed(struct ocp_device *ocpdev, int input, int speed);
|
|
static inline void zmii_set_speed(struct ocp_device *ocpdev, int input,
|
|
int speed)
|
|
{
|
|
if (ocpdev)
|
|
__zmii_set_speed(ocpdev, input, speed);
|
|
}
|
|
|
|
int __zmii_get_regs_len(struct ocp_device *ocpdev);
|
|
static inline int zmii_get_regs_len(struct ocp_device *ocpdev)
|
|
{
|
|
return ocpdev ? __zmii_get_regs_len(ocpdev) : 0;
|
|
}
|
|
|
|
void *zmii_dump_regs(struct ocp_device *ocpdev, void *buf);
|
|
|
|
#else
|
|
# define zmii_attach(x) 0
|
|
# define zmii_fini(x,y) ((void)0)
|
|
# define zmii_enable_mdio(x,y) ((void)0)
|
|
# define zmii_set_speed(x,y,z) ((void)0)
|
|
# define zmii_get_regs_len(x) 0
|
|
# define zmii_dump_regs(x,buf) (buf)
|
|
#endif /* !CONFIG_IBM_EMAC_ZMII */
|
|
|
|
#endif /* _IBM_EMAC_ZMII_H_ */
|