libertas: add some firmware file verification
Marcelo Tosatti
mtosatti at redhat.unroutablecom
Mon Dec 11 15:18:31 EST 2006
Commit: 90767ae12e4213204b2697d1a9cacad8aeb97151
Parent: a7e6965a2978b81a98dbb21634139930c74ba317
commit 90767ae12e4213204b2697d1a9cacad8aeb97151
Author: Marcelo Tosatti <mtosatti at redhat.com>
AuthorDate: Sun Dec 10 14:32:33 2006 -0200
Commit: Marcelo Tosatti <mtosatti at redhat.com>
CommitDate: Sun Dec 10 14:32:33 2006 -0200
libertas: add some firmware file verification
Use the firmware verification routine from the boot2 update code.
Signed-off-by: Marcelo Tosatti <mtosatti at redhat.com>
---
drivers/net/wireless/libertas/wlan_fw.c | 51 +++++++++++++++++++++++++++++++
1 files changed, 51 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/libertas/wlan_fw.c b/drivers/net/wireless/libertas/wlan_fw.c
index 85907ab..ba2a7f4 100644
--- a/drivers/net/wireless/libertas/wlan_fw.c
+++ b/drivers/net/wireless/libertas/wlan_fw.c
@@ -43,6 +43,7 @@ #include "wlan_decl.h"
#include "wlan_dev.h"
#include "wlan_fw.h"
#include "wlan_wext.h"
+#include "if_usb.h"
char *libertas_fw_name = NULL;
module_param_named(fw_name, libertas_fw_name, charp, 0644);
@@ -50,6 +51,51 @@ module_param_named(fw_name, libertas_fw_
unsigned int libertas_debug = 1;
module_param(libertas_debug, int, 0);
+/**
+ * @brief This function checks the validity of Boot2/FW image.
+ *
+ * @param data pointer to image
+ * len image length
+ * @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
+ */
+static int check_fwfile_format(u8 *data, u32 totlen)
+{
+ u8 bincmd, exit;
+ u32 blksize, offset, len;
+ int ret;
+
+ ret = 1;
+ exit = len = 0;
+
+ do {
+ bincmd = *data;
+ blksize = *(u32*)(data + offsetof(struct FWHeader, DataLength));
+ switch (bincmd) {
+ case FW_HAS_DATA_TO_RECV:
+ offset = sizeof(struct FWHeader) + blksize;
+ data += offset;
+ len += offset;
+ if (len >= totlen)
+ exit = 1;
+ break;
+ case FW_HAS_LAST_BLOCK:
+ exit = 1;
+ ret = 0;
+ break;
+ default:
+ exit = 1;
+ break;
+ }
+ } while (!exit);
+
+ if (ret)
+ printk(KERN_ERR "bin file format check FAIL...\n");
+ else
+ dprintk(1, "bin file format check PASS...\n");
+
+ return ret;
+}
+
/**
* @brief This function downloads firmware image, gets
* HW spec from firmware and set basic parameters to
@@ -75,6 +121,11 @@ static int wlan_setup_station_hw(wlan_pr
goto done;
}
+ if(check_fwfile_format(priv->firmware->data, priv->firmware->size)) {
+ release_firmware(priv->firmware);
+ goto done;
+ }
+
ret = libertas_sbi_prog_firmware(priv);
release_firmware(priv->firmware);
More information about the Commits-kernel
mailing list