Commit fc9f50d5 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller
Browse files

devlink: implement line card active state



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: default avatarJiri Pirko <jiri@nvidia.com>
Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fcdc8ce2
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -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------------+
+2 −0
Original line number Diff line number Diff line
@@ -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,
+1 −0
Original line number Diff line number Diff line
@@ -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
+41 −0
Original line number Diff line number Diff line
@@ -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,