]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
net: propagate tc filter chain index down the ndo_setup_tc call
authorJiri Pirko <jiri@mellanox.com>
Tue, 6 Jun 2017 15:00:16 +0000 (17:00 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 8 Jun 2017 13:55:53 +0000 (09:55 -0400)
We need to push the chain index down to the drivers, so they have the
information to which chain the rule belongs. For now, no driver supports
multichain offload, so only chain 0 is supported. This is needed to
prevent chain squashes during offload for now. Later this will be used
to implement multichain offload.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
26 files changed:
drivers/net/ethernet/amd/xgbe/xgbe-drv.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
drivers/net/ethernet/intel/fm10k/fm10k_netdev.c
drivers/net/ethernet/intel/i40e/i40e_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/ethernet/mellanox/mlx4/en_netdev.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
drivers/net/ethernet/netronome/nfp/nfp_net_common.c
drivers/net/ethernet/sfc/efx.h
drivers/net/ethernet/sfc/falcon/efx.h
drivers/net/ethernet/sfc/falcon/tx.c
drivers/net/ethernet/sfc/tx.c
drivers/net/ethernet/ti/netcp_core.c
include/linux/netdevice.h
net/dsa/slave.c
net/sched/cls_bpf.c
net/sched/cls_flower.c
net/sched/cls_matchall.c
net/sched/cls_u32.c
net/sched/sch_mqprio.c

index 5a2ad9c5faab16a8206bde14a7fb28f079e0ec15..a934bd5d05075308f6087c5a4aaa0e099251fda3 100644 (file)
@@ -1846,7 +1846,8 @@ static void xgbe_poll_controller(struct net_device *netdev)
 }
 #endif /* End CONFIG_NET_POLL_CONTROLLER */
 
-static int xgbe_setup_tc(struct net_device *netdev, u32 handle, __be16 proto,
+static int xgbe_setup_tc(struct net_device *netdev, u32 handle, u32 chain_index,
+                        __be16 proto,
                         struct tc_to_netdev *tc_to_netdev)
 {
        struct xgbe_prv_data *pdata = netdev_priv(netdev);
index 5f49334dcad5a8c8602cc3aa2e8795b2d489bb43..ef734675885e72fd61013d663940f25fa95d44c5 100644 (file)
@@ -4273,8 +4273,8 @@ int bnx2x_setup_tc(struct net_device *dev, u8 num_tc)
        return 0;
 }
 
-int __bnx2x_setup_tc(struct net_device *dev, u32 handle, __be16 proto,
-                    struct tc_to_netdev *tc)
+int __bnx2x_setup_tc(struct net_device *dev, u32 handle, u32 chain_index,
+                    __be16 proto, struct tc_to_netdev *tc)
 {
        if (tc->type != TC_SETUP_MQPRIO)
                return -EINVAL;
index 243cb9748d35da488463f60d0e59a035a4330333..c26688d2f32663f348b5c21dff1931f07b7487c8 100644 (file)
@@ -486,8 +486,8 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev);
 
 /* setup_tc callback */
 int bnx2x_setup_tc(struct net_device *dev, u8 num_tc);
-int __bnx2x_setup_tc(struct net_device *dev, u32 handle, __be16 proto,
-                    struct tc_to_netdev *tc);
+int __bnx2x_setup_tc(struct net_device *dev, u32 handle, u32 chain_index,
+                    __be16 proto, struct tc_to_netdev *tc);
 
 int bnx2x_get_vf_config(struct net_device *dev, int vf,
                        struct ifla_vf_info *ivi);
index c1cd72a5eccf80d8ab171681d24f608bd6dace1b..11e8a866a31232e123567fc539b4a1ae45a7cfad 100644 (file)
@@ -7103,8 +7103,8 @@ int bnxt_setup_mq_tc(struct net_device *dev, u8 tc)
        return 0;
 }
 
