aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/realtek/rtlwifi/efuse.c
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2016-07-05 11:08:06 -0400
committerKalle Valo <kvalo@codeaurora.org>2016-07-08 09:50:00 -0400
commitedb45b67a09d1be4b7b8a33922a0f3934f3e23fa (patch)
tree11608bfa85f3318e757edafb815139accd44b098 /drivers/net/wireless/realtek/rtlwifi/efuse.c
parent5781fc29dbbd3ee5e11c1bf4fa6696ae89d19840 (diff)
rtlwifi: Create common routine to get hardware info
All of the rtlwifi family of drivers have a similar routine that acquires the hardware info from efuse and initializes a number of variables in the driver's private area. A common routine is created for all drivers to use. Reported-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Cc: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Diffstat (limited to 'drivers/net/wireless/realtek/rtlwifi/efuse.c')
-rw-r--r--drivers/net/wireless/realtek/rtlwifi/efuse.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/drivers/net/wireless/realtek/rtlwifi/efuse.c b/drivers/net/wireless/realtek/rtlwifi/efuse.c
index 0b4082c9272a..7becfef6cd5c 100644
--- a/drivers/net/wireless/realtek/rtlwifi/efuse.c
+++ b/drivers/net/wireless/realtek/rtlwifi/efuse.c
@@ -24,6 +24,7 @@
24 *****************************************************************************/ 24 *****************************************************************************/
25#include "wifi.h" 25#include "wifi.h"
26#include "efuse.h" 26#include "efuse.h"
27#include "pci.h"
27#include <linux/export.h> 28#include <linux/export.h>
28 29
29static const u8 MAX_PGPKT_SIZE = 9; 30static const u8 MAX_PGPKT_SIZE = 9;
@@ -1243,3 +1244,80 @@ static u8 efuse_calculate_word_cnts(u8 word_en)
1243 return word_cnts; 1244 return word_cnts;
1244} 1245}
1245 1246
1247int rtl_get_hwinfo(struct ieee80211_hw *hw, struct rtl_priv *rtlpriv,
1248 int max_size, u8 *hwinfo, int *params)
1249{
1250 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1251 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1252 struct device *dev = &rtlpcipriv->dev.pdev->dev;
1253 u16 eeprom_id;
1254 u16 i, usvalue;
1255
1256 switch (rtlefuse->epromtype) {
1257 case EEPROM_BOOT_EFUSE:
1258 rtl_efuse_shadow_map_update(hw);
1259 break;
1260
1261 case EEPROM_93C46:
1262 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1263 "RTL8XXX did not boot from eeprom, check it !!\n");
1264 return 1;
1265
1266 default:
1267 dev_warn(dev, "no efuse data\n");
1268 return 1;
1269 }
1270
1271 memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0], max_size);
1272
1273 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP",
1274 hwinfo, max_size);
1275
1276 eeprom_id = *((u16 *)&hwinfo[0]);
1277 if (eeprom_id != params[0]) {
1278 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1279 "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
1280 rtlefuse->autoload_failflag = true;
1281 } else {
1282 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
1283 rtlefuse->autoload_failflag = false;
1284 }
1285
1286 if (rtlefuse->autoload_failflag)
1287 return 1;
1288
1289 rtlefuse->eeprom_vid = *(u16 *)&hwinfo[params[1]];
1290 rtlefuse->eeprom_did = *(u16 *)&hwinfo[params[2]];
1291 rtlefuse->eeprom_svid = *(u16 *)&hwinfo[params[3]];
1292 rtlefuse->eeprom_smid = *(u16 *)&hwinfo[params[4]];
1293 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1294 "EEPROMId = 0x%4x\n", eeprom_id);
1295 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1296 "EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
1297 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1298 "EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
1299 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1300 "EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
1301 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1302 "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
1303
1304 for (i = 0; i < 6; i += 2) {
1305 usvalue = *(u16 *)&hwinfo[params[5] + i];
1306 *((u16 *)(&rtlefuse->dev_addr[i])) = usvalue;
1307 }
1308 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "%pM\n", rtlefuse->dev_addr);
1309
1310 rtlefuse->eeprom_channelplan = *&hwinfo[params[6]];
1311 rtlefuse->eeprom_version = *(u16 *)&hwinfo[params[7]];
1312 rtlefuse->txpwr_fromeprom = true;
1313 rtlefuse->eeprom_oemid = *&hwinfo[params[8]];
1314
1315 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1316 "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid);
1317
1318 /* set channel plan to world wide 13 */
1319 rtlefuse->channel_plan = params[9];
1320
1321 return 0;
1322}
1323EXPORT_SYMBOL_GPL(rtl_get_hwinfo);