nfp: abm: save RED's parameters
authorJakub Kicinski <jakub.kicinski@netronome.com>
Mon, 12 Nov 2018 22:58:18 +0000 (14:58 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 14 Nov 2018 16:51:28 +0000 (08:51 -0800)
Use the new driver Qdisc structure to keep track of parameters
of RED Qdiscs.  This way as the Qdisc moves around in the hierarchy
we will be able to configure the HW appropriately.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: John Hurley <john.hurley@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/abm/main.h
drivers/net/ethernet/netronome/nfp/abm/qdisc.c

index daca93e90099b3ab1dc59c8382f298e6ebf15ceb..d0d85f82bd1c4f2e9f60e780bec9fa5779031d2f 100644 (file)
@@ -89,6 +89,11 @@ enum nfp_qdisc_type {
  * @use_cnt:           number of attachment points in the hierarchy
  * @num_children:      current size of the @children array
  * @children:          pointers to children
+ *
+ * @params_ok:         parameters of this Qdisc are OK for offload
+ *
+ * @red:               RED Qdisc specific parameters and state
+ * @red.threshold:     ECN marking threshold
  */
 struct nfp_qdisc {
        struct net_device *netdev;
@@ -98,6 +103,15 @@ struct nfp_qdisc {
        unsigned int use_cnt;
        unsigned int num_children;
        struct nfp_qdisc **children;
+
+       bool params_ok;
+
+       union {
+               /* TC_SETUP_QDISC_RED */
+               struct {
+                       u32 threshold;
+               } red;
+       };
 };
 
 /**
index 1b3c0b5b52bf1e2e87a849b86f60ea027dbbfd01..fb68038ec1da077769d1e3bcc000c7d627b285d4 100644 (file)
@@ -375,7 +375,10 @@ nfp_abm_red_replace(struct net_device *netdev, struct nfp_abm_link *alink,
                        qdisc->children[0] = NFP_QDISC_UNTRACKED;
        }
 
-       if (!nfp_abm_red_check_params(alink, opt)) {
+       qdisc->params_ok = nfp_abm_red_check_params(alink, opt);
+       if (qdisc->params_ok) {
+               qdisc->red.threshold = opt->set.min;
+       } else {
                err = -EINVAL;
                goto err_destroy;
        }