Merge branch 'upstream-fixes'
This commit is contained in:
commit
62d65a8062
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -1,28 +1,8 @@
|
||||
//
|
||||
// <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
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -2300,14 +2300,12 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev)
|
||||
td->dma_hi = map >> 32;
|
||||
|
||||
if (skb->ip_summed == CHECKSUM_HW) {
|
||||
const struct iphdr *ip
|
||||
= (const struct iphdr *) (skb->data + ETH_HLEN);
|
||||
int offset = skb->h.raw - skb->data;
|
||||
|
||||
/* This seems backwards, but it is what the sk98lin
|
||||
* does. Looks like hardware is wrong?
|
||||
*/
|
||||
if (ip->protocol == IPPROTO_UDP
|
||||
if (skb->h.ipiph->protocol == IPPROTO_UDP
|
||||
&& hw->chip_rev == 0 && hw->chip_id == CHIP_ID_YUKON)
|
||||
control = BMU_TCP_CHECK;
|
||||
else
|
||||
|
@ -2755,8 +2755,8 @@ static struct net_device *_init_airo_card( unsigned short irq, int port,
|
||||
SET_NETDEV_DEV(dev, dmdev);
|
||||
|
||||
|
||||
if (test_bit(FLAG_MPI,&ai->flags))
|
||||
reset_card (dev, 1);
|
||||
msleep(400);
|
||||
|
||||
rc = request_irq( dev->irq, airo_interrupt, SA_SHIRQ, dev->name, dev );
|
||||
if (rc) {
|
||||
|
@ -3512,9 +3512,8 @@ static int orinoco_ioctl_setpower(struct net_device *dev,
|
||||
break;
|
||||
default:
|
||||
err = -EINVAL;
|
||||
}
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (prq->flags & IW_POWER_TIMEOUT) {
|
||||
priv->pm_on = 1;
|
||||
|
Loading…
Reference in New Issue
Block a user