Signed-off-by: Matthias Beyer <m...@beyermatthias.de> --- drivers/staging/bcm/LeakyBucket.c | 153 ++++++++++++++++++++++++++------------ 1 file changed, 104 insertions(+), 49 deletions(-)
diff --git a/drivers/staging/bcm/LeakyBucket.c b/drivers/staging/bcm/LeakyBucket.c index 151f620..1151c83 100644 --- a/drivers/staging/bcm/LeakyBucket.c +++ b/drivers/staging/bcm/LeakyBucket.c @@ -34,18 +34,17 @@ static VOID UpdateTokenCount(register struct bcm_mini_adapter *Adapter) for (i = 0; i < NO_OF_QUEUES; i++) { curr_pi = &Adapter->PackInfo[i]; - if (TRUE == curr_pi->bValid && - (1 == curr_pi->ucDirection)) { - liCurrentTime = ((tv.tv_sec- + if (TRUE == curr_pi->bValid && (1 == curr_pi->ucDirection)) { + liCurrentTime = ((tv.tv_sec - curr_pi->stLastUpdateTokenAt.tv_sec)*1000 + - (tv.tv_usec-curr_pi->stLastUpdateTokenAt.tv_usec)/ + (tv.tv_usec - curr_pi->stLastUpdateTokenAt.tv_usec) / 1000); if (0 != liCurrentTime) { curr_pi->uiCurrentTokenCount += (ULONG) ((curr_pi->uiMaxAllowedRate) * ((ULONG)((liCurrentTime)))/1000); - memcpy(&curr_pi->stLastUpdateTokenAt, - &tv, sizeof(struct timeval)); + memcpy(&curr_pi->stLastUpdateTokenAt, &tv, + sizeof(struct timeval)); curr_pi->liLastUpdateTokenAt = liCurrentTime; if (curr_pi->uiCurrentTokenCount >= curr_pi->uiMaxBucketSize) { @@ -55,7 +54,8 @@ static VOID UpdateTokenCount(register struct bcm_mini_adapter *Adapter) } } } - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TOKEN_COUNTS, DBG_LVL_ALL, "<=====\n"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TOKEN_COUNTS, DBG_LVL_ALL, + "<=====\n"); return; } @@ -77,26 +77,35 @@ static VOID UpdateTokenCount(register struct bcm_mini_adapter *Adapter) ***********************************************************************/ static ULONG GetSFTokenCount(struct bcm_mini_adapter *Adapter, struct bcm_packet_info *psSF) { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TOKEN_COUNTS, DBG_LVL_ALL, "IsPacketAllowedForFlow ===>"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TOKEN_COUNTS, DBG_LVL_ALL, + "IsPacketAllowedForFlow ===>"); + /* Validate the parameters */ if (NULL == Adapter || (psSF < Adapter->PackInfo && (uintptr_t)psSF > (uintptr_t) &Adapter->PackInfo[HiPriority])) { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TOKEN_COUNTS, DBG_LVL_ALL, "IPAFF: Got wrong Parameters:Adapter: %p, QIndex: %zd\n", Adapter, (psSF-Adapter->PackInfo)); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TOKEN_COUNTS, DBG_LVL_ALL, + "IPAFF: Got wrong Parameters:Adapter: %p, QIndex: %zd\n", + Adapter, (psSF-Adapter->PackInfo)); return 0; } if (false != psSF->bValid && psSF->ucDirection) { if (0 != psSF->uiCurrentTokenCount) { - return psSF->uiCurrentTokenCount; + return psSF->uiCurrentTokenCount; } else { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TOKEN_COUNTS, DBG_LVL_ALL, "Not enough tokens in queue %zd Available %u\n", - psSF-Adapter->PackInfo, psSF->uiCurrentTokenCount); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TOKEN_COUNTS, + DBG_LVL_ALL, + "Not enough tokens in queue %zd Available %u\n", + psSF-Adapter->PackInfo, psSF->uiCurrentTokenCount); psSF->uiPendedLast = 1; } } else { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TOKEN_COUNTS, DBG_LVL_ALL, "IPAFF: Queue %zd not valid\n", psSF-Adapter->PackInfo); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TOKEN_COUNTS, DBG_LVL_ALL, + "IPAFF: Queue %zd not valid\n", + psSF-Adapter->PackInfo); } - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TOKEN_COUNTS, DBG_LVL_ALL, "IsPacketAllowedForFlow <==="); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TOKEN_COUNTS, DBG_LVL_ALL, + "IsPacketAllowedForFlow <==="); return 0; } @@ -106,15 +115,17 @@ This function despatches packet from the specified queue. @return Zero(success) or Negative value(failure) */ static INT SendPacketFromQueue(struct bcm_mini_adapter *Adapter,/**<Logical Adapter*/ - struct bcm_packet_info *psSF, /**<Queue identifier*/ + struct bcm_packet_info *psSF, /**<Queue identifier*/ struct sk_buff *Packet) /**<Pointer to the packet to be sent*/ { INT Status = STATUS_FAILURE; UINT uiIndex = 0, PktLen = 0; - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, SEND_QUEUE, DBG_LVL_ALL, "=====>"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, SEND_QUEUE, DBG_LVL_ALL, + "=====>"); if (!Adapter || !Packet || !psSF) { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, SEND_QUEUE, DBG_LVL_ALL, "Got NULL Adapter or Packet"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, SEND_QUEUE, DBG_LVL_ALL, + "Got NULL Adapter or Packet"); return -EINVAL; } @@ -125,11 +136,13 @@ static INT SendPacketFromQueue(struct bcm_mini_adapter *Adapter,/**<Logical Adap Status = SetupNextSend(Adapter, Packet, psSF->usVCID_Value); if (Status == 0) { for (uiIndex = 0; uiIndex < MIBS_MAX_HIST_ENTRIES; uiIndex++) { - if ((PktLen <= MIBS_PKTSIZEHIST_RANGE*(uiIndex+1)) && (PktLen > MIBS_PKTSIZEHIST_RANGE*(uiIndex))) + if ((PktLen <= MIBS_PKTSIZEHIST_RANGE*(uiIndex+1)) && + (PktLen > MIBS_PKTSIZEHIST_RANGE*(uiIndex))) Adapter->aTxPktSizeHist[uiIndex]++; } } - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, SEND_QUEUE, DBG_LVL_ALL, "<====="); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, SEND_QUEUE, DBG_LVL_ALL, + "<====="); return Status; } @@ -145,7 +158,8 @@ static INT SendPacketFromQueue(struct bcm_mini_adapter *Adapter,/**<Logical Adap * Returns - None. * ****************************************************************************/ -static VOID CheckAndSendPacketFromIndex(struct bcm_mini_adapter *Adapter, struct bcm_packet_info *psSF) +static VOID CheckAndSendPacketFromIndex(struct bcm_mini_adapter *Adapter, + struct bcm_packet_info *psSF) { struct sk_buff *QueuePacket = NULL; char *pControlPacket = NULL; @@ -153,18 +167,26 @@ static VOID CheckAndSendPacketFromIndex(struct bcm_mini_adapter *Adapter, struct int iPacketLen = 0; - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "%zd ====>", (psSF-Adapter->PackInfo)); - if ((psSF != &Adapter->PackInfo[HiPriority]) && Adapter->LinkUpStatus && atomic_read(&psSF->uiPerSFTxResourceCount)) { /* Get data packet */ + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, + "%zd ====>", (psSF-Adapter->PackInfo)); + if ((psSF != &Adapter->PackInfo[HiPriority]) && + Adapter->LinkUpStatus && + atomic_read(&psSF->uiPerSFTxResourceCount)) { /* Get data packet */ if (!psSF->ucDirection) return; - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "UpdateTokenCount "); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, + "UpdateTokenCount "); if (Adapter->IdleMode || Adapter->bPreparingForLowPowerMode) return; /* in idle mode */ /* Check for Free Descriptors */ - if (atomic_read(&Adapter->CurrNumFreeTxDesc) <= MINIMUM_PENDING_DESCRIPTORS) { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, " No Free Tx Descriptor(%d) is available for Data pkt..", atomic_read(&Adapter->CurrNumFreeTxDesc)); + if (atomic_read(&Adapter->CurrNumFreeTxDesc) <= + MINIMUM_PENDING_DESCRIPTORS) { + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, + DBG_LVL_ALL, + " No Free Tx Descriptor(%d) is available for Data pkt..", + atomic_read(&Adapter->CurrNumFreeTxDesc)); return; } @@ -172,7 +194,8 @@ static VOID CheckAndSendPacketFromIndex(struct bcm_mini_adapter *Adapter, struct QueuePacket = psSF->FirstTxQueue; if (QueuePacket) { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Dequeuing Data Packet"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, + DBG_LVL_ALL, "Dequeuing Data Packet"); if (psSF->bEthCSSupport) iPacketLen = QueuePacket->len; @@ -181,24 +204,36 @@ static VOID CheckAndSendPacketFromIndex(struct bcm_mini_adapter *Adapter, struct iPacketLen <<= 3; if (iPacketLen <= GetSFTokenCount(Adapter, psSF)) { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Allowed bytes %d", + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, + TX_PACKETS, DBG_LVL_ALL, + "Allowed bytes %d", (iPacketLen >> 3)); - DEQUEUEPACKET(psSF->FirstTxQueue, psSF->LastTxQueue); - psSF->uiCurrentBytesOnHost -= (QueuePacket->len); + DEQUEUEPACKET(psSF->FirstTxQueue, + psSF->LastTxQueue); + psSF->uiCurrentBytesOnHost -= + (QueuePacket->len); psSF->uiCurrentPacketsOnHost--; atomic_dec(&Adapter->TotalPacketCount); spin_unlock_bh(&psSF->SFQueueLock); - Status = SendPacketFromQueue(Adapter, psSF, QueuePacket); + Status = SendPacketFromQueue(Adapter, psSF, + QueuePacket); psSF->uiPendedLast = false; } else { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "For Queue: %zd\n", psSF-Adapter->PackInfo); - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "\nAvailable Tokens = %d required = %d\n", + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, + TX_PACKETS, DBG_LVL_ALL, + "For Queue: %zd\n", + psSF-Adapter->PackInfo); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, + TX_PACKETS, DBG_LVL_ALL, + "\nAvailable Tokens = %d required = %d\n", psSF->uiCurrentTokenCount, iPacketLen); /* - this part indicates that because of non-availability of the tokens - pkt has not been send out hence setting the pending flag indicating the host to send it out + this part indicates that because of + non-availability of the tokens + pkt has not been send out hence setting the + pending flag indicating the host to send it out first next iteration. */ psSF->uiPendedLast = TRUE; @@ -215,8 +250,11 @@ static VOID CheckAndSendPacketFromIndex(struct bcm_mini_adapter *Adapter, struct pControlPacket = Adapter->txctlpacket [(atomic_read(&Adapter->index_rd_txcntrlpkt)%MAX_CNTRL_PKTS)]; if (pControlPacket) { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Sending Control packet"); - Status = SendControlPacket(Adapter, pControlPacket); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, + DBG_LVL_ALL, + "Sending Control packet"); + Status = SendControlPacket(Adapter, + pControlPacket); if (STATUS_SUCCESS == Status) { spin_lock_bh(&psSF->SFQueueLock); psSF->NumOfPacketsSent++; @@ -228,10 +266,14 @@ static VOID CheckAndSendPacketFromIndex(struct bcm_mini_adapter *Adapter, struct atomic_inc(&Adapter->index_rd_txcntrlpkt); spin_unlock_bh(&psSF->SFQueueLock); } else { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "SendControlPacket Failed\n"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, + TX_PACKETS, DBG_LVL_ALL, + "SendControlPacket Failed\n"); } } else { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, " Control Pkt is not available, Indexing is wrong...."); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, + TX_PACKETS, DBG_LVL_ALL, + " Control Pkt is not available, Indexing is wrong...."); } } } @@ -255,22 +297,27 @@ VOID transmit_packets(struct bcm_mini_adapter *Adapter) bool exit_flag = TRUE; - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "=====>"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, + "=====>"); if (NULL == Adapter) { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Got NULL Adapter"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, + "Got NULL Adapter"); return; } if (Adapter->device_removed == TRUE) { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Device removed"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, + "Device removed"); return; } - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "\nUpdateTokenCount ====>\n"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, + "\nUpdateTokenCount ====>\n"); UpdateTokenCount(Adapter); - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "\nPruneQueueAllSF ====>\n"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, + "\nPruneQueueAllSF ====>\n"); PruneQueueAllSF(Adapter); @@ -283,8 +330,11 @@ VOID transmit_packets(struct bcm_mini_adapter *Adapter) if (Adapter->PackInfo[iIndex].bValid && Adapter->PackInfo[iIndex].uiPendedLast && Adapter->PackInfo[iIndex].uiCurrentBytesOnHost) { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Calling CheckAndSendPacketFromIndex.."); - CheckAndSendPacketFromIndex(Adapter, &Adapter->PackInfo[iIndex]); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, + DBG_LVL_ALL, + "Calling CheckAndSendPacketFromIndex.."); + CheckAndSendPacketFromIndex(Adapter, + &Adapter->PackInfo[iIndex]); uiPrevTotalCount--; } } @@ -293,13 +343,16 @@ VOID transmit_packets(struct bcm_mini_adapter *Adapter) exit_flag = TRUE; /* second iteration to parse non-pending queues */ for (iIndex = HiPriority; iIndex >= 0; iIndex--) { - if (!uiPrevTotalCount || (TRUE == Adapter->device_removed)) + if (!uiPrevTotalCount || + (TRUE == Adapter->device_removed)) break; if (Adapter->PackInfo[iIndex].bValid && Adapter->PackInfo[iIndex].uiCurrentBytesOnHost && !Adapter->PackInfo[iIndex].uiPendedLast) { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Calling CheckAndSendPacketFromIndex.."); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, + TX_PACKETS, DBG_LVL_ALL, + "Calling CheckAndSendPacketFromIndex.."); CheckAndSendPacketFromIndex(Adapter, &Adapter->PackInfo[iIndex]); uiPrevTotalCount--; exit_flag = false; @@ -307,7 +360,8 @@ VOID transmit_packets(struct bcm_mini_adapter *Adapter) } if (Adapter->IdleMode || Adapter->bPreparingForLowPowerMode) { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "In Idle Mode\n"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, + DBG_LVL_ALL, "In Idle Mode\n"); break; } if (exit_flag == TRUE) @@ -316,5 +370,6 @@ VOID transmit_packets(struct bcm_mini_adapter *Adapter) update_per_cid_rx(Adapter); Adapter->txtransmit_running = 0; - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "<======"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, + "<======"); } -- 2.0.1 _______________________________________________ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel