main.c 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334
  1. /*
  2. * This file is part of wl1271
  3. *
  4. * Copyright (C) 2008-2010 Nokia Corporation
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * version 2 as published by the Free Software Foundation.
  9. *
  10. * This program is distributed in the hope that it will be useful, but
  11. * WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. * General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  18. * 02110-1301 USA
  19. *
  20. */
  21. #include <linux/module.h>
  22. #include <linux/platform_device.h>
  23. #include <linux/err.h>
  24. #include <linux/wl12xx.h>
  25. #include "../wlcore/wlcore.h"
  26. #include "../wlcore/debug.h"
  27. #include "../wlcore/io.h"
  28. #include "../wlcore/acx.h"
  29. #include "../wlcore/tx.h"
  30. #include "../wlcore/rx.h"
  31. #include "../wlcore/io.h"
  32. #include "../wlcore/boot.h"
  33. #include "reg.h"
  34. #include "cmd.h"
  35. #include "acx.h"
  36. static struct wlcore_conf wl12xx_conf = {
  37. .sg = {
  38. .params = {
  39. [CONF_SG_ACL_BT_MASTER_MIN_BR] = 10,
  40. [CONF_SG_ACL_BT_MASTER_MAX_BR] = 180,
  41. [CONF_SG_ACL_BT_SLAVE_MIN_BR] = 10,
  42. [CONF_SG_ACL_BT_SLAVE_MAX_BR] = 180,
  43. [CONF_SG_ACL_BT_MASTER_MIN_EDR] = 10,
  44. [CONF_SG_ACL_BT_MASTER_MAX_EDR] = 80,
  45. [CONF_SG_ACL_BT_SLAVE_MIN_EDR] = 10,
  46. [CONF_SG_ACL_BT_SLAVE_MAX_EDR] = 80,
  47. [CONF_SG_ACL_WLAN_PS_MASTER_BR] = 8,
  48. [CONF_SG_ACL_WLAN_PS_SLAVE_BR] = 8,
  49. [CONF_SG_ACL_WLAN_PS_MASTER_EDR] = 20,
  50. [CONF_SG_ACL_WLAN_PS_SLAVE_EDR] = 20,
  51. [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_BR] = 20,
  52. [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_BR] = 35,
  53. [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_BR] = 16,
  54. [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_BR] = 35,
  55. [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_EDR] = 32,
  56. [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_EDR] = 50,
  57. [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_EDR] = 28,
  58. [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_EDR] = 50,
  59. [CONF_SG_ACL_ACTIVE_SCAN_WLAN_BR] = 10,
  60. [CONF_SG_ACL_ACTIVE_SCAN_WLAN_EDR] = 20,
  61. [CONF_SG_ACL_PASSIVE_SCAN_BT_BR] = 75,
  62. [CONF_SG_ACL_PASSIVE_SCAN_WLAN_BR] = 15,
  63. [CONF_SG_ACL_PASSIVE_SCAN_BT_EDR] = 27,
  64. [CONF_SG_ACL_PASSIVE_SCAN_WLAN_EDR] = 17,
  65. /* active scan params */
  66. [CONF_SG_AUTO_SCAN_PROBE_REQ] = 170,
  67. [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3] = 50,
  68. [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP] = 100,
  69. /* passive scan params */
  70. [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_BR] = 800,
  71. [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_EDR] = 200,
  72. [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3] = 200,
  73. /* passive scan in dual antenna params */
  74. [CONF_SG_CONSECUTIVE_HV3_IN_PASSIVE_SCAN] = 0,
  75. [CONF_SG_BCN_HV3_COLLISION_THRESH_IN_PASSIVE_SCAN] = 0,
  76. [CONF_SG_TX_RX_PROTECTION_BWIDTH_IN_PASSIVE_SCAN] = 0,
  77. /* general params */
  78. [CONF_SG_STA_FORCE_PS_IN_BT_SCO] = 1,
  79. [CONF_SG_ANTENNA_CONFIGURATION] = 0,
  80. [CONF_SG_BEACON_MISS_PERCENT] = 60,
  81. [CONF_SG_DHCP_TIME] = 5000,
  82. [CONF_SG_RXT] = 1200,
  83. [CONF_SG_TXT] = 1000,
  84. [CONF_SG_ADAPTIVE_RXT_TXT] = 1,
  85. [CONF_SG_GENERAL_USAGE_BIT_MAP] = 3,
  86. [CONF_SG_HV3_MAX_SERVED] = 6,
  87. [CONF_SG_PS_POLL_TIMEOUT] = 10,
  88. [CONF_SG_UPSD_TIMEOUT] = 10,
  89. [CONF_SG_CONSECUTIVE_CTS_THRESHOLD] = 2,
  90. [CONF_SG_STA_RX_WINDOW_AFTER_DTIM] = 5,
  91. [CONF_SG_STA_CONNECTION_PROTECTION_TIME] = 30,
  92. /* AP params */
  93. [CONF_AP_BEACON_MISS_TX] = 3,
  94. [CONF_AP_RX_WINDOW_AFTER_BEACON] = 10,
  95. [CONF_AP_BEACON_WINDOW_INTERVAL] = 2,
  96. [CONF_AP_CONNECTION_PROTECTION_TIME] = 0,
  97. [CONF_AP_BT_ACL_VAL_BT_SERVE_TIME] = 25,
  98. [CONF_AP_BT_ACL_VAL_WL_SERVE_TIME] = 25,
  99. /* CTS Diluting params */
  100. [CONF_SG_CTS_DILUTED_BAD_RX_PACKETS_TH] = 0,
  101. [CONF_SG_CTS_CHOP_IN_DUAL_ANT_SCO_MASTER] = 0,
  102. },
  103. .state = CONF_SG_PROTECTIVE,
  104. },
  105. .rx = {
  106. .rx_msdu_life_time = 512000,
  107. .packet_detection_threshold = 0,
  108. .ps_poll_timeout = 15,
  109. .upsd_timeout = 15,
  110. .rts_threshold = IEEE80211_MAX_RTS_THRESHOLD,
  111. .rx_cca_threshold = 0,
  112. .irq_blk_threshold = 0xFFFF,
  113. .irq_pkt_threshold = 0,
  114. .irq_timeout = 600,
  115. .queue_type = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
  116. },
  117. .tx = {
  118. .tx_energy_detection = 0,
  119. .sta_rc_conf = {
  120. .enabled_rates = 0,
  121. .short_retry_limit = 10,
  122. .long_retry_limit = 10,
  123. .aflags = 0,
  124. },
  125. .ac_conf_count = 4,
  126. .ac_conf = {
  127. [CONF_TX_AC_BE] = {
  128. .ac = CONF_TX_AC_BE,
  129. .cw_min = 15,
  130. .cw_max = 63,
  131. .aifsn = 3,
  132. .tx_op_limit = 0,
  133. },
  134. [CONF_TX_AC_BK] = {
  135. .ac = CONF_TX_AC_BK,
  136. .cw_min = 15,
  137. .cw_max = 63,
  138. .aifsn = 7,
  139. .tx_op_limit = 0,
  140. },
  141. [CONF_TX_AC_VI] = {
  142. .ac = CONF_TX_AC_VI,
  143. .cw_min = 15,
  144. .cw_max = 63,
  145. .aifsn = CONF_TX_AIFS_PIFS,
  146. .tx_op_limit = 3008,
  147. },
  148. [CONF_TX_AC_VO] = {
  149. .ac = CONF_TX_AC_VO,
  150. .cw_min = 15,
  151. .cw_max = 63,
  152. .aifsn = CONF_TX_AIFS_PIFS,
  153. .tx_op_limit = 1504,
  154. },
  155. },
  156. .max_tx_retries = 100,
  157. .ap_aging_period = 300,
  158. .tid_conf_count = 4,
  159. .tid_conf = {
  160. [CONF_TX_AC_BE] = {
  161. .queue_id = CONF_TX_AC_BE,
  162. .channel_type = CONF_CHANNEL_TYPE_EDCF,
  163. .tsid = CONF_TX_AC_BE,
  164. .ps_scheme = CONF_PS_SCHEME_LEGACY,
  165. .ack_policy = CONF_ACK_POLICY_LEGACY,
  166. .apsd_conf = {0, 0},
  167. },
  168. [CONF_TX_AC_BK] = {
  169. .queue_id = CONF_TX_AC_BK,
  170. .channel_type = CONF_CHANNEL_TYPE_EDCF,
  171. .tsid = CONF_TX_AC_BK,
  172. .ps_scheme = CONF_PS_SCHEME_LEGACY,
  173. .ack_policy = CONF_ACK_POLICY_LEGACY,
  174. .apsd_conf = {0, 0},
  175. },
  176. [CONF_TX_AC_VI] = {
  177. .queue_id = CONF_TX_AC_VI,
  178. .channel_type = CONF_CHANNEL_TYPE_EDCF,
  179. .tsid = CONF_TX_AC_VI,
  180. .ps_scheme = CONF_PS_SCHEME_LEGACY,
  181. .ack_policy = CONF_ACK_POLICY_LEGACY,
  182. .apsd_conf = {0, 0},
  183. },
  184. [CONF_TX_AC_VO] = {
  185. .queue_id = CONF_TX_AC_VO,
  186. .channel_type = CONF_CHANNEL_TYPE_EDCF,
  187. .tsid = CONF_TX_AC_VO,
  188. .ps_scheme = CONF_PS_SCHEME_LEGACY,
  189. .ack_policy = CONF_ACK_POLICY_LEGACY,
  190. .apsd_conf = {0, 0},
  191. },
  192. },
  193. .frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD,
  194. .tx_compl_timeout = 700,
  195. .tx_compl_threshold = 4,
  196. .basic_rate = CONF_HW_BIT_RATE_1MBPS,
  197. .basic_rate_5 = CONF_HW_BIT_RATE_6MBPS,
  198. .tmpl_short_retry_limit = 10,
  199. .tmpl_long_retry_limit = 10,
  200. .tx_watchdog_timeout = 5000,
  201. },
  202. .conn = {
  203. .wake_up_event = CONF_WAKE_UP_EVENT_DTIM,
  204. .listen_interval = 1,
  205. .suspend_wake_up_event = CONF_WAKE_UP_EVENT_N_DTIM,
  206. .suspend_listen_interval = 3,
  207. .bcn_filt_mode = CONF_BCN_FILT_MODE_ENABLED,
  208. .bcn_filt_ie_count = 2,
  209. .bcn_filt_ie = {
  210. [0] = {
  211. .ie = WLAN_EID_CHANNEL_SWITCH,
  212. .rule = CONF_BCN_RULE_PASS_ON_APPEARANCE,
  213. },
  214. [1] = {
  215. .ie = WLAN_EID_HT_OPERATION,
  216. .rule = CONF_BCN_RULE_PASS_ON_CHANGE,
  217. },
  218. },
  219. .synch_fail_thold = 10,
  220. .bss_lose_timeout = 100,
  221. .beacon_rx_timeout = 10000,
  222. .broadcast_timeout = 20000,
  223. .rx_broadcast_in_ps = 1,
  224. .ps_poll_threshold = 10,
  225. .bet_enable = CONF_BET_MODE_ENABLE,
  226. .bet_max_consecutive = 50,
  227. .psm_entry_retries = 8,
  228. .psm_exit_retries = 16,
  229. .psm_entry_nullfunc_retries = 3,
  230. .dynamic_ps_timeout = 40,
  231. .forced_ps = false,
  232. .keep_alive_interval = 55000,
  233. .max_listen_interval = 20,
  234. },
  235. .itrim = {
  236. .enable = false,
  237. .timeout = 50000,
  238. },
  239. .pm_config = {
  240. .host_clk_settling_time = 5000,
  241. .host_fast_wakeup_support = false
  242. },
  243. .roam_trigger = {
  244. .trigger_pacing = 1,
  245. .avg_weight_rssi_beacon = 20,
  246. .avg_weight_rssi_data = 10,
  247. .avg_weight_snr_beacon = 20,
  248. .avg_weight_snr_data = 10,
  249. },
  250. .scan = {
  251. .min_dwell_time_active = 7500,
  252. .max_dwell_time_active = 30000,
  253. .min_dwell_time_passive = 100000,
  254. .max_dwell_time_passive = 100000,
  255. .num_probe_reqs = 2,
  256. .split_scan_timeout = 50000,
  257. },
  258. .sched_scan = {
  259. /*
  260. * Values are in TU/1000 but since sched scan FW command
  261. * params are in TUs rounding up may occur.
  262. */
  263. .base_dwell_time = 7500,
  264. .max_dwell_time_delta = 22500,
  265. /* based on 250bits per probe @1Mbps */
  266. .dwell_time_delta_per_probe = 2000,
  267. /* based on 250bits per probe @6Mbps (plus a bit more) */
  268. .dwell_time_delta_per_probe_5 = 350,
  269. .dwell_time_passive = 100000,
  270. .dwell_time_dfs = 150000,
  271. .num_probe_reqs = 2,
  272. .rssi_threshold = -90,
  273. .snr_threshold = 0,
  274. },
  275. .rf = {
  276. .tx_per_channel_power_compensation_2 = {
  277. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  278. },
  279. .tx_per_channel_power_compensation_5 = {
  280. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  281. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  282. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  283. },
  284. },
  285. .ht = {
  286. .rx_ba_win_size = 8,
  287. .tx_ba_win_size = 64,
  288. .inactivity_timeout = 10000,
  289. .tx_ba_tid_bitmap = CONF_TX_BA_ENABLED_TID_BITMAP,
  290. },
  291. .mem_wl127x = {
  292. .num_stations = 1,
  293. .ssid_profiles = 1,
  294. .rx_block_num = 70,
  295. .tx_min_block_num = 40,
  296. .dynamic_memory = 1,
  297. .min_req_tx_blocks = 100,
  298. .min_req_rx_blocks = 22,
  299. .tx_min = 27,
  300. },
  301. .mem_wl128x = {
  302. .num_stations = 1,
  303. .ssid_profiles = 1,
  304. .rx_block_num = 40,
  305. .tx_min_block_num = 40,
  306. .dynamic_memory = 1,
  307. .min_req_tx_blocks = 45,
  308. .min_req_rx_blocks = 22,
  309. .tx_min = 27,
  310. },
  311. .fm_coex = {
  312. .enable = true,
  313. .swallow_period = 5,
  314. .n_divider_fref_set_1 = 0xff, /* default */
  315. .n_divider_fref_set_2 = 12,
  316. .m_divider_fref_set_1 = 148,
  317. .m_divider_fref_set_2 = 0xffff, /* default */
  318. .coex_pll_stabilization_time = 0xffffffff, /* default */
  319. .ldo_stabilization_time = 0xffff, /* default */
  320. .fm_disturbed_band_margin = 0xff, /* default */
  321. .swallow_clk_diff = 0xff, /* default */
  322. },
  323. .rx_streaming = {
  324. .duration = 150,
  325. .queues = 0x1,
  326. .interval = 20,
  327. .always = 0,
  328. },
  329. .fwlog = {
  330. .mode = WL12XX_FWLOG_ON_DEMAND,
  331. .mem_blocks = 2,
  332. .severity = 0,
  333. .timestamp = WL12XX_FWLOG_TIMESTAMP_DISABLED,
  334. .output = WL12XX_FWLOG_OUTPUT_HOST,
  335. .threshold = 0,
  336. },
  337. .rate = {
  338. .rate_retry_score = 32000,
  339. .per_add = 8192,
  340. .per_th1 = 2048,
  341. .per_th2 = 4096,
  342. .max_per = 8100,
  343. .inverse_curiosity_factor = 5,
  344. .tx_fail_low_th = 4,
  345. .tx_fail_high_th = 10,
  346. .per_alpha_shift = 4,
  347. .per_add_shift = 13,
  348. .per_beta1_shift = 10,
  349. .per_beta2_shift = 8,
  350. .rate_check_up = 2,
  351. .rate_check_down = 12,
  352. .rate_retry_policy = {
  353. 0x00, 0x00, 0x00, 0x00, 0x00,
  354. 0x00, 0x00, 0x00, 0x00, 0x00,
  355. 0x00, 0x00, 0x00,
  356. },
  357. },
  358. .hangover = {
  359. .recover_time = 0,
  360. .hangover_period = 20,
  361. .dynamic_mode = 1,
  362. .early_termination_mode = 1,
  363. .max_period = 20,
  364. .min_period = 1,
  365. .increase_delta = 1,
  366. .decrease_delta = 2,
  367. .quiet_time = 4,
  368. .increase_time = 1,
  369. .window_size = 16,
  370. },
  371. };
  372. #define WL12XX_TX_HW_BLOCK_SPARE_DEFAULT 1
  373. #define WL12XX_TX_HW_BLOCK_GEM_SPARE 2
  374. #define WL12XX_TX_HW_BLOCK_SIZE 252
  375. static const u8 wl12xx_rate_to_idx_2ghz[] = {
  376. /* MCS rates are used only with 11n */
  377. 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI */
  378. 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7 */
  379. 6, /* WL12XX_CONF_HW_RXTX_RATE_MCS6 */
  380. 5, /* WL12XX_CONF_HW_RXTX_RATE_MCS5 */
  381. 4, /* WL12XX_CONF_HW_RXTX_RATE_MCS4 */
  382. 3, /* WL12XX_CONF_HW_RXTX_RATE_MCS3 */
  383. 2, /* WL12XX_CONF_HW_RXTX_RATE_MCS2 */
  384. 1, /* WL12XX_CONF_HW_RXTX_RATE_MCS1 */
  385. 0, /* WL12XX_CONF_HW_RXTX_RATE_MCS0 */
  386. 11, /* WL12XX_CONF_HW_RXTX_RATE_54 */
  387. 10, /* WL12XX_CONF_HW_RXTX_RATE_48 */
  388. 9, /* WL12XX_CONF_HW_RXTX_RATE_36 */
  389. 8, /* WL12XX_CONF_HW_RXTX_RATE_24 */
  390. /* TI-specific rate */
  391. CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_22 */
  392. 7, /* WL12XX_CONF_HW_RXTX_RATE_18 */
  393. 6, /* WL12XX_CONF_HW_RXTX_RATE_12 */
  394. 3, /* WL12XX_CONF_HW_RXTX_RATE_11 */
  395. 5, /* WL12XX_CONF_HW_RXTX_RATE_9 */
  396. 4, /* WL12XX_CONF_HW_RXTX_RATE_6 */
  397. 2, /* WL12XX_CONF_HW_RXTX_RATE_5_5 */
  398. 1, /* WL12XX_CONF_HW_RXTX_RATE_2 */
  399. 0 /* WL12XX_CONF_HW_RXTX_RATE_1 */
  400. };
  401. static const u8 wl12xx_rate_to_idx_5ghz[] = {
  402. /* MCS rates are used only with 11n */
  403. 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI */
  404. 7, /* WL12XX_CONF_HW_RXTX_RATE_MCS7 */
  405. 6, /* WL12XX_CONF_HW_RXTX_RATE_MCS6 */
  406. 5, /* WL12XX_CONF_HW_RXTX_RATE_MCS5 */
  407. 4, /* WL12XX_CONF_HW_RXTX_RATE_MCS4 */
  408. 3, /* WL12XX_CONF_HW_RXTX_RATE_MCS3 */
  409. 2, /* WL12XX_CONF_HW_RXTX_RATE_MCS2 */
  410. 1, /* WL12XX_CONF_HW_RXTX_RATE_MCS1 */
  411. 0, /* WL12XX_CONF_HW_RXTX_RATE_MCS0 */
  412. 7, /* WL12XX_CONF_HW_RXTX_RATE_54 */
  413. 6, /* WL12XX_CONF_HW_RXTX_RATE_48 */
  414. 5, /* WL12XX_CONF_HW_RXTX_RATE_36 */
  415. 4, /* WL12XX_CONF_HW_RXTX_RATE_24 */
  416. /* TI-specific rate */
  417. CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_22 */
  418. 3, /* WL12XX_CONF_HW_RXTX_RATE_18 */
  419. 2, /* WL12XX_CONF_HW_RXTX_RATE_12 */
  420. CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_11 */
  421. 1, /* WL12XX_CONF_HW_RXTX_RATE_9 */
  422. 0, /* WL12XX_CONF_HW_RXTX_RATE_6 */
  423. CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_5_5 */
  424. CONF_HW_RXTX_RATE_UNSUPPORTED, /* WL12XX_CONF_HW_RXTX_RATE_2 */
  425. CONF_HW_RXTX_RATE_UNSUPPORTED /* WL12XX_CONF_HW_RXTX_RATE_1 */
  426. };
  427. static const u8 *wl12xx_band_rate_to_idx[] = {
  428. [IEEE80211_BAND_2GHZ] = wl12xx_rate_to_idx_2ghz,
  429. [IEEE80211_BAND_5GHZ] = wl12xx_rate_to_idx_5ghz
  430. };
  431. enum wl12xx_hw_rates {
  432. WL12XX_CONF_HW_RXTX_RATE_MCS7_SGI = 0,
  433. WL12XX_CONF_HW_RXTX_RATE_MCS7,
  434. WL12XX_CONF_HW_RXTX_RATE_MCS6,
  435. WL12XX_CONF_HW_RXTX_RATE_MCS5,
  436. WL12XX_CONF_HW_RXTX_RATE_MCS4,
  437. WL12XX_CONF_HW_RXTX_RATE_MCS3,
  438. WL12XX_CONF_HW_RXTX_RATE_MCS2,
  439. WL12XX_CONF_HW_RXTX_RATE_MCS1,
  440. WL12XX_CONF_HW_RXTX_RATE_MCS0,
  441. WL12XX_CONF_HW_RXTX_RATE_54,
  442. WL12XX_CONF_HW_RXTX_RATE_48,
  443. WL12XX_CONF_HW_RXTX_RATE_36,
  444. WL12XX_CONF_HW_RXTX_RATE_24,
  445. WL12XX_CONF_HW_RXTX_RATE_22,
  446. WL12XX_CONF_HW_RXTX_RATE_18,
  447. WL12XX_CONF_HW_RXTX_RATE_12,
  448. WL12XX_CONF_HW_RXTX_RATE_11,
  449. WL12XX_CONF_HW_RXTX_RATE_9,
  450. WL12XX_CONF_HW_RXTX_RATE_6,
  451. WL12XX_CONF_HW_RXTX_RATE_5_5,
  452. WL12XX_CONF_HW_RXTX_RATE_2,
  453. WL12XX_CONF_HW_RXTX_RATE_1,
  454. WL12XX_CONF_HW_RXTX_RATE_MAX,
  455. };
  456. static struct wlcore_partition_set wl12xx_ptable[PART_TABLE_LEN] = {
  457. [PART_DOWN] = {
  458. .mem = {
  459. .start = 0x00000000,
  460. .size = 0x000177c0
  461. },
  462. .reg = {
  463. .start = REGISTERS_BASE,
  464. .size = 0x00008800
  465. },
  466. .mem2 = {
  467. .start = 0x00000000,
  468. .size = 0x00000000
  469. },
  470. .mem3 = {
  471. .start = 0x00000000,
  472. .size = 0x00000000
  473. },
  474. },
  475. [PART_BOOT] = { /* in wl12xx we can use a mix of work and down
  476. * partition here */
  477. .mem = {
  478. .start = 0x00040000,
  479. .size = 0x00014fc0
  480. },
  481. .reg = {
  482. .start = REGISTERS_BASE,
  483. .size = 0x00008800
  484. },
  485. .mem2 = {
  486. .start = 0x00000000,
  487. .size = 0x00000000
  488. },
  489. .mem3 = {
  490. .start = 0x00000000,
  491. .size = 0x00000000
  492. },
  493. },
  494. [PART_WORK] = {
  495. .mem = {
  496. .start = 0x00040000,
  497. .size = 0x00014fc0
  498. },
  499. .reg = {
  500. .start = REGISTERS_BASE,
  501. .size = 0x0000a000
  502. },
  503. .mem2 = {
  504. .start = 0x003004f8,
  505. .size = 0x00000004
  506. },
  507. .mem3 = {
  508. .start = 0x00040404,
  509. .size = 0x00000000
  510. },
  511. },
  512. [PART_DRPW] = {
  513. .mem = {
  514. .start = 0x00040000,
  515. .size = 0x00014fc0
  516. },
  517. .reg = {
  518. .start = DRPW_BASE,
  519. .size = 0x00006000
  520. },
  521. .mem2 = {
  522. .start = 0x00000000,
  523. .size = 0x00000000
  524. },
  525. .mem3 = {
  526. .start = 0x00000000,
  527. .size = 0x00000000
  528. }
  529. }
  530. };
  531. static const int wl12xx_rtable[REG_TABLE_LEN] = {
  532. [REG_ECPU_CONTROL] = WL12XX_REG_ECPU_CONTROL,
  533. [REG_INTERRUPT_NO_CLEAR] = WL12XX_REG_INTERRUPT_NO_CLEAR,
  534. [REG_INTERRUPT_ACK] = WL12XX_REG_INTERRUPT_ACK,
  535. [REG_COMMAND_MAILBOX_PTR] = WL12XX_REG_COMMAND_MAILBOX_PTR,
  536. [REG_EVENT_MAILBOX_PTR] = WL12XX_REG_EVENT_MAILBOX_PTR,
  537. [REG_INTERRUPT_TRIG] = WL12XX_REG_INTERRUPT_TRIG,
  538. [REG_INTERRUPT_MASK] = WL12XX_REG_INTERRUPT_MASK,
  539. [REG_PC_ON_RECOVERY] = WL12XX_SCR_PAD4,
  540. [REG_CHIP_ID_B] = WL12XX_CHIP_ID_B,
  541. [REG_CMD_MBOX_ADDRESS] = WL12XX_CMD_MBOX_ADDRESS,
  542. /* data access memory addresses, used with partition translation */
  543. [REG_SLV_MEM_DATA] = WL1271_SLV_MEM_DATA,
  544. [REG_SLV_REG_DATA] = WL1271_SLV_REG_DATA,
  545. /* raw data access memory addresses */
  546. [REG_RAW_FW_STATUS_ADDR] = FW_STATUS_ADDR,
  547. };
  548. /* TODO: maybe move to a new header file? */
  549. #define WL127X_FW_NAME_MULTI "ti-connectivity/wl127x-fw-4-mr.bin"
  550. #define WL127X_FW_NAME_SINGLE "ti-connectivity/wl127x-fw-4-sr.bin"
  551. #define WL127X_PLT_FW_NAME "ti-connectivity/wl127x-fw-4-plt.bin"
  552. #define WL128X_FW_NAME_MULTI "ti-connectivity/wl128x-fw-4-mr.bin"
  553. #define WL128X_FW_NAME_SINGLE "ti-connectivity/wl128x-fw-4-sr.bin"
  554. #define WL128X_PLT_FW_NAME "ti-connectivity/wl128x-fw-4-plt.bin"
  555. static void wl127x_prepare_read(struct wl1271 *wl, u32 rx_desc, u32 len)
  556. {
  557. if (wl->chip.id != CHIP_ID_1283_PG20) {
  558. struct wl1271_acx_mem_map *wl_mem_map = wl->target_mem_map;
  559. struct wl1271_rx_mem_pool_addr rx_mem_addr;
  560. /*
  561. * Choose the block we want to read
  562. * For aggregated packets, only the first memory block
  563. * should be retrieved. The FW takes care of the rest.
  564. */
  565. u32 mem_block = rx_desc & RX_MEM_BLOCK_MASK;
  566. rx_mem_addr.addr = (mem_block << 8) +
  567. le32_to_cpu(wl_mem_map->packet_memory_pool_start);
  568. rx_mem_addr.addr_extra = rx_mem_addr.addr + 4;
  569. wl1271_write(wl, WL1271_SLV_REG_DATA,
  570. &rx_mem_addr, sizeof(rx_mem_addr), false);
  571. }
  572. }
  573. static int wl12xx_identify_chip(struct wl1271 *wl)
  574. {
  575. int ret = 0;
  576. switch (wl->chip.id) {
  577. case CHIP_ID_1271_PG10:
  578. wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
  579. wl->chip.id);
  580. /* clear the alignment quirk, since we don't support it */
  581. wl->quirks &= ~WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN;
  582. wl->quirks |= WLCORE_QUIRK_LEGACY_NVS;
  583. wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
  584. wl->mr_fw_name = WL127X_FW_NAME_MULTI;
  585. /* read data preparation is only needed by wl127x */
  586. wl->ops->prepare_read = wl127x_prepare_read;
  587. break;
  588. case CHIP_ID_1271_PG20:
  589. wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
  590. wl->chip.id);
  591. /* clear the alignment quirk, since we don't support it */
  592. wl->quirks &= ~WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN;
  593. wl->quirks |= WLCORE_QUIRK_LEGACY_NVS;
  594. wl->plt_fw_name = WL127X_PLT_FW_NAME;
  595. wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
  596. wl->mr_fw_name = WL127X_FW_NAME_MULTI;
  597. /* read data preparation is only needed by wl127x */
  598. wl->ops->prepare_read = wl127x_prepare_read;
  599. break;
  600. case CHIP_ID_1283_PG20:
  601. wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1283 PG20)",
  602. wl->chip.id);
  603. wl->plt_fw_name = WL128X_PLT_FW_NAME;
  604. wl->sr_fw_name = WL128X_FW_NAME_SINGLE;
  605. wl->mr_fw_name = WL128X_FW_NAME_MULTI;
  606. break;
  607. case CHIP_ID_1283_PG10:
  608. default:
  609. wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
  610. ret = -ENODEV;
  611. goto out;
  612. }
  613. out:
  614. return ret;
  615. }
  616. static void wl12xx_top_reg_write(struct wl1271 *wl, int addr, u16 val)
  617. {
  618. /* write address >> 1 + 0x30000 to OCP_POR_CTR */
  619. addr = (addr >> 1) + 0x30000;
  620. wl1271_write32(wl, WL12XX_OCP_POR_CTR, addr);
  621. /* write value to OCP_POR_WDATA */
  622. wl1271_write32(wl, WL12XX_OCP_DATA_WRITE, val);
  623. /* write 1 to OCP_CMD */
  624. wl1271_write32(wl, WL12XX_OCP_CMD, OCP_CMD_WRITE);
  625. }
  626. static u16 wl12xx_top_reg_read(struct wl1271 *wl, int addr)
  627. {
  628. u32 val;
  629. int timeout = OCP_CMD_LOOP;
  630. /* write address >> 1 + 0x30000 to OCP_POR_CTR */
  631. addr = (addr >> 1) + 0x30000;
  632. wl1271_write32(wl, WL12XX_OCP_POR_CTR, addr);
  633. /* write 2 to OCP_CMD */
  634. wl1271_write32(wl, WL12XX_OCP_CMD, OCP_CMD_READ);
  635. /* poll for data ready */
  636. do {
  637. val = wl1271_read32(wl, WL12XX_OCP_DATA_READ);
  638. } while (!(val & OCP_READY_MASK) && --timeout);
  639. if (!timeout) {
  640. wl1271_warning("Top register access timed out.");
  641. return 0xffff;
  642. }
  643. /* check data status and return if OK */
  644. if ((val & OCP_STATUS_MASK) == OCP_STATUS_OK)
  645. return val & 0xffff;
  646. else {
  647. wl1271_warning("Top register access returned error.");
  648. return 0xffff;
  649. }
  650. }
  651. static int wl128x_switch_tcxo_to_fref(struct wl1271 *wl)
  652. {
  653. u16 spare_reg;
  654. /* Mask bits [2] & [8:4] in the sys_clk_cfg register */
  655. spare_reg = wl12xx_top_reg_read(wl, WL_SPARE_REG);
  656. if (spare_reg == 0xFFFF)
  657. return -EFAULT;
  658. spare_reg |= (BIT(3) | BIT(5) | BIT(6));
  659. wl12xx_top_reg_write(wl, WL_SPARE_REG, spare_reg);
  660. /* Enable FREF_CLK_REQ & mux MCS and coex PLLs to FREF */
  661. wl12xx_top_reg_write(wl, SYS_CLK_CFG_REG,
  662. WL_CLK_REQ_TYPE_PG2 | MCS_PLL_CLK_SEL_FREF);
  663. /* Delay execution for 15msec, to let the HW settle */
  664. mdelay(15);
  665. return 0;
  666. }
  667. static bool wl128x_is_tcxo_valid(struct wl1271 *wl)
  668. {
  669. u16 tcxo_detection;
  670. tcxo_detection = wl12xx_top_reg_read(wl, TCXO_CLK_DETECT_REG);
  671. if (tcxo_detection & TCXO_DET_FAILED)
  672. return false;
  673. return true;
  674. }
  675. static bool wl128x_is_fref_valid(struct wl1271 *wl)
  676. {
  677. u16 fref_detection;
  678. fref_detection = wl12xx_top_reg_read(wl, FREF_CLK_DETECT_REG);
  679. if (fref_detection & FREF_CLK_DETECT_FAIL)
  680. return false;
  681. return true;
  682. }
  683. static int wl128x_manually_configure_mcs_pll(struct wl1271 *wl)
  684. {
  685. wl12xx_top_reg_write(wl, MCS_PLL_M_REG, MCS_PLL_M_REG_VAL);
  686. wl12xx_top_reg_write(wl, MCS_PLL_N_REG, MCS_PLL_N_REG_VAL);
  687. wl12xx_top_reg_write(wl, MCS_PLL_CONFIG_REG, MCS_PLL_CONFIG_REG_VAL);
  688. return 0;
  689. }
  690. static int wl128x_configure_mcs_pll(struct wl1271 *wl, int clk)
  691. {
  692. u16 spare_reg;
  693. u16 pll_config;
  694. u8 input_freq;
  695. /* Mask bits [3:1] in the sys_clk_cfg register */
  696. spare_reg = wl12xx_top_reg_read(wl, WL_SPARE_REG);
  697. if (spare_reg == 0xFFFF)
  698. return -EFAULT;
  699. spare_reg |= BIT(2);
  700. wl12xx_top_reg_write(wl, WL_SPARE_REG, spare_reg);
  701. /* Handle special cases of the TCXO clock */
  702. if (wl->tcxo_clock == WL12XX_TCXOCLOCK_16_8 ||
  703. wl->tcxo_clock == WL12XX_TCXOCLOCK_33_6)
  704. return wl128x_manually_configure_mcs_pll(wl);
  705. /* Set the input frequency according to the selected clock source */
  706. input_freq = (clk & 1) + 1;
  707. pll_config = wl12xx_top_reg_read(wl, MCS_PLL_CONFIG_REG);
  708. if (pll_config == 0xFFFF)
  709. return -EFAULT;
  710. pll_config |= (input_freq << MCS_SEL_IN_FREQ_SHIFT);
  711. pll_config |= MCS_PLL_ENABLE_HP;
  712. wl12xx_top_reg_write(wl, MCS_PLL_CONFIG_REG, pll_config);
  713. return 0;
  714. }
  715. /*
  716. * WL128x has two clocks input - TCXO and FREF.
  717. * TCXO is the main clock of the device, while FREF is used to sync
  718. * between the GPS and the cellular modem.
  719. * In cases where TCXO is 32.736MHz or 16.368MHz, the FREF will be used
  720. * as the WLAN/BT main clock.
  721. */
  722. static int wl128x_boot_clk(struct wl1271 *wl, int *selected_clock)
  723. {
  724. u16 sys_clk_cfg;
  725. /* For XTAL-only modes, FREF will be used after switching from TCXO */
  726. if (wl->ref_clock == WL12XX_REFCLOCK_26_XTAL ||
  727. wl->ref_clock == WL12XX_REFCLOCK_38_XTAL) {
  728. if (!wl128x_switch_tcxo_to_fref(wl))
  729. return -EINVAL;
  730. goto fref_clk;
  731. }
  732. /* Query the HW, to determine which clock source we should use */
  733. sys_clk_cfg = wl12xx_top_reg_read(wl, SYS_CLK_CFG_REG);
  734. if (sys_clk_cfg == 0xFFFF)
  735. return -EINVAL;
  736. if (sys_clk_cfg & PRCM_CM_EN_MUX_WLAN_FREF)
  737. goto fref_clk;
  738. /* If TCXO is either 32.736MHz or 16.368MHz, switch to FREF */
  739. if (wl->tcxo_clock == WL12XX_TCXOCLOCK_16_368 ||
  740. wl->tcxo_clock == WL12XX_TCXOCLOCK_32_736) {
  741. if (!wl128x_switch_tcxo_to_fref(wl))
  742. return -EINVAL;
  743. goto fref_clk;
  744. }
  745. /* TCXO clock is selected */
  746. if (!wl128x_is_tcxo_valid(wl))
  747. return -EINVAL;
  748. *selected_clock = wl->tcxo_clock;
  749. goto config_mcs_pll;
  750. fref_clk:
  751. /* FREF clock is selected */
  752. if (!wl128x_is_fref_valid(wl))
  753. return -EINVAL;
  754. *selected_clock = wl->ref_clock;
  755. config_mcs_pll:
  756. return wl128x_configure_mcs_pll(wl, *selected_clock);
  757. }
  758. static int wl127x_boot_clk(struct wl1271 *wl)
  759. {
  760. u32 pause;
  761. u32 clk;
  762. if (WL127X_PG_GET_MAJOR(wl->hw_pg_ver) < 3)
  763. wl->quirks |= WLCORE_QUIRK_END_OF_TRANSACTION;
  764. if (wl->ref_clock == CONF_REF_CLK_19_2_E ||
  765. wl->ref_clock == CONF_REF_CLK_38_4_E ||
  766. wl->ref_clock == CONF_REF_CLK_38_4_M_XTAL)
  767. /* ref clk: 19.2/38.4/38.4-XTAL */
  768. clk = 0x3;
  769. else if (wl->ref_clock == CONF_REF_CLK_26_E ||
  770. wl->ref_clock == CONF_REF_CLK_52_E)
  771. /* ref clk: 26/52 */
  772. clk = 0x5;
  773. else
  774. return -EINVAL;
  775. if (wl->ref_clock != CONF_REF_CLK_19_2_E) {
  776. u16 val;
  777. /* Set clock type (open drain) */
  778. val = wl12xx_top_reg_read(wl, OCP_REG_CLK_TYPE);
  779. val &= FREF_CLK_TYPE_BITS;
  780. wl12xx_top_reg_write(wl, OCP_REG_CLK_TYPE, val);
  781. /* Set clock pull mode (no pull) */
  782. val = wl12xx_top_reg_read(wl, OCP_REG_CLK_PULL);
  783. val |= NO_PULL;
  784. wl12xx_top_reg_write(wl, OCP_REG_CLK_PULL, val);
  785. } else {
  786. u16 val;
  787. /* Set clock polarity */
  788. val = wl12xx_top_reg_read(wl, OCP_REG_CLK_POLARITY);
  789. val &= FREF_CLK_POLARITY_BITS;
  790. val |= CLK_REQ_OUTN_SEL;
  791. wl12xx_top_reg_write(wl, OCP_REG_CLK_POLARITY, val);
  792. }
  793. wl1271_write32(wl, WL12XX_PLL_PARAMETERS, clk);
  794. pause = wl1271_read32(wl, WL12XX_PLL_PARAMETERS);
  795. wl1271_debug(DEBUG_BOOT, "pause1 0x%x", pause);
  796. pause &= ~(WU_COUNTER_PAUSE_VAL);
  797. pause |= WU_COUNTER_PAUSE_VAL;
  798. wl1271_write32(wl, WL12XX_WU_COUNTER_PAUSE, pause);
  799. return 0;
  800. }
  801. static int wl1271_boot_soft_reset(struct wl1271 *wl)
  802. {
  803. unsigned long timeout;
  804. u32 boot_data;
  805. /* perform soft reset */
  806. wl1271_write32(wl, WL12XX_SLV_SOFT_RESET, ACX_SLV_SOFT_RESET_BIT);
  807. /* SOFT_RESET is self clearing */
  808. timeout = jiffies + usecs_to_jiffies(SOFT_RESET_MAX_TIME);
  809. while (1) {
  810. boot_data = wl1271_read32(wl, WL12XX_SLV_SOFT_RESET);
  811. wl1271_debug(DEBUG_BOOT, "soft reset bootdata 0x%x", boot_data);
  812. if ((boot_data & ACX_SLV_SOFT_RESET_BIT) == 0)
  813. break;
  814. if (time_after(jiffies, timeout)) {
  815. /* 1.2 check pWhalBus->uSelfClearTime if the
  816. * timeout was reached */
  817. wl1271_error("soft reset timeout");
  818. return -1;
  819. }
  820. udelay(SOFT_RESET_STALL_TIME);
  821. }
  822. /* disable Rx/Tx */
  823. wl1271_write32(wl, WL12XX_ENABLE, 0x0);
  824. /* disable auto calibration on start*/
  825. wl1271_write32(wl, WL12XX_SPARE_A2, 0xffff);
  826. return 0;
  827. }
  828. static int wl12xx_pre_boot(struct wl1271 *wl)
  829. {
  830. int ret = 0;
  831. u32 clk;
  832. int selected_clock = -1;
  833. if (wl->chip.id == CHIP_ID_1283_PG20) {
  834. ret = wl128x_boot_clk(wl, &selected_clock);
  835. if (ret < 0)
  836. goto out;
  837. } else {
  838. ret = wl127x_boot_clk(wl);
  839. if (ret < 0)
  840. goto out;
  841. }
  842. /* Continue the ELP wake up sequence */
  843. wl1271_write32(wl, WL12XX_WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
  844. udelay(500);
  845. wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
  846. /* Read-modify-write DRPW_SCRATCH_START register (see next state)
  847. to be used by DRPw FW. The RTRIM value will be added by the FW
  848. before taking DRPw out of reset */
  849. clk = wl1271_read32(wl, WL12XX_DRPW_SCRATCH_START);
  850. wl1271_debug(DEBUG_BOOT, "clk2 0x%x", clk);
  851. if (wl->chip.id == CHIP_ID_1283_PG20)
  852. clk |= ((selected_clock & 0x3) << 1) << 4;
  853. else
  854. clk |= (wl->ref_clock << 1) << 4;
  855. wl1271_write32(wl, WL12XX_DRPW_SCRATCH_START, clk);
  856. wlcore_set_partition(wl, &wl->ptable[PART_WORK]);
  857. /* Disable interrupts */
  858. wlcore_write_reg(wl, REG_INTERRUPT_MASK, WL1271_ACX_INTR_ALL);
  859. ret = wl1271_boot_soft_reset(wl);
  860. if (ret < 0)
  861. goto out;
  862. out:
  863. return ret;
  864. }
  865. static void wl12xx_pre_upload(struct wl1271 *wl)
  866. {
  867. u32 tmp;
  868. /* write firmware's last address (ie. it's length) to
  869. * ACX_EEPROMLESS_IND_REG */
  870. wl1271_debug(DEBUG_BOOT, "ACX_EEPROMLESS_IND_REG");
  871. wl1271_write32(wl, WL12XX_EEPROMLESS_IND, WL12XX_EEPROMLESS_IND);
  872. tmp = wlcore_read_reg(wl, REG_CHIP_ID_B);
  873. wl1271_debug(DEBUG_BOOT, "chip id 0x%x", tmp);
  874. /* 6. read the EEPROM parameters */
  875. tmp = wl1271_read32(wl, WL12XX_SCR_PAD2);
  876. /* WL1271: The reference driver skips steps 7 to 10 (jumps directly
  877. * to upload_fw) */
  878. if (wl->chip.id == CHIP_ID_1283_PG20)
  879. wl12xx_top_reg_write(wl, SDIO_IO_DS, HCI_IO_DS_6MA);
  880. }
  881. static void wl12xx_enable_interrupts(struct wl1271 *wl)
  882. {
  883. u32 polarity;
  884. polarity = wl12xx_top_reg_read(wl, OCP_REG_POLARITY);
  885. /* We use HIGH polarity, so unset the LOW bit */
  886. polarity &= ~POLARITY_LOW;
  887. wl12xx_top_reg_write(wl, OCP_REG_POLARITY, polarity);
  888. wlcore_write_reg(wl, REG_INTERRUPT_MASK, WL1271_ACX_ALL_EVENTS_VECTOR);
  889. wlcore_enable_interrupts(wl);
  890. wlcore_write_reg(wl, REG_INTERRUPT_MASK,
  891. WL1271_ACX_INTR_ALL & ~(WL1271_INTR_MASK));
  892. wl1271_write32(wl, WL12XX_HI_CFG, HI_CFG_DEF_VAL);
  893. }
  894. static int wl12xx_boot(struct wl1271 *wl)
  895. {
  896. int ret;
  897. ret = wl12xx_pre_boot(wl);
  898. if (ret < 0)
  899. goto out;
  900. ret = wlcore_boot_upload_nvs(wl);
  901. if (ret < 0)
  902. goto out;
  903. wl12xx_pre_upload(wl);
  904. ret = wlcore_boot_upload_firmware(wl);
  905. if (ret < 0)
  906. goto out;
  907. ret = wlcore_boot_run_firmware(wl);
  908. if (ret < 0)
  909. goto out;
  910. wl12xx_enable_interrupts(wl);
  911. out:
  912. return ret;
  913. }
  914. static void wl12xx_trigger_cmd(struct wl1271 *wl, int cmd_box_addr,
  915. void *buf, size_t len)
  916. {
  917. wl1271_write(wl, cmd_box_addr, buf, len, false);
  918. wlcore_write_reg(wl, REG_INTERRUPT_TRIG, WL12XX_INTR_TRIG_CMD);
  919. }
  920. static void wl12xx_ack_event(struct wl1271 *wl)
  921. {
  922. wlcore_write_reg(wl, REG_INTERRUPT_TRIG, WL12XX_INTR_TRIG_EVENT_ACK);
  923. }
  924. static u32 wl12xx_calc_tx_blocks(struct wl1271 *wl, u32 len, u32 spare_blks)
  925. {
  926. u32 blk_size = WL12XX_TX_HW_BLOCK_SIZE;
  927. u32 align_len = wlcore_calc_packet_alignment(wl, len);
  928. return (align_len + blk_size - 1) / blk_size + spare_blks;
  929. }
  930. static void
  931. wl12xx_set_tx_desc_blocks(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
  932. u32 blks, u32 spare_blks)
  933. {
  934. if (wl->chip.id == CHIP_ID_1283_PG20) {
  935. desc->wl128x_mem.total_mem_blocks = blks;
  936. } else {
  937. desc->wl127x_mem.extra_blocks = spare_blks;
  938. desc->wl127x_mem.total_mem_blocks = blks;
  939. }
  940. }
  941. static void
  942. wl12xx_set_tx_desc_data_len(struct wl1271 *wl, struct wl1271_tx_hw_descr *desc,
  943. struct sk_buff *skb)
  944. {
  945. u32 aligned_len = wlcore_calc_packet_alignment(wl, skb->len);
  946. if (wl->chip.id == CHIP_ID_1283_PG20) {
  947. desc->wl128x_mem.extra_bytes = aligned_len - skb->len;
  948. desc->length = cpu_to_le16(aligned_len >> 2);
  949. wl1271_debug(DEBUG_TX,
  950. "tx_fill_hdr: hlid: %d len: %d life: %d mem: %d extra: %d",
  951. desc->hlid,
  952. le16_to_cpu(desc->length),
  953. le16_to_cpu(desc->life_time),
  954. desc->wl128x_mem.total_mem_blocks,
  955. desc->wl128x_mem.extra_bytes);
  956. } else {
  957. /* calculate number of padding bytes */
  958. int pad = aligned_len - skb->len;
  959. desc->tx_attr |=
  960. cpu_to_le16(pad << TX_HW_ATTR_OFST_LAST_WORD_PAD);
  961. /* Store the aligned length in terms of words */
  962. desc->length = cpu_to_le16(aligned_len >> 2);
  963. wl1271_debug(DEBUG_TX,
  964. "tx_fill_hdr: pad: %d hlid: %d len: %d life: %d mem: %d",
  965. pad, desc->hlid,
  966. le16_to_cpu(desc->length),
  967. le16_to_cpu(desc->life_time),
  968. desc->wl127x_mem.total_mem_blocks);
  969. }
  970. }
  971. static enum wl_rx_buf_align
  972. wl12xx_get_rx_buf_align(struct wl1271 *wl, u32 rx_desc)
  973. {
  974. if (rx_desc & RX_BUF_UNALIGNED_PAYLOAD)
  975. return WLCORE_RX_BUF_UNALIGNED;
  976. return WLCORE_RX_BUF_ALIGNED;
  977. }
  978. static u32 wl12xx_get_rx_packet_len(struct wl1271 *wl, void *rx_data,
  979. u32 data_len)
  980. {
  981. struct wl1271_rx_descriptor *desc = rx_data;
  982. /* invalid packet */
  983. if (data_len < sizeof(*desc) ||
  984. data_len < sizeof(*desc) + desc->pad_len)
  985. return 0;
  986. return data_len - sizeof(*desc) - desc->pad_len;
  987. }
  988. static void wl12xx_tx_delayed_compl(struct wl1271 *wl)
  989. {
  990. if (wl->fw_status->tx_results_counter == (wl->tx_results_count & 0xff))
  991. return;
  992. wl1271_tx_complete(wl);
  993. }
  994. static int wl12xx_hw_init(struct wl1271 *wl)
  995. {
  996. int ret;
  997. if (wl->chip.id == CHIP_ID_1283_PG20) {
  998. u32 host_cfg_bitmap = HOST_IF_CFG_RX_FIFO_ENABLE;
  999. ret = wl128x_cmd_general_parms(wl);
  1000. if (ret < 0)
  1001. goto out;
  1002. ret = wl128x_cmd_radio_parms(wl);
  1003. if (ret < 0)
  1004. goto out;
  1005. if (wl->quirks & WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN)
  1006. /* Enable SDIO padding */
  1007. host_cfg_bitmap |= HOST_IF_CFG_TX_PAD_TO_SDIO_BLK;
  1008. /* Must be before wl1271_acx_init_mem_config() */
  1009. ret = wl1271_acx_host_if_cfg_bitmap(wl, host_cfg_bitmap);
  1010. if (ret < 0)
  1011. goto out;
  1012. } else {
  1013. ret = wl1271_cmd_general_parms(wl);
  1014. if (ret < 0)
  1015. goto out;
  1016. ret = wl1271_cmd_radio_parms(wl);
  1017. if (ret < 0)
  1018. goto out;
  1019. ret = wl1271_cmd_ext_radio_parms(wl);
  1020. if (ret < 0)
  1021. goto out;
  1022. }
  1023. out:
  1024. return ret;
  1025. }
  1026. static void wl12xx_conf_init(struct wl1271 *wl)
  1027. {
  1028. /* apply driver default configuration */
  1029. memcpy(&wl->conf, &wl12xx_conf, sizeof(wl12xx_conf));
  1030. }
  1031. static bool wl12xx_mac_in_fuse(struct wl1271 *wl)
  1032. {
  1033. bool supported = false;
  1034. u8 major, minor;
  1035. if (wl->chip.id == CHIP_ID_1283_PG20) {
  1036. major = WL128X_PG_GET_MAJOR(wl->hw_pg_ver);
  1037. minor = WL128X_PG_GET_MINOR(wl->hw_pg_ver);
  1038. /* in wl128x we have the MAC address if the PG is >= (2, 1) */
  1039. if (major > 2 || (major == 2 && minor >= 1))
  1040. supported = true;
  1041. } else {
  1042. major = WL127X_PG_GET_MAJOR(wl->hw_pg_ver);
  1043. minor = WL127X_PG_GET_MINOR(wl->hw_pg_ver);
  1044. /* in wl127x we have the MAC address if the PG is >= (3, 1) */
  1045. if (major == 3 && minor >= 1)
  1046. supported = true;
  1047. }
  1048. wl1271_debug(DEBUG_PROBE,
  1049. "PG Ver major = %d minor = %d, MAC %s present",
  1050. major, minor, supported ? "is" : "is not");
  1051. return supported;
  1052. }
  1053. static void wl12xx_get_fuse_mac(struct wl1271 *wl)
  1054. {
  1055. u32 mac1, mac2;
  1056. wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
  1057. mac1 = wl1271_read32(wl, WL12XX_REG_FUSE_BD_ADDR_1);
  1058. mac2 = wl1271_read32(wl, WL12XX_REG_FUSE_BD_ADDR_2);
  1059. /* these are the two parts of the BD_ADDR */
  1060. wl->fuse_oui_addr = ((mac2 & 0xffff) << 8) +
  1061. ((mac1 & 0xff000000) >> 24);
  1062. wl->fuse_nic_addr = mac1 & 0xffffff;
  1063. wlcore_set_partition(wl, &wl->ptable[PART_DOWN]);
  1064. }
  1065. static s8 wl12xx_get_pg_ver(struct wl1271 *wl)
  1066. {
  1067. u32 die_info;
  1068. if (wl->chip.id == CHIP_ID_1283_PG20)
  1069. die_info = wl12xx_top_reg_read(wl, WL128X_REG_FUSE_DATA_2_1);
  1070. else
  1071. die_info = wl12xx_top_reg_read(wl, WL127X_REG_FUSE_DATA_2_1);
  1072. return (s8) (die_info & PG_VER_MASK) >> PG_VER_OFFSET;
  1073. }
  1074. static void wl12xx_get_mac(struct wl1271 *wl)
  1075. {
  1076. if (wl12xx_mac_in_fuse(wl))
  1077. wl12xx_get_fuse_mac(wl);
  1078. }
  1079. static struct wlcore_ops wl12xx_ops = {
  1080. .identify_chip = wl12xx_identify_chip,
  1081. .boot = wl12xx_boot,
  1082. .trigger_cmd = wl12xx_trigger_cmd,
  1083. .ack_event = wl12xx_ack_event,
  1084. .calc_tx_blocks = wl12xx_calc_tx_blocks,
  1085. .set_tx_desc_blocks = wl12xx_set_tx_desc_blocks,
  1086. .set_tx_desc_data_len = wl12xx_set_tx_desc_data_len,
  1087. .get_rx_buf_align = wl12xx_get_rx_buf_align,
  1088. .get_rx_packet_len = wl12xx_get_rx_packet_len,
  1089. .tx_immediate_compl = NULL,
  1090. .tx_delayed_compl = wl12xx_tx_delayed_compl,
  1091. .hw_init = wl12xx_hw_init,
  1092. .init_vif = NULL,
  1093. .get_pg_ver = wl12xx_get_pg_ver,
  1094. .get_mac = wl12xx_get_mac,
  1095. };
  1096. struct wl12xx_priv {
  1097. };
  1098. static int __devinit wl12xx_probe(struct platform_device *pdev)
  1099. {
  1100. struct wl1271 *wl;
  1101. struct ieee80211_hw *hw;
  1102. struct wl12xx_priv *priv;
  1103. hw = wlcore_alloc_hw(sizeof(*priv));
  1104. if (IS_ERR(hw)) {
  1105. wl1271_error("can't allocate hw");
  1106. return PTR_ERR(hw);
  1107. }
  1108. wl = hw->priv;
  1109. wl->ops = &wl12xx_ops;
  1110. wl->ptable = wl12xx_ptable;
  1111. wl->rtable = wl12xx_rtable;
  1112. wl->num_tx_desc = 16;
  1113. wl->normal_tx_spare = WL12XX_TX_HW_BLOCK_SPARE_DEFAULT;
  1114. wl->gem_tx_spare = WL12XX_TX_HW_BLOCK_GEM_SPARE;
  1115. wl->band_rate_to_idx = wl12xx_band_rate_to_idx;
  1116. wl->hw_tx_rate_tbl_size = WL12XX_CONF_HW_RXTX_RATE_MAX;
  1117. wl->hw_min_ht_rate = WL12XX_CONF_HW_RXTX_RATE_MCS0;
  1118. wl12xx_conf_init(wl);
  1119. return wlcore_probe(wl, pdev);
  1120. }
  1121. static const struct platform_device_id wl12xx_id_table[] __devinitconst = {
  1122. { "wl12xx", 0 },
  1123. { } /* Terminating Entry */
  1124. };
  1125. MODULE_DEVICE_TABLE(platform, wl12xx_id_table);
  1126. static struct platform_driver wl12xx_driver = {
  1127. .probe = wl12xx_probe,
  1128. .remove = __devexit_p(wlcore_remove),
  1129. .id_table = wl12xx_id_table,
  1130. .driver = {
  1131. .name = "wl12xx_driver",
  1132. .owner = THIS_MODULE,
  1133. }
  1134. };
  1135. static int __init wl12xx_init(void)
  1136. {
  1137. return platform_driver_register(&wl12xx_driver);
  1138. }
  1139. module_init(wl12xx_init);
  1140. static void __exit wl12xx_exit(void)
  1141. {
  1142. platform_driver_unregister(&wl12xx_driver);
  1143. }
  1144. module_exit(wl12xx_exit);
  1145. MODULE_LICENSE("GPL v2");
  1146. MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
  1147. MODULE_FIRMWARE(WL127X_FW_NAME_SINGLE);
  1148. MODULE_FIRMWARE(WL127X_FW_NAME_MULTI);
  1149. MODULE_FIRMWARE(WL127X_PLT_FW_NAME);
  1150. MODULE_FIRMWARE(WL128X_FW_NAME_SINGLE);
  1151. MODULE_FIRMWARE(WL128X_FW_NAME_MULTI);
  1152. MODULE_FIRMWARE(WL128X_PLT_FW_NAME);