X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=drivers%2Fstaging%2Fhv%2FChannelMgmt.c;h=ec078bdfd40c4c98b639e511b1056ff7234b86d8;hb=b4f3fda5d475931d596d5cf599a193f42b857594;hp=9da57408274339c0ee29a9c3a74dd7043590c650;hpb=454f18a963cf6519bf317e74e6b9781ffef8d253;p=~andy%2Flinux diff --git a/drivers/staging/hv/ChannelMgmt.c b/drivers/staging/hv/ChannelMgmt.c index 9da57408274..ec078bdfd40 100644 --- a/drivers/staging/hv/ChannelMgmt.c +++ b/drivers/staging/hv/ChannelMgmt.c @@ -22,7 +22,9 @@ */ -#include "include/osd.h" +#include +#include +#include "osd.h" #include "include/logging.h" #include "VmbusPrivate.h" @@ -87,20 +89,46 @@ VmbusChannelProcessRescindOffer( #define MAX_NUM_DEVICE_CLASSES_SUPPORTED 4 -const GUID gSupportedDeviceClasses[MAX_NUM_DEVICE_CLASSES_SUPPORTED]= { +static const struct hv_guid gSupportedDeviceClasses[MAX_NUM_DEVICE_CLASSES_SUPPORTED] = { /* {ba6163d9-04a1-4d29-b605-72e2ffb1dc7f} */ - {.Data = {0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f}},/* Storage - SCSI */ + /* Storage - SCSI */ + { + .data = { + 0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, + 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f + } + }, + /* {F8615163-DF3E-46c5-913F-F2D2F965ED0E} */ - {.Data = {0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E}}, /* Network */ + /* Network */ + { + .data = { + 0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, + 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E + } + }, + /* {CFA8B69E-5B4A-4cc0-B98B-8BA1A1F3F95A} */ - {.Data = {0x9E, 0xB6, 0xA8, 0xCF, 0x4A, 0x5B, 0xc0, 0x4c, 0xB9, 0x8B, 0x8B, 0xA1, 0xA1, 0xF3, 0xF9, 0x5A}}, /* Input */ - /* {32412632-86cb-44a2-9b5c-50d1417354f5} */ - {.Data = {0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5}}, /* IDE */ + /* Input */ + { + .data = { + 0x9E, 0xB6, 0xA8, 0xCF, 0x4A, 0x5B, 0xc0, 0x4c, + 0xB9, 0x8B, 0x8B, 0xA1, 0xA1, 0xF3, 0xF9, 0x5A + } + }, + /* {32412632-86cb-44a2-9b5c-50d1417354f5} */ + /* IDE */ + { + .data = { + 0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, + 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5 + } + }, }; /* Channel message dispatch table */ -VMBUS_CHANNEL_MESSAGE_TABLE_ENTRY gChannelMessageTable[ChannelMessageCount]= { +static VMBUS_CHANNEL_MESSAGE_TABLE_ENTRY gChannelMessageTable[ChannelMessageCount]= { {ChannelMessageInvalid, NULL}, {ChannelMessageOfferChannel, VmbusChannelOnOffer}, {ChannelMessageRescindChannelOffer, VmbusChannelOnOfferRescind}, @@ -129,11 +157,11 @@ Description: Allocate and initialize a vmbus channel object --*/ -VMBUS_CHANNEL* AllocVmbusChannel(void) +struct vmbus_channel *AllocVmbusChannel(void) { - VMBUS_CHANNEL* channel; + struct vmbus_channel *channel; - channel = kzalloc(sizeof(VMBUS_CHANNEL), GFP_ATOMIC); + channel = kzalloc(sizeof(*channel), GFP_ATOMIC); if (!channel) { return NULL; @@ -141,18 +169,14 @@ VMBUS_CHANNEL* AllocVmbusChannel(void) spin_lock_init(&channel->inbound_lock); - channel->PollTimer = TimerCreate(VmbusChannelOnTimer, channel); - if (!channel->PollTimer) - { - kfree(channel); - return NULL; - } + init_timer(&channel->poll_timer); + channel->poll_timer.data = (unsigned long)channel; + channel->poll_timer.function = VmbusChannelOnTimer; /* channel->dataWorkQueue = WorkQueueCreate("data"); */ - channel->ControlWQ = WorkQueueCreate("control"); + channel->ControlWQ = create_workqueue("hv_vmbus_ctl"); if (!channel->ControlWQ) { - TimerClose(channel->PollTimer); kfree(channel); return NULL; } @@ -171,12 +195,12 @@ Description: --*/ static inline void ReleaseVmbusChannel(void* Context) { - VMBUS_CHANNEL* channel = (VMBUS_CHANNEL*)Context; + struct vmbus_channel *channel = Context; DPRINT_ENTER(VMBUS); DPRINT_DBG(VMBUS, "releasing channel (%p)", channel); - WorkQueueClose(channel->ControlWQ); + destroy_workqueue(channel->ControlWQ); DPRINT_DBG(VMBUS, "channel released (%p)", channel); kfree(channel); @@ -193,13 +217,14 @@ Description: Release the resources used by the vmbus channel object --*/ -void FreeVmbusChannel(VMBUS_CHANNEL* Channel) +void FreeVmbusChannel(struct vmbus_channel *Channel) { - TimerClose(Channel->PollTimer); + del_timer(&Channel->poll_timer); /* We have to release the channel's workqueue/thread in the vmbus's workqueue/thread context */ /* ie we can't destroy ourselves. */ - WorkQueueQueueWorkItem(gVmbusConnection.WorkQueue, ReleaseVmbusChannel, (void*)Channel); + osd_schedule_callback(gVmbusConnection.WorkQueue, ReleaseVmbusChannel, + (void *)Channel); } @@ -218,11 +243,11 @@ VmbusChannelProcessOffer( ) { int ret=0; - VMBUS_CHANNEL* newChannel=(VMBUS_CHANNEL*)context; + struct vmbus_channel *newChannel = context; + struct vmbus_channel *channel; LIST_ENTRY* anchor; LIST_ENTRY* curr; bool fNew = true; - VMBUS_CHANNEL* channel; unsigned long flags; DPRINT_ENTER(VMBUS); @@ -232,10 +257,10 @@ VmbusChannelProcessOffer( ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelList) { - channel = CONTAINING_RECORD(curr, VMBUS_CHANNEL, ListEntry); + channel = CONTAINING_RECORD(curr, struct vmbus_channel, ListEntry); - if (!memcmp(&channel->OfferMsg.Offer.InterfaceType, &newChannel->OfferMsg.Offer.InterfaceType,sizeof(GUID)) && - !memcmp(&channel->OfferMsg.Offer.InterfaceInstance, &newChannel->OfferMsg.Offer.InterfaceInstance, sizeof(GUID))) + if (!memcmp(&channel->OfferMsg.Offer.InterfaceType, &newChannel->OfferMsg.Offer.InterfaceType,sizeof(struct hv_guid)) && + !memcmp(&channel->OfferMsg.Offer.InterfaceInstance, &newChannel->OfferMsg.Offer.InterfaceInstance, sizeof(struct hv_guid))) { fNew = false; break; @@ -259,8 +284,8 @@ VmbusChannelProcessOffer( /* Start the process of binding this offer to the driver */ /* We need to set the DeviceObject field before calling VmbusChildDeviceAdd() */ newChannel->DeviceObject = VmbusChildDeviceCreate( - newChannel->OfferMsg.Offer.InterfaceType, - newChannel->OfferMsg.Offer.InterfaceInstance, + &newChannel->OfferMsg.Offer.InterfaceType, + &newChannel->OfferMsg.Offer.InterfaceInstance, newChannel); DPRINT_DBG(VMBUS, "child device object allocated - %p", newChannel->DeviceObject); @@ -309,7 +334,7 @@ VmbusChannelProcessRescindOffer( void * context ) { - VMBUS_CHANNEL* channel=(VMBUS_CHANNEL*)context; + struct vmbus_channel *channel = context; DPRINT_ENTER(VMBUS); @@ -336,10 +361,10 @@ VmbusChannelOnOffer( ) { VMBUS_CHANNEL_OFFER_CHANNEL* offer = (VMBUS_CHANNEL_OFFER_CHANNEL*)hdr; - VMBUS_CHANNEL* newChannel; + struct vmbus_channel *newChannel; - GUID *guidType; - GUID *guidInstance; + struct hv_guid *guidType; + struct hv_guid *guidInstance; int i; int fSupported=0; @@ -347,7 +372,7 @@ VmbusChannelOnOffer( for (i=0; iOffer.InterfaceType, &gSupportedDeviceClasses[i], sizeof(GUID)) == 0) + if (memcmp(&offer->Offer.InterfaceType, &gSupportedDeviceClasses[i], sizeof(struct hv_guid)) == 0) { fSupported = 1; break; @@ -371,8 +396,14 @@ VmbusChannelOnOffer( offer->ChildRelId, offer->MonitorId, offer->MonitorAllocated, - 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]); + 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]); /* Allocate the channel object and save this offer. */ newChannel = AllocVmbusChannel(); @@ -389,7 +420,8 @@ VmbusChannelOnOffer( newChannel->MonitorBit = (u8)offer->MonitorId % 32; /* TODO: Make sure the offer comes from our parent partition */ - WorkQueueQueueWorkItem(newChannel->ControlWQ, VmbusChannelProcessOffer, newChannel); + osd_schedule_callback(newChannel->ControlWQ, VmbusChannelProcessOffer, + newChannel); DPRINT_EXIT(VMBUS); } @@ -411,7 +443,7 @@ VmbusChannelOnOfferRescind( ) { VMBUS_CHANNEL_RESCIND_OFFER* rescind = (VMBUS_CHANNEL_RESCIND_OFFER*)hdr; - VMBUS_CHANNEL* channel; + struct vmbus_channel *channel; DPRINT_ENTER(VMBUS); @@ -422,7 +454,9 @@ VmbusChannelOnOfferRescind( return; } - WorkQueueQueueWorkItem(channel->ControlWQ, VmbusChannelProcessRescindOffer, channel); + osd_schedule_callback(channel->ControlWQ, + VmbusChannelProcessRescindOffer, + channel); DPRINT_EXIT(VMBUS); } @@ -467,7 +501,7 @@ VmbusChannelOnOpenResult( VMBUS_CHANNEL_OPEN_RESULT* result = (VMBUS_CHANNEL_OPEN_RESULT*)hdr; LIST_ENTRY* anchor; LIST_ENTRY* curr; - VMBUS_CHANNEL_MSGINFO* msgInfo; + struct vmbus_channel_msginfo *msgInfo; VMBUS_CHANNEL_MESSAGE_HEADER* requestHeader; VMBUS_CHANNEL_OPEN_CHANNEL* openMsg; unsigned long flags; @@ -481,7 +515,7 @@ VmbusChannelOnOpenResult( ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelMsgList) { - msgInfo = (VMBUS_CHANNEL_MSGINFO*) curr; + msgInfo = (struct vmbus_channel_msginfo *)curr; requestHeader = (VMBUS_CHANNEL_MESSAGE_HEADER*)msgInfo->Msg; if (requestHeader->MessageType == ChannelMessageOpenChannel) @@ -491,7 +525,7 @@ VmbusChannelOnOpenResult( openMsg->OpenId == result->OpenId) { memcpy(&msgInfo->Response.OpenResult, result, sizeof(VMBUS_CHANNEL_OPEN_RESULT)); - WaitEventSet(msgInfo->WaitEvent); + osd_WaitEventSet(msgInfo->WaitEvent); break; } } @@ -521,7 +555,7 @@ VmbusChannelOnGpadlCreated( VMBUS_CHANNEL_GPADL_CREATED *gpadlCreated = (VMBUS_CHANNEL_GPADL_CREATED*)hdr; LIST_ENTRY *anchor; LIST_ENTRY *curr; - VMBUS_CHANNEL_MSGINFO *msgInfo; + struct vmbus_channel_msginfo *msgInfo; VMBUS_CHANNEL_MESSAGE_HEADER *requestHeader; VMBUS_CHANNEL_GPADL_HEADER *gpadlHeader; unsigned long flags; @@ -535,7 +569,7 @@ VmbusChannelOnGpadlCreated( ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelMsgList) { - msgInfo = (VMBUS_CHANNEL_MSGINFO*) curr; + msgInfo = (struct vmbus_channel_msginfo *)curr; requestHeader = (VMBUS_CHANNEL_MESSAGE_HEADER*)msgInfo->Msg; if (requestHeader->MessageType == ChannelMessageGpadlHeader) @@ -546,7 +580,7 @@ VmbusChannelOnGpadlCreated( (gpadlCreated->Gpadl == gpadlHeader->Gpadl)) { memcpy(&msgInfo->Response.GpadlCreated, gpadlCreated, sizeof(VMBUS_CHANNEL_GPADL_CREATED)); - WaitEventSet(msgInfo->WaitEvent); + osd_WaitEventSet(msgInfo->WaitEvent); break; } } @@ -576,7 +610,7 @@ VmbusChannelOnGpadlTorndown( VMBUS_CHANNEL_GPADL_TORNDOWN* gpadlTorndown = (VMBUS_CHANNEL_GPADL_TORNDOWN*)hdr; LIST_ENTRY* anchor; LIST_ENTRY* curr; - VMBUS_CHANNEL_MSGINFO* msgInfo; + struct vmbus_channel_msginfo *msgInfo; VMBUS_CHANNEL_MESSAGE_HEADER *requestHeader; VMBUS_CHANNEL_GPADL_TEARDOWN *gpadlTeardown; unsigned long flags; @@ -588,7 +622,7 @@ VmbusChannelOnGpadlTorndown( ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelMsgList) { - msgInfo = (VMBUS_CHANNEL_MSGINFO*) curr; + msgInfo = (struct vmbus_channel_msginfo *)curr; requestHeader = (VMBUS_CHANNEL_MESSAGE_HEADER*)msgInfo->Msg; if (requestHeader->MessageType == ChannelMessageGpadlTeardown) @@ -598,7 +632,7 @@ VmbusChannelOnGpadlTorndown( if (gpadlTorndown->Gpadl == gpadlTeardown->Gpadl) { memcpy(&msgInfo->Response.GpadlTorndown, gpadlTorndown, sizeof(VMBUS_CHANNEL_GPADL_TORNDOWN)); - WaitEventSet(msgInfo->WaitEvent); + osd_WaitEventSet(msgInfo->WaitEvent); break; } } @@ -627,7 +661,7 @@ VmbusChannelOnVersionResponse( { LIST_ENTRY* anchor; LIST_ENTRY* curr; - VMBUS_CHANNEL_MSGINFO *msgInfo; + struct vmbus_channel_msginfo *msgInfo; VMBUS_CHANNEL_MESSAGE_HEADER *requestHeader; VMBUS_CHANNEL_INITIATE_CONTACT *initiate; VMBUS_CHANNEL_VERSION_RESPONSE *versionResponse = (VMBUS_CHANNEL_VERSION_RESPONSE*)hdr; @@ -639,14 +673,14 @@ VmbusChannelOnVersionResponse( ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelMsgList) { - msgInfo = (VMBUS_CHANNEL_MSGINFO*) curr; + msgInfo = (struct vmbus_channel_msginfo *)curr; requestHeader = (VMBUS_CHANNEL_MESSAGE_HEADER*)msgInfo->Msg; if (requestHeader->MessageType == ChannelMessageInitiateContact) { initiate = (VMBUS_CHANNEL_INITIATE_CONTACT*)requestHeader; memcpy(&msgInfo->Response.VersionResponse, versionResponse, sizeof(VMBUS_CHANNEL_VERSION_RESPONSE)); - WaitEventSet(msgInfo->WaitEvent); + osd_WaitEventSet(msgInfo->WaitEvent); } } spin_unlock_irqrestore(&gVmbusConnection.channelmsg_lock, flags); @@ -665,10 +699,7 @@ Description: This is invoked in the vmbus worker thread context. --*/ -void -VmbusOnChannelMessage( - void *Context - ) +void VmbusOnChannelMessage(void *Context) { HV_MESSAGE *msg=(HV_MESSAGE*)Context; VMBUS_CHANNEL_MESSAGE_HEADER* hdr; @@ -714,21 +745,18 @@ Description: Send a request to get all our pending offers. --*/ -int -VmbusChannelRequestOffers( - void - ) +int VmbusChannelRequestOffers(void) { int ret=0; VMBUS_CHANNEL_MESSAGE_HEADER* msg; - VMBUS_CHANNEL_MSGINFO* msgInfo; + struct vmbus_channel_msginfo *msgInfo; DPRINT_ENTER(VMBUS); - msgInfo = kmalloc(sizeof(VMBUS_CHANNEL_MSGINFO) + sizeof(VMBUS_CHANNEL_MESSAGE_HEADER), GFP_KERNEL); + msgInfo = kmalloc(sizeof(*msgInfo) + sizeof(VMBUS_CHANNEL_MESSAGE_HEADER), GFP_KERNEL); ASSERT(msgInfo != NULL); - msgInfo->WaitEvent = WaitEventCreate(); + msgInfo->WaitEvent = osd_WaitEventCreate(); msg = (VMBUS_CHANNEL_MESSAGE_HEADER*)msgInfo->Msg; msg->MessageType = ChannelMessageRequestOffers; @@ -748,7 +776,7 @@ VmbusChannelRequestOffers( goto Cleanup; } - /* WaitEventWait(msgInfo->waitEvent); */ + /* osd_WaitEventWait(msgInfo->waitEvent); */ /*SpinlockAcquire(gVmbusConnection.channelMsgLock); REMOVE_ENTRY_LIST(&msgInfo->msgListEntry); @@ -758,7 +786,7 @@ VmbusChannelRequestOffers( Cleanup: if (msgInfo) { - WaitEventClose(msgInfo->WaitEvent); + kfree(msgInfo->WaitEvent); kfree(msgInfo); } @@ -776,14 +804,11 @@ Description: Release channels that are unattached/unconnected ie (no drivers associated) --*/ -void -VmbusChannelReleaseUnattachedChannels( - void - ) +void VmbusChannelReleaseUnattachedChannels(void) { LIST_ENTRY *entry; - VMBUS_CHANNEL *channel; - VMBUS_CHANNEL *start=NULL; + struct vmbus_channel *channel; + struct vmbus_channel *start = NULL; unsigned long flags; spin_lock_irqsave(&gVmbusConnection.channel_lock, flags); @@ -791,7 +816,7 @@ VmbusChannelReleaseUnattachedChannels( while (!IsListEmpty(&gVmbusConnection.ChannelList)) { entry = TOP_LIST_ENTRY(&gVmbusConnection.ChannelList); - channel = CONTAINING_RECORD(entry, VMBUS_CHANNEL, ListEntry); + channel = CONTAINING_RECORD(entry, struct vmbus_channel, ListEntry); if (channel == start) break;