Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 62d65a80 authored by Jeff Garzik's avatar Jeff Garzik
Browse files

Merge branch 'upstream-fixes'

parents f89b2321 ea182d4a
Loading
Loading
Loading
Loading
+29 −9
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@
 */

#define DRV_NAME        "emac"
#define DRV_VERSION     "3.53"
#define DRV_VERSION     "3.54"
#define DRV_DESC        "PPC 4xx OCP EMAC driver"

MODULE_DESCRIPTION(DRV_DESC);
@@ -158,6 +158,14 @@ static inline void emac_report_timeout_error(struct ocp_enet_private *dev,
#define PHY_POLL_LINK_ON	HZ
#define PHY_POLL_LINK_OFF	(HZ / 5)

/* Graceful stop timeouts in us. 
 * We should allow up to 1 frame time (full-duplex, ignoring collisions) 
 */
#define STOP_TIMEOUT_10		1230	
#define STOP_TIMEOUT_100	124
#define STOP_TIMEOUT_1000	13
#define STOP_TIMEOUT_1000_JUMBO	73

/* Please, keep in sync with struct ibm_emac_stats/ibm_emac_error_stats */
static const char emac_stats_keys[EMAC_ETHTOOL_STATS_COUNT][ETH_GSTRING_LEN] = {
	"rx_packets", "rx_bytes", "tx_packets", "tx_bytes", "rx_packets_csum",
@@ -222,10 +230,12 @@ static void emac_tx_disable(struct ocp_enet_private *dev)

	r = in_be32(&p->mr0);
	if (r & EMAC_MR0_TXE) {
		int n = 300;
		int n = dev->stop_timeout;
		out_be32(&p->mr0, r & ~EMAC_MR0_TXE);
		while (!(in_be32(&p->mr0) & EMAC_MR0_TXI) && n)
		while (!(in_be32(&p->mr0) & EMAC_MR0_TXI) && n) {
			udelay(1);
			--n;
		}	
		if (unlikely(!n))
			emac_report_timeout_error(dev, "TX disable timeout");
	}
@@ -248,9 +258,11 @@ static void emac_rx_enable(struct ocp_enet_private *dev)
	if (!(r & EMAC_MR0_RXE)) {
		if (unlikely(!(r & EMAC_MR0_RXI))) {
			/* Wait if previous async disable is still in progress */
			int n = 100;
			while (!(r = in_be32(&p->mr0) & EMAC_MR0_RXI) && n)
			int n = dev->stop_timeout;
			while (!(r = in_be32(&p->mr0) & EMAC_MR0_RXI) && n) {
				udelay(1);
				--n;
			}	
			if (unlikely(!n))
				emac_report_timeout_error(dev,
							  "RX disable timeout");
@@ -273,10 +285,12 @@ static void emac_rx_disable(struct ocp_enet_private *dev)

	r = in_be32(&p->mr0);
	if (r & EMAC_MR0_RXE) {
		int n = 300;
		int n = dev->stop_timeout;
		out_be32(&p->mr0, r & ~EMAC_MR0_RXE);
		while (!(in_be32(&p->mr0) & EMAC_MR0_RXI) && n)
		while (!(in_be32(&p->mr0) & EMAC_MR0_RXI) && n) {
			udelay(1);
			--n;
		}	
		if (unlikely(!n))
			emac_report_timeout_error(dev, "RX disable timeout");
	}
@@ -395,6 +409,7 @@ static int emac_configure(struct ocp_enet_private *dev)
	r = EMAC_MR1_BASE(emac_opb_mhz()) | EMAC_MR1_VLE | EMAC_MR1_IST;
	if (dev->phy.duplex == DUPLEX_FULL)
		r |= EMAC_MR1_FDE;
	dev->stop_timeout = STOP_TIMEOUT_10;
	switch (dev->phy.speed) {
	case SPEED_1000:
		if (emac_phy_gpcs(dev->phy.mode)) {
@@ -410,11 +425,15 @@ static int emac_configure(struct ocp_enet_private *dev)
		r |= EMAC_MR1_RFS_16K;
		gige = 1;

		if (dev->ndev->mtu > ETH_DATA_LEN)
		if (dev->ndev->mtu > ETH_DATA_LEN) {
			r |= EMAC_MR1_JPSM;
			dev->stop_timeout = STOP_TIMEOUT_1000_JUMBO;
		} else
			dev->stop_timeout = STOP_TIMEOUT_1000;
		break;
	case SPEED_100:
		r |= EMAC_MR1_MF_100;
		dev->stop_timeout = STOP_TIMEOUT_100;
		/* Fall through */
	default:
		r |= EMAC_MR1_RFS_4K;
@@ -2048,6 +2067,7 @@ static int __init emac_probe(struct ocp_device *ocpdev)
	dev->phy.duplex = DUPLEX_FULL;
	dev->phy.autoneg = AUTONEG_DISABLE;
	dev->phy.pause = dev->phy.asym_pause = 0;
	dev->stop_timeout = STOP_TIMEOUT_100;
	init_timer(&dev->link_timer);
	dev->link_timer.function = emac_link_timer;
	dev->link_timer.data = (unsigned long)dev;
+2 −0
Original line number Diff line number Diff line
@@ -189,6 +189,8 @@ struct ocp_enet_private {
	struct timer_list		link_timer;
	int				reset_failed;

	int				stop_timeout;	/* in us */

	struct ibm_emac_error_stats	estats;
	struct net_device_stats		nstats;

+2 −2
Original line number Diff line number Diff line
@@ -296,7 +296,7 @@ static int __init jazz_sonic_init_module(void)
	}

	jazz_sonic_device = platform_device_alloc(jazz_sonic_string, 0);
	if (!jazz_sonnic_device)
	if (!jazz_sonic_device)
		goto out_unregister;

	if (platform_device_add(jazz_sonic_device)) {
@@ -307,7 +307,7 @@ static int __init jazz_sonic_init_module(void)
	return 0;

out_unregister:
	driver_unregister(&jazz_sonic_driver);
	platform_driver_unregister(&jazz_sonic_driver);

	return -ENOMEM;
}
+5 −25
Original line number Diff line number Diff line
//
// <COPYRIGHT CLASS="1B" YEAR="2005">
// Unpublished work (c) MIPS Technologies, Inc.  All rights reserved.
// Unpublished rights reserved under the copyright laws of the U.S.A. and
//  other countries.
//
// PROPRIETARY / SECRET CONFIDENTIAL INFORMATION OF MIPS TECHNOLOGIES, INC.
// FOR INTERNAL USE ONLY.
//
// Under no circumstances (contract or otherwise) may this information be
// disclosed to, or copied, modified or used by anyone other than employees
// or contractors of MIPS Technologies having a need to know.
// </COPYRIGHT>
//
//++
// File: MIPS_Net.h
//
// Description:
//   The definition of the emulated MIPSNET device's interface.
//
// Notes: This include file needs to work from a Linux device drivers.
//
//--
//

/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 */
#ifndef __MIPSNET_H
#define __MIPSNET_H

+11 −21
Original line number Diff line number Diff line
@@ -131,10 +131,9 @@ typedef struct local_info_t {
    u_short tx_queue_len;
    cardtype_t cardtype;
    u_short sent;
    u_char mc_filter[8];
} local_info_t;

#define MC_FILTERBREAK 8
#define MC_FILTERBREAK 64

/*====================================================================*/
/* 
@@ -1005,15 +1004,8 @@ static void fjn_reset(struct net_device *dev)
    for (i = 0; i < 6; i++) 
        outb(dev->dev_addr[i], ioaddr + NODE_ID + i);

    /* Switch to bank 1 */
    if (lp->cardtype == MBH10302)
	outb(BANK_1, ioaddr + CONFIG_1);
    else
	outb(BANK_1U, ioaddr + CONFIG_1);

    /* set the multicast table to accept none. */
    for (i = 0; i < 8; i++) 
        outb(0x00, ioaddr + MAR_ADR + i);
    /* (re)initialize the multicast table */
    set_rx_mode(dev);

    /* Switch to bank 2 (runtime mode) */
    if (lp->cardtype == MBH10302)
@@ -1264,11 +1256,11 @@ static struct net_device_stats *fjn_get_stats(struct net_device *dev)
static void set_rx_mode(struct net_device *dev)
{
    kio_addr_t ioaddr = dev->base_addr;
    struct local_info_t *lp = netdev_priv(dev);
    u_char mc_filter[8];		 /* Multicast hash filter */
    u_long flags;
    int i;
    
    int saved_bank;
    int saved_config_0 = inb(ioaddr + CONFIG_0);
     
    local_irq_save(flags); 
@@ -1306,15 +1298,13 @@ static void set_rx_mode(struct net_device *dev)
	outb(2, ioaddr + RX_MODE);	/* Use normal mode. */
    }

    if (memcmp(mc_filter, lp->mc_filter, sizeof(mc_filter))) {
	int saved_bank = inb(ioaddr + CONFIG_1);
    /* Switch to bank 1 and set the multicast table. */
    saved_bank = inb(ioaddr + CONFIG_1);
    outb(0xe4, ioaddr + CONFIG_1);

    for (i = 0; i < 8; i++)
	outb(mc_filter[i], ioaddr + MAR_ADR + i);
	memcpy(lp->mc_filter, mc_filter, sizeof(mc_filter));
    outb(saved_bank, ioaddr + CONFIG_1);
    }

    outb(saved_config_0, ioaddr + CONFIG_0);

Loading