forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 434
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
staging: r8188eu: Add files for new driver - part 15
This commit adds files hal/rtl8188e_rxdesc.c, hal/rtl8188e_sreset.c, and hal/rtl8188e_xmit.c. Signed-off-by: Larry Finger <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
- Loading branch information
Showing
3 changed files
with
373 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,202 @@ | ||
/****************************************************************************** | ||
* | ||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of version 2 of the GNU General Public License as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, but WITHOUT | ||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
* more details. | ||
* | ||
* You should have received a copy of the GNU General Public License along with | ||
* this program; if not, write to the Free Software Foundation, Inc., | ||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA | ||
* | ||
* | ||
******************************************************************************/ | ||
#define _RTL8188E_REDESC_C_ | ||
|
||
#include <osdep_service.h> | ||
#include <drv_types.h> | ||
#include <rtl8188e_hal.h> | ||
|
||
static void process_rssi(struct adapter *padapter, union recv_frame *prframe) | ||
{ | ||
struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; | ||
struct signal_stat *signal_stat = &padapter->recvpriv.signal_strength_data; | ||
|
||
if (signal_stat->update_req) { | ||
signal_stat->total_num = 0; | ||
signal_stat->total_val = 0; | ||
signal_stat->update_req = 0; | ||
} | ||
|
||
signal_stat->total_num++; | ||
signal_stat->total_val += pattrib->phy_info.SignalStrength; | ||
signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; | ||
} /* Process_UI_RSSI_8192C */ | ||
|
||
static void process_link_qual(struct adapter *padapter, union recv_frame *prframe) | ||
{ | ||
struct rx_pkt_attrib *pattrib; | ||
struct signal_stat *signal_stat; | ||
|
||
if (prframe == NULL || padapter == NULL) | ||
return; | ||
|
||
pattrib = &prframe->u.hdr.attrib; | ||
signal_stat = &padapter->recvpriv.signal_qual_data; | ||
|
||
if (signal_stat->update_req) { | ||
signal_stat->total_num = 0; | ||
signal_stat->total_val = 0; | ||
signal_stat->update_req = 0; | ||
} | ||
|
||
signal_stat->total_num++; | ||
signal_stat->total_val += pattrib->phy_info.SignalQuality; | ||
signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; | ||
} | ||
|
||
void rtl8188e_process_phy_info(struct adapter *padapter, void *prframe) | ||
{ | ||
union recv_frame *precvframe = (union recv_frame *)prframe; | ||
|
||
/* Check RSSI */ | ||
process_rssi(padapter, precvframe); | ||
/* Check EVM */ | ||
process_link_qual(padapter, precvframe); | ||
} | ||
|
||
void update_recvframe_attrib_88e(union recv_frame *precvframe, struct recv_stat *prxstat) | ||
{ | ||
struct rx_pkt_attrib *pattrib; | ||
struct recv_stat report; | ||
|
||
report.rxdw0 = prxstat->rxdw0; | ||
report.rxdw1 = prxstat->rxdw1; | ||
report.rxdw2 = prxstat->rxdw2; | ||
report.rxdw3 = prxstat->rxdw3; | ||
report.rxdw4 = prxstat->rxdw4; | ||
report.rxdw5 = prxstat->rxdw5; | ||
|
||
pattrib = &precvframe->u.hdr.attrib; | ||
_rtw_memset(pattrib, 0, sizeof(struct rx_pkt_attrib)); | ||
|
||
pattrib->crc_err = (u8)((le32_to_cpu(report.rxdw0) >> 14) & 0x1);;/* u8)prxreport->crc32; */ | ||
|
||
/* update rx report to recv_frame attribute */ | ||
pattrib->pkt_rpt_type = (u8)((le32_to_cpu(report.rxdw3) >> 14) & 0x3);/* prxreport->rpt_sel; */ | ||
|
||
if (pattrib->pkt_rpt_type == NORMAL_RX) { /* Normal rx packet */ | ||
pattrib->pkt_len = (u16)(le32_to_cpu(report.rxdw0) & 0x00003fff);/* u16)prxreport->pktlen; */ | ||
pattrib->drvinfo_sz = (u8)((le32_to_cpu(report.rxdw0) >> 16) & 0xf) * 8;/* u8)(prxreport->drvinfosize << 3); */ | ||
|
||
pattrib->physt = (u8)((le32_to_cpu(report.rxdw0) >> 26) & 0x1);/* u8)prxreport->physt; */ | ||
|
||
pattrib->bdecrypted = (le32_to_cpu(report.rxdw0) & BIT(27)) ? 0 : 1;/* u8)(prxreport->swdec ? 0 : 1); */ | ||
pattrib->encrypt = (u8)((le32_to_cpu(report.rxdw0) >> 20) & 0x7);/* u8)prxreport->security; */ | ||
|
||
pattrib->qos = (u8)((le32_to_cpu(report.rxdw0) >> 23) & 0x1);/* u8)prxreport->qos; */ | ||
pattrib->priority = (u8)((le32_to_cpu(report.rxdw1) >> 8) & 0xf);/* u8)prxreport->tid; */ | ||
|
||
pattrib->amsdu = (u8)((le32_to_cpu(report.rxdw1) >> 13) & 0x1);/* u8)prxreport->amsdu; */ | ||
|
||
pattrib->seq_num = (u16)(le32_to_cpu(report.rxdw2) & 0x00000fff);/* u16)prxreport->seq; */ | ||
pattrib->frag_num = (u8)((le32_to_cpu(report.rxdw2) >> 12) & 0xf);/* u8)prxreport->frag; */ | ||
pattrib->mfrag = (u8)((le32_to_cpu(report.rxdw1) >> 27) & 0x1);/* u8)prxreport->mf; */ | ||
pattrib->mdata = (u8)((le32_to_cpu(report.rxdw1) >> 26) & 0x1);/* u8)prxreport->md; */ | ||
|
||
pattrib->mcs_rate = (u8)(le32_to_cpu(report.rxdw3) & 0x3f);/* u8)prxreport->rxmcs; */ | ||
pattrib->rxht = (u8)((le32_to_cpu(report.rxdw3) >> 6) & 0x1);/* u8)prxreport->rxht; */ | ||
|
||
pattrib->icv_err = (u8)((le32_to_cpu(report.rxdw0) >> 15) & 0x1);/* u8)prxreport->icverr; */ | ||
pattrib->shift_sz = (u8)((le32_to_cpu(report.rxdw0) >> 24) & 0x3); | ||
} else if (pattrib->pkt_rpt_type == TX_REPORT1) { /* CCX */ | ||
pattrib->pkt_len = TX_RPT1_PKT_LEN; | ||
pattrib->drvinfo_sz = 0; | ||
} else if (pattrib->pkt_rpt_type == TX_REPORT2) { /* TX RPT */ | ||
pattrib->pkt_len = (u16)(le32_to_cpu(report.rxdw0) & 0x3FF);/* Rx length[9:0] */ | ||
pattrib->drvinfo_sz = 0; | ||
|
||
/* */ | ||
/* Get TX report MAC ID valid. */ | ||
/* */ | ||
pattrib->MacIDValidEntry[0] = le32_to_cpu(report.rxdw4); | ||
pattrib->MacIDValidEntry[1] = le32_to_cpu(report.rxdw5); | ||
|
||
} else if (pattrib->pkt_rpt_type == HIS_REPORT) { /* USB HISR RPT */ | ||
pattrib->pkt_len = (u16)(le32_to_cpu(report.rxdw0) & 0x00003fff);/* u16)prxreport->pktlen; */ | ||
} | ||
} | ||
|
||
/* | ||
* Notice: | ||
* Before calling this function, | ||
* precvframe->u.hdr.rx_data should be ready! | ||
*/ | ||
void update_recvframe_phyinfo_88e(union recv_frame *precvframe, struct phy_stat *pphy_status) | ||
{ | ||
struct adapter *padapter = precvframe->u.hdr.adapter; | ||
struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib; | ||
struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); | ||
struct odm_phy_status_info *pPHYInfo = (struct odm_phy_status_info *)(&pattrib->phy_info); | ||
u8 *wlanhdr; | ||
struct odm_per_pkt_info pkt_info; | ||
u8 *sa = NULL; | ||
struct sta_priv *pstapriv; | ||
struct sta_info *psta; | ||
|
||
pkt_info.bPacketMatchBSSID = false; | ||
pkt_info.bPacketToSelf = false; | ||
pkt_info.bPacketBeacon = false; | ||
|
||
wlanhdr = get_recvframe_data(precvframe); | ||
|
||
pkt_info.bPacketMatchBSSID = ((!IsFrameTypeCtrl(wlanhdr)) && | ||
!pattrib->icv_err && !pattrib->crc_err && | ||
_rtw_memcmp(get_hdr_bssid(wlanhdr), | ||
get_bssid(&padapter->mlmepriv), ETH_ALEN)); | ||
|
||
pkt_info.bPacketToSelf = pkt_info.bPacketMatchBSSID && | ||
(_rtw_memcmp(get_da(wlanhdr), | ||
myid(&padapter->eeprompriv), ETH_ALEN)); | ||
|
||
pkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID && | ||
(GetFrameSubType(wlanhdr) == WIFI_BEACON); | ||
|
||
if (pkt_info.bPacketBeacon) { | ||
if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE)) | ||
sa = padapter->mlmepriv.cur_network.network.MacAddress; | ||
/* to do Ad-hoc */ | ||
} else { | ||
sa = get_sa(wlanhdr); | ||
} | ||
|
||
pstapriv = &padapter->stapriv; | ||
pkt_info.StationID = 0xFF; | ||
psta = rtw_get_stainfo(pstapriv, sa); | ||
if (psta) | ||
pkt_info.StationID = psta->mac_id; | ||
pkt_info.Rate = pattrib->mcs_rate; | ||
|
||
ODM_PhyStatusQuery(&pHalData->odmpriv, pPHYInfo, (u8 *)pphy_status, &(pkt_info)); | ||
|
||
precvframe->u.hdr.psta = NULL; | ||
if (pkt_info.bPacketMatchBSSID && | ||
(check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE))) { | ||
if (psta) { | ||
precvframe->u.hdr.psta = psta; | ||
rtl8188e_process_phy_info(padapter, precvframe); | ||
} | ||
} else if (pkt_info.bPacketToSelf || pkt_info.bPacketBeacon) { | ||
if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) { | ||
if (psta) | ||
precvframe->u.hdr.psta = psta; | ||
} | ||
rtl8188e_process_phy_info(padapter, precvframe); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
/****************************************************************************** | ||
* | ||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of version 2 of the GNU General Public License as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, but WITHOUT | ||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
* more details. | ||
* | ||
* You should have received a copy of the GNU General Public License along with | ||
* this program; if not, write to the Free Software Foundation, Inc., | ||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA | ||
* | ||
* | ||
******************************************************************************/ | ||
#define _RTL8188E_SRESET_C_ | ||
|
||
#include <rtl8188e_sreset.h> | ||
#include <rtl8188e_hal.h> | ||
|
||
void rtl8188e_silentreset_for_specific_platform(struct adapter *padapter) | ||
{ | ||
} | ||
|
||
void rtl8188e_sreset_xmit_status_check(struct adapter *padapter) | ||
{ | ||
struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); | ||
struct sreset_priv *psrtpriv = &pHalData->srestpriv; | ||
|
||
unsigned long current_time; | ||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv; | ||
unsigned int diff_time; | ||
u32 txdma_status; | ||
|
||
txdma_status = rtw_read32(padapter, REG_TXDMA_STATUS); | ||
if (txdma_status != 0x00) { | ||
DBG_88E("%s REG_TXDMA_STATUS:0x%08x\n", __func__, txdma_status); | ||
rtw_write32(padapter, REG_TXDMA_STATUS, txdma_status); | ||
rtl8188e_silentreset_for_specific_platform(padapter); | ||
} | ||
/* total xmit irp = 4 */ | ||
current_time = rtw_get_current_time(); | ||
if (0 == pxmitpriv->free_xmitbuf_cnt) { | ||
diff_time = jiffies_to_msecs(current_time - psrtpriv->last_tx_time); | ||
|
||
if (diff_time > 2000) { | ||
if (psrtpriv->last_tx_complete_time == 0) { | ||
psrtpriv->last_tx_complete_time = current_time; | ||
} else { | ||
diff_time = jiffies_to_msecs(current_time - psrtpriv->last_tx_complete_time); | ||
if (diff_time > 4000) { | ||
DBG_88E("%s tx hang\n", __func__); | ||
rtl8188e_silentreset_for_specific_platform(padapter); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
void rtl8188e_sreset_linked_status_check(struct adapter *padapter) | ||
{ | ||
u32 rx_dma_status = 0; | ||
u8 fw_status = 0; | ||
rx_dma_status = rtw_read32(padapter, REG_RXDMA_STATUS); | ||
if (rx_dma_status != 0x00) { | ||
DBG_88E("%s REG_RXDMA_STATUS:0x%08x\n", __func__, rx_dma_status); | ||
rtw_write32(padapter, REG_RXDMA_STATUS, rx_dma_status); | ||
} | ||
fw_status = rtw_read8(padapter, REG_FMETHR); | ||
if (fw_status != 0x00) { | ||
if (fw_status == 1) | ||
DBG_88E("%s REG_FW_STATUS (0x%02x), Read_Efuse_Fail !!\n", __func__, fw_status); | ||
else if (fw_status == 2) | ||
DBG_88E("%s REG_FW_STATUS (0x%02x), Condition_No_Match !!\n", __func__, fw_status); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
/****************************************************************************** | ||
* | ||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of version 2 of the GNU General Public License as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, but WITHOUT | ||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
* more details. | ||
* | ||
* You should have received a copy of the GNU General Public License along with | ||
* this program; if not, write to the Free Software Foundation, Inc., | ||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA | ||
* | ||
* | ||
******************************************************************************/ | ||
#define _RTL8188E_XMIT_C_ | ||
|
||
#include <osdep_service.h> | ||
#include <drv_types.h> | ||
#include <rtl8188e_hal.h> | ||
|
||
void dump_txrpt_ccx_88e(void *buf) | ||
{ | ||
struct txrpt_ccx_88e *txrpt_ccx = (struct txrpt_ccx_88e *)buf; | ||
|
||
DBG_88E("%s:\n" | ||
"tag1:%u, pkt_num:%u, txdma_underflow:%u, int_bt:%u, int_tri:%u, int_ccx:%u\n" | ||
"mac_id:%u, pkt_ok:%u, bmc:%u\n" | ||
"retry_cnt:%u, lifetime_over:%u, retry_over:%u\n" | ||
"ccx_qtime:%u\n" | ||
"final_data_rate:0x%02x\n" | ||
"qsel:%u, sw:0x%03x\n", | ||
__func__, txrpt_ccx->tag1, txrpt_ccx->pkt_num, | ||
txrpt_ccx->txdma_underflow, txrpt_ccx->int_bt, | ||
txrpt_ccx->int_tri, txrpt_ccx->int_ccx, | ||
txrpt_ccx->mac_id, txrpt_ccx->pkt_ok, txrpt_ccx->bmc, | ||
txrpt_ccx->retry_cnt, txrpt_ccx->lifetime_over, | ||
txrpt_ccx->retry_over, txrpt_ccx_qtime_88e(txrpt_ccx), | ||
txrpt_ccx->final_data_rate, txrpt_ccx->qsel, | ||
txrpt_ccx_sw_88e(txrpt_ccx) | ||
); | ||
} | ||
|
||
void handle_txrpt_ccx_88e(struct adapter *adapter, u8 *buf) | ||
{ | ||
struct txrpt_ccx_88e *txrpt_ccx = (struct txrpt_ccx_88e *)buf; | ||
|
||
if (txrpt_ccx->int_ccx) { | ||
if (txrpt_ccx->pkt_ok) | ||
rtw_ack_tx_done(&adapter->xmitpriv, | ||
RTW_SCTX_DONE_SUCCESS); | ||
else | ||
rtw_ack_tx_done(&adapter->xmitpriv, | ||
RTW_SCTX_DONE_CCX_PKT_FAIL); | ||
} | ||
} | ||
|
||
void _dbg_dump_tx_info(struct adapter *padapter, int frame_tag, | ||
struct tx_desc *ptxdesc) | ||
{ | ||
u8 dmp_txpkt; | ||
bool dump_txdesc = false; | ||
rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DUMP_TXPKT, &(dmp_txpkt)); | ||
|
||
if (dmp_txpkt == 1) {/* dump txdesc for data frame */ | ||
DBG_88E("dump tx_desc for data frame\n"); | ||
if ((frame_tag & 0x0f) == DATA_FRAMETAG) | ||
dump_txdesc = true; | ||
} else if (dmp_txpkt == 2) {/* dump txdesc for mgnt frame */ | ||
DBG_88E("dump tx_desc for mgnt frame\n"); | ||
if ((frame_tag & 0x0f) == MGNT_FRAMETAG) | ||
dump_txdesc = true; | ||
} | ||
|
||
if (dump_txdesc) { | ||
DBG_88E("=====================================\n"); | ||
DBG_88E("txdw0(0x%08x)\n", ptxdesc->txdw0); | ||
DBG_88E("txdw1(0x%08x)\n", ptxdesc->txdw1); | ||
DBG_88E("txdw2(0x%08x)\n", ptxdesc->txdw2); | ||
DBG_88E("txdw3(0x%08x)\n", ptxdesc->txdw3); | ||
DBG_88E("txdw4(0x%08x)\n", ptxdesc->txdw4); | ||
DBG_88E("txdw5(0x%08x)\n", ptxdesc->txdw5); | ||
DBG_88E("txdw6(0x%08x)\n", ptxdesc->txdw6); | ||
DBG_88E("txdw7(0x%08x)\n", ptxdesc->txdw7); | ||
DBG_88E("=====================================\n"); | ||
} | ||
} |