p54: improve eeprom parser
PATCH 2/2 p54: improve eeprom parser
Like other vendors, p54* devices have a checksum for the EEPROM descriptor data. This patch enhances the parser code to generate and verify the data fields, before initializing the radio-chip on the card.
Note:
If you have to bootstrap an alternative EEPROM image for your device and you don't know how to generate a valid crc ccitt checksum, you should take a look at:
http://git.kernel.org/?p=linux/kernel/git/chr/p54tools.git
The "checksum" utility loads a binary p54 EEPROM blob (use the -f switch, to skip the check) and applies the correct crc automatically.
---
drivers/net/wireless/p54/Kconfig +1 -0
@@ -2,6 +2,7 @@ config P54_COMMON tristate "Softmac Prism54 support" depends on MAC80211 && EXPERIMENTAL select FW_LOADER + select CRC_CCITT ---help--- This is common code for isl38xx/stlc45xx based modules. This module does nothing by itself - the USB/PCI/SPI front-ends
drivers/net/wireless/p54/eeprom.c +18 -3
@@ -23,6 +23,7 @@#include <linux/slab.h> #include <net/mac80211.h> +#include <linux/crc-ccitt.h> #include "p54.h" #include "eeprom.h"
@@ -540,6 +541,7 @@ int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len)int err;u8 *end = (u8 *)eeprom + len;u16 synth =0 ; +u16 crc16 = ~0 ; wrap = (struct eeprom_pda_wrap *) eeprom; entry = (void *)wrap->data +le16_to_cpu (wrap->len);
@@ -655,16 +657,29 @@ int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len) }break ;case PDR_END : -/* make it overrun */ - entry_len = len; + crc16 = ~crc_ccitt (crc16, (u8 *) entry,sizeof (*entry)); +if (crc16 !=le16_to_cpup ((__le16 *)entry->data)) { +wiphy_err (dev->wiphy,"eeprom failed checksum " +"test!\n" ); + err = -ENOMSG ; + goto err; + }else { + goto good_eeprom; + }break ;default :break ; } - entry = (void *)entry + (entry_len +1 )*2 ; + crc16 =crc_ccitt (crc16, (u8 *)entry, (entry_len +1 ) *2 ); + entry = (void *)entry + (entry_len +1 ) *2 ; } +wiphy_err (dev->wiphy,"unexpected end of eeprom data.\n" ); + err = -ENODATA ; + goto err; + +good_eeprom:if (!synth || !priv->iq_autocal || !priv->output_limit || !priv->curve_data) { wiphy_err(dev->wiphy,
Quoted 11 lines · Christian Lamparter
Like other vendors, p54* devices have a checksum for the EEPROM descriptor data. This patch enhances the parser code to generate and verify the data fields, before initializing the radio-chip on the card.
Note:
If you have to bootstrap an alternative EEPROM image for your device and you don't know how to generate a valid crc ccitt checksum, you should take a look at:
http://git.kernel.org/?p=linux/kernel/git/chr/p54tools.git
Quoted 5 lines
The "checksum" utility loads a binary p54 EEPROM blob (use the -f switch, to skip the check) and applies the correct crc automatically.
Signed-off-by Christian Lamparter <[email protected]>
ACK for p54usb.
Larry