• Emmanuel Grumbach's avatar
    nl80211: vendor-cmd: add Intel vendor commands for iwlmei usage · 3d2a2544
    Emmanuel Grumbach authored
    iwlmei allows to integrate with the CSME firmware. There are
    flows that are prioprietary for this purpose:
    
    * Get the information of the AP the CSME firmware is connected
      to. This is useful when we need to speed up the connection
      process in case the CSME firmware has a TCP connection
      that must be kept alive across the ownership transition.
    * Forbid roaming, which will happen when the CSME firmware
      wants to tell the user space not disrupt the connection.
    * Request ownership, upon driver boot when the CSME firmware
      owns the device. This is a notification sent by the kernel.
    
    All those commands are expected to be used by any software
    managing the connection (mainly NetworkManager). Those commands
    are expected to be used only in case the CSME firmware owns
    the device and doesn't want to release the device unless the
    host made sure that it can keep the connectivity.
    
    Here are the steps of the expected flow:
    
    1) The machine boots while AMT has an active TCP connection
    2) iwlwifi starts and tries to access the device
    3) The device is not available because of the active TCP
       connection. (If there are no active connections, the CSME
       firmware would have allowed iwlwifi to use the device)
    
    Note that all the steps up to here don't involve iwlmei. All
    this happens in iwlwifi (in iwl_pcie_prepare_card_hw).
    
    4) iwlmei establishes a connection to the CSME firmware (through
       SAP)
    
    Here iwlwifi uses iwlmei to access the device's capabilities
    (since it can't touch the device), but this is not relevant
    for the vendor commands.
    
    5) The CSME firmware tells iwlmei that it uses the NIC and
       that there is an acitve TCP connection, and hence, the
       host needs to think twice before asking the CSME firmware
       to release the device
    6) iwlmei tells iwlwifi to report HW RFKILL with a special
       reason
    
    Up to here, there was no user space involved.
    
    7) The user space (NetworkManager) boots and sees that the
       device is in RFKILL because the host doesn't own the
       device
    8) The user space asks the kernel what AP the CSME firmware
       is connected to (with the first vendor command mentionned
       above)
    9) The user space checks if it has a profile that matches the
       reply from the CSME firmware
    10) The user space installs a network to the wpa_supplicant
        with a specific BSSID and a specific frequency
    11) The user space prevents any type of full scan
    12) The user space asks iwlmei to request ownership on the
        device (with the third vendor command)
    13) iwlmei request ownership from the CSME firmware
    14) The CSME firmware grants ownership
    15) iwlmei tells iwlwifi to lift the RFKILL
    16) RFKILL OFF is reported to userspace
    17) The host boots the device, loads the firwmare, and
        connect to a specific BSSID without scanning including IP
        in less than 600ms (this is what I measured, of course
        it depends on many factors)
    18) The host reports to the CSME firmware that there is a
        connection
    19) The TCP connection is preserved and the host has now
        connectivity
    
    20) Later, the TCP connection to the CSME firmware is
        terminated
    21) The CSME firmware tells iwlmei that it is now free to
        do whatever it likes
    22) iwlwifi sends the second vendor command to tell the
        user space that it can remove the special network
        configuration and pick any SSID / BSSID it likes.
    Co-Developed-by: default avatarAyala Beker <ayala.beker@intel.com>
    Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
    Link: https://lore.kernel.org/r/20210625081717.7680-4-emmanuel.grumbach@intel.comSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
    3d2a2544
nl80211-vnd-intel.h 2.87 KB