[edk2-devel] [edk2-platforms][PATCH] Vlv2TbltDevicePkg/FmpDeviceLib: Implement new APIs

Eric Jin posted 1 patch 18 weeks ago
Failed in applying to current master (apply log)
.../Library/FmpDeviceLib/FmpDeviceLib.c       | 95 ++++++++++++++++++
.../Library/FmpDeviceLibSample/FmpDeviceLib.c | 99 ++++++++++++++++++-
2 files changed, 192 insertions(+), 2 deletions(-)

[edk2-devel] [edk2-platforms][PATCH] Vlv2TbltDevicePkg/FmpDeviceLib: Implement new APIs

Posted by Eric Jin 18 weeks ago
Implement new APIs defined in FmpDeviceLib
* RegisterFmpUninstaller()
* FmpDeviceSetContext()
* FmpDeviceGetHardwareInstance()

Cc: Zailiang Sun <zailiang.sun@intel.com>
Cc: Yi Qian <yi.qian@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Signed-off-by: Eric Jin <eric.jin@intel.com>
---
 .../Library/FmpDeviceLib/FmpDeviceLib.c       | 95 ++++++++++++++++++
 .../Library/FmpDeviceLibSample/FmpDeviceLib.c | 99 ++++++++++++++++++-
 2 files changed, 192 insertions(+), 2 deletions(-)

diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c
index 57185d8d09..d8c9036012 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c
@@ -66,6 +66,73 @@ RegisterFmpInstaller (
   return EFI_UNSUPPORTED;
 }
 
