* [PATCH 00/25] Staging: hv: Cleanup vmbus driver code
From: K. Y. Srinivasan @ 2011-04-26 16:19 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: K. Y. Srinivasan
This patch-set addresses some of the bus/driver model cleanup that
Greg sugested over the last couple of days. In this patch-set we
deal with the following issues:
1) Cleanup unnecessary state in struct hv_device and
struct hv_driver to be compliant with the Linux
Driver model.
2) Cleanup the vmbus_match() function to conform with the
Linux Driver model.
3) Cleanup error handling in the vmbus_probe() and
vmbus_child_device_register() functions. Fixed a
bug in the probe failure path as part of this cleanup.
4) The Windows host cannot handle the vmbus_driver being
unloaded and subsequently loaded. Cleanup the driver with
this in mind.
5) Get rid of struct hv_bus that embedded struct bus_type to
conform with the LDM.
6) Add probe/remove/shutdown functions to struct hv_driver to
conform to LDM.
7) On some older Hyper-V hosts, the Linux PCI sub-sytem is not able
to allocate irq resources to the vmbus driver. I recently learnt
that the vmbus driver is an acpi enumerated device on the Hyper-V
platform. Added code to retrieve irq information from DSDT.
Regards,
K. Y
^ permalink raw reply
* [PATCH 01/25] Staging: hv: Introduce a function to map a generic driver pointer to a pointer to storvsc_driver_object
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834785-4981-1-git-send-email-kys@microsoft.com>
In preparation for getting rid of the priv element from struct hv_driver,
introduce a function that maps a generic struct driver pointer to struct
storvsc_driver_object.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/storvsc_api.h | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/drivers/staging/hv/storvsc_api.h b/drivers/staging/hv/storvsc_api.h
index c98139c..b60a058 100644
--- a/drivers/staging/hv/storvsc_api.h
+++ b/drivers/staging/hv/storvsc_api.h
@@ -28,6 +28,7 @@
#include <linux/kernel.h>
#include "vstorage.h"
#include "vmbus_api.h"
+#include "vmbus.h"
/* Defines */
#define STORVSC_RING_BUFFER_SIZE (20*PAGE_SIZE)
@@ -153,6 +154,13 @@ static inline struct storvsc_driver_object *hvdr_to_stordr(struct hv_driver *d)
return container_of(d, struct storvsc_driver_object, base);
}
+static inline
+struct storvsc_driver_object *drv_to_stordrv(struct device_driver *d)
+{
+ struct hv_driver *hvdrv = drv_to_hv_drv(d);
+ return hvdr_to_stordr(hvdrv);
+}
+
/* Interface */
int stor_vsc_on_device_add(struct hv_device *device,
--
1.7.4.1
^ permalink raw reply related
* [PATCH 02/25] Staging: hv: Get rid of the references to the priv element of struct hv_driver in block driver
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
In preparation for getting rid of the priv element from struct hv_driver,
get rid of the references to the priv element of struct hv_driver
in blkvsc_drv.c and storvsc.c
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/blkvsc_drv.c | 14 +++-----------
drivers/staging/hv/storvsc.c | 2 +-
2 files changed, 4 insertions(+), 12 deletions(-)
diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index acc5435..ec6a761 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -214,10 +214,8 @@ static int blkvsc_submit_request(struct blkvsc_request *blkvsc_req,
{
struct block_device_context *blkdev = blkvsc_req->dev;
struct hv_device *device_ctx = blkdev->device_ctx;
- struct hv_driver *drv =
- drv_to_hv_drv(device_ctx->device.driver);
struct storvsc_driver_object *storvsc_drv_obj =
- drv->priv;
+ drv_to_stordrv(device_ctx->device.driver);
struct hv_storvsc_request *storvsc_req;
struct vmscsi_request *vm_srb;
int ret;
@@ -541,10 +539,8 @@ out:
*/
static int blkvsc_remove(struct device *device)
{
- struct hv_driver *drv =
- drv_to_hv_drv(device->driver);
struct storvsc_driver_object *storvsc_drv_obj =
- drv->priv;
+ drv_to_stordrv(device->driver);
struct hv_device *device_obj = device_to_hv_device(device);
struct block_device_context *blkdev = dev_get_drvdata(device);
unsigned long flags;
@@ -881,8 +877,6 @@ static int blkvsc_drv_init(void)
storvsc_drv_obj->ring_buffer_size = blkvsc_ringbuffer_size;
- drv->priv = storvsc_drv_obj;
-
/* Callback to client driver to complete the initialization */
blk_vsc_initialize(&storvsc_drv_obj->base);
@@ -945,10 +939,8 @@ static void blkvsc_drv_exit(void)
*/
static int blkvsc_probe(struct device *device)
{
- struct hv_driver *drv =
- drv_to_hv_drv(device->driver);
struct storvsc_driver_object *storvsc_drv_obj =
- drv->priv;
+ drv_to_stordrv(device->driver);
struct hv_device *device_obj = device_to_hv_device(device);
struct block_device_context *blkdev = NULL;
diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c
index 85bae5a..d53aa97 100644
--- a/drivers/staging/hv/storvsc.c
+++ b/drivers/staging/hv/storvsc.c
@@ -414,7 +414,7 @@ static int stor_vsc_connect_to_vsp(struct hv_device *device)
struct storvsc_driver_object *stor_driver;
int ret;
- stor_driver = (struct storvsc_driver_object *)device->drv;
+ stor_driver = drv_to_stordrv(device->device.driver);
memset(&props, 0, sizeof(struct vmstorage_channel_properties));
/* Open the channel */
--
1.7.4.1
^ permalink raw reply related
* [PATCH 03/25] Staging: hv: Get rid of the references to the priv element of struct hv_driver in hv_mouse.c
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization
Cc: K. Y. Srinivasan, Haiyang Zhang, Abhishek Kane, Hank Janssen
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
In preparation for getting rid of the priv element from struct hv_driver,
get rid of the references to the priv element of struct hv_driver
in hv_mouse.c
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/hv_mouse.c | 22 +++++++++++++---------
1 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c
index bd93548..4333247 100644
--- a/drivers/staging/hv/hv_mouse.c
+++ b/drivers/staging/hv/hv_mouse.c
@@ -52,6 +52,13 @@ struct mousevsc_drv_obj {
};
+static inline
+struct mousevsc_drv_obj *drv_to_mousedrv(struct device_driver *d)
+{
+ struct hv_driver *hvdrv = drv_to_hv_drv(d);
+ return container_of(hvdrv, struct mousevsc_drv_obj, base);
+}
+
/* The maximum size of a synthetic input message. */
#define SYNTHHID_MAX_INPUT_REPORT_SIZE 16
@@ -428,7 +435,7 @@ static void mousevsc_on_receive_input_report(struct mousevsc_dev *input_device,
return;
}
- input_drv = (struct mousevsc_drv_obj *)input_device->device->drv;
+ input_drv = drv_to_mousedrv(input_device->device->device.driver);
inputreport_callback(input_device->device,
input_report->buffer,
@@ -713,7 +720,7 @@ static int mousevsc_on_device_add(struct hv_device *device,
return ret;
}
- input_drv = (struct mousevsc_drv_obj *)input_dev->device->drv;
+ input_drv = drv_to_mousedrv(input_dev->device->device.driver);
dev_info.vendor = input_dev->hid_dev_info.vendor;
dev_info.product = input_dev->hid_dev_info.product;
@@ -829,9 +836,8 @@ static int mousevsc_probe(struct device *device)
{
int ret = 0;
- struct hv_driver *drv =
- drv_to_hv_drv(device->driver);
- struct mousevsc_drv_obj *mousevsc_drv_obj = drv->priv;
+ struct mousevsc_drv_obj *mousevsc_drv_obj =
+ drv_to_mousedrv(device->driver);
struct hv_device *device_obj = device_to_hv_device(device);
struct input_device_context *input_dev_ctx;
@@ -857,9 +863,8 @@ static int mousevsc_remove(struct device *device)
{
int ret = 0;
- struct hv_driver *drv =
- drv_to_hv_drv(device->driver);
- struct mousevsc_drv_obj *mousevsc_drv_obj = drv->priv;
+ struct mousevsc_drv_obj *mousevsc_drv_obj =
+ drv_to_mousedrv(device->driver);
struct hv_device *device_obj = device_to_hv_device(device);
struct input_device_context *input_dev_ctx;
@@ -1017,7 +1022,6 @@ static int __init mousevsc_init(void)
mouse_vsc_initialize(&input_drv_obj->base);
drv->driver.name = input_drv_obj->base.name;
- drv->priv = input_drv_obj;
drv->driver.probe = mousevsc_probe;
drv->driver.remove = mousevsc_remove;
--
1.7.4.1
^ permalink raw reply related
* [PATCH 04/25] Staging: hv: Introduce a function to map a generic driver pointer to a pointer to struct netvsc_driver
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization
Cc: K. Y. Srinivasan, Haiyang Zhang, Abhishek Kane, Hank Janssen
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
In preparation for getting rid of the priv element from struct hv_driver,
introduce a function to map a generic driver pointer to a pointer to
struct netvsc_driver.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/netvsc_api.h | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/drivers/staging/hv/netvsc_api.h b/drivers/staging/hv/netvsc_api.h
index b4bed36..48b512b 100644
--- a/drivers/staging/hv/netvsc_api.h
+++ b/drivers/staging/hv/netvsc_api.h
@@ -26,6 +26,7 @@
#define _NETVSC_API_H_
#include "vmbus_api.h"
+#include "vmbus.h"
/* Fwd declaration */
struct hv_netvsc_packet;
@@ -103,6 +104,13 @@ struct netvsc_driver {
void *ctx;
};
+static inline
+struct netvsc_driver *drv_to_netvscdrv(struct device_driver *d)
+{
+ struct hv_driver *hvdrv = drv_to_hv_drv(d);
+ return container_of(hvdrv, struct netvsc_driver, base);
+}
+
struct netvsc_device_info {
unsigned char mac_adr[6];
bool link_state; /* 0 - link up, 1 - link down */
--
1.7.4.1
^ permalink raw reply related
* [PATCH 05/25] Staging: hv: Get rid of the references to the priv element of struct hv_driver in net driver
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
In preparation for getting rid of the priv element from struct hv_driver,
get rid of the references to the priv element of struct
hv_driver in network driver.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/netvsc.c | 11 +++++++----
drivers/staging/hv/netvsc_drv.c | 16 ++++++----------
2 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c
index b3e6497..27c7449 100644
--- a/drivers/staging/hv/netvsc.c
+++ b/drivers/staging/hv/netvsc.c
@@ -835,6 +835,9 @@ static void netvsc_receive(struct hv_device *device,
int i, j;
int count = 0, bytes_remain = 0;
unsigned long flags;
+ struct netvsc_driver *netvsc_drv =
+ drv_to_netvscdrv(device->device.driver);
+
LIST_HEAD(listHead);
net_device = get_inbound_net_device(device);
@@ -995,8 +998,7 @@ static void netvsc_receive(struct hv_device *device,
}
/* Pass it to the upper layer */
- ((struct netvsc_driver *)device->drv)->
- recv_cb(device, netvsc_packet);
+ netvsc_drv->recv_cb(device, netvsc_packet);
netvsc_receive_completion(netvsc_packet->
completion.recv.recv_completion_ctx);
@@ -1102,7 +1104,7 @@ static int netvsc_device_add(struct hv_device *device, void *additional_info)
struct netvsc_device *net_device;
struct hv_netvsc_packet *packet, *pos;
struct netvsc_driver *net_driver =
- (struct netvsc_driver *)device->drv;
+ drv_to_netvscdrv(device->device.driver);
net_device = alloc_net_device(device);
if (!net_device) {
@@ -1183,7 +1185,8 @@ cleanup:
*/
int netvsc_initialize(struct hv_driver *drv)
{
- struct netvsc_driver *driver = (struct netvsc_driver *)drv;
+ struct netvsc_driver *driver =
+ drv_to_netvscdrv(&drv->driver);
drv->name = driver_name;
memcpy(&drv->dev_type, &netvsc_device_type, sizeof(struct hv_guid));
diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c
index 096a732..e61eb7e 100644
--- a/drivers/staging/hv/netvsc_drv.c
+++ b/drivers/staging/hv/netvsc_drv.c
@@ -132,9 +132,8 @@ static void netvsc_xmit_completion(void *context)
static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
{
struct net_device_context *net_device_ctx = netdev_priv(net);
- struct hv_driver *drv =
- drv_to_hv_drv(net_device_ctx->device_ctx->device.driver);
- struct netvsc_driver *net_drv_obj = drv->priv;
+ struct netvsc_driver *net_drv_obj =
+ drv_to_netvscdrv(net_device_ctx->device_ctx->device.driver);
struct hv_netvsc_packet *packet;
int ret;
unsigned int i, num_pages;
@@ -343,9 +342,8 @@ static void netvsc_send_garp(struct work_struct *w)
static int netvsc_probe(struct device *device)
{
- struct hv_driver *drv =
- drv_to_hv_drv(device->driver);
- struct netvsc_driver *net_drv_obj = drv->priv;
+ struct netvsc_driver *net_drv_obj =
+ drv_to_netvscdrv(device->driver);
struct hv_device *device_obj = device_to_hv_device(device);
struct net_device *net = NULL;
struct net_device_context *net_device_ctx;
@@ -413,9 +411,8 @@ static int netvsc_probe(struct device *device)
static int netvsc_remove(struct device *device)
{
- struct hv_driver *drv =
- drv_to_hv_drv(device->driver);
- struct netvsc_driver *net_drv_obj = drv->priv;
+ struct netvsc_driver *net_drv_obj =
+ drv_to_netvscdrv(device->driver);
struct hv_device *device_obj = device_to_hv_device(device);
struct net_device *net = dev_get_drvdata(&device_obj->device);
int ret;
@@ -498,7 +495,6 @@ static int netvsc_drv_init(int (*drv_init)(struct hv_driver *drv))
net_drv_obj->ring_buf_size = ring_size * PAGE_SIZE;
net_drv_obj->recv_cb = netvsc_recv_callback;
net_drv_obj->link_status_change = netvsc_linkstatus_callback;
- drv->priv = net_drv_obj;
/* Callback to client driver to complete the initialization */
drv_init(&net_drv_obj->base);
--
1.7.4.1
^ permalink raw reply related
* [PATCH 06/25] Staging: hv: Get rid of the references to the priv element of struct hv_driver in storvsc_drv.c
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
In preparation for getting rid of the priv element from struct hv_driver,
get rid of the references to the priv element of struct
hv_driver in storvsc_drv.c.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/storvsc_drv.c | 17 ++++++-----------
1 files changed, 6 insertions(+), 11 deletions(-)
diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c
index f819c6a..5ac2904 100644
--- a/drivers/staging/hv/storvsc_drv.c
+++ b/drivers/staging/hv/storvsc_drv.c
@@ -197,8 +197,6 @@ static int storvsc_drv_init(void)
/* Callback to client driver to complete the initialization */
stor_vsc_initialize(&storvsc_drv_obj->base);
- drv->priv = storvsc_drv_obj;
-
DPRINT_INFO(STORVSC_DRV,
"max outstanding reqs %u",
storvsc_drv_obj->max_outstanding_req_per_channel);
@@ -325,9 +323,8 @@ static void storvsc_drv_exit(void)
static int storvsc_probe(struct device *device)
{
int ret;
- struct hv_driver *drv =
- drv_to_hv_drv(device->driver);
- struct storvsc_driver_object *storvsc_drv_obj = drv->priv;
+ struct storvsc_driver_object *storvsc_drv_obj =
+ drv_to_stordrv(device->driver);
struct hv_device *device_obj = device_to_hv_device(device);
struct Scsi_Host *host;
struct host_device_context *host_device_ctx;
@@ -404,9 +401,8 @@ static int storvsc_probe(struct device *device)
*/
static int storvsc_remove(struct device *device)
{
- struct hv_driver *drv =
- drv_to_hv_drv(device->driver);
- struct storvsc_driver_object *storvsc_drv_obj = drv->priv;
+ struct storvsc_driver_object *storvsc_drv_obj =
+ drv_to_stordrv(device->driver);
struct hv_device *device_obj = device_to_hv_device(device);
struct Scsi_Host *host = dev_get_drvdata(device);
struct host_device_context *host_device_ctx =
@@ -692,9 +688,8 @@ static int storvsc_queuecommand_lck(struct scsi_cmnd *scmnd,
struct host_device_context *host_device_ctx =
(struct host_device_context *)scmnd->device->host->hostdata;
struct hv_device *device_ctx = host_device_ctx->device_ctx;
- struct hv_driver *drv =
- drv_to_hv_drv(device_ctx->device.driver);
- struct storvsc_driver_object *storvsc_drv_obj = drv->priv;
+ struct storvsc_driver_object *storvsc_drv_obj =
+ drv_to_stordrv(device_ctx->device.driver);
struct hv_storvsc_request *request;
struct storvsc_cmd_request *cmd_request;
unsigned int request_size = 0;
--
1.7.4.1
^ permalink raw reply related
* [PATCH 07/25] Staging: hv: Cleanup vmbus_match()
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
In preparation for getting rid of the priv element from struct hv_driver,
cleanup vmbus_match - the setting of the drv field in struct hv_device
is not needed.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_drv.c | 7 ++-----
1 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index c85d796..bf124a7 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -307,12 +307,9 @@ static int vmbus_match(struct device *device, struct device_driver *driver)
/* We found our driver ? */
if (memcmp(&device_ctx->dev_type, &drv->dev_type,
- sizeof(struct hv_guid)) == 0) {
-
- device_ctx->drv = drv->priv;
-
+ sizeof(struct hv_guid)) == 0)
match = 1;
- }
+
return match;
}
--
1.7.4.1
^ permalink raw reply related
* [PATCH 08/25] Staging: hv: vmbus_driver cannot be unloaded; cleanup accordingly
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
The vmbus driver cannot be unloaded; the windows host does not
permit this. Cleanup accordingly.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_drv.c | 32 --------------------------------
1 files changed, 0 insertions(+), 32 deletions(-)
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index bf124a7..d597dd4 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -622,30 +622,6 @@ cleanup:
return ret;
}
-/*
- * vmbus_bus_exit - Terminate the vmbus driver.
- *
- * This routine is opposite of vmbus_bus_init()
- */
-static void vmbus_bus_exit(void)
-{
-
-
- vmbus_release_unattached_channels();
- vmbus_disconnect();
- on_each_cpu(hv_synic_cleanup, NULL, 1);
-
- hv_cleanup();
-
- bus_unregister(&hv_bus.bus);
-
- free_irq(hv_pci_dev->irq, hv_pci_dev);
-
- tasklet_kill(&hv_bus.msg_dpc);
- tasklet_kill(&hv_bus.event_dpc);
-}
-
-
/**
* vmbus_child_driver_register() - Register a vmbus's child driver
* @drv: Pointer to driver structure you want to register
@@ -814,17 +790,9 @@ static int __init hv_pci_init(void)
return pci_register_driver(&hv_bus_driver);
}
-static void __exit hv_pci_exit(void)
-{
- vmbus_bus_exit();
- pci_unregister_driver(&hv_bus_driver);
-}
-
-
MODULE_LICENSE("GPL");
MODULE_VERSION(HV_DRV_VERSION);
module_param(vmbus_loglevel, int, S_IRUGO|S_IWUSR);
module_init(hv_pci_init);
-module_exit(hv_pci_exit);
--
1.7.4.1
^ permalink raw reply related
* [PATCH 09/25] Staging: hv: Get rid of vmbus_release_unattached_channels() as it is not used
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization
Cc: K. Y. Srinivasan, Haiyang Zhang, Abhishek Kane, Hank Janssen
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
Since vmbus_release_unattached_channels() is only used in module
unload path and since the vmbus driver cannot be unloaded,
get rid of this "dead" code.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/channel_mgmt.c | 33 ---------------------------------
drivers/staging/hv/channel_mgmt.h | 2 --
2 files changed, 0 insertions(+), 35 deletions(-)
diff --git a/drivers/staging/hv/channel_mgmt.c b/drivers/staging/hv/channel_mgmt.c
index fe32f7e..1929ab3 100644
--- a/drivers/staging/hv/channel_mgmt.c
+++ b/drivers/staging/hv/channel_mgmt.c
@@ -791,37 +791,4 @@ cleanup:
return ret;
}
-/*
- * vmbus_release_unattached_channels - Release channels that are
- * unattached/unconnected ie (no drivers associated)
- */
-void vmbus_release_unattached_channels(void)
-{
- struct vmbus_channel *channel, *pos;
- struct vmbus_channel *start = NULL;
- unsigned long flags;
-
- spin_lock_irqsave(&vmbus_connection.channel_lock, flags);
-
- list_for_each_entry_safe(channel, pos, &vmbus_connection.chn_list,
- listentry) {
- if (channel == start)
- break;
-
- if (!channel->device_obj->drv) {
- list_del(&channel->listentry);
-
- pr_err("Releasing unattached device object\n");
-
- vmbus_child_device_unregister(channel->device_obj);
- free_channel(channel);
- } else {
- if (!start)
- start = channel;
- }
- }
-
- spin_unlock_irqrestore(&vmbus_connection.channel_lock, flags);
-}
-
/* eof */
diff --git a/drivers/staging/hv/channel_mgmt.h b/drivers/staging/hv/channel_mgmt.h
index 96f74e2..3b2c393 100644
--- a/drivers/staging/hv/channel_mgmt.h
+++ b/drivers/staging/hv/channel_mgmt.h
@@ -315,6 +315,4 @@ void vmbus_onmessage(void *context);
int vmbus_request_offers(void);
-void vmbus_release_unattached_channels(void);
-
#endif /* _CHANNEL_MGMT_H_ */
--
1.7.4.1
^ permalink raw reply related
* [PATCH 10/25] Staging: hv: Get rid of the priv pointer in struct hv_driver
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization
Cc: K. Y. Srinivasan, Haiyang Zhang, Abhishek Kane, Hank Janssen
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
Now that we have gotten rid of all uses of the priv element in
struct hv_driver, get rid of the priv pointer.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_api.h | 10 ----------
1 files changed, 0 insertions(+), 10 deletions(-)
diff --git a/drivers/staging/hv/vmbus_api.h b/drivers/staging/hv/vmbus_api.h
index f0d96eb..51fa952 100644
--- a/drivers/staging/hv/vmbus_api.h
+++ b/drivers/staging/hv/vmbus_api.h
@@ -94,16 +94,6 @@ struct hv_driver {
/* the device type supported by this driver */
struct hv_guid dev_type;
- /*
- * Device type specific drivers (net, blk etc.)
- * need a mechanism to get a pointer to
- * device type specific driver structure given
- * a pointer to the base hyperv driver structure.
- * The current code solves this problem using
- * a hack. Support this need explicitly
- */
- void *priv;
-
struct device_driver driver;
int (*dev_add)(struct hv_device *device, void *data);
--
1.7.4.1
^ permalink raw reply related
* [PATCH 11/25] Staging: hv: Get rid of the drv field in struct hv_device
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
Now, we can rid of the drv field in struct hv_device.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_api.h | 3 ---
1 files changed, 0 insertions(+), 3 deletions(-)
diff --git a/drivers/staging/hv/vmbus_api.h b/drivers/staging/hv/vmbus_api.h
index 51fa952..02e3587 100644
--- a/drivers/staging/hv/vmbus_api.h
+++ b/drivers/staging/hv/vmbus_api.h
@@ -103,9 +103,6 @@ struct hv_driver {
/* Base device object */
struct hv_device {
- /* the driver for this device */
- struct hv_driver *drv;
-
char name[64];
struct work_struct probe_failed_work_item;
--
1.7.4.1
^ permalink raw reply related
* [PATCH 12/25] Staging: hv: Cleanup error handling in vmbus_child_device_register()
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
Cleanup error handling in vmbus_child_device_register().
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_drv.c | 7 ++++++-
1 files changed, 6 insertions(+), 1 deletions(-)
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index d597dd4..4d569ad 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -720,11 +720,16 @@ int vmbus_child_device_register(struct hv_device *child_device_obj)
*/
ret = device_register(&child_device_obj->device);
+ if (ret)
+ return ret;
+
/* vmbus_probe() error does not get propergate to device_register(). */
ret = child_device_obj->probe_error;
- if (ret)
+ if (ret) {
pr_err("Unable to register child device\n");
+ device_unregister(&child_device_obj->device);
+ }
else
pr_info("child device %s registered\n",
dev_name(&child_device_obj->device));
--
1.7.4.1
^ permalink raw reply related
* [PATCH 13/25] Staging: hv: Cleanup vmbus_probe() function
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization
Cc: K. Y. Srinivasan, Haiyang Zhang, Abhishek Kane, Hank Janssen
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
The logic for handling probe failure was broken. Now that we have
cleaned up error handling, get rid of the vmbus_probe_failed_cb()
function.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_api.h | 2 --
drivers/staging/hv/vmbus_drv.c | 27 +--------------------------
2 files changed, 1 insertions(+), 28 deletions(-)
diff --git a/drivers/staging/hv/vmbus_api.h b/drivers/staging/hv/vmbus_api.h
index 02e3587..c953d6e 100644
--- a/drivers/staging/hv/vmbus_api.h
+++ b/drivers/staging/hv/vmbus_api.h
@@ -105,8 +105,6 @@ struct hv_driver {
struct hv_device {
char name[64];
- struct work_struct probe_failed_work_item;
-
int probe_error;
/* the device type id of this device */
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index 4d569ad..248dc8a 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -313,27 +313,6 @@ static int vmbus_match(struct device *device, struct device_driver *driver)
return match;
}
-
-/*
- * vmbus_probe_failed_cb - Callback when a driver probe failed in vmbus_probe()
- *
- * We need a callback because we cannot invoked device_unregister() inside
- * vmbus_probe() since vmbus_probe() may be invoked inside device_register()
- * i.e. we cannot call device_unregister() inside device_register()
- */
-static void vmbus_probe_failed_cb(struct work_struct *context)
-{
- struct hv_device *device_ctx = (struct hv_device *)context;
-
- /*
- * Kick off the process of unregistering the device.
- * This will call vmbus_remove() and eventually vmbus_device_release()
- */
- device_unregister(&device_ctx->device);
-
- /* put_device(&device_ctx->device); */
-}
-
/*
* vmbus_probe - Add the new vmbus's child device
*/
@@ -348,14 +327,10 @@ static int vmbus_probe(struct device *child_device)
if (drv->driver.probe) {
ret = dev->probe_error =
drv->driver.probe(child_device);
- if (ret != 0) {
+ if (ret != 0)
pr_err("probe failed for device %s (%d)\n",
dev_name(child_device), ret);
- INIT_WORK(&dev->probe_failed_work_item,
- vmbus_probe_failed_cb);
- schedule_work(&dev->probe_failed_work_item);
- }
} else {
pr_err("probe not set for driver %s\n",
dev_name(child_device));
--
1.7.4.1
^ permalink raw reply related
* [PATCH 14/25] Staging: hv: Properly handle errors in hv_pci_probe()
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
Much of the vmbus driver initialization is done within the hv_pci_probe()
function. Properly handle errors in hv_pci_probe so that we can
appropriately deal with loading of the vmbus driver.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_drv.c | 34 +++++++++++++++++++++++++---------
1 files changed, 25 insertions(+), 9 deletions(-)
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index 248dc8a..a2acbce 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -54,6 +54,8 @@ EXPORT_SYMBOL(vmbus_loglevel);
/* (ALL_MODULES << 16 | DEBUG_LVL_ENTEREXIT); */
/* (((VMBUS | VMBUS_DRV)<<16) | DEBUG_LVL_ENTEREXIT); */
+static int pci_probe_error;
+static struct completion probe_event;
static void get_channel_info(struct hv_device *device,
struct hv_device_info *info)
@@ -732,19 +734,19 @@ void vmbus_child_device_unregister(struct hv_device *device_obj)
static int __devinit hv_pci_probe(struct pci_dev *pdev,
const struct pci_device_id *ent)
{
- int err;
-
hv_pci_dev = pdev;
- err = pci_enable_device(pdev);
- if (err)
- return err;
+ pci_probe_error = pci_enable_device(pdev);
+ if (pci_probe_error)
+ goto probe_cleanup;
- err = vmbus_bus_init(pdev);
- if (err)
+ pci_probe_error = vmbus_bus_init(pdev);
+ if (pci_probe_error)
pci_disable_device(pdev);
- return err;
+probe_cleanup:
+ complete(&probe_event);
+ return pci_probe_error;
}
/*
@@ -767,7 +769,21 @@ static struct pci_driver hv_bus_driver = {
static int __init hv_pci_init(void)
{
- return pci_register_driver(&hv_bus_driver);
+ int ret;
+ init_completion(&probe_event);
+ ret = pci_register_driver(&hv_bus_driver);
+ if (ret)
+ return ret;
+ /*
+ * All the vmbus initialization occurs within the
+ * hv_pci_probe() function. Wait for hv_pci_probe()
+ * to complete.
+ */
+ wait_for_completion(&probe_event);
+
+ if (pci_probe_error)
+ pci_unregister_driver(&hv_bus_driver);
+ return pci_probe_error;
}
--
1.7.4.1
^ permalink raw reply related
* [PATCH 15/25] Staging: hv: Make hv_pci_dev a static variable
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
Make hv_pci_dev a static variable.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_drv.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index a2acbce..f779d4e 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -40,7 +40,7 @@
#include "vmbus_private.h"
-struct pci_dev *hv_pci_dev;
+static struct pci_dev *hv_pci_dev;
/* Main vmbus driver data structure */
struct hv_bus {
--
1.7.4.1
^ permalink raw reply related
* [PATCH 16/25] Staging: hv: Make msg_dpc a global variable
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization
Cc: K. Y. Srinivasan, Haiyang Zhang, Abhishek Kane, Hank Janssen
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
In preparation for cleaning up (getting rid of) of the hv_bus structure,
make msg_dpc a global variable.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_drv.c | 7 ++++---
1 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index f779d4e..028051d 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -42,10 +42,11 @@
static struct pci_dev *hv_pci_dev;
+static struct tasklet_struct msg_dpc;
+
/* Main vmbus driver data structure */
struct hv_bus {
struct bus_type bus;
- struct tasklet_struct msg_dpc;
struct tasklet_struct event_dpc;
};
@@ -517,7 +518,7 @@ static irqreturn_t vmbus_isr(int irq, void *dev_id)
/* Schedules a dpc if necessary */
if (ret > 0) {
if (test_bit(0, (unsigned long *)&ret))
- tasklet_schedule(&hv_bus.msg_dpc);
+ tasklet_schedule(&msg_dpc);
if (test_bit(1, (unsigned long *)&ret))
tasklet_schedule(&hv_bus.event_dpc);
@@ -552,7 +553,7 @@ static int vmbus_bus_init(struct pci_dev *pdev)
hv_bus.bus.name = driver_name;
/* Initialize the bus context */
- tasklet_init(&hv_bus.msg_dpc, vmbus_on_msg_dpc, 0);
+ tasklet_init(&msg_dpc, vmbus_on_msg_dpc, 0);
tasklet_init(&hv_bus.event_dpc, vmbus_on_event, 0);
/* Now, register the bus with LDM */
--
1.7.4.1
^ permalink raw reply related
* [PATCH 17/25] Staging: hv: Make event_dpc a global variable
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
In preparation for getting rid of struct hv_bus, Make event_dpc a
global variable.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_drv.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index 028051d..a3a7741 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -43,11 +43,11 @@
static struct pci_dev *hv_pci_dev;
static struct tasklet_struct msg_dpc;
+static struct tasklet_struct event_dpc;
/* Main vmbus driver data structure */
struct hv_bus {
struct bus_type bus;
- struct tasklet_struct event_dpc;
};
unsigned int vmbus_loglevel = (ALL_MODULES << 16 | INFO_LVL);
@@ -521,7 +521,7 @@ static irqreturn_t vmbus_isr(int irq, void *dev_id)
tasklet_schedule(&msg_dpc);
if (test_bit(1, (unsigned long *)&ret))
- tasklet_schedule(&hv_bus.event_dpc);
+ tasklet_schedule(&event_dpc);
return IRQ_HANDLED;
} else {
@@ -554,7 +554,7 @@ static int vmbus_bus_init(struct pci_dev *pdev)
/* Initialize the bus context */
tasklet_init(&msg_dpc, vmbus_on_msg_dpc, 0);
- tasklet_init(&hv_bus.event_dpc, vmbus_on_event, 0);
+ tasklet_init(&event_dpc, vmbus_on_event, 0);
/* Now, register the bus with LDM */
ret = bus_register(&hv_bus.bus);
--
1.7.4.1
^ permalink raw reply related
* [PATCH 18/25] Staging: hv: Get rid of struct hv_bus
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
Now, get rid of struct hv_bus. We will no longer be embedding
struct bus_type.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_drv.c | 33 ++++++++++++++-------------------
1 files changed, 14 insertions(+), 19 deletions(-)
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index a3a7741..515311c 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -45,11 +45,6 @@ static struct pci_dev *hv_pci_dev;
static struct tasklet_struct msg_dpc;
static struct tasklet_struct event_dpc;
-/* Main vmbus driver data structure */
-struct hv_bus {
- struct bus_type bus;
-};
-
unsigned int vmbus_loglevel = (ALL_MODULES << 16 | INFO_LVL);
EXPORT_SYMBOL(vmbus_loglevel);
/* (ALL_MODULES << 16 | DEBUG_LVL_ENTEREXIT); */
@@ -405,14 +400,14 @@ static void vmbus_device_release(struct device *device)
}
/* The one and only one */
-static struct hv_bus hv_bus = {
- .bus.name = "vmbus",
- .bus.match = vmbus_match,
- .bus.shutdown = vmbus_shutdown,
- .bus.remove = vmbus_remove,
- .bus.probe = vmbus_probe,
- .bus.uevent = vmbus_uevent,
- .bus.dev_attrs = vmbus_device_attrs,
+static struct bus_type hv_bus = {
+ .name = "vmbus",
+ .match = vmbus_match,
+ .shutdown = vmbus_shutdown,
+ .remove = vmbus_remove,
+ .probe = vmbus_probe,
+ .uevent = vmbus_uevent,
+ .dev_attrs = vmbus_device_attrs,
};
static const char *driver_name = "hyperv";
@@ -550,14 +545,14 @@ static int vmbus_bus_init(struct pci_dev *pdev)
goto cleanup;
}
- hv_bus.bus.name = driver_name;
+ hv_bus.name = driver_name;
/* Initialize the bus context */
tasklet_init(&msg_dpc, vmbus_on_msg_dpc, 0);
tasklet_init(&event_dpc, vmbus_on_event, 0);
/* Now, register the bus with LDM */
- ret = bus_register(&hv_bus.bus);
+ ret = bus_register(&hv_bus);
if (ret) {
ret = -1;
goto cleanup;
@@ -572,7 +567,7 @@ static int vmbus_bus_init(struct pci_dev *pdev)
pr_err("Unable to request IRQ %d\n",
pdev->irq);
- bus_unregister(&hv_bus.bus);
+ bus_unregister(&hv_bus);
ret = -1;
goto cleanup;
@@ -588,7 +583,7 @@ static int vmbus_bus_init(struct pci_dev *pdev)
ret = vmbus_connect();
if (ret) {
free_irq(pdev->irq, pdev);
- bus_unregister(&hv_bus.bus);
+ bus_unregister(&hv_bus);
goto cleanup;
}
@@ -618,7 +613,7 @@ int vmbus_child_driver_register(struct device_driver *drv)
pr_info("child driver registering - name %s\n", drv->name);
/* The child driver on this vmbus */
- drv->bus = &hv_bus.bus;
+ drv->bus = &hv_bus;
ret = driver_register(drv);
@@ -688,7 +683,7 @@ int vmbus_child_device_register(struct hv_device *child_device_obj)
atomic_inc_return(&device_num));
/* The new device belongs to this bus */
- child_device_obj->device.bus = &hv_bus.bus; /* device->dev.bus; */
+ child_device_obj->device.bus = &hv_bus; /* device->dev.bus; */
child_device_obj->device.parent = &hv_pci_dev->dev;
child_device_obj->device.release = vmbus_device_release;
--
1.7.4.1
^ permalink raw reply related
* [PATCH 19/25] Staging: hv: Add probe function to struct hv_driver
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
Add probe function to struct hv_driver.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_api.h | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/drivers/staging/hv/vmbus_api.h b/drivers/staging/hv/vmbus_api.h
index c953d6e..6f3741d 100644
--- a/drivers/staging/hv/vmbus_api.h
+++ b/drivers/staging/hv/vmbus_api.h
@@ -99,6 +99,9 @@ struct hv_driver {
int (*dev_add)(struct hv_device *device, void *data);
int (*dev_rm)(struct hv_device *device);
void (*cleanup)(struct hv_driver *driver);
+
+ int (*probe)(struct hv_device *);
+
};
/* Base device object */
--
1.7.4.1
^ permalink raw reply related
* [PATCH 20/25] Staging: hv: Use the probe function in struct hv_driver
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
Use the newly introduced probe function.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/blkvsc_drv.c | 19 +++++++++----------
drivers/staging/hv/hv_mouse.c | 11 +++++------
drivers/staging/hv/netvsc_drv.c | 19 +++++++++----------
drivers/staging/hv/storvsc_drv.c | 23 +++++++++++------------
drivers/staging/hv/vmbus_drv.c | 5 ++---
5 files changed, 36 insertions(+), 41 deletions(-)
diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index ec6a761..20b9a53 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -140,7 +140,7 @@ MODULE_PARM_DESC(ring_size, "Ring buffer size (in bytes)");
* There is a circular dependency involving blkvsc_probe()
* and block_ops.
*/
-static int blkvsc_probe(struct device *dev);
+static int blkvsc_probe(struct hv_device *dev);
static int blk_vsc_on_device_add(struct hv_device *device,
void *additional_info)
@@ -882,7 +882,7 @@ static int blkvsc_drv_init(void)
drv->driver.name = storvsc_drv_obj->base.name;
- drv->driver.probe = blkvsc_probe;
+ drv->probe = blkvsc_probe;
drv->driver.remove = blkvsc_remove;
drv->driver.shutdown = blkvsc_shutdown;
@@ -937,11 +937,10 @@ static void blkvsc_drv_exit(void)
/*
* blkvsc_probe - Add a new device for this driver
*/
-static int blkvsc_probe(struct device *device)
+static int blkvsc_probe(struct hv_device *dev)
{
struct storvsc_driver_object *storvsc_drv_obj =
- drv_to_stordrv(device->driver);
- struct hv_device *device_obj = device_to_hv_device(device);
+ drv_to_stordrv(dev->device.driver);
struct block_device_context *blkdev = NULL;
struct storvsc_device_info device_info;
@@ -961,7 +960,7 @@ static int blkvsc_probe(struct device *device)
spin_lock_init(&blkdev->lock);
- blkdev->request_pool = kmem_cache_create(dev_name(&device_obj->device),
+ blkdev->request_pool = kmem_cache_create(dev_name(&dev->device),
sizeof(struct blkvsc_request), 0,
SLAB_HWCACHE_ALIGN, NULL);
if (!blkdev->request_pool) {
@@ -971,17 +970,17 @@ static int blkvsc_probe(struct device *device)
/* Call to the vsc driver to add the device */
- ret = storvsc_drv_obj->base.dev_add(device_obj, &device_info);
+ ret = storvsc_drv_obj->base.dev_add(dev, &device_info);
if (ret != 0)
goto cleanup;
- blkdev->device_ctx = device_obj;
+ blkdev->device_ctx = dev;
/* this identified the device 0 or 1 */
blkdev->target = device_info.target_id;
/* this identified the ide ctrl 0 or 1 */
blkdev->path = device_info.path_id;
- dev_set_drvdata(device, blkdev);
+ dev_set_drvdata(&dev->device, blkdev);
ret = stor_vsc_get_major_info(&device_info, &major_info);
@@ -1041,7 +1040,7 @@ static int blkvsc_probe(struct device *device)
return ret;
remove:
- storvsc_drv_obj->base.dev_rm(device_obj);
+ storvsc_drv_obj->base.dev_rm(dev);
cleanup:
if (blkdev) {
diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c
index 4333247..e2363b3 100644
--- a/drivers/staging/hv/hv_mouse.c
+++ b/drivers/staging/hv/hv_mouse.c
@@ -832,23 +832,22 @@ static void mousevsc_hid_close(struct hid_device *hid)
{
}
-static int mousevsc_probe(struct device *device)
+static int mousevsc_probe(struct hv_device *dev)
{
int ret = 0;
struct mousevsc_drv_obj *mousevsc_drv_obj =
- drv_to_mousedrv(device->driver);
+ drv_to_mousedrv(dev->device.driver);
- struct hv_device *device_obj = device_to_hv_device(device);
struct input_device_context *input_dev_ctx;
input_dev_ctx = kmalloc(sizeof(struct input_device_context),
GFP_KERNEL);
- dev_set_drvdata(device, input_dev_ctx);
+ dev_set_drvdata(&dev->device, input_dev_ctx);
/* Call to the vsc driver to add the device */
- ret = mousevsc_drv_obj->base.dev_add(device_obj, NULL);
+ ret = mousevsc_drv_obj->base.dev_add(dev, NULL);
if (ret != 0) {
DPRINT_ERR(INPUTVSC_DRV, "unable to add input vsc device");
@@ -1023,7 +1022,7 @@ static int __init mousevsc_init(void)
drv->driver.name = input_drv_obj->base.name;
- drv->driver.probe = mousevsc_probe;
+ drv->probe = mousevsc_probe;
drv->driver.remove = mousevsc_remove;
/* The driver belongs to vmbus */
diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c
index e61eb7e..685a6f5 100644
--- a/drivers/staging/hv/netvsc_drv.c
+++ b/drivers/staging/hv/netvsc_drv.c
@@ -340,11 +340,10 @@ static void netvsc_send_garp(struct work_struct *w)
}
-static int netvsc_probe(struct device *device)
+static int netvsc_probe(struct hv_device *dev)
{
struct netvsc_driver *net_drv_obj =
- drv_to_netvscdrv(device->driver);
- struct hv_device *device_obj = device_to_hv_device(device);
+ drv_to_netvscdrv(dev->device.driver);
struct net_device *net = NULL;
struct net_device_context *net_device_ctx;
struct netvsc_device_info device_info;
@@ -361,16 +360,16 @@ static int netvsc_probe(struct device *device)
netif_carrier_off(net);
net_device_ctx = netdev_priv(net);
- net_device_ctx->device_ctx = device_obj;
+ net_device_ctx->device_ctx = dev;
net_device_ctx->avail = ring_size;
- dev_set_drvdata(device, net);
+ dev_set_drvdata(&dev->device, net);
INIT_WORK(&net_device_ctx->work, netvsc_send_garp);
/* Notify the netvsc driver of the new device */
- ret = net_drv_obj->base.dev_add(device_obj, &device_info);
+ ret = net_drv_obj->base.dev_add(dev, &device_info);
if (ret != 0) {
free_netdev(net);
- dev_set_drvdata(device, NULL);
+ dev_set_drvdata(&dev->device, NULL);
netdev_err(net, "unable to add netvsc device (ret %d)\n", ret);
return ret;
@@ -397,12 +396,12 @@ static int netvsc_probe(struct device *device)
net->features = NETIF_F_SG;
SET_ETHTOOL_OPS(net, ðtool_ops);
- SET_NETDEV_DEV(net, device);
+ SET_NETDEV_DEV(net, &dev->device);
ret = register_netdev(net);
if (ret != 0) {
/* Remove the device and release the resource */
- net_drv_obj->base.dev_rm(device_obj);
+ net_drv_obj->base.dev_rm(dev);
free_netdev(net);
}
@@ -501,7 +500,7 @@ static int netvsc_drv_init(int (*drv_init)(struct hv_driver *drv))
drv->driver.name = net_drv_obj->base.name;
- drv->driver.probe = netvsc_probe;
+ drv->probe = netvsc_probe;
drv->driver.remove = netvsc_remove;
/* The driver belongs to vmbus */
diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c
index 5ac2904..2060206 100644
--- a/drivers/staging/hv/storvsc_drv.c
+++ b/drivers/staging/hv/storvsc_drv.c
@@ -123,7 +123,7 @@ static int stor_vsc_initialize(struct hv_driver *driver)
}
/* Static decl */
-static int storvsc_probe(struct device *dev);
+static int storvsc_probe(struct hv_device *dev);
static int storvsc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd);
static int storvsc_device_alloc(struct scsi_device *);
static int storvsc_device_configure(struct scsi_device *);
@@ -213,7 +213,7 @@ static int storvsc_drv_init(void)
drv->driver.name = storvsc_drv_obj->base.name;
- drv->driver.probe = storvsc_probe;
+ drv->probe = storvsc_probe;
drv->driver.remove = storvsc_remove;
/* The driver belongs to vmbus */
@@ -320,12 +320,11 @@ static void storvsc_drv_exit(void)
/*
* storvsc_probe - Add a new device for this driver
*/
-static int storvsc_probe(struct device *device)
+static int storvsc_probe(struct hv_device *device)
{
int ret;
struct storvsc_driver_object *storvsc_drv_obj =
- drv_to_stordrv(device->driver);
- struct hv_device *device_obj = device_to_hv_device(device);
+ drv_to_stordrv(device->device.driver);
struct Scsi_Host *host;
struct host_device_context *host_device_ctx;
struct storvsc_device_info device_info;
@@ -340,16 +339,16 @@ static int storvsc_probe(struct device *device)
return -ENOMEM;
}
- dev_set_drvdata(device, host);
+ dev_set_drvdata(&device->device, host);
host_device_ctx = (struct host_device_context *)host->hostdata;
memset(host_device_ctx, 0, sizeof(struct host_device_context));
host_device_ctx->port = host->host_no;
- host_device_ctx->device_ctx = device_obj;
+ host_device_ctx->device_ctx = device;
host_device_ctx->request_pool =
- kmem_cache_create(dev_name(&device_obj->device),
+ kmem_cache_create(dev_name(&device->device),
sizeof(struct storvsc_cmd_request), 0,
SLAB_HWCACHE_ALIGN, NULL);
@@ -360,8 +359,8 @@ static int storvsc_probe(struct device *device)
device_info.port_number = host->host_no;
/* Call to the vsc driver to add the device */
- ret = storvsc_drv_obj->base.dev_add(device_obj,
- (void *)&device_info);
+ ret = storvsc_drv_obj->base.dev_add(device, (void *)&device_info);
+
if (ret != 0) {
DPRINT_ERR(STORVSC_DRV, "unable to add scsi vsc device");
kmem_cache_destroy(host_device_ctx->request_pool);
@@ -381,11 +380,11 @@ static int storvsc_probe(struct device *device)
host->max_channel = STORVSC_MAX_CHANNELS - 1;
/* Register the HBA and start the scsi bus scan */
- ret = scsi_add_host(host, device);
+ ret = scsi_add_host(host, &device->device);
if (ret != 0) {
DPRINT_ERR(STORVSC_DRV, "unable to add scsi host device");
- storvsc_drv_obj->base.dev_rm(device_obj);
+ storvsc_drv_obj->base.dev_rm(device);
kmem_cache_destroy(host_device_ctx->request_pool);
scsi_host_put(host);
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index 515311c..15e6497 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -321,10 +321,9 @@ static int vmbus_probe(struct device *child_device)
drv_to_hv_drv(child_device->driver);
struct hv_device *dev = device_to_hv_device(child_device);
- /* Let the specific open-source driver handles the probe if it can */
- if (drv->driver.probe) {
+ if (drv->probe) {
ret = dev->probe_error =
- drv->driver.probe(child_device);
+ drv->probe(dev);
if (ret != 0)
pr_err("probe failed for device %s (%d)\n",
dev_name(child_device), ret);
--
1.7.4.1
^ permalink raw reply related
* [PATCH 21/25] Staging: hv: Add remove() function to struct hv_driver
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
Add remove() function to struct hv_driver.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_api.h | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/drivers/staging/hv/vmbus_api.h b/drivers/staging/hv/vmbus_api.h
index 6f3741d..1af1b62 100644
--- a/drivers/staging/hv/vmbus_api.h
+++ b/drivers/staging/hv/vmbus_api.h
@@ -101,6 +101,7 @@ struct hv_driver {
void (*cleanup)(struct hv_driver *driver);
int (*probe)(struct hv_device *);
+ int (*remove)(struct hv_device *);
};
--
1.7.4.1
^ permalink raw reply related
* [PATCH 22/25] Staging: hv: Use the remove() function in struct hv_driver
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
Use the newly introduced remove() function in struct hv_driver.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/blkvsc_drv.c | 11 +++++------
drivers/staging/hv/hv_mouse.c | 11 +++++------
drivers/staging/hv/netvsc_drv.c | 13 ++++++-------
drivers/staging/hv/storvsc_drv.c | 13 ++++++-------
drivers/staging/hv/vmbus_drv.c | 9 +++------
5 files changed, 25 insertions(+), 32 deletions(-)
diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 20b9a53..80f7c0e 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -537,19 +537,18 @@ out:
/*
* blkvsc_remove() - Callback when our device is removed
*/
-static int blkvsc_remove(struct device *device)
+static int blkvsc_remove(struct hv_device *dev)
{
struct storvsc_driver_object *storvsc_drv_obj =
- drv_to_stordrv(device->driver);
- struct hv_device *device_obj = device_to_hv_device(device);
- struct block_device_context *blkdev = dev_get_drvdata(device);
+ drv_to_stordrv(dev->device.driver);
+ struct block_device_context *blkdev = dev_get_drvdata(&dev->device);
unsigned long flags;
/*
* Call to the vsc driver to let it know that the device is being
* removed
*/
- storvsc_drv_obj->base.dev_rm(device_obj);
+ storvsc_drv_obj->base.dev_rm(dev);
/* Get to a known state */
spin_lock_irqsave(&blkdev->lock, flags);
@@ -883,7 +882,7 @@ static int blkvsc_drv_init(void)
drv->driver.name = storvsc_drv_obj->base.name;
drv->probe = blkvsc_probe;
- drv->driver.remove = blkvsc_remove;
+ drv->remove = blkvsc_remove;
drv->driver.shutdown = blkvsc_shutdown;
/* The driver belongs to vmbus */
diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c
index e2363b3..d49a51e 100644
--- a/drivers/staging/hv/hv_mouse.c
+++ b/drivers/staging/hv/hv_mouse.c
@@ -858,20 +858,19 @@ static int mousevsc_probe(struct hv_device *dev)
return 0;
}
-static int mousevsc_remove(struct device *device)
+static int mousevsc_remove(struct hv_device *dev)
{
int ret = 0;
struct mousevsc_drv_obj *mousevsc_drv_obj =
- drv_to_mousedrv(device->driver);
+ drv_to_mousedrv(dev->device.driver);
- struct hv_device *device_obj = device_to_hv_device(device);
struct input_device_context *input_dev_ctx;
input_dev_ctx = kmalloc(sizeof(struct input_device_context),
GFP_KERNEL);
- dev_set_drvdata(device, input_dev_ctx);
+ dev_set_drvdata(&dev->device, input_dev_ctx);
if (input_dev_ctx->connected) {
hidinput_disconnect(input_dev_ctx->hid_device);
@@ -885,7 +884,7 @@ static int mousevsc_remove(struct device *device)
* Call to the vsc driver to let it know that the device
* is being removed
*/
- ret = mousevsc_drv_obj->base.dev_rm(device_obj);
+ ret = mousevsc_drv_obj->base.dev_rm(dev);
if (ret != 0) {
DPRINT_ERR(INPUTVSC_DRV,
@@ -1023,7 +1022,7 @@ static int __init mousevsc_init(void)
drv->driver.name = input_drv_obj->base.name;
drv->probe = mousevsc_probe;
- drv->driver.remove = mousevsc_remove;
+ drv->remove = mousevsc_remove;
/* The driver belongs to vmbus */
vmbus_child_driver_register(&drv->driver);
diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c
index 685a6f5..f4c6000 100644
--- a/drivers/staging/hv/netvsc_drv.c
+++ b/drivers/staging/hv/netvsc_drv.c
@@ -408,16 +408,15 @@ static int netvsc_probe(struct hv_device *dev)
return ret;
}
-static int netvsc_remove(struct device *device)
+static int netvsc_remove(struct hv_device *dev)
{
struct netvsc_driver *net_drv_obj =
- drv_to_netvscdrv(device->driver);
- struct hv_device *device_obj = device_to_hv_device(device);
- struct net_device *net = dev_get_drvdata(&device_obj->device);
+ drv_to_netvscdrv(dev->device.driver);
+ struct net_device *net = dev_get_drvdata(&dev->device);
int ret;
if (net == NULL) {
- dev_err(device, "No net device to remove\n");
+ dev_err(&dev->device, "No net device to remove\n");
return 0;
}
@@ -434,7 +433,7 @@ static int netvsc_remove(struct device *device)
* Call to the vsc driver to let it know that the device is being
* removed
*/
- ret = net_drv_obj->base.dev_rm(device_obj);
+ ret = net_drv_obj->base.dev_rm(dev);
if (ret != 0) {
/* TODO: */
netdev_err(net, "unable to remove vsc device (ret %d)\n", ret);
@@ -501,7 +500,7 @@ static int netvsc_drv_init(int (*drv_init)(struct hv_driver *drv))
drv->driver.name = net_drv_obj->base.name;
drv->probe = netvsc_probe;
- drv->driver.remove = netvsc_remove;
+ drv->remove = netvsc_remove;
/* The driver belongs to vmbus */
ret = vmbus_child_driver_register(&drv->driver);
diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c
index 2060206..e449481 100644
--- a/drivers/staging/hv/storvsc_drv.c
+++ b/drivers/staging/hv/storvsc_drv.c
@@ -128,7 +128,7 @@ static int storvsc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd
static int storvsc_device_alloc(struct scsi_device *);
static int storvsc_device_configure(struct scsi_device *);
static int storvsc_host_reset_handler(struct scsi_cmnd *scmnd);
-static int storvsc_remove(struct device *dev);
+static int storvsc_remove(struct hv_device *dev);
static struct scatterlist *create_bounce_buffer(struct scatterlist *sgl,
unsigned int sg_count,
@@ -214,7 +214,7 @@ static int storvsc_drv_init(void)
drv->driver.name = storvsc_drv_obj->base.name;
drv->probe = storvsc_probe;
- drv->driver.remove = storvsc_remove;
+ drv->remove = storvsc_remove;
/* The driver belongs to vmbus */
ret = vmbus_child_driver_register(&drv->driver);
@@ -398,12 +398,11 @@ static int storvsc_probe(struct hv_device *device)
/*
* storvsc_remove - Callback when our device is removed
*/
-static int storvsc_remove(struct device *device)
+static int storvsc_remove(struct hv_device *dev)
{
struct storvsc_driver_object *storvsc_drv_obj =
- drv_to_stordrv(device->driver);
- struct hv_device *device_obj = device_to_hv_device(device);
- struct Scsi_Host *host = dev_get_drvdata(device);
+ drv_to_stordrv(dev->device.driver);
+ struct Scsi_Host *host = dev_get_drvdata(&dev->device);
struct host_device_context *host_device_ctx =
(struct host_device_context *)host->hostdata;
@@ -411,7 +410,7 @@ static int storvsc_remove(struct device *device)
* Call to the vsc driver to let it know that the device is being
* removed
*/
- storvsc_drv_obj->base.dev_rm(device_obj);
+ storvsc_drv_obj->base.dev_rm(dev);
if (host_device_ctx->request_pool) {
kmem_cache_destroy(host_device_ctx->request_pool);
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index 15e6497..e09b363 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -344,16 +344,13 @@ static int vmbus_remove(struct device *child_device)
int ret;
struct hv_driver *drv;
+ struct hv_device *dev = device_to_hv_device(child_device);
if (child_device->driver) {
drv = drv_to_hv_drv(child_device->driver);
- /*
- * Let the specific open-source driver handles the removal if
- * it can
- */
- if (drv->driver.remove) {
- ret = drv->driver.remove(child_device);
+ if (drv->remove) {
+ ret = drv->remove(dev);
} else {
pr_err("remove not set for driver %s\n",
dev_name(child_device));
--
1.7.4.1
^ permalink raw reply related
* [PATCH 23/25] Staging: hv: Add shutdown() function to struct hv_driver
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
Add shutdown() function to struct hv_driver.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/vmbus_api.h | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/drivers/staging/hv/vmbus_api.h b/drivers/staging/hv/vmbus_api.h
index 1af1b62..0025002 100644
--- a/drivers/staging/hv/vmbus_api.h
+++ b/drivers/staging/hv/vmbus_api.h
@@ -102,6 +102,7 @@ struct hv_driver {
int (*probe)(struct hv_device *);
int (*remove)(struct hv_device *);
+ void (*shutdown)(struct hv_device *);
};
--
1.7.4.1
^ permalink raw reply related
* [PATCH 24/25] Staging: hv: Use the shutdown() function in struct hv_driver
From: K. Y. Srinivasan @ 2011-04-26 16:20 UTC (permalink / raw)
To: gregkh, linux-kernel, devel, virtualization; +Cc: Haiyang Zhang, Abhishek Kane
In-Reply-To: <1303834842-5022-1-git-send-email-kys@microsoft.com>
Use the newly introduced shutdown() function.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
---
drivers/staging/hv/blkvsc_drv.c | 6 +++---
drivers/staging/hv/vmbus_drv.c | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c
index 80f7c0e..db44cf6 100644
--- a/drivers/staging/hv/blkvsc_drv.c
+++ b/drivers/staging/hv/blkvsc_drv.c
@@ -585,9 +585,9 @@ static int blkvsc_remove(struct hv_device *dev)
}
-static void blkvsc_shutdown(struct device *device)
+static void blkvsc_shutdown(struct hv_device *dev)
{
- struct block_device_context *blkdev = dev_get_drvdata(device);
+ struct block_device_context *blkdev = dev_get_drvdata(&dev->device);
unsigned long flags;
if (!blkdev)
@@ -883,7 +883,7 @@ static int blkvsc_drv_init(void)
drv->probe = blkvsc_probe;
drv->remove = blkvsc_remove;
- drv->driver.shutdown = blkvsc_shutdown;
+ drv->shutdown = blkvsc_shutdown;
/* The driver belongs to vmbus */
ret = vmbus_child_driver_register(&drv->driver);
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index e09b363..f95ec2b 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -368,6 +368,7 @@ static int vmbus_remove(struct device *child_device)
static void vmbus_shutdown(struct device *child_device)
{
struct hv_driver *drv;
+ struct hv_device *dev = device_to_hv_device(child_device);
/* The device may not be attached yet */
@@ -376,9 +377,8 @@ static void vmbus_shutdown(struct device *child_device)
drv = drv_to_hv_drv(child_device->driver);
- /* Let the specific open-source driver handles the removal if it can */
- if (drv->driver.shutdown)
- drv->driver.shutdown(child_device);
+ if (drv->shutdown)
+ drv->shutdown(dev);
return;
}
--
1.7.4.1
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox