Beispiel #1
0
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);
}
Beispiel #2
0
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;
	}
}
Beispiel #3
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);
}
Beispiel #4
0
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);
}
Beispiel #5
0
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);
}
Beispiel #6
0
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);
}
Beispiel #7
0
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);
}
Beispiel #8
0
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);
}
Beispiel #9
0
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);
}
Beispiel #10
0
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 );

}
Beispiel #11
0
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 );
}
Beispiel #12
0
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);
}