Merge branch 'upstream-fixes'
authorJeff Garzik <jgarzik@pobox.com>
Thu, 1 Dec 2005 09:51:26 +0000 (04:51 -0500)
committerJeff Garzik <jgarzik@pobox.com>
Thu, 1 Dec 2005 09:51:26 +0000 (04:51 -0500)
drivers/net/ibm_emac/ibm_emac_core.c
drivers/net/ibm_emac/ibm_emac_core.h
drivers/net/jazzsonic.c
drivers/net/mipsnet.h
drivers/net/pcmcia/fmvj18x_cs.c
drivers/net/skge.c
drivers/net/wireless/airo.c
drivers/net/wireless/orinoco.c

index eb7d6947871555812408a40aa7e0c6fba697275e..1da8a66f91e115cf913f6c0492c3c2187cd6be75 100644 (file)
@@ -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)) {
@@ -409,12 +424,16 @@ static int emac_configure(struct ocp_enet_private *dev)
                        r |= EMAC_MR1_MF_1000;
                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;
index e9b44d030ac339ee0a3c4682ae0ed45ba077250d..911abbaf471b509187b0b187905a18216ba05b0c 100644 (file)
@@ -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;
 
index b039bd89ceb953ee88c5150ae1329b1913c12cd2..272d331d29cd5a6a6363861ca0b1f91cba5ca33a 100644 (file)
@@ -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;
 }
index 878535953cb13d8b0f24077839f5ce7a65034e9b..026c732024c99e8dd7708f6291732682af34976c 100644 (file)
@@ -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
 
index 384a736a0d2f820f5c6a7fcce3306d8e6ff04264..356f509092221de4b610f5be6aaf52227df975a6 100644 (file)
@@ -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. */
-       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);
-    }
+    /* 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);
+    outb(saved_bank, ioaddr + CONFIG_1);
 
     outb(saved_config_0, ioaddr + CONFIG_0);
 
index 596c93b12daad126b18e9ae305bd2c1c8f695687..716467879b9c5e24b254219fc6916d09888dfa05 100644 (file)
@@ -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
index 6c4aa7b6a21ba52fe9200f1c11d13c2028521632..ee866fd6957de2cf9ed0f3b75a9ca37971c4534b 100644 (file)
@@ -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);
+       reset_card (dev, 1);
+       msleep(400);
 
        rc = request_irq( dev->irq, airo_interrupt, SA_SHIRQ, dev->name, dev );
        if (rc) {
index 488ab06fb79f46e81061f75d72c872121f286ee5..6fd0bf736830f4c7a0694005d32b50613f05818b 100644 (file)
@@ -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;
This page took 0.041885 seconds and 5 git commands to generate.