[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#958566: Suggested patch added



Script postinst of package firmware-b43-installer is modified to load the classic firmware for broadcom-cards,

according to  note at https://wiki.archlinux.org/index.php/Broadcom_wireless#b43

Logic is added to also load the correct version, in case the firmware is unconditionally loaded.

New postinst and diff are attached, I hope.

I did not properly indent the postinst-file!

#!/bin/sh
set -e

#########################################################################

make_env()
{
if [ -n "$latest" ]; then
        VERSION="6.30.163.46"
        BROADCOM_WL="broadcom-wl-${VERSION}"
        WL_APSTA="${BROADCOM_WL}.wl_apsta.o"
        SHA512SUM="0144894fbbb5e8ebab6c423d9bd0f3249be94f2f468a50b8bf721a3b17f1f6e57467c79e87abc8d136bfc92e701ed046885fead892e9a73efa5217d710311ae9"
else
        VERSION="5.100.138"
        BROADCOM_WL="broadcom-wl-${VERSION}"
        WL_APSTA="${BROADCOM_WL}/linux/wl_apsta.o"
	SHA512SUM="02487e76e3eca7fe97ce2ad7dc9c5d39fac82b8d5f7786cce047f9c85e2426f5b7ea085d84c7d4aae43e0fe348d603e3229211bab601726794ef633441d37a8b"
fi

DOWNLOAD="${BROADCOM_WL}.tar.bz2"

URL="https://www.lwfinger.com/b43-firmware/${DOWNLOAD}";

FIRMWARE_INSTALL_DIR="/lib/firmware"

B43="b43"
}

#########################################################################
# stable sections below, not updated for firmware updates		#
#########################################################################

. /usr/share/debconf/confmodule

install_firmware ()
{
make_env

tmp=$(mktemp -q -d)

cd $tmp

# use apt proxy
APT_PROXIES=$(apt-config shell \
http_proxy Acquire::http::Proxy \
https_proxy Acquire::https::Proxy \
ftp_proxy Acquire::ftp::Proxy \
)

if [ -n "$APT_PROXIES" ]; then
        eval export $APT_PROXIES
fi

if ! wget --timeout=60 "${URL}"; then
	echo "$0: Some problem occurred during the firmware download. Please check your internet connection." 1>&2
	exit 1
fi
if ! sha512sum -c /dev/stdin << EOF; then
${SHA512SUM}  ${DOWNLOAD}
EOF
	echo "$0: Downloaded firmware did not match known SHA512 checksum, aborting." 1>&2
	exit 1
fi
if [ "${DOWNLOAD}" != "${WL_APSTA}" ]; then
	if ! tar xvjf "${DOWNLOAD}" "${WL_APSTA}"; then
		echo "$0: Unpacking firmware file failed, unable to continue (is /tmp full?)." 1>&2
		exit 1
	fi
fi
catalog="${FIRMWARE_INSTALL_DIR}/${B43}/firmware-${B43}-installer.catalog"
if [ -f "${catalog}" ]; then
	echo "$0: Deleting old extracted firmware..." 1>&2
	xargs -r -0 -a "${catalog}" dpkg-query -S 2>&1 1>/dev/null | sed -es',[^/]\+,,' | xargs -r rm --
	rm "${catalog}"
fi
mkdir -p "${FIRMWARE_INSTALL_DIR}/${B43}"
retcode=0
b43-fwcutter -w "${FIRMWARE_INSTALL_DIR}" "${WL_APSTA}" | while read line
do	echo "${line}"
	file="${line#Extracting }"
	if [ "${file}" != "${line}" ]
	then	if [ "${retcode}" -ne 0 ]
		then	rm "${FIRMWARE_INSTALL_DIR}/${file}"

		elif [ -z "${FIRMWARE_INSTALL_DIR}/${file}" ] || \
		! printf %s/%s\\000 "${FIRMWARE_INSTALL_DIR}" "${file}" >> "${catalog}"
		then	echo "$0: Failed during extraction of ${file} from ${WL_APSTA}" 1>&2
			echo "$0: Warning, manual removal/cleaning of ${FIRMWARE_INSTALL_DIR}/${B43} may be needed!" 1>&2
			rm "${FIRMWARE_INSTALL_DIR}/${file}"
			retcode=1
		fi
	fi
done

rm -f "${DOWNLOAD}" "${WL_APSTA}"
rm -rf "${BROADCOM_WL}"

# otherwise can't delete things
cd /

rmdir $tmp || echo "$0: DEBUG: targeted cleaning failed" 1>&2

rm -rf $tmp
[ ${retcode} -eq 0 ] || exit ${retcode}
}

# check environment
if [ "$(stat -c %d/%i /)" != "$(stat -Lc %d/%i /proc/1/root 2>/dev/null)" ];
 then
    echo "A chroot environment has been detected."
    echo "Remember this firmware needs kernel >= 2.6.25."
    unconditional=1
 else 
    echo "No chroot environment found. Starting normal installation"
fi
     

if [ -z "$unconditonal" ]; then
# check kernel version
if dpkg --compare-versions 2.6.25 gt `uname -r | cut -d- -f1`; then
	echo "Kernel too old. This firmware needs >= 2.6.25!."
	echo "Aborting!"
	exit 0
fi

# install firmware unconditional if the corresponding debconf value is true
# this is usefull for live-systems or similar systems that should work on
# changing hardware
db_get b43-fwcutter/install-unconditional
if [ "$RET" = "true" ] ; then
    unconditional=1
fi
fi

# check chip
pci=`lspci -n -d 14e4: | grep -o "14e4:[1234567890abcdef]\+"` || true

if [ -z "$pci$unconditional" ]; then
	echo "No known supported Broadcom 802.11 chips found, not installing firmware."
	echo
	echo "Aborting."
	exit 0
fi

if [ -n "$pci" ] ; then
for device in $pci; do
	device_id=${device#14e4:}
	case $device_id in
	4301 | 4325)
		legacy=1
	;;
	4306 | 432[04])
		chip=`lspci -n -d ${device}`
		if [ "${chip}" != "${chip%${device} (rev 03)}" ] ; then
		   latest=1
		else
		   legacy=1
		fi
	;;
	4307 | 431[59] | 432[1289bc] | 4331 | 435[03789] | 43a[9a] | 4716 | a8d8 | a8db | 5354)
		latest=1
	;;
        431[12])
                classic=1
        ;;
        4318)
                chip=`lspci -n -d ${device}`
                if [ "${chip}" != "${chip%${device} (rev 02)}" ] ; then
                   classic=1
                else
                   latest=1
                fi
        ;;
	4322 | 4358 | 436[05] | 43a0 | 43b1 | 4727)
		unsupported="$unsupported $device_id"
	;;
	4313)
		# need to distinguish BCM4311 (untested) from BCM4313 (not supported)
		nottested=1
	;;
	0576 | 432[ad] | 435[89a] | a8d6 | a99d)
		nottested=1
	;;
	*)
	;;
	esac
