]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/staging/hv/channel_mgmt.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / staging / hv / channel_mgmt.c
index 45dbe305afed2fff3053403885e5e7c10ecdc820..d44d5c39f68bddf4c71364c80e904889a42d3c1e 100644 (file)
@@ -251,8 +251,8 @@ static struct vmbus_channel *alloc_channel(void)
        channel->poll_timer.data = (unsigned long)channel;
        channel->poll_timer.function = vmbus_ontimer;
 
-       channel->ControlWQ = create_workqueue("hv_vmbus_ctl");
-       if (!channel->ControlWQ) {
+       channel->controlwq = create_workqueue("hv_vmbus_ctl");
+       if (!channel->controlwq) {
                kfree(channel);
                return NULL;
        }
@@ -263,12 +263,14 @@ static struct vmbus_channel *alloc_channel(void)
 /*
  * release_hannel - Release the vmbus channel object itself
  */
-static inline void release_channel(void *context)
+static void release_channel(struct work_struct *work)
 {
-       struct vmbus_channel *channel = context;
+       struct vmbus_channel *channel = container_of(work,
+                                                    struct vmbus_channel,
+                                                    work);
 
        DPRINT_DBG(VMBUS, "releasing channel (%p)", channel);
-       destroy_workqueue(channel->ControlWQ);
+       destroy_workqueue(channel->controlwq);
        DPRINT_DBG(VMBUS, "channel released (%p)", channel);
 
        kfree(channel);
@@ -286,8 +288,8 @@ void free_channel(struct vmbus_channel *channel)
         * workqueue/thread context
         * ie we can't destroy ourselves.
         */
-       osd_schedule_callback(gVmbusConnection.WorkQueue, release_channel,
-                             channel);
+       INIT_WORK(&channel->work, release_channel);
+       queue_work(gVmbusConnection.WorkQueue, &channel->work);
 }
 
 
@@ -308,29 +310,46 @@ static void count_hv_channel(void)
        spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
 }
 
+/*
+ * vmbus_process_rescind_offer -
+ * Rescind the offer by initiating a device removal
+ */
+static void vmbus_process_rescind_offer(struct work_struct *work)
+{
+       struct vmbus_channel *channel = container_of(work,
+                                                    struct vmbus_channel,
+                                                    work);
+
+       vmbus_child_device_unregister(channel->device_obj);
+}
 
 /*
  * vmbus_process_offer - Process the offer by creating a channel/device
  * associated with this offer
  */
