|  | .. SPDX-License-Identifier: GPL-2.0 | 
|  |  | 
|  | ================= | 
|  | Devlink Line card | 
|  | ================= | 
|  |  | 
|  | Background | 
|  | ========== | 
|  |  | 
|  | The ``devlink-linecard`` mechanism is targeted for manipulation of | 
|  | line cards that serve as a detachable PHY modules for modular switch | 
|  | system. Following operations are provided: | 
|  |  | 
|  | * Get a list of supported line card types. | 
|  | * Provision of a slot with specific line card type. | 
|  | * Get and monitor of line card state and its change. | 
|  |  | 
|  | Line card according to the type may contain one or more gearboxes | 
|  | to mux the lanes with certain speed to multiple ports with lanes | 
|  | of different speed. Line card ensures N:M mapping between | 
|  | the switch ASIC modules and physical front panel ports. | 
|  |  | 
|  | Overview | 
|  | ======== | 
|  |  | 
|  | Each line card devlink object is created by device driver, | 
|  | according to the physical line card slots available on the device. | 
|  |  | 
|  | Similar to splitter cable, where the device might have no way | 
|  | of detection of the splitter cable geometry, the device | 
|  | might not have a way to detect line card type. For that devices, | 
|  | concept of provisioning is introduced. It allows the user to: | 
|  |  | 
|  | * Provision a line card slot with certain line card type | 
|  |  | 
|  | - Device driver would instruct the ASIC to prepare all | 
|  | resources accordingly. The device driver would | 
|  | create all instances, namely devlink port and netdevices | 
|  | that reside on the line card, according to the line card type | 
|  | * Manipulate of line card entities even without line card | 
|  | being physically connected or powered-up | 
|  | * Setup splitter cable on line card ports | 
|  |  | 
|  | - As on the ordinary ports, user may provision a splitter | 
|  | cable of a certain type, without the need to | 
|  | be physically connected to the port | 
|  | * Configure devlink ports and netdevices | 
|  |  | 
|  | Netdevice carrier is decided as follows: | 
|  |  | 
|  | * Line card is not inserted or powered-down | 
|  |  | 
|  | - The carrier is always down | 
|  | * Line card is inserted and powered up | 
|  |  | 
|  | - The carrier is decided as for ordinary port netdevice | 
|  |  | 
|  | Line card state | 
|  | =============== | 
|  |  | 
|  | The ``devlink-linecard`` mechanism supports the following line card states: | 
|  |  | 
|  | * ``unprovisioned``: Line card is not provisioned on the slot. | 
|  | * ``unprovisioning``: Line card slot is currently being unprovisioned. | 
|  | * ``provisioning``: Line card slot is currently in a process of being provisioned | 
|  | 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:: | 
|  |  | 
|  | +-------------------------+ | 
|  | |                         | | 
|  | +---------------------------------->      unprovisioned      | | 
|  | |                                  |                         | | 
|  | |                                  +--------|-------^--------+ | 
|  | |                                           |       | | 
|  | |                                           |       | | 
|  | |                                  +--------v-------|--------+ | 
|  | |                                  |                         | | 
|  | |                                  |       provisioning      | | 
|  | |                                  |                         | | 
|  | |                                  +------------|------------+ | 
|  | |                                               | | 
|  | |                 +-----------------------------+ | 
|  | |                 |                             | | 
|  | |    +------------v------------+   +------------v------------+   +-------------------------+ | 
|  | |    |                         |   |                         ---->                         | | 
|  | +-----   provisioning_failed   |   |       provisioned       |   |         active          | | 
|  | |    |                         |   |                         <----                         | | 
|  | |    +------------^------------+   +------------|------------+   +-------------------------+ | 
|  | |                 |                             | | 
|  | |                 |                             | | 
|  | |                 |                +------------v------------+ | 
|  | |                 |                |                         | | 
|  | |                 |                |     unprovisioning      | | 
|  | |                 |                |                         | | 
|  | |                 |                +------------|------------+ | 
|  | |                 |                             | | 
|  | |                 +-----------------------------+ | 
|  | |                                               | | 
|  | +-----------------------------------------------+ | 
|  |  | 
|  |  | 
|  | Example usage | 
|  | ============= | 
|  |  | 
|  | .. code:: shell | 
|  |  | 
|  | $ devlink lc show [ DEV [ lc LC_INDEX ] ] | 
|  | $ devlink lc set DEV lc LC_INDEX [ { type LC_TYPE | notype } ] | 
|  |  | 
|  | # Show current line card configuration and status for all slots: | 
|  | $ devlink lc | 
|  |  | 
|  | # Set slot 8 to be provisioned with type "16x100G": | 
|  | $ devlink lc set pci/0000:01:00.0 lc 8 type 16x100G | 
|  |  | 
|  | # Set slot 8 to be unprovisioned: | 
|  | $ devlink lc set pci/0000:01:00.0 lc 8 notype |