void rtl92su_set_basic_rate(struct ieee80211_hw *hw) { struct h2c_basic_rates rates_args = { }; struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_mac *mac = rtl_mac(rtlpriv); struct ieee80211_channel *chan = hw->conf.channel; int i, j = 0; if (!chan) return; for (i = 0; i < mac->bands[chan->band].n_bitrates; i++) { if (!!(mac->basic_rates & (1 << i))) { /* * Mac80211 supported_bands provides bitrates * in 100 kbit units, however for the firmware * we need to convert them into 500 kbit units. */ rates_args.basic_rates.rates[j++] = mac->bands[chan->band].bitrates[i].bitrate / 5; if (j >= ARRAY_SIZE(rates_args.basic_rates.rates)) break; } } _rtl92s_firmware_set_h2c_cmd(hw, H2C_SETBASICRATE_CMD, sizeof(rates_args), (u8 *)&rates_args); }
u8 rtl92s_set_fw_assoc(struct ieee80211_hw *hw, u8 *mac, bool assoc) { struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_cmd_rsp *rtl_cmdrsp = rtl_cmd_rsp(rtlpriv); unsigned long flags; struct c2h_addsta_event macid; u32 cmd; int ret; if (assoc) cmd = H2C_SETASSOCSTA_CMD; else cmd = H2C_DELASSOCSTA_CMD; spin_lock_irqsave(&rtlpriv->locks.cmd_rsp_lock, flags); rtl_cmdrsp->buf = (u8 *) &macid; rtl_cmdrsp->size = sizeof(macid); spin_unlock_irqrestore(&rtlpriv->locks.cmd_rsp_lock, flags); /* * Doesn't work? no callback */ _rtl92s_firmware_set_h2c_cmd(hw, cmd, ETH_ALEN, mac); if (assoc) { ret = wait_for_completion_timeout(&rtl_cmdrsp->complete, HZ); if (ret == 0) return -ETIMEDOUT; return macid.cam_id; } else { return 0; } }
void rtl92su_set_mac_addr(struct ieee80211_hw *hw, const u8 *addr) { struct h2c_set_mac mac_args = { }; memcpy(&mac_args.mac, addr, ETH_ALEN); _rtl92s_firmware_set_h2c_cmd(hw, H2C_SET_MAC_ADDRESS_CMD, sizeof(mac_args), (u8 *)&mac_args); }
int rtl92s_set_fw_setauth_cmd(struct ieee80211_hw *hw) { struct h2c_setauth_parm auth_args = { }; //auth_args.mode = cpu_to_le32(0); return _rtl92s_firmware_set_h2c_cmd(hw, H2C_SETAUTH_CMD, sizeof(auth_args), (u8 *)&auth_args); }
int rtl92s_set_fw_opmode_cmd(struct ieee80211_hw *hw, enum h2c_op_modes mode) { struct rtl_priv *rtlpriv = rtl_priv(hw); struct h2c_opmode mode_args = { }; mode_args.mode = mode; RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "SetOpMode: %d\n", mode_args.mode); return _rtl92s_firmware_set_h2c_cmd(hw, H2C_SETOPMODE_CMD, sizeof(mode_args), (u8 *)&mode_args); }
int rtl92s_set_fw_datarate_cmd(struct ieee80211_hw *hw, u8 mac_id, mac_rates_t rates) { struct rtl_priv *rtlpriv = rtl_priv(hw); struct h2c_data_rates rates_args = { }; rates_args.mac_id = mac_id; memcpy(rates_args.rates, rates, sizeof(rates_args.rates)); RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "Set Data Rates for macId %d: [%*ph]\n", mac_id, (int)sizeof(*rates), rates); return _rtl92s_firmware_set_h2c_cmd(hw, H2C_SETDATARATE_CMD, sizeof(rates_args), (u8 *)&rates_args); }
u8 rtl92s_set_fw_setchannel_cmd(struct ieee80211_hw *hw) { struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_phy *rtlphy = &(rtlpriv->phy); struct h2c_setchannel_parm chan_args; RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "SetChannel: %i\n", rtlphy->current_channel); chan_args.channel = cpu_to_le32(rtlphy->current_channel); return (u8)_rtl92s_firmware_set_h2c_cmd(hw, H2C_SETCHANNEL_CMD, sizeof(chan_args), (u8 *)&chan_args); }
void rtl92s_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus, u8 ps_qosinfo) { struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); struct h2c_joinbss_rpt_parm joinbss_rpt; joinbss_rpt.opmode = mstatus; joinbss_rpt.ps_qos_info = ps_qosinfo; memcpy(joinbss_rpt.bssid, mac->bssid, ETH_ALEN); joinbss_rpt.bcnitv = cpu_to_le16(mac->vif->bss_conf.beacon_int); joinbss_rpt.aid = cpu_to_le16(mac->assoc_id); _rtl92s_firmware_set_h2c_cmd(hw, H2C_JOINBSSRPT_CMD, sizeof(joinbss_rpt), (u8 *)&joinbss_rpt); }
int rtl92s_set_fw_sitesurvey_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct cfg80211_scan_request *req) { struct h2c_sitesurvey_parm survey_args; memset(&survey_args, 0, sizeof(struct h2c_sitesurvey_parm)); survey_args.bsslimit = cpu_to_le32(48); if (req->n_ssids) { survey_args.active = cpu_to_le32(1); survey_args.ssidlen = cpu_to_le32(req->ssids[0].ssid_len); memcpy(survey_args.ssid, req->ssids[0].ssid, req->ssids[0].ssid_len); } return (int)!_rtl92s_firmware_set_h2c_cmd(hw, H2C_SITESURVEY_CMD, sizeof(survey_args), (u8 *)&survey_args); }
void rtl92s_set_fw_pwrmode_cmd( struct ieee80211_hw *hw, u8 Mode ) { struct rtl_mac *mac = rtl_mac( rtl_priv( hw ) ); struct rtl_ps_ctl *ppsc = rtl_psc( rtl_priv( hw ) ); struct h2c_set_pwrmode_parm pwrmode; u16 max_wakeup_period = 0; pwrmode.mode = Mode; pwrmode.flag_low_traffic_en = 0; pwrmode.flag_lpnav_en = 0; pwrmode.flag_rf_low_snr_en = 0; pwrmode.flag_dps_en = 0; pwrmode.bcn_rx_en = 0; pwrmode.bcn_to = 0; SET_BITS_TO_LE_2BYTE( ( u8 * )( &pwrmode ) + 8, 0, 16, mac->vif->bss_conf.beacon_int ); pwrmode.app_itv = 0; pwrmode.awake_bcn_itvl = ppsc->reg_max_lps_awakeintvl; pwrmode.smart_ps = 1; pwrmode.bcn_pass_period= 10; /* Set beacon pass count */ if ( pwrmode.mode == FW_PS_MIN_MODE ) max_wakeup_period = mac->vif->bss_conf.beacon_int; else if ( pwrmode.mode == FW_PS_MAX_MODE ) max_wakeup_period = mac->vif->bss_conf.beacon_int * mac->vif->bss_conf.dtim_period; if ( max_wakeup_period >= 500 ) pwrmode.bcn_pass_cnt = 1; else if ( ( max_wakeup_period >= 300 ) && ( max_wakeup_period < 500 ) ) pwrmode.bcn_pass_cnt = 2; else if( ( max_wakeup_period >= 200 ) && ( max_wakeup_period < 300 ) ) pwrmode.bcn_pass_cnt = 3; else if ( ( max_wakeup_period >= 20 ) && ( max_wakeup_period < 200 ) ) pwrmode.bcn_pass_cnt = 5; else pwrmode.bcn_pass_cnt = 1; _rtl92s_firmware_set_h2c_cmd( hw ,FW_H2C_SETPWRMODE, ( u8 * )&pwrmode ); }
void rtl92s_set_fw_joinbss_report_cmd( struct ieee80211_hw *hw, u8 mstatus, u8 ps_qosinfo ) { struct rtl_mac *mac = rtl_mac( rtl_priv( hw ) ); struct h2c_joinbss_rpt_parm joinbss_rpt; joinbss_rpt.opmode = mstatus; joinbss_rpt.ps_qos_info = ps_qosinfo; joinbss_rpt.bssid[0] = mac->bssid[0]; joinbss_rpt.bssid[1] = mac->bssid[1]; joinbss_rpt.bssid[2] = mac->bssid[2]; joinbss_rpt.bssid[3] = mac->bssid[3]; joinbss_rpt.bssid[4] = mac->bssid[4]; joinbss_rpt.bssid[5] = mac->bssid[5]; SET_BITS_TO_LE_2BYTE( ( u8 * )( &joinbss_rpt ) + 8, 0, 16, mac->vif->bss_conf.beacon_int ); SET_BITS_TO_LE_2BYTE( ( u8 * )( &joinbss_rpt ) + 10, 0, 16, mac->assoc_id ); _rtl92s_firmware_set_h2c_cmd( hw ,FW_H2C_JOINBSSRPT, ( u8 * )&joinbss_rpt ); }
int rtl92s_set_fw_disconnect_cmd(struct ieee80211_hw *hw) { struct h2c_disconnect_parm disconnect_args = { }; return _rtl92s_firmware_set_h2c_cmd(hw, H2C_DISCONNECT_CMD, sizeof(disconnect_args), (u8 *)&disconnect_args); }