Skip to content
/ linux Public

Commit fc9f50d

Browse files
Jiri Pirkodavem330
authored andcommitted
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>
1 parent fcdc8ce commit fc9f50d

File tree

4 files changed

+50
-5
lines changed

4 files changed

+50
-5
lines changed

Documentation/networking/devlink/devlink-linecard.rst

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ The ``devlink-linecard`` mechanism supports the following line card states:
6666
with a line card type.
6767
* ``provisioning_failed``: Provisioning was not successful.
6868
* ``provisioned``: Line card slot is provisioned with a type.
69+
* ``active``: Line card is powered-up and active.
6970

7071
The following diagram provides a general overview of ``devlink-linecard``
7172
state transitions::
@@ -85,11 +86,11 @@ state transitions::
8586
| |
8687
| +-----------------------------+
8788
| | |
88-
| +------------v------------+ +------------v------------+
89-
| | | | |
90-
+----- provisioning_failed | | provisioned |
91-
| | | | |
92-
| +------------^------------+ +------------|------------+
89+
| +------------v------------+ +------------v------------+ +-------------------------+
90+
| | | | ----> |
91+
+----- provisioning_failed | | provisioned | | active |
92+
| | | | <---- |
93+
| +------------^------------+ +------------|------------+ +-------------------------+
9394
| | |
9495
| | |
9596
| | +------------v------------+

include/net/devlink.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1579,6 +1579,8 @@ void devlink_linecard_provision_set(struct devlink_linecard *linecard,
15791579
const char *type);
15801580
void devlink_linecard_provision_clear(struct devlink_linecard *linecard);
15811581
void devlink_linecard_provision_fail(struct devlink_linecard *linecard);
1582+
void devlink_linecard_activate(struct devlink_linecard *linecard);
1583+
void devlink_linecard_deactivate(struct devlink_linecard *linecard);
15821584
int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
15831585
u32 size, u16 ingress_pools_count,
15841586
u16 egress_pools_count, u16 ingress_tc_count,

include/uapi/linux/devlink.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,7 @@ enum devlink_linecard_state {
350350
DEVLINK_LINECARD_STATE_PROVISIONING,
351351
DEVLINK_LINECARD_STATE_PROVISIONING_FAILED,
352352
DEVLINK_LINECARD_STATE_PROVISIONED,
353+
DEVLINK_LINECARD_STATE_ACTIVE,
353354

354355
__DEVLINK_LINECARD_STATE_MAX,
355356
DEVLINK_LINECARD_STATE_MAX = __DEVLINK_LINECARD_STATE_MAX - 1

net/core/devlink.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10331,6 +10331,47 @@ void devlink_linecard_provision_fail(struct devlink_linecard *linecard)
1033110331
}
1033210332
EXPORT_SYMBOL_GPL(devlink_linecard_provision_fail);
1033310333

10334+
/**
10335+
* devlink_linecard_activate - Set linecard active
10336+
*
10337+
* @linecard: devlink linecard
10338+
*/
10339+
void devlink_linecard_activate(struct devlink_linecard *linecard)
10340+
{
10341+
mutex_lock(&linecard->state_lock);
10342+
WARN_ON(linecard->state != DEVLINK_LINECARD_STATE_PROVISIONED);
10343+
linecard->state = DEVLINK_LINECARD_STATE_ACTIVE;
10344+
devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
10345+
mutex_unlock(&linecard->state_lock);
10346+
}
10347+
EXPORT_SYMBOL_GPL(devlink_linecard_activate);
10348+
10349+
/**
10350+
* devlink_linecard_deactivate - Set linecard inactive
10351+
*
10352+
* @linecard: devlink linecard
10353+
*/
10354+
void devlink_linecard_deactivate(struct devlink_linecard *linecard)
10355+
{
10356+
mutex_lock(&linecard->state_lock);
10357+
switch (linecard->state) {
10358+
case DEVLINK_LINECARD_STATE_ACTIVE:
10359+
linecard->state = DEVLINK_LINECARD_STATE_PROVISIONED;
10360+
devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
10361+
break;
10362+
case DEVLINK_LINECARD_STATE_UNPROVISIONING:
10363+
/* Line card is being deactivated as part
10364+
* of unprovisioning flow.
10365+
*/
10366+
break;
10367+
default:
10368+
WARN_ON(1);
10369+
break;
10370+
}
10371+
mutex_unlock(&linecard->state_lock);
10372+
}
10373+
EXPORT_SYMBOL_GPL(devlink_linecard_deactivate);
10374+
1033410375
int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
1033510376
u32 size, u16 ingress_pools_count,
1033610377
u16 egress_pools_count, u16 ingress_tc_count,

0 commit comments

Comments
 (0)