/** * @brief Transmit the By-passed packet awaiting in by-pass queue * * @param pmadapter Pointer to the mlan_adapter driver data struct * * @return N/A */ t_void wlan_process_bypass_tx(pmlan_adapter pmadapter) { pmlan_buffer pmbuf; mlan_tx_param tx_param; mlan_status status = MLAN_STATUS_SUCCESS; ENTER(); if ((pmbuf = (pmlan_buffer) util_dequeue_list(pmadapter->pmoal_handle, &pmadapter->bypass_txq, pmadapter->callbacks. moal_spin_lock, pmadapter->callbacks. moal_spin_unlock))) { PRINTM(MINFO, "Dequeuing bypassed packet %p\n", pmbuf); /* XXX: nex_pkt_len ??? */ tx_param.next_pkt_len = 0; status = wlan_process_tx(pmadapter->priv[pmbuf->bss_num], pmbuf, &tx_param); if (status == MLAN_STATUS_RESOURCE) { /* Queue the packet again so that it will be TX'ed later */ util_enqueue_list_head(pmadapter->pmoal_handle, &pmadapter->bypass_txq, (pmlan_linked_list) pmbuf, pmadapter->callbacks.moal_spin_lock, pmadapter->callbacks.moal_spin_unlock); } } else { PRINTM(MINFO, "Nothing to send\n"); } LEAVE(); }
/** * @brief handle TX Queue * @param priv pointer to wlan_private * @return N/A */ void wlan_process_txqueue(wlan_private * priv) { wlan_adapter *Adapter = priv->adapter; ulong flags; struct sk_buff *Q; OS_INTERRUPT_SAVE_AREA; ENTER(); //spin_lock_irqsave(&Adapter->CurrentTxLock, flags); OS_INT_DISABLE(flags); if (Adapter->TxSkbNum > 0) { Q = &priv->adapter->TxSkbQ; Adapter->CurrentTxSkb = Q->next; list_del((struct list_head *) Adapter->CurrentTxSkb); Adapter->TxSkbNum--; } //spin_unlock_irqrestore(&Adapter->CurrentTxLock, flags); OS_INT_RESTORE(flags); if (Adapter->CurrentTxSkb) { wlan_process_tx(priv); } LEAVE(); }
/** * @brief Transmit the By-passed packet awaiting in by-pass queue * * @param pmadapter Pointer to the mlan_adapter driver data struct * * @return N/A */ t_void wlan_process_bypass_tx(pmlan_adapter pmadapter) { pmlan_buffer pmbuf; mlan_tx_param tx_param; mlan_status status = MLAN_STATUS_SUCCESS; pmlan_private priv; int j = 0; ENTER(); for (j = 0; j < pmadapter->priv_num; ++j) { priv = pmadapter->priv[j]; if (priv) { pmbuf = (pmlan_buffer) util_dequeue_list(pmadapter-> pmoal_handle, &priv-> bypass_txq, pmadapter-> callbacks. moal_spin_lock, pmadapter-> callbacks. moal_spin_unlock); if (pmbuf) { PRINTM(MINFO, "Dequeuing bypassed packet %p\n", pmbuf); /* XXX: nex_pkt_len ??? */ tx_param.next_pkt_len = 0; status = wlan_process_tx(pmadapter-> priv[pmbuf->bss_index], pmbuf, &tx_param); if (status == MLAN_STATUS_RESOURCE) { /* Queue the packet again so that it will be TX'ed later */ util_enqueue_list_head(pmadapter-> pmoal_handle, &priv-> bypass_txq, (pmlan_linked_list) pmbuf, pmadapter-> callbacks. moal_spin_lock, pmadapter-> callbacks. moal_spin_unlock); } else { pmadapter->callbacks. moal_spin_lock(pmadapter-> pmoal_handle, priv->bypass_txq. plock); pmadapter->bypass_pkt_count--; pmadapter->callbacks. moal_spin_unlock(pmadapter-> pmoal_handle, priv-> bypass_txq. plock); } break; } else { PRINTM(MINFO, "Nothing to send\n"); } } } LEAVE(); }