|
|
@@ -15,6 +15,7 @@
|
|
|
*/
|
|
|
|
|
|
#include "hw.h"
|
|
|
+#include <linux/ath9k_platform.h>
|
|
|
|
|
|
void ath9k_hw_analog_shift_regwrite(struct ath_hw *ah, u32 reg, u32 val)
|
|
|
{
|
|
|
@@ -108,26 +109,42 @@ void ath9k_hw_usb_gen_fill_eeprom(struct ath_hw *ah, u16 *eep_data,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static bool ath9k_hw_nvram_read_blob(struct ath_hw *ah, u32 off,
|
|
|
- u16 *data)
|
|
|
+static bool ath9k_hw_nvram_read_array(u16 *blob, size_t blob_size,
|
|
|
+ off_t offset, u16 *data)
|
|
|
{
|
|
|
- u16 *blob_data;
|
|
|
-
|
|
|
- if (off * sizeof(u16) > ah->eeprom_blob->size)
|
|
|
+ if (offset > blob_size)
|
|
|
return false;
|
|
|
|
|
|
- blob_data = (u16 *)ah->eeprom_blob->data;
|
|
|
- *data = blob_data[off];
|
|
|
+ *data = blob[offset];
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+static bool ath9k_hw_nvram_read_pdata(struct ath9k_platform_data *pdata,
|
|
|
+ off_t offset, u16 *data)
|
|
|
+{
|
|
|
+ return ath9k_hw_nvram_read_array(pdata->eeprom_data,
|
|
|
+ ARRAY_SIZE(pdata->eeprom_data),
|
|
|
+ offset, data);
|
|
|
+}
|
|
|
+
|
|
|
+static bool ath9k_hw_nvram_read_firmware(const struct firmware *eeprom_blob,
|
|
|
+ off_t offset, u16 *data)
|
|
|
+{
|
|
|
+ return ath9k_hw_nvram_read_array((u16 *) eeprom_blob->data,
|
|
|
+ eeprom_blob->size / sizeof(u16),
|
|
|
+ offset, data);
|
|
|
+}
|
|
|
+
|
|
|
bool ath9k_hw_nvram_read(struct ath_hw *ah, u32 off, u16 *data)
|
|
|
{
|
|
|
struct ath_common *common = ath9k_hw_common(ah);
|
|
|
+ struct ath9k_platform_data *pdata = ah->dev->platform_data;
|
|
|
bool ret;
|
|
|
|
|
|
if (ah->eeprom_blob)
|
|
|
- ret = ath9k_hw_nvram_read_blob(ah, off, data);
|
|
|
+ ret = ath9k_hw_nvram_read_firmware(ah->eeprom_blob, off, data);
|
|
|
+ else if (pdata && !pdata->use_eeprom && pdata->eeprom_data)
|
|
|
+ ret = ath9k_hw_nvram_read_pdata(pdata, off, data);
|
|
|
else
|
|
|
ret = common->bus_ops->eeprom_read(common, off, data);
|
|
|
|