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