Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
authorDavid S. Miller <davem@davemloft.net>
Thu, 7 Apr 2011 21:05:23 +0000 (14:05 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 7 Apr 2011 21:05:23 +0000 (14:05 -0700)
Conflicts:
drivers/net/benet/be_main.c

1  2 
drivers/net/benet/be.h
drivers/net/benet/be_main.c
drivers/net/smsc911x.c
include/net/route.h

diff --combined drivers/net/benet/be.h
@@@ -84,8 -84,7 +84,8 @@@ static inline char *nic_name(struct pci
  #define MCC_CQ_LEN            256
  
  #define MAX_RSS_QS            4       /* BE limit is 4 queues/port */
 -#define BE_MAX_MSIX_VECTORS   (MAX_RSS_QS + 1 + 1)/* RSS qs + 1 def Rx + Tx */
 +#define MAX_RX_QS             (MAX_RSS_QS + 1) /* RSS qs + 1 def Rx */
 +#define BE_MAX_MSIX_VECTORS   (MAX_RX_QS + 1)/* RX + TX */
  #define BE_NAPI_WEIGHT                64
  #define MAX_RX_POST           BE_NAPI_WEIGHT /* Frags posted at a time */
  #define RX_FRAGS_REFILL_WM    (RX_Q_LEN - MAX_RX_POST)
@@@ -155,7 -154,7 +155,7 @@@ struct be_eq_obj 
        u16 min_eqd;            /* in usecs */
        u16 max_eqd;            /* in usecs */
        u16 cur_eqd;            /* in usecs */
-       u8  msix_vec_idx;
+       u8  eq_idx;
  
        struct napi_struct napi;
  };
@@@ -277,7 -276,7 +277,7 @@@ struct be_adapter 
        spinlock_t mcc_cq_lock;
  
        struct msix_entry msix_entries[BE_MAX_MSIX_VECTORS];
 -      bool msix_enabled;
 +      u32 num_msix_vec;
        bool isr_registered;
  
        /* TX Rings */
        u32 cache_line_break[8];
  
        /* Rx rings */
 -      struct be_rx_obj rx_obj[MAX_RSS_QS + 1]; /* one default non-rss Q */
 +      struct be_rx_obj rx_obj[MAX_RX_QS];
        u32 num_rx_qs;
        u32 big_page_size;      /* Compounded page size shared by rx wrbs */
  
-       u8 msix_vec_next_idx;
+       u8 eq_next_idx;
        struct be_drv_stats drv_stats;
  
        struct vlan_group *vlan_grp;
        char fw_ver[FW_VER_LEN];
        u32 if_handle;          /* Used to configure filtering */
        u32 pmac_id;            /* MAC addr handle used by BE card */
 +      u32 beacon_state;       /* for set_phys_id */
  
        bool eeh_err;
        bool link_up;
  
  extern const struct ethtool_ops be_ethtool_ops;
  
 +#define msix_enabled(adapter)         (adapter->num_msix_vec > 0)
  #define tx_stats(adapter)             (&adapter->tx_stats)
  #define rx_stats(rxo)                 (&rxo->stats)
  
@@@ -1101,12 -1101,8 +1101,12 @@@ static void be_parse_rx_compl_v1(struc
                AMAP_GET_BITS(struct amap_eth_rx_compl_v1, numfrags, compl);
        rxcp->pkt_type =
                AMAP_GET_BITS(struct amap_eth_rx_compl_v1, cast_enc, compl);
 -      rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vtm, compl);
 -      rxcp->vid = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vlan_tag, compl);
 +      if (rxcp->vlanf) {
 +              rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vtm,
 +                              compl);
 +              rxcp->vid = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vlan_tag,
 +                              compl);
 +      }
  }
  
  static void be_parse_rx_compl_v0(struct be_adapter *adapter,
                AMAP_GET_BITS(struct amap_eth_rx_compl_v0, numfrags, compl);
        rxcp->pkt_type =
                AMAP_GET_BITS(struct amap_eth_rx_compl_v0, cast_enc, compl);
 -      rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vtm, compl);
 -      rxcp->vid = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vlan_tag, compl);
 +      if (rxcp->vlanf) {
 +              rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vtm,
 +                              compl);
 +              rxcp->vid = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vlan_tag,
 +                              compl);
 +      }
  }
  
  static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo)
        else
                be_parse_rx_compl_v0(adapter, compl, rxcp);
  
 -      /* vlanf could be wrongly set in some cards. ignore if vtm is not set */
 -      if ((adapter->function_mode & 0x400) && !rxcp->vtm)
 -              rxcp->vlanf = 0;
 +      if (rxcp->vlanf) {
 +              /* vlanf could be wrongly set in some cards.
 +               * ignore if vtm is not set */
 +              if ((adapter->function_mode & 0x400) && !rxcp->vtm)
 +                      rxcp->vlanf = 0;
  
 -      if (!lancer_chip(adapter))
 -              rxcp->vid = swab16(rxcp->vid);
 +              if (!lancer_chip(adapter))
 +                      rxcp->vid = swab16(rxcp->vid);
  
 -      if ((adapter->pvid == rxcp->vid) && !adapter->vlan_tag[rxcp->vid])
 -              rxcp->vlanf = 0;
 +              if ((adapter->pvid == rxcp->vid) &&
 +                      !adapter->vlan_tag[rxcp->vid])
 +                      rxcp->vlanf = 0;
 +      }
  
        /* As the compl has been parsed, reset it; we wont touch it again */
        compl->dw[offsetof(struct amap_eth_rx_compl_v1, valid) / 32] = 0;
