• Ivan Vecera's avatar
    i40e: Fix broken support for floating VEBs · 08cdde31
    Ivan Vecera authored
    Although the i40e supports so-called floating VEB (VEB without
    an uplink connection to external network), this support is
    broken. This functionality is currently unused (except debugfs)
    but it will be used by subsequent series for switchdev mode
    slow-path. Fix this by following:
    
    1) Handle correctly floating VEB (VEB with uplink_seid == 0)
       in i40e_reconstitute_veb() and look for owner VSI and
       create it only for non-floating VEBs and also set bridge
       mode only for such VEBs as the floating ones are using
       always VEB mode.
    2) Handle correctly floating VEB in i40e_veb_release() and
       disallow its release when there are some VSIs. This is
       different from regular VEB that have owner VSI that is
       connected to VEB's uplink after VEB deletion by FW.
    3) Fix i40e_add_veb() to handle 'vsi' that is NULL for floating
       VEBs. For floating VEB use 0 for downlink SEID and 'true'
       for 'default_port' parameters as per datasheet.
    4) Fix 'add relay' command in i40e_dbg_command_write() to allow
       to create floating VEB by 'add relay 0 0' or 'add relay'
    
    Tested using debugfs:
    1) Initial state
    [root@host net-next]# echo dump switch > $CMD
    [root@host net-next]# dmesg -c
    [  173.701286] i40e 0000:02:00.0: header: 3 reported 3 total
    [  173.706701] i40e 0000:02:00.0: type=19 seid=392 uplink=160 downlink=16
    [  173.713241] i40e 0000:02:00.0: type=17 seid=160 uplink=2 downlink=0
    [  173.719507] i40e 0000:02:00.0: type=19 seid=390 uplink=160 downlink=16
    
    2) Add floating VEB
    [root@host net-next]# CMD="/sys/kernel/debug/i40e/0000:02:00.0/command"
    [root@host net-next]# echo add relay > $CMD
    [root@host net-next]# dmesg -c
    [  245.551720] i40e 0000:02:00.0: added relay 162
    [root@host net-next]# echo dump switch > $CMD
    [root@host net-next]# dmesg -c
    [  276.984371] i40e 0000:02:00.0: header: 4 reported 4 total
    [  276.989779] i40e 0000:02:00.0: type=19 seid=392 uplink=160 downlink=16
    [  276.996302] i40e 0000:02:00.0: type=17 seid=160 uplink=2 downlink=0
    [  277.002569] i40e 0000:02:00.0: type=19 seid=390 uplink=160 downlink=16
    [  277.009091] i40e 0000:02:00.0: type=17 seid=162 uplink=0 downlink=0
    
    3) Add VMDQ2 VSI to this new VEB
    [root@host net-next]# echo add vsi 162 > $CMD
    [root@host net-next]# dmesg -c
    [  332.314030] i40e 0000:02:00.0: added VSI 394 to relay 162
    [  332.337486] enp2s0f0np0v0: NIC Link is Up, 40 Gbps Full Duplex, Flow Control: None
    [root@host net-next]# echo dump switch > $CMD
    [root@host net-next]# dmesg -c
    [  387.284490] i40e 0000:02:00.0: header: 5 reported 5 total
    [  387.289904] i40e 0000:02:00.0: type=19 seid=394 uplink=162 downlink=16
    [  387.296446] i40e 0000:02:00.0: type=17 seid=162 uplink=0 downlink=0
    [  387.302708] i40e 0000:02:00.0: type=19 seid=392 uplink=160 downlink=16
    [  387.309234] i40e 0000:02:00.0: type=17 seid=160 uplink=2 downlink=0
    [  387.315500] i40e 0000:02:00.0: type=19 seid=390 uplink=160 downlink=16
    
    4) Try to delete the VEB
    [root@host net-next]# echo del relay 162 > $CMD
    [root@host net-next]# dmesg -c
    [  428.749297] i40e 0000:02:00.0: deleting relay 162
    [  428.754011] i40e 0000:02:00.0: can't remove VEB 162 with 1 VSIs left
    
    5) Do PF reset and check switch status after rebuild
    [root@host net-next]# echo pfr > $CMD
    [root@host net-next]# echo dump switch > $CMD
    [root@host net-next]# dmesg -c
    [  738.056172] i40e 0000:02:00.0: header: 5 reported 5 total
    [  738.061577] i40e 0000:02:00.0: type=19 seid=394 uplink=162 downlink=16
    [  738.068104] i40e 0000:02:00.0: type=17 seid=162 uplink=0 downlink=0
    [  738.074367] i40e 0000:02:00.0: type=19 seid=392 uplink=160 downlink=16
    [  738.080892] i40e 0000:02:00.0: type=17 seid=160 uplink=2 downlink=0
    [  738.087160] i40e 0000:02:00.0: type=19 seid=390 uplink=160 downlink=16
    
    6) Delete VSI and delete VEB
    [root@host net-next]# echo del vsi 394 > $CMD
    [root@host net-next]# echo del relay 162 > $CMD
    [root@host net-next]# echo dump switch > $CMD
    [root@host net-next]# dmesg -c
    [ 1233.081126] i40e 0000:02:00.0: deleting VSI 394
    [ 1239.345139] i40e 0000:02:00.0: deleting relay 162
    [ 1244.886920] i40e 0000:02:00.0: header: 3 reported 3 total
    [ 1244.892328] i40e 0000:02:00.0: type=19 seid=392 uplink=160 downlink=16
    [ 1244.898853] i40e 0000:02:00.0: type=17 seid=160 uplink=2 downlink=0
    [ 1244.905119] i40e 0000:02:00.0: type=19 seid=390 uplink=160 downlink=16
    Reviewed-by: default avatarWojciech Drewek <wojciech.drewek@intel.com>
    Signed-off-by: default avatarIvan Vecera <ivecera@redhat.com>
    Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
    Reviewed-by: default avatarSimon Horman <horms@kernel.org>
    Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
    08cdde31
i40e_main.c 461 KB