Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[linux-block.git] / drivers / net / ethernet / broadcom / bnxt / bnxt.c
index dc5de275352a7f589b0d410b6127bee4ea4b815c..24d55724ceff2f604978e505c61b55059c4f1d15 100644 (file)
@@ -61,6 +61,7 @@
 #include "bnxt_xdp.h"
 #include "bnxt_vfr.h"
 #include "bnxt_tc.h"
+#include "bnxt_devlink.h"
 
 #define BNXT_TX_TIMEOUT                (5 * HZ)
 
@@ -1509,7 +1510,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_napi *bnapi, u32 *raw_cons,
                                   (struct rx_tpa_end_cmp *)rxcmp,
                                   (struct rx_tpa_end_cmp_ext *)rxcmp1, event);
 
-               if (unlikely(IS_ERR(skb)))
+               if (IS_ERR(skb))
                        return -EBUSY;
 
                rc = -ENOMEM;
@@ -7214,9 +7215,7 @@ static int bnxt_init_board(struct pci_dev *pdev, struct net_device *dev)
 
        bp->stats_coal_ticks = BNXT_DEF_STATS_COAL_TICKS;
 
-       init_timer(&bp->timer);
-       bp->timer.data = (unsigned long)bp;
-       bp->timer.function = bnxt_timer;
+       setup_timer(&bp->timer, bnxt_timer, (unsigned long)bp);
        bp->current_interval = BNXT_TIMER_INTERVAL;
 
        clear_bit(BNXT_STATE_OPEN, &bp->state);
@@ -7321,23 +7320,48 @@ int bnxt_setup_mq_tc(struct net_device *dev, u8 tc)
        return 0;
 }
 
-static int bnxt_setup_flower(struct net_device *dev,
-                            struct tc_cls_flower_offload *cls_flower)
+static int bnxt_setup_tc_block_cb(enum tc_setup_type type, void *type_data,
+                                 void *cb_priv)
 {
-       struct bnxt *bp = netdev_priv(dev);
+       struct bnxt *bp = cb_priv;
 
        if (BNXT_VF(bp))
                return -EOPNOTSUPP;
 
-       return bnxt_tc_setup_flower(bp, bp->pf.fw_fid, cls_flower);
+       switch (type) {
+       case TC_SETUP_CLSFLOWER:
+               return bnxt_tc_setup_flower(bp, bp->pf.fw_fid, type_data);
+       default:
+               return -EOPNOTSUPP;
+       }
+}
+
+static int bnxt_setup_tc_block(struct net_device *dev,
+                              struct tc_block_offload *f)
+{
+       struct bnxt *bp = netdev_priv(dev);
+
+       if (f->binder_type != TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
+               return -EOPNOTSUPP;
+
+       switch (f->command) {
+       case TC_BLOCK_BIND:
+               return tcf_block_cb_register(f->block, bnxt_setup_tc_block_cb,
+                                            bp, bp);
+       case TC_BLOCK_UNBIND:
+               tcf_block_cb_unregister(f->block, bnxt_setup_tc_block_cb, bp);
+               return 0;
+       default:
+               return -EOPNOTSUPP;
+       }
 }
 
 static int bnxt_setup_tc(struct net_device *dev, enum tc_setup_type type,
                         void *type_data)
 {
        switch (type) {
-       case TC_SETUP_CLSFLOWER:
-               return bnxt_setup_flower(dev, type_data);
+       case TC_SETUP_BLOCK:
+               return bnxt_setup_tc_block(dev, type_data);
        case TC_SETUP_MQPRIO: {
                struct tc_mqprio_qopt *mqprio = type_data;