@@@ -1509,7 -1497,7 +1509,7 @@@ static int be_tx_queues_create(struct b
        if (be_cmd_eq_create(adapter, eq, adapter->tx_eq.cur_eqd))
                goto tx_eq_free;
  
-       adapter->tx_eq.msix_vec_idx = adapter->msix_vec_next_idx++;
+       adapter->tx_eq.eq_idx = adapter->eq_next_idx++;
  
  
        /* Alloc TX eth compl queue */
@@@ -1579,31 -1567,12 +1579,31 @@@ static void be_rx_queues_destroy(struc
        }
  }
  
 +static u32 be_num_rxqs_want(struct be_adapter *adapter)
 +{
 +      if (multi_rxq && (adapter->function_caps & BE_FUNCTION_CAPS_RSS) &&
 +              !adapter->sriov_enabled && !(adapter->function_mode & 0x400)) {
 +              return 1 + MAX_RSS_QS; /* one default non-RSS queue */
 +      } else {
 +              dev_warn(&adapter->pdev->dev,
 +                      "No support for multiple RX queues\n");
 +              return 1;
 +      }
 +}
 +
  static int be_rx_queues_create(struct be_adapter *adapter)
  {
        struct be_queue_info *eq, *q, *cq;
        struct be_rx_obj *rxo;
        int rc, i;
  
 +      adapter->num_rx_qs = min(be_num_rxqs_want(adapter),
 +                              msix_enabled(adapter) ?
 +                                      adapter->num_msix_vec - 1 : 1);
 +      if (adapter->num_rx_qs != MAX_RX_QS)
 +              dev_warn(&adapter->pdev->dev,
 +                      "Can create only %d RX queues", adapter->num_rx_qs);
 +
        adapter->big_page_size = (1 << get_order(rx_frag_size)) * PAGE_SIZE;
        for_all_rx_queues(adapter, rxo, i) {
                rxo->adapter = adapter;
                if (rc)
                        goto err;
  
-               rxo->rx_eq.msix_vec_idx = adapter->msix_vec_next_idx++;
+               rxo->rx_eq.eq_idx = adapter->eq_next_idx++;
  
                /* CQ */
                cq = &rxo->cq;
@@@ -1697,11 -1666,11 +1697,11 @@@ static irqreturn_t be_intx(int irq, voi
                if (!isr)
                        return IRQ_NONE;
  
-               if ((1 << adapter->tx_eq.msix_vec_idx & isr))
+               if ((1 << adapter->tx_eq.eq_idx & isr))
                        event_handle(adapter, &adapter->tx_eq);
  
                for_all_rx_queues(adapter, rxo, i) {
-                       if ((1 << rxo->rx_eq.msix_vec_idx & isr))
+                       if ((1 << rxo->rx_eq.eq_idx & isr))
                                event_handle(adapter, &rxo->rx_eq);
                }
        }
@@@ -1868,9 -1837,6 +1868,9 @@@ static void be_worker(struct work_struc
        struct be_rx_obj *rxo;
        int i;
  
 +      if (!adapter->ue_detected && !lancer_chip(adapter))
 +              be_detect_dump_ue(adapter);
 +
        /* when interrupts are not yet enabled, just reap any pending
        * mcc completions */
        if (!netif_running(adapter->netdev)) {
                        be_cq_notify(adapter, mcc_obj->cq.id, false, mcc_compl);
                }
  
 -              if (!adapter->ue_detected && !lancer_chip(adapter))
 -                      be_detect_dump_ue(adapter);
 -
                goto reschedule;
        }
  
                        be_post_rx_frags(rxo, GFP_KERNEL);
                }
        }
 -      if (!adapter->ue_detected && !lancer_chip(adapter))
 -              be_detect_dump_ue(adapter);
  
  reschedule:
        schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
  
  static void be_msix_disable(struct be_adapter *adapter)
  {
 -      if (adapter->msix_enabled) {
 +      if (msix_enabled(adapter)) {
                pci_disable_msix(adapter->pdev);
 -              adapter->msix_enabled = false;
 -      }
 -}
 -
 -static int be_num_rxqs_get(struct be_adapter *adapter)
 -{
 -      if (multi_rxq && (adapter->function_caps & BE_FUNCTION_CAPS_RSS) &&
 -              !adapter->sriov_enabled && !(adapter->function_mode & 0x400)) {
 -              return 1 + MAX_RSS_QS; /* one default non-RSS queue */
 -      } else {
 -              dev_warn(&adapter->pdev->dev,
 -                      "No support for multiple RX queues\n");
 -              return 1;
 +              adapter->num_msix_vec = 0;
        }
  }
  
  static void be_msix_enable(struct be_adapter *adapter)
  {
  #define BE_MIN_MSIX_VECTORS   (1 + 1) /* Rx + Tx */
 -      int i, status;
 +      int i, status, num_vec;
  
 -      adapter->num_rx_qs = be_num_rxqs_get(adapter);
 +      num_vec = be_num_rxqs_want(adapter) + 1;
  
 -      for (i = 0; i < (adapter->num_rx_qs + 1); i++)
 +      for (i = 0; i < num_vec; i++)
                adapter->msix_entries[i].entry = i;
  
 -      status = pci_enable_msix(adapter->pdev, adapter->msix_entries,
 -                      adapter->num_rx_qs + 1);
 +      status = pci_enable_msix(adapter->pdev, adapter->msix_entries, num_vec);
        if (status == 0) {
                goto done;
        } else if (status >= BE_MIN_MSIX_VECTORS) {
 +              num_vec = status;
                if (pci_enable_msix(adapter->pdev, adapter->msix_entries,
 -                              status) == 0) {
 -                      adapter->num_rx_qs = status - 1;
 -                      dev_warn(&adapter->pdev->dev,
 -                              "Could alloc only %d MSIx vectors. "
 -                              "Using %d RX Qs\n", status, adapter->num_rx_qs);
 +                              num_vec) == 0)
                        goto done;
 -              }
        }
        return;
  done:
 -      adapter->msix_enabled = true;
 +      adapter->num_msix_vec = num_vec;
 +      return;
  }
  
  static void be_sriov_enable(struct be_adapter *adapter)
