1 /******************************************************************************
3 * Copyright(c) 2009-2012 Realtek Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE.
21 * Contact Information:
22 * wlanfae <wlanfae@realtek.com>
23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24 * Hsinchu 300, Taiwan.
26 * Larry Finger <Larry.Finger@lwfinger.net>
28 *****************************************************************************/
37 static void _rtl92s_fw_set_rqpn(struct ieee80211_hw
*hw
)
39 struct rtl_priv
*rtlpriv
= rtl_priv(hw
);
41 rtl_write_dword(rtlpriv
, RQPN
, 0xffffffff);
42 rtl_write_dword(rtlpriv
, RQPN
+ 4, 0xffffffff);
43 rtl_write_byte(rtlpriv
, RQPN
+ 8, 0xff);
44 rtl_write_byte(rtlpriv
, RQPN
+ 0xB, 0x80);
47 static bool _rtl92s_firmware_enable_cpu(struct ieee80211_hw
*hw
)
49 struct rtl_priv
*rtlpriv
= rtl_priv(hw
);
52 u8 tmpu1b
, cpustatus
= 0;
54 _rtl92s_fw_set_rqpn(hw
);
57 tmpu1b
= rtl_read_byte(rtlpriv
, SYS_CLKR
);
59 rtl_write_byte(rtlpriv
, SYS_CLKR
, (tmpu1b
| SYS_CPU_CLKSEL
));
61 tmpu2b
= rtl_read_word(rtlpriv
, REG_SYS_FUNC_EN
);
62 rtl_write_word(rtlpriv
, REG_SYS_FUNC_EN
, (tmpu2b
| FEN_CPUEN
));
64 /* Polling IMEM Ready after CPU has refilled. */
66 cpustatus
= rtl_read_byte(rtlpriv
, TCR
);
67 if (cpustatus
& IMEM_RDY
) {
68 RT_TRACE(rtlpriv
, COMP_INIT
, DBG_LOUD
,
69 "IMEM Ready after CPU has refilled\n");
74 } while (ichecktime
--);
76 if (!(cpustatus
& IMEM_RDY
))
82 static enum fw_status
_rtl92s_firmware_get_nextstatus(
83 enum fw_status fw_currentstatus
)
85 enum fw_status next_fwstatus
= 0;
87 switch (fw_currentstatus
) {
89 next_fwstatus
= FW_STATUS_LOAD_IMEM
;
91 case FW_STATUS_LOAD_IMEM
:
92 next_fwstatus
= FW_STATUS_LOAD_EMEM
;
94 case FW_STATUS_LOAD_EMEM
:
95 next_fwstatus
= FW_STATUS_LOAD_DMEM
;
97 case FW_STATUS_LOAD_DMEM
:
98 next_fwstatus
= FW_STATUS_READY
;
104 return next_fwstatus
;
107 static u8
_rtl92s_firmware_header_map_rftype(struct ieee80211_hw
*hw
)
109 struct rtl_priv
*rtlpriv
= rtl_priv(hw
);
110 struct rtl_phy
*rtlphy
= &(rtlpriv
->phy
);
112 switch (rtlphy
->rf_type
) {
120 RT_TRACE(rtlpriv
, COMP_INIT
, DBG_EMERG
, "Unknown RF type(%x)\n",
127 static void _rtl92s_firmwareheader_priveupdate(struct ieee80211_hw
*hw
,
128 struct fw_priv
*pfw_priv
)
130 /* Update RF types for RATR settings. */
131 pfw_priv
->rf_config
= _rtl92s_firmware_header_map_rftype(hw
);
136 static bool _rtl92s_cmd_send_packet(struct ieee80211_hw
*hw
,
137 struct sk_buff
*skb
, u8 last
)
139 struct rtl_priv
*rtlpriv
= rtl_priv(hw
);
140 struct rtl_pci
*rtlpci
= rtl_pcidev(rtl_pcipriv(hw
));
141 struct rtl8192_tx_ring
*ring
;
142 struct rtl_tx_desc
*pdesc
;
146 ring
= &rtlpci
->tx_ring
[TXCMD_QUEUE
];
148 spin_lock_irqsave(&rtlpriv
->locks
.irq_th_lock
, flags
);
150 idx
= (ring
->idx
+ skb_queue_len(&ring
->queue
)) % ring
->entries
;
151 pdesc
= &ring
->desc
[idx
];
152 rtlpriv
->cfg
->ops
->fill_tx_cmddesc(hw
, (u8
*)pdesc
, 1, 1, skb
);
153 __skb_queue_tail(&ring
->queue
, skb
);
155 spin_unlock_irqrestore(&rtlpriv
->locks
.irq_th_lock
, flags
);
160 static bool _rtl92s_firmware_downloadcode(struct ieee80211_hw
*hw
,
161 u8
*code_virtual_address
, u32 buffer_len
)
163 struct rtl_priv
*rtlpriv
= rtl_priv(hw
);
165 struct rtl_tcb_desc
*tcb_desc
;
166 unsigned char *seg_ptr
;
167 u16 frag_threshold
= MAX_FIRMWARE_CODE_SIZE
;
168 u16 frag_length
, frag_offset
= 0;
169 u16 extra_descoffset
= 0;
172 _rtl92s_fw_set_rqpn(hw
);
174 if (buffer_len
>= MAX_FIRMWARE_CODE_SIZE
) {
175 RT_TRACE(rtlpriv
, COMP_ERR
, DBG_EMERG
,
176 "Size over FIRMWARE_CODE_SIZE!\n");
181 extra_descoffset
= 0;
184 if ((buffer_len
- frag_offset
) > frag_threshold
) {
185 frag_length
= frag_threshold
+ extra_descoffset
;
187 frag_length
= (u16
)(buffer_len
- frag_offset
+
192 /* Allocate skb buffer to contain firmware */
193 /* info and tx descriptor info. */
194 skb
= dev_alloc_skb(frag_length
);
197 skb_reserve(skb
, extra_descoffset
);
198 seg_ptr
= (u8
*)skb_put(skb
, (u32
)(frag_length
-
200 memcpy(seg_ptr
, code_virtual_address
+ frag_offset
,
201 (u32
)(frag_length
- extra_descoffset
));
203 tcb_desc
= (struct rtl_tcb_desc
*)(skb
->cb
);
204 tcb_desc
->queue_index
= TXCMD_QUEUE
;
205 tcb_desc
->cmd_or_init
= DESC_PACKET_TYPE_INIT
;
206 tcb_desc
->last_inipkt
= last_inipkt
;
208 _rtl92s_cmd_send_packet(hw
, skb
, last_inipkt
);
210 frag_offset
+= (frag_length
- extra_descoffset
);
212 } while (frag_offset
< buffer_len
);
214 rtl_write_byte(rtlpriv
, TP_POLL
, TPPOLL_CQ
);
219 static bool _rtl92s_firmware_checkready(struct ieee80211_hw
*hw
,
222 struct rtl_priv
*rtlpriv
= rtl_priv(hw
);
223 struct rtl_hal
*rtlhal
= rtl_hal(rtl_priv(hw
));
224 struct rt_firmware
*firmware
= (struct rt_firmware
*)rtlhal
->pfirmware
;
227 short pollingcnt
= 1000;
228 bool rtstatus
= true;
230 RT_TRACE(rtlpriv
, COMP_INIT
, DBG_LOUD
,
231 "LoadStaus(%d)\n", loadfw_status
);
233 firmware
->fwstatus
= (enum fw_status
)loadfw_status
;
235 switch (loadfw_status
) {
236 case FW_STATUS_LOAD_IMEM
:
237 /* Polling IMEM code done. */
239 cpustatus
= rtl_read_byte(rtlpriv
, TCR
);
240 if (cpustatus
& IMEM_CODE_DONE
)
243 } while (pollingcnt
--);
245 if (!(cpustatus
& IMEM_CHK_RPT
) || (pollingcnt
<= 0)) {
246 RT_TRACE(rtlpriv
, COMP_ERR
, DBG_EMERG
,
247 "FW_STATUS_LOAD_IMEM FAIL CPU, Status=%x\n",
249 goto status_check_fail
;
253 case FW_STATUS_LOAD_EMEM
:
254 /* Check Put Code OK and Turn On CPU */
255 /* Polling EMEM code done. */
257 cpustatus
= rtl_read_byte(rtlpriv
, TCR
);
258 if (cpustatus
& EMEM_CODE_DONE
)
261 } while (pollingcnt
--);
263 if (!(cpustatus
& EMEM_CHK_RPT
) || (pollingcnt
<= 0)) {
264 RT_TRACE(rtlpriv
, COMP_ERR
, DBG_EMERG
,
265 "FW_STATUS_LOAD_EMEM FAIL CPU, Status=%x\n",
267 goto status_check_fail
;
271 rtstatus
= _rtl92s_firmware_enable_cpu(hw
);
273 RT_TRACE(rtlpriv
, COMP_ERR
, DBG_EMERG
,
274 "Enable CPU fail!\n");
275 goto status_check_fail
;
279 case FW_STATUS_LOAD_DMEM
:
280 /* Polling DMEM code done */
282 cpustatus
= rtl_read_byte(rtlpriv
, TCR
);
283 if (cpustatus
& DMEM_CODE_DONE
)
286 } while (pollingcnt
--);
288 if (!(cpustatus
& DMEM_CODE_DONE
) || (pollingcnt
<= 0)) {
289 RT_TRACE(rtlpriv
, COMP_ERR
, DBG_EMERG
,
290 "Polling DMEM code done fail ! cpustatus(%#x)\n",
292 goto status_check_fail
;
295 RT_TRACE(rtlpriv
, COMP_INIT
, DBG_LOUD
,
296 "DMEM code download success, cpustatus(%#x)\n",
299 /* Prevent Delay too much and being scheduled out */
300 /* Polling Load Firmware ready */
303 cpustatus
= rtl_read_byte(rtlpriv
, TCR
);
304 if (cpustatus
& FWRDY
)
307 } while (pollingcnt
--);
309 RT_TRACE(rtlpriv
, COMP_INIT
, DBG_LOUD
,
310 "Polling Load Firmware ready, cpustatus(%x)\n",
313 if (((cpustatus
& LOAD_FW_READY
) != LOAD_FW_READY
) ||
315 RT_TRACE(rtlpriv
, COMP_ERR
, DBG_EMERG
,
316 "Polling Load Firmware ready fail ! cpustatus(%x)\n",
318 goto status_check_fail
;
321 /* If right here, we can set TCR/RCR to desired value */
322 /* and config MAC lookback mode to normal mode */
323 tmpu4b
= rtl_read_dword(rtlpriv
, TCR
);
324 rtl_write_dword(rtlpriv
, TCR
, (tmpu4b
& (~TCR_ICV
)));
326 tmpu4b
= rtl_read_dword(rtlpriv
, RCR
);
327 rtl_write_dword(rtlpriv
, RCR
, (tmpu4b
| RCR_APPFCS
|
328 RCR_APP_ICV
| RCR_APP_MIC
));
330 RT_TRACE(rtlpriv
, COMP_INIT
, DBG_LOUD
,
331 "Current RCR settings(%#x)\n", tmpu4b
);
333 /* Set to normal mode. */
334 rtl_write_byte(rtlpriv
, LBKMD_SEL
, LBK_NORMAL
);
338 RT_TRACE(rtlpriv
, COMP_INIT
, DBG_EMERG
,
339 "Unknown status check!\n");
345 RT_TRACE(rtlpriv
, COMP_INIT
, DBG_LOUD
,
346 "loadfw_status(%d), rtstatus(%x)\n",
347 loadfw_status
, rtstatus
);
351 int rtl92s_download_fw(struct ieee80211_hw
*hw
)
353 struct rtl_priv
*rtlpriv
= rtl_priv(hw
);
354 struct rtl_hal
*rtlhal
= rtl_hal(rtl_priv(hw
));
355 struct rt_firmware
*firmware
= NULL
;
356 struct fw_hdr
*pfwheader
;
357 struct fw_priv
*pfw_priv
= NULL
;
358 u8
*puc_mappedfile
= NULL
;
359 u32 ul_filelength
= 0;
360 u8 fwhdr_size
= RT_8192S_FIRMWARE_HDR_SIZE
;
361 u8 fwstatus
= FW_STATUS_INIT
;
362 bool rtstatus
= true;
364 if (rtlpriv
->max_fw_size
== 0 || !rtlhal
->pfirmware
)
367 firmware
= (struct rt_firmware
*)rtlhal
->pfirmware
;
368 firmware
->fwstatus
= FW_STATUS_INIT
;
370 puc_mappedfile
= firmware
->sz_fw_tmpbuffer
;
372 /* 1. Retrieve FW header. */
373 firmware
->pfwheader
= (struct fw_hdr
*) puc_mappedfile
;
374 pfwheader
= firmware
->pfwheader
;
375 firmware
->firmwareversion
= byte(pfwheader
->version
, 0);
376 firmware
->pfwheader
->fwpriv
.hci_sel
= 1;/* pcie */
378 RT_TRACE(rtlpriv
, COMP_INIT
, DBG_LOUD
,
379 "signature:%x, version:%x, size:%x, imemsize:%x, sram size:%x\n",
380 pfwheader
->signature
,
381 pfwheader
->version
, pfwheader
->dmem_size
,
382 pfwheader
->img_imem_size
, pfwheader
->img_sram_size
);
384 /* 2. Retrieve IMEM image. */
385 if ((pfwheader
->img_imem_size
== 0) || (pfwheader
->img_imem_size
>
386 sizeof(firmware
->fw_imem
))) {
387 RT_TRACE(rtlpriv
, COMP_ERR
, DBG_EMERG
,
388 "memory for data image is less than IMEM required\n");
391 puc_mappedfile
+= fwhdr_size
;
393 memcpy(firmware
->fw_imem
, puc_mappedfile
,
394 pfwheader
->img_imem_size
);
395 firmware
->fw_imem_len
= pfwheader
->img_imem_size
;
398 /* 3. Retriecve EMEM image. */
399 if (pfwheader
->img_sram_size
> sizeof(firmware
->fw_emem
)) {
400 RT_TRACE(rtlpriv
, COMP_ERR
, DBG_EMERG
,
401 "memory for data image is less than EMEM required\n");
404 puc_mappedfile
+= firmware
->fw_imem_len
;
406 memcpy(firmware
->fw_emem
, puc_mappedfile
,
407 pfwheader
->img_sram_size
);
408 firmware
->fw_emem_len
= pfwheader
->img_sram_size
;
411 /* 4. download fw now */
412 fwstatus
= _rtl92s_firmware_get_nextstatus(firmware
->fwstatus
);
413 while (fwstatus
!= FW_STATUS_READY
) {
414 /* Image buffer redirection. */
416 case FW_STATUS_LOAD_IMEM
:
417 puc_mappedfile
= firmware
->fw_imem
;
418 ul_filelength
= firmware
->fw_imem_len
;
420 case FW_STATUS_LOAD_EMEM
:
421 puc_mappedfile
= firmware
->fw_emem
;
422 ul_filelength
= firmware
->fw_emem_len
;
424 case FW_STATUS_LOAD_DMEM
:
425 /* Partial update the content of header private. */
426 pfwheader
= firmware
->pfwheader
;
427 pfw_priv
= &pfwheader
->fwpriv
;
428 _rtl92s_firmwareheader_priveupdate(hw
, pfw_priv
);
429 puc_mappedfile
= (u8
*)(firmware
->pfwheader
) +
430 RT_8192S_FIRMWARE_HDR_EXCLUDE_PRI_SIZE
;
431 ul_filelength
= fwhdr_size
-
432 RT_8192S_FIRMWARE_HDR_EXCLUDE_PRI_SIZE
;
435 RT_TRACE(rtlpriv
, COMP_ERR
, DBG_EMERG
,
436 "Unexpected Download step!!\n");
440 /* <2> Download image file */
441 rtstatus
= _rtl92s_firmware_downloadcode(hw
, puc_mappedfile
,
445 RT_TRACE(rtlpriv
, COMP_ERR
, DBG_EMERG
, "fail!\n");
449 /* <3> Check whether load FW process is ready */
450 rtstatus
= _rtl92s_firmware_checkready(hw
, fwstatus
);
452 RT_TRACE(rtlpriv
, COMP_ERR
, DBG_EMERG
, "fail!\n");
456 fwstatus
= _rtl92s_firmware_get_nextstatus(firmware
->fwstatus
);
464 static u32
_rtl92s_fill_h2c_cmd(struct sk_buff
*skb
, u32 h2cbufferlen
,
465 u32 cmd_num
, u32
*pelement_id
, u32
*pcmd_len
,
466 u8
**pcmb_buffer
, u8
*cmd_start_seq
)
468 u32 totallen
= 0, len
= 0, tx_desclen
= 0;
469 u32 pre_continueoffset
= 0;
474 /* 8 - Byte aligment */
475 len
= H2C_TX_CMD_HDR_LEN
+ N_BYTE_ALIGMENT(pcmd_len
[i
], 8);
477 /* Buffer length is not enough */
478 if (h2cbufferlen
< totallen
+ len
+ tx_desclen
)
482 ph2c_buffer
= (u8
*)skb_put(skb
, (u32
)len
);
483 memset((ph2c_buffer
+ totallen
+ tx_desclen
), 0, len
);
486 SET_BITS_TO_LE_4BYTE((ph2c_buffer
+ totallen
+ tx_desclen
),
490 SET_BITS_TO_LE_4BYTE((ph2c_buffer
+ totallen
+ tx_desclen
),
491 16, 8, pelement_id
[i
]);
494 *cmd_start_seq
= *cmd_start_seq
% 0x80;
495 SET_BITS_TO_LE_4BYTE((ph2c_buffer
+ totallen
+ tx_desclen
),
496 24, 7, *cmd_start_seq
);
500 memcpy((ph2c_buffer
+ totallen
+ tx_desclen
+
501 H2C_TX_CMD_HDR_LEN
), pcmb_buffer
[i
], pcmd_len
[i
]);
504 /* set the continue in prevoius cmd. */
506 SET_BITS_TO_LE_4BYTE((ph2c_buffer
+ pre_continueoffset
),
509 pre_continueoffset
= totallen
;
512 } while (++i
< cmd_num
);
517 static u32
_rtl92s_get_h2c_cmdlen(u32 h2cbufferlen
, u32 cmd_num
, u32
*pcmd_len
)
519 u32 totallen
= 0, len
= 0, tx_desclen
= 0;
523 /* 8 - Byte aligment */
524 len
= H2C_TX_CMD_HDR_LEN
+ N_BYTE_ALIGMENT(pcmd_len
[i
], 8);
526 /* Buffer length is not enough */
527 if (h2cbufferlen
< totallen
+ len
+ tx_desclen
)
531 } while (++i
< cmd_num
);
533 return totallen
+ tx_desclen
;
536 static bool _rtl92s_firmware_set_h2c_cmd(struct ieee80211_hw
*hw
, u8 h2c_cmd
,
539 struct rtl_priv
*rtlpriv
= rtl_priv(hw
);
540 struct rtl_hal
*rtlhal
= rtl_hal(rtl_priv(hw
));
541 struct rtl_tcb_desc
*cb_desc
;
548 case FW_H2C_SETPWRMODE
:
549 element_id
= H2C_SETPWRMODE_CMD
;
550 cmd_len
= sizeof(struct h2c_set_pwrmode_parm
);
552 case FW_H2C_JOINBSSRPT
:
553 element_id
= H2C_JOINBSSRPT_CMD
;
554 cmd_len
= sizeof(struct h2c_joinbss_rpt_parm
);
556 case FW_H2C_WOWLAN_UPDATE_GTK
:
557 element_id
= H2C_WOWLAN_UPDATE_GTK_CMD
;
558 cmd_len
= sizeof(struct h2c_wpa_two_way_parm
);
560 case FW_H2C_WOWLAN_UPDATE_IV
:
561 element_id
= H2C_WOWLAN_UPDATE_IV_CMD
;
562 cmd_len
= sizeof(unsigned long long);
564 case FW_H2C_WOWLAN_OFFLOAD
:
565 element_id
= H2C_WOWLAN_FW_OFFLOAD
;
566 cmd_len
= sizeof(u8
);
572 len
= _rtl92s_get_h2c_cmdlen(MAX_TRANSMIT_BUFFER_SIZE
, 1, &cmd_len
);
573 skb
= dev_alloc_skb(len
);
576 cb_desc
= (struct rtl_tcb_desc
*)(skb
->cb
);
577 cb_desc
->queue_index
= TXCMD_QUEUE
;
578 cb_desc
->cmd_or_init
= DESC_PACKET_TYPE_NORMAL
;
579 cb_desc
->last_inipkt
= false;
581 _rtl92s_fill_h2c_cmd(skb
, MAX_TRANSMIT_BUFFER_SIZE
, 1, &element_id
,
582 &cmd_len
, &pcmd_buffer
, &rtlhal
->h2c_txcmd_seq
);
583 _rtl92s_cmd_send_packet(hw
, skb
, false);
584 rtlpriv
->cfg
->ops
->tx_polling(hw
, TXCMD_QUEUE
);
589 void rtl92s_set_fw_pwrmode_cmd(struct ieee80211_hw
*hw
, u8 Mode
)
591 struct rtl_mac
*mac
= rtl_mac(rtl_priv(hw
));
592 struct rtl_ps_ctl
*ppsc
= rtl_psc(rtl_priv(hw
));
593 struct h2c_set_pwrmode_parm pwrmode
;
594 u16 max_wakeup_period
= 0;
597 pwrmode
.flag_low_traffic_en
= 0;
598 pwrmode
.flag_lpnav_en
= 0;
599 pwrmode
.flag_rf_low_snr_en
= 0;
600 pwrmode
.flag_dps_en
= 0;
601 pwrmode
.bcn_rx_en
= 0;
603 SET_BITS_TO_LE_2BYTE((u8
*)(&pwrmode
) + 8, 0, 16,
604 mac
->vif
->bss_conf
.beacon_int
);
606 pwrmode
.awake_bcn_itvl
= ppsc
->reg_max_lps_awakeintvl
;
607 pwrmode
.smart_ps
= 1;
608 pwrmode
.bcn_pass_period
= 10;
610 /* Set beacon pass count */
611 if (pwrmode
.mode
== FW_PS_MIN_MODE
)
612 max_wakeup_period
= mac
->vif
->bss_conf
.beacon_int
;
613 else if (pwrmode
.mode
== FW_PS_MAX_MODE
)
614 max_wakeup_period
= mac
->vif
->bss_conf
.beacon_int
*
615 mac
->vif
->bss_conf
.dtim_period
;
617 if (max_wakeup_period
>= 500)
618 pwrmode
.bcn_pass_cnt
= 1;
619 else if ((max_wakeup_period
>= 300) && (max_wakeup_period
< 500))
620 pwrmode
.bcn_pass_cnt
= 2;
621 else if ((max_wakeup_period
>= 200) && (max_wakeup_period
< 300))
622 pwrmode
.bcn_pass_cnt
= 3;
623 else if ((max_wakeup_period
>= 20) && (max_wakeup_period
< 200))
624 pwrmode
.bcn_pass_cnt
= 5;
626 pwrmode
.bcn_pass_cnt
= 1;
628 _rtl92s_firmware_set_h2c_cmd(hw
, FW_H2C_SETPWRMODE
, (u8
*)&pwrmode
);
632 void rtl92s_set_fw_joinbss_report_cmd(struct ieee80211_hw
*hw
,
633 u8 mstatus
, u8 ps_qosinfo
)
635 struct rtl_mac
*mac
= rtl_mac(rtl_priv(hw
));
636 struct h2c_joinbss_rpt_parm joinbss_rpt
;
638 joinbss_rpt
.opmode
= mstatus
;
639 joinbss_rpt
.ps_qos_info
= ps_qosinfo
;
640 joinbss_rpt
.bssid
[0] = mac
->bssid
[0];
641 joinbss_rpt
.bssid
[1] = mac
->bssid
[1];
642 joinbss_rpt
.bssid
[2] = mac
->bssid
[2];
643 joinbss_rpt
.bssid
[3] = mac
->bssid
[3];
644 joinbss_rpt
.bssid
[4] = mac
->bssid
[4];
645 joinbss_rpt
.bssid
[5] = mac
->bssid
[5];
646 SET_BITS_TO_LE_2BYTE((u8
*)(&joinbss_rpt
) + 8, 0, 16,
647 mac
->vif
->bss_conf
.beacon_int
);
648 SET_BITS_TO_LE_2BYTE((u8
*)(&joinbss_rpt
) + 10, 0, 16, mac
->assoc_id
);
650 _rtl92s_firmware_set_h2c_cmd(hw
, FW_H2C_JOINBSSRPT
, (u8
*)&joinbss_rpt
);