void Wb35Rx_start(struct ieee80211_hw *hw) { struct wbsoft_priv *priv = hw->priv; struct hw_data * pHwData = &priv->sHwData; struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; // Allow only one thread to run into the Wb35Rx() function if (atomic_inc_return(&pWb35Rx->RxFireCounter) == 1) { pWb35Rx->EP3vm_state = VM_RUNNING; Wb35Rx(hw); } else atomic_dec(&pWb35Rx->RxFireCounter); }
static void Wb35Rx_Complete(struct urb *urb) { struct ieee80211_hw *hw = urb->context; struct wbsoft_priv *priv = hw->priv; struct hw_data * pHwData = &priv->sHwData; struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; u8 * pRxBufferAddress; u32 SizeCheck; u16 BulkLength; u32 RxBufferId; R00_DESCRIPTOR R00; // Variable setting pWb35Rx->EP3vm_state = VM_COMPLETED; pWb35Rx->EP3VM_status = urb->status;//Store the last result of Irp RxBufferId = pWb35Rx->CurrentRxBufferId; pRxBufferAddress = pWb35Rx->pDRx; BulkLength = (u16)urb->actual_length; // The IRP is completed pWb35Rx->EP3vm_state = VM_COMPLETED; if (pHwData->SurpriseRemove || pHwData->HwStop) // Must be here, or RxBufferId is invalid goto error; if (pWb35Rx->rx_halt) goto error; // Start to process the data only in successful condition pWb35Rx->RxOwner[ RxBufferId ] = 0; // Set the owner to driver R00.value = le32_to_cpu(*(u32 *)pRxBufferAddress); // The URB is completed, check the result if (pWb35Rx->EP3VM_status != 0) { #ifdef _PE_USB_STATE_DUMP_ printk("EP3 IoCompleteRoutine return error\n"); #endif pWb35Rx->EP3vm_state = VM_STOP; goto error; } // 20060220 For recovering. check if operating in single USB mode if (!HAL_USB_MODE_BURST(pHwData)) { SizeCheck = R00.R00_receive_byte_count; //20060926 anson's endian if ((SizeCheck & 0x03) > 0) SizeCheck -= 4; SizeCheck = (SizeCheck + 3) & ~0x03; SizeCheck += 12; // 8 + 4 badbeef if ((BulkLength > 1600) || (SizeCheck > 1600) || (BulkLength != SizeCheck) || (BulkLength == 0)) { // Add for fail Urb pWb35Rx->EP3vm_state = VM_STOP; pWb35Rx->Ep3ErrorCount2++; } } // Indicating the receiving data pWb35Rx->ByteReceived += BulkLength; pWb35Rx->RxBufferSize[ RxBufferId ] = BulkLength; if (!pWb35Rx->RxOwner[ RxBufferId ]) Wb35Rx_indicate(hw); kfree(pWb35Rx->pDRx); // Do the next receive Wb35Rx(hw); return; error: pWb35Rx->RxOwner[ RxBufferId ] = 1; // Set the owner to hardware atomic_dec(&pWb35Rx->RxFireCounter); pWb35Rx->EP3vm_state = VM_STOP; }
static void Wb35Rx_Complete(struct urb *urb) { struct ieee80211_hw *hw = urb->context; struct wbsoft_priv *priv = hw->priv; struct hw_data *pHwData = &priv->sHwData; struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; u8 *pRxBufferAddress; u32 SizeCheck; u16 BulkLength; u32 RxBufferId; struct R00_descriptor R00; pWb35Rx->EP3vm_state = VM_COMPLETED; pWb35Rx->EP3VM_status = urb->status; RxBufferId = pWb35Rx->CurrentRxBufferId; pRxBufferAddress = pWb35Rx->pDRx; BulkLength = (u16)urb->actual_length; pWb35Rx->EP3vm_state = VM_COMPLETED; if (pHwData->SurpriseRemove) goto error; if (pWb35Rx->rx_halt) goto error; pWb35Rx->RxOwner[RxBufferId] = 0; R00.value = le32_to_cpu(*(u32 *)pRxBufferAddress); if (pWb35Rx->EP3VM_status != 0) { pr_debug("EP3 IoCompleteRoutine return error\n"); pWb35Rx->EP3vm_state = VM_STOP; goto error; } if (!HAL_USB_MODE_BURST(pHwData)) { SizeCheck = R00.R00_receive_byte_count; if ((SizeCheck & 0x03) > 0) SizeCheck -= 4; SizeCheck = (SizeCheck + 3) & ~0x03; SizeCheck += 12; if ((BulkLength > 1600) || (SizeCheck > 1600) || (BulkLength != SizeCheck) || (BulkLength == 0)) { pWb35Rx->EP3vm_state = VM_STOP; pWb35Rx->Ep3ErrorCount2++; } } pWb35Rx->ByteReceived += BulkLength; pWb35Rx->RxBufferSize[RxBufferId] = BulkLength; if (!pWb35Rx->RxOwner[RxBufferId]) Wb35Rx_indicate(hw); kfree(pWb35Rx->pDRx); Wb35Rx(hw); return; error: pWb35Rx->RxOwner[RxBufferId] = 1; atomic_dec(&pWb35Rx->RxFireCounter); pWb35Rx->EP3vm_state = VM_STOP; }