static void Wb35Tx(struct wbsoft_priv *adapter) { struct hw_data * pHwData = &adapter->sHwData; struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; u8 *pTxBufferAddress; struct wb35_mds *pMds = &adapter->Mds; struct urb * pUrb = (struct urb *)pWb35Tx->Tx4Urb; int retv; u32 SendIndex; if (pHwData->SurpriseRemove || pHwData->HwStop) goto cleanup; if (pWb35Tx->tx_halt) goto cleanup; SendIndex = pWb35Tx->TxSendIndex; if (!pMds->TxOwner[SendIndex]) goto cleanup; pTxBufferAddress = pWb35Tx->TxBuffer[SendIndex]; usb_fill_bulk_urb(pUrb, pHwData->WbUsb.udev, usb_sndbulkpipe(pHwData->WbUsb.udev, 4), pTxBufferAddress, pMds->TxBufferSize[ SendIndex ], Wb35Tx_complete, adapter); pWb35Tx->EP4vm_state = VM_RUNNING; retv = usb_submit_urb(pUrb, GFP_ATOMIC); if (retv<0) { printk("EP4 Tx Irp sending error\n"); goto cleanup; } pWb35Tx->TxFillCount += pMds->TxCountInBuffer[SendIndex]; if (pWb35Tx->TxFillCount > 12) Wb35Tx_EP2VM_start(adapter); pWb35Tx->ByteTransfer += pMds->TxBufferSize[SendIndex]; return; cleanup: pWb35Tx->EP4vm_state = VM_STOP; atomic_dec(&pWb35Tx->TxFireCounter); }
static void Wb35Tx(struct wbsoft_priv *adapter) { struct hw_data * pHwData = &adapter->sHwData; struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; u8 *pTxBufferAddress; struct wb35_mds *pMds = &adapter->Mds; struct urb * pUrb = (struct urb *)pWb35Tx->Tx4Urb; int retv; u32 SendIndex; if (pHwData->SurpriseRemove) goto cleanup; if (pWb35Tx->tx_halt) goto cleanup; // Ownership checking SendIndex = pWb35Tx->TxSendIndex; if (!pMds->TxOwner[SendIndex]) //No more data need to be sent, return immediately goto cleanup; pTxBufferAddress = pWb35Tx->TxBuffer[SendIndex]; // // Issuing URB // usb_fill_bulk_urb(pUrb, pHwData->udev, usb_sndbulkpipe(pHwData->udev, 4), pTxBufferAddress, pMds->TxBufferSize[ SendIndex ], Wb35Tx_complete, adapter); pWb35Tx->EP4vm_state = VM_RUNNING; retv = usb_submit_urb(pUrb, GFP_ATOMIC); if (retv<0) { printk("EP4 Tx Irp sending error\n"); goto cleanup; } // Check if driver needs issue Irp for EP2 pWb35Tx->TxFillCount += pMds->TxCountInBuffer[SendIndex]; if (pWb35Tx->TxFillCount > 12) Wb35Tx_EP2VM_start(adapter); pWb35Tx->ByteTransfer += pMds->TxBufferSize[SendIndex]; return; cleanup: pWb35Tx->EP4vm_state = VM_STOP; atomic_dec(&pWb35Tx->TxFireCounter); }
void Wb35Tx_CurrentTime(struct wbsoft_priv *adapter, u32 TimeCount) { struct hw_data * pHwData = &adapter->sHwData; struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; unsigned char Trigger = false; if (pWb35Tx->TxTimer > TimeCount) Trigger = true; else if (TimeCount > (pWb35Tx->TxTimer+500)) Trigger = true; if (Trigger) { pWb35Tx->TxTimer = TimeCount; Wb35Tx_EP2VM_start(adapter); } }