@@@ -1964,7 -1951,7 +1964,7 @@@ static void be_sriov_disable(struct be_
  static inline int be_msix_vec_get(struct be_adapter *adapter,
                                        struct be_eq_obj *eq_obj)
  {
-       return adapter->msix_entries[eq_obj->msix_vec_idx].vector;
+       return adapter->msix_entries[eq_obj->eq_idx].vector;
  }
  
  static int be_request_irq(struct be_adapter *adapter,
@@@ -2016,7 -2003,8 +2016,7 @@@ err_msix
  err:
        dev_warn(&adapter->pdev->dev,
                "MSIX Request IRQ failed - err %d\n", status);
 -      pci_disable_msix(adapter->pdev);
 -      adapter->msix_enabled = false;
 +      be_msix_disable(adapter);
        return status;
  }
  
@@@ -2025,7 -2013,7 +2025,7 @@@ static int be_irq_register(struct be_ad
        struct net_device *netdev = adapter->netdev;
        int status;
  
 -      if (adapter->msix_enabled) {
 +      if (msix_enabled(adapter)) {
                status = be_msix_register(adapter);
                if (status == 0)
                        goto done;
@@@ -2058,7 -2046,7 +2058,7 @@@ static void be_irq_unregister(struct be
                return;
  
        /* INTx */
 -      if (!adapter->msix_enabled) {
 +      if (!msix_enabled(adapter)) {
                free_irq(netdev->irq, adapter);
                goto done;
        }
@@@ -2100,7 -2088,7 +2100,7 @@@ static int be_close(struct net_device *
                         be_cq_notify(adapter, rxo->cq.id, false, 0);
        }
  
 -      if (adapter->msix_enabled) {
 +      if (msix_enabled(adapter)) {
                vec = be_msix_vec_get(adapter, tx_eq);
                synchronize_irq(vec);
  
@@@ -2273,7 -2261,7 +2273,7 @@@ static int be_setup(struct be_adapter *
                                BE_IF_FLAGS_PASS_L3L4_ERRORS;
                en_flags |= BE_IF_FLAGS_PASS_L3L4_ERRORS;
  
 -              if (be_multi_rxq(adapter)) {
 +              if (adapter->function_caps & BE_FUNCTION_CAPS_RSS) {
                        cap_flags |= BE_IF_FLAGS_RSS;
                        en_flags |= BE_IF_FLAGS_RSS;
                }
  
        return 0;
  
 -      be_mcc_queues_destroy(adapter);
  rx_qs_destroy:
        be_rx_queues_destroy(adapter);
  tx_qs_destroy:
@@@ -2356,6 -2345,7 +2356,7 @@@ static int be_clear(struct be_adapter *
        be_mcc_queues_destroy(adapter);
        be_rx_queues_destroy(adapter);
        be_tx_queues_destroy(adapter);
+       adapter->eq_next_idx = 0;
  
        if (be_physfn(adapter) && adapter->sriov_enabled)
                for (vf = 0; vf < num_vfs; vf++)
@@@ -3152,11 -3142,14 +3153,13 @@@ static int be_resume(struct pci_dev *pd
  static void be_shutdown(struct pci_dev *pdev)
  {
        struct be_adapter *adapter = pci_get_drvdata(pdev);
-       struct net_device *netdev =  adapter->netdev;
+       if (!adapter)
+               return;
  
 -      if (netif_running(adapter->netdev))
 -              cancel_delayed_work_sync(&adapter->work);
 +      cancel_delayed_work_sync(&adapter->work);
  
-       netif_device_detach(netdev);
+       netif_device_detach(adapter->netdev);
  
        be_cmd_reset_function(adapter);
  
diff --combined drivers/net/smsc911x.c
@@@ -29,8 -29,6 +29,8 @@@
   *
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/crc32.h>
  #include <linux/delay.h>
  #include <linux/errno.h>
@@@ -250,8 -248,8 +250,8 @@@ static int smsc911x_mac_complete(struc
                if (!(val & MAC_CSR_CMD_CSR_BUSY_))
                        return 0;
        }
 -      SMSC_WARNING(HW, "Timed out waiting for MAC not BUSY. "
 -              "MAC_CSR_CMD: 0x%08X", val);
 +      SMSC_WARN(pdata, hw, "Timed out waiting for MAC not BUSY. "
 +                "MAC_CSR_CMD: 0x%08X", val);
        return -EIO;
  }
  
@@@ -264,7 -262,7 +264,7 @@@ static u32 smsc911x_mac_read(struct sms
  
        temp = smsc911x_reg_read(pdata, MAC_CSR_CMD);
        if (unlikely(temp & MAC_CSR_CMD_CSR_BUSY_)) {
 -              SMSC_WARNING(HW, "MAC busy at entry");
 +              SMSC_WARN(pdata, hw, "MAC busy at entry");
                return 0xFFFFFFFF;
        }
  
        if (likely(smsc911x_mac_complete(pdata) == 0))
                return smsc911x_reg_read(pdata, MAC_CSR_DATA);
  
 -      SMSC_WARNING(HW, "MAC busy after read");
 +      SMSC_WARN(pdata, hw, "MAC busy after read");
        return 0xFFFFFFFF;
  }
  
@@@ -293,8 -291,8 +293,8 @@@ static void smsc911x_mac_write(struct s
  
        temp = smsc911x_reg_read(pdata, MAC_CSR_CMD);
        if (unlikely(temp & MAC_CSR_CMD_CSR_BUSY_)) {
 -              SMSC_WARNING(HW,
 -                      "smsc911x_mac_write failed, MAC busy at entry");
 +              SMSC_WARN(pdata, hw,
 +                        "smsc911x_mac_write failed, MAC busy at entry");
                return;
        }
  
        if (likely(smsc911x_mac_complete(pdata) == 0))
                return;
  
 -      SMSC_WARNING(HW,
 -              "smsc911x_mac_write failed, MAC busy after write");
 +      SMSC_WARN(pdata, hw, "smsc911x_mac_write failed, MAC busy after write");
  }
  
  /* Get a phy register */
@@@ -327,7 -326,8 +327,7 @@@ static int smsc911x_mii_read(struct mii
  
        /* Confirm MII not busy */
        if (unlikely(smsc911x_mac_read(pdata, MII_ACC) & MII_ACC_MII_BUSY_)) {
 -              SMSC_WARNING(HW,
 -                      "MII is busy in smsc911x_mii_read???");
 +              SMSC_WARN(pdata, hw, "MII is busy in smsc911x_mii_read???");
                reg = -EIO;
                goto out;
        }
                        goto out;
                }
  
 -      SMSC_WARNING(HW, "Timed out waiting for MII read to finish");
 +      SMSC_WARN(pdata, hw, "Timed out waiting for MII read to finish");
        reg = -EIO;
  
  out:
@@@ -364,7 -364,8 +364,7 @@@ static int smsc911x_mii_write(struct mi
  
        /* Confirm MII not busy */
        if (unlikely(smsc911x_mac_read(pdata, MII_ACC) & MII_ACC_MII_BUSY_)) {
 -              SMSC_WARNING(HW,
 -                      "MII is busy in smsc911x_mii_write???");
 +              SMSC_WARN(pdata, hw, "MII is busy in smsc911x_mii_write???");
                reg = -EIO;
                goto out;
        }
                        goto out;
                }
  
 -      SMSC_WARNING(HW, "Timed out waiting for MII write to finish");
 +      SMSC_WARN(pdata, hw, "Timed out waiting for MII write to finish");
        reg = -EIO;
  
  out:
@@@ -425,20 -426,18 +425,20 @@@ static void smsc911x_phy_initialise_ext
        unsigned int hwcfg = smsc911x_reg_read(pdata, HW_CFG);
  
        if (pdata->config.flags & SMSC911X_FORCE_INTERNAL_PHY) {
 -              SMSC_TRACE(HW, "Forcing internal PHY");
 +              SMSC_TRACE(pdata, hw, "Forcing internal PHY");
                pdata->using_extphy = 0;
        } else if (pdata->config.flags & SMSC911X_FORCE_EXTERNAL_PHY) {
 -              SMSC_TRACE(HW, "Forcing external PHY");
 +              SMSC_TRACE(pdata, hw, "Forcing external PHY");
                smsc911x_phy_enable_external(pdata);
                pdata->using_extphy = 1;
        } else if (hwcfg & HW_CFG_EXT_PHY_DET_) {
 -              SMSC_TRACE(HW, "HW_CFG EXT_PHY_DET set, using external PHY");
 +              SMSC_TRACE(pdata, hw,
 +                         "HW_CFG EXT_PHY_DET set, using external PHY");
                smsc911x_phy_enable_external(pdata);
                pdata->using_extphy = 1;
        } else {
 -              SMSC_TRACE(HW, "HW_CFG EXT_PHY_DET clear, using internal PHY");
 +              SMSC_TRACE(pdata, hw,
 +                         "HW_CFG EXT_PHY_DET clear, using internal PHY");
                pdata->using_extphy = 0;
        }
  }
@@@ -510,13 -509,13 +510,13 @@@ static int smsc911x_phy_check_loopbackp
                } while ((i--) && (!status));
  
                if (!status) {
 -                      SMSC_WARNING(HW, "Failed to transmit "
 -                              "during loopback test");
 +                      SMSC_WARN(pdata, hw,
 +                                "Failed to transmit during loopback test");
                        continue;
                }
                if (status & TX_STS_ES_) {
 -                      SMSC_WARNING(HW, "Transmit encountered "
 -                              "errors during loopback test");
 +                      SMSC_WARN(pdata, hw,
 +                                "Transmit encountered errors during loopback test");
                        continue;
                }
  
                } while ((i--) && (!status));
  
                if (!status) {
 -                      SMSC_WARNING(HW,
 -                              "Failed to receive during loopback test");
 +                      SMSC_WARN(pdata, hw,
 +                                "Failed to receive during loopback test");
                        continue;
                }
                if (status & RX_STS_ES_) {
 -                      SMSC_WARNING(HW, "Receive encountered "
 -                              "errors during loopback test");
 +                      SMSC_WARN(pdata, hw,
 +                                "Receive encountered errors during loopback test");
                        continue;
                }
  
                smsc911x_rx_readfifo(pdata, (unsigned int *)bufp, rdsz);
  
                if (pktlength != (MIN_PACKET_SIZE + 4)) {
 -                      SMSC_WARNING(HW, "Unexpected packet size "
 -                              "during loop back test, size=%d, will retry",
 -                              pktlength);
 +                      SMSC_WARN(pdata, hw, "Unexpected packet size "
 +                                "during loop back test, size=%d, will retry",
 +                                pktlength);
                } else {
                        unsigned int j;
                        int mismatch = 0;
                                }
                        }
                        if (!mismatch) {
 -                              SMSC_TRACE(HW, "Successfully verified "
 +                              SMSC_TRACE(pdata, hw, "Successfully verified "
                                           "loopback packet");
                                return 0;
                        } else {
 -                              SMSC_WARNING(HW, "Data mismatch "
 -                                      "during loop back test, will retry");
 +                              SMSC_WARN(pdata, hw, "Data mismatch "
 +                                        "during loop back test, will retry");
                        }
                }
        }
@@@ -583,7 -582,7 +583,7 @@@ static int smsc911x_phy_reset(struct sm
        BUG_ON(!phy_dev);
        BUG_ON(!phy_dev->bus);
  
 -      SMSC_TRACE(HW, "Performing PHY BCR Reset");
 +      SMSC_TRACE(pdata, hw, "Performing PHY BCR Reset");
        smsc911x_mii_write(phy_dev->bus, phy_dev->addr, MII_BMCR, BMCR_RESET);
        do {
                msleep(1);
        } while ((i--) && (temp & BMCR_RESET));
  
        if (temp & BMCR_RESET) {
 -              SMSC_WARNING(HW, "PHY reset failed to complete.");
 +              SMSC_WARN(pdata, hw, "PHY reset failed to complete");
                return -EIO;
        }
        /* Extra delay required because the phy may not be completed with
@@@ -696,11 -695,11 +696,11 @@@ static void smsc911x_phy_update_flowcon
                else
                        afc &= ~0xF;
  
 -              SMSC_TRACE(HW, "rx pause %s, tx pause %s",
 -                      (cap & FLOW_CTRL_RX ? "enabled" : "disabled"),
 -                      (cap & FLOW_CTRL_TX ? "enabled" : "disabled"));
 +              SMSC_TRACE(pdata, hw, "rx pause %s, tx pause %s",
 +                         (cap & FLOW_CTRL_RX ? "enabled" : "disabled"),
 +                         (cap & FLOW_CTRL_TX ? "enabled" : "disabled"));
        } else {
 -              SMSC_TRACE(HW, "half duplex");
 +              SMSC_TRACE(pdata, hw, "half duplex");
                flow = 0;
                afc |= 0xF;
        }
@@@ -723,17 -722,17 +723,17 @@@ static void smsc911x_phy_adjust_link(st
  
        if (phy_dev->duplex != pdata->last_duplex) {
                unsigned int mac_cr;
 -              SMSC_TRACE(HW, "duplex state has changed");
 +              SMSC_TRACE(pdata, hw, "duplex state has changed");
  
                spin_lock_irqsave(&pdata->mac_lock, flags);
                mac_cr = smsc911x_mac_read(pdata, MAC_CR);
                if (phy_dev->duplex) {
 -                      SMSC_TRACE(HW,
 -                              "configuring for full duplex mode");
 +                      SMSC_TRACE(pdata, hw,
 +                                 "configuring for full duplex mode");
                        mac_cr |= MAC_CR_FDPX_;
                } else {
 -                      SMSC_TRACE(HW,
 -                              "configuring for half duplex mode");
 +                      SMSC_TRACE(pdata, hw,
 +                                 "configuring for half duplex mode");
                        mac_cr &= ~MAC_CR_FDPX_;
                }
                smsc911x_mac_write(pdata, MAC_CR, mac_cr);
  
        carrier = netif_carrier_ok(dev);
        if (carrier != pdata->last_carrier) {
 -              SMSC_TRACE(HW, "carrier state has changed");
 +              SMSC_TRACE(pdata, hw, "carrier state has changed");
                if (carrier) {
 -                      SMSC_TRACE(HW, "configuring for carrier OK");
 +                      SMSC_TRACE(pdata, hw, "configuring for carrier OK");
                        if ((pdata->gpio_orig_setting & GPIO_CFG_LED1_EN_) &&
                            (!pdata->using_extphy)) {
                                /* Restore original GPIO configuration */
                                        pdata->gpio_setting);
                        }
                } else {
 -                      SMSC_TRACE(HW, "configuring for no carrier");
 +                      SMSC_TRACE(pdata, hw, "configuring for no carrier");
                        /* Check global setting that LED1
                         * usage is 10/100 indicator */
                        pdata->gpio_setting = smsc911x_reg_read(pdata,
@@@ -788,25 -787,25 +788,25 @@@ static int smsc911x_mii_probe(struct ne
        /* find the first phy */
        phydev = phy_find_first(pdata->mii_bus);
        if (!phydev) {
 -              pr_err("%s: no PHY found\n", dev->name);
 +              netdev_err(dev, "no PHY found\n");
                return -ENODEV;
        }
  
 -      SMSC_TRACE(PROBE, "PHY: addr %d, phy_id 0x%08X",
 -                      phydev->addr, phydev->phy_id);
 +      SMSC_TRACE(pdata, probe, "PHY: addr %d, phy_id 0x%08X",
 +                 phydev->addr, phydev->phy_id);
  
        ret = phy_connect_direct(dev, phydev,
                        &smsc911x_phy_adjust_link, 0,
                        pdata->config.phy_interface);
  
        if (ret) {
 -              pr_err("%s: Could not attach to PHY\n", dev->name);
 +              netdev_err(dev, "Could not attach to PHY\n");
                return ret;
        }
  
 -      pr_info("%s: attached PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n",
 -              dev->name, phydev->drv->name,
 -              dev_name(&phydev->dev), phydev->irq);
 +      netdev_info(dev,
 +                  "attached PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n",
 +                  phydev->drv->name, dev_name(&phydev->dev), phydev->irq);
  
        /* mask with MAC supported features */
        phydev->supported &= (PHY_BASIC_FEATURES | SUPPORTED_Pause |
  
  #ifdef USE_PHY_WORK_AROUND
        if (smsc911x_phy_loopbacktest(dev) < 0) {
 -              SMSC_WARNING(HW, "Failed Loop Back Test");
 +              SMSC_WARN(pdata, hw, "Failed Loop Back Test");
                return -ENODEV;
        }
 -      SMSC_TRACE(HW, "Passed Loop Back Test");
 +      SMSC_TRACE(pdata, hw, "Passed Loop Back Test");
  #endif                                /* USE_PHY_WORK_AROUND */
  
 -      SMSC_TRACE(HW, "phy initialised successfully");
 +      SMSC_TRACE(pdata, hw, "phy initialised successfully");
        return 0;
  }
  
@@@ -861,8 -860,8 +861,8 @@@ static int __devinit smsc911x_mii_init(
                smsc911x_phy_initialise_external(pdata);
                break;
        default:
 -              SMSC_TRACE(HW, "External PHY is not supported, "
 -                      "using internal PHY");
 +              SMSC_TRACE(pdata, hw, "External PHY is not supported, "
 +                         "using internal PHY");
                pdata->using_extphy = 0;
                break;
        }
        }
  
        if (mdiobus_register(pdata->mii_bus)) {
 -              SMSC_WARNING(PROBE, "Error registering mii bus");
 +              SMSC_WARN(pdata, probe, "Error registering mii bus");
                goto err_out_free_bus_2;
        }
  
        if (smsc911x_mii_probe(dev) < 0) {
 -              SMSC_WARNING(PROBE, "Error registering mii bus");
 +              SMSC_WARN(pdata, probe, "Error registering mii bus");
                goto err_out_unregister_bus_3;
        }
  
@@@ -914,7 -913,8 +914,7 @@@ static void smsc911x_tx_update_txcounte
                         * does not reference a hardware defined reserved bit
                         * but rather a driver defined one.
                         */
 -                      SMSC_WARNING(HW,
 -                              "Packet tag reserved bit is high");
 +                      SMSC_WARN(pdata, hw, "Packet tag reserved bit is high");
                } else {
                        if (unlikely(tx_stat & TX_STS_ES_)) {
                                dev->stats.tx_errors++;
@@@ -977,8 -977,8 +977,8 @@@ smsc911x_rx_fastforward(struct smsc911x
                } while ((val & RX_DP_CTRL_RX_FFWD_) && --timeout);
  
                if (unlikely(timeout == 0))
 -                      SMSC_WARNING(HW, "Timed out waiting for "
 -                              "RX FFWD to finish, RX_DP_CTRL: 0x%08X", val);
 +                      SMSC_WARN(pdata, hw, "Timed out waiting for "
 +                                "RX FFWD to finish, RX_DP_CTRL: 0x%08X", val);
        } else {
                unsigned int temp;
                while (pktwords--)
@@@ -1021,8 -1021,8 +1021,8 @@@ static int smsc911x_poll(struct napi_st
                smsc911x_rx_counterrors(dev, rxstat);
  
                if (unlikely(rxstat & RX_STS_ES_)) {
 -                      SMSC_WARNING(RX_ERR,
 -                              "Discarding packet with error bit set");
 +                      SMSC_WARN(pdata, rx_err,
 +                                "Discarding packet with error bit set");
                        /* Packet has an error, discard it and continue with
                         * the next */
                        smsc911x_rx_fastforward(pdata, pktwords);
  
                skb = netdev_alloc_skb(dev, pktlength + NET_IP_ALIGN);
                if (unlikely(!skb)) {
 -                      SMSC_WARNING(RX_ERR,
 -                              "Unable to allocate skb for rx packet");
 +                      SMSC_WARN(pdata, rx_err,
 +                                "Unable to allocate skb for rx packet");
                        /* Drop the packet and stop this polling iteration */
                        smsc911x_rx_fastforward(pdata, pktwords);
                        dev->stats.rx_dropped++;
@@@ -1083,8 -1083,8 +1083,8 @@@ static void smsc911x_rx_multicast_updat
        smsc911x_mac_write(pdata, MAC_CR, mac_cr);
        smsc911x_mac_write(pdata, HASHH, pdata->hashhi);
        smsc911x_mac_write(pdata, HASHL, pdata->hashlo);
 -      SMSC_TRACE(HW, "maccr 0x%08X, HASHH 0x%08X, HASHL 0x%08X",
 -              mac_cr, pdata->hashhi, pdata->hashlo);
 +      SMSC_TRACE(pdata, hw, "maccr 0x%08X, HASHH 0x%08X, HASHL 0x%08X",
 +                 mac_cr, pdata->hashhi, pdata->hashlo);
  }
  
  static void smsc911x_rx_multicast_update_workaround(struct smsc911x_data *pdata)
  
        /* Check Rx has stopped */
        if (smsc911x_mac_read(pdata, MAC_CR) & MAC_CR_RXEN_)
 -              SMSC_WARNING(DRV, "Rx not stopped");
 +              SMSC_WARN(pdata, drv, "Rx not stopped");
  
        /* Perform the update - safe to do now Rx has stopped */
        smsc911x_rx_multicast_update(pdata);
@@@ -1131,7 -1131,7 +1131,7 @@@ static int smsc911x_soft_reset(struct s
        } while ((--timeout) && (temp & HW_CFG_SRST_));
  
        if (unlikely(temp & HW_CFG_SRST_)) {
 -              SMSC_WARNING(DRV, "Failed to complete reset");
 +              SMSC_WARN(pdata, drv, "Failed to complete reset");
                return -EIO;
        }
        return 0;
@@@ -1160,18 -1160,18 +1160,18 @@@ static int smsc911x_open(struct net_dev
  
        /* if the phy is not yet registered, retry later*/
        if (!pdata->phy_dev) {
 -              SMSC_WARNING(HW, "phy_dev is NULL");
 +              SMSC_WARN(pdata, hw, "phy_dev is NULL");
                return -EAGAIN;
        }
  
        if (!is_valid_ether_addr(dev->dev_addr)) {
 -              SMSC_WARNING(HW, "dev_addr is not a valid MAC address");
 +              SMSC_WARN(pdata, hw, "dev_addr is not a valid MAC address");
                return -EADDRNOTAVAIL;
        }
  
        /* Reset the LAN911x */
        if (smsc911x_soft_reset(pdata)) {
 -              SMSC_WARNING(HW, "soft reset failed");
 +              SMSC_WARN(pdata, hw, "soft reset failed");
                return -EIO;
        }
  
        }
  
        if (unlikely(timeout == 0))
 -              SMSC_WARNING(IFUP,
 -                      "Timed out waiting for EEPROM busy bit to clear");
 +              SMSC_WARN(pdata, ifup,
 +                        "Timed out waiting for EEPROM busy bit to clear");
  
        smsc911x_reg_write(pdata, GPIO_CFG, 0x70070000);
  
        intcfg = ((10 << 24) | INT_CFG_IRQ_EN_);
  
        if (pdata->config.irq_polarity) {
 -              SMSC_TRACE(IFUP, "irq polarity: active high");
 +              SMSC_TRACE(pdata, ifup, "irq polarity: active high");
                intcfg |= INT_CFG_IRQ_POL_;
        } else {
 -              SMSC_TRACE(IFUP, "irq polarity: active low");
 +              SMSC_TRACE(pdata, ifup, "irq polarity: active low");
        }
  
        if (pdata->config.irq_type) {
 -              SMSC_TRACE(IFUP, "irq type: push-pull");
 +              SMSC_TRACE(pdata, ifup, "irq type: push-pull");
                intcfg |= INT_CFG_IRQ_TYPE_;
        } else {
 -              SMSC_TRACE(IFUP, "irq type: open drain");
 +              SMSC_TRACE(pdata, ifup, "irq type: open drain");
        }
  
        smsc911x_reg_write(pdata, INT_CFG, intcfg);
  
 -      SMSC_TRACE(IFUP, "Testing irq handler using IRQ %d", dev->irq);
 +      SMSC_TRACE(pdata, ifup, "Testing irq handler using IRQ %d", dev->irq);
        pdata->software_irq_signal = 0;
        smp_wmb();
  
        }
  
        if (!pdata->software_irq_signal) {
 -              dev_warn(&dev->dev, "ISR failed signaling test (IRQ %d)\n",
 -                       dev->irq);
 +              netdev_warn(dev, "ISR failed signaling test (IRQ %d)\n",
 +                          dev->irq);
                return -ENODEV;
        }
 -      SMSC_TRACE(IFUP, "IRQ handler passed test using IRQ %d", dev->irq);
 +      SMSC_TRACE(pdata, ifup, "IRQ handler passed test using IRQ %d",
 +                 dev->irq);
  
 -      dev_info(&dev->dev, "SMSC911x/921x identified at %#08lx, IRQ: %d\n",
 -               (unsigned long)pdata->ioaddr, dev->irq);
 +      netdev_info(dev, "SMSC911x/921x identified at %#08lx, IRQ: %d\n",
 +                  (unsigned long)pdata->ioaddr, dev->irq);
  
        /* Reset the last known duplex and carrier */
        pdata->last_duplex = -1;
@@@ -1314,7 -1313,7 +1314,7 @@@ static int smsc911x_stop(struct net_dev
        if (pdata->phy_dev)
                phy_stop(pdata->phy_dev);
  
 -      SMSC_TRACE(IFDOWN, "Interface stopped");
 +      SMSC_TRACE(pdata, ifdown, "Interface stopped");
        return 0;
  }
  
@@@ -1332,8 -1331,8 +1332,8 @@@ static int smsc911x_hard_start_xmit(str
        freespace = smsc911x_reg_read(pdata, TX_FIFO_INF) & TX_FIFO_INF_TDFREE_;
  
        if (unlikely(freespace < TX_FIFO_LOW_THRESHOLD))
 -              SMSC_WARNING(TX_ERR,
 -                      "Tx data fifo low, space available: %d", freespace);
 +              SMSC_WARN(pdata, tx_err,
 +                        "Tx data fifo low, space available: %d", freespace);
  
        /* Word alignment adjustment */
        tx_cmd_a = (u32)((ulong)skb->data & 0x03) << 16;
@@@ -1433,7 -1432,7 +1433,7 @@@ static void smsc911x_set_multicast_list
                 * receiving data */
                if (!pdata->multicast_update_pending) {
                        unsigned int temp;
 -                      SMSC_TRACE(HW, "scheduling mcast update");
 +                      SMSC_TRACE(pdata, hw, "scheduling mcast update");
                        pdata->multicast_update_pending = 1;
  
                        /* Request the hardware to stop, then perform the
@@@ -1475,7 -1474,7 +1475,7 @@@ static irqreturn_t smsc911x_irqhandler(
        if (unlikely(intsts & inten & INT_STS_RXSTOP_INT_)) {
                /* Called when there is a multicast update scheduled and
                 * it is now safe to complete the update */
 -              SMSC_TRACE(INTR, "RX Stop interrupt");
 +              SMSC_TRACE(pdata, intr, "RX Stop interrupt");
                smsc911x_reg_write(pdata, INT_STS, INT_STS_RXSTOP_INT_);
                if (pdata->multicast_update_pending)
                        smsc911x_rx_multicast_update_workaround(pdata);
        }
  
        if (unlikely(intsts & inten & INT_STS_RXE_)) {
 -              SMSC_TRACE(INTR, "RX Error interrupt");
 +              SMSC_TRACE(pdata, intr, "RX Error interrupt");
                smsc911x_reg_write(pdata, INT_STS, INT_STS_RXE_);
                serviced = IRQ_HANDLED;
        }
                        /* Schedule a NAPI poll */
                        __napi_schedule(&pdata->napi);
                } else {
 -                      SMSC_WARNING(RX_ERR,
 -                              "napi_schedule_prep failed");
 +                      SMSC_WARN(pdata, rx_err, "napi_schedule_prep failed");
                }
                serviced = IRQ_HANDLED;
        }
@@@ -1543,7 -1543,7 +1543,7 @@@ static int smsc911x_set_mac_address(str
        smsc911x_set_hw_mac_address(pdata, dev->dev_addr);
        spin_unlock_irq(&pdata->mac_lock);
  
 -      dev_info(&dev->dev, "MAC Address: %pM\n", dev->dev_addr);
 +      netdev_info(dev, "MAC Address: %pM\n", dev->dev_addr);
  
        return 0;
  }
@@@ -1649,9 -1649,9 +1649,9 @@@ static int smsc911x_eeprom_send_cmd(str
        int timeout = 100;
        u32 e2cmd;
  
 -      SMSC_TRACE(DRV, "op 0x%08x", op);
 +      SMSC_TRACE(pdata, drv, "op 0x%08x", op);
        if (smsc911x_reg_read(pdata, E2P_CMD) & E2P_CMD_EPC_BUSY_) {
 -              SMSC_WARNING(DRV, "Busy at start");
 +              SMSC_WARN(pdata, drv, "Busy at start");
                return -EBUSY;
        }
  
        } while ((e2cmd & E2P_CMD_EPC_BUSY_) && (--timeout));
  
        if (!timeout) {
 -              SMSC_TRACE(DRV, "TIMED OUT");
 +              SMSC_TRACE(pdata, drv, "TIMED OUT");
                return -EAGAIN;
        }
  
        if (e2cmd & E2P_CMD_EPC_TIMEOUT_) {
 -              SMSC_TRACE(DRV, "Error occured during eeprom operation");
 +              SMSC_TRACE(pdata, drv, "Error occured during eeprom operation");
                return -EINVAL;
        }
  
@@@ -1682,7 -1682,7 +1682,7 @@@ static int smsc911x_eeprom_read_locatio
        u32 op = E2P_CMD_EPC_CMD_READ_ | address;
        int ret;
  
 -      SMSC_TRACE(DRV, "address 0x%x", address);
 +      SMSC_TRACE(pdata, drv, "address 0x%x", address);
        ret = smsc911x_eeprom_send_cmd(pdata, op);
  
        if (!ret)
@@@ -1698,7 -1698,7 +1698,7 @@@ static int smsc911x_eeprom_write_locati
        u32 temp;
        int ret;
  
 -      SMSC_TRACE(DRV, "address 0x%x, data 0x%x", address, data);
 +      SMSC_TRACE(pdata, drv, "address 0x%x, data 0x%x", address, data);
        ret = smsc911x_eeprom_send_cmd(pdata, op);
  
        if (!ret) {
@@@ -1811,25 -1811,26 +1811,26 @@@ static int __devinit smsc911x_init(stru
        struct smsc911x_data *pdata = netdev_priv(dev);
        unsigned int byte_test;
  
 -      SMSC_TRACE(PROBE, "Driver Parameters:");
 -      SMSC_TRACE(PROBE, "LAN base: 0x%08lX",
 -              (unsigned long)pdata->ioaddr);
 -      SMSC_TRACE(PROBE, "IRQ: %d", dev->irq);
 -      SMSC_TRACE(PROBE, "PHY will be autodetected.");
 +      SMSC_TRACE(pdata, probe, "Driver Parameters:");
 +      SMSC_TRACE(pdata, probe, "LAN base: 0x%08lX",
 +                 (unsigned long)pdata->ioaddr);
 +      SMSC_TRACE(pdata, probe, "IRQ: %d", dev->irq);
 +      SMSC_TRACE(pdata, probe, "PHY will be autodetected.");
  
        spin_lock_init(&pdata->dev_lock);
+       spin_lock_init(&pdata->mac_lock);
  
        if (pdata->ioaddr == 0) {
 -              SMSC_WARNING(PROBE, "pdata->ioaddr: 0x00000000");
 +              SMSC_WARN(pdata, probe, "pdata->ioaddr: 0x00000000");
                return -ENODEV;
        }
  
        /* Check byte ordering */
        byte_test = smsc911x_reg_read(pdata, BYTE_TEST);
 -      SMSC_TRACE(PROBE, "BYTE_TEST: 0x%08X", byte_test);
 +      SMSC_TRACE(pdata, probe, "BYTE_TEST: 0x%08X", byte_test);
        if (byte_test == 0x43218765) {
 -              SMSC_TRACE(PROBE, "BYTE_TEST looks swapped, "
 -                      "applying WORD_SWAP");
 +              SMSC_TRACE(pdata, probe, "BYTE_TEST looks swapped, "
 +                         "applying WORD_SWAP");
                smsc911x_reg_write(pdata, WORD_SWAP, 0xffffffff);
  
                /* 1 dummy read of BYTE_TEST is needed after a write to
        }
  
        if (byte_test != 0x87654321) {
 -              SMSC_WARNING(DRV, "BYTE_TEST: 0x%08X", byte_test);
 +              SMSC_WARN(pdata, drv, "BYTE_TEST: 0x%08X", byte_test);
                if (((byte_test >> 16) & 0xFFFF) == (byte_test & 0xFFFF)) {
 -                      SMSC_WARNING(PROBE,
 -                              "top 16 bits equal to bottom 16 bits");
 -                      SMSC_TRACE(PROBE, "This may mean the chip is set "
 -                              "for 32 bit while the bus is reading 16 bit");
 +                      SMSC_WARN(pdata, probe,
 +                                "top 16 bits equal to bottom 16 bits");
 +                      SMSC_TRACE(pdata, probe,
 +                                 "This may mean the chip is set "
 +                                 "for 32 bit while the bus is reading 16 bit");
                }
                return -ENODEV;
        }
                break;
  
        default:
 -              SMSC_WARNING(PROBE, "LAN911x not identified, idrev: 0x%08X",
 -                      pdata->idrev);
 +              SMSC_WARN(pdata, probe, "LAN911x not identified, idrev: 0x%08X",
 +                        pdata->idrev);
                return -ENODEV;
        }
  
 -      SMSC_TRACE(PROBE, "LAN911x identified, idrev: 0x%08X, generation: %d",
 -              pdata->idrev, pdata->generation);
 +      SMSC_TRACE(pdata, probe,
 +                 "LAN911x identified, idrev: 0x%08X, generation: %d",
 +                 pdata->idrev, pdata->generation);
  
        if (pdata->generation == 0)
 -              SMSC_WARNING(PROBE,
 -                      "This driver is not intended for this chip revision");
 +              SMSC_WARN(pdata, probe,
 +                        "This driver is not intended for this chip revision");
  
        /* workaround for platforms without an eeprom, where the mac address
         * is stored elsewhere and set by the bootloader.  This saves the
         * mac address before resetting the device */
-       if (pdata->config.flags & SMSC911X_SAVE_MAC_ADDRESS)
+       if (pdata->config.flags & SMSC911X_SAVE_MAC_ADDRESS) {
+               spin_lock_irq(&pdata->mac_lock);
                smsc911x_read_mac_address(dev);
+               spin_unlock_irq(&pdata->mac_lock);
+       }
  
        /* Reset the LAN911x */
        if (smsc911x_soft_reset(pdata))
@@@ -1929,7 -1931,7 +1933,7 @@@ static int __devexit smsc911x_drv_remov
        BUG_ON(!pdata->ioaddr);
        BUG_ON(!pdata->phy_dev);
  
 -      SMSC_TRACE(IFDOWN, "Stopping driver.");
 +      SMSC_TRACE(pdata, ifdown, "Stopping driver");
  
        phy_disconnect(pdata->phy_dev);
        pdata->phy_dev = NULL;
@@@ -1963,11 -1965,11 +1967,11 @@@ static int __devinit smsc911x_drv_probe
        int res_size, irq_flags;
        int retval;
  
 -      pr_info("%s: Driver version %s.\n", SMSC_CHIPNAME, SMSC_DRV_VERSION);
 +      pr_info("Driver version %s\n", SMSC_DRV_VERSION);
  
        /* platform data specifies irq & dynamic bus configuration */
        if (!pdev->dev.platform_data) {
 -              pr_warning("%s: platform_data not provided\n", SMSC_CHIPNAME);
 +              pr_warn("platform_data not provided\n");
                retval = -ENODEV;
                goto out_0;
        }
        if (!res)
                res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
 -              pr_warning("%s: Could not allocate resource.\n",
 -                      SMSC_CHIPNAME);
 +              pr_warn("Could not allocate resource\n");
                retval = -ENODEV;
                goto out_0;
        }
  
        irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (!irq_res) {
 -              pr_warning("%s: Could not allocate irq resource.\n",
 -                      SMSC_CHIPNAME);
 +              pr_warn("Could not allocate irq resource\n");
                retval = -ENODEV;
                goto out_0;
        }
  
        dev = alloc_etherdev(sizeof(struct smsc911x_data));
        if (!dev) {
 -              pr_warning("%s: Could not allocate device.\n", SMSC_CHIPNAME);
 +              pr_warn("Could not allocate device\n");
                retval = -ENOMEM;
                goto out_release_io_1;
        }
        pdata->msg_enable = ((1 << debug) - 1);
  
        if (pdata->ioaddr == NULL) {
 -              SMSC_WARNING(PROBE,
 -                      "Error smsc911x base address invalid");
 +              SMSC_WARN(pdata, probe, "Error smsc911x base address invalid");
                retval = -ENOMEM;
                goto out_free_netdev_2;
        }
        retval = request_irq(dev->irq, smsc911x_irqhandler,
                             irq_flags | IRQF_SHARED, dev->name, dev);
        if (retval) {
 -              SMSC_WARNING(PROBE,
 -                      "Unable to claim requested irq: %d", dev->irq);
 +              SMSC_WARN(pdata, probe,
 +                        "Unable to claim requested irq: %d", dev->irq);
                goto out_unmap_io_3;
        }
  
  
        retval = register_netdev(dev);
        if (retval) {
 -              SMSC_WARNING(PROBE,
 -                      "Error %i registering device", retval);
 +              SMSC_WARN(pdata, probe, "Error %i registering device", retval);
                goto out_unset_drvdata_4;
        } else {
 -              SMSC_TRACE(PROBE, "Network interface: \"%s\"", dev->name);
 +              SMSC_TRACE(pdata, probe,
 +                         "Network interface: \"%s\"", dev->name);
        }
  
-       spin_lock_init(&pdata->mac_lock);
        retval = smsc911x_mii_init(pdev, dev);
        if (retval) {
 -              SMSC_WARNING(PROBE,
 -                      "Error %i initialising mii", retval);
 +              SMSC_WARN(pdata, probe, "Error %i initialising mii", retval);
                goto out_unregister_netdev_5;
        }
  
        /* Check if mac address has been specified when bringing interface up */
        if (is_valid_ether_addr(dev->dev_addr)) {
                smsc911x_set_hw_mac_address(pdata, dev->dev_addr);
 -              SMSC_TRACE(PROBE, "MAC Address is specified by configuration");
 +              SMSC_TRACE(pdata, probe,
 +                         "MAC Address is specified by configuration");
        } else if (is_valid_ether_addr(pdata->config.mac)) {
                memcpy(dev->dev_addr, pdata->config.mac, 6);
 -              SMSC_TRACE(PROBE, "MAC Address specified by platform data");
 +              SMSC_TRACE(pdata, probe,
 +                         "MAC Address specified by platform data");
        } else {
                /* Try reading mac address from device. if EEPROM is present
                 * it will already have been set */
  
                if (is_valid_ether_addr(dev->dev_addr)) {
                        /* eeprom values are valid  so use them */
 -                      SMSC_TRACE(PROBE,
 -                              "Mac Address is read from LAN911x EEPROM");
 +                      SMSC_TRACE(pdata, probe,
 +                                 "Mac Address is read from LAN911x EEPROM");
                } else {
                        /* eeprom values are invalid, generate random MAC */
                        random_ether_addr(dev->dev_addr);
                        smsc911x_set_hw_mac_address(pdata, dev->dev_addr);
 -                      SMSC_TRACE(PROBE,
 -                              "MAC Address is set to random_ether_addr");
 +                      SMSC_TRACE(pdata, probe,
 +                                 "MAC Address is set to random_ether_addr");
                }
        }
  
        spin_unlock_irq(&pdata->mac_lock);
  
 -      dev_info(&dev->dev, "MAC Address: %pM\n", dev->dev_addr);
 +      netdev_info(dev, "MAC Address: %pM\n", dev->dev_addr);
  
        return 0;
  
diff --combined include/net/route.h
@@@ -64,6 -64,7 +64,7 @@@ struct rtable 
  
        __be32                  rt_dst; /* Path destination     */
        __be32                  rt_src; /* Path source          */
+       int                     rt_route_iif;
        int                     rt_iif;
        int                     rt_oif;
        __u32                   rt_mark;
  
  static inline bool rt_is_input_route(struct rtable *rt)
  {
-       return rt->rt_iif != 0;
+       return rt->rt_route_iif != 0;
  }
  
  static inline bool rt_is_output_route(struct rtable *rt)
  {
-       return rt->rt_iif == 0;
+       return rt->rt_route_iif == 0;
  }
  
  struct ip_rt_acct {
@@@ -149,12 -150,17 +150,12 @@@ static inline struct rtable *ip_route_o
                                                   __be16 dport, __be16 sport,
                                                   __u8 proto, __u8 tos, int oif)
  {
 -      struct flowi4 fl4 = {
 -              .flowi4_oif = oif,
 -              .flowi4_flags = sk ? inet_sk_flowi_flags(sk) : 0,
 -              .flowi4_mark = sk ? sk->sk_mark : 0,
 -              .daddr = daddr,
 -              .saddr = saddr,
 -              .flowi4_tos = tos,
 -              .flowi4_proto = proto,
 -              .fl4_dport = dport,
 -              .fl4_sport = sport,
 -      };
 +      struct flowi4 fl4;
 +
 +      flowi4_init_output(&fl4, oif, sk ? sk->sk_mark : 0, tos,
 +                         RT_SCOPE_UNIVERSE, proto,
 +                         sk ? inet_sk_flowi_flags(sk) : 0,
 +                         daddr, saddr, dport, sport);
        if (sk)
                security_sk_classify_flow(sk, flowi4_to_flowi(&fl4));
        return ip_route_output_flow(net, &fl4, sk);
@@@ -224,21 -230,25 +225,21 @@@ static inline struct rtable *ip_route_c
                                              __be16 sport, __be16 dport,
                                              struct sock *sk, bool can_sleep)
  {
 -      struct flowi4 fl4 = {
 -              .flowi4_oif = oif,
 -              .flowi4_mark = sk->sk_mark,
 -              .daddr = dst,
 -              .saddr = src,
 -              .flowi4_tos = tos,
 -              .flowi4_proto = protocol,
 -              .fl4_sport = sport,
 -              .fl4_dport = dport,
 -      };
        struct net *net = sock_net(sk);
        struct rtable *rt;
 +      struct flowi4 fl4;
 +      __u8 flow_flags;
  
 +      flow_flags = 0;
        if (inet_sk(sk)->transparent)
 -              fl4.flowi4_flags |= FLOWI_FLAG_ANYSRC;
 +              flow_flags |= FLOWI_FLAG_ANYSRC;
        if (protocol == IPPROTO_TCP)
 -              fl4.flowi4_flags |= FLOWI_FLAG_PRECOW_METRICS;
 +              flow_flags |= FLOWI_FLAG_PRECOW_METRICS;
        if (can_sleep)
 -              fl4.flowi4_flags |= FLOWI_FLAG_CAN_SLEEP;
 +              flow_flags |= FLOWI_FLAG_CAN_SLEEP;
 +
 +      flowi4_init_output(&fl4, oif, sk->sk_mark, tos, RT_SCOPE_UNIVERSE,
 +                         protocol, flow_flags, dst, src, dport, sport);
  
        if (!dst || !src) {
                rt = __ip_route_output_key(net, &fl4);
@@@ -258,17 -268,20 +259,17 @@@ static inline struct rtable *ip_route_n
                                               __be16 dport, struct sock *sk)
  {
        if (sport != orig_sport || dport != orig_dport) {
 -              struct flowi4 fl4 = {
 -                      .flowi4_oif = rt->rt_oif,
 -                      .flowi4_mark = rt->rt_mark,
 -                      .daddr = rt->rt_dst,
 -                      .saddr = rt->rt_src,
 -                      .flowi4_tos = rt->rt_tos,
 -                      .flowi4_proto = protocol,
 -                      .fl4_sport = sport,
 -                      .fl4_dport = dport
 -              };
 +              struct flowi4 fl4;
 +              __u8 flow_flags;
 +
 +              flow_flags = 0;
                if (inet_sk(sk)->transparent)
 -                      fl4.flowi4_flags |= FLOWI_FLAG_ANYSRC;
 +                      flow_flags |= FLOWI_FLAG_ANYSRC;
                if (protocol == IPPROTO_TCP)
 -                      fl4.flowi4_flags |= FLOWI_FLAG_PRECOW_METRICS;
 +                      flow_flags |= FLOWI_FLAG_PRECOW_METRICS;
 +              flowi4_init_output(&fl4, rt->rt_oif, rt->rt_mark, rt->rt_tos,
 +                                 RT_SCOPE_UNIVERSE, protocol, flow_flags,
 +                                 rt->rt_dst, rt->rt_src, dport, sport);
                ip_rt_put(rt);
                security_sk_classify_flow(sk, flowi4_to_flowi(&fl4));
                return ip_route_output_flow(sock_net(sk), &fl4, sk);