Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 22 Jul 2011 21:50:12 +0000 (14:50 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 22 Jul 2011 21:50:12 +0000 (14:50 -0700)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: (26 commits)
  IB/qib: Defer HCA error events to tasklet
  mlx4_core: Bump the driver version to 1.0
  RDMA/cxgb4: Use printk_ratelimited() instead of printk_ratelimit()
  IB/mlx4: Support PMA counters for IBoE
  IB/mlx4: Use flow counters on IBoE ports
  IB/pma: Add include file for IBA performance counters definitions
  mlx4_core: Add network flow counters
  mlx4_core: Fix location of counter index in QP context struct
  mlx4_core: Read extended capabilities into the flags field
  mlx4_core: Extend capability flags to 64 bits
  IB/mlx4: Generate GID change events in IBoE code
  IB/core: Add GID change event
  RDMA/cma: Don't allow IPoIB port space for IBoE
  RDMA: Allow for NULL .modify_device() and .modify_port() methods
  IB/qib: Update active link width
  IB/qib: Fix potential deadlock with link down interrupt
  IB/qib: Add sysfs interface to read free contexts
  IB/mthca: Remove unnecessary read of PCI_CAP_ID_EXP
  IB/qib: Remove double define
  IB/qib: Remove unnecessary read of PCI_CAP_ID_EXP
  ...

1  2 
MAINTAINERS
drivers/net/mlx4/en_netdev.c
drivers/net/mlx4/en_port.c
drivers/net/mlx4/main.c

diff --combined MAINTAINERS
@@@ -1,5 -1,4 +1,5 @@@
  
 +
        List of maintainers and how to submit kernel changes
  
  Please try to follow the guidelines below.  This will make things
@@@ -3426,10 -3425,9 +3426,9 @@@ S:     Maintaine
  F:    drivers/net/ipg.*
  
  IPATH DRIVER
- M:    Ralph Campbell <infinipath@qlogic.com>
+ M:    Mike Marciniszyn <infinipath@qlogic.com>
  L:    linux-rdma@vger.kernel.org
- T:    git git://git.qlogic.com/ipath-linux-2.6
- S:    Supported
+ S:    Maintained
  F:    drivers/infiniband/hw/ipath/
  
  IPMI SUBSYSTEM
@@@ -4290,8 -4288,8 +4289,8 @@@ S:      Maintaine
  F:    drivers/usb/musb/
  
  MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE)
 +M:    Jon Mason <mason@myri.com>
  M:    Andrew Gallatin <gallatin@myri.com>
 -M:    Brice Goglin <brice@myri.com>
  L:    netdev@vger.kernel.org
  W:    http://www.myri.com/scs/download-Myri10GE.html
  S:    Supported
@@@ -4585,8 -4583,9 +4584,8 @@@ S:      Maintaine
  F:    drivers/mmc/host/omap.c
  
  OMAP HS MMC SUPPORT
 -M:    Madhusudhan Chikkature <madhu.cr@ti.com>
  L:    linux-omap@vger.kernel.org
 -S:    Maintained
 +S:    Orphan
  F:    drivers/mmc/host/omap_hsmmc.c
  
  OMAP RANDOM NUMBER GENERATOR SUPPORT
@@@ -5152,6 -5151,12 +5151,12 @@@ M:    Robert Jarzmik <robert.jarzmik@free.
  L:    rtc-linux@googlegroups.com
  S:    Maintained
  
+ QIB DRIVER
+ M:    Mike Marciniszyn <infinipath@qlogic.com>
+ L:    linux-rdma@vger.kernel.org
+ S:    Supported
+ F:    drivers/infiniband/hw/qib/
  QLOGIC QLA1280 SCSI DRIVER
  M:    Michael Reed <mdr@sgi.com>
  L:    linux-scsi@vger.kernel.org
@@@ -6242,14 -6247,9 +6247,14 @@@ F:    drivers/char/toshiba.
  F:    include/linux/toshiba.h
  
  TMIO MMC DRIVER
 +M:    Guennadi Liakhovetski <g.liakhovetski@gmx.de>
  M:    Ian Molton <ian@mnementh.co.uk>
 +L:    linux-mmc@vger.kernel.org
  S:    Maintained
 -F:    drivers/mmc/host/tmio_mmc.*
 +F:    drivers/mmc/host/tmio_mmc*
 +F:    drivers/mmc/host/sh_mobile_sdhi.c
 +F:    include/linux/mmc/tmio.h
 +F:    include/linux/mmc/sh_mobile_sdhi.h
  
  TMPFS (SHMEM FILESYSTEM)
  M:    Hugh Dickins <hughd@google.com>
