static void Wb35Tx_complete(struct urb * pUrb) { struct wbsoft_priv *adapter = pUrb->context; struct hw_data * pHwData = &adapter->sHwData; struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; struct wb35_mds *pMds = &adapter->Mds; printk("wb35: tx complete\n"); // Variable setting pWb35Tx->EP4vm_state = VM_COMPLETED; pWb35Tx->EP4VM_status = pUrb->status; //Store the last result of Irp pMds->TxOwner[ pWb35Tx->TxSendIndex ] = 0;// Set the owner. Free the owner bit always. pWb35Tx->TxSendIndex++; pWb35Tx->TxSendIndex %= MAX_USB_TX_BUFFER_NUMBER; if (pHwData->SurpriseRemove) // Let WbWlanHalt to handle surprise remove goto error; if (pWb35Tx->tx_halt) goto error; // The URB is completed, check the result if (pWb35Tx->EP4VM_status != 0) { printk("URB submission failed\n"); pWb35Tx->EP4vm_state = VM_STOP; goto error; } Mds_Tx(adapter); Wb35Tx(adapter); return; error: atomic_dec(&pWb35Tx->TxFireCounter); pWb35Tx->EP4vm_state = VM_STOP; }
static void Wb35Tx_complete(struct urb * pUrb) { struct wbsoft_priv *adapter = pUrb->context; struct hw_data * pHwData = &adapter->sHwData; struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; struct wb35_mds *pMds = &adapter->Mds; printk("wb35: tx complete\n"); pWb35Tx->EP4vm_state = VM_COMPLETED; pWb35Tx->EP4VM_status = pUrb->status; pMds->TxOwner[ pWb35Tx->TxSendIndex ] = 0; pWb35Tx->TxSendIndex++; pWb35Tx->TxSendIndex %= MAX_USB_TX_BUFFER_NUMBER; if (pHwData->SurpriseRemove || pHwData->HwStop) goto error; if (pWb35Tx->tx_halt) goto error; if (pWb35Tx->EP4VM_status != 0) { printk("URB submission failed\n"); pWb35Tx->EP4vm_state = VM_STOP; goto error; } Mds_Tx(adapter); Wb35Tx(adapter); return; error: atomic_dec(&pWb35Tx->TxFireCounter); pWb35Tx->EP4vm_state = VM_STOP; }
//============================================================================= u8 MLMESendFrame(struct wbsoft_priv * adapter, u8 *pMMPDU, u16 len, u8 DataType) /* DataType : FRAME_TYPE_802_11_MANAGEMENT, FRAME_TYPE_802_11_MANAGEMENT_CHALLENGE, FRAME_TYPE_802_11_DATA */ { if (adapter->sMlmeFrame.IsInUsed != PACKET_FREE_TO_USE) { adapter->sMlmeFrame.wNumTxMMPDUDiscarded++; return false; } adapter->sMlmeFrame.IsInUsed = PACKET_COME_FROM_MLME; // Keep information for sending adapter->sMlmeFrame.pMMPDU = pMMPDU; adapter->sMlmeFrame.DataType = DataType; // len must be the last setting due to QUERY_SIZE_SECOND of Mds adapter->sMlmeFrame.len = len; adapter->sMlmeFrame.wNumTxMMPDU++; // H/W will enter power save by set the register. S/W don't send null frame //with PWRMgt bit enbled to enter power save now. // Transmit NDIS packet Mds_Tx(adapter); return true; }