diff --git a/Makefile b/Makefile index 72b81b8..9e2b673 100755 --- a/Makefile +++ b/Makefile @@ -1075,7 +1075,7 @@ EXTRA_CFLAGS += -DDM_ODM_SUPPORT_TYPE=0x04 ifeq ($(CONFIG_PLATFORM_I386_PC), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -SUBARCH := $(shell uname -m | sed -e s/i.86/i386/) +SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ | sed -e s/ppc64le/powerpc/) ARCH ?= $(SUBARCH) CROSS_COMPILE ?= KVER := $(shell uname -r) diff --git a/dkms.conf b/dkms.conf index c23a887..ab54802 100644 --- a/dkms.conf +++ b/dkms.conf @@ -1,5 +1,5 @@ PACKAGE_NAME="realtek-rtl88xxau" -PACKAGE_VERSION="5.2.20.2~20180825" +PACKAGE_VERSION="5.2.20.2~20180827" CLEAN="'make' clean" BUILT_MODULE_NAME[0]=88XXau PROCS_NUM=`nproc` diff --git a/hal/hal_mp.c b/hal/hal_mp.c index bf74a7a..6821e0c 100644 --- a/hal/hal_mp.c +++ b/hal/hal_mp.c @@ -960,7 +960,6 @@ void mpt_SetRFPath_8812A(PADAPTER pAdapter) u8 bandwidth = pmp->bandwidth; u8 eLNA_2g = pHalData->ExternalLNA_2G; u32 ulAntennaTx, ulAntennaRx; - u32 reg0xC50 = 0; ulAntennaTx = pHalData->antenna_tx_path; ulAntennaRx = pHalData->AntennaRxPath; @@ -991,6 +990,7 @@ void mpt_SetRFPath_8812A(PADAPTER pAdapter) } switch (ulAntennaRx) { + u32 reg0xC50; case ANTENNA_A: phy_set_bb_reg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x11); phy_set_rf_reg(pAdapter, RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_B_0x0[19:16] = 1, Standby mode*/ diff --git a/hal/rtl8812a/rtl8812a_hal_init.c b/hal/rtl8812a/rtl8812a_hal_init.c index 51224d7..967c762 100644 --- a/hal/rtl8812a/rtl8812a_hal_init.c +++ b/hal/rtl8812a/rtl8812a_hal_init.c @@ -5917,7 +5917,7 @@ u8 GetHalDefVar8812A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval) break; case HAL_DEF_RX_STBC: - *(u8 *)pval = 1; + *(u8 *)pval = 2; break; case HAL_DEF_EXPLICIT_BEAMFORMER: diff --git a/os_dep/linux/ioctl_cfg80211.c b/os_dep/linux/ioctl_cfg80211.c index 3f1ddaf..7701150 100644 --- a/os_dep/linux/ioctl_cfg80211.c +++ b/os_dep/linux/ioctl_cfg80211.c @@ -5523,6 +5523,111 @@ static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev, } +static int cfg80211_rtw_get_channel(struct wiphy *wiphy, struct wireless_dev *wdev, struct cfg80211_chan_def *chandef){ + _adapter *padapter= wiphy_to_adapter(wiphy); + int channel; + int control_freq; + int center_freq; + int center_freq2 = 0; + int width; + int band; + int bandWidth; + int offset; + struct dvobj_priv *dvobj; + struct net_device *ndev = wdev->netdev; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + if (!ndev) + return -ENODEV; + offset = rtw_get_oper_choffset(padapter); + center_freq = channel = adapter_to_dvobj(padapter)->oper_channel; + if (channel >= 1) { + switch (pHalData->current_band_type) { + case 0: + band = NL80211_BAND_2GHZ; + break; + case 1: + band = NL80211_BAND_5GHZ; + break; + default: + return -EINVAL; + } + control_freq = ieee80211_channel_to_frequency(channel, band); + dvobj=adapter_to_dvobj(padapter); + if (dvobj!=NULL) { + bandWidth = adapter_to_dvobj(padapter)->oper_bwmode; + //DBG_871X("%s bw %d\n", __func__,adapter_to_dvobj(padapter)->oper_bwmode); + } else { + bandWidth = pHalData->current_channel_bw; + //DBG_871X("%s dvobj null\n", __func__); + } + switch(pHalData->current_channel_bw){ + case CHANNEL_WIDTH_20: + //DBG_871X("%s width 20\n", __func__); + width = NL80211_CHAN_WIDTH_20; + center_freq = control_freq; + break; + case CHANNEL_WIDTH_40: + //DBG_871X("%s width 40\n", __func__); + width = NL80211_CHAN_WIDTH_40; + if (offset==HAL_PRIME_CHNL_OFFSET_LOWER) { + center_freq = control_freq +10; + } else { + center_freq = control_freq -10; + } + break; + case CHANNEL_WIDTH_80: + //DBG_871X("%s width 80\n", __func__); + width = NL80211_CHAN_WIDTH_80; + if (offset==HAL_PRIME_CHNL_OFFSET_LOWER) { + center_freq = control_freq +30; + } else { + center_freq = control_freq -30; + } + break; + case CHANNEL_WIDTH_160: + //DBG_871X("%s width 160\n", __func__); + width = NL80211_CHAN_WIDTH_160; + if (offset==HAL_PRIME_CHNL_OFFSET_LOWER) { + center_freq = control_freq +50; + } else { + center_freq = control_freq -50; + } + break; + case CHANNEL_WIDTH_80_80: + //DBG_871X("%s width 80x80\n", __func__); + width = NL80211_CHAN_WIDTH_80P80; + if (offset==HAL_PRIME_CHNL_OFFSET_LOWER) { + center_freq = control_freq +30; + center_freq2=center_freq+80; + } else { + center_freq = control_freq -30; + center_freq2=center_freq-80; + } + break; + case CHANNEL_WIDTH_MAX: + //DBG_871X("%s width max\n", __func__); + width = NL80211_CHAN_WIDTH_160; + break; + } + chandef->chan = ieee80211_get_channel(wiphy, control_freq); + if (chandef->chan == NULL) { + chandef->chan = ieee80211_get_channel(wiphy, ieee80211_channel_to_frequency(channel, band)); + //DBG_871X("%s chan null\n", __func__); + if (chandef->chan == NULL) { + //DBG_871X("%s chan null\n", __func__); + return -EINVAL; + } + } + chandef->width = width; + chandef->center_freq1 = center_freq; + chandef->center_freq2 = center_freq2; + //DBG_871X("%s : channel %d width %d freq1 %d freq2 %d center_freq %d offset %d\n", __func__, channel, width, chandef->center_freq1, chandef->center_freq2, chandef->chan->center_freq,rtw_get_oper_choffset(padapter)); + } else { + return -EINVAL; + } + return 0; +} + static int cfg80211_rtw_set_channel(struct wiphy *wiphy #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) , struct net_device *ndev @@ -8798,7 +8903,13 @@ static void rtw_cfg80211_init_ht_capab(_adapter *padapter ht_cap->ht_supported = _TRUE; - ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | + /* According to the comment in rtw_ap.c: + * "Note: currently we switch to the MIXED op mode if HT non-greenfield + * station is associated. Probably it's a theoretical case, since + * it looks like all known HT STAs support greenfield." + * Therefore Greenfield is added to ht_cap + */ + ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU; rtw_cfg80211_init_ht_capab_ex(padapter, ht_cap, band, rf_type); @@ -8883,6 +8994,75 @@ void rtw_cfg80211_init_wdev_data(_adapter *padapter) #endif } +static void rtw_cfg80211_init_vht_capab_ex(_adapter *padapter, struct ieee80211_sta_vht_cap *vht_cap, u8 rf_type) +{ +//todo: Support for other bandwidths +/* NSS = Number of Spatial Streams */ +#define MAX_BIT_RATE_80MHZ_NSS3 1300 /* Mbps */ +#define MAX_BIT_RATE_80MHZ_NSS2 867 /* Mbps */ +#define MAX_BIT_RATE_80MHZ_NSS1 434 /* Mbps */ + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; + rtw_vht_use_default_setting(padapter); + /* RX LDPC */ + if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX)) + vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC; + /* TX STBC */ + if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX)) + vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC; + /* RX STBC */ + if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_RX)) { + switch (rf_type) { + case RF_1T1R: + vht_cap->cap |= IEEE80211_VHT_CAP_RXSTBC_1;/*RX STBC One spatial stream*/ + break; + case RF_2T2R: + case RF_1T2R: + vht_cap->cap |= IEEE80211_VHT_CAP_RXSTBC_2;/*RX STBC Two spatial streams*/ + break; + case RF_3T3R: + case RF_3T4R: + case RF_4T4R: + vht_cap->cap |= IEEE80211_VHT_CAP_RXSTBC_3;/*RX STBC Three spatial streams*/ + break; + default: + /* DBG_871X("[warning] rf_type %d is not expected\n", rf_type); */ + break; + } + } + /* switch (rf_type) { + case RF_1T1R: + vht_cap->vht_mcs.tx_highest = MAX_BIT_RATE_80MHZ_NSS1; + vht_cap->vht_mcs.rx_highest = MAX_BIT_RATE_80MHZ_NSS1; + break; + case RF_2T2R: + case RF_1T2R: + vht_cap->vht_mcs.tx_highest = MAX_BIT_RATE_80MHZ_NSS2; + vht_cap->vht_mcs.rx_highest = MAX_BIT_RATE_80MHZ_NSS2; + break; + case RF_3T3R: + case RF_3T4R: + case RF_4T4R: + vht_cap->vht_mcs.tx_highest = MAX_BIT_RATE_80MHZ_NSS3; + vht_cap->vht_mcs.rx_highest = MAX_BIT_RATE_80MHZ_NSS3; + break; + default: + DBG_871X("[warning] rf_type %d is not expected\n", rf_type); + break; + } */ + /* MCS map */ + vht_cap->vht_mcs.tx_mcs_map = pvhtpriv->vht_mcs_map[0] | (pvhtpriv->vht_mcs_map[1] << 8); + vht_cap->vht_mcs.rx_mcs_map = vht_cap->vht_mcs.tx_mcs_map; + if (rf_type == RF_1T1R) { + vht_cap->vht_mcs.tx_highest = MAX_BIT_RATE_80MHZ_NSS1; + vht_cap->vht_mcs.rx_highest = MAX_BIT_RATE_80MHZ_NSS1; + } + if (pvhtpriv->sgi_80m) + vht_cap->cap |= IEEE80211_VHT_CAP_SHORT_GI_80; + vht_cap->cap |= (pvhtpriv->ampdu_len << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT); +} + void rtw_cfg80211_init_wiphy(_adapter *padapter) { u8 rf_type; @@ -9381,6 +9561,7 @@ static struct cfg80211_ops rtw_cfg80211_ops = { .suspend = cfg80211_rtw_suspend, .resume = cfg80211_rtw_resume, #endif /* CONFIG_PNO_SUPPORT */ + .get_channel = cfg80211_rtw_get_channel, #ifdef CONFIG_RFKILL_POLL .rfkill_poll = cfg80211_rtw_rfkill_poll, #endif diff --git a/os_dep/linux/usb_intf.c b/os_dep/linux/usb_intf.c index 90184e8..52d8258 100644 --- a/os_dep/linux/usb_intf.c +++ b/os_dep/linux/usb_intf.c @@ -664,24 +664,7 @@ static int usb_reprobe_switch_usb_mode(PADAPTER Adapter) if (registry_par->switch_usb_mode == 0) goto exit; -#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A) - if (IS_HIGH_SPEED_USB(Adapter)) { - if ((rtw_read8(Adapter, 0x74) & (BIT(2)|BIT(3))) != BIT(3)) { - rtw_write8(Adapter, 0x74, 0x8); - rtw_write8(Adapter, 0x70, 0x2); - rtw_write8(Adapter, 0x3e, 0x1); - rtw_write8(Adapter, 0x3d, 0x3); - /* usb disconnect */ - rtw_write8(Adapter, 0x5, 0x80); - ret = _TRUE; - } - } else if (IS_SUPER_SPEED_USB(Adapter)) { - rtw_write8(Adapter, 0x70, rtw_read8(Adapter, 0x70) & (~BIT(1))); - rtw_write8(Adapter, 0x3e, rtw_read8(Adapter, 0x3e) & (~BIT(0))); - } -#else rtw_hal_set_hwreg(Adapter, HW_VAR_USB_MODE, &ret); -#endif exit: return ret;