void rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe)
{
       _irqL irqL;
	int	t, sz, w_sz, pull=0;
	//u8	*mem_addr;
	u32	ff_hwaddr;
	struct xmit_buf		*pxmitbuf = pxmitframe->pxmitbuf;
	struct pkt_attrib		*pattrib = &pxmitframe->attrib;
	struct xmit_priv		*pxmitpriv = &padapter->xmitpriv;
	struct dvobj_priv		*pdvobjpriv = &padapter->dvobjpriv;
	struct security_priv	*psecuritypriv = &padapter->securitypriv;
	struct tx_desc		*ptxdesc;

	if ((pxmitframe->frame_tag == DATA_FRAMETAG) &&
	    (pxmitframe->attrib.ether_type != 0x0806) &&
	    (pxmitframe->attrib.ether_type != 0x888e) &&
	    (pxmitframe->attrib.dhcp_pkt != 1))
	{
		rtw_issue_addbareq_cmd(padapter, pxmitframe);
	}

	//mem_addr = pxmitframe->buf_addr;

       RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_dump_xframe()\n"));
	
	for (t = 0; t < pattrib->nr_frags; t++)
	{
		if (t != (pattrib->nr_frags - 1))
		{
			RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("pattrib->nr_frags=%d\n", pattrib->nr_frags));

			sz = pxmitpriv->frag_len;
			sz = sz - 4 - (psecuritypriv->sw_encrypt ? 0 : pattrib->icv_len);					
		}
		else //no frag
		{
			sz = pattrib->last_txcmdsz;
		}

		ff_hwaddr = rtw_get_ff_hwaddr(pxmitframe);

#ifdef CONFIG_CONCURRENT_MODE
		if(!rtw_buddy_adapter_up(padapter))
				goto skip_if2_tx;
		if(padapter->adapter_type > PRIMARY_ADAPTER)
		{
			_adapter 	  *pri_adapter = padapter->pbuddy_adapter;
			struct dvobj_priv *pri_dvobjpriv = &pri_adapter->dvobjpriv;
		
			_enter_critical(&(pri_dvobjpriv->irq_th_lock), &irqL);


				
			
			ptxdesc = get_txdesc(pri_adapter, ff_hwaddr);
		
			if(ptxdesc == NULL)
			{
				_exit_critical(&pri_dvobjpriv->irq_th_lock, &irqL);
				rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
				DBG_8192C("##### Tx desc unavailable !#####\n");
				break;
			}
			update_txdesc(pxmitframe, (uint*)ptxdesc, sz);

			rtl8192ce_enqueue_xmitbuf(&(pri_adapter->xmitpriv.tx_ring[ff_hwaddr]), pxmitbuf);
			pxmitbuf->len = sz;

			w_sz = sz;

			wmb();
			ptxdesc->txdw0 |= cpu_to_le32(OWN);
			_exit_critical(&pri_dvobjpriv->irq_th_lock, &irqL);

			rtw_write16(pri_adapter, REG_PCIE_CTRL_REG, ffaddr2dma(ff_hwaddr));
			rtw_write_port(padapter, ff_hwaddr, w_sz, (unsigned char*)pxmitbuf);	

		} else
skip_if2_tx:
#endif
		{
		_enter_critical(&pdvobjpriv->irq_th_lock, &irqL);

			ptxdesc = get_txdesc(pxmitframe->padapter, ff_hwaddr);

		if(ptxdesc == NULL)
		{
			_exit_critical(&pdvobjpriv->irq_th_lock, &irqL);
			rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
			DBG_8192C("##### Tx desc unavailable !#####\n");
			break;
		}

		update_txdesc(pxmitframe, (uint*)ptxdesc, sz);


		rtl8192ce_enqueue_xmitbuf(&pxmitpriv->tx_ring[ff_hwaddr], pxmitbuf);

		pxmitbuf->len = sz;
		w_sz = sz;

		wmb();
		ptxdesc->txdw0 |= cpu_to_le32(OWN);

		_exit_critical(&pdvobjpriv->irq_th_lock, &irqL);
		rtw_write16(padapter, REG_PCIE_CTRL_REG, ffaddr2dma(ff_hwaddr));
		rtw_write_port(padapter, ff_hwaddr, w_sz, (unsigned char*)pxmitbuf);

		}

		rtw_count_tx_stats(padapter, pxmitframe, sz);

		RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_write_port, w_sz=%d\n", w_sz));
		//DBG_8192C("rtw_write_port, w_sz=%d, sz=%d, txdesc_sz=%d, tid=%d\n", w_sz, sz, w_sz-sz, pattrib->priority);      

		//mem_addr += w_sz;

		//mem_addr = (u8 *)RND4(((SIZE_PTR)(mem_addr)));

	}
	
	rtw_free_xmitframe_ex(pxmitpriv, pxmitframe);
	
}
Example #2
0
s32 rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe)
{
    s32 ret = _SUCCESS;
    s32 inner_ret = _SUCCESS;
    _irqL irqL;
    int	t, sz, w_sz, pull=0;
    //u8	*mem_addr;
    u32	ff_hwaddr;
    struct xmit_buf		*pxmitbuf = pxmitframe->pxmitbuf;
    struct pkt_attrib		*pattrib = &pxmitframe->attrib;
    struct xmit_priv		*pxmitpriv = &padapter->xmitpriv;
    struct dvobj_priv		*pdvobjpriv = adapter_to_dvobj(padapter);
    struct security_priv	*psecuritypriv = &padapter->securitypriv;
    struct tx_desc		*ptxdesc;

    if ((pxmitframe->frame_tag == DATA_FRAMETAG) &&
            (pxmitframe->attrib.ether_type != 0x0806) &&
            (pxmitframe->attrib.ether_type != 0x888e) &&
            (pxmitframe->attrib.dhcp_pkt != 1))
    {
        rtw_issue_addbareq_cmd(padapter, pxmitframe);
    }

    //mem_addr = pxmitframe->buf_addr;

    RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_dump_xframe()\n"));

    for (t = 0; t < pattrib->nr_frags; t++)
    {
        if (inner_ret != _SUCCESS && ret == _SUCCESS)
            ret = _FAIL;

        if (t != (pattrib->nr_frags - 1))
        {
            RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("pattrib->nr_frags=%d\n", pattrib->nr_frags));

            sz = pxmitpriv->frag_len;
            sz = sz - 4 - (psecuritypriv->sw_encrypt ? 0 : pattrib->icv_len);
        }
        else //no frag
        {
            sz = pattrib->last_txcmdsz;
        }

        ff_hwaddr = rtw_get_ff_hwaddr(pxmitframe);

        _enter_critical(&pdvobjpriv->irq_th_lock, &irqL);

        ptxdesc = get_txdesc(pxmitframe, ff_hwaddr);
        if(ptxdesc == NULL)
        {
            _exit_critical(&pdvobjpriv->irq_th_lock, &irqL);
            rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
            DBG_8192C("##### Tx desc unavailable !#####\n");
            break;
        }

        update_txdesc(pxmitframe, (uint*)ptxdesc, sz);

        rtl8192de_enqueue_xmitbuf(&pxmitpriv->tx_ring[ff_hwaddr], pxmitbuf);

        pxmitbuf->len = sz;

        _exit_critical(&pdvobjpriv->irq_th_lock, &irqL);

        w_sz = sz;

        rtw_write16(padapter, REG_PCIE_CTRL_REG, ffaddr2dma(ff_hwaddr));

        inner_ret = rtw_write_port(padapter, ff_hwaddr, w_sz, (unsigned char*)pxmitbuf);

        rtw_count_tx_stats(padapter, pxmitframe, sz);

        RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_write_port, w_sz=%d\n", w_sz));
        //DBG_8192C("rtw_write_port, w_sz=%d, sz=%d, txdesc_sz=%d, tid=%d\n", w_sz, sz, w_sz-sz, pattrib->priority);

        //mem_addr += w_sz;

        //mem_addr = (u8 *)RND4(((SIZE_PTR)(mem_addr)));

    }

    rtw_free_xmitframe(pxmitpriv, pxmitframe);

    if  (ret != _SUCCESS)
        rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_UNKNOWN);

    return ret;
}