diff --git a/kernel-firmware.changes b/kernel-firmware.changes
index 2e926bc..3c9fc8b 100644
--- a/kernel-firmware.changes
+++ b/kernel-firmware.changes
@@ -1,3 +1,15 @@
+-------------------------------------------------------------------
+Mon Oct 10 09:12:47 UTC 2022 - Takashi Iwai <tiwai@suse.com>
+
+- Apply the same workaround to uncompressed flat package, too
+  (bsc#1204103)
+
+-------------------------------------------------------------------
+Sat Oct  8 15:46:30 UTC 2022 - Takashi Iwai <tiwai@suse.com>
+
+- Workaround for update failure of kernel-firmware-qcom package
+  due to the change from a directory to a symlink (bsc#1204103)
+
 -------------------------------------------------------------------
 Mon Oct 03 06:55:34 UTC 2022 - tiwai@suse.com
 
diff --git a/kernel-firmware.spec b/kernel-firmware.spec
index 2833732..a47b8e9 100644
--- a/kernel-firmware.spec
+++ b/kernel-firmware.spec
@@ -61,6 +61,9 @@ Source1011:     fwtopics.py
 Source1012:     check-topic.py
 Source1013:     update-aliases.py
 Source1014:     README.build
+# workarounds
+Source1100:     qcom-post
+Source1101:     uncompressed-post
 BuildRequires:  fdupes
 BuildRequires:  suse-module-tools
 Requires(post): /usr/bin/mkdir /usr/bin/touch
@@ -6271,13 +6274,32 @@ sh %{_sourcedir}/list-license.sh < %{_sourcedir}/licenses.list
 %fdupes -s %{buildroot}
 
 %if "%flavor" != "compressed"
+%pre
+# ugly workaround for changing qcom/LENOVO/21BX to a symlink (bsc#1204103)
+if [ ! -L %{_firmwaredir}/qcom/LENOVO/21BX ]; then
+  if [ -d %{_firmwaredir}/qcom/LENOVO/21BX ]; then
+    mv %{_firmwaredir}/qcom/LENOVO/21BX %{_firmwaredir}/qcom/LENOVO/21BX.xxxold
+  fi
+fi
+
 %post
+# ugly workaround (bsc#1204103)
+if [ -d %{_firmwaredir}/qcom/LENOVO/21BX.xxxold ]; then
+  mv %{_firmwaredir}/qcom/LENOVO/21BX %{_firmwaredir}/qcom/LENOVO/21BX.xxxnew
+  mv %{_firmwaredir}/qcom/LENOVO/21BX.xxxold %{_firmwaredir}/qcom/LENOVO/21BX
+else
 %{?regenerate_initrd_post}
+fi
 
 %postun
 %{?regenerate_initrd_post}
 
 %posttrans
+# ugly workaround (bsc#1204103)
+if [ -L %{_firmwaredir}/qcom/LENOVO/21BX.xxxnew ]; then
+  rm -rf %{_firmwaredir}/qcom/LENOVO/21BX
+  mv %{_firmwaredir}/qcom/LENOVO/21BX.xxxnew %{_firmwaredir}/qcom/LENOVO/21BX
+fi
 %{?regenerate_initrd_posttrans}
 
 %post -n ucode-amd
@@ -6506,13 +6528,32 @@ sh %{_sourcedir}/list-license.sh < %{_sourcedir}/licenses.list
 %posttrans prestera
 %{?regenerate_initrd_posttrans}
 
+%pre qcom
+# ugly workaround for changing qcom/LENOVO/21BX to a symlink (bsc#1204103)
+if [ ! -L %{_firmwaredir}/qcom/LENOVO/21BX ]; then
+  if [ -d %{_firmwaredir}/qcom/LENOVO/21BX ]; then
+    mv %{_firmwaredir}/qcom/LENOVO/21BX %{_firmwaredir}/qcom/LENOVO/21BX.xxxold
+  fi
+fi
+
 %post qcom
+# ugly workaround (bsc#1204103)
+if [ -d %{_firmwaredir}/qcom/LENOVO/21BX.xxxold ]; then
+  mv %{_firmwaredir}/qcom/LENOVO/21BX %{_firmwaredir}/qcom/LENOVO/21BX.xxxnew
+  mv %{_firmwaredir}/qcom/LENOVO/21BX.xxxold %{_firmwaredir}/qcom/LENOVO/21BX
+else
 %{?regenerate_initrd_post}
+fi
 
 %postun qcom
 %{?regenerate_initrd_post}
 
 %posttrans qcom
+# ugly workaround (bsc#1204103)
+if [ -L %{_firmwaredir}/qcom/LENOVO/21BX.xxxnew ]; then
+  rm -rf %{_firmwaredir}/qcom/LENOVO/21BX
+  mv %{_firmwaredir}/qcom/LENOVO/21BX.xxxnew %{_firmwaredir}/qcom/LENOVO/21BX
+fi
 %{?regenerate_initrd_posttrans}
 
 %post qlogic
diff --git a/kernel-firmware.spec.in b/kernel-firmware.spec.in
index 30669d6..57e32a9 100644
--- a/kernel-firmware.spec.in
+++ b/kernel-firmware.spec.in
@@ -61,6 +61,9 @@ Source1011:     fwtopics.py
 Source1012:     check-topic.py
 Source1013:     update-aliases.py
 Source1014:     README.build
+# workarounds
+Source1100:     qcom-post
+Source1101:     uncompressed-post
 BuildRequires:  fdupes
 BuildRequires:  suse-module-tools
 Requires(post): /usr/bin/mkdir /usr/bin/touch
diff --git a/makespec.sh b/makespec.sh
index bdd4c6d..643f82c 100644
--- a/makespec.sh
+++ b/makespec.sh
@@ -33,6 +33,14 @@ define_subpackage () {
 
 define_post () {
     local l="$*"
+    if [ -z "$l" -a -f uncompressed-post ]; then
+	cat uncompressed-post
+	return 0
+    fi
+    if [ -n "$l" -a -f "$l"-post ]; then
+	cat "$l"-post
+	return 0
+    fi
     test -n "$l" && l=" $l"
     echo "%post$l"
     echo "%{?regenerate_initrd_post}"
diff --git a/qcom-post b/qcom-post
new file mode 100644
index 0000000..ee79021
--- /dev/null
+++ b/qcom-post
@@ -0,0 +1,27 @@
+%pre qcom
+# ugly workaround for changing qcom/LENOVO/21BX to a symlink (bsc#1204103)
+if [ ! -L %{_firmwaredir}/qcom/LENOVO/21BX ]; then
+  if [ -d %{_firmwaredir}/qcom/LENOVO/21BX ]; then
+    mv %{_firmwaredir}/qcom/LENOVO/21BX %{_firmwaredir}/qcom/LENOVO/21BX.xxxold
+  fi
+fi
+
+%post qcom
+# ugly workaround (bsc#1204103)
+if [ -d %{_firmwaredir}/qcom/LENOVO/21BX.xxxold ]; then
+  mv %{_firmwaredir}/qcom/LENOVO/21BX %{_firmwaredir}/qcom/LENOVO/21BX.xxxnew
+  mv %{_firmwaredir}/qcom/LENOVO/21BX.xxxold %{_firmwaredir}/qcom/LENOVO/21BX
+else
+%{?regenerate_initrd_post}
+fi
+
+%postun qcom
+%{?regenerate_initrd_post}
+
+%posttrans qcom
+# ugly workaround (bsc#1204103)
+if [ -L %{_firmwaredir}/qcom/LENOVO/21BX.xxxnew ]; then
+  rm -rf %{_firmwaredir}/qcom/LENOVO/21BX
+  mv %{_firmwaredir}/qcom/LENOVO/21BX.xxxnew %{_firmwaredir}/qcom/LENOVO/21BX
+fi
+%{?regenerate_initrd_posttrans}
diff --git a/uncompressed-post b/uncompressed-post
new file mode 100644
index 0000000..40f338e
--- /dev/null
+++ b/uncompressed-post
@@ -0,0 +1,27 @@
+%pre
+# ugly workaround for changing qcom/LENOVO/21BX to a symlink (bsc#1204103)
+if [ ! -L %{_firmwaredir}/qcom/LENOVO/21BX ]; then
+  if [ -d %{_firmwaredir}/qcom/LENOVO/21BX ]; then
+    mv %{_firmwaredir}/qcom/LENOVO/21BX %{_firmwaredir}/qcom/LENOVO/21BX.xxxold
+  fi
+fi
+
+%post
+# ugly workaround (bsc#1204103)
+if [ -d %{_firmwaredir}/qcom/LENOVO/21BX.xxxold ]; then
+  mv %{_firmwaredir}/qcom/LENOVO/21BX %{_firmwaredir}/qcom/LENOVO/21BX.xxxnew
+  mv %{_firmwaredir}/qcom/LENOVO/21BX.xxxold %{_firmwaredir}/qcom/LENOVO/21BX
+else
+%{?regenerate_initrd_post}
+fi
+
+%postun
+%{?regenerate_initrd_post}
+
+%posttrans
+# ugly workaround (bsc#1204103)
+if [ -L %{_firmwaredir}/qcom/LENOVO/21BX.xxxnew ]; then
+  rm -rf %{_firmwaredir}/qcom/LENOVO/21BX
+  mv %{_firmwaredir}/qcom/LENOVO/21BX.xxxnew %{_firmwaredir}/qcom/LENOVO/21BX
+fi
+%{?regenerate_initrd_posttrans}