@@@ -6326,7 -6326,7 +6331,7 @@@ F:      drivers/scsi/u14-34f.
  
  UBI FILE SYSTEM (UBIFS)
  M:    Artem Bityutskiy <dedekind1@gmail.com>
 -M:    Adrian Hunter <adrian.hunter@nokia.com>
 +M:    Adrian Hunter <adrian.hunter@intel.com>
  L:    linux-mtd@lists.infradead.org
  T:    git git://git.infradead.org/ubifs-2.6.git
  W:    http://www.linux-mtd.infradead.org/doc/ubifs.html
  #include "mlx4_en.h"
  #include "en_port.h"
  
 -
 -static void mlx4_en_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
 -{
 -      struct mlx4_en_priv *priv = netdev_priv(dev);
 -      struct mlx4_en_dev *mdev = priv->mdev;
 -      int err;
 -
 -      en_dbg(HW, priv, "Registering VLAN group:%p\n", grp);
 -      priv->vlgrp = grp;
 -
 -      mutex_lock(&mdev->state_lock);
 -      if (mdev->device_up && priv->port_up) {
 -              err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, grp);
 -              if (err)
 -                      en_err(priv, "Failed configuring VLAN filter\n");
 -      }
 -      mutex_unlock(&mdev->state_lock);
 -}
 -
  static void mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
  {
        struct mlx4_en_priv *priv = netdev_priv(dev);
        int err;
        int idx;
  
 -      if (!priv->vlgrp)
 -              return;
 +      en_dbg(HW, priv, "adding VLAN:%d\n", vid);
  
 -      en_dbg(HW, priv, "adding VLAN:%d (vlgrp entry:%p)\n",
 -             vid, vlan_group_get_device(priv->vlgrp, vid));
 +      set_bit(vid, priv->active_vlans);
  
        /* Add VID to port VLAN filter */
        mutex_lock(&mdev->state_lock);
        if (mdev->device_up && priv->port_up) {
 -              err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp);
 +              err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
                if (err)
                        en_err(priv, "Failed configuring VLAN filter\n");
        }
@@@ -76,9 -97,12 +76,9 @@@ static void mlx4_en_vlan_rx_kill_vid(st
        int err;
        int idx;
  
 -      if (!priv->vlgrp)
 -              return;
 +      en_dbg(HW, priv, "Killing VID:%d\n", vid);
  
 -      en_dbg(HW, priv, "Killing VID:%d (vlgrp:%p vlgrp entry:%p)\n",
 -             vid, priv->vlgrp, vlan_group_get_device(priv->vlgrp, vid));
 -      vlan_group_set_device(priv->vlgrp, vid, NULL);
 +      clear_bit(vid, priv->active_vlans);
  
        /* Remove VID from port VLAN filter */
        mutex_lock(&mdev->state_lock);
                en_err(priv, "could not find vid %d in cache\n", vid);
  
        if (mdev->device_up && priv->port_up) {
 -              err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp);
 +              err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
                if (err)
                        en_err(priv, "Failed configuring VLAN filter\n");
        }
@@@ -215,7 -239,8 +215,8 @@@ static void mlx4_en_do_set_multicast(st
                        priv->flags |= MLX4_EN_FLAG_PROMISC;
  
                        /* Enable promiscouos mode */
-                       if (!mdev->dev->caps.vep_uc_steering)
+                       if (!(mdev->dev->caps.flags &
+                                               MLX4_DEV_CAP_FLAG_VEP_UC_STEER))
                                err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port,
                                                             priv->base_qpn, 1);
                        else
                                priv->flags |= MLX4_EN_FLAG_MC_PROMISC;
                        }
  
 -                      if (priv->vlgrp) {
 -                              /* Disable port VLAN filter */
 -                              err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, NULL);
 -                              if (err)
 -                                      en_err(priv, "Failed disabling VLAN filter\n");
 -                      }
 +                      /* Disable port VLAN filter */
 +                      err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
 +                      if (err)
 +                              en_err(priv, "Failed disabling VLAN filter\n");
                }
                goto out;
        }
                priv->flags &= ~MLX4_EN_FLAG_PROMISC;
  
                /* Disable promiscouos mode */
