|
@@ -1363,34 +1363,43 @@ void RXvMngWorkItem(struct work_struct *work)
|
|
|
struct vnt_rcb *pRCB = NULL;
|
|
|
struct vnt_rx_mgmt *pRxPacket;
|
|
|
int bReAllocSkb = false;
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
if (pDevice->Flags & fMP_DISCONNECTED)
|
|
|
return;
|
|
|
|
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Rx Mng Thread\n");
|
|
|
|
|
|
- spin_lock_irq(&pDevice->lock);
|
|
|
while (pDevice->NumRecvMngList!=0)
|
|
|
{
|
|
|
+ spin_lock_irqsave(&pDevice->lock, flags);
|
|
|
+
|
|
|
pRCB = pDevice->FirstRecvMngList;
|
|
|
pDevice->NumRecvMngList--;
|
|
|
DequeueRCB(pDevice->FirstRecvMngList, pDevice->LastRecvMngList);
|
|
|
+
|
|
|
+ spin_unlock_irqrestore(&pDevice->lock, flags);
|
|
|
+
|
|
|
if(!pRCB){
|
|
|
break;
|
|
|
}
|
|
|
pRxPacket = &(pRCB->sMngPacket);
|
|
|
vMgrRxManagePacket(pDevice, &pDevice->vnt_mgmt, pRxPacket);
|
|
|
pRCB->Ref--;
|
|
|
- if(pRCB->Ref == 0) {
|
|
|
- DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RxvFreeMng %d %d\n",pDevice->NumRecvFreeList, pDevice->NumRecvMngList);
|
|
|
- RXvFreeRCB(pRCB, bReAllocSkb);
|
|
|
- } else {
|
|
|
+ if (pRCB->Ref == 0) {
|
|
|
+ DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RxvFreeMng %d %d\n",
|
|
|
+ pDevice->NumRecvFreeList, pDevice->NumRecvMngList);
|
|
|
+
|
|
|
+ spin_lock_irqsave(&pDevice->lock, flags);
|
|
|
+
|
|
|
+ RXvFreeRCB(pRCB, bReAllocSkb);
|
|
|
+
|
|
|
+ spin_unlock_irqrestore(&pDevice->lock, flags);
|
|
|
+ } else {
|
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Rx Mng Only we have the right to free RCB\n");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
pDevice->bIsRxMngWorkItemQueued = false;
|
|
|
- spin_unlock_irq(&pDevice->lock);
|
|
|
-
|
|
|
}
|
|
|
|