+/**
+  Provide a function to uninstall the Firmware Management Protocol instance from a
+  device handle when the device is managed by a driver that follows the UEFI
+  Driver Model.  If the device is not managed by a driver that follows the UEFI
+  Driver Model, then EFI_UNSUPPORTED is returned.
+
+  @param[in] FmpUninstaller  Function that installs the Firmware Management
+                             Protocol.
+
+  @retval EFI_SUCCESS      The device is managed by a driver that follows the
+                           UEFI Driver Model.  FmpUinstaller must be called on
+                           each Driver Binding Stop().
+  @retval EFI_UNSUPPORTED  The device is not managed by a driver that follows
+                           the UEFI Driver Model.
+  @retval other            The Firmware Management Protocol for this firmware
+                           device is not installed.  The firmware device is
+                           still locked using FmpDeviceLock().
+
+**/
+EFI_STATUS
+EFIAPI
+RegisterFmpUninstaller (
+  IN FMP_DEVICE_LIB_REGISTER_FMP_UNINSTALLER  FmpUninstaller
+  )
+{
+  //
+  // This is a system firmware update that does not use Driver Binding Protocol
+  //
+  return EFI_UNSUPPORTED;
+}
+
+/**
+  Set the device context for the FmpDeviceLib services when the device is
+  managed by a driver that follows the UEFI Driver Model.  If the device is not
+  managed by a driver that follows the UEFI Driver Model, then EFI_UNSUPPORTED
+  is returned.  Once a device context is set, the FmpDeviceLib services
+  operate on the currently set device context.
+
+  @param[in]      Handle   Device handle for the FmpDeviceLib services.
+                           If Handle is NULL, then Context is freed.
+  @param[in, out] Context  Device context for the FmpDeviceLib services.
+                           If Context is NULL, then a new context is allocated
+                           for Handle and the current device context is set and
+                           returned in Context.  If Context is not NULL, then
+                           the current device context is set.
+
+  @retval EFI_SUCCESS      The device is managed by a driver that follows the
+                           UEFI Driver Model.
+  @retval EFI_UNSUPPORTED  The device is not managed by a driver that follows
+                           the UEFI Driver Model.
+  @retval other            The Firmware Management Protocol for this firmware
+                           device is not installed.  The firmware device is
+                           still locked using FmpDeviceLock().
+
+**/
+EFI_STATUS
+EFIAPI
+FmpDeviceSetContext (
+  IN EFI_HANDLE  Handle,
+  IN OUT VOID    **Context
+  )
+{
+  //
+  // This is a system firmware update that does not use Driver Binding Protocol
+  //
+  return EFI_UNSUPPORTED;
+}
 
 /**
   Returns the size, in bytes, of the firmware image currently stored in the
@@ -289,6 +356,34 @@ FmpDeviceGetVersion (
   return EFI_SUCCESS;
 }
 
+/**
+  Returns the value used to fill in the HardwareInstance field of the
+  EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo()
+  service of the Firmware Management Protocol.  If EFI_SUCCESS is returned, then
+  the firmware device supports a method to report the HardwareInstance value.
+  If the value can not be reported for the firmware device, then EFI_UNSUPPORTED
+  must be returned.  EFI_DEVICE_ERROR is returned if an error occurs attempting
+  to retrieve the HardwareInstance value for the firmware device.
+
+  @param[out] HardwareInstance  The hardware instance value for the firmware
+                                device.
+
+  @retval EFI_SUCCESS       The hardware instance for the current firmware
+                            devide is returned in HardwareInstance.
+  @retval EFI_UNSUPPORTED   The firmware device does not support a method to
+                            report the hardware instance value.
+  @retval EFI_DEVICE_ERROR  An error occurred attempting to retrieve the hardware
+                            instance value.
+
+**/
+EFI_STATUS
+EFIAPI
+FmpDeviceGetHardwareInstance (
+  OUT UINT64  *HardwareInstance
+  )
+{
+  return EFI_UNSUPPORTED;
+}
 
 /**
   Retrieves a copy of the current firmware image of the device.
diff --git a/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLibSample/FmpDeviceLib.c b/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLibSample/FmpDeviceLib.c
index 80ce83a14b..db0f238ea5 100644
--- a/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLibSample/FmpDeviceLib.c
+++ b/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLibSample/FmpDeviceLib.c
@@ -1,8 +1,8 @@
 /**
 
-Copyright (c) 2016, Microsoft Corporation
+Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>
+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
 
-All rights reserved.
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -43,6 +43,73 @@ IN FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER Func
   return EFI_UNSUPPORTED;
 }
 
+/**
+  Provide a function to uninstall the Firmware Management Protocol instance from a
+  device handle when the device is managed by a driver that follows the UEFI
+  Driver Model.  If the device is not managed by a driver that follows the UEFI
+  Driver Model, then EFI_UNSUPPORTED is returned.
+
+  @param[in] FmpUninstaller  Function that installs the Firmware Management
+                             Protocol.
+
+  @retval EFI_SUCCESS      The device is managed by a driver that follows the
+                           UEFI Driver Model.  FmpUinstaller must be called on
+                           each Driver Binding Stop().
+  @retval EFI_UNSUPPORTED  The device is not managed by a driver that follows
+                           the UEFI Driver Model.
+  @retval other            The Firmware Management Protocol for this firmware
+                           device is not installed.  The firmware device is
+                           still locked using FmpDeviceLock().
+
+**/
+EFI_STATUS
+EFIAPI
+RegisterFmpUninstaller (
+  IN FMP_DEVICE_LIB_REGISTER_FMP_UNINSTALLER  FmpUninstaller
+  )
+{
+  //
+  // This is a system firmware update that does not use Driver Binding Protocol
+  //
+  return EFI_UNSUPPORTED;
+}
+
+/**
+  Set the device context for the FmpDeviceLib services when the device is
+  managed by a driver that follows the UEFI Driver Model.  If the device is not
+  managed by a driver that follows the UEFI Driver Model, then EFI_UNSUPPORTED
+  is returned.  Once a device context is set, the FmpDeviceLib services
+  operate on the currently set device context.
+
+  @param[in]      Handle   Device handle for the FmpDeviceLib services.
+                           If Handle is NULL, then Context is freed.
+  @param[in, out] Context  Device context for the FmpDeviceLib services.
+                           If Context is NULL, then a new context is allocated
+                           for Handle and the current device context is set and
+                           returned in Context.  If Context is not NULL, then
+                           the current device context is set.
+
+  @retval EFI_SUCCESS      The device is managed by a driver that follows the
+                           UEFI Driver Model.
+  @retval EFI_UNSUPPORTED  The device is not managed by a driver that follows
+                           the UEFI Driver Model.
+  @retval other            The Firmware Management Protocol for this firmware
+                           device is not installed.  The firmware device is
+                           still locked using FmpDeviceLock().
+
+**/
+EFI_STATUS
+EFIAPI
+FmpDeviceSetContext (
+  IN EFI_HANDLE  Handle,
+  OUT VOID       **Context
+  )
+{
+  //
+  // This is a system firmware update that does not use Driver Binding Protocol
+  //
+  return EFI_UNSUPPORTED;
+}
 
 /**
 Used to get the size of the image in bytes.
@@ -201,6 +268,34 @@ IN OUT UINT32* Version
   return EFI_UNSUPPORTED;
 }
 
+/**
+  Returns the value used to fill in the HardwareInstance field of the
+  EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo()
+  service of the Firmware Management Protocol.  If EFI_SUCCESS is returned, then
+  the firmware device supports a method to report the HardwareInstance value.
+  If the value can not be reported for the firmware device, then EFI_UNSUPPORTED
+  must be returned.  EFI_DEVICE_ERROR is returned if an error occurs attempting
+  to retrieve the HardwareInstance value for the firmware device.
+
+  @param[out] HardwareInstance  The hardware instance value for the firmware
+                                device.
+
+  @retval EFI_SUCCESS       The hardware instance for the current firmware
+                            devide is returned in HardwareInstance.
+  @retval EFI_UNSUPPORTED   The firmware device does not support a method to
+                            report the hardware instance value.
+  @retval EFI_DEVICE_ERROR  An error occurred attempting to retrieve the hardware
+                            instance value.
+
+**/
+EFI_STATUS
+EFIAPI
+FmpDeviceGetHardwareInstance (
+  OUT UINT64  *HardwareInstance
+  )
+{
+  return EFI_UNSUPPORTED;
+}
 
 /**
 Retrieves a copy of the current firmware image of the device.
-- 
2.20.1.windows.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#45328): https://edk2.groups.io/g/devel/message/45328
Mute This Topic: https://groups.io/mt/32836316/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [edk2-platforms][PATCH] Vlv2TbltDevicePkg/FmpDeviceLib: Implement new APIs

Posted by Sun, Zailiang 18 weeks ago
Reviewed-by: Zailiang Sun <zailiang.sun@intel.com>

> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> Eric Jin
> Sent: Monday, August 12, 2019 9:45 AM
> To: devel@edk2.groups.io
> Cc: Sun, Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>;
> Kinney, Michael D <michael.d.kinney@intel.com>; Gao, Liming
> <liming.gao@intel.com>
> Subject: [edk2-devel] [edk2-platforms][PATCH]
> Vlv2TbltDevicePkg/FmpDeviceLib: Implement new APIs
> 
> Implement new APIs defined in FmpDeviceLib
> * RegisterFmpUninstaller()
> * FmpDeviceSetContext()
> * FmpDeviceGetHardwareInstance()
> 
> Cc: Zailiang Sun <zailiang.sun@intel.com>
> Cc: Yi Qian <yi.qian@intel.com>
> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> Signed-off-by: Eric Jin <eric.jin@intel.com>
> ---
>  .../Library/FmpDeviceLib/FmpDeviceLib.c       | 95 ++++++++++++++++++
>  .../Library/FmpDeviceLibSample/FmpDeviceLib.c | 99
> ++++++++++++++++++-
>  2 files changed, 192 insertions(+), 2 deletions(-)
> 
> diff --git
> a/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/
> FmpDeviceLib.c
> b/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib
> /FmpDeviceLib.c
> index 57185d8d09..d8c9036012 100644
> ---
> a/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib/
> FmpDeviceLib.c
> +++
> b/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDevice
> +++ Lib/FmpDeviceLib.c
> @@ -66,6 +66,73 @@ RegisterFmpInstaller (
>    return EFI_UNSUPPORTED;
>  }
> 
> +/**
> +  Provide a function to uninstall the Firmware Management Protocol
> +instance from a
> +  device handle when the device is managed by a driver that follows the
> +UEFI
> +  Driver Model.  If the device is not managed by a driver that follows
> +the UEFI
> +  Driver Model, then EFI_UNSUPPORTED is returned.
> +
> +  @param[in] FmpUninstaller  Function that installs the Firmware
> Management
> +                             Protocol.
> +
> +  @retval EFI_SUCCESS      The device is managed by a driver that follows the
> +                           UEFI Driver Model.  FmpUinstaller must be called on
> +                           each Driver Binding Stop().
> +  @retval EFI_UNSUPPORTED  The device is not managed by a driver that
> follows
> +                           the UEFI Driver Model.
> +  @retval other            The Firmware Management Protocol for this firmware
> +                           device is not installed.  The firmware device is
> +                           still locked using FmpDeviceLock().
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +RegisterFmpUninstaller (
> +  IN FMP_DEVICE_LIB_REGISTER_FMP_UNINSTALLER  FmpUninstaller
> +  )
> +{
> +  //
> +  // This is a system firmware update that does not use Driver Binding
> +Protocol
> +  //
> +  return EFI_UNSUPPORTED;
> +}
> +
> +/**
> +  Set the device context for the FmpDeviceLib services when the device
> +is
> +  managed by a driver that follows the UEFI Driver Model.  If the
> +device is not
> +  managed by a driver that follows the UEFI Driver Model, then
> +EFI_UNSUPPORTED
> +  is returned.  Once a device context is set, the FmpDeviceLib services
> +  operate on the currently set device context.
> +
> +  @param[in]      Handle   Device handle for the FmpDeviceLib services.
> +                           If Handle is NULL, then Context is freed.
> +  @param[in, out] Context  Device context for the FmpDeviceLib services.
> +                           If Context is NULL, then a new context is allocated
> +                           for Handle and the current device context is set and
> +                           returned in Context.  If Context is not NULL, then
> +                           the current device context is set.
> +
> +  @retval EFI_SUCCESS      The device is managed by a driver that follows the
> +                           UEFI Driver Model.
> +  @retval EFI_UNSUPPORTED  The device is not managed by a driver that
> follows
> +                           the UEFI Driver Model.
> +  @retval other            The Firmware Management Protocol for this firmware
> +                           device is not installed.  The firmware device is
> +                           still locked using FmpDeviceLock().
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceSetContext (
> +  IN EFI_HANDLE  Handle,
> +  IN OUT VOID    **Context
> +  )
> +{
> +  //
> +  // This is a system firmware update that does not use Driver Binding
> +Protocol
> +  //
> +  return EFI_UNSUPPORTED;
> +}
> 
>  /**
>    Returns the size, in bytes, of the firmware image currently stored in the
> @@ -289,6 +356,34 @@ FmpDeviceGetVersion (
>    return EFI_SUCCESS;
>  }
> 
> +/**
> +  Returns the value used to fill in the HardwareInstance field of the
> +  EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the
> +GetImageInfo()
> +  service of the Firmware Management Protocol.  If EFI_SUCCESS is
> +returned, then
> +  the firmware device supports a method to report the HardwareInstance
> value.
> +  If the value can not be reported for the firmware device, then
> +EFI_UNSUPPORTED
> +  must be returned.  EFI_DEVICE_ERROR is returned if an error occurs
> +attempting
> +  to retrieve the HardwareInstance value for the firmware device.
> +
> +  @param[out] HardwareInstance  The hardware instance value for the
> firmware
> +                                device.
> +
> +  @retval EFI_SUCCESS       The hardware instance for the current firmware
> +                            devide is returned in HardwareInstance.
> +  @retval EFI_UNSUPPORTED   The firmware device does not support a
> method to
> +                            report the hardware instance value.
> +  @retval EFI_DEVICE_ERROR  An error occurred attempting to retrieve the
> hardware
> +                            instance value.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceGetHardwareInstance (
> +  OUT UINT64  *HardwareInstance
> +  )
> +{
> +  return EFI_UNSUPPORTED;
> +}
> 
>  /**
>    Retrieves a copy of the current firmware image of the device.
> diff --git
> a/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib
> Sample/FmpDeviceLib.c
> b/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib
> Sample/FmpDeviceLib.c
> index 80ce83a14b..db0f238ea5 100644
> ---
> a/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDeviceLib
> Sample/FmpDeviceLib.c
> +++
> b/Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Library/FmpDevice
> +++ LibSample/FmpDeviceLib.c
> @@ -1,8 +1,8 @@
>  /**
> 
> -Copyright (c) 2016, Microsoft Corporation
> +Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>
> +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> 
> -All rights reserved.
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -43,6 +43,73 @@ IN FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER Func
>    return EFI_UNSUPPORTED;
>  }
> 
> +/**
> +  Provide a function to uninstall the Firmware Management Protocol
> +instance from a
> +  device handle when the device is managed by a driver that follows the
> +UEFI
> +  Driver Model.  If the device is not managed by a driver that follows
> +the UEFI
> +  Driver Model, then EFI_UNSUPPORTED is returned.
> +
> +  @param[in] FmpUninstaller  Function that installs the Firmware
> Management
> +                             Protocol.
> +
> +  @retval EFI_SUCCESS      The device is managed by a driver that follows the
> +                           UEFI Driver Model.  FmpUinstaller must be called on
> +                           each Driver Binding Stop().
> +  @retval EFI_UNSUPPORTED  The device is not managed by a driver that
> follows
> +                           the UEFI Driver Model.
> +  @retval other            The Firmware Management Protocol for this firmware
> +                           device is not installed.  The firmware device is
> +                           still locked using FmpDeviceLock().
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +RegisterFmpUninstaller (
> +  IN FMP_DEVICE_LIB_REGISTER_FMP_UNINSTALLER  FmpUninstaller
> +  )
> +{
> +  //
> +  // This is a system firmware update that does not use Driver Binding
> +Protocol
> +  //
> +  return EFI_UNSUPPORTED;
> +}
> +
> +/**
> +  Set the device context for the FmpDeviceLib services when the device
> +is
> +  managed by a driver that follows the UEFI Driver Model.  If the
> +device is not
> +  managed by a driver that follows the UEFI Driver Model, then
> +EFI_UNSUPPORTED
> +  is returned.  Once a device context is set, the FmpDeviceLib services
> +  operate on the currently set device context.
> +
> +  @param[in]      Handle   Device handle for the FmpDeviceLib services.
> +                           If Handle is NULL, then Context is freed.
> +  @param[in, out] Context  Device context for the FmpDeviceLib services.
> +                           If Context is NULL, then a new context is allocated
> +                           for Handle and the current device context is set and
> +                           returned in Context.  If Context is not NULL, then
> +                           the current device context is set.
> +
> +  @retval EFI_SUCCESS      The device is managed by a driver that follows the
> +                           UEFI Driver Model.
> +  @retval EFI_UNSUPPORTED  The device is not managed by a driver that
> follows
> +                           the UEFI Driver Model.
> +  @retval other            The Firmware Management Protocol for this firmware
> +                           device is not installed.  The firmware device is
> +                           still locked using FmpDeviceLock().
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceSetContext (
> +  IN EFI_HANDLE  Handle,
> +  OUT VOID       **Context
> +  )
> +{
> +  //
> +  // This is a system firmware update that does not use Driver Binding
> +Protocol
> +  //
> +  return EFI_UNSUPPORTED;
> +}
> 
>  /**
>  Used to get the size of the image in bytes.
> @@ -201,6 +268,34 @@ IN OUT UINT32* Version
>    return EFI_UNSUPPORTED;
>  }
> 
> +/**
> +  Returns the value used to fill in the HardwareInstance field of the
> +  EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the
> +GetImageInfo()
> +  service of the Firmware Management Protocol.  If EFI_SUCCESS is
> +returned, then
> +  the firmware device supports a method to report the HardwareInstance
> value.
> +  If the value can not be reported for the firmware device, then
> +EFI_UNSUPPORTED
> +  must be returned.  EFI_DEVICE_ERROR is returned if an error occurs
> +attempting
> +  to retrieve the HardwareInstance value for the firmware device.
> +
> +  @param[out] HardwareInstance  The hardware instance value for the
> firmware
> +                                device.
> +
> +  @retval EFI_SUCCESS       The hardware instance for the current firmware
> +                            devide is returned in HardwareInstance.
> +  @retval EFI_UNSUPPORTED   The firmware device does not support a
> method to
> +                            report the hardware instance value.
> +  @retval EFI_DEVICE_ERROR  An error occurred attempting to retrieve the
> hardware
> +                            instance value.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceGetHardwareInstance (
> +  OUT UINT64  *HardwareInstance
> +  )
> +{
> +  return EFI_UNSUPPORTED;
> +}
> 
>  /**
>  Retrieves a copy of the current firmware image of the device.
> --
> 2.20.1.windows.1
> 
> 
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#45345): https://edk2.groups.io/g/devel/message/45345
Mute This Topic: https://groups.io/mt/32836316/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-