mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
3.7 KiB
194 lines
3.7 KiB
/*++
|
|
|
|
Copyright (c) 1995,1996 Microsoft Corporation
|
|
:ts=4
|
|
|
|
Module Name:
|
|
|
|
bandwdth.c
|
|
|
|
Abstract:
|
|
|
|
This module contains code to calculate
|
|
bandwidth usage.
|
|
|
|
Environment:
|
|
|
|
kernel mode only
|
|
|
|
Notes:
|
|
|
|
Revision History:
|
|
|
|
2-15-95 : created
|
|
|
|
--*/
|
|
|
|
#include "wdm.h"
|
|
#include "stdarg.h"
|
|
#include "stdio.h"
|
|
|
|
|
|
#include "usbdi.h"
|
|
#include "hcdi.h"
|
|
#include "uhcd.h"
|
|
|
|
|
|
VOID
|
|
UHCD_InitBandwidthTable(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialize our array that tracks the bw in use.
|
|
|
|
Arguments:
|
|
|
|
DeviceObject - pointer to a device object
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
ULONG i;
|
|
PDEVICE_EXTENSION deviceExtension;
|
|
|
|
deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
|
|
|
|
//
|
|
// Note: BwTable stores bytes per frame
|
|
//
|
|
|
|
for (i=0; i<MAX_INTERVAL; i++) {
|
|
//
|
|
// max bytes per frame - bw reaerved for bulk and control
|
|
//
|
|
deviceExtension->BwTable[i] =
|
|
UHCD_TOTAL_USB_BW - UHCD_BULK_CONTROL_BW;
|
|
}
|
|
}
|
|
|
|
#if DBG
|
|
ULONG UHCD_PnpTest = 0;
|
|
#endif
|
|
|
|
BOOLEAN
|
|
UHCD_ManageBandwidth(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PUHCD_ENDPOINT Endpoint,
|
|
IN ULONG Offset,
|
|
IN BOOLEAN AllocateFlag
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Calculate bandwidth required to open an endpoint
|
|
with the given input characteristics.
|
|
|
|
Arguments:
|
|
|
|
DeviceObject - pointer to a device object
|
|
|
|
Offset - offset in to table to start, allows load balancing
|
|
for interrupt endpoints.
|
|
|
|
Interval - interval for endoint (1 for iso).
|
|
|
|
AllocateFlag - TRUE if we are requesting BW, false if we
|
|
are releasing it.
|
|
|
|
Return Value:
|
|
|
|
TRUE if enough bandwidth available open the
|
|
endpoint.
|
|
|
|
--*/
|
|
{
|
|
ULONG i;
|
|
PDEVICE_EXTENSION deviceExtension;
|
|
BOOLEAN ok=TRUE;
|
|
ULONG interval, need;
|
|
|
|
ASSERT_ENDPOINT(Endpoint);
|
|
|
|
deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
|
|
|
|
//UHCD_KdPrint((2, "BWTable = %x\n", &deviceExtension->BwTable[0]));
|
|
//UHCD_KdBreak();
|
|
|
|
//
|
|
// claculate what we'll need based on endpoint
|
|
// type and max packet size
|
|
//
|
|
|
|
need =
|
|
USBD_CalculateUsbBandwidth(Endpoint->MaxPacketSize,
|
|
Endpoint->Type,
|
|
(BOOLEAN) (Endpoint->EndpointFlags & EPFLAG_LOWSPEED));
|
|
|
|
interval = Endpoint->Interval;
|
|
|
|
LOGENTRY(LOG_MISC, 'aBW1',
|
|
interval,
|
|
Offset,
|
|
need);
|
|
|
|
UHCD_ASSERT(interval<=MAX_INTERVAL);
|
|
UHCD_ASSERT(Offset<interval);
|
|
UHCD_ASSERT(MAX_INTERVAL % interval == 0);
|
|
|
|
if (AllocateFlag) {
|
|
for (i=Offset; i<MAX_INTERVAL; i+=interval) {
|
|
if (deviceExtension->BwTable[i] < need) {
|
|
ok = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
#if DBG
|
|
if (UHCD_PnpTest == 1) {
|
|
ok = FALSE;
|
|
}
|
|
#endif
|
|
|
|
if (ok) {
|
|
|
|
//
|
|
// there is enough, go ahead and allocate
|
|
//
|
|
|
|
Endpoint->Offset = (USHORT) Offset;
|
|
|
|
for (i=Offset; i<MAX_INTERVAL; i+=interval) {
|
|
|
|
if (AllocateFlag) {
|
|
deviceExtension->BwTable[i] -= need;
|
|
} else {
|
|
deviceExtension->BwTable[i] += need;
|
|
}
|
|
|
|
UHCD_ASSERT(deviceExtension->BwTable[i] <=
|
|
UHCD_TOTAL_USB_BW - UHCD_BULK_CONTROL_BW);
|
|
}
|
|
}
|
|
|
|
LOGENTRY(LOG_MISC, 'aBW2',
|
|
AllocateFlag,
|
|
ok,
|
|
&deviceExtension->BwTable[0]);
|
|
|
|
#ifdef MAX_DEBUG
|
|
if (!ok) {
|
|
UHCD_KdBreak((2, "'no bandwidth\n"));
|
|
}
|
|
#endif
|
|
|
|
return ok;
|
|
|
|
}
|