diff options
author | Larry Finger <Larry.Finger@lwfinger.net> | 2016-07-05 11:08:06 -0400 |
---|---|---|
committer | Kalle Valo <kvalo@codeaurora.org> | 2016-07-08 09:50:00 -0400 |
commit | edb45b67a09d1be4b7b8a33922a0f3934f3e23fa (patch) | |
tree | 11608bfa85f3318e757edafb815139accd44b098 /drivers/net/wireless/realtek/rtlwifi/efuse.c | |
parent | 5781fc29dbbd3ee5e11c1bf4fa6696ae89d19840 (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.c | 78 |
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 | ||
29 | static const u8 MAX_PGPKT_SIZE = 9; | 30 | static 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 | ||
1247 | int 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 | } | ||
1323 | EXPORT_SYMBOL_GPL(rtl_get_hwinfo); | ||