done
fi

if [ -n "$unconditonal" ]; then
        if [ -z "$latest$classic" ]; then
           # default latest firmware if unconditional
           latest=1
        fi
        install_firmware
        exit 0
fi

if [ -n "$unsupported" ]; then
	echo -n "Unsupported device(s) found: PCI id "
	for device_id in $unsupported; do echo -n " * 14e4:$device_id "; done
	echo
fi
if [ -n "$legacy" ]; then
	echo "An unsupported BCM4301, BCM4306 or BCM4306/2 device was found."
	echo "Please install b43legacy firmware (firmware-b43legacy-installer package)."
	echo
fi
if [ -n "$latest$classic" ]; then
	echo "A card known to work was found. Trying to install firmware."
	install_firmware
elif [ -n "$nottested" ]; then
	echo "An untested card was found. Please install the driver manually."
fi

#DEBHELPER#
--- firmware-b43-installer.postinst_org	2020-04-11 11:42:37.000000000 +0200
+++ firmware-b43-installer.postinst	2020-04-29 15:35:39.477170391 +0200
@@ -3,21 +3,28 @@
 
 #########################################################################
 
-VERSION="6.30.163.46"
-
-BROADCOM_WL="broadcom-wl-${VERSION}"
-
-WL_APSTA="${BROADCOM_WL}.wl_apsta.o"
+make_env()
+{
+if [ -n "$latest" ]; then
+        VERSION="6.30.163.46"
+        BROADCOM_WL="broadcom-wl-${VERSION}"
+        WL_APSTA="${BROADCOM_WL}.wl_apsta.o"
+        SHA512SUM="0144894fbbb5e8ebab6c423d9bd0f3249be94f2f468a50b8bf721a3b17f1f6e57467c79e87abc8d136bfc92e701ed046885fead892e9a73efa5217d710311ae9"
+else
+        VERSION="5.100.138"
+        BROADCOM_WL="broadcom-wl-${VERSION}"
+        WL_APSTA="${BROADCOM_WL}/linux/wl_apsta.o"
+	SHA512SUM="02487e76e3eca7fe97ce2ad7dc9c5d39fac82b8d5f7786cce047f9c85e2426f5b7ea085d84c7d4aae43e0fe348d603e3229211bab601726794ef633441d37a8b"
+fi
 
 DOWNLOAD="${BROADCOM_WL}.tar.bz2"
 
 URL="https://www.lwfinger.com/b43-firmware/${DOWNLOAD}";
 
-SHA512SUM="0144894fbbb5e8ebab6c423d9bd0f3249be94f2f468a50b8bf721a3b17f1f6e57467c79e87abc8d136bfc92e701ed046885fead892e9a73efa5217d710311ae9"
-
 FIRMWARE_INSTALL_DIR="/lib/firmware"
 
 B43="b43"
+}
 
 #########################################################################
 # stable sections below, not updated for firmware updates		#
