/* * Todo: align address to 4 bytes. */ s32 sdio_local_write( PADAPTER padapter, u32 addr, u32 cnt, u8 *pbuf) { PSDIO_DATA psdio; u8 bMacPwrCtrlOn; s32 err; u8 *ptmpbuf; if(addr & 0x3) DBG_8192C("%s, address must be 4 bytes alignment\n", __FUNCTION__); if(cnt & 0x3) DBG_8192C("%s, size must be the multiple of 4 \n", __FUNCTION__); psdio = &adapter_to_dvobj(padapter)->intf_data; HalSdioGetCmdAddr8723ASdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); if ((_FALSE == bMacPwrCtrlOn) #ifdef CONFIG_LPS_LCLK || (_TRUE == padapter->pwrctrlpriv.bFwCurrentInPSMode) #endif ) { err = sd_cmd52_write(psdio, addr, cnt, pbuf); return err; } ptmpbuf = (u8*)rtw_malloc(cnt); if (!ptmpbuf) return (-1); _rtw_memcpy(ptmpbuf, pbuf, cnt); err = sd_write(psdio, addr, cnt, ptmpbuf); if (ptmpbuf) rtw_mfree(ptmpbuf, cnt); return err; }
/*API be created temporary for MI, caller is interrupt-handler, PCIE's interrupt handler cannot apply to multi-AP*/ _adapter *rtw_mi_get_ap_adapter(_adapter *padapter) { struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); int i; _adapter *iface = NULL; for (i = 0; i < dvobj->iface_nums; i++) { iface = dvobj->padapters[i]; if (!iface) continue; if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE) == _TRUE && check_fwstate(&iface->mlmepriv, WIFI_ASOC_STATE) == _TRUE) break; } return iface; }
s32 rtl8192de_init_xmit_priv(_adapter *padapter) { s32 ret = _SUCCESS; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); _rtw_spinlock_init(&pdvobjpriv->irq_th_lock); //_rtw_spinlock_init(&pHalData->rf_lock); #ifdef PLATFORM_LINUX tasklet_init(&pxmitpriv->xmit_tasklet, (void(*)(unsigned long))rtl8192de_xmit_tasklet, (unsigned long)padapter); #endif return ret; }
u8 rtw_mi_traffic_statistics(_adapter *padapter) { struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); /*_rtw_memset(&pdvobjpriv->traffic_stat, 0, sizeof(struct rtw_traffic_statistics));*/ /* Tx bytes reset*/ pdvobjpriv->traffic_stat.tx_bytes = 0; pdvobjpriv->traffic_stat.tx_pkts = 0; pdvobjpriv->traffic_stat.tx_drop = 0; /* Rx bytes reset*/ pdvobjpriv->traffic_stat.rx_bytes = 0; pdvobjpriv->traffic_stat.rx_pkts = 0; pdvobjpriv->traffic_stat.rx_drop = 0; return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_traffic_statistics); }
s32 rtl8723bs_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe) { s32 ret = _SUCCESS; struct pkt_attrib *pattrib; struct xmit_buf *pxmitbuf; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); u8 *pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; u8 txdesc_size = TXDESC_SIZE; RT_TRACE(_module_hal_xmit_c_, _drv_info_, ("+%s\n", __FUNCTION__)); pattrib = &pmgntframe->attrib; pxmitbuf = pmgntframe->pxmitbuf; rtl8723b_update_txdesc(pmgntframe, pmgntframe->buf_addr); pxmitbuf->len = txdesc_size + pattrib->last_txcmdsz; //pmgntframe->pg_num = (pxmitbuf->len + 127)/128; // 128 is tx page size pxmitbuf->pg_num = (pxmitbuf->len + 127)/128; // 128 is tx page size pxmitbuf->ptail = pmgntframe->buf_addr + pxmitbuf->len; pxmitbuf->ff_hwaddr = rtw_get_ff_hwaddr(pmgntframe); rtw_count_tx_stats(padapter, pmgntframe, pattrib->last_txcmdsz); rtw_free_xmitframe(pxmitpriv, pmgntframe); pxmitbuf->priv_data = NULL; if(GetFrameSubType(pframe)==WIFI_BEACON) //dump beacon directly { ret = rtw_write_port(padapter, pdvobjpriv->Queue2Pipe[pxmitbuf->ff_hwaddr], pxmitbuf->len, (u8 *)pxmitbuf); if (ret != _SUCCESS) rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_WRITE_PORT_ERR); rtw_free_xmitbuf(pxmitpriv, pxmitbuf); } else { enqueue_pending_xmitbuf(pxmitpriv, pxmitbuf); } return ret; }
_adapter *rtw_get_iface_by_macddr(_adapter *padapter, u8 *mac_addr) { int i; _adapter *iface = NULL; u8 bmatch = _FALSE; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); for (i = 0; i < dvobj->iface_nums; i++) { iface = dvobj->padapters[i]; if ((iface) && (_rtw_memcmp(mac_addr, adapter_mac_addr(iface), ETH_ALEN))) { bmatch = _TRUE; break; } } if (bmatch) return iface; else return NULL; }
uint rtw_hal_init(_adapter *padapter) { uint status = _SUCCESS; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); int i; status = padapter->HalFunc.hal_init(padapter); if(status == _SUCCESS){ for (i = 0; i<dvobj->iface_nums; i++) dvobj->padapters[i]->hw_init_completed = _TRUE; if (padapter->registrypriv.notch_filter == 1) rtw_hal_notch_filter(padapter, 1); rtw_hal_reset_security_engine(padapter); for (i = 0; i<dvobj->iface_nums; i++) rtw_sec_restore_wep_key(dvobj->padapters[i]); rtw_led_control(padapter, LED_CTL_POWER_ON); init_hw_mlme_ext(padapter); rtw_hal_init_opmode(padapter); #ifdef CONFIG_RF_GAIN_OFFSET rtw_bb_rf_gain_offset(padapter); #endif //CONFIG_RF_GAIN_OFFSET } else{ for (i = 0; i<dvobj->iface_nums; i++) dvobj->padapters[i]->hw_init_completed = _FALSE; DBG_871X("rtw_hal_init: hal__init fail\n"); } RT_TRACE(_module_hal_init_c_,_drv_err_,("-rtl871x_hal_init:status=0x%x\n",status)); return status; }
void rtw_hal_def_value_init(_adapter *padapter) { if (is_primary_adapter(padapter)) { padapter->HalFunc.init_default_value(padapter); rtw_init_hal_com_default_value(padapter); { struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter); /* hal_spec is ready here */ dvobj->macid_ctl.num = rtw_min(hal_spec->macid_num, MACID_NUM_SW_LIMIT); dvobj->cam_ctl.sec_cap = hal_spec->sec_cap; dvobj->cam_ctl.num = rtw_min(hal_spec->sec_cam_ent_num, SEC_CAM_ENT_NUM_SW_LIMIT); } } }
_adapter *rtw_get_iface_by_hwport(_adapter *padapter, u8 hw_port) { int i; _adapter *iface = NULL; u8 bmatch = _FALSE; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); for (i = 0; i < dvobj->iface_nums; i++) { iface = dvobj->padapters[i]; if ((iface) && (hw_port == iface->hw_port)) { bmatch = _TRUE; break; } } if (bmatch) return iface; else return NULL; }
static u8 _rtw_mi_dequeue_writeport(_adapter *padapter , bool exclude_self) { int i; u8 queue_empty = _TRUE; _adapter *iface; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); for (i = 0; i < dvobj->iface_nums; i++) { iface = dvobj->padapters[i]; if ((iface) && rtw_is_adapter_up(iface)) { if ((exclude_self) && (iface == padapter)) continue; queue_empty &= _dequeue_writeport(iface); } } return queue_empty; }
static void sd_recv_loopback(PADAPTER padapter, u32 size) { PLOOPBACKDATA ploopback; u32 readsize, allocsize; u8 *preadbuf; readsize = size; DBG_8192C("%s: read size=%d\n", __func__, readsize); allocsize = _RND(readsize, adapter_to_dvobj(padapter)->intf_data.block_transfer_len); ploopback = padapter->ploopback; if (ploopback) { ploopback->rxsize = readsize; preadbuf = ploopback->rxbuf; } else { preadbuf = rtw_malloc(allocsize); if (preadbuf == NULL) { DBG_8192C("%s: malloc fail size=%d\n", __func__, allocsize); return; } } // rtw_read_port(padapter, WLAN_RX0FF_DEVICE_ID, readsize, preadbuf); sdio_read_port(&padapter->iopriv.intf, WLAN_RX0FF_DEVICE_ID, readsize, preadbuf); if (ploopback) _rtw_up_sema(&ploopback->sema); else { u32 i; DBG_8192C("%s: drop pkt\n", __func__); for (i = 0; i < readsize; i+=4) { DBG_8192C("%08X", *(u32*)(preadbuf + i)); if ((i+4) & 0x1F) printk(" "); else printk("\n"); } printk("\n"); rtw_mfree(preadbuf, allocsize); } }
/* * Todo: align address to 4 bytes. */ s32 sdio_local_read( PADAPTER padapter, u32 addr, u32 cnt, u8 *pbuf) { PSDIO_DATA psdio; u8 bMacPwrCtrlOn; s32 err; u8 *ptmpbuf; u32 n; psdio = &adapter_to_dvobj(padapter)->intf_data; HalSdioGetCmdAddr8723ASdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); if ((_FALSE == bMacPwrCtrlOn) #ifdef CONFIG_LPS_LCLK || (_TRUE == padapter->pwrctrlpriv.bFwCurrentInPSMode) #endif ) { err = sd_cmd52_read(psdio, addr, cnt, pbuf); return err; } n = RND4(cnt); ptmpbuf = (u8*)rtw_malloc(n); if (!ptmpbuf) return (-1); err = sd_read(psdio, addr, n, ptmpbuf); if (!err) _rtw_memcpy(pbuf, ptmpbuf, cnt); if (ptmpbuf) rtw_mfree(ptmpbuf, n); return err; }
int proc_get_trx_info(char *page, char **start, off_t offset, int count, int *eof, void *data) { int i; struct net_device *dev = data; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct recv_priv *precvpriv = &padapter->recvpriv; struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); struct hw_xmit *phwxmit; int len = 0; len += snprintf(page + len, count - len, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d" ", free_ext_xmitbuf_cnt=%d, free_xframe_ext_cnt=%d" ", free_recvframe_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt, pxmitpriv->free_xmit_extbuf_cnt, pxmitpriv->free_xframe_ext_cnt, precvpriv->free_recvframe_cnt); #ifdef CONFIG_USB_HCI len += snprintf(page + len, count - len, "rx_urb_pending_cnt=%d\n", precvpriv->rx_pending_cnt); #endif len += snprintf(page + len, count - len, "recvbuf_skb_alloc_fail_cnt=%d\n", precvpriv->recvbuf_skb_alloc_fail_cnt); len += snprintf(page + len, count - len, "recvbuf_null_cnt=%d\n", precvpriv->recvbuf_null_cnt); len += snprintf(page + len, count - len, "read_port_complete_EINPROGRESS_cnt=%d\n", precvpriv->read_port_complete_EINPROGRESS_cnt); len += snprintf(page + len, count - len, "read_port_complete_other_urb_err_cnt=%d\n", precvpriv->read_port_complete_other_urb_err_cnt); len += snprintf(page + len, count - len, "hw_init_completed=%d\n", padapter->hw_init_completed); #ifdef CONFIG_USB_HCI len += snprintf(page + len, count - len, "continual_urb_error=%d\n", atomic_read(&pdvobj->continual_urb_error)); #endif for(i = 0; i < 4; i++) { phwxmit = pxmitpriv->hwxmits + i; len += snprintf(page + len, count - len, "%d, hwq.accnt=%d\n", i, phwxmit->accnt); } *eof = 1; return len; }
uint rtw_hal_deinit(struct adapter *padapter) { uint status = _SUCCESS; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); int i; status = padapter->HalFunc.hal_deinit(padapter); if (status == _SUCCESS){ for (i = 0; i<dvobj->iface_nums; i++) { padapter = dvobj->padapters[i]; padapter->hw_init_completed = false; } } else { DBG_871X("\n rtw_hal_deinit: hal_init fail\n"); } return status; }
u32 rtl8821cu_hal_deinit(PADAPTER padapter) { struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct dvobj_priv *pobj_priv = adapter_to_dvobj(padapter); u8 status = _TRUE; RTW_INFO("==> %s\n", __func__); hal_deinit_misc(padapter); status = rtl8821c_hal_deinit(padapter); if (status == _FALSE) { RTW_INFO("%s: rtl8821c_hal_deinit fail\n", __func__); return _FAIL; } RTW_INFO("%s <==\n", __func__); return _SUCCESS; }
int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf, u32 alloc_sz, u8 flag) { if (alloc_sz > 0) { #ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); struct usb_device *pusbd = pdvobjpriv->pusbdev; pxmitbuf->pallocated_buf = rtw_usb_buffer_alloc(pusbd, (size_t)alloc_sz, &pxmitbuf->dma_transfer_addr); pxmitbuf->pbuf = pxmitbuf->pallocated_buf; if(pxmitbuf->pallocated_buf == NULL) return _FAIL; #else // CONFIG_USE_USB_BUFFER_ALLOC_TX pxmitbuf->pallocated_buf = rtw_zmalloc(alloc_sz); if (pxmitbuf->pallocated_buf == NULL) { return _FAIL; } pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); #endif // CONFIG_USE_USB_BUFFER_ALLOC_TX } if (flag) { #ifdef CONFIG_USB_HCI int i; for(i=0; i<8; i++) { pxmitbuf->pxmit_urb[i] = usb_alloc_urb(0, GFP_KERNEL); if(pxmitbuf->pxmit_urb[i] == NULL) { DBG_871X("pxmitbuf->pxmit_urb[i]==NULL"); return _FAIL; } } #endif } return _SUCCESS; }
/* * Description: *Read from RX FIFO *Round read size to block size, *and make sure data transfer will be done in one command. * * Parameters: *intfhdl a pointer of intf_hdl *addr port ID *cnt size to read *rmem address to put data * * Return: *_SUCCESS(1) Success *_FAIL(0) Fail */ static u32 sdio_read_port( struct intf_hdl *intfhdl, u32 addr, u32 cnt, u8 *mem ) { struct adapter *adapter; PSDIO_DATA psdio; struct hal_com_data *hal; u32 oldcnt; #ifdef SDIO_DYNAMIC_ALLOC_MEM u8 *oldmem; #endif s32 err; adapter = intfhdl->padapter; psdio = &adapter_to_dvobj(adapter)->intf_data; hal = GET_HAL_DATA(adapter); HalSdioGetCmdAddr8723BSdio(adapter, addr, hal->SdioRxFIFOCnt++, &addr); oldcnt = cnt; if (cnt > psdio->block_transfer_len) cnt = _RND(cnt, psdio->block_transfer_len); /* cnt = sdio_align_size(cnt); */ err = _sd_read(intfhdl, addr, cnt, mem); #ifdef SDIO_DYNAMIC_ALLOC_MEM if ((oldcnt != cnt) && (oldmem)) { memcpy(oldmem, mem, oldcnt); kfree(mem); } #endif if (err) return _FAIL; return _SUCCESS; }
u8 rtw_mi_mp_mode_check(_adapter *padapter) { #ifdef CONFIG_CONCURRENT_MODE int i; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); _adapter *iface = NULL; for (i = 0; i < dvobj->iface_nums; i++) { iface = dvobj->padapters[i]; if ((iface) && (iface->registrypriv.mp_mode == 1)) { RTW_INFO(ADPT_FMT "-MP mode enable\n", ADPT_ARG(iface)); return _TRUE; } } #else if (padapter->registrypriv.mp_mode == 1) return _TRUE; #endif return _FALSE; }
s32 rtw_hal_macid_wakeup(PADAPTER padapter, u8 macid) { struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); u8 support; support = _FALSE; rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support); if (_FALSE == support) return _FAIL; if (macid >= macid_ctl->num) { DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT": Invalid macid(%u)\n", FUNC_ADPT_ARG(padapter), macid); return _FAIL; } rtw_hal_set_hwreg(padapter, HW_VAR_MACID_WAKEUP, &macid); return _SUCCESS; }
u8 _sdio_read8(PADAPTER padapter, u32 addr) { struct dvobj_priv *psdiodev; PSDIO_DATA psdio; u32 ftaddr; u8 val; _func_enter_; //psdiodev = pintfhdl->pintf_dev; //psdio = &psdiodev->intf_data; psdiodev = adapter_to_dvobj(padapter); psdio = &psdiodev->intf_data; ftaddr = _cvrt2ftaddr(addr, NULL, NULL); val = _sd_read8(psdio, ftaddr, NULL); _func_exit_; return val; }
void rtw_mi_buddy_indicate_scan_done(_adapter *padapter, bool bscan_aborted) { #if defined(CONFIG_IOCTL_CFG80211) int i; u8 ret = 0; _adapter *iface = NULL; _irqL irqL; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); struct mlme_priv *mlmepriv; struct rtw_wdev_priv *wdev_priv; bool indicate_buddy_scan = _FALSE; for (i = 0; i < dvobj->iface_nums; i++) { iface = dvobj->padapters[i]; if ((iface) && rtw_is_adapter_up(iface)) { if (iface == padapter) continue; mlmepriv = &(iface->mlmepriv); wdev_priv = adapter_wdev_data(iface); _enter_critical_bh(&wdev_priv->scan_req_lock, &irqL); if (wdev_priv->scan_request && mlmepriv->scanning_via_buddy_intf == _TRUE) { mlmepriv->scanning_via_buddy_intf = _FALSE; clr_fwstate(mlmepriv, _FW_UNDER_SURVEY); indicate_buddy_scan = _TRUE; } _exit_critical_bh(&wdev_priv->scan_req_lock, &irqL); if (indicate_buddy_scan == _TRUE) { rtw_cfg80211_surveydone_event_callback(iface); rtw_indicate_scan_done(iface, bscan_aborted); } } } #endif }
/* * Description: * Write to TX FIFO * Align write size block size, * and make sure data could be written in one command. * * Parameters: * pintfhdl a pointer of intf_hdl * addr port ID * cnt size to write * wmem data pointer to write * * Return: * _SUCCESS(1) Success * _FAIL(0) Fail */ static u32 sdio_write_port( struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *mem) { PADAPTER padapter; PSDIO_DATA psdio; s32 err; struct xmit_buf *xmitbuf = (struct xmit_buf *)mem; padapter = pintfhdl->padapter; psdio = &adapter_to_dvobj(padapter)->intf_data; if(padapter->hw_init_completed == _FALSE) { DBG_871X("%s [addr=0x%x cnt=%d] padapter->hw_init_completed == _FALSE \n",__func__,addr,cnt); return _FAIL; } cnt = _RND4(cnt); HalSdioGetCmdAddr8723ASdio(padapter, addr, cnt >> 2, &addr); if (cnt > psdio->block_transfer_len) cnt = _RND(cnt, psdio->block_transfer_len); // cnt = sdio_align_size(cnt); err = sd_write(pintfhdl, addr, cnt, xmitbuf->pdata); rtw_sctx_done_err(&xmitbuf->sctx, err ? RTW_SCTX_DONE_WRITE_PORT_ERR : RTW_SCTX_DONE_SUCCESS); if (err) { DBG_871X("%s, error=%d\n", __func__, err); return _FAIL; } return _SUCCESS; }
static void _TwoOutPipeMapping(struct adapter *padapter, bool bWIFICfg) { struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); if (bWIFICfg) { /* WMM */ /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */ /* 0, 1, 0, 1, 0, 0, 0, 0, 0 }; */ /* 0:ep_0 num, 1:ep_1 num */ pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];/* VO */ pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */ pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */ pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */ pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */ pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */ pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */ pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */ } else { /* typical setting */ /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */ /* 1, 1, 0, 0, 0, 0, 0, 0, 0 }; */ /* 0:ep_0 num, 1:ep_1 num */ pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */ pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */ pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */ pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */ pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */ pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */ pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */ pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */ } }
static u32 usb_read_interrupt(struct intf_hdl *pintfhdl, u32 addr) { int err; unsigned int pipe; u32 ret = _SUCCESS; _adapter *adapter = pintfhdl->padapter; struct dvobj_priv *pdvobj = adapter_to_dvobj(adapter); struct recv_priv *precvpriv = &adapter->recvpriv; struct usb_device *pusbd = pdvobj->pusbdev; _func_enter_; if (RTW_CANNOT_RX(adapter)) { RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_interrupt:( RTW_CANNOT_RX )!!!\n")); return _FAIL; } //translate DMA FIFO addr to pipehandle pipe = ffaddr2pipehdl(pdvobj, addr); usb_fill_int_urb(precvpriv->int_in_urb, pusbd, pipe, precvpriv->int_in_buf, INTERRUPT_MSG_FORMAT_LEN, usb_read_interrupt_complete, adapter, 1); err = usb_submit_urb(precvpriv->int_in_urb, GFP_ATOMIC); if((err) && (err != (-EPERM))) { DBG_8192C("cannot submit interrupt in-token(err = 0x%08x),urb_status = %d\n",err, precvpriv->int_in_urb->status); ret = _FAIL; } _func_exit_; return ret; }
static void rtw_usb_if1_deinit(struct rtw_adapter *if1) { struct net_device *pnetdev = if1->pnetdev; struct mlme_priv *pmlmepriv = &if1->mlmepriv; if (check_fwstate(pmlmepriv, _FW_LINKED)) rtw_disassoc_cmd23a(if1, 0, false); #ifdef CONFIG_8723AU_AP_MODE free_mlme_ap_info23a(if1); #endif if (pnetdev) unregister_netdev(pnetdev); /* will call netdev_close() */ rtw_cancel_all_timer23a(if1); rtw_dev_unload(if1); DBG_8723A("+r871xu_dev_remove, hw_init_completed =%d\n", if1->hw_init_completed); if (if1->rtw_wdev) { rtw_wdev_unregister(if1->rtw_wdev); rtw_wdev_free(if1->rtw_wdev); } #ifdef CONFIG_8723AU_BT_COEXIST if (1 == if1->pwrctrlpriv.autopm_cnt) { usb_autopm_put_interface(adapter_to_dvobj(if1)->pusbintf); if1->pwrctrlpriv.autopm_cnt--; } #endif rtw_free_drv_sw23a(if1); if (pnetdev) free_netdev(pnetdev); }
static void spi_clean_rxfifo(PADAPTER padapter, u32 size) { u8 *pbuf; u32 bufSize, readsize; s32 ret; struct spi_more_data more_data = {0}; pbuf = NULL; bufSize = adapter_to_dvobj(padapter)->intf_data.block_transfer_len; do { pbuf = rtw_malloc(bufSize); if (pbuf) break; bufSize /= 2; if (bufSize == 0) { DBG_8192C(KERN_ERR "%s: Can't allocate any memory for RX!!\n", __func__); return; } } while (1); while (size) { u8 remain_len = 0; readsize = (size>bufSize)?bufSize:size; remain_len = readsize%4; if (remain_len != 0) readsize += 4 -remain_len; ret = spi_read_rx_fifo(padapter, pbuf, readsize, &more_data); if (ret == _FAIL) { DBG_8192C(KERN_ERR "%s: read port FAIL! size=%d\n", __func__, readsize); break; } size -= readsize; } rtw_mfree(pbuf, bufSize); }
inline void rtw_mi_update_fwstate(struct mlme_priv *pmlmepriv, sint state, u8 bset) { _adapter *adapter = container_of(pmlmepriv, _adapter, mlmepriv); struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); struct mi_state *iface_state = &dvobj->iface_state; struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; if (!(state & (_FW_LINKED | _FW_UNDER_LINKING | WIFI_UNDER_WPS))) return; if (mlmeext_msr(mlmeext) == WIFI_FW_STATION_STATE) { /*ATOMIC_INC(&(iface_state->sta_num_ret));*/ if (state & _FW_LINKED) (bset) ? ATOMIC_INC(&(iface_state->ld_sta_num_ret)) : ATOMIC_DEC(&(iface_state->ld_sta_num_ret)); if (state & _FW_UNDER_LINKING) (bset) ? ATOMIC_INC(&(iface_state->lg_sta_num_ret)) : ATOMIC_DEC(&(iface_state->lg_sta_num_ret)); } if (mlmeext_msr(mlmeext) == WIFI_FW_AP_STATE && check_fwstate(&adapter->mlmepriv, _FW_LINKED) == _TRUE ) { /*ATOMIC_INC(&(iface_state->ap_num_ret));*/ if (adapter->stapriv.asoc_sta_count > 2) ld_ap_num_ret++; } if (state & WIFI_UNDER_WPS) (bset) ? ATOMIC_INC(&(iface_state->uw_num_ret)) : ATOMIC_DEC(&(iface_state->uw_num_ret)); _rtw_mi_status(adapter, &iface_state->sta_num, &iface_state->ld_sta_num, &iface_state->lg_sta_num , &iface_state->ap_num, &iface_state->ld_ap_num, &iface_state->uwps_num, 1); }
/* * Description: *Write to TX FIFO *Align write size block size, *and make sure data could be written in one command. * * Parameters: *intfhdl a pointer of intf_hdl *addr port ID *cnt size to write *wmem data pointer to write * * Return: *_SUCCESS(1) Success *_FAIL(0) Fail */ static u32 sdio_write_port( struct intf_hdl *intfhdl, u32 addr, u32 cnt, u8 *mem ) { struct adapter *adapter; PSDIO_DATA psdio; s32 err; struct xmit_buf *xmitbuf = (struct xmit_buf *)mem; adapter = intfhdl->padapter; psdio = &adapter_to_dvobj(adapter)->intf_data; if (!adapter->hw_init_completed) { DBG_871X("%s [addr = 0x%x cnt =%d] adapter->hw_init_completed == false\n", __func__, addr, cnt); return _FAIL; } cnt = _RND4(cnt); HalSdioGetCmdAddr8723BSdio(adapter, addr, cnt >> 2, &addr); if (cnt > psdio->block_transfer_len) cnt = _RND(cnt, psdio->block_transfer_len); /* cnt = sdio_align_size(cnt); */ err = sd_write(intfhdl, addr, cnt, xmitbuf->pdata); rtw_sctx_done_err( &xmitbuf->sctx, err ? RTW_SCTX_DONE_WRITE_PORT_ERR : RTW_SCTX_DONE_SUCCESS ); if (err) return _FAIL; return _SUCCESS; }
uint rtw_hal_init(struct adapter *padapter) { uint status = _SUCCESS; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); int i; status = padapter->HalFunc.hal_init(padapter); if (status == _SUCCESS){ rtw_hal_init_opmode(padapter); for (i = 0; i<dvobj->iface_nums; i++) dvobj->padapters[i]->hw_init_completed = true; if (padapter->registrypriv.notch_filter == 1) rtw_hal_notch_filter(padapter, 1); rtw_hal_reset_security_engine(padapter); for (i = 0; i<dvobj->iface_nums; i++) rtw_sec_restore_wep_key(dvobj->padapters[i]); init_hw_mlme_ext(padapter); rtw_bb_rf_gain_offset(padapter); } else { for (i = 0; i<dvobj->iface_nums; i++) dvobj->padapters[i]->hw_init_completed = false; DBG_871X("rtw_hal_init: hal__init fail\n"); } RT_TRACE(_module_hal_init_c_, _drv_err_, ("-rtl871x_hal_init:status = 0x%x\n", status)); return status; }
int proc_get_trx_info(struct seq_file *m, void *v) { struct net_device *dev = m->private; int i; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct recv_priv *precvpriv = &padapter->recvpriv; struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); struct hw_xmit *phwxmit; DBG_871X_SEL_NL(m, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d\n" , pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt); DBG_871X_SEL_NL(m, "free_ext_xmitbuf_cnt=%d, free_xframe_ext_cnt=%d\n" , pxmitpriv->free_xmit_extbuf_cnt, pxmitpriv->free_xframe_ext_cnt); DBG_871X_SEL_NL(m, "free_recvframe_cnt=%d\n" , precvpriv->free_recvframe_cnt); DBG_871X_SEL_NL(m, "recvbuf_skb_alloc_fail_cnt=%d\n", precvpriv->recvbuf_skb_alloc_fail_cnt); DBG_871X_SEL_NL(m, "recvbuf_null_cnt=%d\n", precvpriv->recvbuf_null_cnt); DBG_871X_SEL_NL(m, "read_port_complete_EINPROGRESS_cnt=%d\n", precvpriv->read_port_complete_EINPROGRESS_cnt); DBG_871X_SEL_NL(m, "read_port_complete_other_urb_err_cnt=%d\n", precvpriv->read_port_complete_other_urb_err_cnt); DBG_871X_SEL_NL(m, "hw_init_completed=%d\n", padapter->hw_init_completed); #ifdef CONFIG_USB_HCI DBG_871X_SEL_NL(m, "continual_urb_error=%d\n", atomic_read(&pdvobj->continual_urb_error)); #endif for(i = 0; i < 4; i++) { phwxmit = pxmitpriv->hwxmits + i; DBG_871X_SEL_NL(m, "%d, hwq.accnt=%d\n", i, phwxmit->accnt); } #ifdef CONFIG_USB_HCI DBG_871X_SEL_NL(m, "rx_urb_pending_cnt=%d\n", precvpriv->rx_pending_cnt); #endif return 0; }