-               if (!mdev->dev->caps.vep_uc_steering)
+               if (!(mdev->dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_UC_STEER))
                        err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port,
                                                     priv->base_qpn, 0);
                else
                }
  
                /* Enable port VLAN filter */
 -              err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp);
 +              err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
                if (err)
                        en_err(priv, "Failed enabling VLAN filter\n");
        }
@@@ -1020,6 -1047,7 +1021,6 @@@ static const struct net_device_ops mlx4
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_change_mtu         = mlx4_en_change_mtu,
        .ndo_tx_timeout         = mlx4_en_tx_timeout,
 -      .ndo_vlan_rx_register   = mlx4_en_vlan_rx_register,
        .ndo_vlan_rx_add_vid    = mlx4_en_vlan_rx_add_vid,
        .ndo_vlan_rx_kill_vid   = mlx4_en_vlan_rx_kill_vid,
  #ifdef CONFIG_NET_POLL_CONTROLLER
@@@ -48,7 -48,7 +48,7 @@@ int mlx4_SET_MCAST_FLTR(struct mlx4_de
                        MLX4_CMD_SET_MCAST_FLTR, MLX4_CMD_TIME_CLASS_B);
  }
  
 -int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, u8 port, struct vlan_group *grp)
 +int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, struct mlx4_en_priv *priv)
  {
        struct mlx4_cmd_mailbox *mailbox;
        struct mlx4_set_vlan_fltr_mbox *filter;
                return PTR_ERR(mailbox);
  
        filter = mailbox->buf;
 -      if (grp) {
 -              memset(filter, 0, sizeof *filter);
 -              for (i = VLAN_FLTR_SIZE - 1; i >= 0; i--) {
 -                      entry = 0;
 -                      for (j = 0; j < 32; j++)
 -                              if (vlan_group_get_device(grp, index++))
 -                                      entry |= 1 << j;
 -                      filter->entry[i] = cpu_to_be32(entry);
 -              }
 -      } else {
 -              /* When no vlans are configured we block all vlans */
 -              memset(filter, 0, sizeof(*filter));
 +      memset(filter, 0, sizeof(*filter));
 +      for (i = VLAN_FLTR_SIZE - 1; i >= 0; i--) {
 +              entry = 0;
 +              for (j = 0; j < 32; j++)
 +                      if (test_bit(index++, priv->active_vlans))
 +                              entry |= 1 << j;
 +              filter->entry[i] = cpu_to_be32(entry);
        }
 -      err = mlx4_cmd(dev, mailbox->dma, port, 0, MLX4_CMD_SET_VLAN_FLTR,
 +      err = mlx4_cmd(dev, mailbox->dma, priv->port, 0, MLX4_CMD_SET_VLAN_FLTR,
                       MLX4_CMD_TIME_CLASS_B);
        mlx4_free_cmd_mailbox(dev, mailbox);
        return err;
@@@ -114,9 -119,11 +114,11 @@@ int mlx4_SET_PORT_qpn_calc(struct mlx4_
        struct mlx4_set_port_rqp_calc_context *context;
        int err;
        u32 in_mod;
-       u32 m_promisc = (dev->caps.vep_mc_steering) ? MCAST_DIRECT : MCAST_DEFAULT;
+       u32 m_promisc = (dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_MC_STEER) ?
+                                               MCAST_DIRECT : MCAST_DEFAULT;
  
-       if (dev->caps.vep_mc_steering && dev->caps.vep_uc_steering)
+       if (dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_MC_STEER  &&
+                       dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_UC_STEER)
                return 0;
  
        mailbox = mlx4_alloc_cmd_mailbox(dev);
diff --combined drivers/net/mlx4/main.c
@@@ -143,6 -143,7 +143,7 @@@ static void mlx4_set_port_mask(struct m
                if (dev->caps.port_type[i] == MLX4_PORT_TYPE_IB)
                        dev->caps.port_mask |= 1 << (i - 1);
  }
  static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
  {
        int err;
        dev->caps.bmme_flags         = dev_cap->bmme_flags;
        dev->caps.reserved_lkey      = dev_cap->reserved_lkey;
        dev->caps.stat_rate_support  = dev_cap->stat_rate_support;
-       dev->caps.udp_rss            = dev_cap->udp_rss;
-       dev->caps.loopback_support   = dev_cap->loopback_support;
-       dev->caps.vep_uc_steering    = dev_cap->vep_uc_steering;
-       dev->caps.vep_mc_steering    = dev_cap->vep_mc_steering;
-       dev->caps.wol                = dev_cap->wol;
        dev->caps.max_gso_sz         = dev_cap->max_gso_sz;
  
        dev->caps.log_num_macs  = log_num_mac;
  
        mlx4_set_port_mask(dev);
  
+       dev->caps.max_counters = 1 << ilog2(dev_cap->max_counters);
        dev->caps.reserved_qps_cnt[MLX4_QP_REGION_FW] = dev_cap->reserved_qps;
        dev->caps.reserved_qps_cnt[MLX4_QP_REGION_ETH_ADDR] =
                dev->caps.reserved_qps_cnt[MLX4_QP_REGION_FC_ADDR] =
@@@ -839,6 -837,45 +837,45 @@@ err_stop_fw
        return err;
  }
  
+ static int mlx4_init_counters_table(struct mlx4_dev *dev)
+ {
+       struct mlx4_priv *priv = mlx4_priv(dev);
+       int nent;
+       if (!(dev->caps.flags & MLX4_DEV_CAP_FLAG_COUNTERS))
+               return -ENOENT;
+       nent = dev->caps.max_counters;
+       return mlx4_bitmap_init(&priv->counters_bitmap, nent, nent - 1, 0, 0);
+ }
+ static void mlx4_cleanup_counters_table(struct mlx4_dev *dev)
+ {
+       mlx4_bitmap_cleanup(&mlx4_priv(dev)->counters_bitmap);
+ }
+ int mlx4_counter_alloc(struct mlx4_dev *dev, u32 *idx)
+ {
+       struct mlx4_priv *priv = mlx4_priv(dev);
+       if (!(dev->caps.flags & MLX4_DEV_CAP_FLAG_COUNTERS))
+               return -ENOENT;
+       *idx = mlx4_bitmap_alloc(&priv->counters_bitmap);
+       if (*idx == -1)
+               return -ENOMEM;
+       return 0;
+ }
+ EXPORT_SYMBOL_GPL(mlx4_counter_alloc);
+ void mlx4_counter_free(struct mlx4_dev *dev, u32 idx)
+ {
+       mlx4_bitmap_free(&mlx4_priv(dev)->counters_bitmap, idx);
+       return;
+ }
+ EXPORT_SYMBOL_GPL(mlx4_counter_free);
  static int mlx4_setup_hca(struct mlx4_dev *dev)
  {
        struct mlx4_priv *priv = mlx4_priv(dev);
                goto err_qp_table_free;
        }
  
+       err = mlx4_init_counters_table(dev);
+       if (err && err != -ENOENT) {
+               mlx4_err(dev, "Failed to initialize counters table, aborting.\n");
+               goto err_counters_table_free;
+       }
        for (port = 1; port <= dev->caps.num_ports; port++) {
                enum mlx4_port_type port_type = 0;
                mlx4_SENSE_PORT(dev, port, &port_type);
  err_mcg_table_free:
        mlx4_cleanup_mcg_table(dev);
  
+ err_counters_table_free:
+       mlx4_cleanup_counters_table(dev);
  err_qp_table_free:
        mlx4_cleanup_qp_table(dev);
  
@@@ -1230,11 -1276,11 +1276,11 @@@ static int __mlx4_init_one(struct pci_d
        INIT_LIST_HEAD(&priv->pgdir_list);
        mutex_init(&priv->pgdir_mutex);
  
 -      pci_read_config_byte(pdev, PCI_REVISION_ID, &dev->rev_id);
 -
        INIT_LIST_HEAD(&priv->bf_list);
        mutex_init(&priv->bf_mutex);
  
 +      dev->rev_id = pdev->revision;
 +
        /*
         * Now reset the HCA before we touch the PCI capabilities or
         * attempt a firmware command, since a boot ROM may have left
@@@ -1299,6 -1345,7 +1345,7 @@@ err_port
        for (--port; port >= 1; --port)
                mlx4_cleanup_port_info(&priv->port[port]);
  
+       mlx4_cleanup_counters_table(dev);
        mlx4_cleanup_mcg_table(dev);
        mlx4_cleanup_qp_table(dev);
        mlx4_cleanup_srq_table(dev);
@@@ -1359,6 -1406,7 +1406,7 @@@ static void mlx4_remove_one(struct pci_
                        mlx4_CLOSE_PORT(dev, p);
                }
  
+               mlx4_cleanup_counters_table(dev);
                mlx4_cleanup_mcg_table(dev);
                mlx4_cleanup_qp_table(dev);
                mlx4_cleanup_srq_table(dev);