Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automatic fw upgrade for mlnx platform (#18) #31

Merged
merged 2 commits into from
Oct 18, 2016
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ $(addprefix dockers/docker-syncd-mlnx/deps/,syncd_1.0.0_amd64.deb libsairedis_1.
mkdir -p `dirname $@` && cp $< $(dir $@)
dockers/docker-syncd-mlnx/deps/%.deb: src/%.deb
mkdir -p `dirname $@` && cp $< $(dir $@)
dockers/docker-syncd-mlnx/deps/fw-SPC.mfa: src/mlnx-sdk/fw-SPC.mfa
mkdir -p `dirname $@` && cp $< $(dir $@)

## Rules: docker-syncd-cavm
$(addprefix dockers/docker-syncd-cavm/deps/,$(CAVM-SDK-DEBS)) : dockers/docker-syncd-cavm/deps/%.deb : src/cavm-sdk/%.deb
Expand Down Expand Up @@ -106,7 +108,7 @@ target/docker-syncd.gz: target/docker-base.gz $(addprefix dockers/docker-syncd/d
docker load < $<
$(call build_docker,$(patsubst target/%.gz,%,$@),$@)

target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) applibs_1.mlnx.4.2.2100_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb $(LIBNL-DEBS))
target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) applibs_1.mlnx.4.2.2100_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb $(LIBNL-DEBS)) dockers/docker-syncd-mlnx/deps/fw-SPC.mfa
docker load < $<
$(call build_docker,$(patsubst target/%.gz,%,$@),$@)

Expand Down
4 changes: 3 additions & 1 deletion build_debian.sh
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,9 @@ sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install \
bsdmainutils \
ca-certificates \
i2c-tools \
efibootmgr
efibootmgr \
usbutils \
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which component requires this usbutils?

Copy link
Collaborator Author

@marian-pritsak marian-pritsak Oct 17, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mst utility uses usbutils and pciutils to talk to detect ASIC device

pciutils

## Remove sshd host keys, and will regenerate on first sshd start
sudo rm -f $FILESYSTEM_ROOT/etc/ssh/ssh_host_*_key*
Expand Down
2 changes: 2 additions & 0 deletions dockers/docker-syncd-mlnx/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return
RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/syncd_*.deb

COPY ["start.sh", "/usr/bin/"]
COPY ["mlnx-fw-upgrade.sh", "/usr/bin/"]
COPY ["/deps/fw-SPC.mfa", "/etc/mlnx/"]

## Clean up
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
Expand Down
53 changes: 53 additions & 0 deletions dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/bin/bash

query_retry_count_max="10"
required_fw_version="13.1130.0010"
fw_file=/etc/mlnx/fw-SPC.mfa

run_or_fail() {
$1
if [[ $? != 0 ]]; then
echo $1 failed
exit 1
fi
}

# wait until devices will be available
query_retry_count="0"
mlxfwmanager --query > /dev/null

while [[ (${query_retry_count} -lt ${query_retry_count_max}) && ($? -ne "0") ]]; do
sleep 1
query_retry_count=$[${query_retry_count}+1]
mlxfwmanager --query > /dev/null
done

run_or_fail "mlxfwmanager --query" > /tmp/mlnxfwmanager-query.txt

# get current firmware version
found_fw=false
for word in `cat /tmp/mlnxfwmanager-query.txt`
do
if [[ ${found_fw} == true ]]; then
fw_version=${word}
break
fi
if [[ ${word} == FW ]]; then
found_fw=true
fi
done

if [[ -z ${fw_version} ]]; then
echo "Could not retreive current FW version."
exit 1
fi

if [[ ${required_fw_version} == ${fw_version} ]]; then
echo "Mellanox firmware is up to date."
else
echo "Mellanox firmware required version is ${required_fw_version}. Upgrading..."
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Downgrading is also possible here. Is it safe to downgrade? Maybe you can refine the message.

run_or_fail "mlxfwmanager -i ${fw_file} -u -f -y"

# exit from here so that syncd service will restart
exit 0
fi
4 changes: 4 additions & 0 deletions dockers/docker-syncd-mlnx/start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ function clean_up {

trap clean_up SIGTERM SIGKILL

# fw-upgrade will exit if firmware was actually upgraded or if some error
# occures
. mlnx-fw-upgrade.sh
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

after upgrading the fw, do we need to restart the sxd kernel driver?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, we need to restart sxd kernel in order to run newly burned firmware

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then it is needed to add restart sxdkernel driver logic?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, correct
If firmware is actually updated, mlnx-fw-upgrade.sh will exit, causing syncd service to restart

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is actually a trick to exit directly from mlnx-fw-upgrade.sh. Please add your comment as code comment.

BTW, syncd service to restart == restart sxdkernel driver?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@qiluo-msft yes. restart syncd service will restart sxdkernel driver

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is actually a trick to exit directly from mlnx-fw-upgrade.sh. Please add your comment as code comment.

There is a comment in start.sh line 11 and mlnx-fw-upgrade.sh line 51 regarding restart logic. Anything else needed?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, thanks!


service rsyslog start
service syncd start

Expand Down