-static int bnxt_setup_tc(struct net_device *dev, u32 handle, __be16 proto,
-                        struct tc_to_netdev *ntc)
+static int bnxt_setup_tc(struct net_device *dev, u32 handle, u32 chain_index,
+                        __be16 proto, struct tc_to_netdev *ntc)
 {
        if (ntc->type != TC_SETUP_MQPRIO)
                return -EINVAL;
index 91685bf21878c62d72e8ab9e3d37e80ead2dc7d9..ff8bcf56bf3f3647ca4a92fd7839da520cf42321 100644 (file)
@@ -2823,12 +2823,15 @@ static int cxgb_set_tx_maxrate(struct net_device *dev, int index, u32 rate)
        return err;
 }
 
-static int cxgb_setup_tc(struct net_device *dev, u32 handle, __be16 proto,
-                        struct tc_to_netdev *tc)
+static int cxgb_setup_tc(struct net_device *dev, u32 handle, u32 chain_index,
+                        __be16 proto, struct tc_to_netdev *tc)
 {
        struct port_info *pi = netdev2pinfo(dev);
        struct adapter *adap = netdev2adap(dev);
 
+       if (chain_index)
+               return -EOPNOTSUPP;
+
        if (!(adap->flags & FULL_INIT_DONE)) {
                dev_err(adap->pdev_dev,
                        "Failed to setup tc on port %d. Link Down?\n",
index 9a520e4f0df9a0d47b75f71f01557414ba3d4eab..a5501af6db991fdd49438f905902f2a4eb65e7e5 100644 (file)
@@ -342,8 +342,8 @@ static void dpaa_get_stats64(struct net_device *net_dev,
        }
 }
 
-static int dpaa_setup_tc(struct net_device *net_dev, u32 handle, __be16 proto,
-                        struct tc_to_netdev *tc)
+static int dpaa_setup_tc(struct net_device *net_dev, u32 handle,
+                        u32 chain_index, __be16 proto, struct tc_to_netdev *tc)
 {
        struct dpaa_priv *priv = netdev_priv(net_dev);
        u8 num_tc;
index 24f2f6f86f5a3a50929eb52b5dbe6eb08e0e8635..5e37387c70825db8c1edc425c21478787e213a5e 100644 (file)
@@ -1265,8 +1265,8 @@ err_queueing_scheme:
        return err;
 }
 
-static int __fm10k_setup_tc(struct net_device *dev, u32 handle, __be16 proto,
-                           struct tc_to_netdev *tc)
+static int __fm10k_setup_tc(struct net_device *dev, u32 handle, u32 chain_index,
+                           __be16 proto, struct tc_to_netdev *tc)
 {
        if (tc->type != TC_SETUP_MQPRIO)
                return -EINVAL;
index 5fef27ebfa52671b9dfea5bcf8a1e273f5678253..abab7fb7a3fcc0af654260e95b4b28637a1c481e 100644 (file)
@@ -5509,7 +5509,8 @@ exit:
        return ret;
 }
 
-static int __i40e_setup_tc(struct net_device *netdev, u32 handle, __be16 proto,
+static int __i40e_setup_tc(struct net_device *netdev, u32 handle,
+                          u32 chain_index, __be16 proto,
                           struct tc_to_netdev *tc)
 {
        if (tc->type != TC_SETUP_MQPRIO)
index 54463f03b3db50e6b5b0329c94a419ea6b2a7a9a..812319ab77db9612e91ea19583a6cb21a80cf4d5 100644 (file)
@@ -9200,11 +9200,14 @@ free_jump:
        return err;
 }
 
-static int __ixgbe_setup_tc(struct net_device *dev, u32 handle, __be16 proto,
-                           struct tc_to_netdev *tc)
+static int __ixgbe_setup_tc(struct net_device *dev, u32 handle, u32 chain_index,
+                           __be16 proto, struct tc_to_netdev *tc)
 {
        struct ixgbe_adapter *adapter = netdev_priv(dev);
 
+       if (chain_index)
+               return -EOPNOTSUPP;
+
        if (TC_H_MAJ(handle) == TC_H_MAJ(TC_H_INGRESS) &&
            tc->type == TC_SETUP_CLSU32) {
                switch (tc->cls_u32->command) {
index 82436742ad75b011847cde250bc26f7a2d9e7175..c1de75fc399a31fc30d34b4a8ffe84a05baa7a85 100644 (file)
@@ -86,7 +86,8 @@ int mlx4_en_setup_tc(struct net_device *dev, u8 up)
        return 0;
 }
 
-static int __mlx4_en_setup_tc(struct net_device *dev, u32 handle, __be16 proto,
+static int __mlx4_en_setup_tc(struct net_device *dev, u32 handle,
+                             u32 chain_index, __be16 proto,
                              struct tc_to_netdev *tc)
 {
        if (tc->type != TC_SETUP_MQPRIO)
index cdff04b2aea19de6c32779686c953a5caedd2cdf..5afec0f4a6588b8198603ff3f890a24e617ff53a 100644 (file)
@@ -2991,13 +2991,17 @@ out:
 }
 
 static int mlx5e_ndo_setup_tc(struct net_device *dev, u32 handle,
-                             __be16 proto, struct tc_to_netdev *tc)
+                             u32 chain_index, __be16 proto,
+                             struct tc_to_netdev *tc)
 {
        struct mlx5e_priv *priv = netdev_priv(dev);
 
        if (TC_H_MAJ(handle) != TC_H_MAJ(TC_H_INGRESS))
                goto mqprio;
 
+       if (chain_index)
+               return -EOPNOTSUPP;
+
        switch (tc->type) {
        case TC_SETUP_CLSFLOWER:
                switch (tc->cls_flower->command) {
index 79462c0368a0781ca7a38354726ed628097c0c89..70c2b8d020bd6d45311c4469de058a0a9f581bf6 100644 (file)
@@ -652,7 +652,8 @@ static int mlx5e_rep_get_phys_port_name(struct net_device *dev,
 }
 
 static int mlx5e_rep_ndo_setup_tc(struct net_device *dev, u32 handle,
-                                 __be16 proto, struct tc_to_netdev *tc)
+                                 u32 chain_index, __be16 proto,
+                                 struct tc_to_netdev *tc)
 {
        struct mlx5e_priv *priv = netdev_priv(dev);
 
@@ -664,9 +665,13 @@ static int mlx5e_rep_ndo_setup_tc(struct net_device *dev, u32 handle,
                struct net_device *uplink_dev = mlx5_eswitch_get_uplink_netdev(esw);
 
                return uplink_dev->netdev_ops->ndo_setup_tc(uplink_dev, handle,
+                                                           chain_index,
                                                            proto, tc);
        }
 
+       if (chain_index)
+               return -EOPNOTSUPP;
+
        switch (tc->type) {
        case TC_SETUP_CLSFLOWER:
                switch (tc->cls_flower->command) {
index f60e2ba515d030b283047dc3ba49408816dd6444..a2316d03881001fe826fc5d23ec1c93f66b0586b 100644 (file)
@@ -1699,11 +1699,15 @@ static void mlxsw_sp_port_del_cls_matchall(struct mlxsw_sp_port *mlxsw_sp_port,
 }
 
 static int mlxsw_sp_setup_tc(struct net_device *dev, u32 handle,
-                            __be16 proto, struct tc_to_netdev *tc)
+                            u32 chain_index, __be16 proto,
+                            struct tc_to_netdev *tc)
 {
        struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
        bool ingress = TC_H_MAJ(handle) == TC_H_MAJ(TC_H_INGRESS);
 
+       if (chain_index)
+               return -EOPNOTSUPP;
+
        switch (tc->type) {
        case TC_SETUP_MATCHALL:
                switch (tc->cls_mall->command) {
index 4f0df63de626484022c5cb4a5922385bd38051a8..49d1756d6a8e0e74b4045b58e6b34c546ad48cc1 100644 (file)
@@ -2994,11 +2994,14 @@ static void nfp_net_stat64(struct net_device *netdev,
 }
 
 static int
-nfp_net_setup_tc(struct net_device *netdev, u32 handle, __be16 proto,
-                struct tc_to_netdev *tc)
+nfp_net_setup_tc(struct net_device *netdev, u32 handle, u32 chain_index,
+                __be16 proto, struct tc_to_netdev *tc)
 {
        struct nfp_net *nn = netdev_priv(netdev);
 
+       if (chain_index)
+               return -EOPNOTSUPP;
+
        return nfp_app_setup_tc(nn->app, netdev, handle, proto, tc);
 }
 
index a0c52e3281024b566dfe4b58e3014f26aadb0eaf..fcea9371ab7f636b885babfdc3ded58a6a941eec 100644 (file)
@@ -32,8 +32,8 @@ netdev_tx_t efx_hard_start_xmit(struct sk_buff *skb,
                                struct net_device *net_dev);
 netdev_tx_t efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb);
 void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index);
-int efx_setup_tc(struct net_device *net_dev, u32 handle, __be16 proto,
-                struct tc_to_netdev *tc);
+int efx_setup_tc(struct net_device *net_dev, u32 handle, u32 chain_index,
+                __be16 proto, struct tc_to_netdev *tc);
 unsigned int efx_tx_max_skb_descs(struct efx_nic *efx);
 extern unsigned int efx_piobuf_size;
 extern bool efx_separate_tx_channels;
index c89456fa148c797757411b34acca918aba2584b7..e5a7a40cc8b68ee092dddc2068760cb1d716383a 100644 (file)
@@ -32,8 +32,8 @@ netdev_tx_t ef4_hard_start_xmit(struct sk_buff *skb,
                                struct net_device *net_dev);
 netdev_tx_t ef4_enqueue_skb(struct ef4_tx_queue *tx_queue, struct sk_buff *skb);
 void ef4_xmit_done(struct ef4_tx_queue *tx_queue, unsigned int index);
-int ef4_setup_tc(struct net_device *net_dev, u32 handle, __be16 proto,
-                struct tc_to_netdev *tc);
+int ef4_setup_tc(struct net_device *net_dev, u32 handle, u32 chain_index,
+                __be16 proto, struct tc_to_netdev *tc);
 unsigned int ef4_tx_max_skb_descs(struct ef4_nic *efx);
 extern bool ef4_separate_tx_channels;
 
index f6daf09b86272397d35bc72d59c5269b4644db1c..f1520a404ac619851d1f6ed5622828b6c7fbe44c 100644 (file)
@@ -425,8 +425,8 @@ void ef4_init_tx_queue_core_txq(struct ef4_tx_queue *tx_queue)
                                     efx->n_tx_channels : 0));
 }
 
-int ef4_setup_tc(struct net_device *net_dev, u32 handle, __be16 proto,
-                struct tc_to_netdev *ntc)
+int ef4_setup_tc(struct net_device *net_dev, u32 handle, u32 chain_index,
+                __be16 proto, struct tc_to_netdev *ntc)
 {
        struct ef4_nic *efx = netdev_priv(net_dev);
        struct ef4_channel *channel;
index 3bdf87f310877a31fee219afa3de3dea91e40521..02d41eb4a8e9ae2cdabae7f1400d8506ce0abc85 100644 (file)
@@ -653,8 +653,8 @@ void efx_init_tx_queue_core_txq(struct efx_tx_queue *tx_queue)
                                     efx->n_tx_channels : 0));
 }
 
-int efx_setup_tc(struct net_device *net_dev, u32 handle, __be16 proto,
-                struct tc_to_netdev *ntc)
+int efx_setup_tc(struct net_device *net_dev, u32 handle, u32 chain_index,
+                __be16 proto, struct tc_to_netdev *ntc)
 {
        struct efx_nic *efx = netdev_priv(net_dev);
        struct efx_channel *channel;
index e6222e535019a076ea0d4cd4c902f12332f079b2..9d52c3a78621b27b355c07bff905a6df3ad5c86b 100644 (file)
@@ -1877,8 +1877,8 @@ static u16 netcp_select_queue(struct net_device *dev, struct sk_buff *skb,
        return 0;
 }
 
-static int netcp_setup_tc(struct net_device *dev, u32 handle, __be16 proto,
-                         struct tc_to_netdev *tc)
+static int netcp_setup_tc(struct net_device *dev, u32 handle, u32 chain_index,
+                         __be16 proto, struct tc_to_netdev *tc)
 {
        u8 num_tc;
        int i;
index c50c9218e31e06a98ef606967c973cdd10511460..524c7776ce96b2c661364b3297b807664338841e 100644 (file)
@@ -972,7 +972,7 @@ struct xfrmdev_ops {
  *      with PF and querying it may introduce a theoretical security risk.
  * int (*ndo_set_vf_rss_query_en)(struct net_device *dev, int vf, bool setting);
  * int (*ndo_get_vf_port)(struct net_device *dev, int vf, struct sk_buff *skb);
- * int (*ndo_setup_tc)(struct net_device *dev, u32 handle,
+ * int (*ndo_setup_tc)(struct net_device *dev, u32 handle, u32 chain_index,
  *                    __be16 protocol, struct tc_to_netdev *tc);
  *     Called to setup any 'tc' scheduler, classifier or action on @dev.
  *     This is always called from the stack with the rtnl lock held and netif
@@ -1222,7 +1222,7 @@ struct net_device_ops {
                                                   struct net_device *dev,
                                                   int vf, bool setting);
        int                     (*ndo_setup_tc)(struct net_device *dev,
-                                               u32 handle,
+                                               u32 handle, u32 chain_index,
                                                __be16 protocol,
                                                struct tc_to_netdev *tc);
 #if IS_ENABLED(CONFIG_FCOE)
index 1cfdb31a2f442121d2cbff3243780e2d899da0ce..5f3caee725eec423307a336c65c9280d247b9986 100644 (file)
@@ -836,10 +836,13 @@ static void dsa_slave_del_cls_matchall(struct net_device *dev,
 }
 
 static int dsa_slave_setup_tc(struct net_device *dev, u32 handle,
-                             __be16 protocol, struct tc_to_netdev *tc)
+                             u32 chain_index, __be16 protocol,
+                             struct tc_to_netdev *tc)
 {
        bool ingress = TC_H_MAJ(handle) == TC_H_MAJ(TC_H_INGRESS);
-       int ret = -EOPNOTSUPP;
+
+       if (chain_index)
+               return -EOPNOTSUPP;
 
        switch (tc->type) {
        case TC_SETUP_MATCHALL:
@@ -853,10 +856,8 @@ static int dsa_slave_setup_tc(struct net_device *dev, u32 handle,
                        return 0;
                }
        default:
-               break;
+               return -EOPNOTSUPP;
        }
-
-       return ret;
 }
 
 void dsa_cpu_port_ethtool_init(struct ethtool_ops *ops)
index a9c56ad4533afb0789f32ca327ecd275bae3c1bb..be0cfdf489762cfbc28894214b1188ba3c1c5fda 100644 (file)
@@ -162,6 +162,7 @@ static int cls_bpf_offload_cmd(struct tcf_proto *tp, struct cls_bpf_prog *prog,
        bpf_offload.gen_flags = prog->gen_flags;
 
        err = dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle,
+                                           tp->chain->index,
                                            tp->protocol, &offload);
 
        if (!err && (cmd == TC_CLSBPF_ADD || cmd == TC_CLSBPF_REPLACE))
index 33feaee197cfd5b28e4fde72557d19d93a45d9b6..7832eb93379b3907c2b42d9cd304cfa998237396 100644 (file)
@@ -239,7 +239,8 @@ static void fl_hw_destroy_filter(struct tcf_proto *tp, struct cls_fl_filter *f)
        tc->type = TC_SETUP_CLSFLOWER;
        tc->cls_flower = &offload;
 
-       dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, tp->protocol, tc);
+       dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, tp->chain->index,
+                                     tp->protocol, tc);
 }
 
 static int fl_hw_replace_filter(struct tcf_proto *tp,
@@ -275,8 +276,8 @@ static int fl_hw_replace_filter(struct tcf_proto *tp,
        tc->type = TC_SETUP_CLSFLOWER;
        tc->cls_flower = &offload;
 
-       err = dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, tp->protocol,
-                                           tc);
+       err = dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle,
+                                           tp->chain->index, tp->protocol, tc);
        if (!err)
                f->flags |= TCA_CLS_FLAGS_IN_HW;
 
@@ -302,7 +303,8 @@ static void fl_hw_update_stats(struct tcf_proto *tp, struct cls_fl_filter *f)
        tc->type = TC_SETUP_CLSFLOWER;
        tc->cls_flower = &offload;
 
-       dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, tp->protocol, tc);
+       dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle,
+                                     tp->chain->index, tp->protocol, tc);
 }
 
 static void __fl_delete(struct tcf_proto *tp, struct cls_fl_filter *f)
index 51859b8edd7eff3845ca3d5b5b0d900583736d4a..9dc26c32cf321e475a8f783cf423ff67562479fa 100644 (file)
@@ -64,8 +64,9 @@ static int mall_replace_hw_filter(struct tcf_proto *tp,
        offload.cls_mall->exts = &head->exts;
        offload.cls_mall->cookie = cookie;
 
-       err = dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, tp->protocol,
-                                           &offload);
+       err = dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle,
+                                           tp->chain->index,
+                                           tp->protocol, &offload);
        if (!err)
                head->flags |= TCA_CLS_FLAGS_IN_HW;
 
@@ -86,8 +87,8 @@ static void mall_destroy_hw_filter(struct tcf_proto *tp,
        offload.cls_mall->exts = NULL;
        offload.cls_mall->cookie = cookie;
 
-       dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, tp->protocol,
-                                            &offload);
+       dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, tp->chain->index,
+                                     tp->protocol, &offload);
 }
 
 static void mall_destroy(struct tcf_proto *tp)
