Staging: hv: Remove C99 comments

Remove C99 // comments with traditional /* */ comments

Signed-off-by: Bill Pemberton <wfp5p@virginia.edu>
Cc: Hank Janssen <hjanssen@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Bill Pemberton 2009-07-27 16:47:24 -04:00 committed by Greg Kroah-Hartman
parent 226408a499
commit 454f18a963
42 changed files with 2600 additions and 2517 deletions

View file

@ -26,12 +26,12 @@
static const char* gBlkDriverName="blkvsc"; static const char* gBlkDriverName="blkvsc";
//{32412632-86cb-44a2-9b5c-50d1417354f5} /* {32412632-86cb-44a2-9b5c-50d1417354f5} */
static const GUID gBlkVscDeviceType={ static const GUID gBlkVscDeviceType={
.Data = {0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5} .Data = {0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5}
}; };
// Static routines /* Static routines */
static int static int
BlkVscOnDeviceAdd( BlkVscOnDeviceAdd(
DEVICE_OBJECT *Device, DEVICE_OBJECT *Device,
@ -49,21 +49,21 @@ BlkVscInitialize(
DPRINT_ENTER(BLKVSC); DPRINT_ENTER(BLKVSC);
// Make sure we are at least 2 pages since 1 page is used for control /* Make sure we are at least 2 pages since 1 page is used for control */
ASSERT(storDriver->RingBufferSize >= (PAGE_SIZE << 1)); ASSERT(storDriver->RingBufferSize >= (PAGE_SIZE << 1));
Driver->name = gBlkDriverName; Driver->name = gBlkDriverName;
memcpy(&Driver->deviceType, &gBlkVscDeviceType, sizeof(GUID)); memcpy(&Driver->deviceType, &gBlkVscDeviceType, sizeof(GUID));
storDriver->RequestExtSize = sizeof(STORVSC_REQUEST_EXTENSION); storDriver->RequestExtSize = sizeof(STORVSC_REQUEST_EXTENSION);
// Divide the ring buffer data size (which is 1 page less than the ring buffer size since that page is reserved for the ring buffer indices) /* Divide the ring buffer data size (which is 1 page less than the ring buffer size since that page is reserved for the ring buffer indices) */
// by the max request size (which is VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER + VSTOR_PACKET + u64) /* by the max request size (which is VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER + VSTOR_PACKET + u64) */
storDriver->MaxOutstandingRequestsPerChannel = storDriver->MaxOutstandingRequestsPerChannel =
((storDriver->RingBufferSize - PAGE_SIZE) / ALIGN_UP(MAX_MULTIPAGE_BUFFER_PACKET + sizeof(VSTOR_PACKET) + sizeof(u64),sizeof(u64))); ((storDriver->RingBufferSize - PAGE_SIZE) / ALIGN_UP(MAX_MULTIPAGE_BUFFER_PACKET + sizeof(VSTOR_PACKET) + sizeof(u64),sizeof(u64)));
DPRINT_INFO(BLKVSC, "max io outstd %u", storDriver->MaxOutstandingRequestsPerChannel); DPRINT_INFO(BLKVSC, "max io outstd %u", storDriver->MaxOutstandingRequestsPerChannel);
// Setup the dispatch table /* Setup the dispatch table */
storDriver->Base.OnDeviceAdd = BlkVscOnDeviceAdd; storDriver->Base.OnDeviceAdd = BlkVscOnDeviceAdd;
storDriver->Base.OnDeviceRemove = StorVscOnDeviceRemove; storDriver->Base.OnDeviceRemove = StorVscOnDeviceRemove;
storDriver->Base.OnCleanup = StorVscOnCleanup; storDriver->Base.OnCleanup = StorVscOnCleanup;
@ -95,8 +95,8 @@ BlkVscOnDeviceAdd(
return ret; return ret;
} }
// We need to use the device instance guid to set the path and target id. For IDE devices, the /* We need to use the device instance guid to set the path and target id. For IDE devices, the */
// device instance id is formatted as <bus id> - <device id> - 8899 - 000000000000. /* device instance id is formatted as <bus id> - <device id> - 8899 - 000000000000. */
deviceInfo->PathId = Device->deviceInstance.Data[3] << 24 | Device->deviceInstance.Data[2] << 16 | deviceInfo->PathId = Device->deviceInstance.Data[3] << 24 | Device->deviceInstance.Data[2] << 16 |
Device->deviceInstance.Data[1] << 8 |Device->deviceInstance.Data[0]; Device->deviceInstance.Data[1] << 8 |Device->deviceInstance.Data[0];

View file

@ -27,13 +27,11 @@
#include "VmbusPrivate.h" #include "VmbusPrivate.h"
// /* Internal routines */
// Internal routines
//
static int static int
VmbusChannelCreateGpadlHeader( VmbusChannelCreateGpadlHeader(
void * Kbuffer, // must be phys and virt contiguous void * Kbuffer, /* must be phys and virt contiguous */
u32 Size, // page-size multiple u32 Size, /* page-size multiple */
VMBUS_CHANNEL_MSGINFO **msgInfo, VMBUS_CHANNEL_MSGINFO **msgInfo,
u32 *MessageCount u32 *MessageCount
); );
@ -105,11 +103,11 @@ VmbusChannelSetEvent(
if (Channel->OfferMsg.MonitorAllocated) if (Channel->OfferMsg.MonitorAllocated)
{ {
// Each u32 represents 32 channels /* Each u32 represents 32 channels */
BitSet((u32*)gVmbusConnection.SendInterruptPage + (Channel->OfferMsg.ChildRelId >> 5), Channel->OfferMsg.ChildRelId & 31); BitSet((u32*)gVmbusConnection.SendInterruptPage + (Channel->OfferMsg.ChildRelId >> 5), Channel->OfferMsg.ChildRelId & 31);
monitorPage = (HV_MONITOR_PAGE*)gVmbusConnection.MonitorPages; monitorPage = (HV_MONITOR_PAGE*)gVmbusConnection.MonitorPages;
monitorPage++; // Get the child to parent monitor page monitorPage++; /* Get the child to parent monitor page */
BitSet((u32*) &monitorPage->TriggerGroup[Channel->MonitorGroup].Pending, Channel->MonitorBit); BitSet((u32*) &monitorPage->TriggerGroup[Channel->MonitorGroup].Pending, Channel->MonitorBit);
} }
@ -133,11 +131,11 @@ VmbusChannelClearEvent(
if (Channel->OfferMsg.MonitorAllocated) if (Channel->OfferMsg.MonitorAllocated)
{ {
// Each u32 represents 32 channels /* Each u32 represents 32 channels */
BitClear((u32*)gVmbusConnection.SendInterruptPage + (Channel->OfferMsg.ChildRelId >> 5), Channel->OfferMsg.ChildRelId & 31); BitClear((u32*)gVmbusConnection.SendInterruptPage + (Channel->OfferMsg.ChildRelId >> 5), Channel->OfferMsg.ChildRelId & 31);
monitorPage = (HV_MONITOR_PAGE*)gVmbusConnection.MonitorPages; monitorPage = (HV_MONITOR_PAGE*)gVmbusConnection.MonitorPages;
monitorPage++; // Get the child to parent monitor page monitorPage++; /* Get the child to parent monitor page */
BitClear((u32*) &monitorPage->TriggerGroup[Channel->MonitorGroup].Pending, Channel->MonitorBit); BitClear((u32*) &monitorPage->TriggerGroup[Channel->MonitorGroup].Pending, Channel->MonitorBit);
} }
@ -164,7 +162,7 @@ VmbusChannelGetDebugInfo(
HV_MONITOR_PAGE *monitorPage; HV_MONITOR_PAGE *monitorPage;
u8 monitorGroup = (u8)Channel->OfferMsg.MonitorId / 32; u8 monitorGroup = (u8)Channel->OfferMsg.MonitorId / 32;
u8 monitorOffset = (u8)Channel->OfferMsg.MonitorId % 32; u8 monitorOffset = (u8)Channel->OfferMsg.MonitorId % 32;
//u32 monitorBit = 1 << monitorOffset; /* u32 monitorBit = 1 << monitorOffset; */
DebugInfo->RelId = Channel->OfferMsg.ChildRelId; DebugInfo->RelId = Channel->OfferMsg.ChildRelId;
DebugInfo->State = Channel->State; DebugInfo->State = Channel->State;
@ -218,16 +216,16 @@ VmbusChannelOpen(
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
// Aligned to page size /* Aligned to page size */
ASSERT(!(SendRingBufferSize & (PAGE_SIZE -1))); ASSERT(!(SendRingBufferSize & (PAGE_SIZE -1)));
ASSERT(!(RecvRingBufferSize & (PAGE_SIZE -1))); ASSERT(!(RecvRingBufferSize & (PAGE_SIZE -1)));
NewChannel->OnChannelCallback = pfnOnChannelCallback; NewChannel->OnChannelCallback = pfnOnChannelCallback;
NewChannel->ChannelCallbackContext = Context; NewChannel->ChannelCallbackContext = Context;
// Allocate the ring buffer /* Allocate the ring buffer */
out = PageAlloc((SendRingBufferSize + RecvRingBufferSize) >> PAGE_SHIFT); out = PageAlloc((SendRingBufferSize + RecvRingBufferSize) >> PAGE_SHIFT);
//out = kzalloc(sendRingBufferSize + recvRingBufferSize, GFP_KERNEL); /* out = kzalloc(sendRingBufferSize + recvRingBufferSize, GFP_KERNEL); */
ASSERT(out); ASSERT(out);
ASSERT(((unsigned long)out & (PAGE_SIZE-1)) == 0); ASSERT(((unsigned long)out & (PAGE_SIZE-1)) == 0);
@ -240,7 +238,7 @@ VmbusChannelOpen(
RingBufferInit(&NewChannel->Inbound, in, RecvRingBufferSize); RingBufferInit(&NewChannel->Inbound, in, RecvRingBufferSize);
// Establish the gpadl for the ring buffer /* Establish the gpadl for the ring buffer */
DPRINT_DBG(VMBUS, "Establishing ring buffer's gpadl for channel %p...", NewChannel); DPRINT_DBG(VMBUS, "Establishing ring buffer's gpadl for channel %p...", NewChannel);
NewChannel->RingBufferGpadlHandle = 0; NewChannel->RingBufferGpadlHandle = 0;
@ -260,7 +258,7 @@ VmbusChannelOpen(
NewChannel->Inbound.RingSize, NewChannel->Inbound.RingSize,
SendRingBufferSize); SendRingBufferSize);
// Create and init the channel open message /* Create and init the channel open message */
openInfo = kmalloc(sizeof(VMBUS_CHANNEL_MSGINFO) + sizeof(VMBUS_CHANNEL_OPEN_CHANNEL), GFP_KERNEL); openInfo = kmalloc(sizeof(VMBUS_CHANNEL_MSGINFO) + sizeof(VMBUS_CHANNEL_OPEN_CHANNEL), GFP_KERNEL);
ASSERT(openInfo != NULL); ASSERT(openInfo != NULL);
@ -268,12 +266,12 @@ VmbusChannelOpen(
openMsg = (VMBUS_CHANNEL_OPEN_CHANNEL*)openInfo->Msg; openMsg = (VMBUS_CHANNEL_OPEN_CHANNEL*)openInfo->Msg;
openMsg->Header.MessageType = ChannelMessageOpenChannel; openMsg->Header.MessageType = ChannelMessageOpenChannel;
openMsg->OpenId = NewChannel->OfferMsg.ChildRelId; // FIXME openMsg->OpenId = NewChannel->OfferMsg.ChildRelId; /* FIXME */
openMsg->ChildRelId = NewChannel->OfferMsg.ChildRelId; openMsg->ChildRelId = NewChannel->OfferMsg.ChildRelId;
openMsg->RingBufferGpadlHandle = NewChannel->RingBufferGpadlHandle; openMsg->RingBufferGpadlHandle = NewChannel->RingBufferGpadlHandle;
ASSERT(openMsg->RingBufferGpadlHandle); ASSERT(openMsg->RingBufferGpadlHandle);
openMsg->DownstreamRingBufferPageOffset = SendRingBufferSize >> PAGE_SHIFT; openMsg->DownstreamRingBufferPageOffset = SendRingBufferSize >> PAGE_SHIFT;
openMsg->ServerContextAreaGpadlHandle = 0; // TODO openMsg->ServerContextAreaGpadlHandle = 0; /* TODO */
ASSERT(UserDataLen <= MAX_USER_DEFINED_BYTES); ASSERT(UserDataLen <= MAX_USER_DEFINED_BYTES);
if (UserDataLen) if (UserDataLen)
@ -294,7 +292,7 @@ VmbusChannelOpen(
goto Cleanup; goto Cleanup;
} }
// FIXME: Need to time-out here /* FIXME: Need to time-out here */
WaitEventWait(openInfo->WaitEvent); WaitEventWait(openInfo->WaitEvent);
if (openInfo->Response.OpenResult.Status == 0) if (openInfo->Response.OpenResult.Status == 0)
@ -392,8 +390,8 @@ Description:
--*/ --*/
static int static int
VmbusChannelCreateGpadlHeader( VmbusChannelCreateGpadlHeader(
void * Kbuffer, // from kmalloc() void * Kbuffer, /* from kmalloc() */
u32 Size, // page-size multiple u32 Size, /* page-size multiple */
VMBUS_CHANNEL_MSGINFO **MsgInfo, VMBUS_CHANNEL_MSGINFO **MsgInfo,
u32 *MessageCount) u32 *MessageCount)
{ {
@ -408,19 +406,19 @@ VmbusChannelCreateGpadlHeader(
int pfnSum, pfnCount, pfnLeft, pfnCurr, pfnSize; int pfnSum, pfnCount, pfnLeft, pfnCurr, pfnSize;
//ASSERT( (kbuffer & (PAGE_SIZE-1)) == 0); /* ASSERT( (kbuffer & (PAGE_SIZE-1)) == 0); */
ASSERT( (Size & (PAGE_SIZE-1)) == 0); ASSERT( (Size & (PAGE_SIZE-1)) == 0);
pageCount = Size >> PAGE_SHIFT; pageCount = Size >> PAGE_SHIFT;
pfn = GetPhysicalAddress(Kbuffer) >> PAGE_SHIFT; pfn = GetPhysicalAddress(Kbuffer) >> PAGE_SHIFT;
// do we need a gpadl body msg /* do we need a gpadl body msg */
pfnSize = MAX_SIZE_CHANNEL_MESSAGE - sizeof(VMBUS_CHANNEL_GPADL_HEADER) - sizeof(GPA_RANGE); pfnSize = MAX_SIZE_CHANNEL_MESSAGE - sizeof(VMBUS_CHANNEL_GPADL_HEADER) - sizeof(GPA_RANGE);
pfnCount = pfnSize / sizeof(u64); pfnCount = pfnSize / sizeof(u64);
if (pageCount > pfnCount) // we need a gpadl body if (pageCount > pfnCount) /* we need a gpadl body */
{ {
// fill in the header /* fill in the header */
msgSize = sizeof(VMBUS_CHANNEL_MSGINFO) + sizeof(VMBUS_CHANNEL_GPADL_HEADER) + sizeof(GPA_RANGE) + pfnCount*sizeof(u64); msgSize = sizeof(VMBUS_CHANNEL_MSGINFO) + sizeof(VMBUS_CHANNEL_GPADL_HEADER) + sizeof(GPA_RANGE) + pfnCount*sizeof(u64);
msgHeader = kzalloc(msgSize, GFP_KERNEL); msgHeader = kzalloc(msgSize, GFP_KERNEL);
@ -442,11 +440,11 @@ VmbusChannelCreateGpadlHeader(
pfnSum = pfnCount; pfnSum = pfnCount;
pfnLeft = pageCount - pfnCount; pfnLeft = pageCount - pfnCount;
// how many pfns can we fit /* how many pfns can we fit */
pfnSize = MAX_SIZE_CHANNEL_MESSAGE - sizeof(VMBUS_CHANNEL_GPADL_BODY); pfnSize = MAX_SIZE_CHANNEL_MESSAGE - sizeof(VMBUS_CHANNEL_GPADL_BODY);
pfnCount = pfnSize / sizeof(u64); pfnCount = pfnSize / sizeof(u64);
// fill in the body /* fill in the body */
while (pfnLeft) while (pfnLeft)
{ {
if (pfnLeft > pfnCount) if (pfnLeft > pfnCount)
@ -465,14 +463,14 @@ VmbusChannelCreateGpadlHeader(
(*MessageCount)++; (*MessageCount)++;
gpadlBody = (VMBUS_CHANNEL_GPADL_BODY*)msgBody->Msg; gpadlBody = (VMBUS_CHANNEL_GPADL_BODY*)msgBody->Msg;
// FIXME: Gpadl is u32 and we are using a pointer which could be 64-bit /* FIXME: Gpadl is u32 and we are using a pointer which could be 64-bit */
//gpadlBody->Gpadl = kbuffer; /* gpadlBody->Gpadl = kbuffer; */
for (i=0; i<pfnCurr; i++) for (i=0; i<pfnCurr; i++)
{ {
gpadlBody->Pfn[i] = pfn + pfnSum + i; gpadlBody->Pfn[i] = pfn + pfnSum + i;
} }
// add to msg header /* add to msg header */
INSERT_TAIL_LIST(&msgHeader->SubMsgList, &msgBody->MsgListEntry); INSERT_TAIL_LIST(&msgHeader->SubMsgList, &msgBody->MsgListEntry);
pfnSum += pfnCurr; pfnSum += pfnCurr;
pfnLeft -= pfnCurr; pfnLeft -= pfnCurr;
@ -480,7 +478,7 @@ VmbusChannelCreateGpadlHeader(
} }
else else
{ {
// everything fits in a header /* everything fits in a header */
msgSize = sizeof(VMBUS_CHANNEL_MSGINFO) + sizeof(VMBUS_CHANNEL_GPADL_HEADER) + sizeof(GPA_RANGE) + pageCount*sizeof(u64); msgSize = sizeof(VMBUS_CHANNEL_MSGINFO) + sizeof(VMBUS_CHANNEL_GPADL_HEADER) + sizeof(GPA_RANGE) + pageCount*sizeof(u64);
msgHeader = kzalloc(msgSize, GFP_KERNEL); msgHeader = kzalloc(msgSize, GFP_KERNEL);
msgHeader->MessageSize=msgSize; msgHeader->MessageSize=msgSize;
@ -515,15 +513,15 @@ Description:
int int
VmbusChannelEstablishGpadl( VmbusChannelEstablishGpadl(
VMBUS_CHANNEL *Channel, VMBUS_CHANNEL *Channel,
void * Kbuffer, // from kmalloc() void * Kbuffer, /* from kmalloc() */
u32 Size, // page-size multiple u32 Size, /* page-size multiple */
u32 *GpadlHandle u32 *GpadlHandle
) )
{ {
int ret=0; int ret=0;
VMBUS_CHANNEL_GPADL_HEADER* gpadlMsg; VMBUS_CHANNEL_GPADL_HEADER* gpadlMsg;
VMBUS_CHANNEL_GPADL_BODY* gpadlBody; VMBUS_CHANNEL_GPADL_BODY* gpadlBody;
//VMBUS_CHANNEL_GPADL_CREATED* gpadlCreated; /* VMBUS_CHANNEL_GPADL_CREATED* gpadlCreated; */
VMBUS_CHANNEL_MSGINFO *msgInfo; VMBUS_CHANNEL_MSGINFO *msgInfo;
VMBUS_CHANNEL_MSGINFO *subMsgInfo; VMBUS_CHANNEL_MSGINFO *subMsgInfo;
@ -585,7 +583,7 @@ VmbusChannelEstablishGpadl(
} }
WaitEventWait(msgInfo->WaitEvent); WaitEventWait(msgInfo->WaitEvent);
// At this point, we received the gpadl created msg /* At this point, we received the gpadl created msg */
DPRINT_DBG(VMBUS, "Received GPADL created (relid %d, status %d handle %x)", DPRINT_DBG(VMBUS, "Received GPADL created (relid %d, status %d handle %x)",
Channel->OfferMsg.ChildRelId, Channel->OfferMsg.ChildRelId,
msgInfo->Response.GpadlCreated.CreationStatus, msgInfo->Response.GpadlCreated.CreationStatus,
@ -650,12 +648,12 @@ VmbusChannelTeardownGpadl(
ret = VmbusPostMessage(msg, sizeof(VMBUS_CHANNEL_GPADL_TEARDOWN)); ret = VmbusPostMessage(msg, sizeof(VMBUS_CHANNEL_GPADL_TEARDOWN));
if (ret != 0) if (ret != 0)
{ {
// TODO: /* TODO: */
} }
WaitEventWait(info->WaitEvent); WaitEventWait(info->WaitEvent);
// Received a torndown response /* Received a torndown response */
spin_lock_irqsave(&gVmbusConnection.channelmsg_lock, flags); spin_lock_irqsave(&gVmbusConnection.channelmsg_lock, flags);
REMOVE_ENTRY_LIST(&info->MsgListEntry); REMOVE_ENTRY_LIST(&info->MsgListEntry);
spin_unlock_irqrestore(&gVmbusConnection.channelmsg_lock, flags); spin_unlock_irqrestore(&gVmbusConnection.channelmsg_lock, flags);
@ -690,15 +688,15 @@ VmbusChannelClose(
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
// Stop callback and cancel the timer asap /* Stop callback and cancel the timer asap */
Channel->OnChannelCallback = NULL; Channel->OnChannelCallback = NULL;
TimerStop(Channel->PollTimer); TimerStop(Channel->PollTimer);
// Send a closing message /* Send a closing message */
info = kmalloc(sizeof(VMBUS_CHANNEL_MSGINFO) + sizeof(VMBUS_CHANNEL_CLOSE_CHANNEL), GFP_KERNEL); info = kmalloc(sizeof(VMBUS_CHANNEL_MSGINFO) + sizeof(VMBUS_CHANNEL_CLOSE_CHANNEL), GFP_KERNEL);
ASSERT(info != NULL); ASSERT(info != NULL);
//info->waitEvent = WaitEventCreate(); /* info->waitEvent = WaitEventCreate(); */
msg = (VMBUS_CHANNEL_CLOSE_CHANNEL*)info->Msg; msg = (VMBUS_CHANNEL_CLOSE_CHANNEL*)info->Msg;
msg->Header.MessageType = ChannelMessageCloseChannel; msg->Header.MessageType = ChannelMessageCloseChannel;
@ -707,18 +705,18 @@ VmbusChannelClose(
ret = VmbusPostMessage(msg, sizeof(VMBUS_CHANNEL_CLOSE_CHANNEL)); ret = VmbusPostMessage(msg, sizeof(VMBUS_CHANNEL_CLOSE_CHANNEL));
if (ret != 0) if (ret != 0)
{ {
// TODO: /* TODO: */
} }
// Tear down the gpadl for the channel's ring buffer /* Tear down the gpadl for the channel's ring buffer */
if (Channel->RingBufferGpadlHandle) if (Channel->RingBufferGpadlHandle)
{ {
VmbusChannelTeardownGpadl(Channel, Channel->RingBufferGpadlHandle); VmbusChannelTeardownGpadl(Channel, Channel->RingBufferGpadlHandle);
} }
// TODO: Send a msg to release the childRelId /* TODO: Send a msg to release the childRelId */
// Cleanup the ring buffers for this channel /* Cleanup the ring buffers for this channel */
RingBufferCleanup(&Channel->Outbound); RingBufferCleanup(&Channel->Outbound);
RingBufferCleanup(&Channel->Inbound); RingBufferCleanup(&Channel->Inbound);
@ -726,8 +724,13 @@ VmbusChannelClose(
kfree(info); kfree(info);
// If we are closing the channel during an error path in opening the channel, don't free the channel
// since the caller will free the channel /*
* If we are closing the channel during an error path in
* opening the channel, don't free the channel since the
* caller will free the channel
*/
if (Channel->State == CHANNEL_OPEN_STATE) if (Channel->State == CHANNEL_OPEN_STATE)
{ {
spin_lock_irqsave(&gVmbusConnection.channel_lock, flags); spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
@ -774,12 +777,12 @@ VmbusChannelSendPacket(
ASSERT((packetLenAligned - packetLen) < sizeof(u64)); ASSERT((packetLenAligned - packetLen) < sizeof(u64));
// Setup the descriptor /* Setup the descriptor */
desc.Type = Type;//VmbusPacketTypeDataInBand; desc.Type = Type; /* VmbusPacketTypeDataInBand; */
desc.Flags = Flags;//VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED; desc.Flags = Flags; /* VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED; */
desc.DataOffset8 = sizeof(VMPACKET_DESCRIPTOR) >> 3; // in 8-bytes granularity desc.DataOffset8 = sizeof(VMPACKET_DESCRIPTOR) >> 3; /* in 8-bytes granularity */
desc.Length8 = (u16)(packetLenAligned >> 3); desc.Length8 = (u16)(packetLenAligned >> 3);
desc.TransactionId = RequestId; desc.TransactionId = RequestId;
bufferList[0].Data = &desc; bufferList[0].Data = &desc;
bufferList[0].Length = sizeof(VMPACKET_DESCRIPTOR); bufferList[0].Length = sizeof(VMPACKET_DESCRIPTOR);
@ -795,7 +798,7 @@ VmbusChannelSendPacket(
bufferList, bufferList,
3); 3);
// TODO: We should determine if this is optional /* TODO: We should determine if this is optional */
if (ret == 0 && !GetRingBufferInterruptMask(&Channel->Outbound)) if (ret == 0 && !GetRingBufferInterruptMask(&Channel->Outbound))
{ {
VmbusChannelSetEvent(Channel); VmbusChannelSetEvent(Channel);
@ -841,19 +844,19 @@ VmbusChannelSendPacketPageBuffer(
DumpVmbusChannel(Channel); DumpVmbusChannel(Channel);
// Adjust the size down since VMBUS_CHANNEL_PACKET_PAGE_BUFFER is the largest size we support /* Adjust the size down since VMBUS_CHANNEL_PACKET_PAGE_BUFFER is the largest size we support */
descSize = sizeof(VMBUS_CHANNEL_PACKET_PAGE_BUFFER) - ((MAX_PAGE_BUFFER_COUNT - PageCount)*sizeof(PAGE_BUFFER)); descSize = sizeof(VMBUS_CHANNEL_PACKET_PAGE_BUFFER) - ((MAX_PAGE_BUFFER_COUNT - PageCount)*sizeof(PAGE_BUFFER));
packetLen = descSize + BufferLen; packetLen = descSize + BufferLen;
packetLenAligned = ALIGN_UP(packetLen, sizeof(u64)); packetLenAligned = ALIGN_UP(packetLen, sizeof(u64));
ASSERT((packetLenAligned - packetLen) < sizeof(u64)); ASSERT((packetLenAligned - packetLen) < sizeof(u64));
// Setup the descriptor /* Setup the descriptor */
desc.Type = VmbusPacketTypeDataUsingGpaDirect; desc.Type = VmbusPacketTypeDataUsingGpaDirect;
desc.Flags = VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED; desc.Flags = VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED;
desc.DataOffset8 = descSize >> 3; // in 8-bytes grandularity desc.DataOffset8 = descSize >> 3; /* in 8-bytes grandularity */
desc.Length8 = (u16)(packetLenAligned >> 3); desc.Length8 = (u16)(packetLenAligned >> 3);
desc.TransactionId = RequestId; desc.TransactionId = RequestId;
desc.RangeCount = PageCount; desc.RangeCount = PageCount;
for (i=0; i<PageCount; i++) for (i=0; i<PageCount; i++)
@ -877,7 +880,7 @@ VmbusChannelSendPacketPageBuffer(
bufferList, bufferList,
3); 3);
// TODO: We should determine if this is optional /* TODO: We should determine if this is optional */
if (ret == 0 && !GetRingBufferInterruptMask(&Channel->Outbound)) if (ret == 0 && !GetRingBufferInterruptMask(&Channel->Outbound))
{ {
VmbusChannelSetEvent(Channel); VmbusChannelSetEvent(Channel);
@ -926,19 +929,19 @@ VmbusChannelSendPacketMultiPageBuffer(
ASSERT(PfnCount > 0); ASSERT(PfnCount > 0);
ASSERT(PfnCount <= MAX_MULTIPAGE_BUFFER_COUNT); ASSERT(PfnCount <= MAX_MULTIPAGE_BUFFER_COUNT);
// Adjust the size down since VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER is the largest size we support /* Adjust the size down since VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER is the largest size we support */
descSize = sizeof(VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER) - ((MAX_MULTIPAGE_BUFFER_COUNT - PfnCount)*sizeof(u64)); descSize = sizeof(VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER) - ((MAX_MULTIPAGE_BUFFER_COUNT - PfnCount)*sizeof(u64));
packetLen = descSize + BufferLen; packetLen = descSize + BufferLen;
packetLenAligned = ALIGN_UP(packetLen, sizeof(u64)); packetLenAligned = ALIGN_UP(packetLen, sizeof(u64));
ASSERT((packetLenAligned - packetLen) < sizeof(u64)); ASSERT((packetLenAligned - packetLen) < sizeof(u64));
// Setup the descriptor /* Setup the descriptor */
desc.Type = VmbusPacketTypeDataUsingGpaDirect; desc.Type = VmbusPacketTypeDataUsingGpaDirect;
desc.Flags = VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED; desc.Flags = VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED;
desc.DataOffset8 = descSize >> 3; // in 8-bytes grandularity desc.DataOffset8 = descSize >> 3; /* in 8-bytes grandularity */
desc.Length8 = (u16)(packetLenAligned >> 3); desc.Length8 = (u16)(packetLenAligned >> 3);
desc.TransactionId = RequestId; desc.TransactionId = RequestId;
desc.RangeCount = 1; desc.RangeCount = 1;
desc.Range.Length = MultiPageBuffer->Length; desc.Range.Length = MultiPageBuffer->Length;
@ -960,7 +963,7 @@ VmbusChannelSendPacketMultiPageBuffer(
bufferList, bufferList,
3); 3);
// TODO: We should determine if this is optional /* TODO: We should determine if this is optional */
if (ret == 0 && !GetRingBufferInterruptMask(&Channel->Outbound)) if (ret == 0 && !GetRingBufferInterruptMask(&Channel->Outbound))
{ {
VmbusChannelSetEvent(Channel); VmbusChannelSetEvent(Channel);
@ -981,7 +984,7 @@ Description:
Retrieve the user packet on the specified channel Retrieve the user packet on the specified channel
--*/ --*/
// TODO: Do we ever receive a gpa direct packet other than the ones we send ? /* TODO: Do we ever receive a gpa direct packet other than the ones we send ? */
int int
VmbusChannelRecvPacket( VmbusChannelRecvPacket(
VMBUS_CHANNEL *Channel, VMBUS_CHANNEL *Channel,
@ -1009,16 +1012,16 @@ VmbusChannelRecvPacket(
{ {
spin_unlock_irqrestore(&Channel->inbound_lock, flags); spin_unlock_irqrestore(&Channel->inbound_lock, flags);
//DPRINT_DBG(VMBUS, "nothing to read!!"); /* DPRINT_DBG(VMBUS, "nothing to read!!"); */
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
return 0; return 0;
} }
//VmbusChannelClearEvent(Channel); /* VmbusChannelClearEvent(Channel); */
packetLen = desc.Length8 << 3; packetLen = desc.Length8 << 3;
userLen = packetLen - (desc.DataOffset8 << 3); userLen = packetLen - (desc.DataOffset8 << 3);
//ASSERT(userLen > 0); /* ASSERT(userLen > 0); */
DPRINT_DBG(VMBUS, "packet received on channel %p relid %d <type %d flag %d tid %llx pktlen %d datalen %d> ", DPRINT_DBG(VMBUS, "packet received on channel %p relid %d <type %d flag %d tid %llx pktlen %d datalen %d> ",
Channel, Channel,
@ -1041,7 +1044,7 @@ VmbusChannelRecvPacket(
*RequestId = desc.TransactionId; *RequestId = desc.TransactionId;
// Copy over the packet to the user buffer /* Copy over the packet to the user buffer */
ret = RingBufferRead(&Channel->Inbound, Buffer, userLen, (desc.DataOffset8 << 3)); ret = RingBufferRead(&Channel->Inbound, Buffer, userLen, (desc.DataOffset8 << 3));
spin_unlock_irqrestore(&Channel->inbound_lock, flags); spin_unlock_irqrestore(&Channel->inbound_lock, flags);
@ -1087,12 +1090,12 @@ VmbusChannelRecvPacketRaw(
{ {
spin_unlock_irqrestore(&Channel->inbound_lock, flags); spin_unlock_irqrestore(&Channel->inbound_lock, flags);
//DPRINT_DBG(VMBUS, "nothing to read!!"); /* DPRINT_DBG(VMBUS, "nothing to read!!"); */
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
return 0; return 0;
} }
//VmbusChannelClearEvent(Channel); /* VmbusChannelClearEvent(Channel); */
packetLen = desc.Length8 << 3; packetLen = desc.Length8 << 3;
userLen = packetLen - (desc.DataOffset8 << 3); userLen = packetLen - (desc.DataOffset8 << 3);
@ -1117,7 +1120,7 @@ VmbusChannelRecvPacketRaw(
*RequestId = desc.TransactionId; *RequestId = desc.TransactionId;
// Copy over the entire packet to the user buffer /* Copy over the entire packet to the user buffer */
ret = RingBufferRead(&Channel->Inbound, Buffer, packetLen, 0); ret = RingBufferRead(&Channel->Inbound, Buffer, packetLen, 0);
spin_unlock_irqrestore(&Channel->inbound_lock, flags); spin_unlock_irqrestore(&Channel->inbound_lock, flags);
@ -1199,4 +1202,4 @@ DumpVmbusChannel(
} }
// eof /* eof */

View file

@ -31,7 +31,7 @@
#pragma pack(push,1) #pragma pack(push,1)
// The format must be the same as VMDATA_GPA_DIRECT /* The format must be the same as VMDATA_GPA_DIRECT */
typedef struct _VMBUS_CHANNEL_PACKET_PAGE_BUFFER { typedef struct _VMBUS_CHANNEL_PACKET_PAGE_BUFFER {
u16 Type; u16 Type;
u16 DataOffset8; u16 DataOffset8;
@ -44,7 +44,7 @@ typedef struct _VMBUS_CHANNEL_PACKET_PAGE_BUFFER {
} VMBUS_CHANNEL_PACKET_PAGE_BUFFER; } VMBUS_CHANNEL_PACKET_PAGE_BUFFER;
// The format must be the same as VMDATA_GPA_DIRECT /* The format must be the same as VMDATA_GPA_DIRECT */
typedef struct _VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER { typedef struct _VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER {
u16 Type; u16 Type;
u16 DataOffset8; u16 DataOffset8;
@ -52,15 +52,15 @@ typedef struct _VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER {
u16 Flags; u16 Flags;
u64 TransactionId; u64 TransactionId;
u32 Reserved; u32 Reserved;
u32 RangeCount; // Always 1 in this case u32 RangeCount; /* Always 1 in this case */
MULTIPAGE_BUFFER Range; MULTIPAGE_BUFFER Range;
} VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER; } VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER;
#pragma pack(pop) #pragma pack(pop)
//
// Routines /* Routines */
//
static int static int
VmbusChannelOpen( VmbusChannelOpen(
@ -110,8 +110,8 @@ VmbusChannelSendPacketMultiPageBuffer(
static int static int
VmbusChannelEstablishGpadl( VmbusChannelEstablishGpadl(
VMBUS_CHANNEL *Channel, VMBUS_CHANNEL *Channel,
void * Kbuffer, // from kmalloc() void * Kbuffer, /* from kmalloc() */
u32 Size, // page-size multiple u32 Size, /* page-size multiple */
u32 *GpadlHandle u32 *GpadlHandle
); );
@ -154,4 +154,4 @@ static void
VmbusChannelOnTimer( VmbusChannelOnTimer(
void *Context void *Context
); );
#endif //_CHANNEL_H_ #endif /* _CHANNEL_H_ */

View file

@ -38,4 +38,4 @@ GetChannelInfo(
DEVICE_INFO *DeviceInfo DEVICE_INFO *DeviceInfo
); );
#endif // _CHANNEL_INTERFACE_H_ #endif /* _CHANNEL_INTERFACE_H_ */

View file

@ -27,13 +27,7 @@
#include "VmbusPrivate.h" #include "VmbusPrivate.h"
// /* Data types */
// Defines
//
//
// Data types
//
typedef void (*PFN_CHANNEL_MESSAGE_HANDLER)(VMBUS_CHANNEL_MESSAGE_HEADER* msg); typedef void (*PFN_CHANNEL_MESSAGE_HANDLER)(VMBUS_CHANNEL_MESSAGE_HEADER* msg);
@ -42,9 +36,7 @@ typedef struct _VMBUS_CHANNEL_MESSAGE_TABLE_ENTRY {
PFN_CHANNEL_MESSAGE_HANDLER messageHandler; PFN_CHANNEL_MESSAGE_HANDLER messageHandler;
} VMBUS_CHANNEL_MESSAGE_TABLE_ENTRY; } VMBUS_CHANNEL_MESSAGE_TABLE_ENTRY;
// /* Internal routines */
// Internal routines
//
static void static void
VmbusChannelOnOffer( VmbusChannelOnOffer(
@ -91,25 +83,23 @@ VmbusChannelProcessRescindOffer(
); );
// /* Globals */
// Globals
//
#define MAX_NUM_DEVICE_CLASSES_SUPPORTED 4 #define MAX_NUM_DEVICE_CLASSES_SUPPORTED 4
const GUID gSupportedDeviceClasses[MAX_NUM_DEVICE_CLASSES_SUPPORTED]= { const GUID gSupportedDeviceClasses[MAX_NUM_DEVICE_CLASSES_SUPPORTED]= {
//{ba6163d9-04a1-4d29-b605-72e2ffb1dc7f} /* {ba6163d9-04a1-4d29-b605-72e2ffb1dc7f} */
{.Data = {0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f}},// Storage - SCSI {.Data = {0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f}},/* Storage - SCSI */
//{F8615163-DF3E-46c5-913F-F2D2F965ED0E} /* {F8615163-DF3E-46c5-913F-F2D2F965ED0E} */
{.Data = {0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E}}, // Network {.Data = {0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E}}, /* Network */
//{CFA8B69E-5B4A-4cc0-B98B-8BA1A1F3F95A} /* {CFA8B69E-5B4A-4cc0-B98B-8BA1A1F3F95A} */
{.Data = {0x9E, 0xB6, 0xA8, 0xCF, 0x4A, 0x5B, 0xc0, 0x4c, 0xB9, 0x8B, 0x8B, 0xA1, 0xA1, 0xF3, 0xF9, 0x5A}}, // Input {.Data = {0x9E, 0xB6, 0xA8, 0xCF, 0x4A, 0x5B, 0xc0, 0x4c, 0xB9, 0x8B, 0x8B, 0xA1, 0xA1, 0xF3, 0xF9, 0x5A}}, /* Input */
//{32412632-86cb-44a2-9b5c-50d1417354f5} /* {32412632-86cb-44a2-9b5c-50d1417354f5} */
{.Data = {0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5}}, // IDE {.Data = {0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5}}, /* IDE */
}; };
// Channel message dispatch table /* Channel message dispatch table */
VMBUS_CHANNEL_MESSAGE_TABLE_ENTRY gChannelMessageTable[ChannelMessageCount]= { VMBUS_CHANNEL_MESSAGE_TABLE_ENTRY gChannelMessageTable[ChannelMessageCount]= {
{ChannelMessageInvalid, NULL}, {ChannelMessageInvalid, NULL},
{ChannelMessageOfferChannel, VmbusChannelOnOffer}, {ChannelMessageOfferChannel, VmbusChannelOnOffer},
@ -158,7 +148,7 @@ VMBUS_CHANNEL* AllocVmbusChannel(void)
return NULL; return NULL;
} }
//channel->dataWorkQueue = WorkQueueCreate("data"); /* channel->dataWorkQueue = WorkQueueCreate("data"); */
channel->ControlWQ = WorkQueueCreate("control"); channel->ControlWQ = WorkQueueCreate("control");
if (!channel->ControlWQ) if (!channel->ControlWQ)
{ {
@ -207,8 +197,8 @@ void FreeVmbusChannel(VMBUS_CHANNEL* Channel)
{ {
TimerClose(Channel->PollTimer); TimerClose(Channel->PollTimer);
// We have to release the channel's workqueue/thread in the vmbus's workqueue/thread context /* We have to release the channel's workqueue/thread in the vmbus's workqueue/thread context */
// ie we can't destroy ourselves. /* ie we can't destroy ourselves. */
WorkQueueQueueWorkItem(gVmbusConnection.WorkQueue, ReleaseVmbusChannel, (void*)Channel); WorkQueueQueueWorkItem(gVmbusConnection.WorkQueue, ReleaseVmbusChannel, (void*)Channel);
} }
@ -237,7 +227,7 @@ VmbusChannelProcessOffer(
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
// Make sure this is a new offer /* Make sure this is a new offer */
spin_lock_irqsave(&gVmbusConnection.channel_lock, flags); spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelList) ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelList)
@ -266,8 +256,8 @@ VmbusChannelProcessOffer(
return; return;
} }
// Start the process of binding this offer to the driver /* Start the process of binding this offer to the driver */
// We need to set the DeviceObject field before calling VmbusChildDeviceAdd() /* We need to set the DeviceObject field before calling VmbusChildDeviceAdd() */
newChannel->DeviceObject = VmbusChildDeviceCreate( newChannel->DeviceObject = VmbusChildDeviceCreate(
newChannel->OfferMsg.Offer.InterfaceType, newChannel->OfferMsg.Offer.InterfaceType,
newChannel->OfferMsg.Offer.InterfaceInstance, newChannel->OfferMsg.Offer.InterfaceInstance,
@ -275,8 +265,12 @@ VmbusChannelProcessOffer(
DPRINT_DBG(VMBUS, "child device object allocated - %p", newChannel->DeviceObject); DPRINT_DBG(VMBUS, "child device object allocated - %p", newChannel->DeviceObject);
// Add the new device to the bus. This will kick off device-driver binding /*
// which eventually invokes the device driver's AddDevice() method. * Add the new device to the bus. This will kick off device-driver
* binding which eventually invokes the device driver's AddDevice()
* method.
*/
ret = VmbusChildDeviceAdd(newChannel->DeviceObject); ret = VmbusChildDeviceAdd(newChannel->DeviceObject);
if (ret != 0) if (ret != 0)
{ {
@ -291,8 +285,11 @@ VmbusChannelProcessOffer(
} }
else else
{ {
// This state is used to indicate a successful open so that when we do close the channel normally, /*
// we can cleanup properly * This state is used to indicate a successful open
* so that when we do close the channel normally, we
* can cleanup properly
*/
newChannel->State = CHANNEL_OPEN_STATE; newChannel->State = CHANNEL_OPEN_STATE;
} }
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
@ -377,7 +374,7 @@ VmbusChannelOnOffer(
guidType->Data[3], guidType->Data[2], guidType->Data[1], guidType->Data[0], guidType->Data[5], guidType->Data[4], guidType->Data[7], guidType->Data[6], guidType->Data[8], guidType->Data[9], guidType->Data[10], guidType->Data[11], guidType->Data[12], guidType->Data[13], guidType->Data[14], guidType->Data[15], guidType->Data[3], guidType->Data[2], guidType->Data[1], guidType->Data[0], guidType->Data[5], guidType->Data[4], guidType->Data[7], guidType->Data[6], guidType->Data[8], guidType->Data[9], guidType->Data[10], guidType->Data[11], guidType->Data[12], guidType->Data[13], guidType->Data[14], guidType->Data[15],
guidInstance->Data[3], guidInstance->Data[2], guidInstance->Data[1], guidInstance->Data[0], guidInstance->Data[5], guidInstance->Data[4], guidInstance->Data[7], guidInstance->Data[6], guidInstance->Data[8], guidInstance->Data[9], guidInstance->Data[10], guidInstance->Data[11], guidInstance->Data[12], guidInstance->Data[13], guidInstance->Data[14], guidInstance->Data[15]); guidInstance->Data[3], guidInstance->Data[2], guidInstance->Data[1], guidInstance->Data[0], guidInstance->Data[5], guidInstance->Data[4], guidInstance->Data[7], guidInstance->Data[6], guidInstance->Data[8], guidInstance->Data[9], guidInstance->Data[10], guidInstance->Data[11], guidInstance->Data[12], guidInstance->Data[13], guidInstance->Data[14], guidInstance->Data[15]);
// Allocate the channel object and save this offer. /* Allocate the channel object and save this offer. */
newChannel = AllocVmbusChannel(); newChannel = AllocVmbusChannel();
if (!newChannel) if (!newChannel)
{ {
@ -391,7 +388,7 @@ VmbusChannelOnOffer(
newChannel->MonitorGroup = (u8)offer->MonitorId / 32; newChannel->MonitorGroup = (u8)offer->MonitorId / 32;
newChannel->MonitorBit = (u8)offer->MonitorId % 32; newChannel->MonitorBit = (u8)offer->MonitorId % 32;
// TODO: Make sure the offer comes from our parent partition /* TODO: Make sure the offer comes from our parent partition */
WorkQueueQueueWorkItem(newChannel->ControlWQ, VmbusChannelProcessOffer, newChannel); WorkQueueQueueWorkItem(newChannel->ControlWQ, VmbusChannelProcessOffer, newChannel);
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
@ -479,7 +476,7 @@ VmbusChannelOnOpenResult(
DPRINT_DBG(VMBUS, "vmbus open result - %d", result->Status); DPRINT_DBG(VMBUS, "vmbus open result - %d", result->Status);
// Find the open msg, copy the result and signal/unblock the wait event /* Find the open msg, copy the result and signal/unblock the wait event */
spin_lock_irqsave(&gVmbusConnection.channelmsg_lock, flags); spin_lock_irqsave(&gVmbusConnection.channelmsg_lock, flags);
ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelMsgList) ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelMsgList)
@ -533,7 +530,7 @@ VmbusChannelOnGpadlCreated(
DPRINT_DBG(VMBUS, "vmbus gpadl created result - %d", gpadlCreated->CreationStatus); DPRINT_DBG(VMBUS, "vmbus gpadl created result - %d", gpadlCreated->CreationStatus);
// Find the establish msg, copy the result and signal/unblock the wait event /* Find the establish msg, copy the result and signal/unblock the wait event */
spin_lock_irqsave(&gVmbusConnection.channelmsg_lock, flags); spin_lock_irqsave(&gVmbusConnection.channelmsg_lock, flags);
ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelMsgList) ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelMsgList)
@ -586,7 +583,7 @@ VmbusChannelOnGpadlTorndown(
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
// Find the open msg, copy the result and signal/unblock the wait event /* Find the open msg, copy the result and signal/unblock the wait event */
spin_lock_irqsave(&gVmbusConnection.channelmsg_lock, flags); spin_lock_irqsave(&gVmbusConnection.channelmsg_lock, flags);
ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelMsgList) ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelMsgList)
@ -702,7 +699,7 @@ VmbusOnChannelMessage(
DPRINT_ERR(VMBUS, "Unhandled channel message type %d", hdr->MessageType); DPRINT_ERR(VMBUS, "Unhandled channel message type %d", hdr->MessageType);
} }
// Free the msg that was allocated in VmbusOnMsgDPC() /* Free the msg that was allocated in VmbusOnMsgDPC() */
kfree(msg); kfree(msg);
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
} }
@ -751,7 +748,7 @@ VmbusChannelRequestOffers(
goto Cleanup; goto Cleanup;
} }
//WaitEventWait(msgInfo->waitEvent); /* WaitEventWait(msgInfo->waitEvent); */
/*SpinlockAcquire(gVmbusConnection.channelMsgLock); /*SpinlockAcquire(gVmbusConnection.channelMsgLock);
REMOVE_ENTRY_LIST(&msgInfo->msgListEntry); REMOVE_ENTRY_LIST(&msgInfo->msgListEntry);
@ -819,5 +816,4 @@ VmbusChannelReleaseUnattachedChannels(
spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags); spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
} }
// eof /* eof */

View file

@ -47,27 +47,27 @@ typedef struct _VMBUS_CHANNEL {
DEVICE_OBJECT* DeviceObject; DEVICE_OBJECT* DeviceObject;
HANDLE PollTimer; // SA-111 workaround HANDLE PollTimer; /* SA-111 workaround */
VMBUS_CHANNEL_STATE State; VMBUS_CHANNEL_STATE State;
VMBUS_CHANNEL_OFFER_CHANNEL OfferMsg; VMBUS_CHANNEL_OFFER_CHANNEL OfferMsg;
// These are based on the OfferMsg.MonitorId. Save it here for easy access. /* These are based on the OfferMsg.MonitorId. Save it here for easy access. */
u8 MonitorGroup; u8 MonitorGroup;
u8 MonitorBit; u8 MonitorBit;
u32 RingBufferGpadlHandle; u32 RingBufferGpadlHandle;
// Allocated memory for ring buffer /* Allocated memory for ring buffer */
void * RingBufferPages; void * RingBufferPages;
u32 RingBufferPageCount; u32 RingBufferPageCount;
RING_BUFFER_INFO Outbound; // send to parent RING_BUFFER_INFO Outbound; /* send to parent */
RING_BUFFER_INFO Inbound; // receive from parent RING_BUFFER_INFO Inbound; /* receive from parent */
spinlock_t inbound_lock; spinlock_t inbound_lock;
HANDLE ControlWQ; HANDLE ControlWQ;
// Channel callback are invoked in this workqueue context /* Channel callback are invoked in this workqueue context */
//HANDLE dataWorkQueue; /* HANDLE dataWorkQueue; */
PFN_CHANNEL_CALLBACK OnChannelCallback; PFN_CHANNEL_CALLBACK OnChannelCallback;
void * ChannelCallbackContext; void * ChannelCallbackContext;
@ -102,31 +102,31 @@ typedef union {
} VMBUS_CHANNEL_MESSAGE_RESPONSE; } VMBUS_CHANNEL_MESSAGE_RESPONSE;
// Represents each channel msg on the vmbus connection /*
// This is a variable-size data structure depending on * Represents each channel msg on the vmbus connection This is a
// the msg type itself * variable-size data structure depending on the msg type itself
*/
typedef struct _VMBUS_CHANNEL_MSGINFO { typedef struct _VMBUS_CHANNEL_MSGINFO {
// Bookkeeping stuff /* Bookkeeping stuff */
LIST_ENTRY MsgListEntry; LIST_ENTRY MsgListEntry;
// So far, this is only used to handle gpadl body message /* So far, this is only used to handle gpadl body message */
LIST_ENTRY SubMsgList; LIST_ENTRY SubMsgList;
// Synchronize the request/response if needed /* Synchronize the request/response if needed */
HANDLE WaitEvent; HANDLE WaitEvent;
VMBUS_CHANNEL_MESSAGE_RESPONSE Response; VMBUS_CHANNEL_MESSAGE_RESPONSE Response;
u32 MessageSize; u32 MessageSize;
// The channel message that goes out on the "wire". /* The channel message that goes out on the "wire". */
// It will contain at minimum the VMBUS_CHANNEL_MESSAGE_HEADER header /* It will contain at minimum the VMBUS_CHANNEL_MESSAGE_HEADER header */
unsigned char Msg[0]; unsigned char Msg[0];
} VMBUS_CHANNEL_MSGINFO; } VMBUS_CHANNEL_MSGINFO;
// /* Routines */
// Routines
//
static VMBUS_CHANNEL* static VMBUS_CHANNEL*
AllocVmbusChannel( AllocVmbusChannel(
@ -153,4 +153,4 @@ VmbusChannelReleaseUnattachedChannels(
void void
); );
#endif //_CHANNEL_MGMT_H_ #endif /* _CHANNEL_MGMT_H_ */

View file

@ -26,9 +26,7 @@
#include "VmbusPrivate.h" #include "VmbusPrivate.h"
// /* Globals */
// Globals
//
VMBUS_CONNECTION gVmbusConnection = { VMBUS_CONNECTION gVmbusConnection = {
@ -57,11 +55,11 @@ VmbusConnect(
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
// Make sure we are not connecting or connected /* Make sure we are not connecting or connected */
if (gVmbusConnection.ConnectState != Disconnected) if (gVmbusConnection.ConnectState != Disconnected)
return -1; return -1;
// Initialize the vmbus connection /* Initialize the vmbus connection */
gVmbusConnection.ConnectState = Connecting; gVmbusConnection.ConnectState = Connecting;
gVmbusConnection.WorkQueue = WorkQueueCreate("vmbusQ"); gVmbusConnection.WorkQueue = WorkQueueCreate("vmbusQ");
@ -71,7 +69,10 @@ VmbusConnect(
INITIALIZE_LIST_HEAD(&gVmbusConnection.ChannelList); INITIALIZE_LIST_HEAD(&gVmbusConnection.ChannelList);
spin_lock_init(&gVmbusConnection.channel_lock); spin_lock_init(&gVmbusConnection.channel_lock);
// Setup the vmbus event connection for channel interrupt abstraction stuff /*
* Setup the vmbus event connection for channel interrupt
* abstraction stuff
*/
gVmbusConnection.InterruptPage = PageAlloc(1); gVmbusConnection.InterruptPage = PageAlloc(1);
if (gVmbusConnection.InterruptPage == NULL) if (gVmbusConnection.InterruptPage == NULL)
{ {
@ -82,7 +83,10 @@ VmbusConnect(
gVmbusConnection.RecvInterruptPage = gVmbusConnection.InterruptPage; gVmbusConnection.RecvInterruptPage = gVmbusConnection.InterruptPage;
gVmbusConnection.SendInterruptPage = (void*)((unsigned long)gVmbusConnection.InterruptPage + (PAGE_SIZE >> 1)); gVmbusConnection.SendInterruptPage = (void*)((unsigned long)gVmbusConnection.InterruptPage + (PAGE_SIZE >> 1));
// Setup the monitor notification facility. The 1st page for parent->child and the 2nd page for child->parent /* Setup the monitor
* notification facility. The 1st page for parent->child and
* the 2nd page for child->parent
*/
gVmbusConnection.MonitorPages = PageAlloc(2); gVmbusConnection.MonitorPages = PageAlloc(2);
if (gVmbusConnection.MonitorPages == NULL) if (gVmbusConnection.MonitorPages == NULL)
{ {
@ -106,8 +110,10 @@ VmbusConnect(
msg->MonitorPage1 = GetPhysicalAddress(gVmbusConnection.MonitorPages); msg->MonitorPage1 = GetPhysicalAddress(gVmbusConnection.MonitorPages);
msg->MonitorPage2 = GetPhysicalAddress((void *)((unsigned long)gVmbusConnection.MonitorPages + PAGE_SIZE)); msg->MonitorPage2 = GetPhysicalAddress((void *)((unsigned long)gVmbusConnection.MonitorPages + PAGE_SIZE));
// Add to list before we send the request since we may receive the response /*
// before returning from this routine * Add to list before we send the request since we may
* receive the response before returning from this routine
*/
spin_lock_irqsave(&gVmbusConnection.channelmsg_lock, flags); spin_lock_irqsave(&gVmbusConnection.channelmsg_lock, flags);
INSERT_TAIL_LIST(&gVmbusConnection.ChannelMsgList, &msgInfo->MsgListEntry); INSERT_TAIL_LIST(&gVmbusConnection.ChannelMsgList, &msgInfo->MsgListEntry);
spin_unlock_irqrestore(&gVmbusConnection.channelmsg_lock, flags); spin_unlock_irqrestore(&gVmbusConnection.channelmsg_lock, flags);
@ -124,12 +130,12 @@ VmbusConnect(
goto Cleanup; goto Cleanup;
} }
// Wait for the connection response /* Wait for the connection response */
WaitEventWait(msgInfo->WaitEvent); WaitEventWait(msgInfo->WaitEvent);
REMOVE_ENTRY_LIST(&msgInfo->MsgListEntry); REMOVE_ENTRY_LIST(&msgInfo->MsgListEntry);
// Check if successful /* Check if successful */
if (msgInfo->Response.VersionResponse.VersionSupported) if (msgInfo->Response.VersionResponse.VersionSupported)
{ {
DPRINT_INFO(VMBUS, "Vmbus connected!!"); DPRINT_INFO(VMBUS, "Vmbus connected!!");
@ -202,7 +208,7 @@ VmbusDisconnect(
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
// Make sure we are connected /* Make sure we are connected */
if (gVmbusConnection.ConnectState != Connected) if (gVmbusConnection.ConnectState != Connected)
return -1; return -1;
@ -219,7 +225,7 @@ VmbusDisconnect(
PageFree(gVmbusConnection.InterruptPage, 1); PageFree(gVmbusConnection.InterruptPage, 1);
// TODO: iterate thru the msg list and free up /* TODO: iterate thru the msg list and free up */
WorkQueueClose(gVmbusConnection.WorkQueue); WorkQueueClose(gVmbusConnection.WorkQueue);
@ -296,18 +302,20 @@ VmbusProcessChannelEvent(
ASSERT(relId > 0); ASSERT(relId > 0);
// Find the channel based on this relid and invokes /*
// the channel callback to process the event * Find the channel based on this relid and invokes the
* channel callback to process the event
*/
channel = GetChannelFromRelId(relId); channel = GetChannelFromRelId(relId);
if (channel) if (channel)
{ {
VmbusChannelOnChannelEvent(channel); VmbusChannelOnChannelEvent(channel);
//WorkQueueQueueWorkItem(channel->dataWorkQueue, VmbusChannelOnChannelEvent, (void*)channel); /* WorkQueueQueueWorkItem(channel->dataWorkQueue, VmbusChannelOnChannelEvent, (void*)channel); */
} }
else else
{ {
DPRINT_ERR(VMBUS, "channel not found for relid - %d.", relId); DPRINT_ERR(VMBUS, "channel not found for relid - %d.", relId);
} }
} }
@ -327,16 +335,16 @@ VmbusOnEvents(
) )
{ {
int dword; int dword;
//int maxdword = PAGE_SIZE >> 3; // receive size is 1/2 page and divide that by 4 bytes /* int maxdword = PAGE_SIZE >> 3; // receive size is 1/2 page and divide that by 4 bytes */
int maxdword = MAX_NUM_CHANNELS_SUPPORTED >> 5; int maxdword = MAX_NUM_CHANNELS_SUPPORTED >> 5;
int bit; int bit;
int relid; int relid;
u32* recvInterruptPage = gVmbusConnection.RecvInterruptPage; u32* recvInterruptPage = gVmbusConnection.RecvInterruptPage;
//VMBUS_CHANNEL_MESSAGE* receiveMsg; /* VMBUS_CHANNEL_MESSAGE* receiveMsg; */
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
// Check events /* Check events */
if (recvInterruptPage) if (recvInterruptPage)
{ {
for (dword = 0; dword < maxdword; dword++) for (dword = 0; dword < maxdword; dword++)
@ -351,15 +359,15 @@ VmbusOnEvents(
DPRINT_DBG(VMBUS, "event detected for relid - %d", relid); DPRINT_DBG(VMBUS, "event detected for relid - %d", relid);
if (relid == 0) // special case - vmbus channel protocol msg if (relid == 0) /* special case - vmbus channel protocol msg */
{ {
DPRINT_DBG(VMBUS, "invalid relid - %d", relid); DPRINT_DBG(VMBUS, "invalid relid - %d", relid);
continue; } continue; }
else else
{ {
//QueueWorkItem(VmbusProcessEvent, (void*)relid); /* QueueWorkItem(VmbusProcessEvent, (void*)relid); */
//ret = WorkQueueQueueWorkItem(gVmbusConnection.workQueue, VmbusProcessChannelEvent, (void*)relid); /* ret = WorkQueueQueueWorkItem(gVmbusConnection.workQueue, VmbusProcessChannelEvent, (void*)relid); */
VmbusProcessChannelEvent((void*)(unsigned long)relid); VmbusProcessChannelEvent((void*)(unsigned long)relid);
} }
} }
@ -418,7 +426,7 @@ VmbusSetEvent(u32 childRelId)
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
// Each u32 represents 32 channels /* Each u32 represents 32 channels */
BitSet((u32*)gVmbusConnection.SendInterruptPage + (childRelId >> 5), childRelId & 31); BitSet((u32*)gVmbusConnection.SendInterruptPage + (childRelId >> 5), childRelId & 31);
ret = HvSignalEvent(); ret = HvSignalEvent();
@ -427,4 +435,4 @@ VmbusSetEvent(u32 childRelId)
return ret; return ret;
} }
// EOF /* EOF */

View file

@ -25,11 +25,9 @@
#include "include/logging.h" #include "include/logging.h"
#include "VmbusPrivate.h" #include "VmbusPrivate.h"
// /* Globals */
// Globals
//
// The one and only /* The one and only */
HV_CONTEXT gHvContext={ HV_CONTEXT gHvContext={
.SynICInitialized = false, .SynICInitialized = false,
.HypercallPage = NULL, .HypercallPage = NULL,
@ -90,10 +88,11 @@ HvQueryHypervisorInfo (
unsigned int maxLeaf; unsigned int maxLeaf;
unsigned int op; unsigned int op;
// /*
// Its assumed that this is called after confirming that Viridian is present. * Its assumed that this is called after confirming that Viridian
// Query id and revision. * is present. Query id and revision.
// */
eax = 0; eax = 0;
ebx = 0; ebx = 0;
@ -103,18 +102,18 @@ HvQueryHypervisorInfo (
do_cpuid(op, &eax, &ebx, &ecx, &edx); do_cpuid(op, &eax, &ebx, &ecx, &edx);
DPRINT_INFO(VMBUS, "Vendor ID: %c%c%c%c%c%c%c%c%c%c%c%c", DPRINT_INFO(VMBUS, "Vendor ID: %c%c%c%c%c%c%c%c%c%c%c%c",
(ebx & 0xFF), (ebx & 0xFF),
((ebx >> 8) & 0xFF), ((ebx >> 8) & 0xFF),
((ebx >> 16) & 0xFF), ((ebx >> 16) & 0xFF),
((ebx >> 24) & 0xFF), ((ebx >> 24) & 0xFF),
(ecx & 0xFF), (ecx & 0xFF),
((ecx >> 8) & 0xFF), ((ecx >> 8) & 0xFF),
((ecx >> 16) & 0xFF), ((ecx >> 16) & 0xFF),
((ecx >> 24) & 0xFF), ((ecx >> 24) & 0xFF),
(edx & 0xFF), (edx & 0xFF),
((edx >> 8) & 0xFF), ((edx >> 8) & 0xFF),
((edx >> 16) & 0xFF), ((edx >> 16) & 0xFF),
((edx >> 24) & 0xFF)); ((edx >> 24) & 0xFF));
maxLeaf = eax; maxLeaf = eax;
eax = 0; eax = 0;
@ -125,25 +124,25 @@ HvQueryHypervisorInfo (
do_cpuid(op, &eax, &ebx, &ecx, &edx); do_cpuid(op, &eax, &ebx, &ecx, &edx);
DPRINT_INFO(VMBUS, "Interface ID: %c%c%c%c", DPRINT_INFO(VMBUS, "Interface ID: %c%c%c%c",
(eax & 0xFF), (eax & 0xFF),
((eax >> 8) & 0xFF), ((eax >> 8) & 0xFF),
((eax >> 16) & 0xFF), ((eax >> 16) & 0xFF),
((eax >> 24) & 0xFF)); ((eax >> 24) & 0xFF));
if (maxLeaf >= HvCpuIdFunctionMsHvVersion) { if (maxLeaf >= HvCpuIdFunctionMsHvVersion) {
eax = 0; eax = 0;
ebx = 0; ebx = 0;
ecx = 0; ecx = 0;
edx = 0; edx = 0;
op = HvCpuIdFunctionMsHvVersion; op = HvCpuIdFunctionMsHvVersion;
do_cpuid(op, &eax, &ebx, &ecx, &edx); do_cpuid(op, &eax, &ebx, &ecx, &edx);
DPRINT_INFO(VMBUS, "OS Build:%d-%d.%d-%d-%d.%d", DPRINT_INFO(VMBUS, "OS Build:%d-%d.%d-%d-%d.%d",
eax, eax,
ebx >> 16, ebx >> 16,
ebx & 0xFFFF, ebx & 0xFFFF,
ecx, ecx,
edx >> 24, edx >> 24,
edx & 0xFFFFFF); edx & 0xFFFFFF);
} }
return maxLeaf; return maxLeaf;
} }
@ -211,7 +210,7 @@ HvDoHypercall (
DPRINT_DBG(VMBUS, "Hypercall <return %llx>", hvStatusLo | ((u64)hvStatusHi << 32)); DPRINT_DBG(VMBUS, "Hypercall <return %llx>", hvStatusLo | ((u64)hvStatusHi << 32));
return (hvStatusLo | ((u64)hvStatusHi << 32)); return (hvStatusLo | ((u64)hvStatusHi << 32));
#endif // x86_64 #endif /* x86_64 */
} }
/*++ /*++
@ -249,26 +248,26 @@ HvInit (
DPRINT_INFO(VMBUS, "Windows hypervisor detected! Retrieving more info..."); DPRINT_INFO(VMBUS, "Windows hypervisor detected! Retrieving more info...");
maxLeaf = HvQueryHypervisorInfo(); maxLeaf = HvQueryHypervisorInfo();
//HvQueryHypervisorFeatures(maxLeaf); /* HvQueryHypervisorFeatures(maxLeaf); */
// Determine if we are running on xenlinux (ie x2v shim) or native linux /* Determine if we are running on xenlinux (ie x2v shim) or native linux */
gHvContext.GuestId = ReadMsr(HV_X64_MSR_GUEST_OS_ID); gHvContext.GuestId = ReadMsr(HV_X64_MSR_GUEST_OS_ID);
if (gHvContext.GuestId == 0) if (gHvContext.GuestId == 0)
{ {
// Write our OS info /* Write our OS info */
WriteMsr(HV_X64_MSR_GUEST_OS_ID, HV_LINUX_GUEST_ID); WriteMsr(HV_X64_MSR_GUEST_OS_ID, HV_LINUX_GUEST_ID);
gHvContext.GuestId = HV_LINUX_GUEST_ID; gHvContext.GuestId = HV_LINUX_GUEST_ID;
} }
// See if the hypercall page is already set /* See if the hypercall page is already set */
hypercallMsr.AsUINT64 = ReadMsr(HV_X64_MSR_HYPERCALL); hypercallMsr.AsUINT64 = ReadMsr(HV_X64_MSR_HYPERCALL);
if (gHvContext.GuestId == HV_LINUX_GUEST_ID) if (gHvContext.GuestId == HV_LINUX_GUEST_ID)
{ {
// Allocate the hypercall page memory /* Allocate the hypercall page memory */
//virtAddr = PageAlloc(1); /* virtAddr = PageAlloc(1); */
virtAddr = VirtualAllocExec(PAGE_SIZE); virtAddr = VirtualAllocExec(PAGE_SIZE);
if (!virtAddr) if (!virtAddr)
@ -278,11 +277,11 @@ HvInit (
} }
hypercallMsr.Enable = 1; hypercallMsr.Enable = 1;
//hypercallMsr.GuestPhysicalAddress = Logical2PhysicalAddr(virtAddr) >> PAGE_SHIFT; /* hypercallMsr.GuestPhysicalAddress = Logical2PhysicalAddr(virtAddr) >> PAGE_SHIFT; */
hypercallMsr.GuestPhysicalAddress = Virtual2Physical(virtAddr) >> PAGE_SHIFT; hypercallMsr.GuestPhysicalAddress = Virtual2Physical(virtAddr) >> PAGE_SHIFT;
WriteMsr(HV_X64_MSR_HYPERCALL, hypercallMsr.AsUINT64); WriteMsr(HV_X64_MSR_HYPERCALL, hypercallMsr.AsUINT64);
// Confirm that hypercall page did get setup. /* Confirm that hypercall page did get setup. */
hypercallMsr.AsUINT64 = 0; hypercallMsr.AsUINT64 = 0;
hypercallMsr.AsUINT64 = ReadMsr(HV_X64_MSR_HYPERCALL); hypercallMsr.AsUINT64 = ReadMsr(HV_X64_MSR_HYPERCALL);
@ -304,7 +303,7 @@ HvInit (
gHvContext.HypercallPage, gHvContext.HypercallPage,
(u64)hypercallMsr.GuestPhysicalAddress << PAGE_SHIFT); (u64)hypercallMsr.GuestPhysicalAddress << PAGE_SHIFT);
// Setup the global signal event param for the signal event hypercall /* Setup the global signal event param for the signal event hypercall */
gHvContext.SignalEventBuffer = kmalloc(sizeof(HV_INPUT_SIGNAL_EVENT_BUFFER), GFP_KERNEL); gHvContext.SignalEventBuffer = kmalloc(sizeof(HV_INPUT_SIGNAL_EVENT_BUFFER), GFP_KERNEL);
if (!gHvContext.SignalEventBuffer) if (!gHvContext.SignalEventBuffer)
{ {
@ -317,7 +316,7 @@ HvInit (
gHvContext.SignalEventParam->FlagNumber = 0; gHvContext.SignalEventParam->FlagNumber = 0;
gHvContext.SignalEventParam->RsvdZ = 0; gHvContext.SignalEventParam->RsvdZ = 0;
//DPRINT_DBG(VMBUS, "My id %llu", HvGetCurrentPartitionId()); /* DPRINT_DBG(VMBUS, "My id %llu", HvGetCurrentPartitionId()); */
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
@ -490,12 +489,12 @@ HvSynicInit (
return ret; return ret;
} }
// Check the version /* Check the version */
version = ReadMsr(HV_X64_MSR_SVERSION); version = ReadMsr(HV_X64_MSR_SVERSION);
DPRINT_INFO(VMBUS, "SynIC version: %llx", version); DPRINT_INFO(VMBUS, "SynIC version: %llx", version);
// TODO: Handle SMP /* TODO: Handle SMP */
if (gHvContext.GuestId == HV_XENLINUX_GUEST_ID) if (gHvContext.GuestId == HV_XENLINUX_GUEST_ID)
{ {
DPRINT_INFO(VMBUS, "Skipping SIMP and SIEFP setup since it is already set."); DPRINT_INFO(VMBUS, "Skipping SIMP and SIEFP setup since it is already set.");
@ -505,7 +504,7 @@ HvSynicInit (
DPRINT_DBG(VMBUS, "Simp: %llx, Sifep: %llx", simp.AsUINT64, siefp.AsUINT64); DPRINT_DBG(VMBUS, "Simp: %llx, Sifep: %llx", simp.AsUINT64, siefp.AsUINT64);
// Determine if we are running on xenlinux (ie x2v shim) or native linux /* Determine if we are running on xenlinux (ie x2v shim) or native linux */
guestID = ReadMsr(HV_X64_MSR_GUEST_OS_ID); guestID = ReadMsr(HV_X64_MSR_GUEST_OS_ID);
if (guestID == HV_LINUX_GUEST_ID) if (guestID == HV_LINUX_GUEST_ID)
@ -536,9 +535,7 @@ HvSynicInit (
goto Cleanup; goto Cleanup;
} }
// /* Setup the Synic's message page */
// Setup the Synic's message page
//
simp.AsUINT64 = ReadMsr(HV_X64_MSR_SIMP); simp.AsUINT64 = ReadMsr(HV_X64_MSR_SIMP);
simp.SimpEnabled = 1; simp.SimpEnabled = 1;
simp.BaseSimpGpa = GetPhysicalAddress(gHvContext.synICMessagePage[0]) >> PAGE_SHIFT; simp.BaseSimpGpa = GetPhysicalAddress(gHvContext.synICMessagePage[0]) >> PAGE_SHIFT;
@ -547,9 +544,7 @@ HvSynicInit (
WriteMsr(HV_X64_MSR_SIMP, simp.AsUINT64); WriteMsr(HV_X64_MSR_SIMP, simp.AsUINT64);
// /* Setup the Synic's event page */
// Setup the Synic's event page
//
siefp.AsUINT64 = ReadMsr(HV_X64_MSR_SIEFP); siefp.AsUINT64 = ReadMsr(HV_X64_MSR_SIEFP);
siefp.SiefpEnabled = 1; siefp.SiefpEnabled = 1;
siefp.BaseSiefpGpa = GetPhysicalAddress(gHvContext.synICEventPage[0]) >> PAGE_SHIFT; siefp.BaseSiefpGpa = GetPhysicalAddress(gHvContext.synICEventPage[0]) >> PAGE_SHIFT;
@ -558,31 +553,27 @@ HvSynicInit (
WriteMsr(HV_X64_MSR_SIEFP, siefp.AsUINT64); WriteMsr(HV_X64_MSR_SIEFP, siefp.AsUINT64);
} }
// /* Setup the interception SINT. */
// Setup the interception SINT. /* WriteMsr((HV_X64_MSR_SINT0 + HV_SYNIC_INTERCEPTION_SINT_INDEX), */
// /* interceptionSint.AsUINT64); */
//WriteMsr((HV_X64_MSR_SINT0 + HV_SYNIC_INTERCEPTION_SINT_INDEX),
// interceptionSint.AsUINT64);
// /* Setup the shared SINT. */
// Setup the shared SINT.
//
sharedSint.AsUINT64 = ReadMsr(HV_X64_MSR_SINT0 + VMBUS_MESSAGE_SINT); sharedSint.AsUINT64 = ReadMsr(HV_X64_MSR_SINT0 + VMBUS_MESSAGE_SINT);
sharedSint.AsUINT64 = 0; sharedSint.AsUINT64 = 0;
sharedSint.Vector = irqVector; //HV_SHARED_SINT_IDT_VECTOR + 0x20; sharedSint.Vector = irqVector; /* HV_SHARED_SINT_IDT_VECTOR + 0x20; */
sharedSint.Masked = false; sharedSint.Masked = false;
sharedSint.AutoEoi = true; sharedSint.AutoEoi = true;
DPRINT_DBG(VMBUS, "HV_X64_MSR_SINT1 msr set to: %llx", sharedSint.AsUINT64); DPRINT_DBG(VMBUS, "HV_X64_MSR_SINT1 msr set to: %llx", sharedSint.AsUINT64);
WriteMsr(HV_X64_MSR_SINT0 + VMBUS_MESSAGE_SINT, sharedSint.AsUINT64); WriteMsr(HV_X64_MSR_SINT0 + VMBUS_MESSAGE_SINT, sharedSint.AsUINT64);
// Enable the global synic bit /* Enable the global synic bit */
sctrl.AsUINT64 = ReadMsr(HV_X64_MSR_SCONTROL); sctrl.AsUINT64 = ReadMsr(HV_X64_MSR_SCONTROL);
sctrl.Enable = 1; sctrl.Enable = 1;
WriteMsr(HV_X64_MSR_SCONTROL, sctrl.AsUINT64); WriteMsr(HV_X64_MSR_SCONTROL, sctrl.AsUINT64);
gHvContext.SynICInitialized = true; gHvContext.SynICInitialized = true;
@ -642,11 +633,14 @@ HvSynicCleanup(
sharedSint.Masked = 1; sharedSint.Masked = 1;
// Disable the interrupt /* Disable the interrupt */
WriteMsr(HV_X64_MSR_SINT0 + VMBUS_MESSAGE_SINT, sharedSint.AsUINT64); WriteMsr(HV_X64_MSR_SINT0 + VMBUS_MESSAGE_SINT, sharedSint.AsUINT64);
// Disable and free the resources only if we are running as native linux /*
// since in xenlinux, we are sharing the resources with the x2v shim * Disable and free the resources only if we are running as
* native linux since in xenlinux, we are sharing the
* resources with the x2v shim
*/
if (gHvContext.GuestId == HV_LINUX_GUEST_ID) if (gHvContext.GuestId == HV_LINUX_GUEST_ID)
{ {
simp.AsUINT64 = ReadMsr(HV_X64_MSR_SIMP); simp.AsUINT64 = ReadMsr(HV_X64_MSR_SIMP);
@ -669,4 +663,4 @@ HvSynicCleanup(
} }
// eof /* eof */

View file

@ -29,17 +29,17 @@
#include "include/HvTypes.h" #include "include/HvTypes.h"
#include "include/HvStatus.h" #include "include/HvStatus.h"
//#include "HvVmApi.h" /* #include "HvVmApi.h" */
//#include "HvKeApi.h" /* #include "HvKeApi.h" */
//#include "HvMmApi.h" /* #include "HvMmApi.h" */
//#include "HvCpuApi.h" /* #include "HvCpuApi.h" */
#include "include/HvHalApi.h" #include "include/HvHalApi.h"
#include "include/HvVpApi.h" #include "include/HvVpApi.h"
//#include "HvTrApi.h" /* #include "HvTrApi.h" */
#include "include/HvSynicApi.h" #include "include/HvSynicApi.h"
//#include "HvAmApi.h" /* #include "HvAmApi.h" */
//#include "HvHkApi.h" /* #include "HvHkApi.h" */
//#include "HvValApi.h" /* #include "HvValApi.h" */
#include "include/HvHcApi.h" #include "include/HvHcApi.h"
#include "include/HvPtApi.h" #include "include/HvPtApi.h"
@ -53,9 +53,9 @@ enum
VMBUS_MONITOR_PORT_ID = 3, VMBUS_MONITOR_PORT_ID = 3,
VMBUS_MESSAGE_SINT = 2 VMBUS_MESSAGE_SINT = 2
}; };
//
// #defines /* #defines */
//
#define HV_PRESENT_BIT 0x80000000 #define HV_PRESENT_BIT 0x80000000
#define HV_XENLINUX_GUEST_ID_LO 0x00000000 #define HV_XENLINUX_GUEST_ID_LO 0x00000000
@ -75,9 +75,9 @@ enum
#define HV_HYPERCALL_PARAM_ALIGN sizeof(u64) #define HV_HYPERCALL_PARAM_ALIGN sizeof(u64)
//
// Service definitions /* Service definitions */
//
#define HV_SERVICE_PARENT_PORT (0) #define HV_SERVICE_PARENT_PORT (0)
#define HV_SERVICE_PARENT_CONNECTION (0) #define HV_SERVICE_PARENT_CONNECTION (0)
@ -95,10 +95,10 @@ enum
#define HV_SERVICE_PROTOCOL_VERSION (0x0010) #define HV_SERVICE_PROTOCOL_VERSION (0x0010)
#define HV_CONNECT_PAYLOAD_BYTE_COUNT 64 #define HV_CONNECT_PAYLOAD_BYTE_COUNT 64
//#define VMBUS_REVISION_NUMBER 6 /* #define VMBUS_REVISION_NUMBER 6 */
//#define VMBUS_PORT_ID 11 // Our local vmbus's port and connection id. Anything >0 is fine /* #define VMBUS_PORT_ID 11 // Our local vmbus's port and connection id. Anything >0 is fine */
// 628180B8-308D-4c5e-B7DB-1BEB62E62EF4 /* 628180B8-308D-4c5e-B7DB-1BEB62E62EF4 */
static const GUID VMBUS_SERVICE_ID = {.Data = {0xb8, 0x80, 0x81, 0x62, 0x8d, 0x30, 0x5e, 0x4c, 0xb7, 0xdb, 0x1b, 0xeb, 0x62, 0xe6, 0x2e, 0xf4} }; static const GUID VMBUS_SERVICE_ID = {.Data = {0xb8, 0x80, 0x81, 0x62, 0x8d, 0x30, 0x5e, 0x4c, 0xb7, 0xdb, 0x1b, 0xeb, 0x62, 0xe6, 0x2e, 0xf4} };
#define MAX_NUM_CPUS 1 #define MAX_NUM_CPUS 1
@ -110,14 +110,14 @@ typedef struct {
} HV_INPUT_SIGNAL_EVENT_BUFFER; } HV_INPUT_SIGNAL_EVENT_BUFFER;
typedef struct { typedef struct {
u64 GuestId; // XenLinux or native Linux. If XenLinux, the hypercall and synic pages has already been initialized u64 GuestId; /* XenLinux or native Linux. If XenLinux, the hypercall and synic pages has already been initialized */
void* HypercallPage; void* HypercallPage;
bool SynICInitialized; bool SynICInitialized;
// This is used as an input param to HvCallSignalEvent hypercall. The input param is immutable /* This is used as an input param to HvCallSignalEvent hypercall. The input param is immutable */
// in our usage and must be dynamic mem (vs stack or global). /* in our usage and must be dynamic mem (vs stack or global). */
HV_INPUT_SIGNAL_EVENT_BUFFER *SignalEventBuffer; HV_INPUT_SIGNAL_EVENT_BUFFER *SignalEventBuffer;
HV_INPUT_SIGNAL_EVENT *SignalEventParam; // 8-bytes aligned of the buffer above HV_INPUT_SIGNAL_EVENT *SignalEventParam; /* 8-bytes aligned of the buffer above */
HANDLE synICMessagePage[MAX_NUM_CPUS]; HANDLE synICMessagePage[MAX_NUM_CPUS];
HANDLE synICEventPage[MAX_NUM_CPUS]; HANDLE synICEventPage[MAX_NUM_CPUS];
@ -126,9 +126,9 @@ typedef struct {
extern HV_CONTEXT gHvContext; extern HV_CONTEXT gHvContext;
//
// Inline routines /* Inline routines */
//
static inline unsigned long long ReadMsr(int msr) static inline unsigned long long ReadMsr(int msr)
{ {
unsigned long long val; unsigned long long val;
@ -145,9 +145,9 @@ static inline void WriteMsr(int msr, u64 val)
return; return;
} }
//
// Hv Interface /* Hv Interface */
//
static int static int
HvInit( HvInit(
void void
@ -181,4 +181,4 @@ HvSynicCleanup(
void void
); );
#endif // __HV_H__ #endif /* __HV_H__ */

View file

@ -28,20 +28,16 @@
#include "RndisFilter.h" #include "RndisFilter.h"
// /* Globals */
// Globals
//
static const char* gDriverName="netvsc"; static const char* gDriverName="netvsc";
// {F8615163-DF3E-46c5-913F-F2D2F965ED0E} /* {F8615163-DF3E-46c5-913F-F2D2F965ED0E} */
static const GUID gNetVscDeviceType={ static const GUID gNetVscDeviceType={
.Data = {0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E} .Data = {0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E}
}; };
// /* Internal routines */
// Internal routines
//
static int static int
NetVscOnDeviceAdd( NetVscOnDeviceAdd(
DEVICE_OBJECT *Device, DEVICE_OBJECT *Device,
@ -125,7 +121,7 @@ static inline NETVSC_DEVICE* AllocNetDevice(DEVICE_OBJECT *Device)
if (!netDevice) if (!netDevice)
return NULL; return NULL;
// Set to 2 to allow both inbound and outbound traffic /* Set to 2 to allow both inbound and outbound traffic */
InterlockedCompareExchange(&netDevice->RefCount, 2, 0); InterlockedCompareExchange(&netDevice->RefCount, 2, 0);
netDevice->Device = Device; netDevice->Device = Device;
@ -142,7 +138,7 @@ static inline void FreeNetDevice(NETVSC_DEVICE *Device)
} }
// Get the net device object iff exists and its refcount > 1 /* Get the net device object iff exists and its refcount > 1 */
static inline NETVSC_DEVICE* GetOutboundNetDevice(DEVICE_OBJECT *Device) static inline NETVSC_DEVICE* GetOutboundNetDevice(DEVICE_OBJECT *Device)
{ {
NETVSC_DEVICE *netDevice; NETVSC_DEVICE *netDevice;
@ -160,7 +156,7 @@ static inline NETVSC_DEVICE* GetOutboundNetDevice(DEVICE_OBJECT *Device)
return netDevice; return netDevice;
} }
// Get the net device object iff exists and its refcount > 0 /* Get the net device object iff exists and its refcount > 0 */
static inline NETVSC_DEVICE* GetInboundNetDevice(DEVICE_OBJECT *Device) static inline NETVSC_DEVICE* GetInboundNetDevice(DEVICE_OBJECT *Device)
{ {
NETVSC_DEVICE *netDevice; NETVSC_DEVICE *netDevice;
@ -196,7 +192,7 @@ static inline NETVSC_DEVICE* ReleaseOutboundNetDevice(DEVICE_OBJECT *Device)
if (netDevice == NULL) if (netDevice == NULL)
return NULL; return NULL;
// Busy wait until the ref drop to 2, then set it to 1 /* Busy wait until the ref drop to 2, then set it to 1 */
while (InterlockedCompareExchange(&netDevice->RefCount, 1, 2) != 2) while (InterlockedCompareExchange(&netDevice->RefCount, 1, 2) != 2)
{ {
udelay(100); udelay(100);
@ -213,7 +209,7 @@ static inline NETVSC_DEVICE* ReleaseInboundNetDevice(DEVICE_OBJECT *Device)
if (netDevice == NULL) if (netDevice == NULL)
return NULL; return NULL;
// Busy wait until the ref drop to 1, then set it to 0 /* Busy wait until the ref drop to 1, then set it to 0 */
while (InterlockedCompareExchange(&netDevice->RefCount, 0, 1) != 1) while (InterlockedCompareExchange(&netDevice->RefCount, 0, 1) != 1)
{ {
udelay(100); udelay(100);
@ -246,17 +242,17 @@ NetVscInitialize(
DPRINT_DBG(NETVSC, "sizeof(NETVSC_PACKET)=%d, sizeof(NVSP_MESSAGE)=%d, sizeof(VMTRANSFER_PAGE_PACKET_HEADER)=%d", DPRINT_DBG(NETVSC, "sizeof(NETVSC_PACKET)=%d, sizeof(NVSP_MESSAGE)=%d, sizeof(VMTRANSFER_PAGE_PACKET_HEADER)=%d",
sizeof(NETVSC_PACKET), sizeof(NVSP_MESSAGE), sizeof(VMTRANSFER_PAGE_PACKET_HEADER)); sizeof(NETVSC_PACKET), sizeof(NVSP_MESSAGE), sizeof(VMTRANSFER_PAGE_PACKET_HEADER));
// Make sure we are at least 2 pages since 1 page is used for control /* Make sure we are at least 2 pages since 1 page is used for control */
ASSERT(driver->RingBufferSize >= (PAGE_SIZE << 1)); ASSERT(driver->RingBufferSize >= (PAGE_SIZE << 1));
drv->name = gDriverName; drv->name = gDriverName;
memcpy(&drv->deviceType, &gNetVscDeviceType, sizeof(GUID)); memcpy(&drv->deviceType, &gNetVscDeviceType, sizeof(GUID));
// Make sure it is set by the caller /* Make sure it is set by the caller */
ASSERT(driver->OnReceiveCallback); ASSERT(driver->OnReceiveCallback);
ASSERT(driver->OnLinkStatusChanged); ASSERT(driver->OnLinkStatusChanged);
// Setup the dispatch table /* Setup the dispatch table */
driver->Base.OnDeviceAdd = NetVscOnDeviceAdd; driver->Base.OnDeviceAdd = NetVscOnDeviceAdd;
driver->Base.OnDeviceRemove = NetVscOnDeviceRemove; driver->Base.OnDeviceRemove = NetVscOnDeviceRemove;
driver->Base.OnCleanup = NetVscOnCleanup; driver->Base.OnCleanup = NetVscOnCleanup;
@ -289,7 +285,7 @@ NetVscInitializeReceiveBufferWithNetVsp(
return -1; return -1;
} }
ASSERT(netDevice->ReceiveBufferSize > 0); ASSERT(netDevice->ReceiveBufferSize > 0);
ASSERT((netDevice->ReceiveBufferSize & (PAGE_SIZE-1)) == 0); // page-size grandularity ASSERT((netDevice->ReceiveBufferSize & (PAGE_SIZE-1)) == 0); /* page-size grandularity */
netDevice->ReceiveBuffer = PageAlloc(netDevice->ReceiveBufferSize >> PAGE_SHIFT); netDevice->ReceiveBuffer = PageAlloc(netDevice->ReceiveBufferSize >> PAGE_SHIFT);
if (!netDevice->ReceiveBuffer) if (!netDevice->ReceiveBuffer)
@ -298,13 +294,15 @@ NetVscInitializeReceiveBufferWithNetVsp(
ret = -1; ret = -1;
goto Cleanup; goto Cleanup;
} }
ASSERT(((unsigned long)netDevice->ReceiveBuffer & (PAGE_SIZE-1)) == 0); // page-aligned buffer ASSERT(((unsigned long)netDevice->ReceiveBuffer & (PAGE_SIZE-1)) == 0); /* page-aligned buffer */
DPRINT_INFO(NETVSC, "Establishing receive buffer's GPADL..."); DPRINT_INFO(NETVSC, "Establishing receive buffer's GPADL...");
// Establish the gpadl handle for this buffer on this channel. /*
// Note: This call uses the vmbus connection rather than the channel to establish * Establish the gpadl handle for this buffer on this
// the gpadl handle. * channel. Note: This call uses the vmbus connection rather
* than the channel to establish the gpadl handle.
*/
ret = Device->Driver->VmbusChannelInterface.EstablishGpadl(Device, ret = Device->Driver->VmbusChannelInterface.EstablishGpadl(Device,
netDevice->ReceiveBuffer, netDevice->ReceiveBuffer,
netDevice->ReceiveBufferSize, netDevice->ReceiveBufferSize,
@ -316,9 +314,9 @@ NetVscInitializeReceiveBufferWithNetVsp(
goto Cleanup; goto Cleanup;
} }
//WaitEventWait(ext->ChannelInitEvent); /* WaitEventWait(ext->ChannelInitEvent); */
// Notify the NetVsp of the gpadl handle /* Notify the NetVsp of the gpadl handle */
DPRINT_INFO(NETVSC, "Sending NvspMessage1TypeSendReceiveBuffer..."); DPRINT_INFO(NETVSC, "Sending NvspMessage1TypeSendReceiveBuffer...");
initPacket = &netDevice->ChannelInitPacket; initPacket = &netDevice->ChannelInitPacket;
@ -329,7 +327,7 @@ NetVscInitializeReceiveBufferWithNetVsp(
initPacket->Messages.Version1Messages.SendReceiveBuffer.GpadlHandle = netDevice->ReceiveBufferGpadlHandle; initPacket->Messages.Version1Messages.SendReceiveBuffer.GpadlHandle = netDevice->ReceiveBufferGpadlHandle;
initPacket->Messages.Version1Messages.SendReceiveBuffer.Id = NETVSC_RECEIVE_BUFFER_ID; initPacket->Messages.Version1Messages.SendReceiveBuffer.Id = NETVSC_RECEIVE_BUFFER_ID;
// Send the gpadl notification request /* Send the gpadl notification request */
ret = Device->Driver->VmbusChannelInterface.SendPacket(Device, ret = Device->Driver->VmbusChannelInterface.SendPacket(Device,
initPacket, initPacket,
sizeof(NVSP_MESSAGE), sizeof(NVSP_MESSAGE),
@ -344,7 +342,7 @@ NetVscInitializeReceiveBufferWithNetVsp(
WaitEventWait(netDevice->ChannelInitEvent); WaitEventWait(netDevice->ChannelInitEvent);
// Check the response /* Check the response */
if (initPacket->Messages.Version1Messages.SendReceiveBufferComplete.Status != NvspStatusSuccess) if (initPacket->Messages.Version1Messages.SendReceiveBufferComplete.Status != NvspStatusSuccess)
{ {
DPRINT_ERR(NETVSC, DPRINT_ERR(NETVSC,
@ -354,7 +352,7 @@ NetVscInitializeReceiveBufferWithNetVsp(
goto Cleanup; goto Cleanup;
} }
// Parse the response /* Parse the response */
ASSERT(netDevice->ReceiveSectionCount == 0); ASSERT(netDevice->ReceiveSectionCount == 0);
ASSERT(netDevice->ReceiveSections == NULL); ASSERT(netDevice->ReceiveSections == NULL);
@ -377,7 +375,7 @@ NetVscInitializeReceiveBufferWithNetVsp(
netDevice->ReceiveSections[0].SubAllocationSize, netDevice->ReceiveSections[0].NumSubAllocations); netDevice->ReceiveSections[0].SubAllocationSize, netDevice->ReceiveSections[0].NumSubAllocations);
//For 1st release, there should only be 1 section that represents the entire receive buffer /* For 1st release, there should only be 1 section that represents the entire receive buffer */
if (netDevice->ReceiveSectionCount != 1 || if (netDevice->ReceiveSectionCount != 1 ||
netDevice->ReceiveSections->Offset != 0 ) netDevice->ReceiveSections->Offset != 0 )
{ {
@ -416,7 +414,7 @@ NetVscInitializeSendBufferWithNetVsp(
return -1; return -1;
} }
ASSERT(netDevice->SendBufferSize > 0); ASSERT(netDevice->SendBufferSize > 0);
ASSERT((netDevice->SendBufferSize & (PAGE_SIZE-1)) == 0); // page-size grandularity ASSERT((netDevice->SendBufferSize & (PAGE_SIZE-1)) == 0); /* page-size grandularity */
netDevice->SendBuffer = PageAlloc(netDevice->SendBufferSize >> PAGE_SHIFT); netDevice->SendBuffer = PageAlloc(netDevice->SendBufferSize >> PAGE_SHIFT);
if (!netDevice->SendBuffer) if (!netDevice->SendBuffer)
@ -425,17 +423,19 @@ NetVscInitializeSendBufferWithNetVsp(
ret = -1; ret = -1;
goto Cleanup; goto Cleanup;
} }
ASSERT(((unsigned long)netDevice->SendBuffer & (PAGE_SIZE-1)) == 0); // page-aligned buffer ASSERT(((unsigned long)netDevice->SendBuffer & (PAGE_SIZE-1)) == 0); /* page-aligned buffer */
DPRINT_INFO(NETVSC, "Establishing send buffer's GPADL..."); DPRINT_INFO(NETVSC, "Establishing send buffer's GPADL...");
// Establish the gpadl handle for this buffer on this channel. /*
// Note: This call uses the vmbus connection rather than the channel to establish * Establish the gpadl handle for this buffer on this
// the gpadl handle. * channel. Note: This call uses the vmbus connection rather
* than the channel to establish the gpadl handle.
*/
ret = Device->Driver->VmbusChannelInterface.EstablishGpadl(Device, ret = Device->Driver->VmbusChannelInterface.EstablishGpadl(Device,
netDevice->SendBuffer, netDevice->SendBuffer,
netDevice->SendBufferSize, netDevice->SendBufferSize,
&netDevice->SendBufferGpadlHandle); &netDevice->SendBufferGpadlHandle);
if (ret != 0) if (ret != 0)
{ {
@ -443,9 +443,9 @@ NetVscInitializeSendBufferWithNetVsp(
goto Cleanup; goto Cleanup;
} }
//WaitEventWait(ext->ChannelInitEvent); /* WaitEventWait(ext->ChannelInitEvent); */
// Notify the NetVsp of the gpadl handle /* Notify the NetVsp of the gpadl handle */
DPRINT_INFO(NETVSC, "Sending NvspMessage1TypeSendSendBuffer..."); DPRINT_INFO(NETVSC, "Sending NvspMessage1TypeSendSendBuffer...");
initPacket = &netDevice->ChannelInitPacket; initPacket = &netDevice->ChannelInitPacket;
@ -456,7 +456,7 @@ NetVscInitializeSendBufferWithNetVsp(
initPacket->Messages.Version1Messages.SendReceiveBuffer.GpadlHandle = netDevice->SendBufferGpadlHandle; initPacket->Messages.Version1Messages.SendReceiveBuffer.GpadlHandle = netDevice->SendBufferGpadlHandle;
initPacket->Messages.Version1Messages.SendReceiveBuffer.Id = NETVSC_SEND_BUFFER_ID; initPacket->Messages.Version1Messages.SendReceiveBuffer.Id = NETVSC_SEND_BUFFER_ID;
// Send the gpadl notification request /* Send the gpadl notification request */
ret = Device->Driver->VmbusChannelInterface.SendPacket(Device, ret = Device->Driver->VmbusChannelInterface.SendPacket(Device,
initPacket, initPacket,
sizeof(NVSP_MESSAGE), sizeof(NVSP_MESSAGE),
@ -471,7 +471,7 @@ NetVscInitializeSendBufferWithNetVsp(
WaitEventWait(netDevice->ChannelInitEvent); WaitEventWait(netDevice->ChannelInitEvent);
// Check the response /* Check the response */
if (initPacket->Messages.Version1Messages.SendSendBufferComplete.Status != NvspStatusSuccess) if (initPacket->Messages.Version1Messages.SendSendBufferComplete.Status != NvspStatusSuccess)
{ {
DPRINT_ERR(NETVSC, DPRINT_ERR(NETVSC,
@ -505,13 +505,17 @@ NetVscDestroyReceiveBuffer(
DPRINT_ENTER(NETVSC); DPRINT_ENTER(NETVSC);
// If we got a section count, it means we received a SendReceiveBufferComplete msg /*
// (ie sent NvspMessage1TypeSendReceiveBuffer msg) therefore, we need to send a revoke msg here * If we got a section count, it means we received a
* SendReceiveBufferComplete msg (ie sent
* NvspMessage1TypeSendReceiveBuffer msg) therefore, we need
* to send a revoke msg here
*/
if (NetDevice->ReceiveSectionCount) if (NetDevice->ReceiveSectionCount)
{ {
DPRINT_INFO(NETVSC, "Sending NvspMessage1TypeRevokeReceiveBuffer..."); DPRINT_INFO(NETVSC, "Sending NvspMessage1TypeRevokeReceiveBuffer...");
// Send the revoke receive buffer /* Send the revoke receive buffer */
revokePacket = &NetDevice->RevokePacket; revokePacket = &NetDevice->RevokePacket;
memset(revokePacket, 0, sizeof(NVSP_MESSAGE)); memset(revokePacket, 0, sizeof(NVSP_MESSAGE));
@ -524,7 +528,10 @@ NetVscDestroyReceiveBuffer(
(unsigned long)revokePacket, (unsigned long)revokePacket,
VmbusPacketTypeDataInBand, VmbusPacketTypeDataInBand,
0); 0);
// If we failed here, we might as well return and have a leak rather than continue and a bugchk /*
* If we failed here, we might as well return and
* have a leak rather than continue and a bugchk
*/
if (ret != 0) if (ret != 0)
{ {
DPRINT_ERR(NETVSC, "unable to send revoke receive buffer to netvsp"); DPRINT_ERR(NETVSC, "unable to send revoke receive buffer to netvsp");
@ -533,7 +540,7 @@ NetVscDestroyReceiveBuffer(
} }
} }
// Teardown the gpadl on the vsp end /* Teardown the gpadl on the vsp end */
if (NetDevice->ReceiveBufferGpadlHandle) if (NetDevice->ReceiveBufferGpadlHandle)
{ {
DPRINT_INFO(NETVSC, "Tearing down receive buffer's GPADL..."); DPRINT_INFO(NETVSC, "Tearing down receive buffer's GPADL...");
@ -541,7 +548,7 @@ NetVscDestroyReceiveBuffer(
ret = NetDevice->Device->Driver->VmbusChannelInterface.TeardownGpadl(NetDevice->Device, ret = NetDevice->Device->Driver->VmbusChannelInterface.TeardownGpadl(NetDevice->Device,
NetDevice->ReceiveBufferGpadlHandle); NetDevice->ReceiveBufferGpadlHandle);
// If we failed here, we might as well return and have a leak rather than continue and a bugchk /* If we failed here, we might as well return and have a leak rather than continue and a bugchk */
if (ret != 0) if (ret != 0)
{ {
DPRINT_ERR(NETVSC, "unable to teardown receive buffer's gpadl"); DPRINT_ERR(NETVSC, "unable to teardown receive buffer's gpadl");
@ -555,7 +562,7 @@ NetVscDestroyReceiveBuffer(
{ {
DPRINT_INFO(NETVSC, "Freeing up receive buffer..."); DPRINT_INFO(NETVSC, "Freeing up receive buffer...");
// Free up the receive buffer /* Free up the receive buffer */
PageFree(NetDevice->ReceiveBuffer, NetDevice->ReceiveBufferSize >> PAGE_SHIFT); PageFree(NetDevice->ReceiveBuffer, NetDevice->ReceiveBufferSize >> PAGE_SHIFT);
NetDevice->ReceiveBuffer = NULL; NetDevice->ReceiveBuffer = NULL;
} }
@ -586,13 +593,17 @@ NetVscDestroySendBuffer(
DPRINT_ENTER(NETVSC); DPRINT_ENTER(NETVSC);
// If we got a section count, it means we received a SendReceiveBufferComplete msg /*
// (ie sent NvspMessage1TypeSendReceiveBuffer msg) therefore, we need to send a revoke msg here * If we got a section count, it means we received a
* SendReceiveBufferComplete msg (ie sent
* NvspMessage1TypeSendReceiveBuffer msg) therefore, we need
* to send a revoke msg here
*/
if (NetDevice->SendSectionSize) if (NetDevice->SendSectionSize)
{ {
DPRINT_INFO(NETVSC, "Sending NvspMessage1TypeRevokeSendBuffer..."); DPRINT_INFO(NETVSC, "Sending NvspMessage1TypeRevokeSendBuffer...");
// Send the revoke send buffer /* Send the revoke send buffer */
revokePacket = &NetDevice->RevokePacket; revokePacket = &NetDevice->RevokePacket;
memset(revokePacket, 0, sizeof(NVSP_MESSAGE)); memset(revokePacket, 0, sizeof(NVSP_MESSAGE));
@ -605,7 +616,7 @@ NetVscDestroySendBuffer(
(unsigned long)revokePacket, (unsigned long)revokePacket,
VmbusPacketTypeDataInBand, VmbusPacketTypeDataInBand,
0); 0);
// If we failed here, we might as well return and have a leak rather than continue and a bugchk /* If we failed here, we might as well return and have a leak rather than continue and a bugchk */
if (ret != 0) if (ret != 0)
{ {
DPRINT_ERR(NETVSC, "unable to send revoke send buffer to netvsp"); DPRINT_ERR(NETVSC, "unable to send revoke send buffer to netvsp");
@ -614,7 +625,7 @@ NetVscDestroySendBuffer(
} }
} }
// Teardown the gpadl on the vsp end /* Teardown the gpadl on the vsp end */
if (NetDevice->SendBufferGpadlHandle) if (NetDevice->SendBufferGpadlHandle)
{ {
DPRINT_INFO(NETVSC, "Tearing down send buffer's GPADL..."); DPRINT_INFO(NETVSC, "Tearing down send buffer's GPADL...");
@ -622,7 +633,7 @@ NetVscDestroySendBuffer(
ret = NetDevice->Device->Driver->VmbusChannelInterface.TeardownGpadl(NetDevice->Device, ret = NetDevice->Device->Driver->VmbusChannelInterface.TeardownGpadl(NetDevice->Device,
NetDevice->SendBufferGpadlHandle); NetDevice->SendBufferGpadlHandle);
// If we failed here, we might as well return and have a leak rather than continue and a bugchk /* If we failed here, we might as well return and have a leak rather than continue and a bugchk */
if (ret != 0) if (ret != 0)
{ {
DPRINT_ERR(NETVSC, "unable to teardown send buffer's gpadl"); DPRINT_ERR(NETVSC, "unable to teardown send buffer's gpadl");
@ -636,7 +647,7 @@ NetVscDestroySendBuffer(
{ {
DPRINT_INFO(NETVSC, "Freeing up send buffer..."); DPRINT_INFO(NETVSC, "Freeing up send buffer...");
// Free up the receive buffer /* Free up the receive buffer */
PageFree(NetDevice->SendBuffer, NetDevice->SendBufferSize >> PAGE_SHIFT); PageFree(NetDevice->SendBuffer, NetDevice->SendBufferSize >> PAGE_SHIFT);
NetDevice->SendBuffer = NULL; NetDevice->SendBuffer = NULL;
} }
@ -677,7 +688,7 @@ NetVscConnectToVsp(
DPRINT_INFO(NETVSC, "Sending NvspMessageTypeInit..."); DPRINT_INFO(NETVSC, "Sending NvspMessageTypeInit...");
// Send the init request /* Send the init request */
ret = Device->Driver->VmbusChannelInterface.SendPacket(Device, ret = Device->Driver->VmbusChannelInterface.SendPacket(Device,
initPacket, initPacket,
sizeof(NVSP_MESSAGE), sizeof(NVSP_MESSAGE),
@ -693,8 +704,8 @@ NetVscConnectToVsp(
WaitEventWait(netDevice->ChannelInitEvent); WaitEventWait(netDevice->ChannelInitEvent);
// Now, check the response /* Now, check the response */
//ASSERT(initPacket->Messages.InitMessages.InitComplete.MaximumMdlChainLength <= MAX_MULTIPAGE_BUFFER_COUNT); /* ASSERT(initPacket->Messages.InitMessages.InitComplete.MaximumMdlChainLength <= MAX_MULTIPAGE_BUFFER_COUNT); */
DPRINT_INFO(NETVSC, "NvspMessageTypeInit status(%d) max mdl chain (%d)", DPRINT_INFO(NETVSC, "NvspMessageTypeInit status(%d) max mdl chain (%d)",
initPacket->Messages.InitMessages.InitComplete.Status, initPacket->Messages.InitMessages.InitComplete.Status,
initPacket->Messages.InitMessages.InitComplete.MaximumMdlChainLength); initPacket->Messages.InitMessages.InitComplete.MaximumMdlChainLength);
@ -715,7 +726,7 @@ NetVscConnectToVsp(
} }
DPRINT_INFO(NETVSC, "Sending NvspMessage1TypeSendNdisVersion..."); DPRINT_INFO(NETVSC, "Sending NvspMessage1TypeSendNdisVersion...");
// Send the ndis version /* Send the ndis version */
memset(initPacket, 0, sizeof(NVSP_MESSAGE)); memset(initPacket, 0, sizeof(NVSP_MESSAGE));
ndisVersion = 0x00050000; ndisVersion = 0x00050000;
@ -724,7 +735,7 @@ NetVscConnectToVsp(
initPacket->Messages.Version1Messages.SendNdisVersion.NdisMajorVersion = (ndisVersion & 0xFFFF0000) >> 16; initPacket->Messages.Version1Messages.SendNdisVersion.NdisMajorVersion = (ndisVersion & 0xFFFF0000) >> 16;
initPacket->Messages.Version1Messages.SendNdisVersion.NdisMinorVersion = ndisVersion & 0xFFFF; initPacket->Messages.Version1Messages.SendNdisVersion.NdisMinorVersion = ndisVersion & 0xFFFF;
// Send the init request /* Send the init request */
ret = Device->Driver->VmbusChannelInterface.SendPacket(Device, ret = Device->Driver->VmbusChannelInterface.SendPacket(Device,
initPacket, initPacket,
sizeof(NVSP_MESSAGE), sizeof(NVSP_MESSAGE),
@ -737,12 +748,15 @@ NetVscConnectToVsp(
ret = -1; ret = -1;
goto Cleanup; goto Cleanup;
} }
// /*
// BUGBUG - We have to wait for the above msg since the netvsp uses KMCL which acknowledges packet (completion packet) * BUGBUG - We have to wait for the above msg since the
// since our Vmbus always set the VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED flag * netvsp uses KMCL which acknowledges packet (completion
//WaitEventWait(NetVscChannel->ChannelInitEvent); * packet) since our Vmbus always set the
* VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED flag
*/
/* WaitEventWait(NetVscChannel->ChannelInitEvent); */
// Post the big receive buffer to NetVSP /* Post the big receive buffer to NetVSP */
ret = NetVscInitializeReceiveBufferWithNetVsp(Device); ret = NetVscInitializeReceiveBufferWithNetVsp(Device);
if (ret == 0) if (ret == 0)
{ {
@ -804,7 +818,7 @@ NetVscOnDeviceAdd(
DPRINT_DBG(NETVSC, "netvsc channel object allocated - %p", netDevice); DPRINT_DBG(NETVSC, "netvsc channel object allocated - %p", netDevice);
// Initialize the NetVSC channel extension /* Initialize the NetVSC channel extension */
netDevice->ReceiveBufferSize = NETVSC_RECEIVE_BUFFER_SIZE; netDevice->ReceiveBufferSize = NETVSC_RECEIVE_BUFFER_SIZE;
spin_lock_init(&netDevice->receive_packet_list_lock); spin_lock_init(&netDevice->receive_packet_list_lock);
@ -825,14 +839,14 @@ NetVscOnDeviceAdd(
} }
netDevice->ChannelInitEvent = WaitEventCreate(); netDevice->ChannelInitEvent = WaitEventCreate();
// Open the channel /* Open the channel */
ret = Device->Driver->VmbusChannelInterface.Open(Device, ret = Device->Driver->VmbusChannelInterface.Open(Device,
netDriver->RingBufferSize, netDriver->RingBufferSize,
netDriver->RingBufferSize, netDriver->RingBufferSize,
NULL, 0, NULL, 0,
NetVscOnChannelCallback, NetVscOnChannelCallback,
Device Device
); );
if (ret != 0) if (ret != 0)
{ {
@ -841,10 +855,10 @@ NetVscOnDeviceAdd(
goto Cleanup; goto Cleanup;
} }
// Channel is opened /* Channel is opened */
DPRINT_INFO(NETVSC, "*** NetVSC channel opened successfully! ***"); DPRINT_INFO(NETVSC, "*** NetVSC channel opened successfully! ***");
// Connect with the NetVsp /* Connect with the NetVsp */
ret = NetVscConnectToVsp(Device); ret = NetVscConnectToVsp(Device);
if (ret != 0) if (ret != 0)
{ {
@ -859,7 +873,7 @@ NetVscOnDeviceAdd(
return ret; return ret;
Close: Close:
// Now, we can close the channel safely /* Now, we can close the channel safely */
Device->Driver->VmbusChannelInterface.Close(Device); Device->Driver->VmbusChannelInterface.Close(Device);
Cleanup: Cleanup:
@ -909,7 +923,7 @@ NetVscOnDeviceRemove(
DPRINT_INFO(NETVSC, "Disabling outbound traffic on net device (%p)...", Device->Extension); DPRINT_INFO(NETVSC, "Disabling outbound traffic on net device (%p)...", Device->Extension);
// Stop outbound traffic ie sends and receives completions /* Stop outbound traffic ie sends and receives completions */
netDevice = ReleaseOutboundNetDevice(Device); netDevice = ReleaseOutboundNetDevice(Device);
if (!netDevice) if (!netDevice)
{ {
@ -917,7 +931,7 @@ NetVscOnDeviceRemove(
return -1; return -1;
} }
// Wait for all send completions /* Wait for all send completions */
while (netDevice->NumOutstandingSends) while (netDevice->NumOutstandingSends)
{ {
DPRINT_INFO(NETVSC, "waiting for %d requests to complete...", netDevice->NumOutstandingSends); DPRINT_INFO(NETVSC, "waiting for %d requests to complete...", netDevice->NumOutstandingSends);
@ -931,16 +945,16 @@ NetVscOnDeviceRemove(
DPRINT_INFO(NETVSC, "Disabling inbound traffic on net device (%p)...", Device->Extension); DPRINT_INFO(NETVSC, "Disabling inbound traffic on net device (%p)...", Device->Extension);
// Stop inbound traffic ie receives and sends completions /* Stop inbound traffic ie receives and sends completions */
netDevice = ReleaseInboundNetDevice(Device); netDevice = ReleaseInboundNetDevice(Device);
// At this point, no one should be accessing netDevice except in here /* At this point, no one should be accessing netDevice except in here */
DPRINT_INFO(NETVSC, "net device (%p) safe to remove", netDevice); DPRINT_INFO(NETVSC, "net device (%p) safe to remove", netDevice);
// Now, we can close the channel safely /* Now, we can close the channel safely */
Device->Driver->VmbusChannelInterface.Close(Device); Device->Driver->VmbusChannelInterface.Close(Device);
// Release all resources /* Release all resources */
while (!IsListEmpty(&netDevice->ReceivePacketList)) while (!IsListEmpty(&netDevice->ReceivePacketList))
{ {
entry = REMOVE_HEAD_LIST(&netDevice->ReceivePacketList); entry = REMOVE_HEAD_LIST(&netDevice->ReceivePacketList);
@ -1005,17 +1019,17 @@ NetVscOnSendCompletion(
nvspPacket->Header.MessageType == NvspMessage1TypeSendReceiveBufferComplete || nvspPacket->Header.MessageType == NvspMessage1TypeSendReceiveBufferComplete ||
nvspPacket->Header.MessageType == NvspMessage1TypeSendSendBufferComplete) nvspPacket->Header.MessageType == NvspMessage1TypeSendSendBufferComplete)
{ {
// Copy the response back /* Copy the response back */
memcpy(&netDevice->ChannelInitPacket, nvspPacket, sizeof(NVSP_MESSAGE)); memcpy(&netDevice->ChannelInitPacket, nvspPacket, sizeof(NVSP_MESSAGE));
WaitEventSet(netDevice->ChannelInitEvent); WaitEventSet(netDevice->ChannelInitEvent);
} }
else if (nvspPacket->Header.MessageType == NvspMessage1TypeSendRNDISPacketComplete) else if (nvspPacket->Header.MessageType == NvspMessage1TypeSendRNDISPacketComplete)
{ {
// Get the send context /* Get the send context */
nvscPacket = (NETVSC_PACKET *)(unsigned long)Packet->TransactionId; nvscPacket = (NETVSC_PACKET *)(unsigned long)Packet->TransactionId;
ASSERT(nvscPacket); ASSERT(nvscPacket);
// Notify the layer above us /* Notify the layer above us */
nvscPacket->Completion.Send.OnSendCompletion(nvscPacket->Completion.Send.SendCompletionContext); nvscPacket->Completion.Send.OnSendCompletion(nvscPacket->Completion.Send.SendCompletionContext);
InterlockedDecrement(&netDevice->NumOutstandingSends); InterlockedDecrement(&netDevice->NumOutstandingSends);
@ -1054,11 +1068,11 @@ NetVscOnSend(
sendMessage.Header.MessageType = NvspMessage1TypeSendRNDISPacket; sendMessage.Header.MessageType = NvspMessage1TypeSendRNDISPacket;
if (Packet->IsDataPacket) if (Packet->IsDataPacket)
sendMessage.Messages.Version1Messages.SendRNDISPacket.ChannelType = 0;// 0 is RMC_DATA; sendMessage.Messages.Version1Messages.SendRNDISPacket.ChannelType = 0;/* 0 is RMC_DATA; */
else else
sendMessage.Messages.Version1Messages.SendRNDISPacket.ChannelType = 1;// 1 is RMC_CONTROL; sendMessage.Messages.Version1Messages.SendRNDISPacket.ChannelType = 1;/* 1 is RMC_CONTROL; */
// Not using send buffer section /* Not using send buffer section */
sendMessage.Messages.Version1Messages.SendRNDISPacket.SendBufferSectionIndex = 0xFFFFFFFF; sendMessage.Messages.Version1Messages.SendRNDISPacket.SendBufferSectionIndex = 0xFFFFFFFF;
sendMessage.Messages.Version1Messages.SendRNDISPacket.SendBufferSectionSize = 0; sendMessage.Messages.Version1Messages.SendRNDISPacket.SendBufferSectionSize = 0;
@ -1108,7 +1122,7 @@ NetVscOnReceive(
LIST_ENTRY* entry; LIST_ENTRY* entry;
unsigned long start; unsigned long start;
unsigned long end, endVirtual; unsigned long end, endVirtual;
//NETVSC_DRIVER_OBJECT *netvscDriver; /* NETVSC_DRIVER_OBJECT *netvscDriver; */
XFERPAGE_PACKET *xferpagePacket=NULL; XFERPAGE_PACKET *xferpagePacket=NULL;
LIST_ENTRY listHead; LIST_ENTRY listHead;
@ -1126,7 +1140,7 @@ NetVscOnReceive(
return; return;
} }
// All inbound packets other than send completion should be xfer page packet /* All inbound packets other than send completion should be xfer page packet */
if (Packet->Type != VmbusPacketTypeDataUsingTransferPages) if (Packet->Type != VmbusPacketTypeDataUsingTransferPages)
{ {
DPRINT_ERR(NETVSC, "Unknown packet type received - %d", Packet->Type); DPRINT_ERR(NETVSC, "Unknown packet type received - %d", Packet->Type);
@ -1136,7 +1150,7 @@ NetVscOnReceive(
nvspPacket = (NVSP_MESSAGE*)((unsigned long)Packet + (Packet->DataOffset8 << 3)); nvspPacket = (NVSP_MESSAGE*)((unsigned long)Packet + (Packet->DataOffset8 << 3));
// Make sure this is a valid nvsp packet /* Make sure this is a valid nvsp packet */
if (nvspPacket->Header.MessageType != NvspMessage1TypeSendRNDISPacket ) if (nvspPacket->Header.MessageType != NvspMessage1TypeSendRNDISPacket )
{ {
DPRINT_ERR(NETVSC, "Unknown nvsp packet type received - %d", nvspPacket->Header.MessageType); DPRINT_ERR(NETVSC, "Unknown nvsp packet type received - %d", nvspPacket->Header.MessageType);
@ -1159,8 +1173,12 @@ NetVscOnReceive(
INITIALIZE_LIST_HEAD(&listHead); INITIALIZE_LIST_HEAD(&listHead);
// Grab free packets (range count + 1) to represent this xfer page packet. +1 to represent /*
// the xfer page packet itself. We grab it here so that we know exactly how many we can fulfil * Grab free packets (range count + 1) to represent this xfer
* page packet. +1 to represent the xfer page packet itself.
* We grab it here so that we know exactly how many we can
* fulfil
*/
spin_lock_irqsave(&netDevice->receive_packet_list_lock, flags); spin_lock_irqsave(&netDevice->receive_packet_list_lock, flags);
while (!IsListEmpty(&netDevice->ReceivePacketList)) while (!IsListEmpty(&netDevice->ReceivePacketList))
{ {
@ -1174,13 +1192,16 @@ NetVscOnReceive(
} }
spin_unlock_irqrestore(&netDevice->receive_packet_list_lock, flags); spin_unlock_irqrestore(&netDevice->receive_packet_list_lock, flags);
// We need at least 2 netvsc pkts (1 to represent the xfer page and at least 1 for the range) /*
// i.e. we can handled some of the xfer page packet ranges... * We need at least 2 netvsc pkts (1 to represent the xfer
* page and at least 1 for the range) i.e. we can handled
* some of the xfer page packet ranges...
*/
if (count < 2) if (count < 2)
{ {
DPRINT_ERR(NETVSC, "Got only %d netvsc pkt...needed %d pkts. Dropping this xfer page packet completely!", count, vmxferpagePacket->RangeCount+1); DPRINT_ERR(NETVSC, "Got only %d netvsc pkt...needed %d pkts. Dropping this xfer page packet completely!", count, vmxferpagePacket->RangeCount+1);
// Return it to the freelist /* Return it to the freelist */
spin_lock_irqsave(&netDevice->receive_packet_list_lock, flags); spin_lock_irqsave(&netDevice->receive_packet_list_lock, flags);
for (i=count; i != 0; i--) for (i=count; i != 0; i--)
{ {
@ -1197,10 +1218,10 @@ NetVscOnReceive(
return; return;
} }
// Remove the 1st packet to represent the xfer page packet itself /* Remove the 1st packet to represent the xfer page packet itself */
entry = REMOVE_HEAD_LIST(&listHead); entry = REMOVE_HEAD_LIST(&listHead);
xferpagePacket = CONTAINING_RECORD(entry, XFERPAGE_PACKET, ListEntry); xferpagePacket = CONTAINING_RECORD(entry, XFERPAGE_PACKET, ListEntry);
xferpagePacket->Count = count - 1; // This is how much we can satisfy xferpagePacket->Count = count - 1; /* This is how much we can satisfy */
ASSERT(xferpagePacket->Count > 0 && xferpagePacket->Count <= vmxferpagePacket->RangeCount); ASSERT(xferpagePacket->Count > 0 && xferpagePacket->Count <= vmxferpagePacket->RangeCount);
if (xferpagePacket->Count != vmxferpagePacket->RangeCount) if (xferpagePacket->Count != vmxferpagePacket->RangeCount)
@ -1208,18 +1229,18 @@ NetVscOnReceive(
DPRINT_INFO(NETVSC, "Needed %d netvsc pkts to satisy this xfer page...got %d", vmxferpagePacket->RangeCount, xferpagePacket->Count); DPRINT_INFO(NETVSC, "Needed %d netvsc pkts to satisy this xfer page...got %d", vmxferpagePacket->RangeCount, xferpagePacket->Count);
} }
// Each range represents 1 RNDIS pkt that contains 1 ethernet frame /* Each range represents 1 RNDIS pkt that contains 1 ethernet frame */
for (i=0; i < (count - 1); i++) for (i=0; i < (count - 1); i++)
{ {
entry = REMOVE_HEAD_LIST(&listHead); entry = REMOVE_HEAD_LIST(&listHead);
netvscPacket = CONTAINING_RECORD(entry, NETVSC_PACKET, ListEntry); netvscPacket = CONTAINING_RECORD(entry, NETVSC_PACKET, ListEntry);
// Initialize the netvsc packet /* Initialize the netvsc packet */
netvscPacket->XferPagePacket = xferpagePacket; netvscPacket->XferPagePacket = xferpagePacket;
netvscPacket->Completion.Recv.OnReceiveCompletion = NetVscOnReceiveCompletion; netvscPacket->Completion.Recv.OnReceiveCompletion = NetVscOnReceiveCompletion;
netvscPacket->Completion.Recv.ReceiveCompletionContext = netvscPacket; netvscPacket->Completion.Recv.ReceiveCompletionContext = netvscPacket;
netvscPacket->Device = Device; netvscPacket->Device = Device;
netvscPacket->Completion.Recv.ReceiveCompletionTid = vmxferpagePacket->d.TransactionId; // Save this so that we can send it back netvscPacket->Completion.Recv.ReceiveCompletionTid = vmxferpagePacket->d.TransactionId; /* Save this so that we can send it back */
netvscPacket->TotalDataBufferLength = vmxferpagePacket->Ranges[i].ByteCount; netvscPacket->TotalDataBufferLength = vmxferpagePacket->Ranges[i].ByteCount;
netvscPacket->PageBufferCount = 1; netvscPacket->PageBufferCount = 1;
@ -1236,10 +1257,10 @@ NetVscOnReceive(
+ vmxferpagePacket->Ranges[i].ByteCount -1; + vmxferpagePacket->Ranges[i].ByteCount -1;
end = GetPhysicalAddress((void*)endVirtual); end = GetPhysicalAddress((void*)endVirtual);
// Calculate the page relative offset /* Calculate the page relative offset */
netvscPacket->PageBuffers[0].Offset = vmxferpagePacket->Ranges[i].ByteOffset & (PAGE_SIZE -1); netvscPacket->PageBuffers[0].Offset = vmxferpagePacket->Ranges[i].ByteOffset & (PAGE_SIZE -1);
if ((end >> PAGE_SHIFT) != (start>>PAGE_SHIFT)) { if ((end >> PAGE_SHIFT) != (start>>PAGE_SHIFT)) {
//Handle frame across multiple pages: /* Handle frame across multiple pages: */
netvscPacket->PageBuffers[0].Length = netvscPacket->PageBuffers[0].Length =
(netvscPacket->PageBuffers[0].Pfn <<PAGE_SHIFT) + PAGE_SIZE - start; (netvscPacket->PageBuffers[0].Pfn <<PAGE_SHIFT) + PAGE_SIZE - start;
bytesRemain = netvscPacket->TotalDataBufferLength - netvscPacket->PageBuffers[0].Length; bytesRemain = netvscPacket->TotalDataBufferLength - netvscPacket->PageBuffers[0].Length;
@ -1268,7 +1289,7 @@ NetVscOnReceive(
netvscPacket->PageBuffers[0].Offset, netvscPacket->PageBuffers[0].Offset,
netvscPacket->PageBuffers[0].Length); netvscPacket->PageBuffers[0].Length);
// Pass it to the upper layer /* Pass it to the upper layer */
((NETVSC_DRIVER_OBJECT*)Device->Driver)->OnReceiveCallback(Device, netvscPacket); ((NETVSC_DRIVER_OBJECT*)Device->Driver)->OnReceiveCallback(Device, netvscPacket);
NetVscOnReceiveCompletion(netvscPacket->Completion.Recv.ReceiveCompletionContext); NetVscOnReceiveCompletion(netvscPacket->Completion.Recv.ReceiveCompletionContext);
@ -1295,22 +1316,22 @@ NetVscSendReceiveCompletion(
recvcompMessage.Header.MessageType = NvspMessage1TypeSendRNDISPacketComplete; recvcompMessage.Header.MessageType = NvspMessage1TypeSendRNDISPacketComplete;
// FIXME: Pass in the status /* FIXME: Pass in the status */
recvcompMessage.Messages.Version1Messages.SendRNDISPacketComplete.Status = NvspStatusSuccess; recvcompMessage.Messages.Version1Messages.SendRNDISPacketComplete.Status = NvspStatusSuccess;
retry_send_cmplt: retry_send_cmplt:
// Send the completion /* Send the completion */
ret = Device->Driver->VmbusChannelInterface.SendPacket(Device, ret = Device->Driver->VmbusChannelInterface.SendPacket(Device,
&recvcompMessage, &recvcompMessage,
sizeof(NVSP_MESSAGE), sizeof(NVSP_MESSAGE),
TransactionId, TransactionId,
VmbusPacketTypeCompletion, VmbusPacketTypeCompletion,
0); 0);
if (ret == 0) // success if (ret == 0) /* success */
{ {
// no-op /* no-op */
} }
else if (ret == -1) // no more room...wait a bit and attempt to retry 3 times else if (ret == -1) /* no more room...wait a bit and attempt to retry 3 times */
{ {
retries++; retries++;
DPRINT_ERR(NETVSC, "unable to send receive completion pkt (tid %llx)...retrying %d", TransactionId, retries); DPRINT_ERR(NETVSC, "unable to send receive completion pkt (tid %llx)...retrying %d", TransactionId, retries);
@ -1331,9 +1352,7 @@ retry_send_cmplt:
} }
} }
// /* Send a receive completion packet to RNDIS device (ie NetVsp) */
// Send a receive completion packet to RNDIS device (ie NetVsp)
//
static void static void
NetVscOnReceiveCompletion( NetVscOnReceiveCompletion(
void * Context) void * Context)
@ -1349,8 +1368,8 @@ NetVscOnReceiveCompletion(
ASSERT(packet->XferPagePacket); ASSERT(packet->XferPagePacket);
// Even though it seems logical to do a GetOutboundNetDevice() here to send out receive completion, /* Even though it seems logical to do a GetOutboundNetDevice() here to send out receive completion, */
// we are using GetInboundNetDevice() since we may have disable outbound traffic already. /* we are using GetInboundNetDevice() since we may have disable outbound traffic already. */
netDevice = GetInboundNetDevice(device); netDevice = GetInboundNetDevice(device);
if (!netDevice) if (!netDevice)
{ {
@ -1359,14 +1378,14 @@ NetVscOnReceiveCompletion(
return; return;
} }
// Overloading use of the lock. /* Overloading use of the lock. */
spin_lock_irqsave(&netDevice->receive_packet_list_lock, flags); spin_lock_irqsave(&netDevice->receive_packet_list_lock, flags);
ASSERT(packet->XferPagePacket->Count > 0); ASSERT(packet->XferPagePacket->Count > 0);
packet->XferPagePacket->Count--; packet->XferPagePacket->Count--;
// Last one in the line that represent 1 xfer page packet. /* Last one in the line that represent 1 xfer page packet. */
// Return the xfer page packet itself to the freelist /* Return the xfer page packet itself to the freelist */
if (packet->XferPagePacket->Count == 0) if (packet->XferPagePacket->Count == 0)
{ {
fSendReceiveComp = true; fSendReceiveComp = true;
@ -1375,11 +1394,11 @@ NetVscOnReceiveCompletion(
INSERT_TAIL_LIST(&netDevice->ReceivePacketList, &packet->XferPagePacket->ListEntry); INSERT_TAIL_LIST(&netDevice->ReceivePacketList, &packet->XferPagePacket->ListEntry);
} }
// Put the packet back /* Put the packet back */
INSERT_TAIL_LIST(&netDevice->ReceivePacketList, &packet->ListEntry); INSERT_TAIL_LIST(&netDevice->ReceivePacketList, &packet->ListEntry);
spin_unlock_irqrestore(&netDevice->receive_packet_list_lock, flags); spin_unlock_irqrestore(&netDevice->receive_packet_list_lock, flags);
// Send a receive completion for the xfer page packet /* Send a receive completion for the xfer page packet */
if (fSendReceiveComp) if (fSendReceiveComp)
{ {
NetVscSendReceiveCompletion(device, transactionId); NetVscSendReceiveCompletion(device, transactionId);
@ -1451,7 +1470,7 @@ NetVscOnChannelCallback(
break; break;
} }
// reset /* reset */
if (bufferlen > netPacketSize) if (bufferlen > netPacketSize)
{ {
kfree(buffer); kfree(buffer);
@ -1462,9 +1481,9 @@ NetVscOnChannelCallback(
} }
else else
{ {
//DPRINT_DBG(NETVSC, "nothing else to read..."); /* DPRINT_DBG(NETVSC, "nothing else to read..."); */
// reset /* reset */
if (bufferlen > netPacketSize) if (bufferlen > netPacketSize)
{ {
kfree(buffer); kfree(buffer);
@ -1476,12 +1495,12 @@ NetVscOnChannelCallback(
break; break;
} }
} }
else if (ret == -2) // Handle large packet else if (ret == -2) /* Handle large packet */
{ {
buffer = kmalloc(bytesRecvd, GFP_ATOMIC); buffer = kmalloc(bytesRecvd, GFP_ATOMIC);
if (buffer == NULL) if (buffer == NULL)
{ {
// Try again next time around /* Try again next time around */
DPRINT_ERR(NETVSC, "unable to allocate buffer of size (%d)!!", bytesRecvd); DPRINT_ERR(NETVSC, "unable to allocate buffer of size (%d)!!", bytesRecvd);
break; break;
} }

View file

@ -30,62 +30,62 @@
#include "include/List.h" #include "include/List.h"
#include "include/NetVscApi.h" #include "include/NetVscApi.h"
//
// #defines
//
//#define NVSC_MIN_PROTOCOL_VERSION 1
//#define NVSC_MAX_PROTOCOL_VERSION 1
#define NETVSC_SEND_BUFFER_SIZE 64*1024 // 64K /* #defines */
/* #define NVSC_MIN_PROTOCOL_VERSION 1 */
/* #define NVSC_MAX_PROTOCOL_VERSION 1 */
#define NETVSC_SEND_BUFFER_SIZE 64*1024 /* 64K */
#define NETVSC_SEND_BUFFER_ID 0xface #define NETVSC_SEND_BUFFER_ID 0xface
#define NETVSC_RECEIVE_BUFFER_SIZE 1024*1024 // 1MB #define NETVSC_RECEIVE_BUFFER_SIZE 1024*1024 /* 1MB */
#define NETVSC_RECEIVE_BUFFER_ID 0xcafe #define NETVSC_RECEIVE_BUFFER_ID 0xcafe
#define NETVSC_RECEIVE_SG_COUNT 1 #define NETVSC_RECEIVE_SG_COUNT 1
// Preallocated receive packets /* Preallocated receive packets */
#define NETVSC_RECEIVE_PACKETLIST_COUNT 256 #define NETVSC_RECEIVE_PACKETLIST_COUNT 256
//
// Data types
//
// Per netvsc channel-specific /* Data types */
/* Per netvsc channel-specific */
typedef struct _NETVSC_DEVICE { typedef struct _NETVSC_DEVICE {
DEVICE_OBJECT *Device; DEVICE_OBJECT *Device;
int RefCount; int RefCount;
int NumOutstandingSends; int NumOutstandingSends;
// List of free preallocated NETVSC_PACKET to represent receive packet /* List of free preallocated NETVSC_PACKET to represent receive packet */
LIST_ENTRY ReceivePacketList; LIST_ENTRY ReceivePacketList;
spinlock_t receive_packet_list_lock; spinlock_t receive_packet_list_lock;
// Send buffer allocated by us but manages by NetVSP /* Send buffer allocated by us but manages by NetVSP */
void * SendBuffer; void * SendBuffer;
u32 SendBufferSize; u32 SendBufferSize;
u32 SendBufferGpadlHandle; u32 SendBufferGpadlHandle;
u32 SendSectionSize; u32 SendSectionSize;
// Receive buffer allocated by us but manages by NetVSP /* Receive buffer allocated by us but manages by NetVSP */
void * ReceiveBuffer; void * ReceiveBuffer;
u32 ReceiveBufferSize; u32 ReceiveBufferSize;
u32 ReceiveBufferGpadlHandle; u32 ReceiveBufferGpadlHandle;
u32 ReceiveSectionCount; u32 ReceiveSectionCount;
PNVSP_1_RECEIVE_BUFFER_SECTION ReceiveSections; PNVSP_1_RECEIVE_BUFFER_SECTION ReceiveSections;
// Used for NetVSP initialization protocol /* Used for NetVSP initialization protocol */
HANDLE ChannelInitEvent; HANDLE ChannelInitEvent;
NVSP_MESSAGE ChannelInitPacket; NVSP_MESSAGE ChannelInitPacket;
NVSP_MESSAGE RevokePacket; NVSP_MESSAGE RevokePacket;
//unsigned char HwMacAddr[HW_MACADDR_LEN]; /* unsigned char HwMacAddr[HW_MACADDR_LEN]; */
// Holds rndis device info /* Holds rndis device info */
void *Extension; void *Extension;
} NETVSC_DEVICE; } NETVSC_DEVICE;
#endif // _NETVSC_H_ #endif /* _NETVSC_H_ */

View file

@ -25,11 +25,11 @@
#include "include/logging.h" #include "include/logging.h"
#include "RingBuffer.h" #include "RingBuffer.h"
//
// #defines
//
// Amount of space to write to /* #defines */
/* Amount of space to write to */
#define BYTES_AVAIL_TO_WRITE(r, w, z) ((w) >= (r))?((z) - ((w) - (r))):((r) - (w)) #define BYTES_AVAIL_TO_WRITE(r, w, z) ((w) >= (r))?((z) - ((w) - (r))):((r) - (w))
@ -48,7 +48,7 @@ GetRingBufferAvailBytes(RING_BUFFER_INFO *rbi, u32 *read, u32 *write)
{ {
u32 read_loc,write_loc; u32 read_loc,write_loc;
// Capture the read/write indices before they changed /* Capture the read/write indices before they changed */
read_loc = rbi->RingBuffer->ReadIndex; read_loc = rbi->RingBuffer->ReadIndex;
write_loc = rbi->RingBuffer->WriteIndex; write_loc = rbi->RingBuffer->WriteIndex;
@ -221,9 +221,9 @@ DumpRingInfo(RING_BUFFER_INFO* RingInfo, char *Prefix)
RingInfo->RingBuffer->WriteIndex); RingInfo->RingBuffer->WriteIndex);
} }
//
// Internal routines /* Internal routines */
//
static u32 static u32
CopyToRingBuffer( CopyToRingBuffer(
RING_BUFFER_INFO *RingInfo, RING_BUFFER_INFO *RingInfo,
@ -376,10 +376,10 @@ RingBufferWrite(
DPRINT_DBG(VMBUS, "Writing %u bytes...", totalBytesToWrite); DPRINT_DBG(VMBUS, "Writing %u bytes...", totalBytesToWrite);
//DumpRingInfo(OutRingInfo, "BEFORE "); /* DumpRingInfo(OutRingInfo, "BEFORE "); */
// If there is only room for the packet, assume it is full. Otherwise, the next time around, we think the ring buffer /* If there is only room for the packet, assume it is full. Otherwise, the next time around, we think the ring buffer */
// is empty since the read index == write index /* is empty since the read index == write index */
if (byteAvailToWrite <= totalBytesToWrite) if (byteAvailToWrite <= totalBytesToWrite)
{ {
DPRINT_DBG(VMBUS, "No more space left on outbound ring buffer (needed %u, avail %u)", totalBytesToWrite, byteAvailToWrite); DPRINT_DBG(VMBUS, "No more space left on outbound ring buffer (needed %u, avail %u)", totalBytesToWrite, byteAvailToWrite);
@ -391,7 +391,7 @@ RingBufferWrite(
return -1; return -1;
} }
// Write to the ring buffer /* Write to the ring buffer */
nextWriteLocation = GetNextWriteLocation(OutRingInfo); nextWriteLocation = GetNextWriteLocation(OutRingInfo);
for (i=0; i < SgBufferCount; i++) for (i=0; i < SgBufferCount; i++)
@ -402,7 +402,7 @@ RingBufferWrite(
SgBuffers[i].Length); SgBuffers[i].Length);
} }
// Set previous packet start /* Set previous packet start */
prevIndices = GetRingBufferIndices(OutRingInfo); prevIndices = GetRingBufferIndices(OutRingInfo);
nextWriteLocation = CopyToRingBuffer(OutRingInfo, nextWriteLocation = CopyToRingBuffer(OutRingInfo,
@ -410,13 +410,13 @@ RingBufferWrite(
&prevIndices, &prevIndices,
sizeof(u64)); sizeof(u64));
// Make sure we flush all writes before updating the writeIndex /* Make sure we flush all writes before updating the writeIndex */
mb(); mb();
// Now, update the write location /* Now, update the write location */
SetNextWriteLocation(OutRingInfo, nextWriteLocation); SetNextWriteLocation(OutRingInfo, nextWriteLocation);
//DumpRingInfo(OutRingInfo, "AFTER "); /* DumpRingInfo(OutRingInfo, "AFTER "); */
spin_unlock_irqrestore(&OutRingInfo->ring_lock, flags); spin_unlock_irqrestore(&OutRingInfo->ring_lock, flags);
@ -451,17 +451,17 @@ RingBufferPeek(
GetRingBufferAvailBytes(InRingInfo, &bytesAvailToRead, &bytesAvailToWrite); GetRingBufferAvailBytes(InRingInfo, &bytesAvailToRead, &bytesAvailToWrite);
// Make sure there is something to read /* Make sure there is something to read */
if (bytesAvailToRead < BufferLen ) if (bytesAvailToRead < BufferLen )
{ {
//DPRINT_DBG(VMBUS, "got callback but not enough to read <avail to read %d read size %d>!!", bytesAvailToRead, BufferLen); /* DPRINT_DBG(VMBUS, "got callback but not enough to read <avail to read %d read size %d>!!", bytesAvailToRead, BufferLen); */
spin_unlock_irqrestore(&InRingInfo->ring_lock, flags); spin_unlock_irqrestore(&InRingInfo->ring_lock, flags);
return -1; return -1;
} }
// Convert to byte offset /* Convert to byte offset */
nextReadLocation = GetNextReadLocation(InRingInfo); nextReadLocation = GetNextReadLocation(InRingInfo);
nextReadLocation = CopyFromRingBuffer(InRingInfo, nextReadLocation = CopyFromRingBuffer(InRingInfo,
@ -506,9 +506,9 @@ RingBufferRead(
DPRINT_DBG(VMBUS, "Reading %u bytes...", BufferLen); DPRINT_DBG(VMBUS, "Reading %u bytes...", BufferLen);
//DumpRingInfo(InRingInfo, "BEFORE "); /* DumpRingInfo(InRingInfo, "BEFORE "); */
// Make sure there is something to read /* Make sure there is something to read */
if (bytesAvailToRead < BufferLen ) if (bytesAvailToRead < BufferLen )
{ {
DPRINT_DBG(VMBUS, "got callback but not enough to read <avail to read %d read size %d>!!", bytesAvailToRead, BufferLen); DPRINT_DBG(VMBUS, "got callback but not enough to read <avail to read %d read size %d>!!", bytesAvailToRead, BufferLen);
@ -530,14 +530,14 @@ RingBufferRead(
sizeof(u64), sizeof(u64),
nextReadLocation); nextReadLocation);
// Make sure all reads are done before we update the read index since /* Make sure all reads are done before we update the read index since */
// the writer may start writing to the read area once the read index is updated /* the writer may start writing to the read area once the read index is updated */
mb(); mb();
// Update the read index /* Update the read index */
SetNextReadLocation(InRingInfo, nextReadLocation); SetNextReadLocation(InRingInfo, nextReadLocation);
//DumpRingInfo(InRingInfo, "AFTER "); /* DumpRingInfo(InRingInfo, "AFTER "); */
spin_unlock_irqrestore(&InRingInfo->ring_lock, flags); spin_unlock_irqrestore(&InRingInfo->ring_lock, flags);
@ -566,7 +566,7 @@ CopyToRingBuffer(
u32 ringBufferSize=GetRingBufferSize(RingInfo); u32 ringBufferSize=GetRingBufferSize(RingInfo);
u32 fragLen; u32 fragLen;
if (SrcLen > ringBufferSize - StartWriteOffset) // wrap-around detected! if (SrcLen > ringBufferSize - StartWriteOffset) /* wrap-around detected! */
{ {
DPRINT_DBG(VMBUS, "wrap-around detected!"); DPRINT_DBG(VMBUS, "wrap-around detected!");
@ -608,7 +608,7 @@ CopyFromRingBuffer(
u32 fragLen; u32 fragLen;
if (DestLen > ringBufferSize - StartReadOffset) // wrap-around detected at the src if (DestLen > ringBufferSize - StartReadOffset) /* wrap-around detected at the src */
{ {
DPRINT_DBG(VMBUS, "src wrap-around detected!"); DPRINT_DBG(VMBUS, "src wrap-around detected!");
@ -629,4 +629,4 @@ CopyFromRingBuffer(
} }
// eof /* eof */

View file

@ -33,24 +33,24 @@ typedef struct _SG_BUFFER_LIST {
} SG_BUFFER_LIST; } SG_BUFFER_LIST;
typedef struct _RING_BUFFER { typedef struct _RING_BUFFER {
volatile u32 WriteIndex; // Offset in bytes from the start of ring data below volatile u32 WriteIndex; /* Offset in bytes from the start of ring data below */
volatile u32 ReadIndex; // Offset in bytes from the start of ring data below volatile u32 ReadIndex; /* Offset in bytes from the start of ring data below */
volatile u32 InterruptMask; volatile u32 InterruptMask;
u8 Reserved[4084]; // Pad it to PAGE_SIZE so that data starts on page boundary u8 Reserved[4084]; /* Pad it to PAGE_SIZE so that data starts on page boundary */
// NOTE: The InterruptMask field is used only for channels but since our vmbus connection /* NOTE: The InterruptMask field is used only for channels but since our vmbus connection */
// also uses this data structure and its data starts here, we commented out this field. /* also uses this data structure and its data starts here, we commented out this field. */
// volatile u32 InterruptMask; /* volatile u32 InterruptMask; */
// Ring data starts here + RingDataStartOffset !!! DO NOT place any fields below this !!! /* Ring data starts here + RingDataStartOffset !!! DO NOT place any fields below this !!! */
u8 Buffer[0]; u8 Buffer[0];
} __attribute__((packed)) RING_BUFFER; } __attribute__((packed)) RING_BUFFER;
typedef struct _RING_BUFFER_INFO { typedef struct _RING_BUFFER_INFO {
RING_BUFFER* RingBuffer; RING_BUFFER* RingBuffer;
u32 RingSize; // Include the shared header u32 RingSize; /* Include the shared header */
spinlock_t ring_lock; spinlock_t ring_lock;
u32 RingDataSize; // < ringSize u32 RingDataSize; /* < ringSize */
u32 RingDataStartOffset; u32 RingDataStartOffset;
} RING_BUFFER_INFO; } RING_BUFFER_INFO;
@ -65,9 +65,9 @@ typedef struct _RING_BUFFER_DEBUG_INFO {
}RING_BUFFER_DEBUG_INFO; }RING_BUFFER_DEBUG_INFO;
//
// Interface /* Interface */
//
static int static int
RingBufferInit( RingBufferInit(
@ -120,4 +120,4 @@ RingBufferGetDebugInfo(
RING_BUFFER_DEBUG_INFO *DebugInfo RING_BUFFER_DEBUG_INFO *DebugInfo
); );
#endif // _RING_BUFFER_H_ #endif /* _RING_BUFFER_H_ */

View file

@ -28,12 +28,12 @@
#include "include/NetVscApi.h" #include "include/NetVscApi.h"
#include "RndisFilter.h" #include "RndisFilter.h"
//
// Data types /* Data types */
//
typedef struct _RNDIS_FILTER_DRIVER_OBJECT { typedef struct _RNDIS_FILTER_DRIVER_OBJECT {
// The original driver /* The original driver */
NETVSC_DRIVER_OBJECT InnerDriver; NETVSC_DRIVER_OBJECT InnerDriver;
} RNDIS_FILTER_DRIVER_OBJECT; } RNDIS_FILTER_DRIVER_OBJECT;
@ -63,14 +63,14 @@ typedef struct _RNDIS_REQUEST {
LIST_ENTRY ListEntry; LIST_ENTRY ListEntry;
HANDLE WaitEvent; HANDLE WaitEvent;
// FIXME: We assumed a fixed size response here. If we do ever need to handle a bigger response, /* FIXME: We assumed a fixed size response here. If we do ever need to handle a bigger response, */
// we can either define a max response message or add a response buffer variable above this field /* we can either define a max response message or add a response buffer variable above this field */
RNDIS_MESSAGE ResponseMessage; RNDIS_MESSAGE ResponseMessage;
// Simplify allocation by having a netvsc packet inline /* Simplify allocation by having a netvsc packet inline */
NETVSC_PACKET Packet; NETVSC_PACKET Packet;
PAGE_BUFFER Buffer; PAGE_BUFFER Buffer;
// FIXME: We assumed a fixed size request here. /* FIXME: We assumed a fixed size request here. */
RNDIS_MESSAGE RequestMessage; RNDIS_MESSAGE RequestMessage;
} RNDIS_REQUEST; } RNDIS_REQUEST;
@ -82,9 +82,9 @@ typedef struct _RNDIS_FILTER_PACKET {
RNDIS_MESSAGE Message; RNDIS_MESSAGE Message;
} RNDIS_FILTER_PACKET; } RNDIS_FILTER_PACKET;
//
// Internal routines /* Internal routines */
//
static int static int
RndisFilterSendRequest( RndisFilterSendRequest(
RNDIS_DEVICE *Device, RNDIS_DEVICE *Device,
@ -197,11 +197,11 @@ RndisFilterOnSendRequestCompletion(
void *Context void *Context
); );
//
// Global var
//
// The one and only /* Global var */
/* The one and only */
RNDIS_FILTER_DRIVER_OBJECT gRndisFilter; RNDIS_FILTER_DRIVER_OBJECT gRndisFilter;
static inline RNDIS_DEVICE* GetRndisDevice(void) static inline RNDIS_DEVICE* GetRndisDevice(void)
@ -252,12 +252,12 @@ static inline RNDIS_REQUEST* GetRndisRequest(RNDIS_DEVICE *Device, u32 MessageTy
rndisMessage->NdisMessageType = MessageType; rndisMessage->NdisMessageType = MessageType;
rndisMessage->MessageLength = MessageLength; rndisMessage->MessageLength = MessageLength;
// Set the request id. This field is always after the rndis header for request/response packet types so /* Set the request id. This field is always after the rndis header for request/response packet types so */
// we just used the SetRequest as a template /* we just used the SetRequest as a template */
set = &rndisMessage->Message.SetRequest; set = &rndisMessage->Message.SetRequest;
set->RequestId = InterlockedIncrement((int*)&Device->NewRequestId); set->RequestId = InterlockedIncrement((int*)&Device->NewRequestId);
// Add to the request list /* Add to the request list */
spin_lock_irqsave(&Device->request_lock, flags); spin_lock_irqsave(&Device->request_lock, flags);
INSERT_TAIL_LIST(&Device->RequestList, &request->ListEntry); INSERT_TAIL_LIST(&Device->RequestList, &request->ListEntry);
spin_unlock_irqrestore(&Device->request_lock, flags); spin_unlock_irqrestore(&Device->request_lock, flags);
@ -349,7 +349,7 @@ RndisFilterSendRequest(
DPRINT_ENTER(NETVSC); DPRINT_ENTER(NETVSC);
// Setup the packet to send it /* Setup the packet to send it */
packet = &Request->Packet; packet = &Request->Packet;
packet->IsDataPacket = false; packet->IsDataPacket = false;
@ -360,7 +360,7 @@ RndisFilterSendRequest(
packet->PageBuffers[0].Length = Request->RequestMessage.MessageLength; packet->PageBuffers[0].Length = Request->RequestMessage.MessageLength;
packet->PageBuffers[0].Offset = (unsigned long)&Request->RequestMessage & (PAGE_SIZE -1); packet->PageBuffers[0].Offset = (unsigned long)&Request->RequestMessage & (PAGE_SIZE -1);
packet->Completion.Send.SendCompletionContext = Request;//packet; packet->Completion.Send.SendCompletionContext = Request;/* packet; */
packet->Completion.Send.OnSendCompletion = RndisFilterOnSendRequestCompletion; packet->Completion.Send.OnSendCompletion = RndisFilterOnSendRequestCompletion;
packet->Completion.Send.SendCompletionTid = (unsigned long)Device; packet->Completion.Send.SendCompletionTid = (unsigned long)Device;
@ -389,7 +389,7 @@ RndisFilterReceiveResponse(
{ {
request = CONTAINING_RECORD(curr, RNDIS_REQUEST, ListEntry); request = CONTAINING_RECORD(curr, RNDIS_REQUEST, ListEntry);
// All request/response message contains RequestId as the 1st field /* All request/response message contains RequestId as the 1st field */
if (request->RequestMessage.Message.InitializeRequest.RequestId == Response->Message.InitializeComplete.RequestId) if (request->RequestMessage.Message.InitializeRequest.RequestId == Response->Message.InitializeComplete.RequestId)
{ {
DPRINT_DBG(NETVSC, "found rndis request for this response (id 0x%x req type 0x%x res type 0x%x)", DPRINT_DBG(NETVSC, "found rndis request for this response (id 0x%x req type 0x%x res type 0x%x)",
@ -411,7 +411,7 @@ RndisFilterReceiveResponse(
{ {
DPRINT_ERR(NETVSC, "rndis response buffer overflow detected (size %u max %u)", Response->MessageLength, sizeof(RNDIS_FILTER_PACKET)); DPRINT_ERR(NETVSC, "rndis response buffer overflow detected (size %u max %u)", Response->MessageLength, sizeof(RNDIS_FILTER_PACKET));
if (Response->NdisMessageType == REMOTE_NDIS_RESET_CMPLT) // does not have a request id field if (Response->NdisMessageType == REMOTE_NDIS_RESET_CMPLT) /* does not have a request id field */
{ {
request->ResponseMessage.Message.ResetComplete.Status = STATUS_BUFFER_OVERFLOW; request->ResponseMessage.Message.ResetComplete.Status = STATUS_BUFFER_OVERFLOW;
} }
@ -450,7 +450,7 @@ RndisFilterReceiveIndicateStatus(
} }
else else
{ {
// TODO: /* TODO: */
} }
} }
@ -466,15 +466,15 @@ RndisFilterReceiveData(
DPRINT_ENTER(NETVSC); DPRINT_ENTER(NETVSC);
// empty ethernet frame ?? /* empty ethernet frame ?? */
ASSERT(Packet->PageBuffers[0].Length > RNDIS_MESSAGE_SIZE(RNDIS_PACKET)); ASSERT(Packet->PageBuffers[0].Length > RNDIS_MESSAGE_SIZE(RNDIS_PACKET));
rndisPacket = &Message->Message.Packet; rndisPacket = &Message->Message.Packet;
// FIXME: Handle multiple rndis pkt msgs that maybe enclosed in this /* FIXME: Handle multiple rndis pkt msgs that maybe enclosed in this */
// netvsc packet (ie TotalDataBufferLength != MessageLength) /* netvsc packet (ie TotalDataBufferLength != MessageLength) */
// Remove the rndis header and pass it back up the stack /* Remove the rndis header and pass it back up the stack */
dataOffset = RNDIS_HEADER_SIZE + rndisPacket->DataOffset; dataOffset = RNDIS_HEADER_SIZE + rndisPacket->DataOffset;
Packet->TotalDataBufferLength -= dataOffset; Packet->TotalDataBufferLength -= dataOffset;
@ -502,7 +502,7 @@ RndisFilterOnReceive(
DPRINT_ENTER(NETVSC); DPRINT_ENTER(NETVSC);
ASSERT(netDevice); ASSERT(netDevice);
//Make sure the rndis device state is initialized /* Make sure the rndis device state is initialized */
if (!netDevice->Extension) if (!netDevice->Extension)
{ {
DPRINT_ERR(NETVSC, "got rndis message but no rndis device...dropping this message!"); DPRINT_ERR(NETVSC, "got rndis message but no rndis device...dropping this message!");
@ -522,9 +522,9 @@ RndisFilterOnReceive(
rndisHeader = (void*)((unsigned long)rndisHeader + Packet->PageBuffers[0].Offset); rndisHeader = (void*)((unsigned long)rndisHeader + Packet->PageBuffers[0].Offset);
// Make sure we got a valid rndis message /* Make sure we got a valid rndis message */
// FIXME: There seems to be a bug in set completion msg where its MessageLength is 16 bytes but /* FIXME: There seems to be a bug in set completion msg where its MessageLength is 16 bytes but */
// the ByteCount field in the xfer page range shows 52 bytes /* the ByteCount field in the xfer page range shows 52 bytes */
#if 0 #if 0
if ( Packet->TotalDataBufferLength != rndisHeader->MessageLength ) if ( Packet->TotalDataBufferLength != rndisHeader->MessageLength )
{ {
@ -551,21 +551,21 @@ RndisFilterOnReceive(
switch (rndisMessage.NdisMessageType) switch (rndisMessage.NdisMessageType)
{ {
// data msg /* data msg */
case REMOTE_NDIS_PACKET_MSG: case REMOTE_NDIS_PACKET_MSG:
RndisFilterReceiveData(rndisDevice, &rndisMessage, Packet); RndisFilterReceiveData(rndisDevice, &rndisMessage, Packet);
break; break;
// completion msgs /* completion msgs */
case REMOTE_NDIS_INITIALIZE_CMPLT: case REMOTE_NDIS_INITIALIZE_CMPLT:
case REMOTE_NDIS_QUERY_CMPLT: case REMOTE_NDIS_QUERY_CMPLT:
case REMOTE_NDIS_SET_CMPLT: case REMOTE_NDIS_SET_CMPLT:
//case REMOTE_NDIS_RESET_CMPLT: /* case REMOTE_NDIS_RESET_CMPLT: */
//case REMOTE_NDIS_KEEPALIVE_CMPLT: /* case REMOTE_NDIS_KEEPALIVE_CMPLT: */
RndisFilterReceiveResponse(rndisDevice, &rndisMessage); RndisFilterReceiveResponse(rndisDevice, &rndisMessage);
break; break;
// notification msgs /* notification msgs */
case REMOTE_NDIS_INDICATE_STATUS_MSG: case REMOTE_NDIS_INDICATE_STATUS_MSG:
RndisFilterReceiveIndicateStatus(rndisDevice, &rndisMessage); RndisFilterReceiveIndicateStatus(rndisDevice, &rndisMessage);
break; break;
@ -605,7 +605,7 @@ RndisFilterQueryDevice(
goto Cleanup; goto Cleanup;
} }
// Setup the rndis query /* Setup the rndis query */
query = &request->RequestMessage.Message.QueryRequest; query = &request->RequestMessage.Message.QueryRequest;
query->Oid = Oid; query->Oid = Oid;
query->InformationBufferOffset = sizeof(RNDIS_QUERY_REQUEST); query->InformationBufferOffset = sizeof(RNDIS_QUERY_REQUEST);
@ -620,7 +620,7 @@ RndisFilterQueryDevice(
WaitEventWait(request->WaitEvent); WaitEventWait(request->WaitEvent);
// Copy the response back /* Copy the response back */
queryComplete = &request->ResponseMessage.Message.QueryComplete; queryComplete = &request->ResponseMessage.Message.QueryComplete;
if (queryComplete->InformationBufferLength > inresultSize) if (queryComplete->InformationBufferLength > inresultSize)
@ -694,7 +694,7 @@ RndisFilterSetPacketFilter(
goto Cleanup; goto Cleanup;
} }
// Setup the rndis set /* Setup the rndis set */
set = &request->RequestMessage.Message.SetRequest; set = &request->RequestMessage.Message.SetRequest;
set->Oid = RNDIS_OID_GEN_CURRENT_PACKET_FILTER; set->Oid = RNDIS_OID_GEN_CURRENT_PACKET_FILTER;
set->InformationBufferLength = sizeof(u32); set->InformationBufferLength = sizeof(u32);
@ -713,7 +713,7 @@ RndisFilterSetPacketFilter(
{ {
ret = -1; ret = -1;
DPRINT_ERR(NETVSC, "timeout before we got a set response..."); DPRINT_ERR(NETVSC, "timeout before we got a set response...");
// We cant deallocate the request since we may still receive a send completion for it. /* We cant deallocate the request since we may still receive a send completion for it. */
goto Exit; goto Exit;
} }
else else
@ -747,9 +747,9 @@ RndisFilterInit(
DPRINT_DBG(NETVSC, "sizeof(RNDIS_FILTER_PACKET) == %d", sizeof(RNDIS_FILTER_PACKET)); DPRINT_DBG(NETVSC, "sizeof(RNDIS_FILTER_PACKET) == %d", sizeof(RNDIS_FILTER_PACKET));
Driver->RequestExtSize = sizeof(RNDIS_FILTER_PACKET); Driver->RequestExtSize = sizeof(RNDIS_FILTER_PACKET);
Driver->AdditionalRequestPageBufferCount = 1; // For rndis header Driver->AdditionalRequestPageBufferCount = 1; /* For rndis header */
//Driver->Context = rndisDriver; /* Driver->Context = rndisDriver; */
memset(&gRndisFilter, 0, sizeof(RNDIS_FILTER_DRIVER_OBJECT)); memset(&gRndisFilter, 0, sizeof(RNDIS_FILTER_DRIVER_OBJECT));
@ -758,7 +758,7 @@ RndisFilterInit(
ASSERT(Driver->OnLinkStatusChanged); ASSERT(Driver->OnLinkStatusChanged);
rndisDriver->OnLinkStatusChanged = Driver->OnLinkStatusChanged;*/ rndisDriver->OnLinkStatusChanged = Driver->OnLinkStatusChanged;*/
// Save the original dispatch handlers before we override it /* Save the original dispatch handlers before we override it */
gRndisFilter.InnerDriver.Base.OnDeviceAdd = Driver->Base.OnDeviceAdd; gRndisFilter.InnerDriver.Base.OnDeviceAdd = Driver->Base.OnDeviceAdd;
gRndisFilter.InnerDriver.Base.OnDeviceRemove = Driver->Base.OnDeviceRemove; gRndisFilter.InnerDriver.Base.OnDeviceRemove = Driver->Base.OnDeviceRemove;
gRndisFilter.InnerDriver.Base.OnCleanup = Driver->Base.OnCleanup; gRndisFilter.InnerDriver.Base.OnCleanup = Driver->Base.OnCleanup;
@ -769,14 +769,14 @@ RndisFilterInit(
gRndisFilter.InnerDriver.OnReceiveCallback = Driver->OnReceiveCallback; gRndisFilter.InnerDriver.OnReceiveCallback = Driver->OnReceiveCallback;
gRndisFilter.InnerDriver.OnLinkStatusChanged = Driver->OnLinkStatusChanged; gRndisFilter.InnerDriver.OnLinkStatusChanged = Driver->OnLinkStatusChanged;
// Override /* Override */
Driver->Base.OnDeviceAdd = RndisFilterOnDeviceAdd; Driver->Base.OnDeviceAdd = RndisFilterOnDeviceAdd;
Driver->Base.OnDeviceRemove = RndisFilterOnDeviceRemove; Driver->Base.OnDeviceRemove = RndisFilterOnDeviceRemove;
Driver->Base.OnCleanup = RndisFilterOnCleanup; Driver->Base.OnCleanup = RndisFilterOnCleanup;
Driver->OnSend = RndisFilterOnSend; Driver->OnSend = RndisFilterOnSend;
Driver->OnOpen = RndisFilterOnOpen; Driver->OnOpen = RndisFilterOnOpen;
Driver->OnClose = RndisFilterOnClose; Driver->OnClose = RndisFilterOnClose;
//Driver->QueryLinkStatus = RndisFilterQueryDeviceLinkStatus; /* Driver->QueryLinkStatus = RndisFilterQueryDeviceLinkStatus; */
Driver->OnReceiveCallback = RndisFilterOnReceive; Driver->OnReceiveCallback = RndisFilterOnReceive;
DPRINT_EXIT(NETVSC); DPRINT_EXIT(NETVSC);
@ -804,11 +804,11 @@ RndisFilterInitDevice(
goto Cleanup; goto Cleanup;
} }
// Setup the rndis set /* Setup the rndis set */
init = &request->RequestMessage.Message.InitializeRequest; init = &request->RequestMessage.Message.InitializeRequest;
init->MajorVersion = RNDIS_MAJOR_VERSION; init->MajorVersion = RNDIS_MAJOR_VERSION;
init->MinorVersion = RNDIS_MINOR_VERSION; init->MinorVersion = RNDIS_MINOR_VERSION;
init->MaxTransferSize = 2048; // FIXME: Use 1536 - rounded ethernet frame size init->MaxTransferSize = 2048; /* FIXME: Use 1536 - rounded ethernet frame size */
Device->State = RNDIS_DEV_INITIALIZING; Device->State = RNDIS_DEV_INITIALIZING;
@ -854,18 +854,18 @@ RndisFilterHaltDevice(
DPRINT_ENTER(NETVSC); DPRINT_ENTER(NETVSC);
// Attempt to do a rndis device halt /* Attempt to do a rndis device halt */
request = GetRndisRequest(Device, REMOTE_NDIS_HALT_MSG, RNDIS_MESSAGE_SIZE(RNDIS_HALT_REQUEST)); request = GetRndisRequest(Device, REMOTE_NDIS_HALT_MSG, RNDIS_MESSAGE_SIZE(RNDIS_HALT_REQUEST));
if (!request) if (!request)
{ {
goto Cleanup; goto Cleanup;
} }
// Setup the rndis set /* Setup the rndis set */
halt = &request->RequestMessage.Message.HaltRequest; halt = &request->RequestMessage.Message.HaltRequest;
halt->RequestId = InterlockedIncrement((int*)&Device->NewRequestId); halt->RequestId = InterlockedIncrement((int*)&Device->NewRequestId);
// Ignore return since this msg is optional. /* Ignore return since this msg is optional. */
RndisFilterSendRequest(Device, request); RndisFilterSendRequest(Device, request);
Device->State = RNDIS_DEV_UNINITIALIZED; Device->State = RNDIS_DEV_UNINITIALIZED;
@ -948,9 +948,9 @@ RndisFilterOnDeviceAdd(
DPRINT_DBG(NETVSC, "rndis device object allocated - %p", rndisDevice); DPRINT_DBG(NETVSC, "rndis device object allocated - %p", rndisDevice);
// Let the inner driver handle this first to create the netvsc channel /* Let the inner driver handle this first to create the netvsc channel */
// NOTE! Once the channel is created, we may get a receive callback /* NOTE! Once the channel is created, we may get a receive callback */
// (RndisFilterOnReceive()) before this call is completed /* (RndisFilterOnReceive()) before this call is completed */
ret = gRndisFilter.InnerDriver.Base.OnDeviceAdd(Device, AdditionalInfo); ret = gRndisFilter.InnerDriver.Base.OnDeviceAdd(Device, AdditionalInfo);
if (ret != 0) if (ret != 0)
{ {
@ -959,9 +959,9 @@ RndisFilterOnDeviceAdd(
return ret; return ret;
} }
//
// Initialize the rndis device /* Initialize the rndis device */
//
netDevice = (NETVSC_DEVICE*)Device->Extension; netDevice = (NETVSC_DEVICE*)Device->Extension;
ASSERT(netDevice); ASSERT(netDevice);
ASSERT(netDevice->Device); ASSERT(netDevice->Device);
@ -969,18 +969,18 @@ RndisFilterOnDeviceAdd(
netDevice->Extension = rndisDevice; netDevice->Extension = rndisDevice;
rndisDevice->NetDevice = netDevice; rndisDevice->NetDevice = netDevice;
// Send the rndis initialization message /* Send the rndis initialization message */
ret = RndisFilterInitDevice(rndisDevice); ret = RndisFilterInitDevice(rndisDevice);
if (ret != 0) if (ret != 0)
{ {
// TODO: If rndis init failed, we will need to shut down the channel /* TODO: If rndis init failed, we will need to shut down the channel */
} }
// Get the mac address /* Get the mac address */
ret = RndisFilterQueryDeviceMac(rndisDevice); ret = RndisFilterQueryDeviceMac(rndisDevice);
if (ret != 0) if (ret != 0)
{ {
// TODO: shutdown rndis device and the channel /* TODO: shutdown rndis device and the channel */
} }
DPRINT_INFO(NETVSC, "Device 0x%p mac addr %02x%02x%02x%02x%02x%02x", DPRINT_INFO(NETVSC, "Device 0x%p mac addr %02x%02x%02x%02x%02x%02x",
@ -1015,13 +1015,13 @@ RndisFilterOnDeviceRemove(
DPRINT_ENTER(NETVSC); DPRINT_ENTER(NETVSC);
// Halt and release the rndis device /* Halt and release the rndis device */
RndisFilterHaltDevice(rndisDevice); RndisFilterHaltDevice(rndisDevice);
PutRndisDevice(rndisDevice); PutRndisDevice(rndisDevice);
netDevice->Extension = NULL; netDevice->Extension = NULL;
// Pass control to inner driver to remove the device /* Pass control to inner driver to remove the device */
gRndisFilter.InnerDriver.Base.OnDeviceRemove(Device); gRndisFilter.InnerDriver.Base.OnDeviceRemove(Device);
DPRINT_EXIT(NETVSC); DPRINT_EXIT(NETVSC);
@ -1091,7 +1091,7 @@ RndisFilterOnSend(
DPRINT_ENTER(NETVSC); DPRINT_ENTER(NETVSC);
// Add the rndis header /* Add the rndis header */
filterPacket = (RNDIS_FILTER_PACKET*)Packet->Extension; filterPacket = (RNDIS_FILTER_PACKET*)Packet->Extension;
ASSERT(filterPacket); ASSERT(filterPacket);
@ -1112,18 +1112,18 @@ RndisFilterOnSend(
Packet->PageBuffers[0].Offset = (unsigned long)rndisMessage & (PAGE_SIZE-1); Packet->PageBuffers[0].Offset = (unsigned long)rndisMessage & (PAGE_SIZE-1);
Packet->PageBuffers[0].Length = rndisMessageSize; Packet->PageBuffers[0].Length = rndisMessageSize;
// Save the packet send completion and context /* Save the packet send completion and context */
filterPacket->OnCompletion = Packet->Completion.Send.OnSendCompletion; filterPacket->OnCompletion = Packet->Completion.Send.OnSendCompletion;
filterPacket->CompletionContext = Packet->Completion.Send.SendCompletionContext; filterPacket->CompletionContext = Packet->Completion.Send.SendCompletionContext;
// Use ours /* Use ours */
Packet->Completion.Send.OnSendCompletion = RndisFilterOnSendCompletion; Packet->Completion.Send.OnSendCompletion = RndisFilterOnSendCompletion;
Packet->Completion.Send.SendCompletionContext = filterPacket; Packet->Completion.Send.SendCompletionContext = filterPacket;
ret = gRndisFilter.InnerDriver.OnSend(Device, Packet); ret = gRndisFilter.InnerDriver.OnSend(Device, Packet);
if (ret != 0) if (ret != 0)
{ {
// Reset the completion to originals to allow retries from above /* Reset the completion to originals to allow retries from above */
Packet->Completion.Send.OnSendCompletion = filterPacket->OnCompletion; Packet->Completion.Send.OnSendCompletion = filterPacket->OnCompletion;
Packet->Completion.Send.SendCompletionContext = filterPacket->CompletionContext; Packet->Completion.Send.SendCompletionContext = filterPacket->CompletionContext;
} }
@ -1141,7 +1141,7 @@ RndisFilterOnSendCompletion(
DPRINT_ENTER(NETVSC); DPRINT_ENTER(NETVSC);
// Pass it back to the original handler /* Pass it back to the original handler */
filterPacket->OnCompletion(filterPacket->CompletionContext); filterPacket->OnCompletion(filterPacket->CompletionContext);
DPRINT_EXIT(NETVSC); DPRINT_EXIT(NETVSC);
@ -1155,6 +1155,6 @@ RndisFilterOnSendRequestCompletion(
{ {
DPRINT_ENTER(NETVSC); DPRINT_ENTER(NETVSC);
// Noop /* Noop */
DPRINT_EXIT(NETVSC); DPRINT_EXIT(NETVSC);
} }

View file

@ -49,13 +49,13 @@
//
// Interface /* Interface */
//
int int
RndisFilterInit( RndisFilterInit(
NETVSC_DRIVER_OBJECT *Driver NETVSC_DRIVER_OBJECT *Driver
); );
#endif // _RNDISFILTER_H_ #endif /* _RNDISFILTER_H_ */

View file

@ -32,45 +32,48 @@
#include "include/vstorage.h" #include "include/vstorage.h"
//
// #defines
//
// /* #defines */
// Data types
//
/* Data types */
typedef struct _STORVSC_REQUEST_EXTENSION { typedef struct _STORVSC_REQUEST_EXTENSION {
//LIST_ENTRY ListEntry; /* LIST_ENTRY ListEntry; */
STORVSC_REQUEST *Request; STORVSC_REQUEST *Request;
DEVICE_OBJECT *Device; DEVICE_OBJECT *Device;
// Synchronize the request/response if needed /* Synchronize the request/response if needed */
HANDLE WaitEvent; HANDLE WaitEvent;
VSTOR_PACKET VStorPacket; VSTOR_PACKET VStorPacket;
} STORVSC_REQUEST_EXTENSION; } STORVSC_REQUEST_EXTENSION;
// A storvsc device is a device object that contains a vmbus channel /* A storvsc device is a device object that contains a vmbus channel */
typedef struct _STORVSC_DEVICE{ typedef struct _STORVSC_DEVICE{
DEVICE_OBJECT *Device; DEVICE_OBJECT *Device;
int RefCount; // 0 indicates the device is being destroyed int RefCount; /* 0 indicates the device is being destroyed */
int NumOutstandingRequests; int NumOutstandingRequests;
// Each unique Port/Path/Target represents 1 channel ie scsi controller. In reality, the pathid, targetid is always 0 /*
// and the port is set by us * Each unique Port/Path/Target represents 1 channel ie scsi
* controller. In reality, the pathid, targetid is always 0
* and the port is set by us
*/
unsigned int PortNumber; unsigned int PortNumber;
unsigned char PathId; unsigned char PathId;
unsigned char TargetId; unsigned char TargetId;
//LIST_ENTRY OutstandingRequestList; /* LIST_ENTRY OutstandingRequestList; */
//HANDLE OutstandingRequestLock; /* HANDLE OutstandingRequestLock; */
// Used for vsc/vsp channel reset process /* Used for vsc/vsp channel reset process */
STORVSC_REQUEST_EXTENSION InitRequest; STORVSC_REQUEST_EXTENSION InitRequest;
STORVSC_REQUEST_EXTENSION ResetRequest; STORVSC_REQUEST_EXTENSION ResetRequest;
@ -78,19 +81,19 @@ typedef struct _STORVSC_DEVICE{
} STORVSC_DEVICE; } STORVSC_DEVICE;
//
// Globals /* Globals */
//
static const char* gDriverName="storvsc"; static const char* gDriverName="storvsc";
//{ba6163d9-04a1-4d29-b605-72e2ffb1dc7f} /* {ba6163d9-04a1-4d29-b605-72e2ffb1dc7f} */
static const GUID gStorVscDeviceType={ static const GUID gStorVscDeviceType={
.Data = {0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f} .Data = {0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f}
}; };
//
// Internal routines /* Internal routines */
//
static int static int
StorVscOnDeviceAdd( StorVscOnDeviceAdd(
DEVICE_OBJECT *Device, DEVICE_OBJECT *Device,
@ -150,8 +153,8 @@ static inline STORVSC_DEVICE* AllocStorDevice(DEVICE_OBJECT *Device)
if (!storDevice) if (!storDevice)
return NULL; return NULL;
// Set to 2 to allow both inbound and outbound traffics /* Set to 2 to allow both inbound and outbound traffics */
// (ie GetStorDevice() and MustGetStorDevice()) to proceed. /* (ie GetStorDevice() and MustGetStorDevice()) to proceed. */
InterlockedCompareExchange(&storDevice->RefCount, 2, 0); InterlockedCompareExchange(&storDevice->RefCount, 2, 0);
storDevice->Device = Device; storDevice->Device = Device;
@ -166,7 +169,7 @@ static inline void FreeStorDevice(STORVSC_DEVICE *Device)
kfree(Device); kfree(Device);
} }
// Get the stordevice object iff exists and its refcount > 1 /* Get the stordevice object iff exists and its refcount > 1 */
static inline STORVSC_DEVICE* GetStorDevice(DEVICE_OBJECT *Device) static inline STORVSC_DEVICE* GetStorDevice(DEVICE_OBJECT *Device)
{ {
STORVSC_DEVICE *storDevice; STORVSC_DEVICE *storDevice;
@ -184,7 +187,7 @@ static inline STORVSC_DEVICE* GetStorDevice(DEVICE_OBJECT *Device)
return storDevice; return storDevice;
} }
// Get the stordevice object iff exists and its refcount > 0 /* Get the stordevice object iff exists and its refcount > 0 */
static inline STORVSC_DEVICE* MustGetStorDevice(DEVICE_OBJECT *Device) static inline STORVSC_DEVICE* MustGetStorDevice(DEVICE_OBJECT *Device)
{ {
STORVSC_DEVICE *storDevice; STORVSC_DEVICE *storDevice;
@ -213,7 +216,7 @@ static inline void PutStorDevice(DEVICE_OBJECT *Device)
ASSERT(storDevice->RefCount); ASSERT(storDevice->RefCount);
} }
// Drop ref count to 1 to effectively disable GetStorDevice() /* Drop ref count to 1 to effectively disable GetStorDevice() */
static inline STORVSC_DEVICE* ReleaseStorDevice(DEVICE_OBJECT *Device) static inline STORVSC_DEVICE* ReleaseStorDevice(DEVICE_OBJECT *Device)
{ {
STORVSC_DEVICE *storDevice; STORVSC_DEVICE *storDevice;
@ -221,7 +224,7 @@ static inline STORVSC_DEVICE* ReleaseStorDevice(DEVICE_OBJECT *Device)
storDevice = (STORVSC_DEVICE*)Device->Extension; storDevice = (STORVSC_DEVICE*)Device->Extension;
ASSERT(storDevice); ASSERT(storDevice);
// Busy wait until the ref drop to 2, then set it to 1 /* Busy wait until the ref drop to 2, then set it to 1 */
while (InterlockedCompareExchange(&storDevice->RefCount, 1, 2) != 2) while (InterlockedCompareExchange(&storDevice->RefCount, 1, 2) != 2)
{ {
udelay(100); udelay(100);
@ -230,7 +233,7 @@ static inline STORVSC_DEVICE* ReleaseStorDevice(DEVICE_OBJECT *Device)
return storDevice; return storDevice;
} }
// Drop ref count to 0. No one can use StorDevice object. /* Drop ref count to 0. No one can use StorDevice object. */
static inline STORVSC_DEVICE* FinalReleaseStorDevice(DEVICE_OBJECT *Device) static inline STORVSC_DEVICE* FinalReleaseStorDevice(DEVICE_OBJECT *Device)
{ {
STORVSC_DEVICE *storDevice; STORVSC_DEVICE *storDevice;
@ -238,7 +241,7 @@ static inline STORVSC_DEVICE* FinalReleaseStorDevice(DEVICE_OBJECT *Device)
storDevice = (STORVSC_DEVICE*)Device->Extension; storDevice = (STORVSC_DEVICE*)Device->Extension;
ASSERT(storDevice); ASSERT(storDevice);
// Busy wait until the ref drop to 1, then set it to 0 /* Busy wait until the ref drop to 1, then set it to 0 */
while (InterlockedCompareExchange(&storDevice->RefCount, 0, 1) != 1) while (InterlockedCompareExchange(&storDevice->RefCount, 0, 1) != 1)
{ {
udelay(100); udelay(100);
@ -271,7 +274,7 @@ StorVscInitialize(
DPRINT_DBG(STORVSC, "sizeof(STORVSC_REQUEST)=%d sizeof(STORVSC_REQUEST_EXTENSION)=%d sizeof(VSTOR_PACKET)=%d, sizeof(VMSCSI_REQUEST)=%d", DPRINT_DBG(STORVSC, "sizeof(STORVSC_REQUEST)=%d sizeof(STORVSC_REQUEST_EXTENSION)=%d sizeof(VSTOR_PACKET)=%d, sizeof(VMSCSI_REQUEST)=%d",
sizeof(STORVSC_REQUEST), sizeof(STORVSC_REQUEST_EXTENSION), sizeof(VSTOR_PACKET), sizeof(VMSCSI_REQUEST)); sizeof(STORVSC_REQUEST), sizeof(STORVSC_REQUEST_EXTENSION), sizeof(VSTOR_PACKET), sizeof(VMSCSI_REQUEST));
// Make sure we are at least 2 pages since 1 page is used for control /* Make sure we are at least 2 pages since 1 page is used for control */
ASSERT(storDriver->RingBufferSize >= (PAGE_SIZE << 1)); ASSERT(storDriver->RingBufferSize >= (PAGE_SIZE << 1));
Driver->name = gDriverName; Driver->name = gDriverName;
@ -279,14 +282,18 @@ StorVscInitialize(
storDriver->RequestExtSize = sizeof(STORVSC_REQUEST_EXTENSION); storDriver->RequestExtSize = sizeof(STORVSC_REQUEST_EXTENSION);
// Divide the ring buffer data size (which is 1 page less than the ring buffer size since that page is reserved for the ring buffer indices) /*
// by the max request size (which is VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER + VSTOR_PACKET + u64) * Divide the ring buffer data size (which is 1 page less
* than the ring buffer size since that page is reserved for
* the ring buffer indices) by the max request size (which is
* VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER + VSTOR_PACKET + u64)
*/
storDriver->MaxOutstandingRequestsPerChannel = storDriver->MaxOutstandingRequestsPerChannel =
((storDriver->RingBufferSize - PAGE_SIZE) / ALIGN_UP(MAX_MULTIPAGE_BUFFER_PACKET + sizeof(VSTOR_PACKET) + sizeof(u64),sizeof(u64))); ((storDriver->RingBufferSize - PAGE_SIZE) / ALIGN_UP(MAX_MULTIPAGE_BUFFER_PACKET + sizeof(VSTOR_PACKET) + sizeof(u64),sizeof(u64)));
DPRINT_INFO(STORVSC, "max io %u, currently %u\n", storDriver->MaxOutstandingRequestsPerChannel, STORVSC_MAX_IO_REQUESTS); DPRINT_INFO(STORVSC, "max io %u, currently %u\n", storDriver->MaxOutstandingRequestsPerChannel, STORVSC_MAX_IO_REQUESTS);
// Setup the dispatch table /* Setup the dispatch table */
storDriver->Base.OnDeviceAdd = StorVscOnDeviceAdd; storDriver->Base.OnDeviceAdd = StorVscOnDeviceAdd;
storDriver->Base.OnDeviceRemove = StorVscOnDeviceRemove; storDriver->Base.OnDeviceRemove = StorVscOnDeviceRemove;
storDriver->Base.OnCleanup = StorVscOnCleanup; storDriver->Base.OnCleanup = StorVscOnCleanup;
@ -316,7 +323,7 @@ StorVscOnDeviceAdd(
{ {
int ret=0; int ret=0;
STORVSC_DEVICE *storDevice; STORVSC_DEVICE *storDevice;
//VMSTORAGE_CHANNEL_PROPERTIES *props; /* VMSTORAGE_CHANNEL_PROPERTIES *props; */
STORVSC_DEVICE_INFO *deviceInfo = (STORVSC_DEVICE_INFO*)AdditionalInfo; STORVSC_DEVICE_INFO *deviceInfo = (STORVSC_DEVICE_INFO*)AdditionalInfo;
DPRINT_ENTER(STORVSC); DPRINT_ENTER(STORVSC);
@ -328,21 +335,25 @@ StorVscOnDeviceAdd(
goto Cleanup; goto Cleanup;
} }
// Save the channel properties to our storvsc channel /* Save the channel properties to our storvsc channel */
//props = (VMSTORAGE_CHANNEL_PROPERTIES*) channel->offerMsg.Offer.u.Standard.UserDefined; /* props = (VMSTORAGE_CHANNEL_PROPERTIES*) channel->offerMsg.Offer.u.Standard.UserDefined; */
// FIXME: /* FIXME: */
// If we support more than 1 scsi channel, we need to set the port number here /*
// to the scsi channel but how do we get the scsi channel prior to the bus scan * If we support more than 1 scsi channel, we need to set the
/*storChannel->PortNumber = 0; * port number here to the scsi channel but how do we get the
* scsi channel prior to the bus scan
*/
/* storChannel->PortNumber = 0;
storChannel->PathId = props->PathId; storChannel->PathId = props->PathId;
storChannel->TargetId = props->TargetId;*/ storChannel->TargetId = props->TargetId; */
storDevice->PortNumber = deviceInfo->PortNumber; storDevice->PortNumber = deviceInfo->PortNumber;
// Send it back up /* Send it back up */
ret = StorVscConnectToVsp(Device); ret = StorVscConnectToVsp(Device);
//deviceInfo->PortNumber = storDevice->PortNumber; /* deviceInfo->PortNumber = storDevice->PortNumber; */
deviceInfo->PathId = storDevice->PathId; deviceInfo->PathId = storDevice->PathId;
deviceInfo->TargetId = storDevice->TargetId; deviceInfo->TargetId = storDevice->TargetId;
@ -372,7 +383,7 @@ static int StorVscChannelInit(DEVICE_OBJECT *Device)
request = &storDevice->InitRequest; request = &storDevice->InitRequest;
vstorPacket = &request->VStorPacket; vstorPacket = &request->VStorPacket;
// Now, initiate the vsc/vsp initialization protocol on the open channel /* Now, initiate the vsc/vsp initialization protocol on the open channel */
memset(request, sizeof(STORVSC_REQUEST_EXTENSION), 0); memset(request, sizeof(STORVSC_REQUEST_EXTENSION), 0);
request->WaitEvent = WaitEventCreate(); request->WaitEvent = WaitEventCreate();
@ -408,7 +419,7 @@ static int StorVscChannelInit(DEVICE_OBJECT *Device)
DPRINT_INFO(STORVSC, "QUERY_PROTOCOL_VERSION_OPERATION..."); DPRINT_INFO(STORVSC, "QUERY_PROTOCOL_VERSION_OPERATION...");
// reuse the packet for version range supported /* reuse the packet for version range supported */
memset(vstorPacket, sizeof(VSTOR_PACKET), 0); memset(vstorPacket, sizeof(VSTOR_PACKET), 0);
vstorPacket->Operation = VStorOperationQueryProtocolVersion; vstorPacket->Operation = VStorOperationQueryProtocolVersion;
vstorPacket->Flags = REQUEST_COMPLETION_FLAG; vstorPacket->Flags = REQUEST_COMPLETION_FLAG;
@ -430,14 +441,14 @@ static int StorVscChannelInit(DEVICE_OBJECT *Device)
WaitEventWait(request->WaitEvent); WaitEventWait(request->WaitEvent);
// TODO: Check returned version /* TODO: Check returned version */
if (vstorPacket->Operation != VStorOperationCompleteIo || vstorPacket->Status != 0) if (vstorPacket->Operation != VStorOperationCompleteIo || vstorPacket->Status != 0)
{ {
DPRINT_ERR(STORVSC, "QUERY_PROTOCOL_VERSION_OPERATION failed (op %d status 0x%lx)", vstorPacket->Operation, vstorPacket->Status); DPRINT_ERR(STORVSC, "QUERY_PROTOCOL_VERSION_OPERATION failed (op %d status 0x%lx)", vstorPacket->Operation, vstorPacket->Status);
goto Cleanup; goto Cleanup;
} }
// Query channel properties /* Query channel properties */
DPRINT_INFO(STORVSC, "QUERY_PROPERTIES_OPERATION..."); DPRINT_INFO(STORVSC, "QUERY_PROPERTIES_OPERATION...");
memset(vstorPacket, sizeof(VSTOR_PACKET), 0); memset(vstorPacket, sizeof(VSTOR_PACKET), 0);
@ -460,14 +471,14 @@ static int StorVscChannelInit(DEVICE_OBJECT *Device)
WaitEventWait(request->WaitEvent); WaitEventWait(request->WaitEvent);
// TODO: Check returned version /* TODO: Check returned version */
if (vstorPacket->Operation != VStorOperationCompleteIo || vstorPacket->Status != 0) if (vstorPacket->Operation != VStorOperationCompleteIo || vstorPacket->Status != 0)
{ {
DPRINT_ERR(STORVSC, "QUERY_PROPERTIES_OPERATION failed (op %d status 0x%lx)", vstorPacket->Operation, vstorPacket->Status); DPRINT_ERR(STORVSC, "QUERY_PROPERTIES_OPERATION failed (op %d status 0x%lx)", vstorPacket->Operation, vstorPacket->Status);
goto Cleanup; goto Cleanup;
} }
//storDevice->PortNumber = vstorPacket->StorageChannelProperties.PortNumber; /* storDevice->PortNumber = vstorPacket->StorageChannelProperties.PortNumber; */
storDevice->PathId = vstorPacket->StorageChannelProperties.PathId; storDevice->PathId = vstorPacket->StorageChannelProperties.PathId;
storDevice->TargetId = vstorPacket->StorageChannelProperties.TargetId; storDevice->TargetId = vstorPacket->StorageChannelProperties.TargetId;
@ -528,7 +539,7 @@ StorVscConnectToVsp(
memset(&props, sizeof(VMSTORAGE_CHANNEL_PROPERTIES), 0); memset(&props, sizeof(VMSTORAGE_CHANNEL_PROPERTIES), 0);
// Open the channel /* Open the channel */
ret = Device->Driver->VmbusChannelInterface.Open(Device, ret = Device->Driver->VmbusChannelInterface.Open(Device,
storDriver->RingBufferSize, storDriver->RingBufferSize,
storDriver->RingBufferSize, storDriver->RingBufferSize,
@ -575,8 +586,11 @@ StorVscOnDeviceRemove(
storDevice = ReleaseStorDevice(Device); storDevice = ReleaseStorDevice(Device);
// At this point, all outbound traffic should be disable. We only allow inbound traffic (responses) to proceed /*
// so that outstanding requests can be completed. * At this point, all outbound traffic should be disable. We
* only allow inbound traffic (responses) to proceed so that
* outstanding requests can be completed.
*/
while (storDevice->NumOutstandingRequests) while (storDevice->NumOutstandingRequests)
{ {
DPRINT_INFO(STORVSC, "waiting for %d requests to complete...", storDevice->NumOutstandingRequests); DPRINT_INFO(STORVSC, "waiting for %d requests to complete...", storDevice->NumOutstandingRequests);
@ -590,7 +604,7 @@ StorVscOnDeviceRemove(
DPRINT_INFO(STORVSC, "storage device (%p) safe to remove", storDevice); DPRINT_INFO(STORVSC, "storage device (%p) safe to remove", storDevice);
// Close the channel /* Close the channel */
Device->Driver->VmbusChannelInterface.Close(Device); Device->Driver->VmbusChannelInterface.Close(Device);
FreeStorDevice(storDevice); FreeStorDevice(storDevice);
@ -599,22 +613,23 @@ StorVscOnDeviceRemove(
return ret; return ret;
} }
/* ***************
static void
StorVscOnTargetRescan(
void *Context
)
{
DEVICE_OBJECT *device=(DEVICE_OBJECT*)Context;
STORVSC_DRIVER_OBJECT *storDriver;
//static void DPRINT_ENTER(STORVSC);
//StorVscOnTargetRescan(
// void *Context storDriver = (STORVSC_DRIVER_OBJECT*) device->Driver;
// ) storDriver->OnHostRescan(device);
//{
// DEVICE_OBJECT *device=(DEVICE_OBJECT*)Context; DPRINT_EXIT(STORVSC);
// STORVSC_DRIVER_OBJECT *storDriver; }
// *********** */
// DPRINT_ENTER(STORVSC);
//
// storDriver = (STORVSC_DRIVER_OBJECT*) device->Driver;
// storDriver->OnHostRescan(device);
//
// DPRINT_EXIT(STORVSC);
//}
int int
StorVscOnHostReset( StorVscOnHostReset(
@ -660,13 +675,16 @@ StorVscOnHostReset(
goto Cleanup; goto Cleanup;
} }
// FIXME: Add a timeout /* FIXME: Add a timeout */
WaitEventWait(request->WaitEvent); WaitEventWait(request->WaitEvent);
WaitEventClose(request->WaitEvent); WaitEventClose(request->WaitEvent);
DPRINT_INFO(STORVSC, "host adapter reset completed"); DPRINT_INFO(STORVSC, "host adapter reset completed");
// At this point, all outstanding requests in the adapter should have been flushed out and return to us /*
* At this point, all outstanding requests in the adapter
* should have been flushed out and return to us
*/
Cleanup: Cleanup:
PutStorDevice(Device); PutStorDevice(Device);
@ -729,7 +747,7 @@ StorVscOnIORequest(
vstorPacket->VmSrb.SenseInfoLength = SENSE_BUFFER_SIZE; vstorPacket->VmSrb.SenseInfoLength = SENSE_BUFFER_SIZE;
// Copy over the scsi command descriptor block /* Copy over the scsi command descriptor block */
vstorPacket->VmSrb.CdbLength = Request->CdbLen; vstorPacket->VmSrb.CdbLength = Request->CdbLen;
memcpy(&vstorPacket->VmSrb.Cdb, Request->Cdb, Request->CdbLen); memcpy(&vstorPacket->VmSrb.Cdb, Request->Cdb, Request->CdbLen);
@ -827,7 +845,7 @@ StorVscOnIOCompletion(
ASSERT(request->OnIOCompletion != NULL); ASSERT(request->OnIOCompletion != NULL);
// Copy over the status...etc /* Copy over the status...etc */
request->Status = VStorPacket->VmSrb.ScsiStatus; request->Status = VStorPacket->VmSrb.ScsiStatus;
if (request->Status != 0 || VStorPacket->VmSrb.SrbStatus != 1) if (request->Status != 0 || VStorPacket->VmSrb.SrbStatus != 1)
@ -838,9 +856,9 @@ StorVscOnIOCompletion(
VStorPacket->VmSrb.SrbStatus); VStorPacket->VmSrb.SrbStatus);
} }
if ((request->Status & 0xFF) == 0x02) // CHECK_CONDITION if ((request->Status & 0xFF) == 0x02) /* CHECK_CONDITION */
{ {
if (VStorPacket->VmSrb.SrbStatus & 0x80) // autosense data available if (VStorPacket->VmSrb.SrbStatus & 0x80) /* autosense data available */
{ {
DPRINT_WARN(STORVSC, "storvsc pkt %p autosense data valid - len %d\n", DPRINT_WARN(STORVSC, "storvsc pkt %p autosense data valid - len %d\n",
RequestExt, VStorPacket->VmSrb.SenseInfoLength); RequestExt, VStorPacket->VmSrb.SenseInfoLength);
@ -854,7 +872,7 @@ StorVscOnIOCompletion(
} }
} }
// TODO: /* TODO: */
request->BytesXfer = VStorPacket->VmSrb.DataTransferLength; request->BytesXfer = VStorPacket->VmSrb.DataTransferLength;
request->OnIOCompletion(request); request->OnIOCompletion(request);
@ -882,17 +900,17 @@ StorVscOnReceive(
StorVscOnIOCompletion(Device, VStorPacket, RequestExt); StorVscOnIOCompletion(Device, VStorPacket, RequestExt);
break; break;
//case ENUMERATE_DEVICE_OPERATION: /* case ENUMERATE_DEVICE_OPERATION: */
// DPRINT_INFO(STORVSC, "ENUMERATE_DEVICE_OPERATION"); /* DPRINT_INFO(STORVSC, "ENUMERATE_DEVICE_OPERATION"); */
// StorVscOnTargetRescan(Device); /* StorVscOnTargetRescan(Device); */
// break; /* break; */
case VStorOperationRemoveDevice: case VStorOperationRemoveDevice:
DPRINT_INFO(STORVSC, "REMOVE_DEVICE_OPERATION"); DPRINT_INFO(STORVSC, "REMOVE_DEVICE_OPERATION");
// TODO: /* TODO: */
break; break;
default: default:
@ -937,15 +955,15 @@ StorVscOnChannelCallback(
{ {
DPRINT_DBG(STORVSC, "receive %d bytes - tid %llx", bytesRecvd, requestId); DPRINT_DBG(STORVSC, "receive %d bytes - tid %llx", bytesRecvd, requestId);
//ASSERT(bytesRecvd == sizeof(VSTOR_PACKET)); /* ASSERT(bytesRecvd == sizeof(VSTOR_PACKET)); */
request = (STORVSC_REQUEST_EXTENSION*)(unsigned long)requestId; request = (STORVSC_REQUEST_EXTENSION*)(unsigned long)requestId;
ASSERT(request); ASSERT(request);
//if (vstorPacket.Flags & SYNTHETIC_FLAG) /* if (vstorPacket.Flags & SYNTHETIC_FLAG) */
if ((request == &storDevice->InitRequest) || (request == &storDevice->ResetRequest)) if ((request == &storDevice->InitRequest) || (request == &storDevice->ResetRequest))
{ {
//DPRINT_INFO(STORVSC, "reset completion - operation %u status %u", vstorPacket.Operation, vstorPacket.Status); /* DPRINT_INFO(STORVSC, "reset completion - operation %u status %u", vstorPacket.Operation, vstorPacket.Status); */
memcpy(&request->VStorPacket, packet, sizeof(VSTOR_PACKET)); memcpy(&request->VStorPacket, packet, sizeof(VSTOR_PACKET));
@ -958,7 +976,7 @@ StorVscOnChannelCallback(
} }
else else
{ {
//DPRINT_DBG(STORVSC, "nothing else to read..."); /* DPRINT_DBG(STORVSC, "nothing else to read..."); */
break; break;
} }
} while (1); } while (1);

View file

@ -27,29 +27,31 @@
#include "VersionInfo.h" #include "VersionInfo.h"
#include "VmbusPrivate.h" #include "VmbusPrivate.h"
//
// Globals /* Globals */
//
static const char* gDriverName="vmbus"; static const char* gDriverName="vmbus";
// Windows vmbus does not defined this. We defined this to be consistent with other devices /* Windows vmbus does not defined this.
//{c5295816-f63a-4d5f-8d1a-4daf999ca185} * We defined this to be consistent with other devices
*/
/* {c5295816-f63a-4d5f-8d1a-4daf999ca185} */
static const GUID gVmbusDeviceType={ static const GUID gVmbusDeviceType={
.Data = {0x16, 0x58, 0x29, 0xc5, 0x3a, 0xf6, 0x5f, 0x4d, 0x8d, 0x1a, 0x4d, 0xaf, 0x99, 0x9c, 0xa1, 0x85} .Data = {0x16, 0x58, 0x29, 0xc5, 0x3a, 0xf6, 0x5f, 0x4d, 0x8d, 0x1a, 0x4d, 0xaf, 0x99, 0x9c, 0xa1, 0x85}
}; };
//{ac3760fc-9adf-40aa-9427-a70ed6de95c5} /* {ac3760fc-9adf-40aa-9427-a70ed6de95c5} */
static const GUID gVmbusDeviceId={ static const GUID gVmbusDeviceId={
.Data = {0xfc, 0x60, 0x37, 0xac, 0xdf, 0x9a, 0xaa, 0x40, 0x94, 0x27, 0xa7, 0x0e, 0xd6, 0xde, 0x95, 0xc5} .Data = {0xfc, 0x60, 0x37, 0xac, 0xdf, 0x9a, 0xaa, 0x40, 0x94, 0x27, 0xa7, 0x0e, 0xd6, 0xde, 0x95, 0xc5}
}; };
static DRIVER_OBJECT* gDriver; // vmbus driver object static DRIVER_OBJECT* gDriver; /* vmbus driver object */
static DEVICE_OBJECT* gDevice; // vmbus root device static DEVICE_OBJECT* gDevice; /* vmbus root device */
//
// Internal routines /* Internal routines */
//
static void static void
VmbusGetChannelInterface( VmbusGetChannelInterface(
@ -129,7 +131,7 @@ VmbusInitialize(
drv->name = gDriverName; drv->name = gDriverName;
memcpy(&drv->deviceType, &gVmbusDeviceType, sizeof(GUID)); memcpy(&drv->deviceType, &gVmbusDeviceType, sizeof(GUID));
// Setup dispatch table /* Setup dispatch table */
driver->Base.OnDeviceAdd = VmbusOnDeviceAdd; driver->Base.OnDeviceAdd = VmbusOnDeviceAdd;
driver->Base.OnDeviceRemove = VmbusOnDeviceRemove; driver->Base.OnDeviceRemove = VmbusOnDeviceRemove;
driver->Base.OnCleanup = VmbusOnCleanup; driver->Base.OnCleanup = VmbusOnCleanup;
@ -140,7 +142,7 @@ VmbusInitialize(
driver->GetChannelInterface = VmbusGetChannelInterface; driver->GetChannelInterface = VmbusGetChannelInterface;
driver->GetChannelInfo = VmbusGetChannelInfo; driver->GetChannelInfo = VmbusGetChannelInfo;
// Hypervisor initialization...setup hypercall page..etc /* Hypervisor initialization...setup hypercall page..etc */
ret = HvInit(); ret = HvInit();
if (ret != 0) if (ret != 0)
{ {
@ -283,15 +285,18 @@ Description:
Release the child device from the vmbus Release the child device from the vmbus
--*/ --*/
//void
//VmbusChildDeviceDestroy( /* **************
// DEVICE_OBJECT* ChildDevice void
// ) VmbusChildDeviceDestroy(
//{ DEVICE_OBJECT* ChildDevice
// VMBUS_DRIVER_OBJECT* vmbusDriver = (VMBUS_DRIVER_OBJECT*)gDriver; )
// {
// vmbusDriver->OnChildDeviceDestroy(ChildDevice); VMBUS_DRIVER_OBJECT* vmbusDriver = (VMBUS_DRIVER_OBJECT*)gDriver;
//}
vmbusDriver->OnChildDeviceDestroy(ChildDevice);
}
************* */
/*++ /*++
@ -318,14 +323,14 @@ VmbusOnDeviceAdd(
memcpy(&gDevice->deviceType, &gVmbusDeviceType, sizeof(GUID)); memcpy(&gDevice->deviceType, &gVmbusDeviceType, sizeof(GUID));
memcpy(&gDevice->deviceInstance, &gVmbusDeviceId, sizeof(GUID)); memcpy(&gDevice->deviceInstance, &gVmbusDeviceId, sizeof(GUID));
//strcpy(dev->name, "vmbus"); /* strcpy(dev->name, "vmbus"); */
// SynIC setup... /* SynIC setup... */
ret = HvSynicInit(*irqvector); ret = HvSynicInit(*irqvector);
// Connect to VMBus in the root partition /* Connect to VMBus in the root partition */
ret = VmbusConnect(); ret = VmbusConnect();
//VmbusSendEvent(device->localPortId+1); /* VmbusSendEvent(device->localPortId+1); */
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
return ret; return ret;
@ -375,7 +380,7 @@ VmbusOnCleanup(
DRIVER_OBJECT* drv DRIVER_OBJECT* drv
) )
{ {
//VMBUS_DRIVER_OBJECT* driver = (VMBUS_DRIVER_OBJECT*)drv; /* VMBUS_DRIVER_OBJECT* driver = (VMBUS_DRIVER_OBJECT*)drv; */
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
@ -405,7 +410,7 @@ VmbusOnMsgDPC(
HV_MESSAGE *copied; HV_MESSAGE *copied;
while (1) while (1)
{ {
if (msg->Header.MessageType == HvMessageTypeNone) // no msg if (msg->Header.MessageType == HvMessageTypeNone) /* no msg */
{ {
break; break;
} }
@ -423,14 +428,22 @@ VmbusOnMsgDPC(
msg->Header.MessageType = HvMessageTypeNone; msg->Header.MessageType = HvMessageTypeNone;
// Make sure the write to MessageType (ie set to HvMessageTypeNone) happens /*
// before we read the MessagePending and EOMing. Otherwise, the EOMing will not deliver * Make sure the write to MessageType (ie set to
// any more messages since there is no empty slot * HvMessageTypeNone) happens before we read the
* MessagePending and EOMing. Otherwise, the EOMing
* will not deliver any more messages since there is
* no empty slot
*/
mb(); mb();
if (msg->Header.MessageFlags.MessagePending) if (msg->Header.MessageFlags.MessagePending)
{ {
// This will cause message queue rescan to possibly deliver another msg from the hypervisor /*
* This will cause message queue rescan to
* possibly deliver another msg from the
* hypervisor
*/
WriteMsr(HV_X64_MSR_EOM, 0); WriteMsr(HV_X64_MSR_EOM, 0);
} }
} }
@ -450,7 +463,7 @@ VmbusOnEventDPC(
DRIVER_OBJECT* drv DRIVER_OBJECT* drv
) )
{ {
// TODO: Process any events /* TODO: Process any events */
VmbusOnEvents(); VmbusOnEvents();
} }
@ -469,33 +482,33 @@ VmbusOnISR(
DRIVER_OBJECT* drv DRIVER_OBJECT* drv
) )
{ {
//VMBUS_DRIVER_OBJECT* driver = (VMBUS_DRIVER_OBJECT*)drv; /* VMBUS_DRIVER_OBJECT* driver = (VMBUS_DRIVER_OBJECT*)drv; */
int ret=0; int ret=0;
//struct page* page; /* struct page* page; */
void *page_addr; void *page_addr;
HV_MESSAGE* msg; HV_MESSAGE* msg;
HV_SYNIC_EVENT_FLAGS* event; HV_SYNIC_EVENT_FLAGS* event;
//page = SynICMessagePage[0]; /* page = SynICMessagePage[0]; */
//page_addr = page_address(page); /* page_addr = page_address(page); */
page_addr = gHvContext.synICMessagePage[0]; page_addr = gHvContext.synICMessagePage[0];
msg = (HV_MESSAGE*)page_addr + VMBUS_MESSAGE_SINT; msg = (HV_MESSAGE*)page_addr + VMBUS_MESSAGE_SINT;
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
// Check if there are actual msgs to be process /* Check if there are actual msgs to be process */
if (msg->Header.MessageType != HvMessageTypeNone) if (msg->Header.MessageType != HvMessageTypeNone)
{ {
DPRINT_DBG(VMBUS, "received msg type %d size %d", msg->Header.MessageType, msg->Header.PayloadSize); DPRINT_DBG(VMBUS, "received msg type %d size %d", msg->Header.MessageType, msg->Header.PayloadSize);
ret |= 0x1; ret |= 0x1;
} }
// TODO: Check if there are events to be process /* TODO: Check if there are events to be process */
page_addr = gHvContext.synICEventPage[0]; page_addr = gHvContext.synICEventPage[0];
event = (HV_SYNIC_EVENT_FLAGS*)page_addr + VMBUS_MESSAGE_SINT; event = (HV_SYNIC_EVENT_FLAGS*)page_addr + VMBUS_MESSAGE_SINT;
// Since we are a child, we only need to check bit 0 /* Since we are a child, we only need to check bit 0 */
if (BitTestAndClear(&event->Flags32[0], 0)) if (BitTestAndClear(&event->Flags32[0], 0))
{ {
DPRINT_DBG(VMBUS, "received event %d", event->Flags32[0]); DPRINT_DBG(VMBUS, "received event %d", event->Flags32[0]);
@ -506,4 +519,4 @@ VmbusOnISR(
return ret; return ret;
} }
// eof /* eof */

View file

@ -30,26 +30,29 @@
#include "Channel.h" #include "Channel.h"
#include "ChannelMgmt.h" #include "ChannelMgmt.h"
#include "ChannelInterface.h" #include "ChannelInterface.h"
//#include "ChannelMessages.h" /* #include "ChannelMessages.h" */
#include "RingBuffer.h" #include "RingBuffer.h"
//#include "Packet.h" /* #include "Packet.h" */
#include "include/List.h" #include "include/List.h"
//
// Defines
//
// Maximum channels is determined by the size of the interrupt page which is PAGE_SIZE. 1/2 of PAGE_SIZE is for /* Defines */
// send endpoint interrupt and the other is receive endpoint interrupt
#define MAX_NUM_CHANNELS (PAGE_SIZE >> 1) << 3 // 16348 channels
// The value here must be in multiple of 32
// TODO: Need to make this configurable /*
* Maximum channels is determined by the size of the interrupt page
* which is PAGE_SIZE. 1/2 of PAGE_SIZE is for send endpoint interrupt
* and the other is receive endpoint interrupt
*/
#define MAX_NUM_CHANNELS (PAGE_SIZE >> 1) << 3 /* 16348 channels */
/* The value here must be in multiple of 32 */
/* TODO: Need to make this configurable */
#define MAX_NUM_CHANNELS_SUPPORTED 256 #define MAX_NUM_CHANNELS_SUPPORTED 256
//
// Data types /* Data types */
//
typedef enum { typedef enum {
Disconnected, Disconnected,
@ -66,23 +69,27 @@ typedef struct _VMBUS_CONNECTION {
u32 NextGpadlHandle; u32 NextGpadlHandle;
// Represents channel interrupts. Each bit position /*
// represents a channel. * Represents channel interrupts. Each bit position represents
// When a channel sends an interrupt via VMBUS, it * a channel. When a channel sends an interrupt via VMBUS, it
// finds its bit in the sendInterruptPage, set it and * finds its bit in the sendInterruptPage, set it and calls Hv
// calls Hv to generate a port event. The other end * to generate a port event. The other end receives the port
// receives the port event and parse the recvInterruptPage * event and parse the recvInterruptPage to see which bit is
// to see which bit is set * set
*/
void * InterruptPage; void * InterruptPage;
void * SendInterruptPage; void * SendInterruptPage;
void * RecvInterruptPage; void * RecvInterruptPage;
// 2 pages - 1st page for parent->child notification and 2nd is child->parent notification /*
* 2 pages - 1st page for parent->child notification and 2nd
* is child->parent notification
*/
void * MonitorPages; void * MonitorPages;
LIST_ENTRY ChannelMsgList; LIST_ENTRY ChannelMsgList;
spinlock_t channelmsg_lock; spinlock_t channelmsg_lock;
// List of channels /* List of channels */
LIST_ENTRY ChannelList; LIST_ENTRY ChannelList;
spinlock_t channel_lock; spinlock_t channel_lock;
@ -91,25 +98,25 @@ typedef struct _VMBUS_CONNECTION {
typedef struct _VMBUS_MSGINFO { typedef struct _VMBUS_MSGINFO {
// Bookkeeping stuff /* Bookkeeping stuff */
LIST_ENTRY MsgListEntry; LIST_ENTRY MsgListEntry;
// Synchronize the request/response if needed /* Synchronize the request/response if needed */
HANDLE WaitEvent; HANDLE WaitEvent;
// The message itself /* The message itself */
unsigned char Msg[0]; unsigned char Msg[0];
} VMBUS_MSGINFO; } VMBUS_MSGINFO;
//
// Externs /* Externs */
//
extern VMBUS_CONNECTION gVmbusConnection; extern VMBUS_CONNECTION gVmbusConnection;
//
// General vmbus interface /* General vmbus interface */
//
static DEVICE_OBJECT* static DEVICE_OBJECT*
VmbusChildDeviceCreate( VmbusChildDeviceCreate(
GUID deviceType, GUID deviceType,
@ -124,18 +131,18 @@ static void
VmbusChildDeviceRemove( VmbusChildDeviceRemove(
DEVICE_OBJECT* Device); DEVICE_OBJECT* Device);
//static void /* static void */
//VmbusChildDeviceDestroy( /* VmbusChildDeviceDestroy( */
// DEVICE_OBJECT*); /* DEVICE_OBJECT*); */
static VMBUS_CHANNEL* static VMBUS_CHANNEL*
GetChannelFromRelId( GetChannelFromRelId(
u32 relId u32 relId
); );
//
// Connection interface /* Connection interface */
//
static int static int
VmbusConnect( VmbusConnect(
void void
@ -163,4 +170,4 @@ VmbusOnEvents(
); );
#endif // _VMBUS_PRIVATE_H_ #endif /* _VMBUS_PRIVATE_H_ */

View file

@ -38,38 +38,41 @@
#include "include/StorVscApi.h" #include "include/StorVscApi.h"
//
// #defines /* #defines */
//
#define BLKVSC_MINORS 64 #define BLKVSC_MINORS 64
//
// Data types /* Data types */
//
enum blkvsc_device_type { enum blkvsc_device_type {
UNKNOWN_DEV_TYPE, UNKNOWN_DEV_TYPE,
HARDDISK_TYPE, HARDDISK_TYPE,
DVD_TYPE, DVD_TYPE,
}; };
// This request ties the struct request and struct blkvsc_request/STORVSC_REQUEST together /*
// A struct request may be represented by 1 or more struct blkvsc_request * This request ties the struct request and struct
* blkvsc_request/STORVSC_REQUEST together A struct request may be
* represented by 1 or more struct blkvsc_request
*/
struct blkvsc_request_group { struct blkvsc_request_group {
int outstanding; int outstanding;
int status; int status;
struct list_head blkvsc_req_list; // list of blkvsc_requests struct list_head blkvsc_req_list; /* list of blkvsc_requests */
}; };
struct blkvsc_request { struct blkvsc_request {
struct list_head req_entry; // blkvsc_request_group.blkvsc_req_list struct list_head req_entry; /* blkvsc_request_group.blkvsc_req_list */
struct list_head pend_entry; // block_device_context.pending_list struct list_head pend_entry; /* block_device_context.pending_list */
struct request *req; // This may be null if we generate a request internally struct request *req; /* This may be null if we generate a request internally */
struct block_device_context *dev; struct block_device_context *dev;
struct blkvsc_request_group *group; // The group this request is part of. Maybe null struct blkvsc_request_group *group; /* The group this request is part of. Maybe null */
wait_queue_head_t wevent; wait_queue_head_t wevent;
int cond; int cond;
@ -83,13 +86,13 @@ struct blkvsc_request {
unsigned char cmnd[MAX_COMMAND_SIZE]; unsigned char cmnd[MAX_COMMAND_SIZE];
STORVSC_REQUEST request; STORVSC_REQUEST request;
// !!!DO NOT ADD ANYTHING BELOW HERE!!! Otherwise, memory can overlap, because - /* !!!DO NOT ADD ANYTHING BELOW HERE!!! Otherwise, memory can overlap, because - */
// The extension buffer falls right here and is pointed to by request.Extension; /* The extension buffer falls right here and is pointed to by request.Extension; */
}; };
// Per device structure /* Per device structure */
struct block_device_context { struct block_device_context {
struct device_context *device_ctx; // point back to our device context struct device_context *device_ctx; /* point back to our device context */
struct kmem_cache *request_pool; struct kmem_cache *request_pool;
spinlock_t lock; spinlock_t lock;
struct gendisk *gd; struct gendisk *gd;
@ -109,14 +112,14 @@ struct block_device_context {
int users; int users;
}; };
// Per driver /* Per driver */
struct blkvsc_driver_context { struct blkvsc_driver_context {
// !! These must be the first 2 fields !! /* !! These must be the first 2 fields !! */
struct driver_context drv_ctx; struct driver_context drv_ctx;
STORVSC_DRIVER_OBJECT drv_obj; STORVSC_DRIVER_OBJECT drv_obj;
}; };
// Static decl /* Static decl */
static int blkvsc_probe(struct device *dev); static int blkvsc_probe(struct device *dev);
static int blkvsc_remove(struct device *device); static int blkvsc_remove(struct device *device);
static void blkvsc_shutdown(struct device *device); static void blkvsc_shutdown(struct device *device);
@ -144,7 +147,7 @@ static int blkvsc_do_pending_reqs(struct block_device_context *blkdev);
static int blkvsc_ringbuffer_size = BLKVSC_RING_BUFFER_SIZE; static int blkvsc_ringbuffer_size = BLKVSC_RING_BUFFER_SIZE;
// The one and only one /* The one and only one */
static struct blkvsc_driver_context g_blkvsc_drv; static struct blkvsc_driver_context g_blkvsc_drv;
@ -178,7 +181,7 @@ int blkvsc_drv_init(PFN_DRIVERINITIALIZE pfn_drv_init)
storvsc_drv_obj->RingBufferSize = blkvsc_ringbuffer_size; storvsc_drv_obj->RingBufferSize = blkvsc_ringbuffer_size;
// Callback to client driver to complete the initialization /* Callback to client driver to complete the initialization */
pfn_drv_init(&storvsc_drv_obj->Base); pfn_drv_init(&storvsc_drv_obj->Base);
drv_ctx->driver.name = storvsc_drv_obj->Base.name; drv_ctx->driver.name = storvsc_drv_obj->Base.name;
@ -188,7 +191,7 @@ int blkvsc_drv_init(PFN_DRIVERINITIALIZE pfn_drv_init)
drv_ctx->remove = blkvsc_remove; drv_ctx->remove = blkvsc_remove;
drv_ctx->shutdown = blkvsc_shutdown; drv_ctx->shutdown = blkvsc_shutdown;
// The driver belongs to vmbus /* The driver belongs to vmbus */
vmbus_child_driver_register(drv_ctx); vmbus_child_driver_register(drv_ctx);
DPRINT_EXIT(BLKVSC_DRV); DPRINT_EXIT(BLKVSC_DRV);
@ -201,7 +204,7 @@ static int blkvsc_drv_exit_cb(struct device *dev, void *data)
{ {
struct device **curr = (struct device **)data; struct device **curr = (struct device **)data;
*curr = dev; *curr = dev;
return 1; // stop iterating return 1; /* stop iterating */
} }
/*++ /*++
@ -224,13 +227,13 @@ void blkvsc_drv_exit(void)
{ {
current_dev = NULL; current_dev = NULL;
// Get the device /* Get the device */
driver_for_each_device(&drv_ctx->driver, NULL, (void*)&current_dev, blkvsc_drv_exit_cb); driver_for_each_device(&drv_ctx->driver, NULL, (void*)&current_dev, blkvsc_drv_exit_cb);
if (current_dev == NULL) if (current_dev == NULL)
break; break;
// Initiate removal from the top-down /* Initiate removal from the top-down */
device_unregister(current_dev); device_unregister(current_dev);
} }
@ -291,14 +294,14 @@ static int blkvsc_probe(struct device *device)
INIT_LIST_HEAD(&blkdev->pending_list); INIT_LIST_HEAD(&blkdev->pending_list);
// Initialize what we can here /* Initialize what we can here */
spin_lock_init(&blkdev->lock); spin_lock_init(&blkdev->lock);
ASSERT(sizeof(struct blkvsc_request_group) <= sizeof(struct blkvsc_request)); ASSERT(sizeof(struct blkvsc_request_group) <= sizeof(struct blkvsc_request));
blkdev->request_pool = kmem_cache_create(dev_name(&device_ctx->device), blkdev->request_pool = kmem_cache_create(dev_name(&device_ctx->device),
sizeof(struct blkvsc_request) + storvsc_drv_obj->RequestExtSize, 0, sizeof(struct blkvsc_request) + storvsc_drv_obj->RequestExtSize, 0,
SLAB_HWCACHE_ALIGN, NULL); SLAB_HWCACHE_ALIGN, NULL);
if (!blkdev->request_pool) if (!blkdev->request_pool)
{ {
ret = -ENOMEM; ret = -ENOMEM;
@ -306,7 +309,7 @@ static int blkvsc_probe(struct device *device)
} }
// Call to the vsc driver to add the device /* Call to the vsc driver to add the device */
ret = storvsc_drv_obj->Base.OnDeviceAdd(device_obj, &device_info); ret = storvsc_drv_obj->Base.OnDeviceAdd(device_obj, &device_info);
if (ret != 0) if (ret != 0)
{ {
@ -315,16 +318,16 @@ static int blkvsc_probe(struct device *device)
} }
blkdev->device_ctx = device_ctx; blkdev->device_ctx = device_ctx;
blkdev->target = device_info.TargetId; // this identified the device 0 or 1 blkdev->target = device_info.TargetId; /* this identified the device 0 or 1 */
blkdev->path = device_info.PathId; // this identified the ide ctrl 0 or 1 blkdev->path = device_info.PathId; /* this identified the ide ctrl 0 or 1 */
dev_set_drvdata(device, blkdev); dev_set_drvdata(device, blkdev);
// Calculate the major and device num /* Calculate the major and device num */
if (blkdev->path == 0) if (blkdev->path == 0)
{ {
major = IDE0_MAJOR; major = IDE0_MAJOR;
devnum = blkdev->path + blkdev->target; // 0 or 1 devnum = blkdev->path + blkdev->target; /* 0 or 1 */
if (!ide0_registered) if (!ide0_registered)
{ {
@ -341,7 +344,7 @@ static int blkvsc_probe(struct device *device)
else if (blkdev->path == 1) else if (blkdev->path == 1)
{ {
major = IDE1_MAJOR; major = IDE1_MAJOR;
devnum = blkdev->path + blkdev->target + 1; // 2 or 3 devnum = blkdev->path + blkdev->target + 1; /* 2 or 3 */
if (!ide1_registered) if (!ide1_registered)
{ {
@ -405,7 +408,7 @@ static int blkvsc_probe(struct device *device)
set_capacity(blkdev->gd, blkdev->capacity * (blkdev->sector_size/512)); set_capacity(blkdev->gd, blkdev->capacity * (blkdev->sector_size/512));
blk_queue_logical_block_size(blkdev->gd->queue, blkdev->sector_size); blk_queue_logical_block_size(blkdev->gd->queue, blkdev->sector_size);
// go! /* go! */
add_disk(blkdev->gd); add_disk(blkdev->gd);
DPRINT_INFO(BLKVSC_DRV, "%s added!! capacity %llu sector_size %d", blkdev->gd->disk_name, blkdev->capacity, blkdev->sector_size); DPRINT_INFO(BLKVSC_DRV, "%s added!! capacity %llu sector_size %d", blkdev->gd->disk_name, blkdev->capacity, blkdev->sector_size);
@ -494,7 +497,7 @@ static int blkvsc_do_flush(struct block_device_context *blkdev)
blkvsc_req->cmnd[0] = SYNCHRONIZE_CACHE; blkvsc_req->cmnd[0] = SYNCHRONIZE_CACHE;
blkvsc_req->cmd_len = 10; blkvsc_req->cmd_len = 10;
// Set this here since the completion routine may be invoked and completed before we return /* Set this here since the completion routine may be invoked and completed before we return */
blkvsc_req->cond =0; blkvsc_req->cond =0;
blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion); blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion);
@ -505,7 +508,7 @@ static int blkvsc_do_flush(struct block_device_context *blkdev)
return 0; return 0;
} }
// Do a scsi INQUIRY cmd here to get the device type (ie disk or dvd) /* Do a scsi INQUIRY cmd here to get the device type (ie disk or dvd) */
static int blkvsc_do_inquiry(struct block_device_context *blkdev) static int blkvsc_do_inquiry(struct block_device_context *blkdev)
{ {
struct blkvsc_request *blkvsc_req=NULL; struct blkvsc_request *blkvsc_req=NULL;
@ -539,12 +542,12 @@ static int blkvsc_do_inquiry(struct block_device_context *blkdev)
blkvsc_req->request.DataBuffer.Length = 64; blkvsc_req->request.DataBuffer.Length = 64;
blkvsc_req->cmnd[0] = INQUIRY; blkvsc_req->cmnd[0] = INQUIRY;
blkvsc_req->cmnd[1] = 0x1; // Get product data blkvsc_req->cmnd[1] = 0x1; /* Get product data */
blkvsc_req->cmnd[2] = 0x83; // mode page 83 blkvsc_req->cmnd[2] = 0x83; /* mode page 83 */
blkvsc_req->cmnd[4] = 64; blkvsc_req->cmnd[4] = 64;
blkvsc_req->cmd_len = 6; blkvsc_req->cmd_len = 6;
// Set this here since the completion routine may be invoked and completed before we return /* Set this here since the completion routine may be invoked and completed before we return */
blkvsc_req->cond =0; blkvsc_req->cond =0;
blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion); blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion);
@ -556,7 +559,7 @@ static int blkvsc_do_inquiry(struct block_device_context *blkdev)
buf = kmap(page_buf); buf = kmap(page_buf);
/* print_hex_dump_bytes("", DUMP_PREFIX_NONE, buf, 64); */ /* print_hex_dump_bytes("", DUMP_PREFIX_NONE, buf, 64); */
// be to le /* be to le */
device_type = buf[0] & 0x1F; device_type = buf[0] & 0x1F;
if (device_type == 0x0) if (device_type == 0x0)
@ -569,7 +572,7 @@ static int blkvsc_do_inquiry(struct block_device_context *blkdev)
} }
else else
{ {
// TODO: this is currently unsupported device type /* TODO: this is currently unsupported device type */
blkdev->device_type = UNKNOWN_DEV_TYPE; blkdev->device_type = UNKNOWN_DEV_TYPE;
} }
@ -581,7 +584,7 @@ static int blkvsc_do_inquiry(struct block_device_context *blkdev)
memcpy(blkdev->device_id, &buf[8], blkdev->device_id_len); memcpy(blkdev->device_id, &buf[8], blkdev->device_id_len);
/* printk_hex_dump_bytes("", DUMP_PREFIX_NONE, blkdev->device_id, /* printk_hex_dump_bytes("", DUMP_PREFIX_NONE, blkdev->device_id,
* blkdev->device_id_len); */ * blkdev->device_id_len); */
kunmap(page_buf); kunmap(page_buf);
@ -592,7 +595,7 @@ static int blkvsc_do_inquiry(struct block_device_context *blkdev)
return 0; return 0;
} }
// Do a scsi READ_CAPACITY cmd here to get the size of the disk /* Do a scsi READ_CAPACITY cmd here to get the size of the disk */
static int blkvsc_do_read_capacity(struct block_device_context *blkdev) static int blkvsc_do_read_capacity(struct block_device_context *blkdev)
{ {
struct blkvsc_request *blkvsc_req=NULL; struct blkvsc_request *blkvsc_req=NULL;
@ -604,7 +607,7 @@ static int blkvsc_do_read_capacity(struct block_device_context *blkdev)
blkdev->sector_size = 0; blkdev->sector_size = 0;
blkdev->capacity = 0; blkdev->capacity = 0;
blkdev->media_not_present = 0; // assume a disk is present blkdev->media_not_present = 0; /* assume a disk is present */
blkvsc_req = kmem_cache_alloc(blkdev->request_pool, GFP_KERNEL); blkvsc_req = kmem_cache_alloc(blkdev->request_pool, GFP_KERNEL);
if (!blkvsc_req) if (!blkvsc_req)
@ -632,7 +635,10 @@ static int blkvsc_do_read_capacity(struct block_device_context *blkdev)
blkvsc_req->cmnd[0] = READ_CAPACITY; blkvsc_req->cmnd[0] = READ_CAPACITY;
blkvsc_req->cmd_len = 16; blkvsc_req->cmd_len = 16;
// Set this here since the completion routine may be invoked and completed before we return /*
* Set this here since the completion routine may be invoked
* and completed before we return
*/
blkvsc_req->cond =0; blkvsc_req->cond =0;
blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion); blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion);
@ -641,12 +647,12 @@ static int blkvsc_do_read_capacity(struct block_device_context *blkdev)
wait_event_interruptible(blkvsc_req->wevent, blkvsc_req->cond); wait_event_interruptible(blkvsc_req->wevent, blkvsc_req->cond);
// check error /* check error */
if (blkvsc_req->request.Status) if (blkvsc_req->request.Status)
{ {
scsi_normalize_sense(blkvsc_req->sense_buffer, SCSI_SENSE_BUFFERSIZE, &sense_hdr); scsi_normalize_sense(blkvsc_req->sense_buffer, SCSI_SENSE_BUFFERSIZE, &sense_hdr);
if (sense_hdr.asc == 0x3A) // Medium not present if (sense_hdr.asc == 0x3A) /* Medium not present */
{ {
blkdev->media_not_present = 1; blkdev->media_not_present = 1;
} }
@ -655,7 +661,7 @@ static int blkvsc_do_read_capacity(struct block_device_context *blkdev)
} }
buf = kmap(page_buf); buf = kmap(page_buf);
// be to le /* be to le */
blkdev->capacity = ((buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]) + 1; blkdev->capacity = ((buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]) + 1;
blkdev->sector_size = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7]; blkdev->sector_size = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7];
@ -680,7 +686,7 @@ static int blkvsc_do_read_capacity16(struct block_device_context *blkdev)
blkdev->sector_size = 0; blkdev->sector_size = 0;
blkdev->capacity = 0; blkdev->capacity = 0;
blkdev->media_not_present = 0; // assume a disk is present blkdev->media_not_present = 0; /* assume a disk is present */
blkvsc_req = kmem_cache_alloc(blkdev->request_pool, GFP_KERNEL); blkvsc_req = kmem_cache_alloc(blkdev->request_pool, GFP_KERNEL);
if (!blkvsc_req) if (!blkvsc_req)
@ -705,10 +711,13 @@ static int blkvsc_do_read_capacity16(struct block_device_context *blkdev)
blkvsc_req->request.DataBuffer.Offset = 0; blkvsc_req->request.DataBuffer.Offset = 0;
blkvsc_req->request.DataBuffer.Length = 12; blkvsc_req->request.DataBuffer.Length = 12;
blkvsc_req->cmnd[0] = 0x9E; //READ_CAPACITY16; blkvsc_req->cmnd[0] = 0x9E; /* READ_CAPACITY16; */
blkvsc_req->cmd_len = 16; blkvsc_req->cmd_len = 16;
// Set this here since the completion routine may be invoked and completed before we return /*
* Set this here since the completion routine may be invoked
* and completed before we return
*/
blkvsc_req->cond =0; blkvsc_req->cond =0;
blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion); blkvsc_submit_request(blkvsc_req, blkvsc_cmd_completion);
@ -717,12 +726,12 @@ static int blkvsc_do_read_capacity16(struct block_device_context *blkdev)
wait_event_interruptible(blkvsc_req->wevent, blkvsc_req->cond); wait_event_interruptible(blkvsc_req->wevent, blkvsc_req->cond);
// check error /* check error */
if (blkvsc_req->request.Status) if (blkvsc_req->request.Status)
{ {
scsi_normalize_sense(blkvsc_req->sense_buffer, SCSI_SENSE_BUFFERSIZE, &sense_hdr); scsi_normalize_sense(blkvsc_req->sense_buffer, SCSI_SENSE_BUFFERSIZE, &sense_hdr);
if (sense_hdr.asc == 0x3A) // Medium not present if (sense_hdr.asc == 0x3A) /* Medium not present */
{ {
blkdev->media_not_present = 1; blkdev->media_not_present = 1;
} }
@ -731,12 +740,12 @@ static int blkvsc_do_read_capacity16(struct block_device_context *blkdev)
} }
buf = kmap(page_buf); buf = kmap(page_buf);
// be to le /* be to le */
blkdev->capacity = be64_to_cpu(*(unsigned long long*) &buf[0]) + 1; blkdev->capacity = be64_to_cpu(*(unsigned long long*) &buf[0]) + 1;
blkdev->sector_size = be32_to_cpu(*(unsigned int*)&buf[8]); blkdev->sector_size = be32_to_cpu(*(unsigned int*)&buf[8]);
//blkdev->capacity = ((buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]) + 1; /* blkdev->capacity = ((buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]) + 1; */
//blkdev->sector_size = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7]; /* blkdev->sector_size = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7]; */
kunmap(page_buf); kunmap(page_buf);
@ -777,15 +786,15 @@ static int blkvsc_remove(struct device *device)
return -1; return -1;
} }
// Call to the vsc driver to let it know that the device is being removed /* Call to the vsc driver to let it know that the device is being removed */
ret = storvsc_drv_obj->Base.OnDeviceRemove(device_obj); ret = storvsc_drv_obj->Base.OnDeviceRemove(device_obj);
if (ret != 0) if (ret != 0)
{ {
// TODO: /* TODO: */
DPRINT_ERR(BLKVSC_DRV, "unable to remove blkvsc device (ret %d)", ret); DPRINT_ERR(BLKVSC_DRV, "unable to remove blkvsc device (ret %d)", ret);
} }
// Get to a known state /* Get to a known state */
spin_lock_irqsave(&blkdev->lock, flags); spin_lock_irqsave(&blkdev->lock, flags);
blkdev->shutting_down = 1; blkdev->shutting_down = 1;
@ -922,7 +931,7 @@ static int blkvsc_submit_request(struct blkvsc_request *blkvsc_req, void (*reque
storvsc_req->Host = blkdev->port; storvsc_req->Host = blkdev->port;
storvsc_req->Bus = blkdev->path; storvsc_req->Bus = blkdev->path;
storvsc_req->TargetId = blkdev->target; storvsc_req->TargetId = blkdev->target;
storvsc_req->LunId = 0; // this is not really used at all storvsc_req->LunId = 0; /* this is not really used at all */
storvsc_req->CdbLen = blkvsc_req->cmd_len; storvsc_req->CdbLen = blkvsc_req->cmd_len;
storvsc_req->Cdb = blkvsc_req->cmnd; storvsc_req->Cdb = blkvsc_req->cmnd;
@ -939,11 +948,13 @@ static int blkvsc_submit_request(struct blkvsc_request *blkvsc_req, void (*reque
return ret; return ret;
} }
//
// We break the request into 1 or more blkvsc_requests and submit them. /*
// If we cant submit them all, we put them on the pending_list. The * We break the request into 1 or more blkvsc_requests and submit
// blkvsc_request() will work on the pending_list. * them. If we cant submit them all, we put them on the
// * pending_list. The blkvsc_request() will work on the pending_list.
*/
static int blkvsc_do_request(struct block_device_context *blkdev, struct request *req) static int blkvsc_do_request(struct block_device_context *blkdev, struct request *req)
{ {
struct bio *bio=NULL; struct bio *bio=NULL;
@ -963,7 +974,7 @@ static int blkvsc_do_request(struct block_device_context *blkdev, struct request
DPRINT_DBG(BLKVSC_DRV, "blkdev %p req %p sect %llu \n", blkdev, req, blk_rq_pos(req)); DPRINT_DBG(BLKVSC_DRV, "blkdev %p req %p sect %llu \n", blkdev, req, blk_rq_pos(req));
// Create a group to tie req to list of blkvsc_reqs /* Create a group to tie req to list of blkvsc_reqs */
group = (struct blkvsc_request_group*)kmem_cache_alloc(blkdev->request_pool, GFP_ATOMIC); group = (struct blkvsc_request_group*)kmem_cache_alloc(blkdev->request_pool, GFP_ATOMIC);
if (!group) if (!group)
{ {
@ -975,23 +986,23 @@ static int blkvsc_do_request(struct block_device_context *blkdev, struct request
start_sector = blk_rq_pos(req); start_sector = blk_rq_pos(req);
// foreach bio in the request /* foreach bio in the request */
if (req->bio) if (req->bio)
for (bio = req->bio; bio; bio = bio->bi_next) for (bio = req->bio; bio; bio = bio->bi_next)
{ {
// Map this bio into an existing or new storvsc request /* Map this bio into an existing or new storvsc request */
bio_for_each_segment (bvec, bio, seg_idx) bio_for_each_segment (bvec, bio, seg_idx)
{ {
DPRINT_DBG(BLKVSC_DRV, "bio_for_each_segment() - req %p bio %p bvec %p seg_idx %d databuf_idx %d\n", DPRINT_DBG(BLKVSC_DRV, "bio_for_each_segment() - req %p bio %p bvec %p seg_idx %d databuf_idx %d\n",
req, bio, bvec, seg_idx, databuf_idx); req, bio, bvec, seg_idx, databuf_idx);
// Get a new storvsc request /* Get a new storvsc request */
if ( (!blkvsc_req) || // 1st-time if ( (!blkvsc_req) || /* 1st-time */
(databuf_idx >= MAX_MULTIPAGE_BUFFER_COUNT) || (databuf_idx >= MAX_MULTIPAGE_BUFFER_COUNT) ||
(bvec->bv_offset != 0) || // hole at the begin of page (bvec->bv_offset != 0) || /* hole at the begin of page */
(prev_bvec && (prev_bvec->bv_len != PAGE_SIZE)) ) // hold at the end of page (prev_bvec && (prev_bvec->bv_len != PAGE_SIZE)) ) /* hold at the end of page */
{ {
// submit the prev one /* submit the prev one */
if (blkvsc_req) if (blkvsc_req)
{ {
blkvsc_req->sector_start = start_sector; blkvsc_req->sector_start = start_sector;
@ -1002,11 +1013,11 @@ static int blkvsc_do_request(struct block_device_context *blkdev, struct request
blkvsc_init_rw(blkvsc_req); blkvsc_init_rw(blkvsc_req);
} }
// Create new blkvsc_req to represent the current bvec /* Create new blkvsc_req to represent the current bvec */
blkvsc_req = kmem_cache_alloc(blkdev->request_pool, GFP_ATOMIC); blkvsc_req = kmem_cache_alloc(blkdev->request_pool, GFP_ATOMIC);
if (!blkvsc_req) if (!blkvsc_req)
{ {
// free up everything /* free up everything */
list_for_each_entry_safe(blkvsc_req, tmp, &group->blkvsc_req_list, req_entry) list_for_each_entry_safe(blkvsc_req, tmp, &group->blkvsc_req_list, req_entry)
{ {
list_del(&blkvsc_req->req_entry); list_del(&blkvsc_req->req_entry);
@ -1024,7 +1035,7 @@ static int blkvsc_do_request(struct block_device_context *blkdev, struct request
blkvsc_req->request.DataBuffer.Offset = bvec->bv_offset; blkvsc_req->request.DataBuffer.Offset = bvec->bv_offset;
blkvsc_req->request.DataBuffer.Length = 0; blkvsc_req->request.DataBuffer.Length = 0;
// Add to the group /* Add to the group */
blkvsc_req->group = group; blkvsc_req->group = group;
blkvsc_req->group->outstanding++; blkvsc_req->group->outstanding++;
list_add_tail(&blkvsc_req->req_entry, &blkvsc_req->group->blkvsc_req_list); list_add_tail(&blkvsc_req->req_entry, &blkvsc_req->group->blkvsc_req_list);
@ -1034,7 +1045,7 @@ static int blkvsc_do_request(struct block_device_context *blkdev, struct request
databuf_idx = 0; databuf_idx = 0;
} }
// Add the curr bvec/segment to the curr blkvsc_req /* Add the curr bvec/segment to the curr blkvsc_req */
blkvsc_req->request.DataBuffer.PfnArray[databuf_idx] = page_to_pfn(bvec->bv_page); blkvsc_req->request.DataBuffer.PfnArray[databuf_idx] = page_to_pfn(bvec->bv_page);
blkvsc_req->request.DataBuffer.Length += bvec->bv_len; blkvsc_req->request.DataBuffer.Length += bvec->bv_len;
@ -1043,11 +1054,11 @@ static int blkvsc_do_request(struct block_device_context *blkdev, struct request
databuf_idx++; databuf_idx++;
num_sectors += bvec->bv_len >> 9; num_sectors += bvec->bv_len >> 9;
} // bio_for_each_segment } /* bio_for_each_segment */
} // rq_for_each_bio } /* rq_for_each_bio */
// Handle the last one /* Handle the last one */
if (blkvsc_req) if (blkvsc_req)
{ {
DPRINT_DBG(BLKVSC_DRV, "blkdev %p req %p group %p count %d\n", blkdev, req, blkvsc_req->group, blkvsc_req->group->outstanding); DPRINT_DBG(BLKVSC_DRV, "blkdev %p req %p group %p count %d\n", blkdev, req, blkvsc_req->group, blkvsc_req->group->outstanding);
@ -1134,8 +1145,11 @@ static void blkvsc_request_completion(STORVSC_REQUEST* request)
blkdev->num_outstanding_reqs--; blkdev->num_outstanding_reqs--;
blkvsc_req->group->outstanding--; blkvsc_req->group->outstanding--;
// Only start processing when all the blkvsc_reqs are completed. This guarantees no out-of-order /*
// blkvsc_req completion when calling end_that_request_first() * Only start processing when all the blkvsc_reqs are
* completed. This guarantees no out-of-order blkvsc_req
* completion when calling end_that_request_first()
*/
if (blkvsc_req->group->outstanding == 0) if (blkvsc_req->group->outstanding == 0)
{ {
list_for_each_entry_safe(comp_req, tmp, &blkvsc_req->group->blkvsc_req_list, req_entry) list_for_each_entry_safe(comp_req, tmp, &blkvsc_req->group->blkvsc_req_list, req_entry)
@ -1152,7 +1166,7 @@ static void blkvsc_request_completion(STORVSC_REQUEST* request)
(!comp_req->request.Status ? 0: -EIO), (!comp_req->request.Status ? 0: -EIO),
comp_req->sector_count * blkdev->sector_size)) comp_req->sector_count * blkdev->sector_size))
{ {
//All the sectors have been xferred ie the request is done /* All the sectors have been xferred ie the request is done */
DPRINT_DBG(BLKVSC_DRV, "req %p COMPLETED\n", comp_req->req); DPRINT_DBG(BLKVSC_DRV, "req %p COMPLETED\n", comp_req->req);
kmem_cache_free(blkdev->request_pool, comp_req->group); kmem_cache_free(blkdev->request_pool, comp_req->group);
} }
@ -1180,11 +1194,14 @@ static int blkvsc_cancel_pending_reqs(struct block_device_context *blkdev)
DPRINT_DBG(BLKVSC_DRV, "blkvsc_cancel_pending_reqs()"); DPRINT_DBG(BLKVSC_DRV, "blkvsc_cancel_pending_reqs()");
// Flush the pending list first /* Flush the pending list first */
list_for_each_entry_safe(pend_req, tmp, &blkdev->pending_list, pend_entry) list_for_each_entry_safe(pend_req, tmp, &blkdev->pending_list, pend_entry)
{ {
// The pend_req could be part of a partially completed request. If so, complete those req first /*
// until we hit the pend_req * The pend_req could be part of a partially completed
* request. If so, complete those req first until we
* hit the pend_req
*/
list_for_each_entry_safe(comp_req, tmp2, &pend_req->group->blkvsc_req_list, req_entry) list_for_each_entry_safe(comp_req, tmp2, &pend_req->group->blkvsc_req_list, req_entry)
{ {
DPRINT_DBG(BLKVSC_DRV, "completing blkvsc_req %p sect_start %llu sect_count %ld \n", DPRINT_DBG(BLKVSC_DRV, "completing blkvsc_req %p sect_start %llu sect_count %ld \n",
@ -1222,7 +1239,7 @@ static int blkvsc_cancel_pending_reqs(struct block_device_context *blkdev)
-EIO, -EIO,
pend_req->sector_count * blkdev->sector_size)) pend_req->sector_count * blkdev->sector_size))
{ {
//All the sectors have been xferred ie the request is done /* All the sectors have been xferred ie the request is done */
DPRINT_DBG(BLKVSC_DRV, "blkvsc_cancel_pending_reqs() - req %p COMPLETED\n", pend_req->req); DPRINT_DBG(BLKVSC_DRV, "blkvsc_cancel_pending_reqs() - req %p COMPLETED\n", pend_req->req);
kmem_cache_free(blkdev->request_pool, pend_req->group); kmem_cache_free(blkdev->request_pool, pend_req->group);
} }
@ -1239,7 +1256,7 @@ static int blkvsc_do_pending_reqs(struct block_device_context *blkdev)
struct blkvsc_request *pend_req, *tmp; struct blkvsc_request *pend_req, *tmp;
int ret=0; int ret=0;
// Flush the pending list first /* Flush the pending list first */
list_for_each_entry_safe(pend_req, tmp, &blkdev->pending_list, pend_entry) list_for_each_entry_safe(pend_req, tmp, &blkdev->pending_list, pend_entry)
{ {
DPRINT_DBG(BLKVSC_DRV, "working off pending_list - %p\n", pend_req); DPRINT_DBG(BLKVSC_DRV, "working off pending_list - %p\n", pend_req);
@ -1378,51 +1395,51 @@ int blkvsc_getgeo(struct block_device *bd, struct hd_geometry *hg)
int rem=0; int rem=0;
if (total_sectors > (65535 * 16 * 255)) { if (total_sectors > (65535 * 16 * 255)) {
total_sectors = (65535 * 16 * 255); total_sectors = (65535 * 16 * 255);
} }
if (total_sectors >= (65535 * 16 * 63)) { if (total_sectors >= (65535 * 16 * 63)) {
sectors_per_track = 255; sectors_per_track = 255;
heads = 16; heads = 16;
cylinder_times_heads = total_sectors; cylinder_times_heads = total_sectors;
rem = sector_div(cylinder_times_heads, sectors_per_track); // sector_div stores the quotient in cylinder_times_heads rem = sector_div(cylinder_times_heads, sectors_per_track); /* sector_div stores the quotient in cylinder_times_heads */
} }
else else
{ {
sectors_per_track = 17; sectors_per_track = 17;
cylinder_times_heads = total_sectors; cylinder_times_heads = total_sectors;
rem = sector_div(cylinder_times_heads, sectors_per_track); // sector_div stores the quotient in cylinder_times_heads rem = sector_div(cylinder_times_heads, sectors_per_track); /* sector_div stores the quotient in cylinder_times_heads */
temp = cylinder_times_heads + 1023; temp = cylinder_times_heads + 1023;
rem = sector_div(temp, 1024); // sector_div stores the quotient in temp rem = sector_div(temp, 1024); /* sector_div stores the quotient in temp */
heads = temp; heads = temp;
if (heads < 4) { if (heads < 4) {
heads = 4; heads = 4;
} }
if (cylinder_times_heads >= (heads * 1024) || (heads > 16)) { if (cylinder_times_heads >= (heads * 1024) || (heads > 16)) {
sectors_per_track = 31; sectors_per_track = 31;
heads = 16; heads = 16;
cylinder_times_heads = total_sectors; cylinder_times_heads = total_sectors;
rem = sector_div(cylinder_times_heads, sectors_per_track); // sector_div stores the quotient in cylinder_times_heads rem = sector_div(cylinder_times_heads, sectors_per_track); /* sector_div stores the quotient in cylinder_times_heads */
} }
if (cylinder_times_heads >= (heads * 1024)) { if (cylinder_times_heads >= (heads * 1024)) {
sectors_per_track = 63; sectors_per_track = 63;
heads = 16; heads = 16;
cylinder_times_heads = total_sectors; cylinder_times_heads = total_sectors;
rem = sector_div(cylinder_times_heads, sectors_per_track); // sector_div stores the quotient in cylinder_times_heads rem = sector_div(cylinder_times_heads, sectors_per_track); /* sector_div stores the quotient in cylinder_times_heads */
} }
} }
temp = cylinder_times_heads; temp = cylinder_times_heads;
rem = sector_div(temp, heads); // sector_div stores the quotient in temp rem = sector_div(temp, heads); /* sector_div stores the quotient in temp */
cylinders = temp; cylinders = temp;
hg->heads = heads; hg->heads = heads;
@ -1442,8 +1459,8 @@ static int blkvsc_ioctl(struct inode *inode, struct file *filep, unsigned cmd, u
switch (cmd) switch (cmd)
{ {
// TODO: I think there is certain format for HDIO_GET_IDENTITY rather than just /* TODO: I think there is certain format for HDIO_GET_IDENTITY rather than just */
// a GUID. Commented it out for now. /* a GUID. Commented it out for now. */
/*case HDIO_GET_IDENTITY: /*case HDIO_GET_IDENTITY:
DPRINT_INFO(BLKVSC_DRV, "HDIO_GET_IDENTITY\n"); DPRINT_INFO(BLKVSC_DRV, "HDIO_GET_IDENTITY\n");
@ -1468,7 +1485,7 @@ static int __init blkvsc_init(void)
{ {
int ret; int ret;
ASSERT(sizeof(sector_t) == 8); // Make sure CONFIG_LBD is set ASSERT(sizeof(sector_t) == 8); /* Make sure CONFIG_LBD is set */
DPRINT_ENTER(BLKVSC_DRV); DPRINT_ENTER(BLKVSC_DRV);
@ -1495,4 +1512,4 @@ module_param(blkvsc_ringbuffer_size, int, S_IRUGO);
module_init(blkvsc_init); module_init(blkvsc_init);
module_exit(blkvsc_exit); module_exit(blkvsc_exit);
// eof /* eof */

View file

@ -31,9 +31,9 @@ typedef u32 NTSTATUS;
#pragma pack(push,1) #pragma pack(push,1)
//
// Version 1 messages /* Version 1 messages */
//
typedef enum _VMBUS_CHANNEL_MESSAGE_TYPE typedef enum _VMBUS_CHANNEL_MESSAGE_TYPE
{ {
@ -61,9 +61,9 @@ typedef enum _VMBUS_CHANNEL_MESSAGE_TYPE
ChannelMessageCount ChannelMessageCount
} VMBUS_CHANNEL_MESSAGE_TYPE, *PVMBUS_CHANNEL_MESSAGE_TYPE; } VMBUS_CHANNEL_MESSAGE_TYPE, *PVMBUS_CHANNEL_MESSAGE_TYPE;
// begin_wpp config /* begin_wpp config */
// CUSTOM_TYPE(ChannelMessageType, ItemEnum(_VMBUS_CHANNEL_MESSAGE_TYPE)); /* CUSTOM_TYPE(ChannelMessageType, ItemEnum(_VMBUS_CHANNEL_MESSAGE_TYPE)); */
// end_wpp /* end_wpp */
typedef struct _VMBUS_CHANNEL_MESSAGE_HEADER typedef struct _VMBUS_CHANNEL_MESSAGE_HEADER
{ {
@ -71,21 +71,21 @@ typedef struct _VMBUS_CHANNEL_MESSAGE_HEADER
u32 Padding; u32 Padding;
} VMBUS_CHANNEL_MESSAGE_HEADER, *PVMBUS_CHANNEL_MESSAGE_HEADER; } VMBUS_CHANNEL_MESSAGE_HEADER, *PVMBUS_CHANNEL_MESSAGE_HEADER;
// Query VMBus Version parameters /* Query VMBus Version parameters */
typedef struct _VMBUS_CHANNEL_QUERY_VMBUS_VERSION typedef struct _VMBUS_CHANNEL_QUERY_VMBUS_VERSION
{ {
VMBUS_CHANNEL_MESSAGE_HEADER Header; VMBUS_CHANNEL_MESSAGE_HEADER Header;
u32 Version; u32 Version;
} VMBUS_CHANNEL_QUERY_VMBUS_VERSION, *PVMBUS_CHANNEL_QUERY_VMBUS_VERSION; } VMBUS_CHANNEL_QUERY_VMBUS_VERSION, *PVMBUS_CHANNEL_QUERY_VMBUS_VERSION;
// VMBus Version Supported parameters /* VMBus Version Supported parameters */
typedef struct _VMBUS_CHANNEL_VERSION_SUPPORTED typedef struct _VMBUS_CHANNEL_VERSION_SUPPORTED
{ {
VMBUS_CHANNEL_MESSAGE_HEADER Header; VMBUS_CHANNEL_MESSAGE_HEADER Header;
bool VersionSupported; bool VersionSupported;
} VMBUS_CHANNEL_VERSION_SUPPORTED, *PVMBUS_CHANNEL_VERSION_SUPPORTED; } VMBUS_CHANNEL_VERSION_SUPPORTED, *PVMBUS_CHANNEL_VERSION_SUPPORTED;
// Offer Channel parameters /* Offer Channel parameters */
typedef struct _VMBUS_CHANNEL_OFFER_CHANNEL typedef struct _VMBUS_CHANNEL_OFFER_CHANNEL
{ {
VMBUS_CHANNEL_MESSAGE_HEADER Header; VMBUS_CHANNEL_MESSAGE_HEADER Header;
@ -95,67 +95,69 @@ typedef struct _VMBUS_CHANNEL_OFFER_CHANNEL
bool MonitorAllocated; bool MonitorAllocated;
} VMBUS_CHANNEL_OFFER_CHANNEL, *PVMBUS_CHANNEL_OFFER_CHANNEL; } VMBUS_CHANNEL_OFFER_CHANNEL, *PVMBUS_CHANNEL_OFFER_CHANNEL;
//
// Make sure VMBUS_CHANNEL_OFFER_CHANNEL fits into Synic message. /* Make sure VMBUS_CHANNEL_OFFER_CHANNEL fits into Synic message. */
//
C_ASSERT(sizeof(VMBUS_CHANNEL_OFFER_CHANNEL) <= MAXIMUM_SYNIC_MESSAGE_BYTES); C_ASSERT(sizeof(VMBUS_CHANNEL_OFFER_CHANNEL) <= MAXIMUM_SYNIC_MESSAGE_BYTES);
// Rescind Offer parameters /* Rescind Offer parameters */
typedef struct _VMBUS_CHANNEL_RESCIND_OFFER typedef struct _VMBUS_CHANNEL_RESCIND_OFFER
{ {
VMBUS_CHANNEL_MESSAGE_HEADER Header; VMBUS_CHANNEL_MESSAGE_HEADER Header;
u32 ChildRelId; u32 ChildRelId;
} VMBUS_CHANNEL_RESCIND_OFFER, *PVMBUS_CHANNEL_RESCIND_OFFER; } VMBUS_CHANNEL_RESCIND_OFFER, *PVMBUS_CHANNEL_RESCIND_OFFER;
// Request Offer -- no parameters, SynIC message contains the partition ID /* Request Offer -- no parameters, SynIC message contains the partition ID */
// Set Snoop -- no parameters, SynIC message contains the partition ID /* Set Snoop -- no parameters, SynIC message contains the partition ID */
// Clear Snoop -- no parameters, SynIC message contains the partition ID /* Clear Snoop -- no parameters, SynIC message contains the partition ID */
// All Offers Delivered -- no parameters, SynIC message contains the partition ID /* All Offers Delivered -- no parameters, SynIC message contains the partition ID */
// Flush Client -- no parameters, SynIC message contains the partition ID /* Flush Client -- no parameters, SynIC message contains the partition ID */
// Open Channel parameters /* Open Channel parameters */
typedef struct _VMBUS_CHANNEL_OPEN_CHANNEL typedef struct _VMBUS_CHANNEL_OPEN_CHANNEL
{ {
VMBUS_CHANNEL_MESSAGE_HEADER Header; VMBUS_CHANNEL_MESSAGE_HEADER Header;
//
// Identifies the specific VMBus channel that is being opened. /* Identifies the specific VMBus channel that is being opened. */
//
u32 ChildRelId; u32 ChildRelId;
//
// ID making a particular open request at a channel offer unique. /* ID making a particular open request at a channel offer unique. */
//
u32 OpenId; u32 OpenId;
//
// GPADL for the channel's ring buffer. /* GPADL for the channel's ring buffer. */
//
GPADL_HANDLE RingBufferGpadlHandle; GPADL_HANDLE RingBufferGpadlHandle;
//
// GPADL for the channel's server context save area. /* GPADL for the channel's server context save area. */
//
GPADL_HANDLE ServerContextAreaGpadlHandle; GPADL_HANDLE ServerContextAreaGpadlHandle;
//
// The upstream ring buffer begins at offset zero in the memory described /*
// by RingBufferGpadlHandle. The downstream ring buffer follows it at this * The upstream ring buffer begins at offset zero in the memory
// offset (in pages). * described by RingBufferGpadlHandle. The downstream ring buffer
// * follows it at this offset (in pages).
*/
u32 DownstreamRingBufferPageOffset; u32 DownstreamRingBufferPageOffset;
//
// User-specific data to be passed along to the server endpoint. /* User-specific data to be passed along to the server endpoint. */
//
unsigned char UserData[MAX_USER_DEFINED_BYTES]; unsigned char UserData[MAX_USER_DEFINED_BYTES];
} VMBUS_CHANNEL_OPEN_CHANNEL, *PVMBUS_CHANNEL_OPEN_CHANNEL; } VMBUS_CHANNEL_OPEN_CHANNEL, *PVMBUS_CHANNEL_OPEN_CHANNEL;
// Reopen Channel parameters; /* Reopen Channel parameters; */
typedef VMBUS_CHANNEL_OPEN_CHANNEL VMBUS_CHANNEL_REOPEN_CHANNEL, *PVMBUS_CHANNEL_REOPEN_CHANNEL; typedef VMBUS_CHANNEL_OPEN_CHANNEL VMBUS_CHANNEL_REOPEN_CHANNEL, *PVMBUS_CHANNEL_REOPEN_CHANNEL;
// Open Channel Result parameters /* Open Channel Result parameters */
typedef struct _VMBUS_CHANNEL_OPEN_RESULT typedef struct _VMBUS_CHANNEL_OPEN_RESULT
{ {
VMBUS_CHANNEL_MESSAGE_HEADER Header; VMBUS_CHANNEL_MESSAGE_HEADER Header;
@ -164,24 +166,26 @@ typedef struct _VMBUS_CHANNEL_OPEN_RESULT
NTSTATUS Status; NTSTATUS Status;
} VMBUS_CHANNEL_OPEN_RESULT, *PVMBUS_CHANNEL_OPEN_RESULT; } VMBUS_CHANNEL_OPEN_RESULT, *PVMBUS_CHANNEL_OPEN_RESULT;
// Close channel parameters; /* Close channel parameters; */
typedef struct _VMBUS_CHANNEL_CLOSE_CHANNEL typedef struct _VMBUS_CHANNEL_CLOSE_CHANNEL
{ {
VMBUS_CHANNEL_MESSAGE_HEADER Header; VMBUS_CHANNEL_MESSAGE_HEADER Header;
u32 ChildRelId; u32 ChildRelId;
} VMBUS_CHANNEL_CLOSE_CHANNEL, *PVMBUS_CHANNEL_CLOSE_CHANNEL; } VMBUS_CHANNEL_CLOSE_CHANNEL, *PVMBUS_CHANNEL_CLOSE_CHANNEL;
// Channel Message GPADL /* Channel Message GPADL */
#define GPADL_TYPE_RING_BUFFER 1 #define GPADL_TYPE_RING_BUFFER 1
#define GPADL_TYPE_SERVER_SAVE_AREA 2 #define GPADL_TYPE_SERVER_SAVE_AREA 2
#define GPADL_TYPE_TRANSACTION 8 #define GPADL_TYPE_TRANSACTION 8
//
// The number of PFNs in a GPADL message is defined by the number of pages /*
// that would be spanned by ByteCount and ByteOffset. If the implied number * The number of PFNs in a GPADL message is defined by the number of
// of PFNs won't fit in this packet, there will be a follow-up packet that * pages that would be spanned by ByteCount and ByteOffset. If the
// contains more. * implied number of PFNs won't fit in this packet, there will be a
// * follow-up packet that contains more.
*/
typedef struct _VMBUS_CHANNEL_GPADL_HEADER typedef struct _VMBUS_CHANNEL_GPADL_HEADER
{ {
@ -194,9 +198,9 @@ typedef struct _VMBUS_CHANNEL_GPADL_HEADER
} VMBUS_CHANNEL_GPADL_HEADER, *PVMBUS_CHANNEL_GPADL_HEADER; } VMBUS_CHANNEL_GPADL_HEADER, *PVMBUS_CHANNEL_GPADL_HEADER;
//
// This is the followup packet that contains more PFNs. /* This is the followup packet that contains more PFNs. */
//
typedef struct _VMBUS_CHANNEL_GPADL_BODY typedef struct _VMBUS_CHANNEL_GPADL_BODY
{ {
@ -269,10 +273,10 @@ typedef struct _VMBUS_CHANNEL_VERSION_RESPONSE
typedef VMBUS_CHANNEL_MESSAGE_HEADER VMBUS_CHANNEL_UNLOAD, *PVMBUS_CHANNEL_UNLOAD; typedef VMBUS_CHANNEL_MESSAGE_HEADER VMBUS_CHANNEL_UNLOAD, *PVMBUS_CHANNEL_UNLOAD;
//
// Kind of a table to use the preprocessor to get us the right type for a /* Kind of a table to use the preprocessor to get us the right type for a */
// specified message ID. Used with ChAllocateSendMessage() /* specified message ID. Used with ChAllocateSendMessage() */
//
#define ChannelMessageQueryVmbusVersion_TYPE VMBUS_CHANNEL_MESSAGE_HEADER #define ChannelMessageQueryVmbusVersion_TYPE VMBUS_CHANNEL_MESSAGE_HEADER
#define ChannelMessageVmbusVersionSupported_TYPE VMBUS_CHANNEL_VERSION_SUPPORTED #define ChannelMessageVmbusVersionSupported_TYPE VMBUS_CHANNEL_VERSION_SUPPORTED
#define ChannelMessageOfferChannel_TYPE VMBUS_CHANNEL_OFFER_CHANNEL #define ChannelMessageOfferChannel_TYPE VMBUS_CHANNEL_OFFER_CHANNEL
@ -295,18 +299,17 @@ typedef VMBUS_CHANNEL_MESSAGE_HEADER VMBUS_CHANNEL_UNLOAD, *PVMBUS_CHANNEL_UNLOA
#define ChannelMessageVersionResponse_TYPE VMBUS_CHANNEL_VERSION_RESPONSE #define ChannelMessageVersionResponse_TYPE VMBUS_CHANNEL_VERSION_RESPONSE
#define ChannelMessageUnload_TYPE VMBUS_CHANNEL_UNLOAD #define ChannelMessageUnload_TYPE VMBUS_CHANNEL_UNLOAD
//
// Preprocessor wrapper to ChAllocateSendMessageSize() converting the return /* Preprocessor wrapper to ChAllocateSendMessageSize() converting the return */
// value to the correct pointer and calculate the needed size. /* value to the correct pointer and calculate the needed size. */
//
// Argument: /* Argument: */
//
// Id - the numberic ID (type VMBUS_CHANNEL_MESSAGE_TYPE) of the message to /* Id - the numberic ID (type VMBUS_CHANNEL_MESSAGE_TYPE) of the message to */
// send. /* send. */
//
#define ChAllocateSendMessage(Id, Fn, Context) \ #define ChAllocateSendMessage(Id, Fn, Context) \
(Id##_TYPE*)ChAllocateSendMessageSized(sizeof(Id##_TYPE), Id, Fn, Context) (Id##_TYPE*)ChAllocateSendMessageSized(sizeof(Id##_TYPE), Id, Fn, Context)
#pragma pack(pop) #pragma pack(pop)

View file

@ -25,8 +25,8 @@
#pragma once #pragma once
//
// Time in the hypervisor is measured in 100 nanosecond units /* Time in the hypervisor is measured in 100 nanosecond units */
//
typedef u64 HV_NANO100_TIME, *PHV_NANO100_TIME; typedef u64 HV_NANO100_TIME, *PHV_NANO100_TIME;
typedef u64 HV_NANO100_DURATION, *PHV_NANO100_DURATION; typedef u64 HV_NANO100_DURATION, *PHV_NANO100_DURATION;

View file

@ -24,9 +24,9 @@
#pragma once #pragma once
//
// Declare the various hypercall operations. /* Declare the various hypercall operations. */
//
typedef enum _HV_CALL_CODE typedef enum _HV_CALL_CODE
{ {
@ -34,9 +34,9 @@ typedef enum _HV_CALL_CODE
HvCallSignalEvent = 0x005d, HvCallSignalEvent = 0x005d,
} HV_CALL_CODE, *PHV_CALL_CODE; } HV_CALL_CODE, *PHV_CALL_CODE;
//
// Definition of the HvPostMessage hypercall input structure. /* Definition of the HvPostMessage hypercall input structure. */
//
typedef struct _HV_INPUT_POST_MESSAGE typedef struct _HV_INPUT_POST_MESSAGE
{ {
@ -48,9 +48,9 @@ typedef struct _HV_INPUT_POST_MESSAGE
} HV_INPUT_POST_MESSAGE, *PHV_INPUT_POST_MESSAGE; } HV_INPUT_POST_MESSAGE, *PHV_INPUT_POST_MESSAGE;
//
// Definition of the HvSignalEvent hypercall input structure. /* Definition of the HvSignalEvent hypercall input structure. */
//
typedef struct _HV_INPUT_SIGNAL_EVENT typedef struct _HV_INPUT_SIGNAL_EVENT
{ {

View file

@ -24,15 +24,15 @@
#pragma once #pragma once
//
// Versioning definitions used for guests reporting themselves to the
// hypervisor, and visa versa.
// ==================================================================
//
// /* Versioning definitions used for guests reporting themselves to the */
// Version info reported by guest OS's /* hypervisor, and visa versa. */
// /* ================================================================== */
/* Version info reported by guest OS's */
typedef enum _HV_GUEST_OS_VENDOR typedef enum _HV_GUEST_OS_VENDOR
{ {
HvGuestOsVendorMicrosoft = 0x0001 HvGuestOsVendorMicrosoft = 0x0001
@ -50,9 +50,9 @@ typedef enum _HV_GUEST_OS_MICROSOFT_IDS
} HV_GUEST_OS_MICROSOFT_IDS, *PHV_GUEST_OS_MICROSOFT_IDS; } HV_GUEST_OS_MICROSOFT_IDS, *PHV_GUEST_OS_MICROSOFT_IDS;
//
// Declare the MSR used to identify the guest OS. /* Declare the MSR used to identify the guest OS. */
//
#define HV_X64_MSR_GUEST_OS_ID 0x40000000 #define HV_X64_MSR_GUEST_OS_ID 0x40000000
typedef union _HV_X64_MSR_GUEST_OS_ID_CONTENTS typedef union _HV_X64_MSR_GUEST_OS_ID_CONTENTS
@ -61,17 +61,17 @@ typedef union _HV_X64_MSR_GUEST_OS_ID_CONTENTS
struct struct
{ {
u64 BuildNumber : 16; u64 BuildNumber : 16;
u64 ServiceVersion : 8; // Service Pack, etc. u64 ServiceVersion : 8; /* Service Pack, etc. */
u64 MinorVersion : 8; u64 MinorVersion : 8;
u64 MajorVersion : 8; u64 MajorVersion : 8;
u64 OsId : 8; // HV_GUEST_OS_MICROSOFT_IDS (If Vendor=MS) u64 OsId : 8; /* HV_GUEST_OS_MICROSOFT_IDS (If Vendor=MS) */
u64 VendorId : 16; // HV_GUEST_OS_VENDOR u64 VendorId : 16; /* HV_GUEST_OS_VENDOR */
}; };
} HV_X64_MSR_GUEST_OS_ID_CONTENTS, *PHV_X64_MSR_GUEST_OS_ID_CONTENTS; } HV_X64_MSR_GUEST_OS_ID_CONTENTS, *PHV_X64_MSR_GUEST_OS_ID_CONTENTS;
//
// Declare the MSR used to setup pages used to communicate with the hypervisor. /* Declare the MSR used to setup pages used to communicate with the hypervisor. */
//
#define HV_X64_MSR_HYPERCALL 0x40000001 #define HV_X64_MSR_HYPERCALL 0x40000001
typedef union _HV_X64_MSR_HYPERCALL_CONTENTS typedef union _HV_X64_MSR_HYPERCALL_CONTENTS

File diff suppressed because it is too large Load diff

View file

@ -23,24 +23,24 @@
#pragma once #pragma once
//
// Define the virtual APIC registers /* Define the virtual APIC registers */
//
#define HV_X64_MSR_EOI (0x40000070) #define HV_X64_MSR_EOI (0x40000070)
#define HV_X64_MSR_ICR (0x40000071) #define HV_X64_MSR_ICR (0x40000071)
#define HV_X64_MSR_TPR (0x40000072) #define HV_X64_MSR_TPR (0x40000072)
#define HV_X64_MSR_APIC_ASSIST_PAGE (0x40000073) #define HV_X64_MSR_APIC_ASSIST_PAGE (0x40000073)
//
// Define version of the synthetic interrupt controller. /* Define version of the synthetic interrupt controller. */
//
#define HV_SYNIC_VERSION (1) #define HV_SYNIC_VERSION (1)
//
// Define synthetic interrupt controller model specific registers. /* Define synthetic interrupt controller model specific registers. */
//
#define HV_X64_MSR_SCONTROL (0x40000080) #define HV_X64_MSR_SCONTROL (0x40000080)
#define HV_X64_MSR_SVERSION (0x40000081) #define HV_X64_MSR_SVERSION (0x40000081)
@ -64,61 +64,61 @@
#define HV_X64_MSR_SINT14 (0x4000009E) #define HV_X64_MSR_SINT14 (0x4000009E)
#define HV_X64_MSR_SINT15 (0x4000009F) #define HV_X64_MSR_SINT15 (0x4000009F)
//
// Define the expected SynIC version. /* Define the expected SynIC version. */
//
#define HV_SYNIC_VERSION_1 (0x1) #define HV_SYNIC_VERSION_1 (0x1)
//
// Define synthetic interrupt controller message constants. /* Define synthetic interrupt controller message constants. */
//
#define HV_MESSAGE_SIZE (256) #define HV_MESSAGE_SIZE (256)
#define HV_MESSAGE_PAYLOAD_BYTE_COUNT (240) #define HV_MESSAGE_PAYLOAD_BYTE_COUNT (240)
#define HV_MESSAGE_PAYLOAD_QWORD_COUNT (30) #define HV_MESSAGE_PAYLOAD_QWORD_COUNT (30)
#define HV_ANY_VP (0xFFFFFFFF) #define HV_ANY_VP (0xFFFFFFFF)
//
// Define synthetic interrupt controller flag constants. /* Define synthetic interrupt controller flag constants. */
//
#define HV_EVENT_FLAGS_COUNT (256 * 8) #define HV_EVENT_FLAGS_COUNT (256 * 8)
#define HV_EVENT_FLAGS_BYTE_COUNT (256) #define HV_EVENT_FLAGS_BYTE_COUNT (256)
#define HV_EVENT_FLAGS_DWORD_COUNT (256 / sizeof(u32)) #define HV_EVENT_FLAGS_DWORD_COUNT (256 / sizeof(u32))
//
// Define hypervisor message types. /* Define hypervisor message types. */
//
typedef enum _HV_MESSAGE_TYPE typedef enum _HV_MESSAGE_TYPE
{ {
HvMessageTypeNone = 0x00000000, HvMessageTypeNone = 0x00000000,
//
// Memory access messages. /* Memory access messages. */
//
HvMessageTypeUnmappedGpa = 0x80000000, HvMessageTypeUnmappedGpa = 0x80000000,
HvMessageTypeGpaIntercept = 0x80000001, HvMessageTypeGpaIntercept = 0x80000001,
//
// Timer notification messages. /* Timer notification messages. */
//
HvMessageTimerExpired = 0x80000010, HvMessageTimerExpired = 0x80000010,
//
// Error messages. /* Error messages. */
//
HvMessageTypeInvalidVpRegisterValue = 0x80000020, HvMessageTypeInvalidVpRegisterValue = 0x80000020,
HvMessageTypeUnrecoverableException = 0x80000021, HvMessageTypeUnrecoverableException = 0x80000021,
HvMessageTypeUnsupportedFeature = 0x80000022, HvMessageTypeUnsupportedFeature = 0x80000022,
//
// Trace buffer complete messages. /* Trace buffer complete messages. */
//
HvMessageTypeEventLogBufferComplete = 0x80000040, HvMessageTypeEventLogBufferComplete = 0x80000040,
//
// Platform-specific processor intercept messages. /* Platform-specific processor intercept messages. */
//
HvMessageTypeX64IoPortIntercept = 0x80010000, HvMessageTypeX64IoPortIntercept = 0x80010000,
HvMessageTypeX64MsrIntercept = 0x80010001, HvMessageTypeX64MsrIntercept = 0x80010001,
HvMessageTypeX64CpuidIntercept = 0x80010002, HvMessageTypeX64CpuidIntercept = 0x80010002,
@ -128,33 +128,33 @@ typedef enum _HV_MESSAGE_TYPE
} HV_MESSAGE_TYPE, *PHV_MESSAGE_TYPE; } HV_MESSAGE_TYPE, *PHV_MESSAGE_TYPE;
//
// Define the number of synthetic interrupt sources. /* Define the number of synthetic interrupt sources. */
//
#define HV_SYNIC_SINT_COUNT (16) #define HV_SYNIC_SINT_COUNT (16)
#define HV_SYNIC_STIMER_COUNT (4) #define HV_SYNIC_STIMER_COUNT (4)
//
// Define the synthetic interrupt source index type. /* Define the synthetic interrupt source index type. */
//
typedef u32 HV_SYNIC_SINT_INDEX, *PHV_SYNIC_SINT_INDEX; typedef u32 HV_SYNIC_SINT_INDEX, *PHV_SYNIC_SINT_INDEX;
//
// Define partition identifier type. /* Define partition identifier type. */
//
typedef u64 HV_PARTITION_ID, *PHV_PARTITION_ID; typedef u64 HV_PARTITION_ID, *PHV_PARTITION_ID;
//
// Define invalid partition identifier. /* Define invalid partition identifier. */
//
#define HV_PARTITION_ID_INVALID ((HV_PARTITION_ID) 0x0) #define HV_PARTITION_ID_INVALID ((HV_PARTITION_ID) 0x0)
//
// Define connection identifier type. /* Define connection identifier type. */
//
typedef union _HV_CONNECTION_ID typedef union _HV_CONNECTION_ID
{ {
@ -162,15 +162,15 @@ typedef union _HV_CONNECTION_ID
struct struct
{ {
u32 Id:24; u32 Id:24;
u32 Reserved:8; u32 Reserved:8;
} u; } u;
} HV_CONNECTION_ID, *PHV_CONNECTION_ID; } HV_CONNECTION_ID, *PHV_CONNECTION_ID;
//
// Define port identifier type. /* Define port identifier type. */
//
typedef union _HV_PORT_ID typedef union _HV_PORT_ID
{ {
@ -178,15 +178,15 @@ typedef union _HV_PORT_ID
struct struct
{ {
u32 Id:24; u32 Id:24;
u32 Reserved:8; u32 Reserved:8;
} u ; } u ;
} HV_PORT_ID, *PHV_PORT_ID; } HV_PORT_ID, *PHV_PORT_ID;
//
// Define port type. /* Define port type. */
//
typedef enum _HV_PORT_TYPE typedef enum _HV_PORT_TYPE
{ {
@ -195,9 +195,9 @@ typedef enum _HV_PORT_TYPE
HvPortTypeMonitor = 3 HvPortTypeMonitor = 3
} HV_PORT_TYPE, *PHV_PORT_TYPE; } HV_PORT_TYPE, *PHV_PORT_TYPE;
//
// Define port information structure. /* Define port information structure. */
//
typedef struct _HV_PORT_INFO typedef struct _HV_PORT_INFO
{ {
@ -206,27 +206,27 @@ typedef struct _HV_PORT_INFO
union union
{ {
struct struct
{ {
HV_SYNIC_SINT_INDEX TargetSint; HV_SYNIC_SINT_INDEX TargetSint;
HV_VP_INDEX TargetVp; HV_VP_INDEX TargetVp;
u64 RsvdZ; u64 RsvdZ;
} MessagePortInfo; } MessagePortInfo;
struct struct
{ {
HV_SYNIC_SINT_INDEX TargetSint; HV_SYNIC_SINT_INDEX TargetSint;
HV_VP_INDEX TargetVp; HV_VP_INDEX TargetVp;
u16 BaseFlagNumber; u16 BaseFlagNumber;
u16 FlagCount; u16 FlagCount;
u32 RsvdZ; u32 RsvdZ;
} EventPortInfo; } EventPortInfo;
struct struct
{ {
HV_GPA MonitorAddress; HV_GPA MonitorAddress;
u64 RsvdZ; u64 RsvdZ;
} MonitorPortInfo; } MonitorPortInfo;
}; };
} HV_PORT_INFO, *PHV_PORT_INFO; } HV_PORT_INFO, *PHV_PORT_INFO;
@ -239,43 +239,43 @@ typedef struct _HV_CONNECTION_INFO
union union
{ {
struct struct
{ {
u64 RsvdZ; u64 RsvdZ;
} MessageConnectionInfo; } MessageConnectionInfo;
struct struct
{ {
u64 RsvdZ; u64 RsvdZ;
} EventConnectionInfo; } EventConnectionInfo;
struct struct
{ {
HV_GPA MonitorAddress; HV_GPA MonitorAddress;
} MonitorConnectionInfo; } MonitorConnectionInfo;
}; };
} HV_CONNECTION_INFO, *PHV_CONNECTION_INFO; } HV_CONNECTION_INFO, *PHV_CONNECTION_INFO;
typedef const HV_CONNECTION_INFO *PCHV_CONNECTION_INFO; typedef const HV_CONNECTION_INFO *PCHV_CONNECTION_INFO;
//
// Define synthetic interrupt controller message flags. /* Define synthetic interrupt controller message flags. */
//
typedef union _HV_MESSAGE_FLAGS typedef union _HV_MESSAGE_FLAGS
{ {
u8 Asu8; u8 Asu8;
struct struct
{ {
u8 MessagePending:1; u8 MessagePending:1;
u8 Reserved:7; u8 Reserved:7;
}; };
} HV_MESSAGE_FLAGS, *PHV_MESSAGE_FLAGS; } HV_MESSAGE_FLAGS, *PHV_MESSAGE_FLAGS;
//
// Define synthetic interrupt controller message header. /* Define synthetic interrupt controller message header. */
//
typedef struct _HV_MESSAGE_HEADER typedef struct _HV_MESSAGE_HEADER
{ {
@ -285,45 +285,45 @@ typedef struct _HV_MESSAGE_HEADER
u8 Reserved[2]; u8 Reserved[2];
union union
{ {
HV_PARTITION_ID Sender; HV_PARTITION_ID Sender;
HV_PORT_ID Port; HV_PORT_ID Port;
}; };
} HV_MESSAGE_HEADER, *PHV_MESSAGE_HEADER; } HV_MESSAGE_HEADER, *PHV_MESSAGE_HEADER;
//
// Define timer message payload structure. /* Define timer message payload structure. */
//
typedef struct _HV_TIMER_MESSAGE_PAYLOAD typedef struct _HV_TIMER_MESSAGE_PAYLOAD
{ {
u32 TimerIndex; u32 TimerIndex;
u32 Reserved; u32 Reserved;
HV_NANO100_TIME ExpirationTime; // When the timer expired HV_NANO100_TIME ExpirationTime; /* When the timer expired */
HV_NANO100_TIME DeliveryTime; // When the message was delivered HV_NANO100_TIME DeliveryTime; /* When the message was delivered */
} HV_TIMER_MESSAGE_PAYLOAD, *PHV_TIMER_MESSAGE_PAYLOAD; } HV_TIMER_MESSAGE_PAYLOAD, *PHV_TIMER_MESSAGE_PAYLOAD;
//
// Define synthetic interrupt controller message format. /* Define synthetic interrupt controller message format. */
//
typedef struct _HV_MESSAGE typedef struct _HV_MESSAGE
{ {
HV_MESSAGE_HEADER Header; HV_MESSAGE_HEADER Header;
union union
{ {
u64 Payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT]; u64 Payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
} u ; } u ;
} HV_MESSAGE, *PHV_MESSAGE; } HV_MESSAGE, *PHV_MESSAGE;
//
// Define the number of message buffers associated with each port. /* Define the number of message buffers associated with each port. */
//
#define HV_PORT_MESSAGE_BUFFER_COUNT (16) #define HV_PORT_MESSAGE_BUFFER_COUNT (16)
//
// Define the synthetic interrupt message page layout. /* Define the synthetic interrupt message page layout. */
//
typedef struct _HV_MESSAGE_PAGE typedef struct _HV_MESSAGE_PAGE
{ {
@ -331,9 +331,9 @@ typedef struct _HV_MESSAGE_PAGE
} HV_MESSAGE_PAGE, *PHV_MESSAGE_PAGE; } HV_MESSAGE_PAGE, *PHV_MESSAGE_PAGE;
//
// Define the synthetic interrupt controller event flags format. /* Define the synthetic interrupt controller event flags format. */
//
typedef union _HV_SYNIC_EVENT_FLAGS typedef union _HV_SYNIC_EVENT_FLAGS
{ {
@ -342,9 +342,9 @@ typedef union _HV_SYNIC_EVENT_FLAGS
} HV_SYNIC_EVENT_FLAGS, *PHV_SYNIC_EVENT_FLAGS; } HV_SYNIC_EVENT_FLAGS, *PHV_SYNIC_EVENT_FLAGS;
//
// Define the synthetic interrupt flags page layout. /* Define the synthetic interrupt flags page layout. */
//
typedef struct _HV_SYNIC_EVENT_FLAGS_PAGE typedef struct _HV_SYNIC_EVENT_FLAGS_PAGE
{ {
@ -352,69 +352,69 @@ typedef struct _HV_SYNIC_EVENT_FLAGS_PAGE
} HV_SYNIC_EVENT_FLAGS_PAGE, *PHV_SYNIC_EVENT_FLAGS_PAGE; } HV_SYNIC_EVENT_FLAGS_PAGE, *PHV_SYNIC_EVENT_FLAGS_PAGE;
//
// Define SynIC control register. /* Define SynIC control register. */
//
typedef union _HV_SYNIC_SCONTROL typedef union _HV_SYNIC_SCONTROL
{ {
u64 AsUINT64; u64 AsUINT64;
struct struct
{ {
u64 Enable:1; u64 Enable:1;
u64 Reserved:63; u64 Reserved:63;
}; };
} HV_SYNIC_SCONTROL, *PHV_SYNIC_SCONTROL; } HV_SYNIC_SCONTROL, *PHV_SYNIC_SCONTROL;
//
// Define synthetic interrupt source. /* Define synthetic interrupt source. */
//
typedef union _HV_SYNIC_SINT typedef union _HV_SYNIC_SINT
{ {
u64 AsUINT64; u64 AsUINT64;
struct struct
{ {
u64 Vector :8; u64 Vector :8;
u64 Reserved1 :8; u64 Reserved1 :8;
u64 Masked :1; u64 Masked :1;
u64 AutoEoi :1; u64 AutoEoi :1;
u64 Reserved2 :46; u64 Reserved2 :46;
}; };
} HV_SYNIC_SINT, *PHV_SYNIC_SINT; } HV_SYNIC_SINT, *PHV_SYNIC_SINT;
//
// Define the format of the SIMP register /* Define the format of the SIMP register */
//
typedef union _HV_SYNIC_SIMP typedef union _HV_SYNIC_SIMP
{ {
u64 AsUINT64; u64 AsUINT64;
struct struct
{ {
u64 SimpEnabled : 1; u64 SimpEnabled : 1;
u64 Preserved : 11; u64 Preserved : 11;
u64 BaseSimpGpa : 52; u64 BaseSimpGpa : 52;
}; };
} HV_SYNIC_SIMP, *PHV_SYNIC_SIMP; } HV_SYNIC_SIMP, *PHV_SYNIC_SIMP;
//
// Define the format of the SIEFP register /* Define the format of the SIEFP register */
//
typedef union _HV_SYNIC_SIEFP typedef union _HV_SYNIC_SIEFP
{ {
u64 AsUINT64; u64 AsUINT64;
struct struct
{ {
u64 SiefpEnabled : 1; u64 SiefpEnabled : 1;
u64 Preserved : 11; u64 Preserved : 11;
u64 BaseSiefpGpa : 52; u64 BaseSiefpGpa : 52;
}; };
} HV_SYNIC_SIEFP, *PHV_SYNIC_SIEFP; } HV_SYNIC_SIEFP, *PHV_SYNIC_SIEFP;
//
// Definitions for the monitored notification facility /* Definitions for the monitored notification facility */
//
typedef union _HV_MONITOR_TRIGGER_GROUP typedef union _HV_MONITOR_TRIGGER_GROUP
{ {
@ -422,8 +422,8 @@ typedef union _HV_MONITOR_TRIGGER_GROUP
struct struct
{ {
u32 Pending; u32 Pending;
u32 Armed; u32 Armed;
}; };
} HV_MONITOR_TRIGGER_GROUP, *PHV_MONITOR_TRIGGER_GROUP; } HV_MONITOR_TRIGGER_GROUP, *PHV_MONITOR_TRIGGER_GROUP;
@ -441,32 +441,32 @@ typedef union _HV_MONITOR_TRIGGER_STATE
struct struct
{ {
u32 GroupEnable : 4; u32 GroupEnable : 4;
u32 RsvdZ : 28; u32 RsvdZ : 28;
}; };
} HV_MONITOR_TRIGGER_STATE, *PHV_MONITOR_TRIGGER_STATE; } HV_MONITOR_TRIGGER_STATE, *PHV_MONITOR_TRIGGER_STATE;
//
// HV_MONITOR_PAGE Layout /* HV_MONITOR_PAGE Layout */
// ------------------------------------------------------ /* ------------------------------------------------------ */
// | 0 | TriggerState (4 bytes) | Rsvd1 (4 bytes) | /* | 0 | TriggerState (4 bytes) | Rsvd1 (4 bytes) | */
// | 8 | TriggerGroup[0] | /* | 8 | TriggerGroup[0] | */
// | 10 | TriggerGroup[1] | /* | 10 | TriggerGroup[1] | */
// | 18 | TriggerGroup[2] | /* | 18 | TriggerGroup[2] | */
// | 20 | TriggerGroup[3] | /* | 20 | TriggerGroup[3] | */
// | 28 | Rsvd2[0] | /* | 28 | Rsvd2[0] | */
// | 30 | Rsvd2[1] | /* | 30 | Rsvd2[1] | */
// | 38 | Rsvd2[2] | /* | 38 | Rsvd2[2] | */
// | 40 | NextCheckTime[0][0] | NextCheckTime[0][1] | /* | 40 | NextCheckTime[0][0] | NextCheckTime[0][1] | */
// | ... | /* | ... | */
// | 240 | Latency[0][0..3] | /* | 240 | Latency[0][0..3] | */
// | 340 | Rsvz3[0] | /* | 340 | Rsvz3[0] | */
// | 440 | Parameter[0][0] | /* | 440 | Parameter[0][0] | */
// | 448 | Parameter[0][1] | /* | 448 | Parameter[0][1] | */
// | ... | /* | ... | */
// | 840 | Rsvd4[0] | /* | 840 | Rsvd4[0] | */
// ------------------------------------------------------ /* ------------------------------------------------------ */
typedef struct _HV_MONITOR_PAGE typedef struct _HV_MONITOR_PAGE
{ {

View file

@ -23,16 +23,16 @@
#pragma once #pragma once
//
// Virtual Processor Indices /* Virtual Processor Indices */
//
typedef u32 HV_VP_INDEX, *PHV_VP_INDEX; typedef u32 HV_VP_INDEX, *PHV_VP_INDEX;
//
// The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent /* The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent */
// is set by CPUID(HvCpuIdFunctionVersionAndFeatures). /* is set by CPUID(HvCpuIdFunctionVersionAndFeatures). */
// ========================================================================== /* ========================================================================== */
//
typedef enum _HV_CPUID_FUNCTION typedef enum _HV_CPUID_FUNCTION
{ {
@ -40,9 +40,9 @@ typedef enum _HV_CPUID_FUNCTION
HvCpuIdFunctionHvVendorAndMaxFunction = 0x40000000, HvCpuIdFunctionHvVendorAndMaxFunction = 0x40000000,
HvCpuIdFunctionHvInterface = 0x40000001, HvCpuIdFunctionHvInterface = 0x40000001,
//
// The remaining functions depend on the value of HvCpuIdFunctionInterface /* The remaining functions depend on the value of HvCpuIdFunctionInterface */
//
HvCpuIdFunctionMsHvVersion = 0x40000002, HvCpuIdFunctionMsHvVersion = 0x40000002,
HvCpuIdFunctionMsHvFeatures = 0x40000003, HvCpuIdFunctionMsHvFeatures = 0x40000003,
HvCpuIdFunctionMsHvEnlightenmentInformation = 0x40000004, HvCpuIdFunctionMsHvEnlightenmentInformation = 0x40000004,

View file

@ -36,10 +36,10 @@
typedef DLIST_ENTRY LIST_ENTRY; typedef DLIST_ENTRY LIST_ENTRY;
typedef DLIST_ENTRY *PLIST_ENTRY; typedef DLIST_ENTRY *PLIST_ENTRY;
//typedef struct LIST_ENTRY { /* typedef struct LIST_ENTRY { */
// struct LIST_ENTRY * volatile Flink; /* struct LIST_ENTRY * volatile Flink; */
// struct LIST_ENTRY * volatile Blink; /* struct LIST_ENTRY * volatile Blink; */
//} LIST_ENTRY, *PLIST_ENTRY; /* } LIST_ENTRY, *PLIST_ENTRY; */

View file

@ -27,22 +27,22 @@
#include "VmbusApi.h" #include "VmbusApi.h"
//
// Defines /* Defines */
//
#define NETVSC_DEVICE_RING_BUFFER_SIZE 64*PAGE_SIZE #define NETVSC_DEVICE_RING_BUFFER_SIZE 64*PAGE_SIZE
#define HW_MACADDR_LEN 6 #define HW_MACADDR_LEN 6
//
// Fwd declaration /* Fwd declaration */
//
typedef struct _NETVSC_PACKET *PNETVSC_PACKET; typedef struct _NETVSC_PACKET *PNETVSC_PACKET;
//
// Data types /* Data types */
//
typedef int (*PFN_ON_OPEN)(DEVICE_OBJECT *Device); typedef int (*PFN_ON_OPEN)(DEVICE_OBJECT *Device);
typedef int (*PFN_ON_CLOSE)(DEVICE_OBJECT *Device); typedef int (*PFN_ON_CLOSE)(DEVICE_OBJECT *Device);
@ -54,27 +54,33 @@ typedef void (*PFN_ON_SENDRECVCOMPLETION)(void * Context);
typedef int (*PFN_ON_RECVCALLBACK)(DEVICE_OBJECT *dev, PNETVSC_PACKET packet); typedef int (*PFN_ON_RECVCALLBACK)(DEVICE_OBJECT *dev, PNETVSC_PACKET packet);
typedef void (*PFN_ON_LINKSTATUS_CHANGED)(DEVICE_OBJECT *dev, u32 Status); typedef void (*PFN_ON_LINKSTATUS_CHANGED)(DEVICE_OBJECT *dev, u32 Status);
// Represent the xfer page packet which contains 1 or more netvsc packet /* Represent the xfer page packet which contains 1 or more netvsc packet */
typedef struct _XFERPAGE_PACKET { typedef struct _XFERPAGE_PACKET {
DLIST_ENTRY ListEntry; DLIST_ENTRY ListEntry;
// # of netvsc packets this xfer packet contains /* # of netvsc packets this xfer packet contains */
u32 Count; u32 Count;
} XFERPAGE_PACKET; } XFERPAGE_PACKET;
// The number of pages which are enough to cover jumbo frame buffer. /* The number of pages which are enough to cover jumbo frame buffer. */
#define NETVSC_PACKET_MAXPAGE 4 #define NETVSC_PACKET_MAXPAGE 4
// Represent netvsc packet which contains 1 RNDIS and 1 ethernet frame within the RNDIS /*
* Represent netvsc packet which contains 1 RNDIS and 1 ethernet frame
* within the RNDIS
*/
typedef struct _NETVSC_PACKET { typedef struct _NETVSC_PACKET {
// Bookkeeping stuff /* Bookkeeping stuff */
DLIST_ENTRY ListEntry; DLIST_ENTRY ListEntry;
DEVICE_OBJECT *Device; DEVICE_OBJECT *Device;
bool IsDataPacket; bool IsDataPacket;
// Valid only for receives when we break a xfer page packet into multiple netvsc packets /*
* Valid only for receives when we break a xfer page packet
* into multiple netvsc packets
*/
XFERPAGE_PACKET *XferPagePacket; XFERPAGE_PACKET *XferPagePacket;
union { union {
@ -90,40 +96,42 @@ typedef struct _NETVSC_PACKET {
} Send; } Send;
} Completion; } Completion;
// This points to the memory after PageBuffers /* This points to the memory after PageBuffers */
void * Extension; void * Extension;
u32 TotalDataBufferLength; u32 TotalDataBufferLength;
// Points to the send/receive buffer where the ethernet frame is /* Points to the send/receive buffer where the ethernet frame is */
u32 PageBufferCount; u32 PageBufferCount;
PAGE_BUFFER PageBuffers[NETVSC_PACKET_MAXPAGE]; PAGE_BUFFER PageBuffers[NETVSC_PACKET_MAXPAGE];
} NETVSC_PACKET; } NETVSC_PACKET;
// Represents the net vsc driver /* Represents the net vsc driver */
typedef struct _NETVSC_DRIVER_OBJECT { typedef struct _NETVSC_DRIVER_OBJECT {
DRIVER_OBJECT Base; // Must be the first field DRIVER_OBJECT Base; /* Must be the first field */
u32 RingBufferSize; u32 RingBufferSize;
u32 RequestExtSize; u32 RequestExtSize;
// Additional num of page buffers to allocate /* Additional num of page buffers to allocate */
u32 AdditionalRequestPageBufferCount; u32 AdditionalRequestPageBufferCount;
// This is set by the caller to allow us to callback when we receive a packet /*
// from the "wire" * This is set by the caller to allow us to callback when we
* receive a packet from the "wire"
*/
PFN_ON_RECVCALLBACK OnReceiveCallback; PFN_ON_RECVCALLBACK OnReceiveCallback;
PFN_ON_LINKSTATUS_CHANGED OnLinkStatusChanged; PFN_ON_LINKSTATUS_CHANGED OnLinkStatusChanged;
// Specific to this driver /* Specific to this driver */
PFN_ON_OPEN OnOpen; PFN_ON_OPEN OnOpen;
PFN_ON_CLOSE OnClose; PFN_ON_CLOSE OnClose;
PFN_ON_SEND OnSend; PFN_ON_SEND OnSend;
//PFN_ON_RECVCOMPLETION OnReceiveCompletion; /* PFN_ON_RECVCOMPLETION OnReceiveCompletion; */
//PFN_QUERY_LINKSTATUS QueryLinkStatus; /* PFN_QUERY_LINKSTATUS QueryLinkStatus; */
void* Context; void* Context;
} NETVSC_DRIVER_OBJECT; } NETVSC_DRIVER_OBJECT;
@ -131,15 +139,15 @@ typedef struct _NETVSC_DRIVER_OBJECT {
typedef struct _NETVSC_DEVICE_INFO { typedef struct _NETVSC_DEVICE_INFO {
unsigned char MacAddr[6]; unsigned char MacAddr[6];
bool LinkState; // 0 - link up, 1 - link down bool LinkState; /* 0 - link up, 1 - link down */
} NETVSC_DEVICE_INFO; } NETVSC_DEVICE_INFO;
//
// Interface /* Interface */
//
int int
NetVscInitialize( NetVscInitialize(
DRIVER_OBJECT* drv DRIVER_OBJECT* drv
); );
#endif // _NETVSC_API_H_ #endif /* _NETVSC_API_H_ */

View file

@ -27,33 +27,35 @@
#include "VmbusApi.h" #include "VmbusApi.h"
//
// Defines /* Defines */
//
#define STORVSC_RING_BUFFER_SIZE 10*PAGE_SIZE #define STORVSC_RING_BUFFER_SIZE 10*PAGE_SIZE
#define BLKVSC_RING_BUFFER_SIZE 20*PAGE_SIZE #define BLKVSC_RING_BUFFER_SIZE 20*PAGE_SIZE
#define STORVSC_MAX_IO_REQUESTS 64 #define STORVSC_MAX_IO_REQUESTS 64
// In Hyper-V, each port/path/target maps to 1 scsi host adapter. /*
// In reality, the path/target is not used (ie always set to 0) so * In Hyper-V, each port/path/target maps to 1 scsi host adapter. In
// our scsi host adapter essentially has 1 bus with 1 target that contains * reality, the path/target is not used (ie always set to 0) so our
// up to 256 luns. * scsi host adapter essentially has 1 bus with 1 target that contains
* up to 256 luns.
*/
#define STORVSC_MAX_LUNS_PER_TARGET 64 #define STORVSC_MAX_LUNS_PER_TARGET 64
#define STORVSC_MAX_TARGETS 1 #define STORVSC_MAX_TARGETS 1
#define STORVSC_MAX_CHANNELS 1 #define STORVSC_MAX_CHANNELS 1
// Fwd decl /* Fwd decl */
//
//struct VMBUS_CHANNEL; /* struct VMBUS_CHANNEL; */
typedef struct _STORVSC_REQUEST* PSTORVSC_REQUEST; typedef struct _STORVSC_REQUEST* PSTORVSC_REQUEST;
//
// Data types /* Data types */
//
typedef int (*PFN_ON_IO_REQUEST)(PDEVICE_OBJECT Device, PSTORVSC_REQUEST Request); typedef int (*PFN_ON_IO_REQUEST)(PDEVICE_OBJECT Device, PSTORVSC_REQUEST Request);
typedef void (*PFN_ON_IO_REQUEST_COMPLTN)(PSTORVSC_REQUEST Request); typedef void (*PFN_ON_IO_REQUEST_COMPLTN)(PSTORVSC_REQUEST Request);
@ -61,7 +63,7 @@ typedef int (*PFN_ON_HOST_RESET)(PDEVICE_OBJECT Device);
typedef void (*PFN_ON_HOST_RESCAN)(PDEVICE_OBJECT Device); typedef void (*PFN_ON_HOST_RESCAN)(PDEVICE_OBJECT Device);
// Matches Windows-end /* Matches Windows-end */
typedef enum _STORVSC_REQUEST_TYPE{ typedef enum _STORVSC_REQUEST_TYPE{
WRITE_TYPE, WRITE_TYPE,
READ_TYPE, READ_TYPE,
@ -87,30 +89,30 @@ typedef struct _STORVSC_REQUEST {
PFN_ON_IO_REQUEST_COMPLTN OnIOCompletion; PFN_ON_IO_REQUEST_COMPLTN OnIOCompletion;
// This points to the memory after DataBuffer /* This points to the memory after DataBuffer */
void * Extension; void * Extension;
MULTIPAGE_BUFFER DataBuffer; MULTIPAGE_BUFFER DataBuffer;
} STORVSC_REQUEST; } STORVSC_REQUEST;
// Represents the block vsc driver /* Represents the block vsc driver */
typedef struct _STORVSC_DRIVER_OBJECT { typedef struct _STORVSC_DRIVER_OBJECT {
DRIVER_OBJECT Base; // Must be the first field DRIVER_OBJECT Base; /* Must be the first field */
// Set by caller (in bytes) /* Set by caller (in bytes) */
u32 RingBufferSize; u32 RingBufferSize;
// Allocate this much private extension for each I/O request /* Allocate this much private extension for each I/O request */
u32 RequestExtSize; u32 RequestExtSize;
// Maximum # of requests in flight per channel/device /* Maximum # of requests in flight per channel/device */
u32 MaxOutstandingRequestsPerChannel; u32 MaxOutstandingRequestsPerChannel;
// Set by the caller to allow us to re-enumerate the bus on the host /* Set by the caller to allow us to re-enumerate the bus on the host */
PFN_ON_HOST_RESCAN OnHostRescan; PFN_ON_HOST_RESCAN OnHostRescan;
// Specific to this driver /* Specific to this driver */
PFN_ON_IO_REQUEST OnIORequest; PFN_ON_IO_REQUEST OnIORequest;
PFN_ON_HOST_RESET OnHostReset; PFN_ON_HOST_RESET OnHostReset;
@ -122,9 +124,9 @@ typedef struct _STORVSC_DEVICE_INFO {
unsigned char TargetId; unsigned char TargetId;
} STORVSC_DEVICE_INFO; } STORVSC_DEVICE_INFO;
//
// Interface /* Interface */
//
int int
StorVscInitialize( StorVscInitialize(
DRIVER_OBJECT *Driver DRIVER_OBJECT *Driver
@ -134,4 +136,4 @@ int
BlkVscInitialize( BlkVscInitialize(
DRIVER_OBJECT *Driver DRIVER_OBJECT *Driver
); );
#endif // _STORVSC_API_H_ #endif /* _STORVSC_API_H_ */

View file

@ -27,57 +27,57 @@
#include "osd.h" #include "osd.h"
//
// Defines /* Defines */
//
#define MAX_PAGE_BUFFER_COUNT 16 #define MAX_PAGE_BUFFER_COUNT 16
#define MAX_MULTIPAGE_BUFFER_COUNT 32 // 128K #define MAX_MULTIPAGE_BUFFER_COUNT 32 /* 128K */
//
// Fwd declarations /* Fwd declarations */
//
typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT; typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;
//
// Data types /* Data types */
//
#pragma pack(push,1) #pragma pack(push,1)
// Single-page buffer /* Single-page buffer */
typedef struct _PAGE_BUFFER { typedef struct _PAGE_BUFFER {
u32 Length; u32 Length;
u32 Offset; u32 Offset;
u64 Pfn; u64 Pfn;
} PAGE_BUFFER; } PAGE_BUFFER;
// Multiple-page buffer /* Multiple-page buffer */
typedef struct _MULTIPAGE_BUFFER { typedef struct _MULTIPAGE_BUFFER {
// Length and Offset determines the # of pfns in the array /* Length and Offset determines the # of pfns in the array */
u32 Length; u32 Length;
u32 Offset; u32 Offset;
u64 PfnArray[MAX_MULTIPAGE_BUFFER_COUNT]; u64 PfnArray[MAX_MULTIPAGE_BUFFER_COUNT];
}MULTIPAGE_BUFFER; }MULTIPAGE_BUFFER;
//0x18 includes the proprietary packet header /* 0x18 includes the proprietary packet header */
#define MAX_PAGE_BUFFER_PACKET (0x18 + (sizeof(PAGE_BUFFER) * MAX_PAGE_BUFFER_COUNT)) #define MAX_PAGE_BUFFER_PACKET (0x18 + (sizeof(PAGE_BUFFER) * MAX_PAGE_BUFFER_COUNT))
#define MAX_MULTIPAGE_BUFFER_PACKET (0x18 + sizeof(MULTIPAGE_BUFFER)) #define MAX_MULTIPAGE_BUFFER_PACKET (0x18 + sizeof(MULTIPAGE_BUFFER))
#pragma pack(pop) #pragma pack(pop)
// All drivers /* All drivers */
typedef int (*PFN_ON_DEVICEADD)(PDEVICE_OBJECT Device, void* AdditionalInfo); typedef int (*PFN_ON_DEVICEADD)(PDEVICE_OBJECT Device, void* AdditionalInfo);
typedef int (*PFN_ON_DEVICEREMOVE)(PDEVICE_OBJECT Device); typedef int (*PFN_ON_DEVICEREMOVE)(PDEVICE_OBJECT Device);
typedef char** (*PFN_ON_GETDEVICEIDS)(void); typedef char** (*PFN_ON_GETDEVICEIDS)(void);
typedef void (*PFN_ON_CLEANUP)(PDRIVER_OBJECT Driver); typedef void (*PFN_ON_CLEANUP)(PDRIVER_OBJECT Driver);
// Vmbus extensions /* Vmbus extensions */
//typedef int (*PFN_ON_MATCH)(PDEVICE_OBJECT dev, PDRIVER_OBJECT drv); /* typedef int (*PFN_ON_MATCH)(PDEVICE_OBJECT dev, PDRIVER_OBJECT drv); */
//typedef int (*PFN_ON_PROBE)(PDEVICE_OBJECT dev); /* typedef int (*PFN_ON_PROBE)(PDEVICE_OBJECT dev); */
typedef int (*PFN_ON_ISR)(PDRIVER_OBJECT drv); typedef int (*PFN_ON_ISR)(PDRIVER_OBJECT drv);
typedef void (*PFN_ON_DPC)(PDRIVER_OBJECT drv); typedef void (*PFN_ON_DPC)(PDRIVER_OBJECT drv);
typedef void (*PFN_GET_CHANNEL_OFFERS)(void); typedef void (*PFN_GET_CHANNEL_OFFERS)(void);
@ -87,7 +87,7 @@ typedef void (*PFN_ON_CHILDDEVICE_DESTROY)(PDEVICE_OBJECT Device);
typedef int (*PFN_ON_CHILDDEVICE_ADD)(PDEVICE_OBJECT RootDevice, PDEVICE_OBJECT ChildDevice); typedef int (*PFN_ON_CHILDDEVICE_ADD)(PDEVICE_OBJECT RootDevice, PDEVICE_OBJECT ChildDevice);
typedef void (*PFN_ON_CHILDDEVICE_REMOVE)(PDEVICE_OBJECT Device); typedef void (*PFN_ON_CHILDDEVICE_REMOVE)(PDEVICE_OBJECT Device);
// Vmbus channel interface /* Vmbus channel interface */
typedef void (*VMBUS_CHANNEL_CALLBACK)(void * context); typedef void (*VMBUS_CHANNEL_CALLBACK)(void * context);
typedef int (*VMBUS_CHANNEL_OPEN)( typedef int (*VMBUS_CHANNEL_OPEN)(
@ -148,8 +148,8 @@ typedef int (*VMBUS_CHANNEL_RECV_PACKET_PAW)(
typedef int (*VMBUS_CHANNEL_ESTABLISH_GPADL)( typedef int (*VMBUS_CHANNEL_ESTABLISH_GPADL)(
PDEVICE_OBJECT Device, PDEVICE_OBJECT Device,
void * Buffer, // from kmalloc() void * Buffer, /* from kmalloc() */
u32 BufferLen, // page-size multiple u32 BufferLen, /* page-size multiple */
u32* GpadlHandle u32* GpadlHandle
); );
@ -203,44 +203,44 @@ typedef struct _VMBUS_CHANNEL_INTERFACE {
typedef void (*VMBUS_GET_CHANNEL_INTERFACE)(VMBUS_CHANNEL_INTERFACE *Interface); typedef void (*VMBUS_GET_CHANNEL_INTERFACE)(VMBUS_CHANNEL_INTERFACE *Interface);
// Base driver object /* Base driver object */
typedef struct _DRIVER_OBJECT { typedef struct _DRIVER_OBJECT {
const char* name; const char* name;
GUID deviceType; // the device type supported by this driver GUID deviceType; /* the device type supported by this driver */
PFN_ON_DEVICEADD OnDeviceAdd; PFN_ON_DEVICEADD OnDeviceAdd;
PFN_ON_DEVICEREMOVE OnDeviceRemove; PFN_ON_DEVICEREMOVE OnDeviceRemove;
PFN_ON_GETDEVICEIDS OnGetDeviceIds; // device ids supported by this driver PFN_ON_GETDEVICEIDS OnGetDeviceIds; /* device ids supported by this driver */
PFN_ON_CLEANUP OnCleanup; PFN_ON_CLEANUP OnCleanup;
VMBUS_CHANNEL_INTERFACE VmbusChannelInterface; VMBUS_CHANNEL_INTERFACE VmbusChannelInterface;
} DRIVER_OBJECT; } DRIVER_OBJECT;
// Base device object /* Base device object */
typedef struct _DEVICE_OBJECT { typedef struct _DEVICE_OBJECT {
DRIVER_OBJECT* Driver; // the driver for this device DRIVER_OBJECT* Driver; /* the driver for this device */
char name[64]; char name[64];
GUID deviceType; // the device type id of this device GUID deviceType; /* the device type id of this device */
GUID deviceInstance; // the device instance id of this device GUID deviceInstance; /* the device instance id of this device */
void* context; void* context;
void* Extension; // Device extension; void* Extension; /* Device extension; */
} DEVICE_OBJECT; } DEVICE_OBJECT;
// Vmbus driver object /* Vmbus driver object */
typedef struct _VMBUS_DRIVER_OBJECT { typedef struct _VMBUS_DRIVER_OBJECT {
DRIVER_OBJECT Base; // !! Must be the 1st field !! DRIVER_OBJECT Base; /* !! Must be the 1st field !! */
// Set by the caller /* Set by the caller */
PFN_ON_CHILDDEVICE_CREATE OnChildDeviceCreate; PFN_ON_CHILDDEVICE_CREATE OnChildDeviceCreate;
PFN_ON_CHILDDEVICE_DESTROY OnChildDeviceDestroy; PFN_ON_CHILDDEVICE_DESTROY OnChildDeviceDestroy;
PFN_ON_CHILDDEVICE_ADD OnChildDeviceAdd; PFN_ON_CHILDDEVICE_ADD OnChildDeviceAdd;
PFN_ON_CHILDDEVICE_REMOVE OnChildDeviceRemove; PFN_ON_CHILDDEVICE_REMOVE OnChildDeviceRemove;
// Set by the callee /* Set by the callee */
//PFN_ON_MATCH OnMatch; /* PFN_ON_MATCH OnMatch; */
//PFN_ON_PROBE OnProbe; /* PFN_ON_PROBE OnProbe; */
PFN_ON_ISR OnIsr; PFN_ON_ISR OnIsr;
PFN_ON_DPC OnMsgDpc; PFN_ON_DPC OnMsgDpc;
PFN_ON_DPC OnEventDpc; PFN_ON_DPC OnEventDpc;
@ -251,12 +251,12 @@ typedef struct _VMBUS_DRIVER_OBJECT {
} VMBUS_DRIVER_OBJECT; } VMBUS_DRIVER_OBJECT;
//
// Interface /* Interface */
//
int int
VmbusInitialize( VmbusInitialize(
DRIVER_OBJECT* drv DRIVER_OBJECT* drv
); );
#endif // _VMBUS_API_H_ #endif /* _VMBUS_API_H_ */

View file

@ -23,42 +23,42 @@
#pragma once #pragma once
// allow nameless unions /* allow nameless unions */
//#pragma warning(disable : 4201) /* #pragma warning(disable : 4201) */
/* A revision number of vmbus that is used for ensuring both ends on a */
/* partition are using compatible versions. */
//
// A revision number of vmbus that is used for ensuring both ends on a
// partition are using compatible versions.
//
#define VMBUS_REVISION_NUMBER 13 #define VMBUS_REVISION_NUMBER 13
//
// Make maximum size of pipe payload of 16K
//
#define MAX_PIPE_DATA_PAYLOAD (sizeof(BYTE) * 16384)
// /* Make maximum size of pipe payload of 16K */
// Define PipeMode values.
// #define MAX_PIPE_DATA_PAYLOAD (sizeof(BYTE) * 16384)
/* Define PipeMode values. */
#define VMBUS_PIPE_TYPE_BYTE 0x00000000 #define VMBUS_PIPE_TYPE_BYTE 0x00000000
#define VMBUS_PIPE_TYPE_MESSAGE 0x00000004 #define VMBUS_PIPE_TYPE_MESSAGE 0x00000004
//
// The size of the user defined data buffer for non-pipe offers. /* The size of the user defined data buffer for non-pipe offers. */
//
#define MAX_USER_DEFINED_BYTES 120 #define MAX_USER_DEFINED_BYTES 120
//
// The size of the user defined data buffer for pipe offers. /* The size of the user defined data buffer for pipe offers. */
//
#define MAX_PIPE_USER_DEFINED_BYTES 116 #define MAX_PIPE_USER_DEFINED_BYTES 116
//
// At the center of the Channel Management library is /* At the center of the Channel Management library is */
// the Channel Offer. This struct contains the /* the Channel Offer. This struct contains the */
// fundamental information about an offer. /* fundamental information about an offer. */
//
#pragma pack(push,1) #pragma pack(push,1)
typedef struct typedef struct
@ -68,30 +68,30 @@ typedef struct
GUID InterfaceInstance; GUID InterfaceInstance;
u64 InterruptLatencyIn100nsUnits; u64 InterruptLatencyIn100nsUnits;
u32 InterfaceRevision; u32 InterfaceRevision;
u32 ServerContextAreaSize; // in bytes u32 ServerContextAreaSize; /* in bytes */
u16 ChannelFlags; u16 ChannelFlags;
u16 MmioMegabytes; // in bytes * 1024 * 1024 u16 MmioMegabytes; /* in bytes * 1024 * 1024 */
union union
{ {
//
// Non-pipes: The user has MAX_USER_DEFINED_BYTES bytes.
//
struct
{
unsigned char UserDefined[MAX_USER_DEFINED_BYTES];
} Standard;
// /* Non-pipes: The user has MAX_USER_DEFINED_BYTES bytes. */
// Pipes: The following sructure is an integrated pipe protocol, which
// is implemented on top of standard user-defined data. Pipe clients struct
// have MAX_PIPE_USER_DEFINED_BYTES left for their own use. {
// unsigned char UserDefined[MAX_USER_DEFINED_BYTES];
struct } Standard;
{
u32 PipeMode;
unsigned char UserDefined[MAX_PIPE_USER_DEFINED_BYTES]; /* Pipes: The following sructure is an integrated pipe protocol, which */
} Pipe; /* is implemented on top of standard user-defined data. Pipe clients */
/* have MAX_PIPE_USER_DEFINED_BYTES left for their own use. */
struct
{
u32 PipeMode;
unsigned char UserDefined[MAX_PIPE_USER_DEFINED_BYTES];
} Pipe;
} u; } u;
u32 Padding; u32 Padding;
} VMBUS_CHANNEL_OFFER, *PVMBUS_CHANNEL_OFFER; } VMBUS_CHANNEL_OFFER, *PVMBUS_CHANNEL_OFFER;
@ -100,9 +100,9 @@ typedef struct
typedef u32 GPADL_HANDLE; typedef u32 GPADL_HANDLE;
//
// Server Flags /* Server Flags */
//
#define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 1 #define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 1
#define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES 2 #define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES 2
@ -112,11 +112,10 @@ typedef u32 GPADL_HANDLE;
#define VMBUS_CHANNEL_PARENT_OFFER 0x200 #define VMBUS_CHANNEL_PARENT_OFFER 0x200
#define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION 0x400 #define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION 0x400
//
// TEMPTEMP -- move this next define to devioctl.h some day /* TEMPTEMP -- move this next define to devioctl.h some day */
//
#ifndef FILE_DEVICE_VMBUS #ifndef FILE_DEVICE_VMBUS
#define FILE_DEVICE_VMBUS 0x0000003E #define FILE_DEVICE_VMBUS 0x0000003E
#endif #endif

View file

@ -24,33 +24,33 @@
#pragma once #pragma once
//#ifndef PAGE_SIZE /* #ifndef PAGE_SIZE */
//#if defined(_IA64_) /* #if defined(_IA64_) */
//#error This does not work for IA64 /* #error This does not work for IA64 */
//#else /* #else */
//#define PAGE_SIZE 0x1000 /* #define PAGE_SIZE 0x1000 */
//#endif /* #endif */
//#endif /* #endif */
// allow nameless unions /* allow nameless unions */
//#pragma warning(disable : 4201) /* #pragma warning(disable : 4201) */
typedef struct typedef struct
{ {
union union
{ {
struct struct
{ {
volatile u32 In; // Offset in bytes from the ring base volatile u32 In; /* Offset in bytes from the ring base */
volatile u32 Out; // Offset in bytes from the ring base volatile u32 Out; /* Offset in bytes from the ring base */
}; };
volatile long long InOut; volatile long long InOut;
}; };
//
// If the receiving endpoint sets this to some non-zero value, the sending /* If the receiving endpoint sets this to some non-zero value, the sending */
// endpoint should not send any interrupts. /* endpoint should not send any interrupts. */
//
volatile u32 InterruptMask; volatile u32 InterruptMask;
@ -60,18 +60,18 @@ typedef struct
{ {
union union
{ {
struct struct
{ {
VMRCB Control; VMRCB Control;
}; };
u8 Reserved[PAGE_SIZE]; u8 Reserved[PAGE_SIZE];
}; };
//
// Beginning of the ring data. Note: It must be guaranteed that /* Beginning of the ring data. Note: It must be guaranteed that */
// this data does not share a page with the control structure. /* this data does not share a page with the control structure. */
//
u8 Data[1]; u8 Data[1];
} VMRING, *PVMRING; } VMRING, *PVMRING;
@ -159,10 +159,10 @@ typedef struct _VMADD_REMOVE_TRANSFER_PAGE_SET {
#pragma pack(pop) #pragma pack(pop)
//
// This structure defines a range in guest physical space that can be made /* This structure defines a range in guest physical space that can be made */
// to look virtually contiguous. /* to look virtually contiguous. */
//
typedef struct _GPA_RANGE { typedef struct _GPA_RANGE {
@ -176,13 +176,13 @@ typedef struct _GPA_RANGE {
#pragma pack(push, 1) #pragma pack(push, 1)
//
// This is the format for an Establish Gpadl packet, which contains a handle /* This is the format for an Establish Gpadl packet, which contains a handle */
// by which this GPADL will be known and a set of GPA ranges associated with /* by which this GPADL will be known and a set of GPA ranges associated with */
// it. This can be converted to a MDL by the guest OS. If there are multiple /* it. This can be converted to a MDL by the guest OS. If there are multiple */
// GPA ranges, then the resulting MDL will be "chained," representing multiple /* GPA ranges, then the resulting MDL will be "chained," representing multiple */
// VA ranges. /* VA ranges. */
//
#ifdef __cplusplus #ifdef __cplusplus
@ -203,10 +203,10 @@ typedef struct _VMESTABLISH_GPADL {
} VMESTABLISH_GPADL, *PVMESTABLISH_GPADL; } VMESTABLISH_GPADL, *PVMESTABLISH_GPADL;
//
// This is the format for a Teardown Gpadl packet, which indicates that the /* This is the format for a Teardown Gpadl packet, which indicates that the */
// GPADL handle in the Establish Gpadl packet will never be referenced again. /* GPADL handle in the Establish Gpadl packet will never be referenced again. */
//
#ifdef __cplusplus #ifdef __cplusplus
@ -221,14 +221,14 @@ typedef struct _VMTEARDOWN_GPADL {
#endif #endif
u32 Gpadl; u32 Gpadl;
u32 Reserved; // for alignment to a 8-byte boundary u32 Reserved; /* for alignment to a 8-byte boundary */
} VMTEARDOWN_GPADL, *PVMTEARDOWN_GPADL; } VMTEARDOWN_GPADL, *PVMTEARDOWN_GPADL;
//
// This is the format for a GPA-Direct packet, which contains a set of GPA /* This is the format for a GPA-Direct packet, which contains a set of GPA */
// ranges, in addition to commands and/or data. /* ranges, in addition to commands and/or data. */
//
#ifdef __cplusplus #ifdef __cplusplus
@ -250,9 +250,9 @@ typedef struct _VMDATA_GPA_DIRECT {
//
// This is the format for a Additional Data Packet. /* This is the format for a Additional Data Packet. */
//
#ifdef __cplusplus #ifdef __cplusplus
@ -318,5 +318,3 @@ typedef enum {
} VMBUS_PACKET_TYPE, *PVMBUS_PACKET_TYPE; } VMBUS_PACKET_TYPE, *PVMBUS_PACKET_TYPE;
#define VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED 1 #define VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED 1

View file

@ -25,8 +25,8 @@
#ifndef _LOGGING_H_ #ifndef _LOGGING_H_
#define _LOGGING_H_ #define _LOGGING_H_
//#include <linux/init.h> /* #include <linux/init.h> */
//#include <linux/module.h> /* #include <linux/module.h> */
#include "osd.h" #include "osd.h"
@ -52,7 +52,7 @@
INPUTVSC_DRV|\ INPUTVSC_DRV|\
BLKVSC_DRV) BLKVSC_DRV)
// Logging Level /* Logging Level */
#define ERROR_LVL 3 #define ERROR_LVL 3
#define WARNING_LVL 4 #define WARNING_LVL 4
#define INFO_LVL 6 #define INFO_LVL 6
@ -117,4 +117,4 @@ extern unsigned int vmbus_loglevel;
#define DPRINT_EXIT(mod) #define DPRINT_EXIT(mod)
#endif #endif
#endif //_LOGGING_H_ #endif /* _LOGGING_H_ */

View file

@ -36,17 +36,17 @@ typedef enum _NVSP_MESSAGE_TYPE
{ {
NvspMessageTypeNone = 0, NvspMessageTypeNone = 0,
//
// Init Messages /* Init Messages */
//
NvspMessageTypeInit = 1, NvspMessageTypeInit = 1,
NvspMessageTypeInitComplete = 2, NvspMessageTypeInitComplete = 2,
NvspVersionMessageStart = 100, NvspVersionMessageStart = 100,
//
// Version 1 Messages /* Version 1 Messages */
//
NvspMessage1TypeSendNdisVersion = NvspVersionMessageStart, NvspMessage1TypeSendNdisVersion = NvspVersionMessageStart,
NvspMessage1TypeSendReceiveBuffer, NvspMessage1TypeSendReceiveBuffer,
@ -60,10 +60,10 @@ typedef enum _NVSP_MESSAGE_TYPE
NvspMessage1TypeSendRNDISPacket, NvspMessage1TypeSendRNDISPacket,
NvspMessage1TypeSendRNDISPacketComplete, NvspMessage1TypeSendRNDISPacketComplete,
//
// This should be set to the number of messages for the version /* This should be set to the number of messages for the version */
// with the maximum number of messages. /* with the maximum number of messages. */
//
NvspNumMessagePerVersion = 9, NvspNumMessagePerVersion = 9,
} NVSP_MESSAGE_TYPE, *PNVSP_MESSAGE_TYPE; } NVSP_MESSAGE_TYPE, *PNVSP_MESSAGE_TYPE;
@ -87,27 +87,27 @@ typedef struct _NVSP_MESSAGE_HEADER
u32 MessageType; u32 MessageType;
} NVSP_MESSAGE_HEADER, *PNVSP_MESSAGE_HEADER; } NVSP_MESSAGE_HEADER, *PNVSP_MESSAGE_HEADER;
//
// Init Messages
//
// /* Init Messages */
// This message is used by the VSC to initialize the channel
// after the channels has been opened. This message should
// never include anything other then versioning (i.e. this
// message will be the same for ever). /* This message is used by the VSC to initialize the channel */
// /* after the channels has been opened. This message should */
/* never include anything other then versioning (i.e. this */
/* message will be the same for ever). */
typedef struct _NVSP_MESSAGE_INIT typedef struct _NVSP_MESSAGE_INIT
{ {
u32 MinProtocolVersion; u32 MinProtocolVersion;
u32 MaxProtocolVersion; u32 MaxProtocolVersion;
} NVSP_MESSAGE_INIT, *PNVSP_MESSAGE_INIT; } NVSP_MESSAGE_INIT, *PNVSP_MESSAGE_INIT;
//
// This message is used by the VSP to complete the initialization /* This message is used by the VSP to complete the initialization */
// of the channel. This message should never include anything other /* of the channel. This message should never include anything other */
// then versioning (i.e. this message will be the same for ever). /* then versioning (i.e. this message will be the same for ever). */
//
typedef struct _NVSP_MESSAGE_INIT_COMPLETE typedef struct _NVSP_MESSAGE_INIT_COMPLETE
{ {
u32 NegotiatedProtocolVersion; u32 NegotiatedProtocolVersion;
@ -121,26 +121,26 @@ typedef union _NVSP_MESSAGE_INIT_UBER
NVSP_MESSAGE_INIT_COMPLETE InitComplete; NVSP_MESSAGE_INIT_COMPLETE InitComplete;
} NVSP_MESSAGE_INIT_UBER; } NVSP_MESSAGE_INIT_UBER;
//
// Version 1 Messages
//
// /* Version 1 Messages */
// This message is used by the VSC to send the NDIS version
// to the VSP. The VSP can use this information when handling
// OIDs sent by the VSC.
// /* This message is used by the VSC to send the NDIS version */
/* to the VSP. The VSP can use this information when handling */
/* OIDs sent by the VSC. */
typedef struct _NVSP_1_MESSAGE_SEND_NDIS_VERSION typedef struct _NVSP_1_MESSAGE_SEND_NDIS_VERSION
{ {
u32 NdisMajorVersion; u32 NdisMajorVersion;
u32 NdisMinorVersion; u32 NdisMinorVersion;
} NVSP_1_MESSAGE_SEND_NDIS_VERSION, *PNVSP_1_MESSAGE_SEND_NDIS_VERSION; } NVSP_1_MESSAGE_SEND_NDIS_VERSION, *PNVSP_1_MESSAGE_SEND_NDIS_VERSION;
//
// This message is used by the VSC to send a receive buffer /* This message is used by the VSC to send a receive buffer */
// to the VSP. The VSP can then use the receive buffer to /* to the VSP. The VSP can then use the receive buffer to */
// send data to the VSC. /* send data to the VSC. */
//
typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER
{ {
GPADL_HANDLE GpadlHandle; GPADL_HANDLE GpadlHandle;
@ -155,117 +155,117 @@ typedef struct _NVSP_1_RECEIVE_BUFFER_SECTION
u32 EndOffset; u32 EndOffset;
} NVSP_1_RECEIVE_BUFFER_SECTION, *PNVSP_1_RECEIVE_BUFFER_SECTION; } NVSP_1_RECEIVE_BUFFER_SECTION, *PNVSP_1_RECEIVE_BUFFER_SECTION;
//
// This message is used by the VSP to acknowledge a receive /* This message is used by the VSP to acknowledge a receive */
// buffer send by the VSC. This message must be sent by the /* buffer send by the VSC. This message must be sent by the */
// VSP before the VSP uses the receive buffer. /* VSP before the VSP uses the receive buffer. */
//
typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE
{ {
u32 Status; u32 Status;
u32 NumSections; u32 NumSections;
//
// The receive buffer is split into two parts, a large /* The receive buffer is split into two parts, a large */
// suballocation section and a small suballocation /* suballocation section and a small suballocation */
// section. These sections are then suballocated by a /* section. These sections are then suballocated by a */
// certain size. /* certain size. */
//
// For example, the following break up of the receive /* For example, the following break up of the receive */
// buffer has 6 large suballocations and 10 small /* buffer has 6 large suballocations and 10 small */
// suballocations. /* suballocations. */
//
// | Large Section | | Small Section | /* | Large Section | | Small Section | */
// ------------------------------------------------------------ /* ------------------------------------------------------------ */
// | | | | | | | | | | | | | | | | | | /* | | | | | | | | | | | | | | | | | | */
// | | /* | | */
// LargeOffset SmallOffset /* LargeOffset SmallOffset */
//
NVSP_1_RECEIVE_BUFFER_SECTION Sections[1]; NVSP_1_RECEIVE_BUFFER_SECTION Sections[1];
} NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE; } NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE;
//
// This message is sent by the VSC to revoke the receive buffer. /* This message is sent by the VSC to revoke the receive buffer. */
// After the VSP completes this transaction, the vsp should never /* After the VSP completes this transaction, the vsp should never */
// use the receive buffer again. /* use the receive buffer again. */
//
typedef struct _NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER typedef struct _NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER
{ {
u16 Id; u16 Id;
} NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER; } NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER;
//
// This message is used by the VSC to send a send buffer /* This message is used by the VSC to send a send buffer */
// to the VSP. The VSC can then use the send buffer to /* to the VSP. The VSC can then use the send buffer to */
// send data to the VSP. /* send data to the VSP. */
//
typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER
{ {
GPADL_HANDLE GpadlHandle; GPADL_HANDLE GpadlHandle;
u16 Id; u16 Id;
} NVSP_1_MESSAGE_SEND_SEND_BUFFER, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER; } NVSP_1_MESSAGE_SEND_SEND_BUFFER, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER;
//
// This message is used by the VSP to acknowledge a send /* This message is used by the VSP to acknowledge a send */
// buffer sent by the VSC. This message must be sent by the /* buffer sent by the VSC. This message must be sent by the */
// VSP before the VSP uses the sent buffer. /* VSP before the VSP uses the sent buffer. */
//
typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE
{ {
u32 Status; u32 Status;
//
// The VSC gets to choose the size of the send buffer and /* The VSC gets to choose the size of the send buffer and */
// the VSP gets to choose the sections size of the buffer. /* the VSP gets to choose the sections size of the buffer. */
// This was done to enable dynamic reconfigurations when /* This was done to enable dynamic reconfigurations when */
// the cost of GPA-direct buffers decreases. /* the cost of GPA-direct buffers decreases. */
//
u32 SectionSize; u32 SectionSize;
} NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE; } NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE;
//
// This message is sent by the VSC to revoke the send buffer. /* This message is sent by the VSC to revoke the send buffer. */
// After the VSP completes this transaction, the vsp should never /* After the VSP completes this transaction, the vsp should never */
// use the send buffer again. /* use the send buffer again. */
//
typedef struct _NVSP_1_MESSAGE_REVOKE_SEND_BUFFER typedef struct _NVSP_1_MESSAGE_REVOKE_SEND_BUFFER
{ {
u16 Id; u16 Id;
} NVSP_1_MESSAGE_REVOKE_SEND_BUFFER, *PNVSP_1_MESSAGE_REVOKE_SEND_BUFFER; } NVSP_1_MESSAGE_REVOKE_SEND_BUFFER, *PNVSP_1_MESSAGE_REVOKE_SEND_BUFFER;
//
// This message is used by both the VSP and the VSC to send /* This message is used by both the VSP and the VSC to send */
// a RNDIS message to the opposite channel endpoint. /* a RNDIS message to the opposite channel endpoint. */
//
typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET
{ {
//
// This field is specified by RNIDS. They assume there's /* This field is specified by RNIDS. They assume there's */
// two different channels of communication. However, /* two different channels of communication. However, */
// the Network VSP only has one. Therefore, the channel /* the Network VSP only has one. Therefore, the channel */
// travels with the RNDIS packet. /* travels with the RNDIS packet. */
//
u32 ChannelType; u32 ChannelType;
//
// This field is used to send part or all of the data /* This field is used to send part or all of the data */
// through a send buffer. This values specifies an /* through a send buffer. This values specifies an */
// index into the send buffer. If the index is /* index into the send buffer. If the index is */
// 0xFFFFFFFF, then the send buffer is not being used /* 0xFFFFFFFF, then the send buffer is not being used */
// and all of the data was sent through other VMBus /* and all of the data was sent through other VMBus */
// mechanisms. /* mechanisms. */
//
u32 SendBufferSectionIndex; u32 SendBufferSectionIndex;
u32 SendBufferSectionSize; u32 SendBufferSectionSize;
} NVSP_1_MESSAGE_SEND_RNDIS_PACKET, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET; } NVSP_1_MESSAGE_SEND_RNDIS_PACKET, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET;
//
// This message is used by both the VSP and the VSC to complete /* This message is used by both the VSP and the VSC to complete */
// a RNDIS message to the opposite channel endpoint. At this /* a RNDIS message to the opposite channel endpoint. At this */
// point, the initiator of this message cannot use any resources /* point, the initiator of this message cannot use any resources */
// associated with the original RNDIS packet. /* associated with the original RNDIS packet. */
//
typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE
{ {
u32 Status; u32 Status;
@ -294,9 +294,9 @@ typedef union _NVSP_ALL_MESSAGES
} NVSP_ALL_MESSAGES; } NVSP_ALL_MESSAGES;
//
// ALL Messages /* ALL Messages */
//
typedef struct _NVSP_MESSAGE typedef struct _NVSP_MESSAGE
{ {
NVSP_MESSAGE_HEADER Header; NVSP_MESSAGE_HEADER Header;

View file

@ -25,9 +25,9 @@
#ifndef _OSD_H_ #ifndef _OSD_H_
#define _OSD_H_ #define _OSD_H_
//
// Defines /* Defines */
//
#define ALIGN_UP(value, align) ( ((value) & (align-1))? ( ((value) + (align-1)) & ~(align-1) ): (value) ) #define ALIGN_UP(value, align) ( ((value) & (align-1))? ( ((value) + (align-1)) & ~(align-1) ): (value) )
@ -42,10 +42,10 @@ typedef struct _DLIST_ENTRY {
struct _DLIST_ENTRY *Blink; struct _DLIST_ENTRY *Blink;
} DLIST_ENTRY; } DLIST_ENTRY;
//
// Other types /* Other types */
//
//typedef unsigned char GUID[16]; /* typedef unsigned char GUID[16]; */
typedef void* HANDLE; typedef void* HANDLE;
typedef struct { typedef struct {
@ -95,9 +95,9 @@ static inline void do_cpuid(unsigned int op, unsigned int *eax, unsigned int *eb
__asm__ __volatile__("cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "0" (op), "c" (ecx)); __asm__ __volatile__("cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "0" (op), "c" (ecx));
} }
//
// Osd routines /* Osd routines */
//
extern void BitSet(unsigned int* addr, int value); extern void BitSet(unsigned int* addr, int value);
extern void BitClear(unsigned int* addr, int value); extern void BitClear(unsigned int* addr, int value);
extern int BitTest(unsigned int* addr, int value); extern int BitTest(unsigned int* addr, int value);
@ -127,7 +127,7 @@ extern void WaitEventClose(HANDLE hWait);
extern void WaitEventSet(HANDLE hWait); extern void WaitEventSet(HANDLE hWait);
extern int WaitEventWait(HANDLE hWait); extern int WaitEventWait(HANDLE hWait);
// If >0, hWait got signaled. If ==0, timeout. If < 0, error /* If >0, hWait got signaled. If ==0, timeout. If < 0, error */
extern int WaitEventWaitEx(HANDLE hWait, u32 TimeoutInMs); extern int WaitEventWaitEx(HANDLE hWait, u32 TimeoutInMs);
@ -149,4 +149,4 @@ extern int WorkQueueQueueWorkItem(HANDLE hWorkQueue, PFN_WORKITEM_CALLBACK workI
extern void QueueWorkItem(PFN_WORKITEM_CALLBACK workItem, void* context); extern void QueueWorkItem(PFN_WORKITEM_CALLBACK workItem, void* context);
#endif // _OSD_H_ #endif /* _OSD_H_ */

View file

@ -25,9 +25,9 @@
#ifndef _RNDIS_H_ #ifndef _RNDIS_H_
#define _RNDIS_H_ #define _RNDIS_H_
//
// Basic types /* Basic types */
//
typedef u32 RNDIS_REQUEST_ID; typedef u32 RNDIS_REQUEST_ID;
typedef u32 RNDIS_HANDLE; typedef u32 RNDIS_HANDLE;
typedef u32 RNDIS_STATUS; typedef u32 RNDIS_STATUS;
@ -44,9 +44,9 @@ typedef u32 *PRNDIS_CLASS_ID;
typedef u32 *PRNDIS_MEDIUM; typedef u32 *PRNDIS_MEDIUM;
typedef u32 RNDIS_AF; typedef u32 RNDIS_AF;
//
// Status codes /* Status codes */
//
#ifndef STATUS_SUCCESS #ifndef STATUS_SUCCESS
#define STATUS_SUCCESS (0x00000000L) #define STATUS_SUCCESS (0x00000000L)
@ -150,13 +150,13 @@ typedef u32 RNDIS_AF;
#define RNDIS_STATUS_TOKEN_RING_OPEN_ERROR ((RNDIS_STATUS)0xC0011000L) #define RNDIS_STATUS_TOKEN_RING_OPEN_ERROR ((RNDIS_STATUS)0xC0011000L)
//
// Object Identifiers used by NdisRequest Query/Set Information
//
// /* Object Identifiers used by NdisRequest Query/Set Information */
// General Objects
//
/* General Objects */
#define RNDIS_OID_GEN_SUPPORTED_LIST 0x00010101 #define RNDIS_OID_GEN_SUPPORTED_LIST 0x00010101
#define RNDIS_OID_GEN_HARDWARE_STATUS 0x00010102 #define RNDIS_OID_GEN_HARDWARE_STATUS 0x00010102
@ -210,10 +210,10 @@ typedef u32 RNDIS_AF;
#define RNDIS_OID_GEN_GET_TIME_CAPS 0x0002020F #define RNDIS_OID_GEN_GET_TIME_CAPS 0x0002020F
#define RNDIS_OID_GEN_GET_NETCARD_TIME 0x00020210 #define RNDIS_OID_GEN_GET_NETCARD_TIME 0x00020210
//
// These are connection-oriented general OIDs. /* These are connection-oriented general OIDs. */
// These replace the above OIDs for connection-oriented media. /* These replace the above OIDs for connection-oriented media. */
//
#define RNDIS_OID_GEN_CO_SUPPORTED_LIST 0x00010101 #define RNDIS_OID_GEN_CO_SUPPORTED_LIST 0x00010101
#define RNDIS_OID_GEN_CO_HARDWARE_STATUS 0x00010102 #define RNDIS_OID_GEN_CO_HARDWARE_STATUS 0x00010102
#define RNDIS_OID_GEN_CO_MEDIA_SUPPORTED 0x00010103 #define RNDIS_OID_GEN_CO_MEDIA_SUPPORTED 0x00010103
@ -231,9 +231,9 @@ typedef u32 RNDIS_AF;
#define RNDIS_OID_GEN_CO_GET_TIME_CAPS 0x00010201 #define RNDIS_OID_GEN_CO_GET_TIME_CAPS 0x00010201
#define RNDIS_OID_GEN_CO_GET_NETCARD_TIME 0x00010202 #define RNDIS_OID_GEN_CO_GET_NETCARD_TIME 0x00010202
//
// These are connection-oriented statistics OIDs. /* These are connection-oriented statistics OIDs. */
//
#define RNDIS_OID_GEN_CO_XMIT_PDUS_OK 0x00020101 #define RNDIS_OID_GEN_CO_XMIT_PDUS_OK 0x00020101
#define RNDIS_OID_GEN_CO_RCV_PDUS_OK 0x00020102 #define RNDIS_OID_GEN_CO_RCV_PDUS_OK 0x00020102
#define RNDIS_OID_GEN_CO_XMIT_PDUS_ERROR 0x00020103 #define RNDIS_OID_GEN_CO_XMIT_PDUS_ERROR 0x00020103
@ -248,9 +248,9 @@ typedef u32 RNDIS_AF;
#define RNDIS_OID_GEN_CO_BYTES_XMIT_OUTSTANDING 0x00020205 #define RNDIS_OID_GEN_CO_BYTES_XMIT_OUTSTANDING 0x00020205
#define RNDIS_OID_GEN_CO_NETCARD_LOAD 0x00020206 #define RNDIS_OID_GEN_CO_NETCARD_LOAD 0x00020206
//
// These are objects for Connection-oriented media call-managers. /* These are objects for Connection-oriented media call-managers. */
//
#define RNDIS_OID_CO_ADD_PVC 0xFF000001 #define RNDIS_OID_CO_ADD_PVC 0xFF000001
#define RNDIS_OID_CO_DELETE_PVC 0xFF000002 #define RNDIS_OID_CO_DELETE_PVC 0xFF000002
#define RNDIS_OID_CO_GET_CALL_INFORMATION 0xFF000003 #define RNDIS_OID_CO_GET_CALL_INFORMATION 0xFF000003
@ -262,9 +262,9 @@ typedef u32 RNDIS_AF;
#define RNDIS_OID_CO_SIGNALING_DISABLED 0xFF000009 #define RNDIS_OID_CO_SIGNALING_DISABLED 0xFF000009
//
// 802.3 Objects (Ethernet) /* 802.3 Objects (Ethernet) */
//
#define RNDIS_OID_802_3_PERMANENT_ADDRESS 0x01010101 #define RNDIS_OID_802_3_PERMANENT_ADDRESS 0x01010101
#define RNDIS_OID_802_3_CURRENT_ADDRESS 0x01010102 #define RNDIS_OID_802_3_CURRENT_ADDRESS 0x01010102
@ -272,8 +272,8 @@ typedef u32 RNDIS_AF;
#define RNDIS_OID_802_3_MAXIMUM_LIST_SIZE 0x01010104 #define RNDIS_OID_802_3_MAXIMUM_LIST_SIZE 0x01010104
#define RNDIS_OID_802_3_MAC_OPTIONS 0x01010105 #define RNDIS_OID_802_3_MAC_OPTIONS 0x01010105
//
//
#define NDIS_802_3_MAC_OPTION_PRIORITY 0x00000001 #define NDIS_802_3_MAC_OPTION_PRIORITY 0x00000001
#define RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101 #define RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101
@ -289,9 +289,9 @@ typedef u32 RNDIS_AF;
#define RNDIS_OID_802_3_XMIT_LATE_COLLISIONS 0x01020207 #define RNDIS_OID_802_3_XMIT_LATE_COLLISIONS 0x01020207
//
// Remote NDIS message types /* Remote NDIS message types */
//
#define REMOTE_NDIS_PACKET_MSG 0x00000001 #define REMOTE_NDIS_PACKET_MSG 0x00000001
#define REMOTE_NDIS_INITIALIZE_MSG 0x00000002 #define REMOTE_NDIS_INITIALIZE_MSG 0x00000002
#define REMOTE_NDIS_HALT_MSG 0x00000003 #define REMOTE_NDIS_HALT_MSG 0x00000003
@ -308,7 +308,7 @@ typedef u32 RNDIS_AF;
#define REMOTE_CONDIS_INDICATE_STATUS_MSG 0x00008007 #define REMOTE_CONDIS_INDICATE_STATUS_MSG 0x00008007
// Remote NDIS message completion types /* Remote NDIS message completion types */
#define REMOTE_NDIS_INITIALIZE_CMPLT 0x80000002 #define REMOTE_NDIS_INITIALIZE_CMPLT 0x80000002
#define REMOTE_NDIS_QUERY_CMPLT 0x80000004 #define REMOTE_NDIS_QUERY_CMPLT 0x80000004
#define REMOTE_NDIS_SET_CMPLT 0x80000005 #define REMOTE_NDIS_SET_CMPLT 0x80000005
@ -320,24 +320,24 @@ typedef u32 RNDIS_AF;
#define REMOTE_CONDIS_MP_ACTIVATE_VC_CMPLT 0x80008005 #define REMOTE_CONDIS_MP_ACTIVATE_VC_CMPLT 0x80008005
#define REMOTE_CONDIS_MP_DEACTIVATE_VC_CMPLT 0x80008006 #define REMOTE_CONDIS_MP_DEACTIVATE_VC_CMPLT 0x80008006
//
// Reserved message type for private communication between lower-layer /* Reserved message type for private communication between lower-layer */
// host driver and remote device, if necessary. /* host driver and remote device, if necessary. */
//
#define REMOTE_NDIS_BUS_MSG 0xff000001 #define REMOTE_NDIS_BUS_MSG 0xff000001
//
// Defines for DeviceFlags in RNDIS_INITIALIZE_COMPLETE /* Defines for DeviceFlags in RNDIS_INITIALIZE_COMPLETE */
//
#define RNDIS_DF_CONNECTIONLESS 0x00000001 #define RNDIS_DF_CONNECTIONLESS 0x00000001
#define RNDIS_DF_CONNECTION_ORIENTED 0x00000002 #define RNDIS_DF_CONNECTION_ORIENTED 0x00000002
#define RNDIS_DF_RAW_DATA 0x00000004 #define RNDIS_DF_RAW_DATA 0x00000004
//
// Remote NDIS medium types. /* Remote NDIS medium types. */
//
#define RNdisMedium802_3 0x00000000 #define RNdisMedium802_3 0x00000000
#define RNdisMedium802_5 0x00000001 #define RNdisMedium802_5 0x00000001
#define RNdisMediumFddi 0x00000002 #define RNdisMediumFddi 0x00000002
@ -349,23 +349,23 @@ typedef u32 RNDIS_AF;
#define RNdisMediumWirelessWan 0x00000009 #define RNdisMediumWirelessWan 0x00000009
#define RNdisMediumIrda 0x0000000a #define RNdisMediumIrda 0x0000000a
#define RNdisMediumCoWan 0x0000000b #define RNdisMediumCoWan 0x0000000b
#define RNdisMediumMax 0x0000000d // Not a real medium, defined as an upper-bound #define RNdisMediumMax 0x0000000d /* Not a real medium, defined as an upper-bound */
/* Remote NDIS medium connection states. */
//
// Remote NDIS medium connection states.
//
#define RNdisMediaStateConnected 0x00000000 #define RNdisMediaStateConnected 0x00000000
#define RNdisMediaStateDisconnected 0x00000001 #define RNdisMediaStateDisconnected 0x00000001
//
// Remote NDIS version numbers /* Remote NDIS version numbers */
//
#define RNDIS_MAJOR_VERSION 0x00000001 #define RNDIS_MAJOR_VERSION 0x00000001
#define RNDIS_MINOR_VERSION 0x00000000 #define RNDIS_MINOR_VERSION 0x00000000
//
// NdisInitialize message /* NdisInitialize message */
//
typedef struct _RNDIS_INITIALIZE_REQUEST typedef struct _RNDIS_INITIALIZE_REQUEST
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -375,9 +375,9 @@ typedef struct _RNDIS_INITIALIZE_REQUEST
} RNDIS_INITIALIZE_REQUEST, *PRNDIS_INITIALIZE_REQUEST; } RNDIS_INITIALIZE_REQUEST, *PRNDIS_INITIALIZE_REQUEST;
//
// Response to NdisInitialize /* Response to NdisInitialize */
//
typedef struct _RNDIS_INITIALIZE_COMPLETE typedef struct _RNDIS_INITIALIZE_COMPLETE
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -394,10 +394,10 @@ typedef struct _RNDIS_INITIALIZE_COMPLETE
} RNDIS_INITIALIZE_COMPLETE, *PRNDIS_INITIALIZE_COMPLETE; } RNDIS_INITIALIZE_COMPLETE, *PRNDIS_INITIALIZE_COMPLETE;
//
// Call manager devices only: Information about an address family /* Call manager devices only: Information about an address family */
// supported by the device is appended to the response to NdisInitialize. /* supported by the device is appended to the response to NdisInitialize. */
//
typedef struct _RNDIS_CO_ADDRESS_FAMILY typedef struct _RNDIS_CO_ADDRESS_FAMILY
{ {
RNDIS_AF AddressFamily; RNDIS_AF AddressFamily;
@ -406,18 +406,18 @@ typedef struct _RNDIS_CO_ADDRESS_FAMILY
} RNDIS_CO_ADDRESS_FAMILY, *PRNDIS_CO_ADDRESS_FAMILY; } RNDIS_CO_ADDRESS_FAMILY, *PRNDIS_CO_ADDRESS_FAMILY;
//
// NdisHalt message /* NdisHalt message */
//
typedef struct _RNDIS_HALT_REQUEST typedef struct _RNDIS_HALT_REQUEST
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
} RNDIS_HALT_REQUEST, *PRNDIS_HALT_REQUEST; } RNDIS_HALT_REQUEST, *PRNDIS_HALT_REQUEST;
//
// NdisQueryRequest message /* NdisQueryRequest message */
//
typedef struct _RNDIS_QUERY_REQUEST typedef struct _RNDIS_QUERY_REQUEST
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -428,9 +428,9 @@ typedef struct _RNDIS_QUERY_REQUEST
} RNDIS_QUERY_REQUEST, *PRNDIS_QUERY_REQUEST; } RNDIS_QUERY_REQUEST, *PRNDIS_QUERY_REQUEST;
//
// Response to NdisQueryRequest /* Response to NdisQueryRequest */
//
typedef struct _RNDIS_QUERY_COMPLETE typedef struct _RNDIS_QUERY_COMPLETE
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -440,9 +440,9 @@ typedef struct _RNDIS_QUERY_COMPLETE
} RNDIS_QUERY_COMPLETE, *PRNDIS_QUERY_COMPLETE; } RNDIS_QUERY_COMPLETE, *PRNDIS_QUERY_COMPLETE;
//
// NdisSetRequest message /* NdisSetRequest message */
//
typedef struct _RNDIS_SET_REQUEST typedef struct _RNDIS_SET_REQUEST
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -453,9 +453,9 @@ typedef struct _RNDIS_SET_REQUEST
} RNDIS_SET_REQUEST, *PRNDIS_SET_REQUEST; } RNDIS_SET_REQUEST, *PRNDIS_SET_REQUEST;
//
// Response to NdisSetRequest /* Response to NdisSetRequest */
//
typedef struct _RNDIS_SET_COMPLETE typedef struct _RNDIS_SET_COMPLETE
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -463,17 +463,17 @@ typedef struct _RNDIS_SET_COMPLETE
} RNDIS_SET_COMPLETE, *PRNDIS_SET_COMPLETE; } RNDIS_SET_COMPLETE, *PRNDIS_SET_COMPLETE;
//
// NdisReset message /* NdisReset message */
//
typedef struct _RNDIS_RESET_REQUEST typedef struct _RNDIS_RESET_REQUEST
{ {
u32 Reserved; u32 Reserved;
} RNDIS_RESET_REQUEST, *PRNDIS_RESET_REQUEST; } RNDIS_RESET_REQUEST, *PRNDIS_RESET_REQUEST;
//
// Response to NdisReset /* Response to NdisReset */
//
typedef struct _RNDIS_RESET_COMPLETE typedef struct _RNDIS_RESET_COMPLETE
{ {
RNDIS_STATUS Status; RNDIS_STATUS Status;
@ -481,9 +481,9 @@ typedef struct _RNDIS_RESET_COMPLETE
} RNDIS_RESET_COMPLETE, *PRNDIS_RESET_COMPLETE; } RNDIS_RESET_COMPLETE, *PRNDIS_RESET_COMPLETE;
//
// NdisMIndicateStatus message /* NdisMIndicateStatus message */
//
typedef struct _RNDIS_INDICATE_STATUS typedef struct _RNDIS_INDICATE_STATUS
{ {
RNDIS_STATUS Status; RNDIS_STATUS Status;
@ -492,10 +492,10 @@ typedef struct _RNDIS_INDICATE_STATUS
} RNDIS_INDICATE_STATUS, *PRNDIS_INDICATE_STATUS; } RNDIS_INDICATE_STATUS, *PRNDIS_INDICATE_STATUS;
//
// Diagnostic information passed as the status buffer in /* Diagnostic information passed as the status buffer in */
// RNDIS_INDICATE_STATUS messages signifying error conditions. /* RNDIS_INDICATE_STATUS messages signifying error conditions. */
//
typedef struct _RNDIS_DIAGNOSTIC_INFO typedef struct _RNDIS_DIAGNOSTIC_INFO
{ {
RNDIS_STATUS DiagStatus; RNDIS_STATUS DiagStatus;
@ -504,18 +504,18 @@ typedef struct _RNDIS_DIAGNOSTIC_INFO
//
// NdisKeepAlive message /* NdisKeepAlive message */
//
typedef struct _RNDIS_KEEPALIVE_REQUEST typedef struct _RNDIS_KEEPALIVE_REQUEST
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
} RNDIS_KEEPALIVE_REQUEST, *PRNDIS_KEEPALIVE_REQUEST; } RNDIS_KEEPALIVE_REQUEST, *PRNDIS_KEEPALIVE_REQUEST;
//
// Response to NdisKeepAlive /* Response to NdisKeepAlive */
//
typedef struct _RNDIS_KEEPALIVE_COMPLETE typedef struct _RNDIS_KEEPALIVE_COMPLETE
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -523,12 +523,12 @@ typedef struct _RNDIS_KEEPALIVE_COMPLETE
} RNDIS_KEEPALIVE_COMPLETE, *PRNDIS_KEEPALIVE_COMPLETE; } RNDIS_KEEPALIVE_COMPLETE, *PRNDIS_KEEPALIVE_COMPLETE;
//
// Data message. All Offset fields contain byte offsets from the beginning /* Data message. All Offset fields contain byte offsets from the beginning */
// of the RNDIS_PACKET structure. All Length fields are in bytes. /* of the RNDIS_PACKET structure. All Length fields are in bytes. */
// VcHandle is set to 0 for connectionless data, otherwise it /* VcHandle is set to 0 for connectionless data, otherwise it */
// contains the VC handle. /* contains the VC handle. */
//
typedef struct _RNDIS_PACKET typedef struct _RNDIS_PACKET
{ {
u32 DataOffset; u32 DataOffset;
@ -542,9 +542,9 @@ typedef struct _RNDIS_PACKET
u32 Reserved; u32 Reserved;
} RNDIS_PACKET, *PRNDIS_PACKET; } RNDIS_PACKET, *PRNDIS_PACKET;
//
// Optional Out of Band data associated with a Data message. /* Optional Out of Band data associated with a Data message. */
//
typedef struct _RNDIS_OOBD typedef struct _RNDIS_OOBD
{ {
u32 Size; u32 Size;
@ -552,9 +552,9 @@ typedef struct _RNDIS_OOBD
u32 ClassInformationOffset; u32 ClassInformationOffset;
} RNDIS_OOBD, *PRNDIS_OOBD; } RNDIS_OOBD, *PRNDIS_OOBD;
//
// Packet extension field contents associated with a Data message. /* Packet extension field contents associated with a Data message. */
//
typedef struct _RNDIS_PER_PACKET_INFO typedef struct _RNDIS_PER_PACKET_INFO
{ {
u32 Size; u32 Size;
@ -563,10 +563,10 @@ typedef struct _RNDIS_PER_PACKET_INFO
} RNDIS_PER_PACKET_INFO, *PRNDIS_PER_PACKET_INFO; } RNDIS_PER_PACKET_INFO, *PRNDIS_PER_PACKET_INFO;
//
// Format of Information buffer passed in a SetRequest for the OID /* Format of Information buffer passed in a SetRequest for the OID */
// OID_GEN_RNDIS_CONFIG_PARAMETER. /* OID_GEN_RNDIS_CONFIG_PARAMETER. */
//
typedef struct _RNDIS_CONFIG_PARAMETER_INFO typedef struct _RNDIS_CONFIG_PARAMETER_INFO
{ {
u32 ParameterNameOffset; u32 ParameterNameOffset;
@ -576,30 +576,30 @@ typedef struct _RNDIS_CONFIG_PARAMETER_INFO
u32 ParameterValueLength; u32 ParameterValueLength;
} RNDIS_CONFIG_PARAMETER_INFO, *PRNDIS_CONFIG_PARAMETER_INFO; } RNDIS_CONFIG_PARAMETER_INFO, *PRNDIS_CONFIG_PARAMETER_INFO;
//
// Values for ParameterType in RNDIS_CONFIG_PARAMETER_INFO /* Values for ParameterType in RNDIS_CONFIG_PARAMETER_INFO */
//
#define RNDIS_CONFIG_PARAM_TYPE_INTEGER 0 #define RNDIS_CONFIG_PARAM_TYPE_INTEGER 0
#define RNDIS_CONFIG_PARAM_TYPE_STRING 2 #define RNDIS_CONFIG_PARAM_TYPE_STRING 2
//
// CONDIS Miniport messages for connection oriented devices
// that do not implement a call manager.
//
// /* CONDIS Miniport messages for connection oriented devices */
// CoNdisMiniportCreateVc message /* that do not implement a call manager. */
//
/* CoNdisMiniportCreateVc message */
typedef struct _RCONDIS_MP_CREATE_VC typedef struct _RCONDIS_MP_CREATE_VC
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
RNDIS_HANDLE NdisVcHandle; RNDIS_HANDLE NdisVcHandle;
} RCONDIS_MP_CREATE_VC, *PRCONDIS_MP_CREATE_VC; } RCONDIS_MP_CREATE_VC, *PRCONDIS_MP_CREATE_VC;
//
// Response to CoNdisMiniportCreateVc /* Response to CoNdisMiniportCreateVc */
//
typedef struct _RCONDIS_MP_CREATE_VC_COMPLETE typedef struct _RCONDIS_MP_CREATE_VC_COMPLETE
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -608,18 +608,18 @@ typedef struct _RCONDIS_MP_CREATE_VC_COMPLETE
} RCONDIS_MP_CREATE_VC_COMPLETE, *PRCONDIS_MP_CREATE_VC_COMPLETE; } RCONDIS_MP_CREATE_VC_COMPLETE, *PRCONDIS_MP_CREATE_VC_COMPLETE;
//
// CoNdisMiniportDeleteVc message /* CoNdisMiniportDeleteVc message */
//
typedef struct _RCONDIS_MP_DELETE_VC typedef struct _RCONDIS_MP_DELETE_VC
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
RNDIS_HANDLE DeviceVcHandle; RNDIS_HANDLE DeviceVcHandle;
} RCONDIS_MP_DELETE_VC, *PRCONDIS_MP_DELETE_VC; } RCONDIS_MP_DELETE_VC, *PRCONDIS_MP_DELETE_VC;
//
// Response to CoNdisMiniportDeleteVc /* Response to CoNdisMiniportDeleteVc */
//
typedef struct _RCONDIS_MP_DELETE_VC_COMPLETE typedef struct _RCONDIS_MP_DELETE_VC_COMPLETE
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -627,9 +627,9 @@ typedef struct _RCONDIS_MP_DELETE_VC_COMPLETE
} RCONDIS_MP_DELETE_VC_COMPLETE, *PRCONDIS_MP_DELETE_VC_COMPLETE; } RCONDIS_MP_DELETE_VC_COMPLETE, *PRCONDIS_MP_DELETE_VC_COMPLETE;
//
// CoNdisMiniportQueryRequest message /* CoNdisMiniportQueryRequest message */
//
typedef struct _RCONDIS_MP_QUERY_REQUEST typedef struct _RCONDIS_MP_QUERY_REQUEST
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -641,9 +641,9 @@ typedef struct _RCONDIS_MP_QUERY_REQUEST
} RCONDIS_MP_QUERY_REQUEST, *PRCONDIS_MP_QUERY_REQUEST; } RCONDIS_MP_QUERY_REQUEST, *PRCONDIS_MP_QUERY_REQUEST;
//
// CoNdisMiniportSetRequest message /* CoNdisMiniportSetRequest message */
//
typedef struct _RCONDIS_MP_SET_REQUEST typedef struct _RCONDIS_MP_SET_REQUEST
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -655,9 +655,9 @@ typedef struct _RCONDIS_MP_SET_REQUEST
} RCONDIS_MP_SET_REQUEST, *PRCONDIS_MP_SET_REQUEST; } RCONDIS_MP_SET_REQUEST, *PRCONDIS_MP_SET_REQUEST;
//
// CoNdisIndicateStatus message /* CoNdisIndicateStatus message */
//
typedef struct _RCONDIS_INDICATE_STATUS typedef struct _RCONDIS_INDICATE_STATUS
{ {
RNDIS_HANDLE NdisVcHandle; RNDIS_HANDLE NdisVcHandle;
@ -667,9 +667,9 @@ typedef struct _RCONDIS_INDICATE_STATUS
} RCONDIS_INDICATE_STATUS, *PRCONDIS_INDICATE_STATUS; } RCONDIS_INDICATE_STATUS, *PRCONDIS_INDICATE_STATUS;
//
// CONDIS Call/VC parameters /* CONDIS Call/VC parameters */
//
typedef struct _RCONDIS_SPECIFIC_PARAMETERS typedef struct _RCONDIS_SPECIFIC_PARAMETERS
{ {
@ -706,9 +706,9 @@ typedef struct _RCONDIS_CALL_MANAGER_PARAMETERS
RCONDIS_SPECIFIC_PARAMETERS CallMgrSpecific; RCONDIS_SPECIFIC_PARAMETERS CallMgrSpecific;
} RCONDIS_CALL_MANAGER_PARAMETERS, *PRCONDIS_CALL_MANAGER_PARAMETERS; } RCONDIS_CALL_MANAGER_PARAMETERS, *PRCONDIS_CALL_MANAGER_PARAMETERS;
//
// CoNdisMiniportActivateVc message /* CoNdisMiniportActivateVc message */
//
typedef struct _RCONDIS_MP_ACTIVATE_VC_REQUEST typedef struct _RCONDIS_MP_ACTIVATE_VC_REQUEST
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -720,9 +720,9 @@ typedef struct _RCONDIS_MP_ACTIVATE_VC_REQUEST
u32 CallMgrParamsLength; u32 CallMgrParamsLength;
} RCONDIS_MP_ACTIVATE_VC_REQUEST, *PRCONDIS_MP_ACTIVATE_VC_REQUEST; } RCONDIS_MP_ACTIVATE_VC_REQUEST, *PRCONDIS_MP_ACTIVATE_VC_REQUEST;
//
// Response to CoNdisMiniportActivateVc /* Response to CoNdisMiniportActivateVc */
//
typedef struct _RCONDIS_MP_ACTIVATE_VC_COMPLETE typedef struct _RCONDIS_MP_ACTIVATE_VC_COMPLETE
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -730,9 +730,9 @@ typedef struct _RCONDIS_MP_ACTIVATE_VC_COMPLETE
} RCONDIS_MP_ACTIVATE_VC_COMPLETE, *PRCONDIS_MP_ACTIVATE_VC_COMPLETE; } RCONDIS_MP_ACTIVATE_VC_COMPLETE, *PRCONDIS_MP_ACTIVATE_VC_COMPLETE;
//
// CoNdisMiniportDeactivateVc message /* CoNdisMiniportDeactivateVc message */
//
typedef struct _RCONDIS_MP_DEACTIVATE_VC_REQUEST typedef struct _RCONDIS_MP_DEACTIVATE_VC_REQUEST
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -740,9 +740,9 @@ typedef struct _RCONDIS_MP_DEACTIVATE_VC_REQUEST
RNDIS_HANDLE DeviceVcHandle; RNDIS_HANDLE DeviceVcHandle;
} RCONDIS_MP_DEACTIVATE_VC_REQUEST, *PRCONDIS_MP_DEACTIVATE_VC_REQUEST; } RCONDIS_MP_DEACTIVATE_VC_REQUEST, *PRCONDIS_MP_DEACTIVATE_VC_REQUEST;
//
// Response to CoNdisMiniportDeactivateVc /* Response to CoNdisMiniportDeactivateVc */
//
typedef struct _RCONDIS_MP_DEACTIVATE_VC_COMPLETE typedef struct _RCONDIS_MP_DEACTIVATE_VC_COMPLETE
{ {
RNDIS_REQUEST_ID RequestId; RNDIS_REQUEST_ID RequestId;
@ -750,9 +750,9 @@ typedef struct _RCONDIS_MP_DEACTIVATE_VC_COMPLETE
} RCONDIS_MP_DEACTIVATE_VC_COMPLETE, *PRCONDIS_MP_DEACTIVATE_VC_COMPLETE; } RCONDIS_MP_DEACTIVATE_VC_COMPLETE, *PRCONDIS_MP_DEACTIVATE_VC_COMPLETE;
//
// union with all of the RNDIS messages /* union with all of the RNDIS messages */
//
typedef union _RNDIS_MESSAGE_CONTAINER typedef union _RNDIS_MESSAGE_CONTAINER
{ {
RNDIS_PACKET Packet; RNDIS_PACKET Packet;
@ -781,56 +781,56 @@ typedef union _RNDIS_MESSAGE_CONTAINER
} RNDIS_MESSAGE_CONTAINER, *PRNDIS_MESSAGE_CONTAINER; } RNDIS_MESSAGE_CONTAINER, *PRNDIS_MESSAGE_CONTAINER;
//
// Remote NDIS message format /* Remote NDIS message format */
//
typedef __struct_bcount(MessageLength) struct _RNDIS_MESSAGE typedef __struct_bcount(MessageLength) struct _RNDIS_MESSAGE
{ {
u32 NdisMessageType; u32 NdisMessageType;
//
// Total length of this message, from the beginning /* Total length of this message, from the beginning */
// of the RNDIS_MESSAGE struct, in bytes. /* of the RNDIS_MESSAGE struct, in bytes. */
//
u32 MessageLength; u32 MessageLength;
// Actual message /* Actual message */
RNDIS_MESSAGE_CONTAINER Message; RNDIS_MESSAGE_CONTAINER Message;
} RNDIS_MESSAGE, *PRNDIS_MESSAGE; } RNDIS_MESSAGE, *PRNDIS_MESSAGE;
//
// Handy macros
// get the size of an RNDIS message. Pass in the message type, /* Handy macros */
// RNDIS_SET_REQUEST, RNDIS_PACKET for example
/* get the size of an RNDIS message. Pass in the message type, */
/* RNDIS_SET_REQUEST, RNDIS_PACKET for example */
#define RNDIS_MESSAGE_SIZE(Message) \ #define RNDIS_MESSAGE_SIZE(Message) \
(sizeof(Message) + (sizeof(RNDIS_MESSAGE) - sizeof(RNDIS_MESSAGE_CONTAINER))) (sizeof(Message) + (sizeof(RNDIS_MESSAGE) - sizeof(RNDIS_MESSAGE_CONTAINER)))
// get pointer to info buffer with message pointer /* get pointer to info buffer with message pointer */
#define MESSAGE_TO_INFO_BUFFER(Message) \ #define MESSAGE_TO_INFO_BUFFER(Message) \
(((unsigned char *)(Message)) + Message->InformationBufferOffset) (((unsigned char *)(Message)) + Message->InformationBufferOffset)
// get pointer to status buffer with message pointer /* get pointer to status buffer with message pointer */
#define MESSAGE_TO_STATUS_BUFFER(Message) \ #define MESSAGE_TO_STATUS_BUFFER(Message) \
(((unsigned char *)(Message)) + Message->StatusBufferOffset) (((unsigned char *)(Message)) + Message->StatusBufferOffset)
// get pointer to OOBD buffer with message pointer /* get pointer to OOBD buffer with message pointer */
#define MESSAGE_TO_OOBD_BUFFER(Message) \ #define MESSAGE_TO_OOBD_BUFFER(Message) \
(((unsigned char *)(Message)) + Message->OOBDataOffset) (((unsigned char *)(Message)) + Message->OOBDataOffset)
// get pointer to data buffer with message pointer /* get pointer to data buffer with message pointer */
#define MESSAGE_TO_DATA_BUFFER(Message) \ #define MESSAGE_TO_DATA_BUFFER(Message) \
(((unsigned char *)(Message)) + Message->PerPacketInfoOffset) (((unsigned char *)(Message)) + Message->PerPacketInfoOffset)
// get pointer to contained message from NDIS_MESSAGE pointer /* get pointer to contained message from NDIS_MESSAGE pointer */
#define RNDIS_MESSAGE_PTR_TO_MESSAGE_PTR(RndisMessage) \ #define RNDIS_MESSAGE_PTR_TO_MESSAGE_PTR(RndisMessage) \
((void *) &RndisMessage->Message) ((void *) &RndisMessage->Message)
// get pointer to contained message from NDIS_MESSAGE pointer /* get pointer to contained message from NDIS_MESSAGE pointer */
#define RNDIS_MESSAGE_RAW_PTR_TO_MESSAGE_PTR(RndisMessage) \ #define RNDIS_MESSAGE_RAW_PTR_TO_MESSAGE_PTR(RndisMessage) \
((void *) RndisMessage) ((void *) RndisMessage)
#endif // _RNDIS_H_ #endif /* _RNDIS_H_ */

View file

@ -29,9 +29,9 @@
#include "VmbusApi.h" #include "VmbusApi.h"
//
// Data types /* Data types */
//
typedef int (*PFN_DRIVERINITIALIZE)(DRIVER_OBJECT *drv); typedef int (*PFN_DRIVERINITIALIZE)(DRIVER_OBJECT *drv);
typedef int (*PFN_DRIVEREXIT)(DRIVER_OBJECT *drv); typedef int (*PFN_DRIVEREXIT)(DRIVER_OBJECT *drv);
@ -41,7 +41,7 @@ struct driver_context {
struct device_driver driver; struct device_driver driver;
// Use these methods instead of the struct device_driver so 2.6 kernel stops complaining /* Use these methods instead of the struct device_driver so 2.6 kernel stops complaining */
int (*probe)(struct device *); int (*probe)(struct device *);
int (*remove)(struct device *); int (*remove)(struct device *);
void (*shutdown)(struct device *); void (*shutdown)(struct device *);
@ -57,13 +57,13 @@ struct device_context {
}; };
//
// Global
//
// /* Global */
// Inlines
//
/* Inlines */
static inline struct device_context *to_device_context(DEVICE_OBJECT *device_obj) static inline struct device_context *to_device_context(DEVICE_OBJECT *device_obj)
{ {
return container_of(device_obj, struct device_context, device_obj); return container_of(device_obj, struct device_context, device_obj);
@ -79,9 +79,9 @@ static inline struct driver_context *driver_to_driver_context(struct device_driv
return container_of(driver, struct driver_context, driver); return container_of(driver, struct driver_context, driver);
} }
//
// Vmbus interface /* Vmbus interface */
//
void void
vmbus_child_driver_register( vmbus_child_driver_register(
struct driver_context* driver_ctx struct driver_context* driver_ctx
@ -97,4 +97,4 @@ vmbus_get_interface(
VMBUS_CHANNEL_INTERFACE *interface VMBUS_CHANNEL_INTERFACE *interface
); );
#endif // _VMBUS_H_ #endif /* _VMBUS_H_ */

View file

@ -24,28 +24,28 @@
#pragma once #pragma once
//#include <vmbuspacketformat.h> /* #include <vmbuspacketformat.h> */
//#include <ntddscsi.h> /* #include <ntddscsi.h> */
#define C_ASSERT(x) #define C_ASSERT(x)
//
// public interface to the server
//
// /* public interface to the server */
// Storvsp device interface guid
//
//
// Protocol versions.
//
// /* Storvsp device interface guid */
// vstorage.w revision number. This is used in the case of a version match,
// to alert the user that structure sizes may be mismatched even though the
// protocol versions match.
//
/* Protocol versions. */
/* vstorage.w revision number. This is used in the case of a version match, */
/* to alert the user that structure sizes may be mismatched even though the */
/* protocol versions match. */
#define REVISION_STRING(REVISION_) #REVISION_ #define REVISION_STRING(REVISION_) #REVISION_
#define FILL_VMSTOR_REVISION(RESULT_LVALUE_) \ #define FILL_VMSTOR_REVISION(RESULT_LVALUE_) \
@ -54,53 +54,53 @@
RESULT_LVALUE_ = 0; \ RESULT_LVALUE_ = 0; \
while (*revisionString >= '0' && *revisionString <= '9') \ while (*revisionString >= '0' && *revisionString <= '9') \
{ \ { \
RESULT_LVALUE_ *= 10; \ RESULT_LVALUE_ *= 10; \
RESULT_LVALUE_ += *revisionString - '0'; \ RESULT_LVALUE_ += *revisionString - '0'; \
revisionString++; \ revisionString++; \
} \ } \
} }
//
// Major/minor macros. Minor version is in LSB, meaning that earlier flat /* Major/minor macros. Minor version is in LSB, meaning that earlier flat */
// version numbers will be interpreted as "0.x" (i.e., 1 becomes 0.1). /* version numbers will be interpreted as "0.x" (i.e., 1 becomes 0.1). */
//
#define VMSTOR_PROTOCOL_MAJOR(VERSION_) (((VERSION_) >> 8) & 0xff) #define VMSTOR_PROTOCOL_MAJOR(VERSION_) (((VERSION_) >> 8) & 0xff)
#define VMSTOR_PROTOCOL_MINOR(VERSION_) (((VERSION_) ) & 0xff) #define VMSTOR_PROTOCOL_MINOR(VERSION_) (((VERSION_) ) & 0xff)
#define VMSTOR_PROTOCOL_VERSION(MAJOR_, MINOR_) ((((MAJOR_) & 0xff) << 8) | \ #define VMSTOR_PROTOCOL_VERSION(MAJOR_, MINOR_) ((((MAJOR_) & 0xff) << 8) | \
(((MINOR_) & 0xff) )) (((MINOR_) & 0xff) ))
/* Invalid version. */
//
// Invalid version.
//
#define VMSTOR_INVALID_PROTOCOL_VERSION -1 #define VMSTOR_INVALID_PROTOCOL_VERSION -1
//
// Version history: /* Version history: */
// V1 Beta 0.1 /* V1 Beta 0.1 */
// V1 RC < 2008/1/31 1.0 /* V1 RC < 2008/1/31 1.0 */
// V1 RC > 2008/1/31 2.0 /* V1 RC > 2008/1/31 2.0 */
//
#define VMSTOR_PROTOCOL_VERSION_CURRENT VMSTOR_PROTOCOL_VERSION(2, 0) #define VMSTOR_PROTOCOL_VERSION_CURRENT VMSTOR_PROTOCOL_VERSION(2, 0)
//
// This will get replaced with the max transfer length that is possible on /* This will get replaced with the max transfer length that is possible on */
// the host adapter. /* the host adapter. */
// The max transfer length will be published when we offer a vmbus channel. /* The max transfer length will be published when we offer a vmbus channel. */
//
#define MAX_TRANSFER_LENGTH 0x40000 #define MAX_TRANSFER_LENGTH 0x40000
#define DEFAULT_PACKET_SIZE (sizeof(VMDATA_GPA_DIRECT) + \ #define DEFAULT_PACKET_SIZE (sizeof(VMDATA_GPA_DIRECT) + \
sizeof(VSTOR_PACKET) + \ sizeof(VSTOR_PACKET) + \
(sizeof(u64) * (MAX_TRANSFER_LENGTH / PAGE_SIZE))) (sizeof(u64) * (MAX_TRANSFER_LENGTH / PAGE_SIZE)))
//
// Packet structure describing virtual storage requests. /* Packet structure describing virtual storage requests. */
//
typedef enum typedef enum
{ {
@ -119,11 +119,11 @@ typedef enum
} VSTOR_PACKET_OPERATION; } VSTOR_PACKET_OPERATION;
//
// Platform neutral description of a scsi request - /* Platform neutral description of a scsi request - */
// this remains the same across the write regardless of 32/64 bit /* this remains the same across the write regardless of 32/64 bit */
// note: it's patterned off the SCSI_PASS_THROUGH structure /* note: it's patterned off the SCSI_PASS_THROUGH structure */
//
#pragma pack(push,1) #pragma pack(push,1)
@ -159,11 +159,11 @@ typedef struct
union union
{ {
unsigned char Cdb[CDB16GENERIC_LENGTH]; unsigned char Cdb[CDB16GENERIC_LENGTH];
unsigned char SenseData[SENSE_BUFFER_SIZE]; unsigned char SenseData[SENSE_BUFFER_SIZE];
unsigned char ReservedArray[MAX_DATA_BUFFER_LENGTH_WITH_PADDING]; unsigned char ReservedArray[MAX_DATA_BUFFER_LENGTH_WITH_PADDING];
}; };
} VMSCSI_REQUEST, *PVMSCSI_REQUEST; } VMSCSI_REQUEST, *PVMSCSI_REQUEST;
@ -171,10 +171,10 @@ typedef struct
C_ASSERT((sizeof(VMSCSI_REQUEST) % 4) == 0); C_ASSERT((sizeof(VMSCSI_REQUEST) % 4) == 0);
//
// This structure is sent during the intialization phase to get the different /* This structure is sent during the intialization phase to get the different */
// properties of the channel. /* properties of the channel. */
//
typedef struct typedef struct
{ {
@ -182,19 +182,19 @@ typedef struct
unsigned char PathId; unsigned char PathId;
unsigned char TargetId; unsigned char TargetId;
//
// Note: port number is only really known on the client side /* Note: port number is only really known on the client side */
//
unsigned int PortNumber; unsigned int PortNumber;
unsigned int Flags; unsigned int Flags;
unsigned int MaxTransferBytes; unsigned int MaxTransferBytes;
//
// This id is unique for each channel and will correspond with /* This id is unique for each channel and will correspond with */
// vendor specific data in the inquirydata /* vendor specific data in the inquirydata */
//
unsigned long long UniqueId; unsigned long long UniqueId;
@ -203,24 +203,24 @@ typedef struct
C_ASSERT((sizeof(VMSTORAGE_CHANNEL_PROPERTIES) % 4) == 0); C_ASSERT((sizeof(VMSTORAGE_CHANNEL_PROPERTIES) % 4) == 0);
//
// This structure is sent during the storage protocol negotiations. /* This structure is sent during the storage protocol negotiations. */
//
typedef struct typedef struct
{ {
//
// Major (MSW) and minor (LSW) version numbers. /* Major (MSW) and minor (LSW) version numbers. */
//
unsigned short MajorMinor; unsigned short MajorMinor;
//
// Revision number is auto-incremented whenever this file is changed /* Revision number is auto-incremented whenever this file is changed */
// (See FILL_VMSTOR_REVISION macro above). Mismatch does not definitely /* (See FILL_VMSTOR_REVISION macro above). Mismatch does not definitely */
// indicate incompatibility--but it does indicate mismatched builds. /* indicate incompatibility--but it does indicate mismatched builds. */
//
unsigned short Revision; unsigned short Revision;
@ -229,9 +229,9 @@ typedef struct
C_ASSERT((sizeof(VMSTORAGE_PROTOCOL_VERSION) % 4) == 0); C_ASSERT((sizeof(VMSTORAGE_PROTOCOL_VERSION) % 4) == 0);
//
// Channel Property Flags /* Channel Property Flags */
//
#define STORAGE_CHANNEL_REMOVABLE_FLAG 0x1 #define STORAGE_CHANNEL_REMOVABLE_FLAG 0x1
#define STORAGE_CHANNEL_EMULATED_IDE_FLAG 0x2 #define STORAGE_CHANNEL_EMULATED_IDE_FLAG 0x2
@ -239,71 +239,69 @@ C_ASSERT((sizeof(VMSTORAGE_PROTOCOL_VERSION) % 4) == 0);
typedef struct _VSTOR_PACKET typedef struct _VSTOR_PACKET
{ {
//
// Requested operation type /* Requested operation type */
//
VSTOR_PACKET_OPERATION Operation; VSTOR_PACKET_OPERATION Operation;
//
// Flags - see below for values /* Flags - see below for values */
//
unsigned int Flags; unsigned int Flags;
//
// Status of the request returned from the server side. /* Status of the request returned from the server side. */
//
unsigned int Status; unsigned int Status;
//
// Data payload area /* Data payload area */
//
union union
{ {
//
// Structure used to forward SCSI commands from the client to the server.
//
VMSCSI_REQUEST VmSrb; /* Structure used to forward SCSI commands from the client to the server. */
//
// Structure used to query channel properties.
//
VMSTORAGE_CHANNEL_PROPERTIES StorageChannelProperties; VMSCSI_REQUEST VmSrb;
//
// Used during version negotiations.
//
VMSTORAGE_PROTOCOL_VERSION Version; /* Structure used to query channel properties. */
VMSTORAGE_CHANNEL_PROPERTIES StorageChannelProperties;
/* Used during version negotiations. */
VMSTORAGE_PROTOCOL_VERSION Version;
}; };
} VSTOR_PACKET, *PVSTOR_PACKET; } VSTOR_PACKET, *PVSTOR_PACKET;
C_ASSERT((sizeof(VSTOR_PACKET) % 4) == 0); C_ASSERT((sizeof(VSTOR_PACKET) % 4) == 0);
//
// Packet flags
//
// /* Packet flags */
// This flag indicates that the server should send back a completion for this
// packet.
//
/* This flag indicates that the server should send back a completion for this */
/* packet. */
#define REQUEST_COMPLETION_FLAG 0x1 #define REQUEST_COMPLETION_FLAG 0x1
//
// This is the set of flags that the vsc can set in any packets it sends /* This is the set of flags that the vsc can set in any packets it sends */
//
#define VSC_LEGAL_FLAGS (REQUEST_COMPLETION_FLAG) #define VSC_LEGAL_FLAGS (REQUEST_COMPLETION_FLAG)
#pragma pack(pop) #pragma pack(pop)

View file

@ -43,9 +43,9 @@
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
//
// Static decl /* Static decl */
//
static int netvsc_probe(struct device *device); static int netvsc_probe(struct device *device);
static int netvsc_remove(struct device *device); static int netvsc_remove(struct device *device);
static int netvsc_open(struct net_device *net); static int netvsc_open(struct net_device *net);
@ -56,32 +56,32 @@ static int netvsc_close(struct net_device *net);
static struct net_device_stats *netvsc_get_stats(struct net_device *net); static struct net_device_stats *netvsc_get_stats(struct net_device *net);
static void netvsc_linkstatus_callback(DEVICE_OBJECT *device_obj, unsigned int status); static void netvsc_linkstatus_callback(DEVICE_OBJECT *device_obj, unsigned int status);
//
// Data types /* Data types */
//
struct net_device_context { struct net_device_context {
struct device_context *device_ctx; // point back to our device context struct device_context *device_ctx; /* point back to our device context */
struct net_device_stats stats; struct net_device_stats stats;
}; };
struct netvsc_driver_context { struct netvsc_driver_context {
// !! These must be the first 2 fields !! /* !! These must be the first 2 fields !! */
struct driver_context drv_ctx; struct driver_context drv_ctx;
NETVSC_DRIVER_OBJECT drv_obj; NETVSC_DRIVER_OBJECT drv_obj;
}; };
//
// Globals /* Globals */
//
static int netvsc_ringbuffer_size = NETVSC_DEVICE_RING_BUFFER_SIZE; static int netvsc_ringbuffer_size = NETVSC_DEVICE_RING_BUFFER_SIZE;
// The one and only one /* The one and only one */
static struct netvsc_driver_context g_netvsc_drv; static struct netvsc_driver_context g_netvsc_drv;
//
// Routines /* Routines */
//
/*++ /*++
@ -104,7 +104,7 @@ int netvsc_drv_init(PFN_DRIVERINITIALIZE pfn_drv_init)
net_drv_obj->OnReceiveCallback = netvsc_recv_callback; net_drv_obj->OnReceiveCallback = netvsc_recv_callback;
net_drv_obj->OnLinkStatusChanged = netvsc_linkstatus_callback; net_drv_obj->OnLinkStatusChanged = netvsc_linkstatus_callback;
// Callback to client driver to complete the initialization /* Callback to client driver to complete the initialization */
pfn_drv_init(&net_drv_obj->Base); pfn_drv_init(&net_drv_obj->Base);
drv_ctx->driver.name = net_drv_obj->Base.name; drv_ctx->driver.name = net_drv_obj->Base.name;
@ -113,7 +113,7 @@ int netvsc_drv_init(PFN_DRIVERINITIALIZE pfn_drv_init)
drv_ctx->probe = netvsc_probe; drv_ctx->probe = netvsc_probe;
drv_ctx->remove = netvsc_remove; drv_ctx->remove = netvsc_remove;
// The driver belongs to vmbus /* The driver belongs to vmbus */
vmbus_child_driver_register(drv_ctx); vmbus_child_driver_register(drv_ctx);
DPRINT_EXIT(NETVSC_DRV); DPRINT_EXIT(NETVSC_DRV);
@ -186,13 +186,13 @@ static int netvsc_probe(struct device *device)
} }
net = alloc_netdev(sizeof(struct net_device_context), "seth%d", ether_setup); net = alloc_netdev(sizeof(struct net_device_context), "seth%d", ether_setup);
//net = alloc_etherdev(sizeof(struct net_device_context)); /* net = alloc_etherdev(sizeof(struct net_device_context)); */
if (!net) if (!net)
{ {
return -1; return -1;
} }
// Set initial state /* Set initial state */
netif_carrier_off(net); netif_carrier_off(net);
netif_stop_queue(net); netif_stop_queue(net);
@ -200,7 +200,7 @@ static int netvsc_probe(struct device *device)
net_device_ctx->device_ctx = device_ctx; net_device_ctx->device_ctx = device_ctx;
dev_set_drvdata(device, net); dev_set_drvdata(device, net);
// Notify the netvsc driver of the new device /* Notify the netvsc driver of the new device */
ret = net_drv_obj->Base.OnDeviceAdd(device_obj, (void*)&device_info); ret = net_drv_obj->Base.OnDeviceAdd(device_obj, (void*)&device_info);
if (ret != 0) if (ret != 0)
{ {
@ -211,8 +211,8 @@ static int netvsc_probe(struct device *device)
return ret; return ret;
} }
// If carrier is still off ie we did not get a link status callback, update it if necessary /* If carrier is still off ie we did not get a link status callback, update it if necessary */
// FIXME: We should use a atomic or test/set instead to avoid getting out of sync with the device's link status /* FIXME: We should use a atomic or test/set instead to avoid getting out of sync with the device's link status */
if (!netif_carrier_ok(net)) if (!netif_carrier_ok(net))
{ {
if (!device_info.LinkState) if (!device_info.LinkState)
@ -230,7 +230,7 @@ static int netvsc_probe(struct device *device)
ret = register_netdev(net); ret = register_netdev(net);
if (ret != 0) if (ret != 0)
{ {
// Remove the device and release the resource /* Remove the device and release the resource */
net_drv_obj->Base.OnDeviceRemove(device_obj); net_drv_obj->Base.OnDeviceRemove(device_obj);
free_netdev(net); free_netdev(net);
} }
@ -266,17 +266,17 @@ static int netvsc_remove(struct device *device)
return -1; return -1;
} }
// Stop outbound asap /* Stop outbound asap */
netif_stop_queue(net); netif_stop_queue(net);
//netif_carrier_off(net); /* netif_carrier_off(net); */
unregister_netdev(net); unregister_netdev(net);
// Call to the vsc driver to let it know that the device is being removed /* Call to the vsc driver to let it know that the device is being removed */
ret = net_drv_obj->Base.OnDeviceRemove(device_obj); ret = net_drv_obj->Base.OnDeviceRemove(device_obj);
if (ret != 0) if (ret != 0)
{ {
// TODO: /* TODO: */
DPRINT_ERR(NETVSC, "unable to remove vsc device (ret %d)", ret); DPRINT_ERR(NETVSC, "unable to remove vsc device (ret %d)", ret);
} }
@ -310,7 +310,7 @@ static int netvsc_open(struct net_device *net)
{ {
memset(&net_device_ctx->stats, 0 , sizeof(struct net_device_stats)); memset(&net_device_ctx->stats, 0 , sizeof(struct net_device_stats));
// Open up the device /* Open up the device */
ret = net_drv_obj->OnOpen(device_obj); ret = net_drv_obj->OnOpen(device_obj);
if (ret != 0) if (ret != 0)
{ {
@ -418,16 +418,16 @@ static int netvsc_start_xmit (struct sk_buff *skb, struct net_device *net)
DPRINT_ENTER(NETVSC_DRV); DPRINT_ENTER(NETVSC_DRV);
// Support only 1 chain of frags /* Support only 1 chain of frags */
ASSERT(skb_shinfo(skb)->frag_list == NULL); ASSERT(skb_shinfo(skb)->frag_list == NULL);
ASSERT(skb->dev == net); ASSERT(skb->dev == net);
DPRINT_DBG(NETVSC_DRV, "xmit packet - len %d data_len %d", skb->len, skb->data_len); DPRINT_DBG(NETVSC_DRV, "xmit packet - len %d data_len %d", skb->len, skb->data_len);
// Add 1 for skb->data and any additional ones requested /* Add 1 for skb->data and any additional ones requested */
num_frags = skb_shinfo(skb)->nr_frags + 1 + net_drv_obj->AdditionalRequestPageBufferCount; num_frags = skb_shinfo(skb)->nr_frags + 1 + net_drv_obj->AdditionalRequestPageBufferCount;
// Allocate a netvsc packet based on # of frags. /* Allocate a netvsc packet based on # of frags. */
packet = kzalloc(sizeof(NETVSC_PACKET) + (num_frags * sizeof(PAGE_BUFFER)) + net_drv_obj->RequestExtSize, GFP_ATOMIC); packet = kzalloc(sizeof(NETVSC_PACKET) + (num_frags * sizeof(PAGE_BUFFER)) + net_drv_obj->RequestExtSize, GFP_ATOMIC);
if (!packet) if (!packet)
{ {
@ -437,17 +437,17 @@ static int netvsc_start_xmit (struct sk_buff *skb, struct net_device *net)
packet->Extension = (void*)(unsigned long)packet + sizeof(NETVSC_PACKET) + (num_frags * sizeof(PAGE_BUFFER)) ; packet->Extension = (void*)(unsigned long)packet + sizeof(NETVSC_PACKET) + (num_frags * sizeof(PAGE_BUFFER)) ;
// Setup the rndis header /* Setup the rndis header */
packet->PageBufferCount = num_frags; packet->PageBufferCount = num_frags;
// TODO: Flush all write buffers/ memory fence ??? /* TODO: Flush all write buffers/ memory fence ??? */
//wmb(); /* wmb(); */
// Initialize it from the skb /* Initialize it from the skb */
ASSERT(skb->data); ASSERT(skb->data);
packet->TotalDataBufferLength = skb->len; packet->TotalDataBufferLength = skb->len;
// Start filling in the page buffers starting at AdditionalRequestPageBufferCount offset /* Start filling in the page buffers starting at AdditionalRequestPageBufferCount offset */
packet->PageBuffers[net_drv_obj->AdditionalRequestPageBufferCount].Pfn = virt_to_phys(skb->data) >> PAGE_SHIFT; packet->PageBuffers[net_drv_obj->AdditionalRequestPageBufferCount].Pfn = virt_to_phys(skb->data) >> PAGE_SHIFT;
packet->PageBuffers[net_drv_obj->AdditionalRequestPageBufferCount].Offset = (unsigned long)skb->data & (PAGE_SIZE -1); packet->PageBuffers[net_drv_obj->AdditionalRequestPageBufferCount].Offset = (unsigned long)skb->data & (PAGE_SIZE -1);
packet->PageBuffers[net_drv_obj->AdditionalRequestPageBufferCount].Length = skb->len - skb->data_len; packet->PageBuffers[net_drv_obj->AdditionalRequestPageBufferCount].Length = skb->len - skb->data_len;
@ -461,7 +461,7 @@ static int netvsc_start_xmit (struct sk_buff *skb, struct net_device *net)
packet->PageBuffers[i].Length = skb_shinfo(skb)->frags[i-(net_drv_obj->AdditionalRequestPageBufferCount+1)].size; packet->PageBuffers[i].Length = skb_shinfo(skb)->frags[i-(net_drv_obj->AdditionalRequestPageBufferCount+1)].size;
} }
// Set the completion routine /* Set the completion routine */
packet->Completion.Send.OnSendCompletion = netvsc_xmit_completion; packet->Completion.Send.OnSendCompletion = netvsc_xmit_completion;
packet->Completion.Send.SendCompletionContext = packet; packet->Completion.Send.SendCompletionContext = packet;
packet->Completion.Send.SendCompletionTid = (unsigned long)skb; packet->Completion.Send.SendCompletionTid = (unsigned long)skb;
@ -485,7 +485,7 @@ retry_send:
goto retry_send; goto retry_send;
} }
// no more room or we are shutting down /* no more room or we are shutting down */
DPRINT_ERR(NETVSC_DRV, "unable to send (%d)...marking net device (%p) busy", ret, net); DPRINT_ERR(NETVSC_DRV, "unable to send (%d)...marking net device (%p) busy", ret, net);
DPRINT_INFO(NETVSC_DRV, "net device (%p) stopping", net); DPRINT_INFO(NETVSC_DRV, "net device (%p) stopping", net);
@ -494,10 +494,10 @@ retry_send:
netif_stop_queue(net); netif_stop_queue(net);
// Null it since the caller will free it instead of the completion routine /* Null it since the caller will free it instead of the completion routine */
packet->Completion.Send.SendCompletionTid = 0; packet->Completion.Send.SendCompletionTid = 0;
// Release the resources since we will not get any send completion /* Release the resources since we will not get any send completion */
netvsc_xmit_completion((void*)packet); netvsc_xmit_completion((void*)packet);
} }
@ -571,18 +571,18 @@ static int netvsc_recv_callback(DEVICE_OBJECT *device_obj, NETVSC_PACKET* packet
net_device_ctx = netdev_priv(net); net_device_ctx = netdev_priv(net);
// Allocate a skb - TODO preallocate this /* Allocate a skb - TODO preallocate this */
//skb = alloc_skb(packet->TotalDataBufferLength, GFP_ATOMIC); /* skb = alloc_skb(packet->TotalDataBufferLength, GFP_ATOMIC); */
skb = dev_alloc_skb(packet->TotalDataBufferLength + 2); // Pad 2-bytes to align IP header to 16 bytes skb = dev_alloc_skb(packet->TotalDataBufferLength + 2); /* Pad 2-bytes to align IP header to 16 bytes */
ASSERT(skb); ASSERT(skb);
skb_reserve(skb, 2); skb_reserve(skb, 2);
skb->dev = net; skb->dev = net;
// for kmap_atomic /* for kmap_atomic */
local_irq_save(flags); local_irq_save(flags);
// Copy to skb. This copy is needed here since the memory pointed by NETVSC_PACKET /* Copy to skb. This copy is needed here since the memory pointed by NETVSC_PACKET */
// cannot be deallocated /* cannot be deallocated */
for (i=0; i<packet->PageBufferCount; i++) for (i=0; i<packet->PageBufferCount; i++)
{ {
data = kmap_atomic(pfn_to_page(packet->PageBuffers[i].Pfn), KM_IRQ1); data = kmap_atomic(pfn_to_page(packet->PageBuffers[i].Pfn), KM_IRQ1);
@ -599,7 +599,7 @@ static int netvsc_recv_callback(DEVICE_OBJECT *device_obj, NETVSC_PACKET* packet
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
// Pass the skb back up. Network stack will deallocate the skb when it is done /* Pass the skb back up. Network stack will deallocate the skb when it is done */
ret = netif_rx(skb); ret = netif_rx(skb);
switch (ret) switch (ret)
@ -624,7 +624,7 @@ static int netvsc_drv_exit_cb(struct device *dev, void *data)
{ {
struct device **curr = (struct device **)data; struct device **curr = (struct device **)data;
*curr = dev; *curr = dev;
return 1; // stop iterating return 1; /* stop iterating */
} }
/*++ /*++
@ -647,13 +647,13 @@ void netvsc_drv_exit(void)
{ {
current_dev = NULL; current_dev = NULL;
// Get the device /* Get the device */
driver_for_each_device(&drv_ctx->driver, NULL, (void*)&current_dev, netvsc_drv_exit_cb); driver_for_each_device(&drv_ctx->driver, NULL, (void*)&current_dev, netvsc_drv_exit_cb);
if (current_dev == NULL) if (current_dev == NULL)
break; break;
// Initiate removal from the top-down /* Initiate removal from the top-down */
DPRINT_INFO(NETVSC_DRV, "unregistering device (%p)...", current_dev); DPRINT_INFO(NETVSC_DRV, "unregistering device (%p)...", current_dev);
device_unregister(current_dev); device_unregister(current_dev);

View file

@ -46,9 +46,9 @@
#include "include/osd.h" #include "include/osd.h"
//
// Data types /* Data types */
//
typedef struct _TIMER { typedef struct _TIMER {
struct timer_list timer; struct timer_list timer;
PFN_TIMER_CALLBACK callback; PFN_TIMER_CALLBACK callback;
@ -113,7 +113,7 @@ int InterlockedDecrement(int *val)
#endif #endif
int InterlockedCompareExchange(int *val, int new, int curr) int InterlockedCompareExchange(int *val, int new, int curr)
{ {
//return ((int)cmpxchg(((atomic_t*)val), curr, new)); /* return ((int)cmpxchg(((atomic_t*)val), curr, new)); */
return atomic_cmpxchg((atomic_t*)val, curr, new); return atomic_cmpxchg((atomic_t*)val, curr, new);
} }
@ -139,13 +139,13 @@ void* PageAlloc(unsigned int count)
if (p) memset(p, 0, count * PAGE_SIZE); if (p) memset(p, 0, count * PAGE_SIZE);
return p; return p;
//struct page* page = alloc_page(GFP_KERNEL|__GFP_ZERO); /* struct page* page = alloc_page(GFP_KERNEL|__GFP_ZERO); */
//void *p; /* void *p; */
////BUGBUG: We need to use kmap in case we are in HIMEM region /* BUGBUG: We need to use kmap in case we are in HIMEM region */
//p = page_address(page); /* p = page_address(page); */
//if (p) memset(p, 0, PAGE_SIZE); /* if (p) memset(p, 0, PAGE_SIZE); */
//return p; /* return p; */
} }
void PageFree(void* page, unsigned int count) void PageFree(void* page, unsigned int count)
@ -171,17 +171,17 @@ void *MemMapIO(unsigned long phys, unsigned long size)
#if X2V_LINUX #if X2V_LINUX
#ifdef __x86_64__ #ifdef __x86_64__
return (void*)(phys + 0xFFFF83000C000000); return (void*)(phys + 0xFFFF83000C000000);
#else // i386 #else /* i386 */
return (void*)(phys + 0xfb000000); return (void*)(phys + 0xfb000000);
#endif #endif
#else #else
return (void*)GetVirtualAddress(phys); //return ioremap_nocache(phys, size); return (void*)GetVirtualAddress(phys); /* return ioremap_nocache(phys, size); */
#endif #endif
} }
void MemUnmapIO(void *virt) void MemUnmapIO(void *virt)
{ {
//iounmap(virt); /* iounmap(virt); */
} }
void TimerCallback(unsigned long data) void TimerCallback(unsigned long data)

View file

@ -41,16 +41,16 @@
#include "include/StorVscApi.h" #include "include/StorVscApi.h"
//
// #defines
//
// /* #defines */
// Data types
//
/* Data types */
struct host_device_context { struct host_device_context {
struct work_struct host_rescan_work; //must be 1st field struct work_struct host_rescan_work; /* must be 1st field */
struct device_context *device_ctx; // point back to our device context struct device_context *device_ctx; /* point back to our device context */
struct kmem_cache *request_pool; struct kmem_cache *request_pool;
unsigned int port; unsigned int port;
unsigned char path; unsigned char path;
@ -65,17 +65,17 @@ struct storvsc_cmd_request {
struct scatterlist *bounce_sgl; struct scatterlist *bounce_sgl;
STORVSC_REQUEST request; STORVSC_REQUEST request;
// !!!DO NOT ADD ANYTHING BELOW HERE!!! /* !!!DO NOT ADD ANYTHING BELOW HERE!!! */
// The extension buffer falls right here and is pointed to by request.Extension; /* The extension buffer falls right here and is pointed to by request.Extension; */
}; };
struct storvsc_driver_context { struct storvsc_driver_context {
// !! These must be the first 2 fields !! /* !! These must be the first 2 fields !! */
struct driver_context drv_ctx; struct driver_context drv_ctx;
STORVSC_DRIVER_OBJECT drv_obj; STORVSC_DRIVER_OBJECT drv_obj;
}; };
// Static decl /* Static decl */
static int storvsc_probe(struct device *dev); static int storvsc_probe(struct device *dev);
static int storvsc_queuecommand(struct scsi_cmnd *scmnd, void (*done)(struct scsi_cmnd *)); static int storvsc_queuecommand(struct scsi_cmnd *scmnd, void (*done)(struct scsi_cmnd *));
static int storvsc_device_alloc(struct scsi_device *); static int storvsc_device_alloc(struct scsi_device *);
@ -97,10 +97,10 @@ static int storvsc_get_chs(struct scsi_device *sdev, struct block_device * bdev,
static int storvsc_ringbuffer_size = STORVSC_RING_BUFFER_SIZE; static int storvsc_ringbuffer_size = STORVSC_RING_BUFFER_SIZE;
// The one and only one /* The one and only one */
static struct storvsc_driver_context g_storvsc_drv; static struct storvsc_driver_context g_storvsc_drv;
// Scsi driver /* Scsi driver */
static struct scsi_host_template scsi_driver = { static struct scsi_host_template scsi_driver = {
.module = THIS_MODULE, .module = THIS_MODULE,
.name = "storvsc_host_t", .name = "storvsc_host_t",
@ -110,15 +110,15 @@ static struct scsi_host_template scsi_driver = {
.slave_alloc = storvsc_device_alloc, .slave_alloc = storvsc_device_alloc,
.slave_configure = storvsc_device_configure, .slave_configure = storvsc_device_configure,
.cmd_per_lun = 1, .cmd_per_lun = 1,
.can_queue = STORVSC_MAX_IO_REQUESTS*STORVSC_MAX_TARGETS, // 64 max_queue * 1 target .can_queue = STORVSC_MAX_IO_REQUESTS*STORVSC_MAX_TARGETS, /* 64 max_queue * 1 target */
.this_id = -1, .this_id = -1,
// no use setting to 0 since ll_blk_rw reset it to 1 /* no use setting to 0 since ll_blk_rw reset it to 1 */
.sg_tablesize = MAX_MULTIPAGE_BUFFER_COUNT,// currently 32 .sg_tablesize = MAX_MULTIPAGE_BUFFER_COUNT,/* currently 32 */
// ENABLE_CLUSTERING allows mutiple physically contig bio_vecs to merge into 1 sg element. If set, we must /* ENABLE_CLUSTERING allows mutiple physically contig bio_vecs to merge into 1 sg element. If set, we must */
// limit the max_segment_size to PAGE_SIZE, otherwise we may get 1 sg element that represents multiple /* limit the max_segment_size to PAGE_SIZE, otherwise we may get 1 sg element that represents multiple */
// physically contig pfns (ie sg[x].length > PAGE_SIZE). /* physically contig pfns (ie sg[x].length > PAGE_SIZE). */
.use_clustering = ENABLE_CLUSTERING, .use_clustering = ENABLE_CLUSTERING,
// Make sure we dont get a sg segment crosses a page boundary /* Make sure we dont get a sg segment crosses a page boundary */
.dma_boundary = PAGE_SIZE-1, .dma_boundary = PAGE_SIZE-1,
}; };
@ -143,7 +143,7 @@ int storvsc_drv_init(PFN_DRIVERINITIALIZE pfn_drv_init)
storvsc_drv_obj->RingBufferSize = storvsc_ringbuffer_size; storvsc_drv_obj->RingBufferSize = storvsc_ringbuffer_size;
storvsc_drv_obj->OnHostRescan = storvsc_host_rescan; storvsc_drv_obj->OnHostRescan = storvsc_host_rescan;
// Callback to client driver to complete the initialization /* Callback to client driver to complete the initialization */
pfn_drv_init(&storvsc_drv_obj->Base); pfn_drv_init(&storvsc_drv_obj->Base);
DPRINT_INFO(STORVSC_DRV, "request extension size %u, max outstanding reqs %u", storvsc_drv_obj->RequestExtSize, storvsc_drv_obj->MaxOutstandingRequestsPerChannel); DPRINT_INFO(STORVSC_DRV, "request extension size %u, max outstanding reqs %u", storvsc_drv_obj->RequestExtSize, storvsc_drv_obj->MaxOutstandingRequestsPerChannel);
@ -161,7 +161,7 @@ int storvsc_drv_init(PFN_DRIVERINITIALIZE pfn_drv_init)
drv_ctx->probe = storvsc_probe; drv_ctx->probe = storvsc_probe;
drv_ctx->remove = storvsc_remove; drv_ctx->remove = storvsc_remove;
// The driver belongs to vmbus /* The driver belongs to vmbus */
vmbus_child_driver_register(drv_ctx); vmbus_child_driver_register(drv_ctx);
DPRINT_EXIT(STORVSC_DRV); DPRINT_EXIT(STORVSC_DRV);
@ -174,7 +174,7 @@ static int storvsc_drv_exit_cb(struct device *dev, void *data)
{ {
struct device **curr = (struct device **)data; struct device **curr = (struct device **)data;
*curr = dev; *curr = dev;
return 1; // stop iterating return 1; /* stop iterating */
} }
/*++ /*++
@ -197,13 +197,13 @@ void storvsc_drv_exit(void)
{ {
current_dev = NULL; current_dev = NULL;
// Get the device /* Get the device */
driver_for_each_device(&drv_ctx->driver, NULL, (void*)&current_dev, storvsc_drv_exit_cb); driver_for_each_device(&drv_ctx->driver, NULL, (void*)&current_dev, storvsc_drv_exit_cb);
if (current_dev == NULL) if (current_dev == NULL)
break; break;
// Initiate removal from the top-down /* Initiate removal from the top-down */
device_unregister(current_dev); device_unregister(current_dev);
} }
@ -277,7 +277,7 @@ static int storvsc_probe(struct device *device)
} }
device_info.PortNumber = host->host_no; device_info.PortNumber = host->host_no;
// Call to the vsc driver to add the device /* Call to the vsc driver to add the device */
ret = storvsc_drv_obj->Base.OnDeviceAdd(device_obj, (void*)&device_info); ret = storvsc_drv_obj->Base.OnDeviceAdd(device_obj, (void*)&device_info);
if (ret != 0) if (ret != 0)
{ {
@ -289,15 +289,15 @@ static int storvsc_probe(struct device *device)
return -1; return -1;
} }
//host_device_ctx->port = device_info.PortNumber; /* host_device_ctx->port = device_info.PortNumber; */
host_device_ctx->path = device_info.PathId; host_device_ctx->path = device_info.PathId;
host_device_ctx->target = device_info.TargetId; host_device_ctx->target = device_info.TargetId;
host->max_lun = STORVSC_MAX_LUNS_PER_TARGET; // max # of devices per target host->max_lun = STORVSC_MAX_LUNS_PER_TARGET; /* max # of devices per target */
host->max_id = STORVSC_MAX_TARGETS; // max # of targets per channel host->max_id = STORVSC_MAX_TARGETS; /* max # of targets per channel */
host->max_channel = STORVSC_MAX_CHANNELS -1; // max # of channels host->max_channel = STORVSC_MAX_CHANNELS -1; /* max # of channels */
// Register the HBA and start the scsi bus scan /* Register the HBA and start the scsi bus scan */
ret = scsi_add_host(host, device); ret = scsi_add_host(host, device);
if (ret != 0) if (ret != 0)
{ {
@ -350,11 +350,11 @@ static int storvsc_remove(struct device *device)
return -1; return -1;
} }
// Call to the vsc driver to let it know that the device is being removed /* Call to the vsc driver to let it know that the device is being removed */
ret = storvsc_drv_obj->Base.OnDeviceRemove(device_obj); ret = storvsc_drv_obj->Base.OnDeviceRemove(device_obj);
if (ret != 0) if (ret != 0)
{ {
// TODO: /* TODO: */
DPRINT_ERR(STORVSC, "unable to remove vsc device (ret %d)", ret); DPRINT_ERR(STORVSC, "unable to remove vsc device (ret %d)", ret);
} }
@ -397,11 +397,11 @@ static void storvsc_commmand_completion(STORVSC_REQUEST* request)
DPRINT_ENTER(STORVSC_DRV); DPRINT_ENTER(STORVSC_DRV);
if (cmd_request->bounce_sgl_count)// using bounce buffer if (cmd_request->bounce_sgl_count)/* using bounce buffer */
{ {
//printk("copy_from_bounce_buffer\n"); /* printk("copy_from_bounce_buffer\n"); */
// FIXME: We can optimize on writes by just skipping this /* FIXME: We can optimize on writes by just skipping this */
copy_from_bounce_buffer(scsi_sglist(scmnd), cmd_request->bounce_sgl, scsi_sg_count(scmnd)); copy_from_bounce_buffer(scsi_sglist(scmnd), cmd_request->bounce_sgl, scsi_sg_count(scmnd));
destroy_bounce_buffer(cmd_request->bounce_sgl, cmd_request->bounce_sgl_count); destroy_bounce_buffer(cmd_request->bounce_sgl, cmd_request->bounce_sgl_count);
} }
@ -424,7 +424,7 @@ static void storvsc_commmand_completion(STORVSC_REQUEST* request)
scmnd->host_scribble = NULL; scmnd->host_scribble = NULL;
scmnd->scsi_done = NULL; scmnd->scsi_done = NULL;
// !!DO NOT MODIFY the scmnd after this call /* !!DO NOT MODIFY the scmnd after this call */
scsi_done_fn(scmnd); scsi_done_fn(scmnd);
kmem_cache_free(host_device_ctx->request_pool, cmd_request); kmem_cache_free(host_device_ctx->request_pool, cmd_request);
@ -436,24 +436,24 @@ static int do_bounce_buffer(struct scatterlist *sgl, unsigned int sg_count)
{ {
int i=0; int i=0;
// No need to check /* No need to check */
if (sg_count < 2) if (sg_count < 2)
return -1; return -1;
// We have at least 2 sg entries /* We have at least 2 sg entries */
for ( i=0; i<sg_count; i++ ) for ( i=0; i<sg_count; i++ )
{ {
if (i == 0) // make sure 1st one does not have hole if (i == 0) /* make sure 1st one does not have hole */
{ {
if (sgl[i].offset + sgl[i].length != PAGE_SIZE) if (sgl[i].offset + sgl[i].length != PAGE_SIZE)
return i; return i;
} }
else if (i == sg_count - 1) // make sure last one does not have hole else if (i == sg_count - 1) /* make sure last one does not have hole */
{ {
if (sgl[i].offset != 0) if (sgl[i].offset != 0)
return i; return i;
} }
else // make sure no hole in the middle else /* make sure no hole in the middle */
{ {
if (sgl[i].length != PAGE_SIZE || sgl[i].offset != 0) if (sgl[i].length != PAGE_SIZE || sgl[i].offset != 0)
{ {
@ -513,7 +513,7 @@ static void destroy_bounce_buffer(struct scatterlist *sgl, unsigned int sg_count
kfree(sgl); kfree(sgl);
} }
// Assume the bounce_sgl has enough room ie using the create_bounce_buffer() /* Assume the bounce_sgl has enough room ie using the create_bounce_buffer() */
static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl, struct scatterlist *bounce_sgl, unsigned int orig_sgl_count) static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl, struct scatterlist *bounce_sgl, unsigned int orig_sgl_count)
{ {
int i=0,j=0; int i=0,j=0;
@ -532,8 +532,8 @@ static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl, struct s
src = src_addr; src = src_addr;
srclen = orig_sgl[i].length; srclen = orig_sgl[i].length;
//if (PageHighMem(orig_sgl[i].page)) /* if (PageHighMem(orig_sgl[i].page)) */
// printk("HighMem page detected - addr %p", (void*)src); /* printk("HighMem page detected - addr %p", (void*)src); */
ASSERT(orig_sgl[i].offset + orig_sgl[i].length <= PAGE_SIZE); ASSERT(orig_sgl[i].offset + orig_sgl[i].length <= PAGE_SIZE);
@ -544,7 +544,7 @@ static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl, struct s
while (srclen) while (srclen)
{ {
// assume bounce offset always == 0 /* assume bounce offset always == 0 */
dest = bounce_addr + bounce_sgl[j].length; dest = bounce_addr + bounce_sgl[j].length;
destlen = PAGE_SIZE - bounce_sgl[j].length; destlen = PAGE_SIZE - bounce_sgl[j].length;
@ -556,18 +556,18 @@ static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl, struct s
srclen -= copylen; srclen -= copylen;
src += copylen; src += copylen;
if (bounce_sgl[j].length == PAGE_SIZE) // full..move to next entry if (bounce_sgl[j].length == PAGE_SIZE) /* full..move to next entry */
{ {
kunmap_atomic((void*)bounce_addr, KM_IRQ0); kunmap_atomic((void*)bounce_addr, KM_IRQ0);
j++; j++;
// if we need to use another bounce buffer /* if we need to use another bounce buffer */
if (srclen || i != orig_sgl_count -1) if (srclen || i != orig_sgl_count -1)
{ {
bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])), KM_IRQ0); bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])), KM_IRQ0);
} }
} }
else if (srclen == 0 && i == orig_sgl_count -1) // // unmap the last bounce that is < PAGE_SIZE else if (srclen == 0 && i == orig_sgl_count -1) /* unmap the last bounce that is < PAGE_SIZE */
{ {
kunmap_atomic((void*)bounce_addr, KM_IRQ0); kunmap_atomic((void*)bounce_addr, KM_IRQ0);
} }
@ -581,7 +581,7 @@ static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl, struct s
return total_copied; return total_copied;
} }
// Assume the original sgl has enough room /* Assume the original sgl has enough room */
static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl, struct scatterlist *bounce_sgl, unsigned int orig_sgl_count) static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl, struct scatterlist *bounce_sgl, unsigned int orig_sgl_count)
{ {
int i=0,j=0; int i=0,j=0;
@ -619,18 +619,18 @@ static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl, struct
destlen -= copylen; destlen -= copylen;
dest += copylen; dest += copylen;
if (bounce_sgl[j].offset == bounce_sgl[j].length) // full if (bounce_sgl[j].offset == bounce_sgl[j].length) /* full */
{ {
kunmap_atomic((void*)bounce_addr, KM_IRQ0); kunmap_atomic((void*)bounce_addr, KM_IRQ0);
j++; j++;
// if we need to use another bounce buffer /* if we need to use another bounce buffer */
if (destlen || i != orig_sgl_count -1) if (destlen || i != orig_sgl_count -1)
{ {
bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])), KM_IRQ0); bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])), KM_IRQ0);
} }
} }
else if (destlen == 0 && i == orig_sgl_count -1) // unmap the last bounce that is < PAGE_SIZE else if (destlen == 0 && i == orig_sgl_count -1) /* unmap the last bounce that is < PAGE_SIZE */
{ {
kunmap_atomic((void*)bounce_addr, KM_IRQ0); kunmap_atomic((void*)bounce_addr, KM_IRQ0);
} }
@ -678,7 +678,7 @@ static int storvsc_queuecommand(struct scsi_cmnd *scmnd, void (*done)(struct scs
scmnd->device->queue_depth, scmnd->device->queue_depth,
scmnd->device->tagged_supported); scmnd->device->tagged_supported);
// If retrying, no need to prep the cmd /* If retrying, no need to prep the cmd */
if (scmnd->host_scribble) if (scmnd->host_scribble)
{ {
ASSERT(scmnd->scsi_done != NULL); ASSERT(scmnd->scsi_done != NULL);
@ -705,7 +705,7 @@ static int storvsc_queuecommand(struct scsi_cmnd *scmnd, void (*done)(struct scs
return SCSI_MLQUEUE_DEVICE_BUSY; return SCSI_MLQUEUE_DEVICE_BUSY;
} }
// Setup the cmd request /* Setup the cmd request */
cmd_request->bounce_sgl_count = 0; cmd_request->bounce_sgl_count = 0;
cmd_request->bounce_sgl = NULL; cmd_request->bounce_sgl = NULL;
cmd_request->cmd = scmnd; cmd_request->cmd = scmnd;
@ -717,7 +717,7 @@ static int storvsc_queuecommand(struct scsi_cmnd *scmnd, void (*done)(struct scs
request->Extension = (void*)((unsigned long)cmd_request + request_size); request->Extension = (void*)((unsigned long)cmd_request + request_size);
DPRINT_DBG(STORVSC_DRV, "req %p size %d ext %d", request, request_size, storvsc_drv_obj->RequestExtSize); DPRINT_DBG(STORVSC_DRV, "req %p size %d ext %d", request, request_size, storvsc_drv_obj->RequestExtSize);
// Build the SRB /* Build the SRB */
switch(scmnd->sc_data_direction) switch(scmnd->sc_data_direction)
{ {
case DMA_TO_DEVICE: case DMA_TO_DEVICE:
@ -732,9 +732,9 @@ static int storvsc_queuecommand(struct scsi_cmnd *scmnd, void (*done)(struct scs
} }
request->OnIOCompletion = storvsc_commmand_completion; request->OnIOCompletion = storvsc_commmand_completion;
request->Context = cmd_request;//scmnd; request->Context = cmd_request;/* scmnd; */
//request->PortId = scmnd->device->channel; /* request->PortId = scmnd->device->channel; */
request->Host = host_device_ctx->port; request->Host = host_device_ctx->port;
request->Bus = scmnd->device->channel; request->Bus = scmnd->device->channel;
request->TargetId = scmnd->device->id; request->TargetId = scmnd->device->id;
@ -753,7 +753,7 @@ static int storvsc_queuecommand(struct scsi_cmnd *scmnd, void (*done)(struct scs
{ {
sgl = (struct scatterlist*)scsi_sglist(scmnd); sgl = (struct scatterlist*)scsi_sglist(scmnd);
// check if we need to bounce the sgl /* check if we need to bounce the sgl */
if (do_bounce_buffer(sgl, scsi_sg_count(scmnd)) != -1) if (do_bounce_buffer(sgl, scsi_sg_count(scmnd)) != -1)
{ {
DPRINT_INFO(STORVSC_DRV, "need to bounce buffer for this scmnd %p", scmnd); DPRINT_INFO(STORVSC_DRV, "need to bounce buffer for this scmnd %p", scmnd);
@ -771,9 +771,9 @@ static int storvsc_queuecommand(struct scsi_cmnd *scmnd, void (*done)(struct scs
cmd_request->bounce_sgl_count = ALIGN_UP(scsi_bufflen(scmnd), PAGE_SIZE) >> PAGE_SHIFT; cmd_request->bounce_sgl_count = ALIGN_UP(scsi_bufflen(scmnd), PAGE_SIZE) >> PAGE_SHIFT;
//printk("bouncing buffer allocated %p original buffer %p\n", bounce_sgl, sgl); /* printk("bouncing buffer allocated %p original buffer %p\n", bounce_sgl, sgl); */
//printk("copy_to_bounce_buffer\n"); /* printk("copy_to_bounce_buffer\n"); */
// FIXME: We can optimize on reads by just skipping this /* FIXME: We can optimize on reads by just skipping this */
copy_to_bounce_buffer(sgl, cmd_request->bounce_sgl, scsi_sg_count(scmnd)); copy_to_bounce_buffer(sgl, cmd_request->bounce_sgl, scsi_sg_count(scmnd));
sgl = cmd_request->bounce_sgl; sgl = cmd_request->bounce_sgl;
@ -801,15 +801,15 @@ static int storvsc_queuecommand(struct scsi_cmnd *scmnd, void (*done)(struct scs
retry_request: retry_request:
// Invokes the vsc to start an IO /* Invokes the vsc to start an IO */
ret = storvsc_drv_obj->OnIORequest(&device_ctx->device_obj, &cmd_request->request); ret = storvsc_drv_obj->OnIORequest(&device_ctx->device_obj, &cmd_request->request);
if (ret == -1) // no more space if (ret == -1) /* no more space */
{ {
DPRINT_ERR(STORVSC_DRV, "scmnd (%p) - queue FULL...marking queue busy", scmnd); DPRINT_ERR(STORVSC_DRV, "scmnd (%p) - queue FULL...marking queue busy", scmnd);
if (cmd_request->bounce_sgl_count) if (cmd_request->bounce_sgl_count)
{ {
// FIXME: We can optimize on writes by just skipping this /* FIXME: We can optimize on writes by just skipping this */
copy_from_bounce_buffer(scsi_sglist(scmnd), cmd_request->bounce_sgl, scsi_sg_count(scmnd)); copy_from_bounce_buffer(scsi_sglist(scmnd), cmd_request->bounce_sgl, scsi_sg_count(scmnd));
destroy_bounce_buffer(cmd_request->bounce_sgl, cmd_request->bounce_sgl_count); destroy_bounce_buffer(cmd_request->bounce_sgl, cmd_request->bounce_sgl_count);
} }
@ -829,7 +829,7 @@ retry_request:
static int storvsc_merge_bvec(struct request_queue *q, struct bvec_merge_data *bmd, struct bio_vec *bvec) static int storvsc_merge_bvec(struct request_queue *q, struct bvec_merge_data *bmd, struct bio_vec *bvec)
{ {
return bvec->bv_len; //checking done by caller. return bvec->bv_len; /* checking done by caller. */
} }
/*++ /*++
@ -842,7 +842,7 @@ Desc: Configure the specified scsi device
static int storvsc_device_alloc(struct scsi_device *sdevice) static int storvsc_device_alloc(struct scsi_device *sdevice)
{ {
DPRINT_DBG(STORVSC_DRV, "sdev (%p) - setting device flag to %d", sdevice, BLIST_SPARSELUN); DPRINT_DBG(STORVSC_DRV, "sdev (%p) - setting device flag to %d", sdevice, BLIST_SPARSELUN);
// This enables luns to be located sparsely. Otherwise, we may not discovered them. /* This enables luns to be located sparsely. Otherwise, we may not discovered them. */
sdevice->sdev_bflags |= BLIST_SPARSELUN | BLIST_LARGELUN; sdevice->sdev_bflags |= BLIST_SPARSELUN | BLIST_LARGELUN;
return 0; return 0;
} }
@ -861,7 +861,7 @@ static int storvsc_device_configure(struct scsi_device *sdevice)
blk_queue_merge_bvec(sdevice->request_queue, storvsc_merge_bvec); blk_queue_merge_bvec(sdevice->request_queue, storvsc_merge_bvec);
blk_queue_bounce_limit(sdevice->request_queue, BLK_BOUNCE_ANY); blk_queue_bounce_limit(sdevice->request_queue, BLK_BOUNCE_ANY);
//sdevice->timeout = (2000 * HZ);//(75 * HZ); /* sdevice->timeout = (2000 * HZ);//(75 * HZ); */
return 0; return 0;
} }
@ -887,7 +887,7 @@ static int storvsc_host_reset_handler(struct scsi_cmnd *scmnd)
DPRINT_INFO(STORVSC_DRV, "sdev (%p) dev obj (%p) - host resetting...", scmnd->device, &device_ctx->device_obj); DPRINT_INFO(STORVSC_DRV, "sdev (%p) dev obj (%p) - host resetting...", scmnd->device, &device_ctx->device_obj);
// Invokes the vsc to reset the host/bus /* Invokes the vsc to reset the host/bus */
ASSERT(storvsc_drv_obj->OnHostReset); ASSERT(storvsc_drv_obj->OnHostReset);
ret = storvsc_drv_obj->OnHostReset(&device_ctx->device_obj); ret = storvsc_drv_obj->OnHostReset(&device_ctx->device_obj);
if (ret != 0) if (ret != 0)
@ -945,12 +945,12 @@ static void storvsc_host_rescan_callback(struct work_struct *work)
DPRINT_INFO(STORVSC_DRV, "rescanning host for new scsi devices...", device_obj, host_device_ctx->target, host_device_ctx->path); DPRINT_INFO(STORVSC_DRV, "rescanning host for new scsi devices...", device_obj, host_device_ctx->target, host_device_ctx->path);
// Rescan for new device /* Rescan for new device */
scsi_scan_target(&host->shost_gendev, host_device_ctx->path, host_device_ctx->target, SCAN_WILD_CARD, 1); scsi_scan_target(&host->shost_gendev, host_device_ctx->path, host_device_ctx->target, SCAN_WILD_CARD, 1);
DPRINT_INFO(STORVSC_DRV, "rescanning host for removed scsi device..."); DPRINT_INFO(STORVSC_DRV, "rescanning host for removed scsi device...");
// Use the 1st device to send the report luns cmd /* Use the 1st device to send the report luns cmd */
shost_for_each_device(sdev, host) shost_for_each_device(sdev, host)
{ {
lun_count=STORVSC_MAX_LUNS_PER_TARGET; lun_count=STORVSC_MAX_LUNS_PER_TARGET;
@ -968,12 +968,12 @@ static void storvsc_host_rescan_callback(struct work_struct *work)
DPRINT_INFO(STORVSC_DRV, "%d) lun %u", i, lun_list[i]); DPRINT_INFO(STORVSC_DRV, "%d) lun %u", i, lun_list[i]);
} }
// Rescan for devices that may have been removed. /* Rescan for devices that may have been removed. */
// We do not have to worry that new devices may have been added since /* We do not have to worry that new devices may have been added since */
// this callback is serialized by the workqueue ie add/remove are done here. /* this callback is serialized by the workqueue ie add/remove are done here. */
shost_for_each_device(sdev, host) shost_for_each_device(sdev, host)
{ {
// See if this device is still here /* See if this device is still here */
found = 0; found = 0;
for (i=0; i<lun_count; i++) for (i=0; i<lun_count; i++)
{ {
@ -990,13 +990,13 @@ static void storvsc_host_rescan_callback(struct work_struct *work)
} }
} }
// Now remove the devices /* Now remove the devices */
for (i=0; i< sdevs_count; i++) for (i=0; i< sdevs_count; i++)
{ {
DPRINT_INFO(STORVSC_DRV, "removing scsi device (%p) lun (%u)...", DPRINT_INFO(STORVSC_DRV, "removing scsi device (%p) lun (%u)...",
sdevs_remove_list[i], sdevs_remove_list[i]->lun); sdevs_remove_list[i], sdevs_remove_list[i]->lun);
// make sure it is not removed from underneath us /* make sure it is not removed from underneath us */
if (!scsi_device_get(sdevs_remove_list[i])) if (!scsi_device_get(sdevs_remove_list[i]))
{ {
scsi_remove_device(sdevs_remove_list[i]); scsi_remove_device(sdevs_remove_list[i]);
@ -1021,7 +1021,7 @@ static int storvsc_report_luns(struct scsi_device *sdev, unsigned int luns[], un
unsigned char *data; unsigned char *data;
struct scsi_sense_hdr sshdr; struct scsi_sense_hdr sshdr;
unsigned char cmd[16]={0}; unsigned char cmd[16]={0};
unsigned int report_len = 8*(STORVSC_MAX_LUNS_PER_TARGET+1); // Add 1 to cover the report_lun header unsigned int report_len = 8*(STORVSC_MAX_LUNS_PER_TARGET+1); /* Add 1 to cover the report_lun header */
unsigned long long *report_luns; unsigned long long *report_luns;
const unsigned int in_lun_count = *lun_count; const unsigned int in_lun_count = *lun_count;
@ -1035,7 +1035,7 @@ static int storvsc_report_luns(struct scsi_device *sdev, unsigned int luns[], un
cmd[0] = REPORT_LUNS; cmd[0] = REPORT_LUNS;
// cmd length /* cmd length */
*(unsigned int*)&cmd[6] = cpu_to_be32(report_len); *(unsigned int*)&cmd[6] = cpu_to_be32(report_len);
result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, (unsigned char*)report_luns, report_len, &sshdr, 30*HZ, 3, NULL); result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, (unsigned char*)report_luns, report_len, &sshdr, 30*HZ, 3, NULL);
@ -1045,7 +1045,7 @@ static int storvsc_report_luns(struct scsi_device *sdev, unsigned int luns[], un
return -EBUSY; return -EBUSY;
} }
// get the length from the first four bytes /* get the length from the first four bytes */
report_len = be32_to_cpu(*(unsigned int*)&report_luns[0]); report_len = be32_to_cpu(*(unsigned int*)&report_luns[0]);
num_luns = (report_len / sizeof(unsigned long long)); num_luns = (report_len / sizeof(unsigned long long));
@ -1059,7 +1059,7 @@ static int storvsc_report_luns(struct scsi_device *sdev, unsigned int luns[], un
DPRINT_DBG(STORVSC_DRV, "report luns on scsi device (%p) found %u luns ", sdev, num_luns); DPRINT_DBG(STORVSC_DRV, "report luns on scsi device (%p) found %u luns ", sdev, num_luns);
// lun id starts at 1 /* lun id starts at 1 */
for (i=1; i< num_luns+1; i++) for (i=1; i< num_luns+1; i++)
{ {
lun = 0; lun = 0;
@ -1088,8 +1088,8 @@ static void storvsc_host_rescan(DEVICE_OBJECT* device_obj)
DPRINT_INFO(STORVSC_DRV, "initiating rescan on dev obj (%p) target (%u) bus (%u)...", device_obj, host_device_ctx->target, host_device_ctx->path); DPRINT_INFO(STORVSC_DRV, "initiating rescan on dev obj (%p) target (%u) bus (%u)...", device_obj, host_device_ctx->target, host_device_ctx->path);
// We need to queue this since the scanning may block and the caller may be in an intr context /* We need to queue this since the scanning may block and the caller may be in an intr context */
//scsi_queue_work(host, &host_device_ctx->host_rescan_work); /* scsi_queue_work(host, &host_device_ctx->host_rescan_work); */
schedule_work(&host_device_ctx->host_rescan_work); schedule_work(&host_device_ctx->host_rescan_work);
DPRINT_EXIT(STORVSC_DRV); DPRINT_EXIT(STORVSC_DRV);
} }
@ -1114,17 +1114,17 @@ static int storvsc_get_chs(struct scsi_device *sdev, struct block_device * bdev,
heads = 16; heads = 16;
cylinder_times_heads = total_sectors; cylinder_times_heads = total_sectors;
rem = sector_div(cylinder_times_heads, sectors_per_track); // sector_div stores the quotient in cylinder_times_heads rem = sector_div(cylinder_times_heads, sectors_per_track); /* sector_div stores the quotient in cylinder_times_heads */
} }
else else
{ {
sectors_per_track = 17; sectors_per_track = 17;
cylinder_times_heads = total_sectors; cylinder_times_heads = total_sectors;
rem = sector_div(cylinder_times_heads, sectors_per_track); // sector_div stores the quotient in cylinder_times_heads rem = sector_div(cylinder_times_heads, sectors_per_track); /* sector_div stores the quotient in cylinder_times_heads */
temp = cylinder_times_heads + 1023; temp = cylinder_times_heads + 1023;
rem = sector_div(temp, 1024); // sector_div stores the quotient in temp rem = sector_div(temp, 1024); /* sector_div stores the quotient in temp */
heads = temp; heads = temp;
@ -1137,7 +1137,7 @@ static int storvsc_get_chs(struct scsi_device *sdev, struct block_device * bdev,
heads = 16; heads = 16;
cylinder_times_heads = total_sectors; cylinder_times_heads = total_sectors;
rem = sector_div(cylinder_times_heads, sectors_per_track); // sector_div stores the quotient in cylinder_times_heads rem = sector_div(cylinder_times_heads, sectors_per_track); /* sector_div stores the quotient in cylinder_times_heads */
} }
if (cylinder_times_heads >= (heads * 1024)) { if (cylinder_times_heads >= (heads * 1024)) {
@ -1145,12 +1145,12 @@ static int storvsc_get_chs(struct scsi_device *sdev, struct block_device * bdev,
heads = 16; heads = 16;
cylinder_times_heads = total_sectors; cylinder_times_heads = total_sectors;
rem = sector_div(cylinder_times_heads, sectors_per_track); // sector_div stores the quotient in cylinder_times_heads rem = sector_div(cylinder_times_heads, sectors_per_track); /* sector_div stores the quotient in cylinder_times_heads */
} }
} }
temp = cylinder_times_heads; temp = cylinder_times_heads;
rem = sector_div(temp, heads); // sector_div stores the quotient in temp rem = sector_div(temp, heads); /* sector_div stores the quotient in temp */
cylinders = temp; cylinders = temp;
info[0] = heads; info[0] = heads;
@ -1193,4 +1193,4 @@ module_param(storvsc_ringbuffer_size, int, S_IRUGO);
module_init(storvsc_init); module_init(storvsc_init);
module_exit(storvsc_exit); module_exit(storvsc_exit);
// eof /* eof */

View file

@ -32,22 +32,22 @@
#include "include/logging.h" #include "include/logging.h"
#include "include/vmbus.h" #include "include/vmbus.h"
//
// Defines
//
// FIXME! We need to do this dynamically for PIC and APIC system /* Defines */
/* FIXME! We need to do this dynamically for PIC and APIC system */
#define VMBUS_IRQ 0x5 #define VMBUS_IRQ 0x5
#define VMBUS_IRQ_VECTOR IRQ5_VECTOR #define VMBUS_IRQ_VECTOR IRQ5_VECTOR
//
// Data types
//
// Main vmbus driver data structure /* Data types */
/* Main vmbus driver data structure */
struct vmbus_driver_context { struct vmbus_driver_context {
// !! These must be the first 2 fields !! /* !! These must be the first 2 fields !! */
// The driver field is not used in here. Instead, the bus field is /* The driver field is not used in here. Instead, the bus field is */
// used to represent the driver /* used to represent the driver */
struct driver_context drv_ctx; struct driver_context drv_ctx;
VMBUS_DRIVER_OBJECT drv_obj; VMBUS_DRIVER_OBJECT drv_obj;
@ -55,13 +55,13 @@ struct vmbus_driver_context {
struct tasklet_struct msg_dpc; struct tasklet_struct msg_dpc;
struct tasklet_struct event_dpc; struct tasklet_struct event_dpc;
// The bus root device /* The bus root device */
struct device_context device_ctx; struct device_context device_ctx;
}; };
//
// Static decl /* Static decl */
//
static int vmbus_match(struct device *device, struct device_driver *driver); static int vmbus_match(struct device *device, struct device_driver *driver);
static int vmbus_probe(struct device *device); static int vmbus_probe(struct device *device);
static int vmbus_remove(struct device *device); static int vmbus_remove(struct device *device);
@ -81,26 +81,26 @@ static int vmbus_child_device_register(DEVICE_OBJECT* root_device_obj, DEVICE_OB
static void vmbus_child_device_unregister(DEVICE_OBJECT* child_device_obj); static void vmbus_child_device_unregister(DEVICE_OBJECT* child_device_obj);
static void vmbus_child_device_get_info(DEVICE_OBJECT *device_obj, DEVICE_INFO *device_info); static void vmbus_child_device_get_info(DEVICE_OBJECT *device_obj, DEVICE_INFO *device_info);
//static ssize_t vmbus_show_class_id(struct device *dev, struct device_attribute *attr, char *buf); /* static ssize_t vmbus_show_class_id(struct device *dev, struct device_attribute *attr, char *buf); */
//static ssize_t vmbus_show_device_id(struct device *dev, struct device_attribute *attr, char *buf); /* static ssize_t vmbus_show_device_id(struct device *dev, struct device_attribute *attr, char *buf); */
static ssize_t vmbus_show_device_attr(struct device *dev, struct device_attribute *dev_attr, char *buf); static ssize_t vmbus_show_device_attr(struct device *dev, struct device_attribute *dev_attr, char *buf);
//
// Global
//
// Global logging setting /* Global */
//unsigned int vmbus_loglevel= (((VMBUS | VMBUS_DRV)<<16) | DEBUG_LVL_ENTEREXIT);
//unsigned int vmbus_loglevel= (ALL_MODULES << 16 | DEBUG_LVL_ENTEREXIT); /* Global logging setting */
/* unsigned int vmbus_loglevel= (((VMBUS | VMBUS_DRV)<<16) | DEBUG_LVL_ENTEREXIT); */
/* unsigned int vmbus_loglevel= (ALL_MODULES << 16 | DEBUG_LVL_ENTEREXIT); */
unsigned int vmbus_loglevel= (ALL_MODULES << 16 | INFO_LVL); unsigned int vmbus_loglevel= (ALL_MODULES << 16 | INFO_LVL);
EXPORT_SYMBOL(vmbus_loglevel); EXPORT_SYMBOL(vmbus_loglevel);
static int vmbus_irq = VMBUS_IRQ; static int vmbus_irq = VMBUS_IRQ;
// Setup /proc/sys/bus/vmbus/vmbus_loglevel /* Setup /proc/sys/bus/vmbus/vmbus_loglevel */
// Allow usage of sysctl cmd to set the logging level /* Allow usage of sysctl cmd to set the logging level */
static struct ctl_table_header *vmbus_ctl_table_hdr; static struct ctl_table_header *vmbus_ctl_table_hdr;
static ctl_table vmbus_dev_ctl_table[] = { static ctl_table vmbus_dev_ctl_table[] = {
@ -129,9 +129,9 @@ static ctl_table vmus_root_ctl_table[] = {
{ } { }
}; };
//
// Set up per device attributes in /sys/bus/vmbus/devices/<bus device> /* Set up per device attributes in /sys/bus/vmbus/devices/<bus device> */
//
static struct device_attribute vmbus_device_attrs[] = { static struct device_attribute vmbus_device_attrs[] = {
__ATTR(id, S_IRUGO, vmbus_show_device_attr, NULL), __ATTR(id, S_IRUGO, vmbus_show_device_attr, NULL),
__ATTR(state, S_IRUGO, vmbus_show_device_attr, NULL), __ATTR(state, S_IRUGO, vmbus_show_device_attr, NULL),
@ -161,7 +161,7 @@ static struct device_attribute vmbus_device_attrs[] = {
__ATTR_NULL __ATTR_NULL
}; };
// The one and only one /* The one and only one */
static struct vmbus_driver_context g_vmbus_drv={ static struct vmbus_driver_context g_vmbus_drv={
.bus.name = "vmbus", .bus.name = "vmbus",
.bus.match = vmbus_match, .bus.match = vmbus_match,
@ -172,9 +172,9 @@ static struct vmbus_driver_context g_vmbus_drv={
.bus.dev_attrs = vmbus_device_attrs, .bus.dev_attrs = vmbus_device_attrs,
}; };
//
// Routines /* Routines */
//
/*++ /*++
@ -299,15 +299,15 @@ Name: vmbus_show_class_id()
Desc: Show the device class id in sysfs Desc: Show the device class id in sysfs
--*/ --*/
//static ssize_t vmbus_show_class_id(struct device *dev, struct device_attribute *attr, char *buf) /* static ssize_t vmbus_show_class_id(struct device *dev, struct device_attribute *attr, char *buf) */
//{ /* { */
// struct device_context *device_ctx = device_to_device_context(dev); /* struct device_context *device_ctx = device_to_device_context(dev); */
// return sprintf(buf, "{%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x%02x%02x}\n", /* return sprintf(buf, "{%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x%02x%02x}\n", */
// device_ctx->class_id[3], device_ctx->class_id[2], device_ctx->class_id[1], device_ctx->class_id[0], /* device_ctx->class_id[3], device_ctx->class_id[2], device_ctx->class_id[1], device_ctx->class_id[0], */
// device_ctx->class_id[5], device_ctx->class_id[4], /* device_ctx->class_id[5], device_ctx->class_id[4], */
// device_ctx->class_id[7], device_ctx->class_id[6], /* device_ctx->class_id[7], device_ctx->class_id[6], */
// device_ctx->class_id[8], device_ctx->class_id[9], device_ctx->class_id[10], device_ctx->class_id[11], device_ctx->class_id[12], device_ctx->class_id[13], device_ctx->class_id[14], device_ctx->class_id[15]); /* device_ctx->class_id[8], device_ctx->class_id[9], device_ctx->class_id[10], device_ctx->class_id[11], device_ctx->class_id[12], device_ctx->class_id[13], device_ctx->class_id[14], device_ctx->class_id[15]); */
//} /* } */
/*++ /*++
@ -316,15 +316,15 @@ Name: vmbus_show_device_id()
Desc: Show the device instance id in sysfs Desc: Show the device instance id in sysfs
--*/ --*/
//static ssize_t vmbus_show_device_id(struct device *dev, struct device_attribute *attr, char *buf) /* static ssize_t vmbus_show_device_id(struct device *dev, struct device_attribute *attr, char *buf) */
//{ /* { */
// struct device_context *device_ctx = device_to_device_context(dev); /* struct device_context *device_ctx = device_to_device_context(dev); */
// return sprintf(buf, "{%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x%02x%02x}\n", /* return sprintf(buf, "{%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x%02x%02x}\n", */
// device_ctx->device_id[3], device_ctx->device_id[2], device_ctx->device_id[1], device_ctx->device_id[0], /* device_ctx->device_id[3], device_ctx->device_id[2], device_ctx->device_id[1], device_ctx->device_id[0], */
// device_ctx->device_id[5], device_ctx->device_id[4], /* device_ctx->device_id[5], device_ctx->device_id[4], */
// device_ctx->device_id[7], device_ctx->device_id[6], /* device_ctx->device_id[7], device_ctx->device_id[6], */
// device_ctx->device_id[8], device_ctx->device_id[9], device_ctx->device_id[10], device_ctx->device_id[11], device_ctx->device_id[12], device_ctx->device_id[13], device_ctx->device_id[14], device_ctx->device_id[15]); /* device_ctx->device_id[8], device_ctx->device_id[9], device_ctx->device_id[10], device_ctx->device_id[11], device_ctx->device_id[12], device_ctx->device_id[13], device_ctx->device_id[14], device_ctx->device_id[15]); */
//} /* } */
/*++ /*++
@ -351,13 +351,13 @@ int vmbus_bus_init(PFN_DRIVERINITIALIZE pfn_drv_init)
DPRINT_ENTER(VMBUS_DRV); DPRINT_ENTER(VMBUS_DRV);
// Set this up to allow lower layer to callback to add/remove child devices on the bus /* Set this up to allow lower layer to callback to add/remove child devices on the bus */
vmbus_drv_obj->OnChildDeviceCreate = vmbus_child_device_create; vmbus_drv_obj->OnChildDeviceCreate = vmbus_child_device_create;
vmbus_drv_obj->OnChildDeviceDestroy = vmbus_child_device_destroy; vmbus_drv_obj->OnChildDeviceDestroy = vmbus_child_device_destroy;
vmbus_drv_obj->OnChildDeviceAdd = vmbus_child_device_register; vmbus_drv_obj->OnChildDeviceAdd = vmbus_child_device_register;
vmbus_drv_obj->OnChildDeviceRemove = vmbus_child_device_unregister; vmbus_drv_obj->OnChildDeviceRemove = vmbus_child_device_unregister;
// Call to bus driver to initialize /* Call to bus driver to initialize */
ret = pfn_drv_init(&vmbus_drv_obj->Base); ret = pfn_drv_init(&vmbus_drv_obj->Base);
if (ret != 0) if (ret != 0)
{ {
@ -365,7 +365,7 @@ int vmbus_bus_init(PFN_DRIVERINITIALIZE pfn_drv_init)
goto cleanup; goto cleanup;
} }
// Sanity checks /* Sanity checks */
if (!vmbus_drv_obj->Base.OnDeviceAdd) if (!vmbus_drv_obj->Base.OnDeviceAdd)
{ {
DPRINT_ERR(VMBUS_DRV, "OnDeviceAdd() routine not set"); DPRINT_ERR(VMBUS_DRV, "OnDeviceAdd() routine not set");
@ -375,14 +375,14 @@ int vmbus_bus_init(PFN_DRIVERINITIALIZE pfn_drv_init)
vmbus_drv_ctx->bus.name = vmbus_drv_obj->Base.name; vmbus_drv_ctx->bus.name = vmbus_drv_obj->Base.name;
// Initialize the bus context /* Initialize the bus context */
tasklet_init(&vmbus_drv_ctx->msg_dpc, vmbus_msg_dpc, (unsigned long)vmbus_drv_obj); tasklet_init(&vmbus_drv_ctx->msg_dpc, vmbus_msg_dpc, (unsigned long)vmbus_drv_obj);
tasklet_init(&vmbus_drv_ctx->event_dpc, vmbus_event_dpc, (unsigned long)vmbus_drv_obj); tasklet_init(&vmbus_drv_ctx->event_dpc, vmbus_event_dpc, (unsigned long)vmbus_drv_obj);
// Now, register the bus driver with LDM /* Now, register the bus driver with LDM */
bus_register(&vmbus_drv_ctx->bus); bus_register(&vmbus_drv_ctx->bus);
// Get the interrupt resource /* Get the interrupt resource */
ret = request_irq(vmbus_irq, ret = request_irq(vmbus_irq,
vmbus_isr, vmbus_isr,
IRQF_SAMPLE_RANDOM, IRQF_SAMPLE_RANDOM,
@ -402,7 +402,7 @@ int vmbus_bus_init(PFN_DRIVERINITIALIZE pfn_drv_init)
DPRINT_INFO(VMBUS_DRV, "irq 0x%x vector 0x%x", vmbus_irq, vector); DPRINT_INFO(VMBUS_DRV, "irq 0x%x vector 0x%x", vmbus_irq, vector);
// Call to bus driver to add the root device /* Call to bus driver to add the root device */
memset(dev_ctx, 0, sizeof(struct device_context)); memset(dev_ctx, 0, sizeof(struct device_context));
ret = vmbus_drv_obj->Base.OnDeviceAdd(&dev_ctx->device_obj, &vector); ret = vmbus_drv_obj->Base.OnDeviceAdd(&dev_ctx->device_obj, &vector);
@ -417,19 +417,19 @@ int vmbus_bus_init(PFN_DRIVERINITIALIZE pfn_drv_init)
ret = -1; ret = -1;
goto cleanup; goto cleanup;
} }
//strcpy(dev_ctx->device.bus_id, dev_ctx->device_obj.name); /* strcpy(dev_ctx->device.bus_id, dev_ctx->device_obj.name); */
dev_set_name(&dev_ctx->device, "vmbus_0_0"); dev_set_name(&dev_ctx->device, "vmbus_0_0");
memcpy(&dev_ctx->class_id, &dev_ctx->device_obj.deviceType, sizeof(GUID)); memcpy(&dev_ctx->class_id, &dev_ctx->device_obj.deviceType, sizeof(GUID));
memcpy(&dev_ctx->device_id, &dev_ctx->device_obj.deviceInstance, sizeof(GUID)); memcpy(&dev_ctx->device_id, &dev_ctx->device_obj.deviceInstance, sizeof(GUID));
// No need to bind a driver to the root device. /* No need to bind a driver to the root device. */
dev_ctx->device.parent = NULL; dev_ctx->device.parent = NULL;
dev_ctx->device.bus = &vmbus_drv_ctx->bus; //NULL; // vmbus_remove() does not get invoked dev_ctx->device.bus = &vmbus_drv_ctx->bus; /* NULL; vmbus_remove() does not get invoked */
// Setup the device dispatch table /* Setup the device dispatch table */
dev_ctx->device.release = vmbus_bus_release; dev_ctx->device.release = vmbus_bus_release;
// Setup the bus as root device /* Setup the bus as root device */
device_register(&dev_ctx->device); device_register(&dev_ctx->device);
vmbus_drv_obj->GetChannelOffers(); vmbus_drv_obj->GetChannelOffers();
@ -457,14 +457,14 @@ void vmbus_bus_exit(void)
DPRINT_ENTER(VMBUS_DRV); DPRINT_ENTER(VMBUS_DRV);
// Remove the root device /* Remove the root device */
if (vmbus_drv_obj->Base.OnDeviceRemove) if (vmbus_drv_obj->Base.OnDeviceRemove)
vmbus_drv_obj->Base.OnDeviceRemove(&dev_ctx->device_obj); vmbus_drv_obj->Base.OnDeviceRemove(&dev_ctx->device_obj);
if (vmbus_drv_obj->Base.OnCleanup) if (vmbus_drv_obj->Base.OnCleanup)
vmbus_drv_obj->Base.OnCleanup(&vmbus_drv_obj->Base); vmbus_drv_obj->Base.OnCleanup(&vmbus_drv_obj->Base);
// Unregister the root bus device /* Unregister the root bus device */
device_unregister(&dev_ctx->device); device_unregister(&dev_ctx->device);
bus_unregister(&vmbus_drv_ctx->bus); bus_unregister(&vmbus_drv_ctx->bus);
@ -494,7 +494,7 @@ void vmbus_child_driver_register(struct driver_context* driver_ctx)
DPRINT_INFO(VMBUS_DRV, "child driver (%p) registering - name %s", driver_ctx, driver_ctx->driver.name); DPRINT_INFO(VMBUS_DRV, "child driver (%p) registering - name %s", driver_ctx, driver_ctx->driver.name);
// The child driver on this vmbus /* The child driver on this vmbus */
driver_ctx->driver.bus = &g_vmbus_drv.bus; driver_ctx->driver.bus = &g_vmbus_drv.bus;
driver_register(&driver_ctx->driver); driver_register(&driver_ctx->driver);
@ -573,7 +573,7 @@ static DEVICE_OBJECT* vmbus_child_device_create(GUID type, GUID instance, void*
DPRINT_ENTER(VMBUS_DRV); DPRINT_ENTER(VMBUS_DRV);
// Allocate the new child device /* Allocate the new child device */
child_device_ctx = kzalloc(sizeof(struct device_context), GFP_KERNEL); child_device_ctx = kzalloc(sizeof(struct device_context), GFP_KERNEL);
if (!child_device_ctx) if (!child_device_ctx)
{ {
@ -620,9 +620,9 @@ static int vmbus_child_device_register(DEVICE_OBJECT* root_device_obj, DEVICE_OB
DPRINT_ENTER(VMBUS_DRV); DPRINT_ENTER(VMBUS_DRV);
DPRINT_DBG(VMBUS_DRV, "child device (%p) registering", child_device_ctx); DPRINT_DBG(VMBUS_DRV, "child device (%p) registering", child_device_ctx);
//
// Make sure we are not registered already /* Make sure we are not registered already */
//
if (strlen(dev_name(&child_device_ctx->device)) != 0) if (strlen(dev_name(&child_device_ctx->device)) != 0)
{ {
DPRINT_ERR(VMBUS_DRV, "child device (%p) already registered - busid %s", child_device_ctx, dev_name(&child_device_ctx->device)); DPRINT_ERR(VMBUS_DRV, "child device (%p) already registered - busid %s", child_device_ctx, dev_name(&child_device_ctx->device));
@ -631,19 +631,19 @@ static int vmbus_child_device_register(DEVICE_OBJECT* root_device_obj, DEVICE_OB
goto Cleanup; goto Cleanup;
} }
// Set the device bus id. Otherwise, device_register()will fail. /* Set the device bus id. Otherwise, device_register()will fail. */
dev_set_name(&child_device_ctx->device, "vmbus_0_%d", InterlockedIncrement(&device_num)); dev_set_name(&child_device_ctx->device, "vmbus_0_%d", InterlockedIncrement(&device_num));
// The new device belongs to this bus /* The new device belongs to this bus */
child_device_ctx->device.bus = &g_vmbus_drv.bus; //device->dev.bus; child_device_ctx->device.bus = &g_vmbus_drv.bus; /* device->dev.bus; */
child_device_ctx->device.parent = &root_device_ctx->device; child_device_ctx->device.parent = &root_device_ctx->device;
child_device_ctx->device.release = vmbus_device_release; child_device_ctx->device.release = vmbus_device_release;
// Register with the LDM. This will kick off the driver/device binding...which will /* Register with the LDM. This will kick off the driver/device binding...which will */
// eventually call vmbus_match() and vmbus_probe() /* eventually call vmbus_match() and vmbus_probe() */
ret = device_register(&child_device_ctx->device); ret = device_register(&child_device_ctx->device);
// vmbus_probe() error does not get propergate to device_register(). /* vmbus_probe() error does not get propergate to device_register(). */
ret = child_device_ctx->probe_error; ret = child_device_ctx->probe_error;
if (ret) if (ret)
@ -672,8 +672,8 @@ static void vmbus_child_device_unregister(DEVICE_OBJECT* device_obj)
DPRINT_INFO(VMBUS_DRV, "unregistering child device (%p)", &device_ctx->device); DPRINT_INFO(VMBUS_DRV, "unregistering child device (%p)", &device_ctx->device);
// Kick off the process of unregistering the device. /* Kick off the process of unregistering the device. */
// This will call vmbus_remove() and eventually vmbus_device_release() /* This will call vmbus_remove() and eventually vmbus_device_release() */
device_unregister(&device_ctx->device); device_unregister(&device_ctx->device);
DPRINT_INFO(VMBUS_DRV, "child device (%p) unregistered", &device_ctx->device); DPRINT_INFO(VMBUS_DRV, "child device (%p) unregistered", &device_ctx->device);
@ -770,11 +770,11 @@ static int vmbus_match(struct device *device, struct device_driver *driver)
DPRINT_ENTER(VMBUS_DRV); DPRINT_ENTER(VMBUS_DRV);
// We found our driver ? /* We found our driver ? */
if (memcmp(&device_ctx->class_id, &driver_ctx->class_id, sizeof(GUID)) == 0) if (memcmp(&device_ctx->class_id, &driver_ctx->class_id, sizeof(GUID)) == 0)
{ {
// !! NOTE: The driver_ctx is not a vmbus_drv_ctx. We typecast it here to access the /* !! NOTE: The driver_ctx is not a vmbus_drv_ctx. We typecast it here to access the */
// DRIVER_OBJECT field /* DRIVER_OBJECT field */
struct vmbus_driver_context *vmbus_drv_ctx = (struct vmbus_driver_context*)driver_ctx; struct vmbus_driver_context *vmbus_drv_ctx = (struct vmbus_driver_context*)driver_ctx;
device_ctx->device_obj.Driver = &vmbus_drv_ctx->drv_obj.Base; device_ctx->device_obj.Driver = &vmbus_drv_ctx->drv_obj.Base;
DPRINT_INFO(VMBUS_DRV, "device object (%p) set to driver object (%p)", &device_ctx->device_obj, device_ctx->device_obj.Driver); DPRINT_INFO(VMBUS_DRV, "device object (%p) set to driver object (%p)", &device_ctx->device_obj, device_ctx->device_obj.Driver);
@ -804,11 +804,11 @@ static void vmbus_probe_failed_cb(struct work_struct *context)
DPRINT_ENTER(VMBUS_DRV); DPRINT_ENTER(VMBUS_DRV);
// Kick off the process of unregistering the device. /* Kick off the process of unregistering the device. */
// This will call vmbus_remove() and eventually vmbus_device_release() /* This will call vmbus_remove() and eventually vmbus_device_release() */
device_unregister(&device_ctx->device); device_unregister(&device_ctx->device);
//put_device(&device_ctx->device); /* put_device(&device_ctx->device); */
DPRINT_EXIT(VMBUS_DRV); DPRINT_EXIT(VMBUS_DRV);
} }
@ -828,7 +828,7 @@ static int vmbus_probe(struct device *child_device)
DPRINT_ENTER(VMBUS_DRV); DPRINT_ENTER(VMBUS_DRV);
// Let the specific open-source driver handles the probe if it can /* Let the specific open-source driver handles the probe if it can */
if (driver_ctx->probe) if (driver_ctx->probe)
{ {
ret = device_ctx->probe_error = driver_ctx->probe(child_device); ret = device_ctx->probe_error = driver_ctx->probe(child_device);
@ -865,10 +865,10 @@ static int vmbus_remove(struct device *child_device)
DPRINT_ENTER(VMBUS_DRV); DPRINT_ENTER(VMBUS_DRV);
// Special case root bus device /* Special case root bus device */
if (child_device->parent == NULL) if (child_device->parent == NULL)
{ {
// No-op since it is statically defined and handle in vmbus_bus_exit() /* No-op since it is statically defined and handle in vmbus_bus_exit() */
DPRINT_EXIT(VMBUS_DRV); DPRINT_EXIT(VMBUS_DRV);
return 0; return 0;
} }
@ -877,7 +877,7 @@ static int vmbus_remove(struct device *child_device)
{ {
driver_ctx = driver_to_driver_context(child_device->driver); driver_ctx = driver_to_driver_context(child_device->driver);
// Let the specific open-source driver handles the removal if it can /* Let the specific open-source driver handles the removal if it can */
if (driver_ctx->remove) if (driver_ctx->remove)
{ {
ret = driver_ctx->remove(child_device); ret = driver_ctx->remove(child_device);
@ -911,15 +911,15 @@ static void vmbus_shutdown(struct device *child_device)
DPRINT_ENTER(VMBUS_DRV); DPRINT_ENTER(VMBUS_DRV);
// Special case root bus device /* Special case root bus device */
if (child_device->parent == NULL) if (child_device->parent == NULL)
{ {
// No-op since it is statically defined and handle in vmbus_bus_exit() /* No-op since it is statically defined and handle in vmbus_bus_exit() */
DPRINT_EXIT(VMBUS_DRV); DPRINT_EXIT(VMBUS_DRV);
return; return;
} }
// The device may not be attached yet /* The device may not be attached yet */
if (!child_device->driver) if (!child_device->driver)
{ {
DPRINT_EXIT(VMBUS_DRV); DPRINT_EXIT(VMBUS_DRV);
@ -928,7 +928,7 @@ static void vmbus_shutdown(struct device *child_device)
driver_ctx = driver_to_driver_context(child_device->driver); driver_ctx = driver_to_driver_context(child_device->driver);
// Let the specific open-source driver handles the removal if it can /* Let the specific open-source driver handles the removal if it can */
if (driver_ctx->shutdown) if (driver_ctx->shutdown)
{ {
driver_ctx->shutdown(child_device); driver_ctx->shutdown(child_device);
@ -965,10 +965,10 @@ static void vmbus_device_release(struct device *device)
DPRINT_ENTER(VMBUS_DRV); DPRINT_ENTER(VMBUS_DRV);
//vmbus_child_device_destroy(&device_ctx->device_obj); /* vmbus_child_device_destroy(&device_ctx->device_obj); */
kfree(device_ctx); kfree(device_ctx);
// !!DO NOT REFERENCE device_ctx anymore at this point!! /* !!DO NOT REFERENCE device_ctx anymore at this point!! */
DPRINT_EXIT(VMBUS_DRV); DPRINT_EXIT(VMBUS_DRV);
@ -990,7 +990,7 @@ static void vmbus_msg_dpc(unsigned long data)
ASSERT(vmbus_drv_obj->OnMsgDpc != NULL); ASSERT(vmbus_drv_obj->OnMsgDpc != NULL);
// Call to bus driver to handle interrupt /* Call to bus driver to handle interrupt */
vmbus_drv_obj->OnMsgDpc(&vmbus_drv_obj->Base); vmbus_drv_obj->OnMsgDpc(&vmbus_drv_obj->Base);
DPRINT_EXIT(VMBUS_DRV); DPRINT_EXIT(VMBUS_DRV);
@ -1011,7 +1011,7 @@ static void vmbus_event_dpc(unsigned long data)
ASSERT(vmbus_drv_obj->OnEventDpc != NULL); ASSERT(vmbus_drv_obj->OnEventDpc != NULL);
// Call to bus driver to handle interrupt /* Call to bus driver to handle interrupt */
vmbus_drv_obj->OnEventDpc(&vmbus_drv_obj->Base); vmbus_drv_obj->OnEventDpc(&vmbus_drv_obj->Base);
DPRINT_EXIT(VMBUS_DRV); DPRINT_EXIT(VMBUS_DRV);
@ -1033,10 +1033,10 @@ static irqreturn_t vmbus_isr(int irq, void* dev_id)
ASSERT(vmbus_driver_obj->OnIsr != NULL); ASSERT(vmbus_driver_obj->OnIsr != NULL);
// Call to bus driver to handle interrupt /* Call to bus driver to handle interrupt */
ret = vmbus_driver_obj->OnIsr(&vmbus_driver_obj->Base); ret = vmbus_driver_obj->OnIsr(&vmbus_driver_obj->Base);
// Schedules a dpc if necessary /* Schedules a dpc if necessary */
if (ret > 0) if (ret > 0)
{ {
if (test_bit(0, (unsigned long*)&ret)) if (test_bit(0, (unsigned long*)&ret))
@ -1078,7 +1078,7 @@ static int __init vmbus_init(void)
DPRINT_INFO(VMBUS_DRV, DPRINT_INFO(VMBUS_DRV,
"Vmbus initializing.... current log level 0x%x (%x,%x)", "Vmbus initializing.... current log level 0x%x (%x,%x)",
vmbus_loglevel, HIWORD(vmbus_loglevel), LOWORD(vmbus_loglevel)); vmbus_loglevel, HIWORD(vmbus_loglevel), LOWORD(vmbus_loglevel));
//Todo: it is used for loglevel, to be ported to new kernel. /* Todo: it is used for loglevel, to be ported to new kernel. */
ret = vmbus_bus_init(VmbusInitialize); ret = vmbus_bus_init(VmbusInitialize);
@ -1100,7 +1100,7 @@ static void __exit vmbus_exit(void)
DPRINT_ENTER(VMBUS_DRV); DPRINT_ENTER(VMBUS_DRV);
vmbus_bus_exit(); vmbus_bus_exit();
//Todo: it is used for loglevel, to be ported to new kernel. /* Todo: it is used for loglevel, to be ported to new kernel. */
DPRINT_EXIT(VMBUS_DRV); DPRINT_EXIT(VMBUS_DRV);
return; return;
@ -1111,4 +1111,4 @@ module_param(vmbus_loglevel, int, S_IRUGO);
module_init(vmbus_init); module_init(vmbus_init);
module_exit(vmbus_exit); module_exit(vmbus_exit);
// eof /* eof */