devlink: implement line card active state
authorJiri Pirko <jiri@nvidia.com>
Mon, 18 Apr 2022 06:42:27 +0000 (09:42 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 18 Apr 2022 10:00:18 +0000 (11:00 +0100)
Allow driver to mark a line card as active. Expose this state to the
userspace over devlink netlink interface with proper notifications.
'active' state means that line card was plugged in after
being provisioned.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/devlink/devlink-linecard.rst
include/net/devlink.h
include/uapi/linux/devlink.h
net/core/devlink.c

index 63ccd17..6c0b892 100644 (file)
@@ -66,6 +66,7 @@ The ``devlink-linecard`` mechanism supports the following line card states:
     with a line card type.
   * ``provisioning_failed``: Provisioning was not successful.
   * ``provisioned``: Line card slot is provisioned with a type.
+  * ``active``: Line card is powered-up and active.
 
 The following diagram provides a general overview of ``devlink-linecard``
 state transitions::
@@ -85,11 +86,11 @@ state transitions::
        |                                               |
        |                 +-----------------------------+
        |                 |                             |
-       |    +------------v------------+   +------------v------------+
-       |    |                         |   |                         |
-       +-----   provisioning_failed   |   |       provisioned       |
-       |    |                         |   |                         |
-       |    +------------^------------+   +------------|------------+
+       |    +------------v------------+   +------------v------------+   +-------------------------+
+       |    |                         |   |                         ---->                         |
+       +-----   provisioning_failed   |   |       provisioned       |   |         active          |
+       |    |                         |   |                         <----                         |
+       |    +------------^------------+   +------------|------------+   +-------------------------+
        |                 |                             |
        |                 |                             |
        |                 |                +------------v------------+
index 3e49d4f..d8061a1 100644 (file)
@@ -1579,6 +1579,8 @@ void devlink_linecard_provision_set(struct devlink_linecard *linecard,
                                    const char *type);
 void devlink_linecard_provision_clear(struct devlink_linecard *linecard);
 void devlink_linecard_provision_fail(struct devlink_linecard *linecard);
+void devlink_linecard_activate(struct devlink_linecard *linecard);
+void devlink_linecard_deactivate(struct devlink_linecard *linecard);
 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
                        u32 size, u16 ingress_pools_count,
                        u16 egress_pools_count, u16 ingress_tc_count,
index de91e4a..b3d40a5 100644 (file)
@@ -350,6 +350,7 @@ enum devlink_linecard_state {
        DEVLINK_LINECARD_STATE_PROVISIONING,
        DEVLINK_LINECARD_STATE_PROVISIONING_FAILED,
        DEVLINK_LINECARD_STATE_PROVISIONED,
+       DEVLINK_LINECARD_STATE_ACTIVE,
 
        __DEVLINK_LINECARD_STATE_MAX,
        DEVLINK_LINECARD_STATE_MAX = __DEVLINK_LINECARD_STATE_MAX - 1
index b7c3a82..aec0a51 100644 (file)
@@ -10331,6 +10331,47 @@ void devlink_linecard_provision_fail(struct devlink_linecard *linecard)
 }
 EXPORT_SYMBOL_GPL(devlink_linecard_provision_fail);
 
+/**
+ *     devlink_linecard_activate - Set linecard active
+ *
+ *     @linecard: devlink linecard
+ */
+void devlink_linecard_activate(struct devlink_linecard *linecard)
+{
+       mutex_lock(&linecard->state_lock);
+       WARN_ON(linecard->state != DEVLINK_LINECARD_STATE_PROVISIONED);
+       linecard->state = DEVLINK_LINECARD_STATE_ACTIVE;
+       devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
+       mutex_unlock(&linecard->state_lock);
+}
+EXPORT_SYMBOL_GPL(devlink_linecard_activate);
+
+/**
+ *     devlink_linecard_deactivate - Set linecard inactive
+ *
+ *     @linecard: devlink linecard
+ */
+void devlink_linecard_deactivate(struct devlink_linecard *linecard)
+{
+       mutex_lock(&linecard->state_lock);
+       switch (linecard->state) {
+       case DEVLINK_LINECARD_STATE_ACTIVE:
+               linecard->state = DEVLINK_LINECARD_STATE_PROVISIONED;
+               devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
+               break;
+       case DEVLINK_LINECARD_STATE_UNPROVISIONING:
+               /* Line card is being deactivated as part
+                * of unprovisioning flow.
+                */
+               break;
+       default:
+               WARN_ON(1);
+               break;
+       }
+       mutex_unlock(&linecard->state_lock);
+}
+EXPORT_SYMBOL_GPL(devlink_linecard_deactivate);
+
 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
                        u32 size, u16 ingress_pools_count,
                        u16 egress_pools_count, u16 ingress_tc_count,