1
1
Files
zyxel-vmg8825_b50b-cfw/package/base-files-prebuild/files/rootfs/etc/init.d/hndmfg.sh
T
2026-04-17 18:33:03 +02:00

934 lines
25 KiB
Bash
Executable File

#!/bin/sh
#
# USAGE:
# - Use <FTP/HTTP> protocol to download the MFG NVRAM file <bcm94908bifr.nvm>
# from FTP/HTTP server on the HOST PC with IP address <192.168.1.100>
#
# CFE> kernp mfg_nvram_mode=1 mfg_nvram_url=ftp://192.168.1.100/bcm94908bifr.nvm
# CFE> kernp mfg_nvram_mode=1 mfg_nvram_url=http://192.168.1.100/bcm94908bifr.nvm
#
# - Use <TFTP> protocol to download the MFG NVRAM file <bcm94908bifr.nvm>
# from TFTP server on the HOST PC with IP address <192.168.1.100>
#
# CFE> kernp mfg_nvram_mode=1 mfg_nvram_url=tftp://192.168.1.100/bcm94908bifr.nvm
#
#
# Variables
#
MFG_NVRAM_PARTITION=misc1
DEFAULTS_MNT_DIR=/mnt/defaults
DEFAULTS_MFG_NVRAM_DIR=$DEFAULTS_MNT_DIR/wl
MFG_NVRAM_DIR=/mnt/nvram
MFG_NVRAM_TMP_DIR=/var/tmp/nvram
MFG_NVRAM_WLAN_DIR=/etc/wlan
MFG_NVRAM_FILE=nvram.nvm
KERNEL_NVRAM_FILE="/data/.kernel_nvram.setting"
LKM_DRIVERS_FILE=/etc/init.d/bcm-base-drivers.sh
#
# Indicates nvram mfg mode.
# Created as a result of CFE> kernp mfg_nvram_mode=1
MFG_NVRAM_MODE_FILEPATH=/proc/brcm/blxparms/mfg_nvram_mode
#
# Indicates nvram mfg mode debug.
# Created as a result of CFE> kernp mfg_nvram_mode_debug=1
MFG_NVRAM_MODE_DEBUG_FILEPATH=/proc/brcm/blxparms/mfg_nvram_mode_debug
is_mfg_nvram_mode_dbg=0
#
# Indicates nvram file URL.
# Created as a result of CFE> kernp mfg_nvram_url=ftp://<hostip>/<nvram_file>
MFG_NVRAM_URL_FILEPATH=/proc/brcm/blxparms/mfg_nvram_url
MFG_NVRAM_TMP_URL_FILEPATH=/var/tmp/mfg_nvram_url
# Protocol to download the nvram file (ftp or tftp)
MFG_NVRAM_URL_PROTO=""
# IP address of mfg host PC
MFG_NVRAM_URL_IP=""
# mfg nvram file hame on host PC
MFG_NVRAM_URL_FILE=""
#
# Board default IP address and mask
TARGET_IP=192.168.1.1
TARGET_NETMASK=255.255.255.0
#
# max number of pings for network verification.
MFG_PING_RETRY_LIMIT=10
ZYXEL_MFG=0
#
# Fatal error message strings
#
MSG_FATAL_NVRAMURL=$(cat <<-END
*** Cannot find URL ***.
Make sure mfg_nvram_url=<URL> tuple is specified as one the
kernp arguments.
URL format is: <proto>://<host IP address>/<nvram file name>
where <proto> is 'ftp' or 'tftp'.
Example:
kernp mfg_nvram_mode=1 mfg_nvram_url=ftp://192.168.1.100/bcm94908bifr.nvm
or
kernp mfg_nvram_mode=1 mfg_nvram_url=tftp://192.168.1.100/bcm94908bifr.nvm
END
)
MSG_FATAL_NAND_MISCPARTITION=$(cat <<-END
*** Cannot find $MFG_NVRAM_PARTITION partition ***.
Make sure that '$MFG_NVRAM_PARTITION' partition size in CFEROM image for embedded NVRAM
has been configured.
Tf so, then make sure that '$MFG_NVRAM_PARTITION' partition size is specifed in CFEROM
NVRAM on the NANAD flash.
Use CFERAM 'c' command to specify $MFG_NVRAM_PARTITION partition size in CFEROM
NVRAM on the NANAD flash.
END
)
MSG_FATAL_EMMC_MISCPARTITION=$(cat <<-END
*** Cannot find $MFG_NVRAM_PARTITION partition ***.
Make sure that '$MFG_NVRAM_PARTITION' partition is created from CFE using emmcfmtgpt
or configured in the image itself.
Use CFERAM 'showdevs' command to check $MFG_NVRAM_EMMC_PARTITION partition size on the
eMMC flash.
END
)
MSG_FATAL_WGET=$(cat <<-END
*** WGET failed. ***.
Make sure that FTP/HTTP server is up and running on the HOST PC.
If so, then make sure IP address and mfg file name in URL
in correct and mfg file exists in FTP/HTTP server directory
on the HOST PC.
END
)
MSG_FATAL_TFTP=$(cat <<-END
*** TFTP client failed. ***.
Make sure that TFTP server is up and running on the HOST PC.
If so, then make sure IP address and mfg file name in URL
in correct and mfg file exists in TFTP server directory
on the HOST PC.
END
)
MSG_FATAL_DNLD=$(cat <<-END
*** Failed to download mfg nvram file. ***.
Make sure nvram directory is mounted properly.
From emergency CLI use command "ls -al /mnt/nvram" to verify
if directory exists and empty.
END
)
MSG_FATAL_NETTEST=$(cat <<-END
*** Network test failed ***.
Make sure Ethernet network cable is plugged in properly between HOST PC and
the board. Verify that HOST PC Ethernet IP addredd is setted up same as specified
in the URL.
END
)
MSG_FATAL_BASEMACADDR=$(cat <<-END
*** Cannot get Base MAC Address from NVRAM ***
Make sure the Manufacturing NVRAM template contains the variable
'et0macaddr' and it has proper MAC address value.
If so, make sure that 'envrams' daemon is running:
from emergency CLI type: 'ps | grep nvrams'
END
)
MSG_FATAL_NVRAMURL_PROTO=$(cat <<-END
*** Bad protocol is specified in URL ***.
Make sure mfg_nvram_url=<URL> tuple is specified as one the
kernp arguments.
URL format is: <proto>://<host IP address>/<nvram file name>
where <proto> is 'ftp', 'http' or 'tftp'.
Example:
kernp mfg_nvram_mode=1 mfg_nvram_url=ftp://192.168.1.100/bcm94908bifr.nvm
kernp mfg_nvram_mode=1 mfg_nvram_url=http://192.168.1.100/bcm94908bifr.nvm
or
kernp mfg_nvram_mode=1 mfg_nvram_url=tftp://192.168.1.100/bcm94908bifr.nvm
END
)
MSG_FATAL_NVRAMURL_IPADDR=$(cat <<-END
*** Bad IP address is specified in URL ***.
Make sure mfg_nvram_url=<URL> tuple is specified as one the
kernp arguments.
URL format is: <proto>://<host IP address>/<nvram file name>
where <proto> is 'ftp', 'http' or 'tftp'.
Example:
kernp mfg_nvram_mode=1 mfg_nvram_url=ftp://192.168.1.100/bcm94908bifr.nvm
kernp mfg_nvram_mode=1 mfg_nvram_url=http://192.168.1.100/bcm94908bifr.nvm
or
kernp mfg_nvram_mode=1 mfg_nvram_url=tftp://192.168.1.100/bcm94908bifr.nvm
END
)
MSG_FATAL_NVRAMURL_HOSTFILE=$(cat <<-END
*** Bad host nvram file name is specified in URL ***.
Make sure mfg_nvram_url=<URL> tuple is specified as one the
kernp arguments.
URL format is: <proto>://<host IP address>/<nvram file name>
where <proto> is 'ftp', 'http' or 'tftp'.
Example:
kernp mfg_nvram_mode=1 mfg_nvram_url=ftp://192.168.1.100/bcm94908bifr.nvm
kernp mfg_nvram_mode=1 mfg_nvram_url=http://192.168.1.100/bcm94908bifr.nvm
or
kernp mfg_nvram_mode=1 mfg_nvram_url=tftp://192.168.1.100/bcm94908bifr.nvm
END
)
#
# Functions
#
#
# Inster module into kernel with verification of
# file existence before loading. If kernel module
# doesn't exist then do nothing.
# Throwing fatal error (ending up with reboot) if
# insmod fails.
#
# Parameters:
# First parameter: is the kernel module file name_path
# Second parameter: (optional) is a kernel module
# ALL parameters composed in single string.
# Example:
# mfg_insmod "/dir/module.ko" "param1=val1 param2=val2 ... paramN=valN"
#
mfg_insmod()
{
ins_mod=1
echo ""
echo "loading [$1 $2] ... "
#if [ $is_mfg_nvram_mode_dbg == 1 ]; then
#yes_no_confirmation
#ins_mod=$?
#fi
if [ -e $1 ]; then
if [ $ins_mod == 1 ]; then
insmod $1 $2 > /dev/null 2>/dev/null || error_exit "$0: insmod $1 failed"
echo "[$1] loaded"
else
echo "[$1] skipped"
fi
else
echo "[$1] dosn't exist."
fi
return 0
}
#
# Handling a fatal error by printing optional error
# message specified as a first argument.
# Entering shell for diagnostic purpose.
# After exiting the shell with 'exit' command do the
# system reboot.
#
mfg_fatal()
{
echo $'\n\n'"$1"$'\n\n'
# offering bash CLI for diagnostic
echo $'\n\nEntering emergency mode. Exit the shell to reboot the system.\n\n'
/bin/bash -i
# System rebooting. Do not allow farther execution.
reboot -f
}
#
# Verifying return value of previously executed command
# and throw fatal error if the command is not succeeded.
# In case of error this funciton will never return and
# will endup with system reboot.
#
error_exit()
{
if [ "$?" != "0" ]; then
mfg_fatal "*** ERROR $1"
fi
}
#
# Return values:
# 1 - [Yy]
# 0 - [Nn]
#
yes_no_confirmation() {
while true; do
echo ""
echo ""
read -p ">> Do you want to continue ... ? " yn
case $yn in
[Yy]* ) return 1;;
[Nn]* ) return 0;;
* ) echo "Please answer yes or no.";;
esac
done
}
#
# Parse URL.
# Store protocol, host IP address and host nvram file name
# in dedicated variables.
#
mfg_parse_url()
{
MFG_NVRAM_URL=""
if [ ! -e $MFG_NVRAM_URL_FILEPATH ]; then
mfg_fatal "[$0]: $MSG_FATAL_NVRAMURL"
else
MFG_NVRAM_URL=$(cat $MFG_NVRAM_URL_FILEPATH)
fi
# The typical mfg nvram URL string looks like this:
# For example:
# "ftp://192.168.1.100/bcm94908bifr.nvm"
# "http://192.168.1.100/bcm94908bifr.nvm"
# "tftp://192.168.1.100/bcm94908bifr.nvm"
# Get protocol.
# strip everything start with the first ':' till the end of the string.
MFG_NVRAM_URL_PROTO=$MFG_NVRAM_URL
MFG_NVRAM_URL_PROTO=${MFG_NVRAM_URL_PROTO/:*/}
# Validate protocol
if [ "${MFG_NVRAM_URL_PROTO}" != "ftp" ] && [ "${MFG_NVRAM_URL_PROTO}" != "tftp" ] && [ "${MFG_NVRAM_URL_PROTO}" != "http" ]
then
mfg_fatal "[$0]: $MSG_FATAL_NVRAMURL_PROTO"
else
echo "[$0]: Host protocol: <$MFG_NVRAM_URL_PROTO>"
fi
# strip everything before IP address(192.168.1.100)
# will get "192.168.1.100/bcm94908bifr.nvm"
MFG_NVRAM_URL=${MFG_NVRAM_URL#*\/\/}
# Get ip address.
# strip everything start with the first '/' till the end of the string.
MFG_NVRAM_URL_IP=$MFG_NVRAM_URL
MFG_NVRAM_URL_IP=${MFG_NVRAM_URL_IP/\/*/}
# Validate IP
[[ -z "${MFG_NVRAM_URL_IP// }" ]] && mfg_fatal "$0: $MSG_FATAL_NVRAMURL_IPADDR"
echo "[$0]: Host IP address: <$MFG_NVRAM_URL_IP>"
# strip IP addr and following '/' from the URL: <192.168.1.100/>
MFG_NVRAM_URL=${MFG_NVRAM_URL/${MFG_NVRAM_URL_IP}/}
MFG_NVRAM_URL=${MFG_NVRAM_URL#*\/}
# Get file name. (this is the last substring in the URL)
MFG_NVRAM_URL_FILE=$MFG_NVRAM_URL
# Validate host file name
[[ -z "${MFG_NVRAM_URL_FILE// }" ]] && mfg_fatal "$0: $MSG_FATAL_NVRAMURL_HOSTFILE"
echo "[$0]: Host file name: <$MFG_NVRAM_URL_FILE>"
}
#
# Download mfg nvram file from FTP or TFTP server.
#
mfg_download_nvram_file()
{
URL=$(cat $MFG_NVRAM_URL_FILEPATH)
echo "[$0]: Downloading MFG NVRAM file <URL=$URL>"
if [ "${MFG_NVRAM_URL_PROTO}" == "ftp" ] || [ "${MFG_NVRAM_URL_PROTO}" == "http" ]
then
wget $URL -P $MFG_NVRAM_TMP_DIR -O $MFG_NVRAM_TMP_DIR/$MFG_NVRAM_FILE || mfg_fatal "$0: $MSG_FATAL_WGET"
fi
if [ "${MFG_NVRAM_URL_PROTO}" == "tftp" ]
then
tftp -g -l $MFG_NVRAM_TMP_DIR/$MFG_NVRAM_FILE -r $MFG_NVRAM_URL_FILE $MFG_NVRAM_URL_IP || mfg_fatal "$0: $MSG_FATAL_TFTP"
fi
if [ ! -f $MFG_NVRAM_TMP_DIR/$MFG_NVRAM_FILE ]
then
mfg_fatal "$0: $MSG_FATAL_DNLD"
else
echo "[$0]: '$MFG_NVRAM_TMP_DIR'/'$MFG_NVRAM_FILE' file downloaded successfully."
fi
}
mfg_init_nvram_dirs()
{
mkdir -p /var/tmp
if [ -d $DEFAULTS_MNT_DIR ]; then
echo "$0: $DEFAULTS_MNT_DIR present"
mkdir -p $DEFAULTS_MFG_NVRAM_DIR || error_exit "$0: mkdir failed"
if [ ! -L $MFG_NVRAM_DIR ]; then
ln -s $DEFAULTS_MFG_NVRAM_DIR $MFG_NVRAM_DIR || error_exit "$0: link failed"
echo "$0: Created $MFG_NVRAM_DIR link"
fi
else
mkdir -p $MFG_NVRAM_DIR || error_exit "$0: mkdir failed"
fi
mkdir -p $MFG_NVRAM_TMP_DIR || error_exit "$0: mkdir failed"
}
mfg_init()
{
echo "$0: Initializing. [is_mfg_nvram_mode_dbg=$is_mfg_nvram_mode_dbg]"
#
# MDEV and hotplug:
#
# Configure hotplug handler
echo /sbin/mdev > /proc/sys/kernel/hotplug
# Initialize and run mdev to crete dynamic device nodes
echo "$0: Starting mdev."
/sbin/mdev -s
mfg_init_nvram_dirs
# Parse URL.
# Zyxel there is no url paramiter to parse
if [ $ZYXEL_MFG -ne 1 ]; then
mfg_parse_url
fi
echo "$0: Done"
}
#
# Do system reboot
# Options:
# --iteractive - Entering iteractive mode.
# Will wait for reboot confirmation.
# If confirmed with "y", then rebooting
# If not confirmed with "n", then entering bash CLI.
#
mfg_reboot()
{
reboot=1
echo "System is goint to reboot ..."
# iteractive mode. for debugging purpose
if [ "$1" == "--iteractive" ]; then
yes_no_confirmation
reboot=$?
if [ $reboot == 1 ]; then
reboot -f # System reboot
else
/bin/bash -i
fi
fi
[ $reboot == 1 ] && reboot -f # System reboot
}
mfg_mount_nand_nvram_fs()
{
if MTD=`grep $MFG_NVRAM_PARTITION /proc/mtd`;
then
MTD=${MTD/mtd/}; # replace "mtd" with nothing
MTD=${MTD/:*/}; # replace ":*" (trailing) with nothing
fi
if [ "$MTD" != "" ]
then
#
# Creating UBI volume
#
echo "[$0]: $MFG_NVRAM_PARTITION partition is on MTD devide $MTD"
echo "[$0]: Erasing the MTD $MTD partition"
ubiformat /dev/mtd$MTD -e 0 || error_exit "$0: ubiformat failed"
echo "[$0]: Attaching MTD device $MTD to UBI device"
ubiattach -m $MTD || error_exit "$0: ubiattach failed"
echo "[$0]: Createing new UBI device node"
UBI=`grep -l $MTD /sys/class/ubi/*/mtd_num`
if [ $ZYXEL_MFG -ne 1 ]; then
# Zyxel opel shell does not support brcm replace style
UBI=${UBI/\/mtd_num/}; # remove "/mtd_num" from the path
UBI=${UBI/\/sys\/class\/ubi\//}; # remove "/sys/class/ubi/" from the path
else
UBI=${UBI%/mtd_num}; # remove "/mtd_num" from the path
UBI=${UBI#/sys/class/ubi/}; # remove "/sys/class/ubi/" from the path
fi
DEV=/dev/$UBI # mdev should already populate the new device node for ubi in /dev.
echo "[$0]: DEV=$DEV UBI=$UBI"
[ -e $DEV ] || error_exit "$0: device node '$DEV' does not exist."
echo "[$0]: Createing new UBI volume"
ubimkvol $DEV --name=nvram --type=dynamic --maxavsize || error_exit "$0: ubimkvol failed"
echo "[$0]: Mounting nvram UBI volume"
mount -t ubifs $UBI:nvram $MFG_NVRAM_DIR || error_exit "$0: mount failed"
return 0
else
mfg_fatal "$0: $MSG_FATAL_NAND_MISCPARTITION"
fi
}
mfg_ubidetach_and_remount()
{
if [ "$FLASHTYPE" == "NAND" ]; then
echo "[$0]: Detaching MTD device $MTD from UBI and remount"
ubidetach -m $MTD || error_exit "$0: ubidetach failed"
mfg_mount_nand_nvram_fs
fi
}
mfg_mount_nand_nvram_fs_only()
{
if MTD=`grep $MFG_NVRAM_PARTITION /proc/mtd`;
then
MTD=${MTD/mtd/}; # replace "mtd" with nothing
MTD=${MTD/:*/}; # replace ":*" (trailing) with nothing
fi
if [ "$MTD" != "" ]
then
echo "[$0]: Attaching MTD device $MTD to UBI device"
ubiattach -m $MTD || error_exit "$0: ubiattach failed"
UBI=`grep -l $MTD /sys/class/ubi/*/mtd_num`
if [ $ZYXEL_MFG -ne 1 ]; then
# Zyxel opel shell does not support brcm replace style
UBI=${UBI/\/mtd_num/}; # remove "/mtd_num" from the path
UBI=${UBI/\/sys\/class\/ubi\//}; # remove "/sys/class/ubi/" from the path
else
UBI=${UBI%/mtd_num}; # remove "/mtd_num" from the path
UBI=${UBI#/sys/class/ubi/}; # remove "/sys/class/ubi/" from the path
fi
DEV=/dev/$UBI # mdev should already populate the new device node for ubi in /dev.
echo "[$0]: DEV=$DEV UBI=$UBI"
[ -e $DEV ] || error_exit "$0: device node '$DEV' does not exist."
echo "[$0]: Mounting nvram UBI volume"
mount -t ubifs $UBI:nvram $MFG_NVRAM_DIR || mfg_ubidetach_and_remount
else
mfg_fatal "$0: $MSG_FATAL_NAND_MISCPARTITION"
fi
}
mfg_mount_emmc_nvram_fs()
{
echo "[$0]: Programming manufacturing NVRAM file to eMMC flash ..."
DEV=/dev/$MFG_NVRAM_PARTITION
# Check if the symbolic link to the emmc misc1 partition exists
if [ -L $DEV ]; then
# Mounting misc partition
echo "[$0]: Mounting eMMC $MFG_NVRAM_PARTITION Partition ..."
mount -t $FSTYPE $DEV $MFG_NVRAM_DIR -rw
if [ ! $? -eq 0 ]; then
echo "[$0] Formatting eMMC $MFG_NVRAM_PARTITION Partition ..."
mke2fs -t $FSTYPE -F $DEV
echo "[$0]: Mounting eMMC $MFG_NVRAM_PARTITION Partition ..."
mount -t $FSTYPE $DEV $MFG_NVRAM_DIR -rw || error_exit "$0: mount failed"
fi
return 0
else
mfg_fatal "$0: $MSG_FATAL_EMMC_MISCPARTITION"
fi
}
mfg_mount_nor_nvram_fs()
{
MFG_NVRAM_PARTITION="data"
if MTD=`grep $MFG_NVRAM_PARTITION /proc/mtd`;
then
MTD=${MTD/mtd/}; # replace "mtd" with nothing
MTD=${MTD/:*/}; # replace ":*" (trailing) with nothing
fi
if [ "$MTD" != "" ]
then
echo "[$0]: $MFG_NVRAM_PARTITION partition is on MTD devide $MTD"
mount -t jffs2 mtd:$MFG_NVRAM_PARTITION $MFG_NVRAM_DIR || error_exit "$0: mount failed"
return 0
else
mfg_fatal "$0: $MSG_FATAL_NAND_MISCPARTITION"
fi
}
mfg_umount_nvram_fs()
{
echo "[$0]: Un-mounting NVRAM volume"
# Unmounting and detaching misc1 volume.
umount $MFG_NVRAM_DIR || error_exit "$0: umount failed"
rm -rf $MFG_NVRAM_DIR || error_exit "$0: rm failed"
if [ "$FLASHTYPE" == "NAND" ]; then
echo "[$0]: Detaching MTD device $MTD from UBI"
ubidetach -m $MTD || error_exit "$0: ubidetach failed"
fi
return 0
}
mfg_program_nvram()
{
if [ -d $DEFAULTS_MFG_NVRAM_DIR ]; then
PROG=1
else
if [ "$FLASHTYPE" == "NAND" ]; then
if [ $ZYXEL_MFG -ne 1 ]; then
mfg_mount_nand_nvram_fs
else
mfg_mount_nand_nvram_fs_only
fi
elif [ "$FLASHTYPE" == "eMMC" ]; then
mfg_mount_emmc_nvram_fs
else
mfg_mount_nor_nvram_fs
fi
if [ "$?" == "0" ]; then
PROG=1
MOUNTED=1
fi
fi
if [ "$PROG" != "" ]
then
# Downloading mfg NVRAM file from HOST PC.
# Zyxel Do not download the file cause there is no url.
if [ $ZYXEL_MFG -ne 1 ]; then
mfg_download_nvram_file
fi
#
# copy mfg NVRAM file from MFG_NVRAM_TMP_DIR to misc1
#
if [ $ZYXEL_MFG -ne 1 ]; then
echo "[$0]: copying nvram file to misc1"
cp $MFG_NVRAM_TMP_DIR/$MFG_NVRAM_FILE $MFG_NVRAM_DIR/$MFG_NVRAM_FILE
else
# Zyxel: if misc1 is empty, copy FW nvram to misc1
if [ ! -e $MFG_NVRAM_DIR/$MFG_NVRAM_FILE ] ; then
echo "[$0]: misc1 is empty. copying nvram file to misc1"
cp -a $MFG_NVRAM_WLAN_DIR/$MFG_NVRAM_FILE $MFG_NVRAM_DIR/$MFG_NVRAM_FILE
fi
fi
fi
if [ "$MOUNTED" != "" ]
then
#
# Unmounting and detaching misc1 volume.
#
mfg_umount_nvram_fs
fi
echo "$0: Done"
}
mfg_load_drivers()
{
echo "$0: Loading basic drivers"
if [ -f $LKM_DRIVERS_FILE ]; then
echo "$0: from $LKM_DRIVERS_FILE file"
# Pick drivers list automatically from the base drivers files list
# SATA drivers list starts after all the drivers required for ethernet drivers are listed.
# pick up the drivers list until SATA drivers, If missed check the next ones
# (PCIe, WLAN, NetXL, Voice, usb, other)
while IFS='' read -r line || [[ -n "$line" ]]; do
if echo "$line" | grep -q -e SATA -e PCIe -e WLAN -e NetXL -e Voice -e usb -e other; then
finish=1;
fi
if [ "$finish" != "1" ]; then
if echo "$line" |grep -q -e insmod; then
$line > /dev/null 2>/dev/null || error_exit "$0: insmod $1 failed"
fi
fi
done < "$LKM_DRIVERS_FILE"
else
echo "$0: from default list"
# This list is not actively maintained and needs manual update whenever a new driver
# addition is needed
mfg_insmod "/lib/modules/*/extra/rdp_fpm.ko"
mfg_insmod "/lib/modules/*/extra/bdmf.ko" "bdmf_chrdev_major=215"
mfg_insmod "/lib/modules/*/extra/bcm_pondrv.ko"
mfg_insmod "/lib/modules/*/extra/bcm_bpm.ko"
mfg_insmod "/lib/modules/*/extra/rdpa_gpl.ko"
mfg_insmod "/lib/modules/*/extra/rdpa_gpl_ext.ko"
mfg_insmod "/lib/modules/*/extra/rdpa.ko"
mfg_insmod "/lib/modules/*/extra/rdpa_usr.ko"
mfg_insmod "/lib/modules/*/extra/rdpa_mw.ko"
mfg_insmod "/lib/modules/*/extra/bcmbrfp.ko"
# CPEROUTER: need to avoid insmod pktflow error
mfg_insmod "/lib/modules/*/extra/bcmxtmrtdrv.ko"
# General
mfg_insmod "/lib/modules/*/extra/chipinfo.ko"
mfg_insmod "/lib/modules/*/extra/pktflow.ko"
# enet
mfg_insmod "/lib/modules/*/extra/bcm_enet.ko"
# moving
mfg_insmod "/lib/modules/*/extra/cmdlist.ko"
mfg_insmod "/lib/modules/*/extra/pktrunner.ko"
mfg_insmod "/lib/modules/*/extra/nciTMSkmod.ko"
# other
mfg_insmod "/lib/modules/*/extra/bcmvlan.ko"
mfg_insmod "/lib/modules/*/extra/pwrmngtd.ko"
mfg_insmod "/lib/modules/*/extra/rdpa_cmd.ko"
fi
test -e /etc/rdpa_init.sh && /etc/rdpa_init.sh
echo "$0: Loading basic drivers - done"
return 0
}
mfg_setup_network()
{
ip=$1
mask=$2
echo "$0: Bringing up the network ($ip/$mask)"
/etc/init.d/swmdk.sh start
brctl addbr br0
brctl stp br0 off
brctl setfd br0 0
#sendarp -s br0 -d br0
ifconfig br0 up
ifconfig br0 $ip netmask $mask up
for intf in `(cd /sys/class/net ; echo eth*)`
do
if ifconfig $intf up >/dev/null 2>/dev/null
then
brctl addif br0 $intf
if type tmctl 2> /dev/null > /dev/null
then
tmctl porttminit --devtype 0 --if $intf --flag 1
fi
fi
done
# bring up the loopback interface
ifconfig lo 127.0.0.1 netmask 255.0.0.0 broadcast 127.255.255.255 up
# need this rule to be able run wget
iptables -w -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
return 0
}
# This function performs some basic network test
mfg_test_network()
{
ip=$MFG_NVRAM_URL_IP
count=0
fail=no
echo "$0: testing network connection with host $ip"
if [ -f /bin/smd ]; then
#if smd exist, tftp and ping command may use CMS
/bin/smd
fi
while [ "$count" -le "$MFG_PING_RETRY_LIMIT" ]
do
ping -c 1 -W 1 $ip > /dev/null
if [ $? != 0 ]; then
fail=yes
else
fail=no
break
fi
let "count += 1"
echo "not ready ($count) ..."
done
if [ "${fail}" = "yes" ]; then
mfg_fatal "$0: $MSG_FATAL_NETTEST"
fi
return 0
}
# Get base MAC address from mfg NVRAM file
# and set it to the CFEROM NVRAM space.
mfg_set_base_macaddr()
{
if [ -f /usr/sbin/envrams ]; then
# launching envram server in order to read mfg NVRAM variables.
# envram server will mount manufacturing NVRAM UBI FS.
/usr/sbin/envrams
MACADDR=`envram get et0macaddr`
else
# get base MAC address from tmp NVRAM file
MACADDR=$(cat $MFG_NVRAM_TMP_DIR/$MFG_NVRAM_FILE)
MACADDR=${MACADDR/*et0macaddr=/}
MACADDR=$(expr match "$MACADDR" '\(\([[:xdigit:]]\{1,2\}:\)\{5\}[[:xdigit:]]\{1,2\}\)')
fi
if [ -z "${MACADDR// }" ]; then
echo "eth0macaddr is not set,will use BSP mac base."
else
echo "[$0]: Setting Base MAC address $MACADDR to CFEROM NVRAM."
if grep -iq "$MACADDR" /proc/nvram/BaseMacAddr 2>/dev/null; then
echo "[$0]: Skip the same MAC address."
else
# Set MAC address into CFEROM NVRAM
echo $MACADDR > /proc/nvram/BaseMacAddr
echo "[$0]: Done."
fi
fi
return 0
}
mfg_init_flash_type()
{
if [ /dev/root -ef /dev/rootfs1 ] || [ /dev/root -ef /dev/rootfs2 ]; then
FLASHTYPE="eMMC"
FSTYPE=ext4
# ZYXEL, fix Calibration data issue on JFFS2 filesystem
# elif [ /dev/root -ef /dev/mtdblock0 ]; then
# FLASHTYPE="NOR"
# FSTYPE=jffs2
else
FLASHTYPE="NAND"
FSTYPE=ubifs
fi
if [ "$FLASHTYPE" == "" ]; then
echo "$0: Un supported flash type, exiting"
exit 1
fi
}
case "$1" in
start)
/bin/mount -a
if [ ! -f $MFG_NVRAM_WLAN_DIR/$MFG_NVRAM_FILE ]; then
# Zyxel Because only 43684 wifi project using new NVM file currently
# So if there is no any NVM file in wlan folder, skip the script
exit 0
fi
if [ -e $MFG_NVRAM_MODE_FILEPATH ]; then
mfg_nvram_mode=$(cat $MFG_NVRAM_MODE_FILEPATH)
else
mfg_nvram_mode=0
fi
if [ -e $MFG_NVRAM_MODE_DEBUG_FILEPATH ]; then
mfg_nvram_mode_dbg=$(cat $MFG_NVRAM_MODE_DEBUG_FILEPATH)
else
mfg_nvram_mode_dbg=0
fi
is_mfg_nvram_mode=$(($mfg_nvram_mode & 1))
is_mfg_nvram_mode_dbg=$(($mfg_nvram_mode_dbg & 1))
if [ ! -s $KERNEL_NVRAM_FILE ]; then
echo "[$0] *** KERNEL_NVRAM_FILE does not exist or the size is empty, re-create it. ***"
rm -f $KERNEL_NVRAM_FILE
sync
fi
# Zyxel Only copy the .nvm file.
if [ ! -e $KERNEL_NVRAM_FILE ]; then
ZYXEL_MFG=1
mfg_init
mfg_init_flash_type
mfg_program_nvram
sync
#mfg_set_base_macaddr
fi
if [ $is_mfg_nvram_mode -eq 1 ]; then
mfg_init
mfg_load_drivers
mfg_setup_network "$TARGET_IP" "$TARGET_NETMASK"
mfg_test_network
mfg_init_flash_type
mfg_program_nvram
rm -f $KERNEL_NVRAM_FILE
sync
mfg_set_base_macaddr
if [ $is_mfg_nvram_mode_dbg -eq 1 ]; then
mfg_reboot --iteractive
else
mfg_reboot
fi
fi
exit 0
;;
stop)
exit 0
;;
dlnvram)
# parsing input url
echo "$2" > $MFG_NVRAM_TMP_URL_FILEPATH
MFG_NVRAM_URL_FILEPATH=$MFG_NVRAM_TMP_URL_FILEPATH
mfg_parse_url
# mkdir for downloading nvram file and mounting misc1
mfg_init_flash_type
mfg_init_nvram_dirs
# start to download nvram and write it to flash
mfg_program_nvram
# restart envrams and set address into CFEROM NVRAM
killall envrams
mfg_set_base_macaddr
# remove the temp files
rm $MFG_NVRAM_TMP_URL_FILEPATH
rm -rf $MFG_NVRAM_DIR
rm -rf $MFG_NVRAM_TMP_DIR
exit 0
;;
*)
echo "$0: unrecognized option $1"
;;
esac