11
11
12
12
bool rtl92d_is_fw_downloaded (struct rtl_priv * rtlpriv )
13
13
{
14
- return (rtl_read_dword (rtlpriv , REG_MCUFWDL ) & MCUFWDL_RDY ) ?
15
- true : false;
14
+ return !!(rtl_read_dword (rtlpriv , REG_MCUFWDL ) & MCUFWDL_RDY );
16
15
}
17
16
EXPORT_SYMBOL_GPL (rtl92d_is_fw_downloaded );
18
17
@@ -50,17 +49,22 @@ void rtl92d_write_fw(struct ieee80211_hw *hw,
50
49
u32 page , offset ;
51
50
52
51
rtl_dbg (rtlpriv , COMP_FW , DBG_TRACE , "FW size is %d bytes,\n" , size );
52
+
53
53
if (rtlhal -> hw_type == HARDWARE_TYPE_RTL8192DE )
54
54
rtl_fill_dummy (bufferptr , & size );
55
+
55
56
pagenums = size / FW_8192D_PAGE_SIZE ;
56
57
remainsize = size % FW_8192D_PAGE_SIZE ;
58
+
57
59
if (pagenums > 8 )
58
60
pr_err ("Page numbers should not greater then 8\n" );
61
+
59
62
for (page = 0 ; page < pagenums ; page ++ ) {
60
63
offset = page * FW_8192D_PAGE_SIZE ;
61
64
rtl_fw_page_write (hw , page , (bufferptr + offset ),
62
65
FW_8192D_PAGE_SIZE );
63
66
}
67
+
64
68
if (remainsize ) {
65
69
offset = pagenums * FW_8192D_PAGE_SIZE ;
66
70
page = pagenums ;
@@ -79,14 +83,17 @@ int rtl92d_fw_free_to_go(struct ieee80211_hw *hw)
79
83
value32 = rtl_read_dword (rtlpriv , REG_MCUFWDL );
80
84
} while ((counter ++ < FW_8192D_POLLING_TIMEOUT_COUNT ) &&
81
85
(!(value32 & FWDL_CHKSUM_RPT )));
86
+
82
87
if (counter >= FW_8192D_POLLING_TIMEOUT_COUNT ) {
83
88
pr_err ("chksum report fail! REG_MCUFWDL:0x%08x\n" ,
84
89
value32 );
85
90
return - EIO ;
86
91
}
92
+
87
93
value32 = rtl_read_dword (rtlpriv , REG_MCUFWDL );
88
94
value32 |= MCUFWDL_RDY ;
89
95
rtl_write_dword (rtlpriv , REG_MCUFWDL , value32 );
96
+
90
97
return 0 ;
91
98
}
92
99
EXPORT_SYMBOL_GPL (rtl92d_fw_free_to_go );
@@ -99,7 +106,9 @@ void rtl92d_firmware_selfreset(struct ieee80211_hw *hw)
99
106
100
107
/* Set (REG_HMETFR + 3) to 0x20 is reset 8051 */
101
108
rtl_write_byte (rtlpriv , REG_HMETFR + 3 , 0x20 );
109
+
102
110
u1b_tmp = rtl_read_byte (rtlpriv , REG_SYS_FUNC_EN + 1 );
111
+
103
112
while (u1b_tmp & BIT (2 )) {
104
113
delay -- ;
105
114
if (delay == 0 )
@@ -174,31 +183,32 @@ static bool _rtl92d_check_fw_read_last_h2c(struct ieee80211_hw *hw, u8 boxnum)
174
183
return result ;
175
184
}
176
185
177
- static void _rtl92d_fill_h2c_command (struct ieee80211_hw * hw ,
178
- u8 element_id , u32 cmd_len , u8 * cmdbuffer )
186
+ void rtl92d_fill_h2c_cmd (struct ieee80211_hw * hw ,
187
+ u8 element_id , u32 cmd_len , u8 * cmdbuffer )
179
188
{
180
- struct rtl_priv * rtlpriv = rtl_priv (hw );
181
- struct rtl_hal * rtlhal = rtl_hal (rtl_priv (hw ));
182
189
struct rtl_ps_ctl * ppsc = rtl_psc (rtl_priv (hw ));
183
- u8 boxnum ;
190
+ struct rtl_hal * rtlhal = rtl_hal (rtl_priv (hw ));
191
+ struct rtl_priv * rtlpriv = rtl_priv (hw );
192
+ u8 boxcontent [4 ], boxextcontent [2 ];
184
193
u16 box_reg = 0 , box_extreg = 0 ;
185
- u8 u1b_tmp ;
186
- bool isfw_read = false;
187
- u8 buf_index = 0 ;
194
+ u8 wait_writeh2c_limmit = 100 ;
188
195
bool bwrite_success = false;
189
196
u8 wait_h2c_limmit = 100 ;
190
- u8 wait_writeh2c_limmit = 100 ;
191
- u8 boxcontent [4 ], boxextcontent [2 ];
192
197
u32 h2c_waitcounter = 0 ;
198
+ bool isfw_read = false;
193
199
unsigned long flag ;
200
+ u8 u1b_tmp ;
201
+ u8 boxnum ;
194
202
u8 idx ;
195
203
196
204
if (ppsc -> rfpwr_state == ERFOFF || ppsc -> inactive_pwrstate == ERFOFF ) {
197
205
rtl_dbg (rtlpriv , COMP_CMD , DBG_LOUD ,
198
206
"Return as RF is off!!!\n" );
199
207
return ;
200
208
}
209
+
201
210
rtl_dbg (rtlpriv , COMP_CMD , DBG_LOUD , "come in\n" );
211
+
202
212
while (true) {
203
213
spin_lock_irqsave (& rtlpriv -> locks .h2c_lock , flag );
204
214
if (rtlhal -> h2c_setinprogress ) {
@@ -228,35 +238,23 @@ static void _rtl92d_fill_h2c_command(struct ieee80211_hw *hw,
228
238
break ;
229
239
}
230
240
}
241
+
231
242
while (!bwrite_success ) {
232
243
wait_writeh2c_limmit -- ;
233
244
if (wait_writeh2c_limmit == 0 ) {
234
245
pr_err ("Write H2C fail because no trigger for FW INT!\n" );
235
246
break ;
236
247
}
248
+
237
249
boxnum = rtlhal -> last_hmeboxnum ;
238
- switch (boxnum ) {
239
- case 0 :
240
- box_reg = REG_HMEBOX_0 ;
241
- box_extreg = REG_HMEBOX_EXT_0 ;
242
- break ;
243
- case 1 :
244
- box_reg = REG_HMEBOX_1 ;
245
- box_extreg = REG_HMEBOX_EXT_1 ;
246
- break ;
247
- case 2 :
248
- box_reg = REG_HMEBOX_2 ;
249
- box_extreg = REG_HMEBOX_EXT_2 ;
250
- break ;
251
- case 3 :
252
- box_reg = REG_HMEBOX_3 ;
253
- box_extreg = REG_HMEBOX_EXT_3 ;
254
- break ;
255
- default :
256
- pr_err ("switch case %#x not processed\n" ,
257
- boxnum );
250
+ if (boxnum > 3 ) {
251
+ pr_err ("boxnum %#x too big\n" , boxnum );
258
252
break ;
259
253
}
254
+
255
+ box_reg = REG_HMEBOX_0 + boxnum * SIZE_OF_REG_HMEBOX ;
256
+ box_extreg = REG_HMEBOX_EXT_0 + boxnum * SIZE_OF_REG_HMEBOX_EXT ;
257
+
260
258
isfw_read = _rtl92d_check_fw_read_last_h2c (hw , boxnum );
261
259
while (!isfw_read ) {
262
260
wait_h2c_limmit -- ;
@@ -266,78 +264,70 @@ static void _rtl92d_fill_h2c_command(struct ieee80211_hw *hw,
266
264
boxnum );
267
265
break ;
268
266
}
267
+
269
268
udelay (10 );
269
+
270
270
isfw_read = _rtl92d_check_fw_read_last_h2c (hw , boxnum );
271
271
u1b_tmp = rtl_read_byte (rtlpriv , 0x1BF );
272
272
rtl_dbg (rtlpriv , COMP_CMD , DBG_LOUD ,
273
273
"Waiting for FW read clear HMEBox(%d)!!! 0x1BF = %2x\n" ,
274
274
boxnum , u1b_tmp );
275
275
}
276
+
276
277
if (!isfw_read ) {
277
278
rtl_dbg (rtlpriv , COMP_CMD , DBG_LOUD ,
278
279
"Write H2C register BOX[%d] fail!!!!! Fw do not read.\n" ,
279
280
boxnum );
280
281
break ;
281
282
}
283
+
282
284
memset (boxcontent , 0 , sizeof (boxcontent ));
283
285
memset (boxextcontent , 0 , sizeof (boxextcontent ));
284
286
boxcontent [0 ] = element_id ;
287
+
285
288
rtl_dbg (rtlpriv , COMP_CMD , DBG_LOUD ,
286
289
"Write element_id box_reg(%4x) = %2x\n" ,
287
290
box_reg , element_id );
291
+
288
292
switch (cmd_len ) {
289
- case 1 :
290
- boxcontent [0 ] &= ~(BIT (7 ));
291
- memcpy (boxcontent + 1 , cmdbuffer + buf_index , 1 );
292
- for (idx = 0 ; idx < 4 ; idx ++ )
293
- rtl_write_byte (rtlpriv , box_reg + idx ,
294
- boxcontent [idx ]);
295
- break ;
296
- case 2 :
297
- boxcontent [0 ] &= ~(BIT (7 ));
298
- memcpy (boxcontent + 1 , cmdbuffer + buf_index , 2 );
299
- for (idx = 0 ; idx < 4 ; idx ++ )
300
- rtl_write_byte (rtlpriv , box_reg + idx ,
301
- boxcontent [idx ]);
302
- break ;
303
- case 3 :
304
- boxcontent [0 ] &= ~(BIT (7 ));
305
- memcpy (boxcontent + 1 , cmdbuffer + buf_index , 3 );
306
- for (idx = 0 ; idx < 4 ; idx ++ )
307
- rtl_write_byte (rtlpriv , box_reg + idx ,
308
- boxcontent [idx ]);
309
- break ;
310
- case 4 :
311
- boxcontent [0 ] |= (BIT (7 ));
312
- memcpy (boxextcontent , cmdbuffer + buf_index , 2 );
313
- memcpy (boxcontent + 1 , cmdbuffer + buf_index + 2 , 2 );
314
- for (idx = 0 ; idx < 2 ; idx ++ )
315
- rtl_write_byte (rtlpriv , box_extreg + idx ,
316
- boxextcontent [idx ]);
293
+ case 1 ... 3 :
294
+ /* BOX: | ID | A0 | A1 | A2 |
295
+ * BOX_EXT: --- N/A ------
296
+ */
297
+ boxcontent [0 ] &= ~BIT (7 );
298
+ memcpy (boxcontent + 1 , cmdbuffer , cmd_len );
299
+
317
300
for (idx = 0 ; idx < 4 ; idx ++ )
318
301
rtl_write_byte (rtlpriv , box_reg + idx ,
319
302
boxcontent [idx ]);
320
303
break ;
321
- case 5 :
322
- boxcontent [0 ] |= (BIT (7 ));
323
- memcpy (boxextcontent , cmdbuffer + buf_index , 2 );
324
- memcpy (boxcontent + 1 , cmdbuffer + buf_index + 2 , 3 );
304
+ case 4 ... 5 :
305
+ /* * ID ext = ID | BIT(7)
306
+ * BOX: | ID ext | A2 | A3 | A4 |
307
+ * BOX_EXT: | A0 | A1 |
308
+ */
309
+ boxcontent [0 ] |= BIT (7 );
310
+ memcpy (boxextcontent , cmdbuffer , 2 );
311
+ memcpy (boxcontent + 1 , cmdbuffer + 2 , cmd_len - 2 );
312
+
325
313
for (idx = 0 ; idx < 2 ; idx ++ )
326
314
rtl_write_byte (rtlpriv , box_extreg + idx ,
327
315
boxextcontent [idx ]);
316
+
328
317
for (idx = 0 ; idx < 4 ; idx ++ )
329
318
rtl_write_byte (rtlpriv , box_reg + idx ,
330
319
boxcontent [idx ]);
331
320
break ;
332
321
default :
333
- pr_err ("switch case %#x not processed\n" ,
334
- cmd_len );
322
+ pr_err ("switch case %#x not processed\n" , cmd_len );
335
323
break ;
336
324
}
325
+
337
326
bwrite_success = true;
338
327
rtlhal -> last_hmeboxnum = boxnum + 1 ;
339
328
if (rtlhal -> last_hmeboxnum == 4 )
340
329
rtlhal -> last_hmeboxnum = 0 ;
330
+
341
331
rtl_dbg (rtlpriv , COMP_CMD , DBG_LOUD ,
342
332
"pHalData->last_hmeboxnum = %d\n" ,
343
333
rtlhal -> last_hmeboxnum );
@@ -347,16 +337,6 @@ static void _rtl92d_fill_h2c_command(struct ieee80211_hw *hw,
347
337
spin_unlock_irqrestore (& rtlpriv -> locks .h2c_lock , flag );
348
338
rtl_dbg (rtlpriv , COMP_CMD , DBG_LOUD , "go out\n" );
349
339
}
350
-
351
- void rtl92d_fill_h2c_cmd (struct ieee80211_hw * hw ,
352
- u8 element_id , u32 cmd_len , u8 * cmdbuffer )
353
- {
354
- u32 tmp_cmdbuf [2 ];
355
-
356
- memset (tmp_cmdbuf , 0 , 8 );
357
- memcpy (tmp_cmdbuf , cmdbuffer , cmd_len );
358
- _rtl92d_fill_h2c_command (hw , element_id , cmd_len , (u8 * )& tmp_cmdbuf );
359
- }
360
340
EXPORT_SYMBOL_GPL (rtl92d_fill_h2c_cmd );
361
341
362
342
void rtl92d_set_fw_joinbss_report_cmd (struct ieee80211_hw * hw , u8 mstatus )
0 commit comments