index d20e72a095d578e65eda0dafc62217146aeea1c1..2d01195153e6c80178328c65d3b94651f3e2094f 100644 (file)
@@ -441,7 +441,8 @@ static void u32_remove_hw_knode(struct tcf_proto *tp, u32 handle)
                offload.cls_u32->command = TC_CLSU32_DELETE_KNODE;
                offload.cls_u32->knode.handle = handle;
                dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle,
-                                             tp->protocol, &offload);
+                                             tp->chain->index, tp->protocol,
+                                             &offload);
        }
 }
 
@@ -465,7 +466,8 @@ static int u32_replace_hw_hnode(struct tcf_proto *tp, struct tc_u_hnode *h,
        offload.cls_u32->hnode.prio = h->prio;
 
        err = dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle,
-                                           tp->protocol, &offload);
+                                           tp->chain->index, tp->protocol,
+                                           &offload);
        if (tc_skip_sw(flags))
                return err;
 
@@ -488,7 +490,8 @@ static void u32_clear_hw_hnode(struct tcf_proto *tp, struct tc_u_hnode *h)
                offload.cls_u32->hnode.prio = h->prio;
 
                dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle,
-                                             tp->protocol, &offload);
+                                             tp->chain->index, tp->protocol,
+                                             &offload);
        }
 }
 