-static void vmbus_process_offer(void *context)
+static void vmbus_process_offer(struct work_struct *work)
 {
-       struct vmbus_channel *newchannel = context;
+       struct vmbus_channel *newchannel = container_of(work,
+                                                       struct vmbus_channel,
+                                                       work);
        struct vmbus_channel *channel;
        bool fnew = true;
        int ret;
        int cnt;
        unsigned long flags;
 
+       /* The next possible work is rescind handling */
+       INIT_WORK(&newchannel->work, vmbus_process_rescind_offer);
+
        /* Make sure this is a new offer */
        spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
 
-       list_for_each_entry(channel, &gVmbusConnection.ChannelList, ListEntry) {
-               if (!memcmp(&channel->OfferMsg.Offer.InterfaceType,
-                           &newchannel->OfferMsg.Offer.InterfaceType,
+       list_for_each_entry(channel, &gVmbusConnection.ChannelList, listentry) {
+               if (!memcmp(&channel->offermsg.offer.InterfaceType,
+                           &newchannel->offermsg.offer.InterfaceType,
                            sizeof(struct hv_guid)) &&
-                   !memcmp(&channel->OfferMsg.Offer.InterfaceInstance,
-                           &newchannel->OfferMsg.Offer.InterfaceInstance,
+                   !memcmp(&channel->offermsg.offer.InterfaceInstance,
+                           &newchannel->offermsg.offer.InterfaceInstance,
                            sizeof(struct hv_guid))) {
                        fnew = false;
                        break;
@@ -338,14 +357,14 @@ static void vmbus_process_offer(void *context)
        }
 
        if (fnew)
-               list_add_tail(&newchannel->ListEntry,
+               list_add_tail(&newchannel->listentry,
                              &gVmbusConnection.ChannelList);
 
        spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
 
        if (!fnew) {
                DPRINT_DBG(VMBUS, "Ignoring duplicate offer for relid (%d)",
-                          newchannel->OfferMsg.ChildRelId);
+                          newchannel->offermsg.child_relid);
                free_channel(newchannel);
                return;
        }
@@ -355,27 +374,27 @@ static void vmbus_process_offer(void *context)
         * We need to set the DeviceObject field before calling
         * VmbusChildDeviceAdd()
         */
-       newchannel->DeviceObject = VmbusChildDeviceCreate(
-               &newchannel->OfferMsg.Offer.InterfaceType,
-               &newchannel->OfferMsg.Offer.InterfaceInstance,
+       newchannel->device_obj = vmbus_child_device_create(
+               &newchannel->offermsg.offer.InterfaceType,
+               &newchannel->offermsg.offer.InterfaceInstance,
                newchannel);
 
        DPRINT_DBG(VMBUS, "child device object allocated - %p",
-                  newchannel->DeviceObject);
+                  newchannel->device_obj);
 
        /*
         * 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->device_obj);
        if (ret != 0) {
                DPRINT_ERR(VMBUS,
                           "unable to add child device object (relid %d)",
-                          newchannel->OfferMsg.ChildRelId);
+                          newchannel->offermsg.child_relid);
 
                spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
-               list_del(&newchannel->ListEntry);
+               list_del(&newchannel->listentry);
                spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
 
                free_channel(newchannel);
@@ -385,11 +404,11 @@ static void vmbus_process_offer(void *context)
                 * so that when we do close the channel normally, we
                 * can cleanup properly
                 */
-               newchannel->State = CHANNEL_OPEN_STATE;
+               newchannel->state = CHANNEL_OPEN_STATE;
 
                /* Open IC channels */
                for (cnt = 0; cnt < MAX_MSG_TYPES; cnt++) {
-                       if (memcmp(&newchannel->OfferMsg.Offer.InterfaceType,
+                       if (memcmp(&newchannel->offermsg.offer.InterfaceType,
                                   &hv_cb_utils[cnt].data,
                                   sizeof(struct hv_guid)) == 0 &&
                                vmbus_open(newchannel, 2 * PAGE_SIZE,
@@ -405,17 +424,6 @@ static void vmbus_process_offer(void *context)
        }
 }
 
-/*
- * vmbus_process_rescind_offer -
- * Rescind the offer by initiating a device removal
- */
-static void vmbus_process_rescind_offer(void *context)
-{
-       struct vmbus_channel *channel = context;
-
-       VmbusChildDeviceRemove(channel->DeviceObject);
-}
-
 /*
  * vmbus_onoffer - Handler for channel offers from vmbus in parent partition.
  *
@@ -434,7 +442,7 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr)
 
        offer = (struct vmbus_channel_offer_channel *)hdr;
        for (i = 0; i < MAX_NUM_DEVICE_CLASSES_SUPPORTED; i++) {
-               if (memcmp(&offer->Offer.InterfaceType,
+               if (memcmp(&offer->offer.InterfaceType,
                    &gSupportedDeviceClasses[i], sizeof(struct hv_guid)) == 0) {
                        fsupported = 1;
                        break;
@@ -443,12 +451,12 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr)
 
        if (!fsupported) {
                DPRINT_DBG(VMBUS, "Ignoring channel offer notification for "
-                          "child relid %d", offer->ChildRelId);
+                          "child relid %d", offer->child_relid);
                return;
        }
 
-       guidtype = &offer->Offer.InterfaceType;
-       guidinstance = &offer->Offer.InterfaceInstance;
+       guidtype = &offer->offer.InterfaceType;
+       guidinstance = &offer->offer.InterfaceInstance;
 
        DPRINT_INFO(VMBUS, "Channel offer notification - "
                    "child relid %d monitor id %d allocated %d, "
@@ -456,8 +464,8 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr)
                    "%02x%02x%02x%02x%02x%02x%02x%02x} "
                    "instance {%02x%02x%02x%02x-%02x%02x-%02x%02x-"
                    "%02x%02x%02x%02x%02x%02x%02x%02x}",
-                   offer->ChildRelId, offer->MonitorId,
-                   offer->MonitorAllocated,
+                   offer->child_relid, offer->monitorid,
+                   offer->monitor_allocated,
                    guidtype->data[3], guidtype->data[2],
                    guidtype->data[1], guidtype->data[0],
                    guidtype->data[5], guidtype->data[4],
@@ -484,14 +492,14 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr)
 
        DPRINT_DBG(VMBUS, "channel object allocated - %p", newchannel);
 
-       memcpy(&newchannel->OfferMsg, offer,
+       memcpy(&newchannel->offermsg, offer,
               sizeof(struct vmbus_channel_offer_channel));
-       newchannel->MonitorGroup = (u8)offer->MonitorId / 32;
-       newchannel->MonitorBit = (u8)offer->MonitorId % 32;
+       newchannel->monitor_grp = (u8)offer->monitorid / 32;
+       newchannel->monitor_bit = (u8)offer->monitorid % 32;
 
        /* TODO: Make sure the offer comes from our parent partition */
-       osd_schedule_callback(newchannel->ControlWQ, vmbus_process_offer,
-                             newchannel);
+       INIT_WORK(&newchannel->work, vmbus_process_offer);
+       queue_work(newchannel->controlwq, &newchannel->work);
 }
 
 /*
@@ -505,16 +513,16 @@ static void vmbus_onoffer_rescind(struct vmbus_channel_message_header *hdr)
        struct vmbus_channel *channel;
 
        rescind = (struct vmbus_channel_rescind_offer *)hdr;
-       channel = GetChannelFromRelId(rescind->ChildRelId);
+       channel = GetChannelFromRelId(rescind->child_relid);
        if (channel == NULL) {
                DPRINT_DBG(VMBUS, "channel not found for relId %d",
-                          rescind->ChildRelId);
+                          rescind->child_relid);
                return;
        }
 
-       osd_schedule_callback(channel->ControlWQ,
-                             vmbus_process_rescind_offer,
-                             channel);
+       /* work is initialized for vmbus_process_rescind_offer() from
+        * vmbus_process_offer() where the channel got created */
+       queue_work(channel->controlwq, &channel->work);
 }
 
 /*
@@ -545,7 +553,7 @@ static void vmbus_onopen_result(struct vmbus_channel_message_header *hdr)
        unsigned long flags;
 
        result = (struct vmbus_channel_open_result *)hdr;
-       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
@@ -556,17 +564,17 @@ static void vmbus_onopen_result(struct vmbus_channel_message_header *hdr)
 /* FIXME: this should probably use list_entry() instead */
                msginfo = (struct vmbus_channel_msginfo *)curr;
                requestheader =
-                       (struct vmbus_channel_message_header *)msginfo->Msg;
+                       (struct vmbus_channel_message_header *)msginfo->msg;
 
-               if (requestheader->MessageType == ChannelMessageOpenChannel) {
+               if (requestheader->msgtype == CHANNELMSG_OPENCHANNEL) {
                        openmsg =
-                       (struct vmbus_channel_open_channel *)msginfo->Msg;
-                       if (openmsg->ChildRelId == result->ChildRelId &&
-                           openmsg->OpenId == result->OpenId) {
-                               memcpy(&msginfo->Response.OpenResult,
+                       (struct vmbus_channel_open_channel *)msginfo->msg;
+                       if (openmsg->child_relid == result->child_relid &&
+                           openmsg->openid == result->openid) {
+                               memcpy(&msginfo->response.open_result,
                                       result,
                                       sizeof(struct vmbus_channel_open_result));
-                               osd_WaitEventSet(msginfo->WaitEvent);
+                               osd_waitevent_set(msginfo->waitevent);
                                break;
                        }
                }
@@ -592,7 +600,7 @@ static void vmbus_ongpadl_created(struct vmbus_channel_message_header *hdr)
 
        gpadlcreated = (struct vmbus_channel_gpadl_created *)hdr;
        DPRINT_DBG(VMBUS, "vmbus gpadl created result - %d",
-                  gpadlcreated->CreationStatus);
+                  gpadlcreated->creation_status);
 
        /*
         * Find the establish msg, copy the result and signal/unblock the wait
@@ -604,19 +612,19 @@ static void vmbus_ongpadl_created(struct vmbus_channel_message_header *hdr)
 /* FIXME: this should probably use list_entry() instead */
                msginfo = (struct vmbus_channel_msginfo *)curr;
                requestheader =
-                       (struct vmbus_channel_message_header *)msginfo->Msg;
+                       (struct vmbus_channel_message_header *)msginfo->msg;
 
-               if (requestheader->MessageType == ChannelMessageGpadlHeader) {
+               if (requestheader->msgtype == CHANNELMSG_GPADL_HEADER) {
                        gpadlheader =
                        (struct vmbus_channel_gpadl_header *)requestheader;
 
-                       if ((gpadlcreated->ChildRelId ==
-                            gpadlheader->ChildRelId) &&
-                           (gpadlcreated->Gpadl == gpadlheader->Gpadl)) {
-                               memcpy(&msginfo->Response.GpadlCreated,
+                       if ((gpadlcreated->child_relid ==
+                            gpadlheader->child_relid) &&
+                           (gpadlcreated->gpadl == gpadlheader->gpadl)) {
+                               memcpy(&msginfo->response.gpadl_created,
                                       gpadlcreated,
                                       sizeof(struct vmbus_channel_gpadl_created));
-                               osd_WaitEventSet(msginfo->WaitEvent);
+                               osd_waitevent_set(msginfo->waitevent);
                                break;
                        }
                }
@@ -652,17 +660,17 @@ static void vmbus_ongpadl_torndown(
 /* FIXME: this should probably use list_entry() instead */
                msginfo = (struct vmbus_channel_msginfo *)curr;
                requestheader =
-                       (struct vmbus_channel_message_header *)msginfo->Msg;
+                       (struct vmbus_channel_message_header *)msginfo->msg;
 
-               if (requestheader->MessageType == ChannelMessageGpadlTeardown) {
+               if (requestheader->msgtype == CHANNELMSG_GPADL_TEARDOWN) {
                        gpadl_teardown =
                        (struct vmbus_channel_gpadl_teardown *)requestheader;
 
-                       if (gpadl_torndown->Gpadl == gpadl_teardown->Gpadl) {
-                               memcpy(&msginfo->Response.GpadlTorndown,
+                       if (gpadl_torndown->gpadl == gpadl_teardown->gpadl) {
+                               memcpy(&msginfo->response.gpadl_torndown,
                                       gpadl_torndown,
                                       sizeof(struct vmbus_channel_gpadl_torndown));
-                               osd_WaitEventSet(msginfo->WaitEvent);
+                               osd_waitevent_set(msginfo->waitevent);
                                break;
                        }
                }
@@ -694,16 +702,16 @@ static void vmbus_onversion_response(
 /* FIXME: this should probably use list_entry() instead */
                msginfo = (struct vmbus_channel_msginfo *)curr;
                requestheader =
-                       (struct vmbus_channel_message_header *)msginfo->Msg;
+                       (struct vmbus_channel_message_header *)msginfo->msg;
 
-               if (requestheader->MessageType ==
-                   ChannelMessageInitiateContact) {
+               if (requestheader->msgtype ==
+                   CHANNELMSG_INITIATE_CONTACT) {
                        initiate =
                        (struct vmbus_channel_initiate_contact *)requestheader;
-                       memcpy(&msginfo->Response.VersionResponse,
+                       memcpy(&msginfo->response.version_response,
                              version_response,
                              sizeof(struct vmbus_channel_version_response));
-                       osd_WaitEventSet(msginfo->WaitEvent);
+                       osd_waitevent_set(msginfo->waitevent);
                }
        }
        spin_unlock_irqrestore(&gVmbusConnection.channelmsg_lock, flags);
@@ -711,24 +719,24 @@ static void vmbus_onversion_response(
 
 /* Channel message dispatch table */
 static struct vmbus_channel_message_table_entry
-       gChannelMessageTable[ChannelMessageCount] = {
-       {ChannelMessageInvalid,                 NULL},
-       {ChannelMessageOfferChannel,            vmbus_onoffer},
-       {ChannelMessageRescindChannelOffer,     vmbus_onoffer_rescind},
-       {ChannelMessageRequestOffers,           NULL},
-       {ChannelMessageAllOffersDelivered,      vmbus_onoffers_delivered},
-       {ChannelMessageOpenChannel,             NULL},
-       {ChannelMessageOpenChannelResult,       vmbus_onopen_result},
-       {ChannelMessageCloseChannel,            NULL},
-       {ChannelMessageGpadlHeader,             NULL},
-       {ChannelMessageGpadlBody,               NULL},
-       {ChannelMessageGpadlCreated,            vmbus_ongpadl_created},
-       {ChannelMessageGpadlTeardown,           NULL},
-       {ChannelMessageGpadlTorndown,           vmbus_ongpadl_torndown},
-       {ChannelMessageRelIdReleased,           NULL},
-       {ChannelMessageInitiateContact,         NULL},
-       {ChannelMessageVersionResponse,         vmbus_onversion_response},
-       {ChannelMessageUnload,                  NULL},
+       gChannelMessageTable[CHANNELMSG_COUNT] = {
+       {CHANNELMSG_INVALID,                    NULL},
+       {CHANNELMSG_OFFERCHANNEL,               vmbus_onoffer},
+       {CHANNELMSG_RESCIND_CHANNELOFFER,       vmbus_onoffer_rescind},
+       {CHANNELMSG_REQUESTOFFERS,              NULL},
+       {CHANNELMSG_ALLOFFERS_DELIVERED,        vmbus_onoffers_delivered},
+       {CHANNELMSG_OPENCHANNEL,                NULL},
+       {CHANNELMSG_OPENCHANNEL_RESULT, vmbus_onopen_result},
+       {CHANNELMSG_CLOSECHANNEL,               NULL},
+       {CHANNELMSG_GPADL_HEADER,               NULL},
+       {CHANNELMSG_GPADL_BODY,         NULL},
+       {CHANNELMSG_GPADL_CREATED,              vmbus_ongpadl_created},
+       {CHANNELMSG_GPADL_TEARDOWN,             NULL},
+       {CHANNELMSG_GPADL_TORNDOWN,             vmbus_ongpadl_torndown},
+       {CHANNELMSG_RELID_RELEASED,             NULL},
+       {CHANNELMSG_INITIATE_CONTACT,           NULL},
+       {CHANNELMSG_VERSION_RESPONSE,           vmbus_onversion_response},
+       {CHANNELMSG_UNLOAD,                     NULL},
 };
 
 /*
@@ -742,29 +750,25 @@ void vmbus_onmessage(void *context)
        struct vmbus_channel_message_header *hdr;
        int size;
 
-       hdr = (struct vmbus_channel_message_header *)msg->u.Payload;
-       size = msg->Header.PayloadSize;
+       hdr = (struct vmbus_channel_message_header *)msg->u.payload;
+       size = msg->header.payload_size;
 
-       DPRINT_DBG(VMBUS, "message type %d size %d", hdr->MessageType, size);
+       DPRINT_DBG(VMBUS, "message type %d size %d", hdr->msgtype, size);
 
-       if (hdr->MessageType >= ChannelMessageCount) {
+       if (hdr->msgtype >= CHANNELMSG_COUNT) {
                DPRINT_ERR(VMBUS,
                           "Received invalid channel message type %d size %d",
-                          hdr->MessageType, size);
+                          hdr->msgtype, size);
                print_hex_dump_bytes("", DUMP_PREFIX_NONE,
-                                    (unsigned char *)msg->u.Payload, size);
-               kfree(msg);
+                                    (unsigned char *)msg->u.payload, size);
                return;
        }
 
-       if (gChannelMessageTable[hdr->MessageType].messageHandler)
-               gChannelMessageTable[hdr->MessageType].messageHandler(hdr);
+       if (gChannelMessageTable[hdr->msgtype].messageHandler)
+               gChannelMessageTable[hdr->msgtype].messageHandler(hdr);
        else
                DPRINT_ERR(VMBUS, "Unhandled channel message type %d",
-                          hdr->MessageType);
-
-       /* Free the msg that was allocated in VmbusOnMsgDPC() */
-       kfree(msg);
+                          hdr->msgtype);
 }
 
 /*
@@ -782,15 +786,15 @@ int vmbus_request_offers(void)
        if (!msginfo)
                return -ENOMEM;
 
-       msginfo->WaitEvent = osd_WaitEventCreate();
-       if (!msginfo->WaitEvent) {
+       msginfo->waitevent = osd_waitevent_create();
+       if (!msginfo->waitevent) {
                kfree(msginfo);
                return -ENOMEM;
        }
 
-       msg = (struct vmbus_channel_message_header *)msginfo->Msg;
+       msg = (struct vmbus_channel_message_header *)msginfo->msg;
 
-       msg->MessageType = ChannelMessageRequestOffers;
+       msg->msgtype = CHANNELMSG_REQUESTOFFERS;
 
        /*SpinlockAcquire(gVmbusConnection.channelMsgLock);
        INSERT_TAIL_LIST(&gVmbusConnection.channelMsgList,
@@ -808,7 +812,7 @@ int vmbus_request_offers(void)
 
                goto Cleanup;
        }
-       /* osd_WaitEventWait(msgInfo->waitEvent); */
+       /* osd_waitevent_wait(msgInfo->waitEvent); */
 
        /*SpinlockAcquire(gVmbusConnection.channelMsgLock);
        REMOVE_ENTRY_LIST(&msgInfo->msgListEntry);
@@ -817,7 +821,7 @@ int vmbus_request_offers(void)
 
 Cleanup:
        if (msginfo) {
-               kfree(msginfo->WaitEvent);
+               kfree(msginfo->waitevent);
                kfree(msginfo);
        }
 
@@ -837,17 +841,17 @@ void vmbus_release_unattached_channels(void)
        spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
 
        list_for_each_entry_safe(channel, pos, &gVmbusConnection.ChannelList,
-                                ListEntry) {
+                                listentry) {
                if (channel == start)
                        break;
 
-               if (!channel->DeviceObject->Driver) {
-                       list_del(&channel->ListEntry);
+               if (!channel->device_obj->Driver) {
+                       list_del(&channel->listentry);
                        DPRINT_INFO(VMBUS,
                                    "Releasing unattached device object %p",
-                                   channel->DeviceObject);
+                                   channel->device_obj);
 
-                       VmbusChildDeviceRemove(channel->DeviceObject);
+                       vmbus_child_device_unregister(channel->device_obj);
                        free_channel(channel);
                } else {
                        if (!start)