with the CPU that processes transmit completions for that queue
 (transmit interrupts).
 
+Per TX Queue rate limitation:
+=============================
+
+These are rate-limitation mechanisms implemented by HW, where currently
+a max-rate attribute is supported, by setting a Mbps value to
+
+/sys/class/net/<dev>/queues/tx-<n>/tx_maxrate
+
+A value of zero means disabled, and this is the default.
 
 Further Information
 ===================
 
 #ifdef CONFIG_BQL
        struct dql              dql;
 #endif
+       unsigned long           tx_maxrate;
 } ____cacheline_aligned_in_smp;
 
 static inline int netdev_queue_numa_node_read(const struct netdev_queue *q)
  *     be otherwise expressed by feature flags. The check is called with
  *     the set of features that the stack has calculated and it returns
  *     those the driver believes to be appropriate.
+ * int (*ndo_set_tx_maxrate)(struct net_device *dev,
+ *                          int queue_index, u32 maxrate);
+ *     Called when a user wants to set a max-rate limitation of specific
+ *     TX queue.
  */
 struct net_device_ops {
        int                     (*ndo_init)(struct net_device *dev);
        netdev_features_t       (*ndo_features_check) (struct sk_buff *skb,
                                                       struct net_device *dev,
                                                       netdev_features_t features);
+       int                     (*ndo_set_tx_maxrate)(struct net_device *dev,
+                                                     int queue_index,
+                                                     u32 maxrate);
 };
 
 /**
 
        return sprintf(buf, "%lu", trans_timeout);
 }
 
+#ifdef CONFIG_XPS
+static inline unsigned int get_netdev_queue_index(struct netdev_queue *queue)
+{
+       struct net_device *dev = queue->dev;
+       int i;
+
+       for (i = 0; i < dev->num_tx_queues; i++)
+               if (queue == &dev->_tx[i])
+                       break;
+
+       BUG_ON(i >= dev->num_tx_queues);
+
+       return i;
+}
+
+static ssize_t show_tx_maxrate(struct netdev_queue *queue,
+                              struct netdev_queue_attribute *attribute,
+                              char *buf)
+{
+       return sprintf(buf, "%lu\n", queue->tx_maxrate);
+}
+
+static ssize_t set_tx_maxrate(struct netdev_queue *queue,
+                             struct netdev_queue_attribute *attribute,
+                             const char *buf, size_t len)
+{
+       struct net_device *dev = queue->dev;
+       int err, index = get_netdev_queue_index(queue);
+       u32 rate = 0;
+
+       err = kstrtou32(buf, 10, &rate);
+       if (err < 0)
+               return err;
+
+       if (!rtnl_trylock())
+               return restart_syscall();
+
+       err = -EOPNOTSUPP;
+       if (dev->netdev_ops->ndo_set_tx_maxrate)
+               err = dev->netdev_ops->ndo_set_tx_maxrate(dev, index, rate);
+
+       rtnl_unlock();
+       if (!err) {
+               queue->tx_maxrate = rate;
+               return len;
+       }
+       return err;
+}
+
+static struct netdev_queue_attribute queue_tx_maxrate =
+       __ATTR(tx_maxrate, S_IRUGO | S_IWUSR,
+              show_tx_maxrate, set_tx_maxrate);
+#endif
+
 static struct netdev_queue_attribute queue_trans_timeout =
        __ATTR(tx_timeout, S_IRUGO, show_trans_timeout, NULL);
 
 #endif /* CONFIG_BQL */
 
 #ifdef CONFIG_XPS
-static unsigned int get_netdev_queue_index(struct netdev_queue *queue)
-{
-       struct net_device *dev = queue->dev;
-       unsigned int i;
-
-       i = queue - dev->_tx;
-       BUG_ON(i >= dev->num_tx_queues);
-
-       return i;
-}
-
-
 static ssize_t show_xps_map(struct netdev_queue *queue,
                            struct netdev_queue_attribute *attribute, char *buf)
 {
        &queue_trans_timeout.attr,
 #ifdef CONFIG_XPS
        &xps_cpus_attribute.attr,
+       &queue_tx_maxrate.attr,
 #endif
        NULL
 };