@@ -522,7 +525,8 @@ static int u32_replace_hw_knode(struct tcf_proto *tp, struct tc_u_knode *n,
                offload.cls_u32->knode.link_handle = n->ht_down->handle;
 
        err = dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle,
-                                           tp->protocol, &offload);
+                                           tp->chain->index, tp->protocol,
+                                           &offload);
 
        if (!err)
                n->flags |= TCA_CLS_FLAGS_IN_HW;
index 0a4cf27ea54bd78768d4fa084f7b082460f5f266..e0c02725cd487c2a2c5f063066f29faab8ae479d 100644 (file)
@@ -43,7 +43,7 @@ static void mqprio_destroy(struct Qdisc *sch)
                struct tc_to_netdev tc = { .type = TC_SETUP_MQPRIO,
                                           { .mqprio = &offload } };
 
-               dev->netdev_ops->ndo_setup_tc(dev, sch->handle, 0, &tc);
+               dev->netdev_ops->ndo_setup_tc(dev, sch->handle, 0, 0, &tc);
        } else {
                netdev_set_num_tc(dev, 0);
        }
@@ -152,7 +152,8 @@ static int mqprio_init(struct Qdisc *sch, struct nlattr *opt)
                struct tc_to_netdev tc = { .type = TC_SETUP_MQPRIO,
                                           { .mqprio = &offload } };
 
-               err = dev->netdev_ops->ndo_setup_tc(dev, sch->handle, 0, &tc);
+               err = dev->netdev_ops->ndo_setup_tc(dev, sch->handle,
+                                                   0, 0, &tc);
                if (err)
                        return err;