@@ -25,8 +32,10 @@
 
 . /usr/share/debconf/confmodule
 
-latest_firmware ()
+install_firmware ()
 {
+make_env
+
 tmp=$(mktemp -q -d)
 
 cd $tmp
@@ -100,15 +109,13 @@
  then
     echo "A chroot environment has been detected."
     echo "Remember this firmware needs kernel >= 2.6.25."
-    latest_firmware
-    exit 0
+    unconditional=1
  else 
     echo "No chroot environment found. Starting normal installation"
 fi
      
 
-
-
+if [ -z "$unconditonal" ]; then
 # check kernel version
 if dpkg --compare-versions 2.6.25 gt `uname -r | cut -d- -f1`; then
 	echo "Kernel too old. This firmware needs >= 2.6.25!."
@@ -121,27 +128,28 @@
 # changing hardware
 db_get b43-fwcutter/install-unconditional
 if [ "$RET" = "true" ] ; then
-    latest_firmware
-    exit 0
+    unconditional=1
+fi
 fi
 
 # check chip
 pci=`lspci -n -d 14e4: | grep -o "14e4:[1234567890abcdef]\+"` || true
 
-if [ -z "$pci" ]; then
+if [ -z "$pci$unconditional" ]; then
 	echo "No known supported Broadcom 802.11 chips found, not installing firmware."
 	echo
 	echo "Aborting."
 	exit 0
 fi
 
+if [ -n "$pci" ] ; then
 for device in $pci; do
 	device_id=${device#14e4:}
 	case $device_id in
-	430[16] | 4325)
+	4301 | 4325)
 		legacy=1
 	;;
-	432[04])
+	4306 | 432[04])
 		chip=`lspci -n -d ${device}`
 		if [ "${chip}" != "${chip%${device} (rev 03)}" ] ; then
 		   latest=1
@@ -149,9 +157,20 @@
 		   legacy=1
 		fi
 	;;
-	4307 | 431[12589] | 432[1289bc] | 4331 | 435[03789] | 43a[9a] | 4716 | a8d8 | a8db | 5354)
+	4307 | 431[59] | 432[1289bc] | 4331 | 435[03789] | 43a[9a] | 4716 | a8d8 | a8db | 5354)
 		latest=1
 	;;
+        431[12])
+                classic=1
+        ;;
+        4318)
+                chip=`lspci -n -d ${device}`
+                if [ "${chip}" != "${chip%${device} (rev 02)}" ] ; then
+                   classic=1
+                else
+                   latest=1
+                fi
+        ;;
 	4322 | 4358 | 436[05] | 43a0 | 43b1 | 4727)
 		unsupported="$unsupported $device_id"
 	;;
@@ -166,6 +185,16 @@
 	;;
 	esac
 done
+fi
+
+if [ -n "$unconditonal" ]; then
+        if [ -z "$latest$classic" ]; then
+           # default latest firmware if unconditional
+           latest=1
+        fi
+        install_firmware
+        exit 0
+fi
 
 if [ -n "$unsupported" ]; then
 	echo -n "Unsupported device(s) found: PCI id "
@@ -177,9 +206,9 @@
 	echo "Please install b43legacy firmware (firmware-b43legacy-installer package)."
 	echo
 fi
-if [ -n "$latest" ]; then
+if [ -n "$latest$classic" ]; then
 	echo "A card known to work was found. Trying to install firmware."
-	latest_firmware
+	install_firmware
 elif [ -n "$nottested" ]; then
 	echo "An untested card was found. Please install the driver manually."
 fi

Reply to: