rt2x00: Validate firmware in driver
[pandora-kernel.git] / drivers / net / wireless / rt2x00 / rt2x00firmware.c
index 2a7e8bc..d2deea2 100644 (file)
@@ -35,7 +35,6 @@ static int rt2x00lib_request_firmware(struct rt2x00_dev *rt2x00dev)
        const struct firmware *fw;
        char *fw_name;
        int retval;
-       u16 crc;
 
        /*
         * Read correct firmware from harddisk.
@@ -61,16 +60,26 @@ static int rt2x00lib_request_firmware(struct rt2x00_dev *rt2x00dev)
                return -ENOENT;
        }
 
-       crc = rt2x00dev->ops->lib->get_firmware_crc(fw->data, fw->size);
-       if (crc != (fw->data[fw->size - 2] << 8 | fw->data[fw->size - 1])) {
-               ERROR(rt2x00dev, "Firmware checksum error.\n");
-               retval = -ENOENT;
-               goto exit;
-       }
-
        INFO(rt2x00dev, "Firmware detected - version: %d.%d.\n",
             fw->data[fw->size - 4], fw->data[fw->size - 3]);
 
+       retval = rt2x00dev->ops->lib->check_firmware(rt2x00dev, fw->data, fw->size);
+       switch (retval) {
+       case FW_OK:
+               break;
+       case FW_BAD_CRC:
+               ERROR(rt2x00dev, "Firmware checksum error.\n");
+               goto exit;
+       case FW_BAD_LENGTH:
+               ERROR(rt2x00dev,
+                     "Invalid firmware file length (len=%zu)\n", fw->size);
+               goto exit;
+       case FW_BAD_VERSION:
+               ERROR(rt2x00dev,
+                     "Current firmware does not support detected chipset.\n");
+               goto exit;
+       };
+
        rt2x00dev->fw = fw;
 
        return 0;
@@ -78,7 +87,7 @@ static int rt2x00lib_request_firmware(struct rt2x00_dev *rt2x00dev)
 exit:
        release_firmware(fw);
 
-       return retval;
+       return -ENOENT;
 }
 
 int rt2x00lib_load_firmware(struct rt2x00_dev *rt2x00dev)