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: Jiri Pirko <jiri@nvidia.com> Signed-off-by: Ido Schimmel <idosch@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
fcdc8ce23a
commit
fc9f50d5b3
@@ -66,6 +66,7 @@ The ``devlink-linecard`` mechanism supports the following line card states:
|
|||||||
with a line card type.
|
with a line card type.
|
||||||
* ``provisioning_failed``: Provisioning was not successful.
|
* ``provisioning_failed``: Provisioning was not successful.
|
||||||
* ``provisioned``: Line card slot is provisioned with a type.
|
* ``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``
|
The following diagram provides a general overview of ``devlink-linecard``
|
||||||
state transitions::
|
state transitions::
|
||||||
@@ -85,11 +86,11 @@ state transitions::
|
|||||||
| |
|
| |
|
||||||
| +-----------------------------+
|
| +-----------------------------+
|
||||||
| | |
|
| | |
|
||||||
| +------------v------------+ +------------v------------+
|
| +------------v------------+ +------------v------------+ +-------------------------+
|
||||||
| | | | |
|
| | | | ----> |
|
||||||
+----- provisioning_failed | | provisioned |
|
+----- provisioning_failed | | provisioned | | active |
|
||||||
| | | | |
|
| | | | <---- |
|
||||||
| +------------^------------+ +------------|------------+
|
| +------------^------------+ +------------|------------+ +-------------------------+
|
||||||
| | |
|
| | |
|
||||||
| | |
|
| | |
|
||||||
| | +------------v------------+
|
| | +------------v------------+
|
||||||
|
|||||||
@@ -1579,6 +1579,8 @@ void devlink_linecard_provision_set(struct devlink_linecard *linecard,
|
|||||||
const char *type);
|
const char *type);
|
||||||
void devlink_linecard_provision_clear(struct devlink_linecard *linecard);
|
void devlink_linecard_provision_clear(struct devlink_linecard *linecard);
|
||||||
void devlink_linecard_provision_fail(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,
|
int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
|
||||||
u32 size, u16 ingress_pools_count,
|
u32 size, u16 ingress_pools_count,
|
||||||
u16 egress_pools_count, u16 ingress_tc_count,
|
u16 egress_pools_count, u16 ingress_tc_count,
|
||||||
|
|||||||
@@ -350,6 +350,7 @@ enum devlink_linecard_state {
|
|||||||
DEVLINK_LINECARD_STATE_PROVISIONING,
|
DEVLINK_LINECARD_STATE_PROVISIONING,
|
||||||
DEVLINK_LINECARD_STATE_PROVISIONING_FAILED,
|
DEVLINK_LINECARD_STATE_PROVISIONING_FAILED,
|
||||||
DEVLINK_LINECARD_STATE_PROVISIONED,
|
DEVLINK_LINECARD_STATE_PROVISIONED,
|
||||||
|
DEVLINK_LINECARD_STATE_ACTIVE,
|
||||||
|
|
||||||
__DEVLINK_LINECARD_STATE_MAX,
|
__DEVLINK_LINECARD_STATE_MAX,
|
||||||
DEVLINK_LINECARD_STATE_MAX = __DEVLINK_LINECARD_STATE_MAX - 1
|
DEVLINK_LINECARD_STATE_MAX = __DEVLINK_LINECARD_STATE_MAX - 1
|
||||||
|
|||||||
@@ -10331,6 +10331,47 @@ void devlink_linecard_provision_fail(struct devlink_linecard *linecard)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(devlink_linecard_provision_fail);
|
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,
|
int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
|
||||||
u32 size, u16 ingress_pools_count,
|
u32 size, u16 ingress_pools_count,
|
||||||
u16 egress_pools_count, u16 ingress_tc_count,
|
u16 egress_pools_count, u16 ingress_tc_count,
|
||||||
|
|||||||
Reference in New Issue
Block a user