return ret;
  }
  
 -static int bond_master_upper_dev_link(struct net_device *bond_dev,
 -                                    struct net_device *slave_dev,
 -                                    struct slave *slave)
 +static enum netdev_lag_tx_type bond_lag_tx_type(struct bonding *bond)
  {
 +      switch (BOND_MODE(bond)) {
 +      case BOND_MODE_ROUNDROBIN:
 +              return NETDEV_LAG_TX_TYPE_ROUNDROBIN;
 +      case BOND_MODE_ACTIVEBACKUP:
 +              return NETDEV_LAG_TX_TYPE_ACTIVEBACKUP;
 +      case BOND_MODE_BROADCAST:
 +              return NETDEV_LAG_TX_TYPE_BROADCAST;
 +      case BOND_MODE_XOR:
 +      case BOND_MODE_8023AD:
 +              return NETDEV_LAG_TX_TYPE_HASH;
 +      default:
 +              return NETDEV_LAG_TX_TYPE_UNKNOWN;
 +      }
 +}
 +
 +static int bond_master_upper_dev_link(struct bonding *bond, struct slave *slave)
 +{
 +      struct netdev_lag_upper_info lag_upper_info;
        int err;
  
 -      err = netdev_master_upper_dev_link_private(slave_dev, bond_dev, slave);
 +      lag_upper_info.tx_type = bond_lag_tx_type(bond);
 +      err = netdev_master_upper_dev_link(slave->dev, bond->dev, slave,
 +                                         &lag_upper_info);
        if (err)
                return err;
-       slave->dev->flags |= IFF_SLAVE;
 -      rtmsg_ifinfo(RTM_NEWLINK, slave_dev, IFF_SLAVE, GFP_KERNEL);
 +      rtmsg_ifinfo(RTM_NEWLINK, slave->dev, IFF_SLAVE, GFP_KERNEL);
        return 0;
  }
  
 
        } fdb_notify;
  #define MLXSW_SP_DEFAULT_AGEING_TIME 300
        u32 ageing_time;
 -      struct {
 -              struct net_device *dev;
 -              unsigned int ref_count;
 -      } master_bridge;
+       struct mutex fdb_lock;  /* Make sure FDB sessions are atomic. */
 +      struct mlxsw_sp_upper master_bridge;
 +      struct mlxsw_sp_upper lags[MLXSW_SP_LAG_MAX];
  };
  
 +static inline struct mlxsw_sp_upper *
 +mlxsw_sp_lag_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id)
 +{
 +      return &mlxsw_sp->lags[lag_id];
 +}
 +
  struct mlxsw_sp_port_pcpu_stats {
        u64                     rx_packets;
        u64                     rx_bytes;
 
        if (!sfd_pl)
                return -ENOMEM;
  
+       mutex_lock(&mlxsw_sp_port->mlxsw_sp->fdb_lock);
 +      if (mlxsw_sp_port_is_vport(mlxsw_sp_port)) {
 +              u16 tmp;
 +
 +              tmp = mlxsw_sp_vport_vfid_get(mlxsw_sp_port);
 +              vport_fid = mlxsw_sp_vfid_to_fid(tmp);
 +              vport_vid = mlxsw_sp_vport_vid_get(mlxsw_sp_port);
 +      }
 +
        mlxsw_reg_sfd_pack(sfd_pl, MLXSW_REG_SFD_OP_QUERY_DUMP, 0);
        do {
                mlxsw_reg_sfd_num_rec_set(sfd_pl, MLXSW_REG_SFD_REC_MAX_COUNT);
 
                "txd2-skew-ps", "txd3-skew-ps"
        };
        static const char *control_skews[2] = {"txen-skew-ps", "rxdv-skew-ps"};
+       const struct device *dev_walker;
  
-       if (!of_node && dev->parent->of_node)
-               of_node = dev->parent->of_node;
+       /* The Micrel driver has a deprecated option to place phy OF
+        * properties in the MAC node. Walk up the tree of devices to
+        * find a device with an OF node.
+        */
 -      dev_walker = &phydev->dev;
++      dev_walker = &phydev->mdio.dev;
+       do {
+               of_node = dev_walker->of_node;
+               dev_walker = dev_walker->parent;
+       } while (!of_node && dev_walker);
  
        if (of_node) {
                ksz9031_of_load_skew_values(phydev, of_node,