Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 3 Nov 2009 15:44:01 +0000 (07:44 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 3 Nov 2009 15:44:01 +0000 (07:44 -0800)
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (21 commits)
  mac80211: check interface is down before type change
  cfg80211: fix NULL ptr deref
  libertas if_usb: Fix crash on 64-bit machines
  mac80211: fix reason code output endianness
  mac80211: fix addba timer
  ath9k: fix misplaced semicolon on rate control
  b43: Fix DMA TX bounce buffer copying
  mac80211: fix BSS leak
  rt73usb.c : more ids
  ipw2200: fix oops on missing firmware
  gre: Fix dev_addr clobbering for gretap
  sky2: set carrier off in probe
  net: fix sk_forward_alloc corruption
  pcnet_cs: add cis of PreMax PE-200 ethernet pcmcia card
  r8169: Fix card drop incoming VLAN tagged MTU byte large jumbo frames
  ibmtr: possible Read buffer overflow?
  net: Fix RPF to work with policy routing
  net: fix kmemcheck annotations
  e1000e: rework disable K1 at 1000Mbps for 82577/82578
  e1000e: config PHY via software after resets
  ...

1  2 
drivers/net/e100.c
drivers/net/tokenring/ibmtr.c
drivers/net/wireless/ipw2x00/ipw2200.c

diff --combined drivers/net/e100.c
  #include <linux/moduleparam.h>
  #include <linux/kernel.h>
  #include <linux/types.h>
 +#include <linux/sched.h>
  #include <linux/slab.h>
  #include <linux/delay.h>
  #include <linux/init.h>
@@@ -1427,19 -1426,31 +1427,31 @@@ static int e100_phy_init(struct nic *ni
        } else
                DPRINTK(HW, DEBUG, "phy_addr = %d\n", nic->mii.phy_id);
  
-       /* Isolate all the PHY ids */
-       for (addr = 0; addr < 32; addr++)
-               mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE);
-       /* Select the discovered PHY */
-       bmcr &= ~BMCR_ISOLATE;
-       mdio_write(netdev, nic->mii.phy_id, MII_BMCR, bmcr);
        /* Get phy ID */
        id_lo = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID1);
        id_hi = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID2);
        nic->phy = (u32)id_hi << 16 | (u32)id_lo;
        DPRINTK(HW, DEBUG, "phy ID = 0x%08X\n", nic->phy);
  
+       /* Select the phy and isolate the rest */
+       for (addr = 0; addr < 32; addr++) {
+               if (addr != nic->mii.phy_id) {
+                       mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE);
+               } else if (nic->phy != phy_82552_v) {
+                       bmcr = mdio_read(netdev, addr, MII_BMCR);
+                       mdio_write(netdev, addr, MII_BMCR,
+                               bmcr & ~BMCR_ISOLATE);
+               }
+       }
+       /*
+        * Workaround for 82552:
+        * Clear the ISOLATE bit on selected phy_id last (mirrored on all
+        * other phy_id's) using bmcr value from addr discovery loop above.
+        */
+       if (nic->phy == phy_82552_v)
+               mdio_write(netdev, nic->mii.phy_id, MII_BMCR,
+                       bmcr & ~BMCR_ISOLATE);
        /* Handle National tx phys */
  #define NCS_PHY_MODEL_MASK    0xFFF0FFFF
        if ((nic->phy & NCS_PHY_MODEL_MASK) == phy_nsc_tx) {
@@@ -108,7 -108,6 +108,7 @@@ in the event that chatty debug message
  #define IBMTR_DEBUG_MESSAGES 0
  
  #include <linux/module.h>
 +#include <linux/sched.h>
  
  #ifdef PCMCIA         /* required for ibmtr_cs.c to build */
  #undef MODULE         /* yes, really */
@@@ -1144,9 -1143,16 +1144,16 @@@ static void dir_open_adapter (struct ne
                  } else {
                        char **prphase = printphase;
                        char **prerror = printerror;
+                       int pnr = err / 16 - 1;
+                       int enr = err % 16 - 1;
                        DPRINTK("TR Adapter misc open failure, error code = ");
-                       printk("0x%x, Phase: %s, Error: %s\n",
-                               err, prphase[err/16 -1], prerror[err%16 -1]);
+                       if (pnr < 0 || pnr >= ARRAY_SIZE(printphase) ||
+                                       enr < 0 ||
+                                       enr >= ARRAY_SIZE(printerror))
+                               printk("0x%x, invalid Phase/Error.", err);
+                       else
+                               printk("0x%x, Phase: %s, Error: %s\n", err,
+                                               prphase[pnr], prerror[enr]);
                        printk(" retrying after %ds delay...\n",
                                        TR_RETRY_INTERVAL/HZ);
                  }
@@@ -30,7 -30,6 +30,7 @@@
  
  ******************************************************************************/
  
 +#include <linux/sched.h>
  #include "ipw2200.h"
  
  
@@@ -11822,6 -11821,7 +11822,7 @@@ static int __devinit ipw_pci_probe(stru
                if (err) {
                        IPW_ERROR("Failed to register promiscuous network "
                                  "device (error %d).\n", err);
+                       unregister_ieee80211(priv->ieee);
                        unregister_netdev(priv->net_dev);
                        goto out_remove_sysfs;
                }
@@@ -11872,6 -11872,7 +11873,7 @@@ static void __devexit ipw_pci_remove(st
  
        mutex_unlock(&priv->mutex);
  
+       unregister_ieee80211(priv->ieee);
        unregister_netdev(priv->net_dev);
  
        if (priv->rxq) {