コード例 #1
0
ファイル: sdio_ops.c プロジェクト: zetalabs/linux-3.4-sunxi
/*
 * 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;
}
コード例 #2
0
/*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;
}
コード例 #3
0
ファイル: rtl8192de_xmit.c プロジェクト: releung/s82_kernel
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;
}
コード例 #4
0
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);
}
コード例 #5
0
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;
}
コード例 #6
0
_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;
}
コード例 #7
0
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;

}	
コード例 #8
0
ファイル: hal_intf.c プロジェクト: ConiKost/rtl88XXAU
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);
		}
	}
}
コード例 #9
0
_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;
}
コード例 #10
0
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;
}
コード例 #11
0
ファイル: sdio_ops.c プロジェクト: STPJ/linux-3.4-sunxi
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);
	}
}
コード例 #12
0
ファイル: sdio_ops.c プロジェクト: zetalabs/linux-3.4-sunxi
/*
 * 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;
}
コード例 #13
0
ファイル: rtw_debug.c プロジェクト: davidftv/s82_kernel
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;

}
コード例 #14
0
ファイル: hal_intf.c プロジェクト: SylasMc/rtl8723bs
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;
}
コード例 #15
0
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;
}
コード例 #16
0
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;	
}
コード例 #17
0
ファイル: sdio_ops.c プロジェクト: Lyude/linux
/*
 * 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;
}
コード例 #18
0
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;
}
コード例 #19
0
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;
}
コード例 #20
0
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;
}
コード例 #21
0
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

}
コード例 #22
0
ファイル: sdio_ops.c プロジェクト: davidftv/s82_kernel
/*
 * 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;
}
コード例 #23
0
ファイル: hal_com.c プロジェクト: grate-driver/linux
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 */

	}

}
コード例 #24
0
ファイル: usb_ops.c プロジェクト: xapp-le/kernel
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;
}
コード例 #25
0
ファイル: usb_intf.c プロジェクト: Abioy/kasan
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);
}
コード例 #26
0
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);
}
コード例 #27
0
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);
}
コード例 #28
0
ファイル: sdio_ops.c プロジェクト: Lyude/linux
/*
 * 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;
}
コード例 #29
0
ファイル: hal_intf.c プロジェクト: SylasMc/rtl8723bs
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;

}
コード例 #30
0
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;
}