Skip to content

Commit

Permalink
staging: hv: move netvsc_device_add() to clean up forward declaration
Browse files Browse the repository at this point in the history
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Haiyang Zhang authored and Greg Kroah-Hartman committed Apr 25, 2011
1 parent 0021e71 commit b637e02
Showing 1 changed file with 87 additions and 89 deletions.
176 changes: 87 additions & 89 deletions drivers/staging/hv/netvsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,6 @@ static const struct hv_guid netvsc_device_type = {
}
};

static void netvsc_channel_cb(void *context);

static int netvsc_init_send_buf(struct hv_device *device);

static int netvsc_init_recv_buf(struct hv_device *device);
Expand Down Expand Up @@ -591,93 +589,6 @@ static void NetVscDisconnectFromVsp(struct netvsc_device *net_device)
netvsc_destroy_send_buf(net_device);
}

/*
* netvsc_device_add - Callback when the device belonging to this
* driver is added
*/
static int netvsc_device_add(struct hv_device *device, void *additional_info)
{
int ret = 0;
int i;
struct netvsc_device *net_device;
struct hv_netvsc_packet *packet, *pos;
struct netvsc_driver *net_driver =
(struct netvsc_driver *)device->drv;

net_device = alloc_net_device(device);
if (!net_device) {
ret = -1;
goto cleanup;
}

/* Initialize the NetVSC channel extension */
net_device->recv_buf_size = NETVSC_RECEIVE_BUFFER_SIZE;
spin_lock_init(&net_device->recv_pkt_list_lock);

net_device->send_buf_size = NETVSC_SEND_BUFFER_SIZE;

INIT_LIST_HEAD(&net_device->recv_pkt_list);

for (i = 0; i < NETVSC_RECEIVE_PACKETLIST_COUNT; i++) {
packet = kzalloc(sizeof(struct hv_netvsc_packet) +
(NETVSC_RECEIVE_SG_COUNT *
sizeof(struct hv_page_buffer)), GFP_KERNEL);
if (!packet)
break;

list_add_tail(&packet->list_ent,
&net_device->recv_pkt_list);
}
init_waitqueue_head(&net_device->channel_init_wait);

/* Open the channel */
ret = vmbus_open(device->channel, net_driver->ring_buf_size,
net_driver->ring_buf_size, NULL, 0,
netvsc_channel_cb, device);

if (ret != 0) {
dev_err(&device->device, "unable to open channel: %d", ret);
ret = -1;
goto cleanup;
}

/* Channel is opened */
pr_info("hv_netvsc channel opened successfully");

/* Connect with the NetVsp */
ret = netvsc_connect_vsp(device);
if (ret != 0) {
dev_err(&device->device,
"unable to connect to NetVSP - %d", ret);
ret = -1;
goto close;
}

return ret;

close:
/* Now, we can close the channel safely */
vmbus_close(device->channel);

cleanup:

if (net_device) {
list_for_each_entry_safe(packet, pos,
&net_device->recv_pkt_list,
list_ent) {
list_del(&packet->list_ent);
kfree(packet);
}

release_outbound_net_device(device);
release_inbound_net_device(device);

free_net_device(net_device);
}

return ret;
}

/*
* netvsc_device_remove - Callback when the root bus device is removed
*/
Expand Down Expand Up @@ -1192,6 +1103,93 @@ static void netvsc_channel_cb(void *context)
return;
}

/*
* netvsc_device_add - Callback when the device belonging to this
* driver is added
*/
static int netvsc_device_add(struct hv_device *device, void *additional_info)
{
int ret = 0;
int i;
struct netvsc_device *net_device;
struct hv_netvsc_packet *packet, *pos;
struct netvsc_driver *net_driver =
(struct netvsc_driver *)device->drv;

net_device = alloc_net_device(device);
if (!net_device) {
ret = -1;
goto cleanup;
}

/* Initialize the NetVSC channel extension */
net_device->recv_buf_size = NETVSC_RECEIVE_BUFFER_SIZE;
spin_lock_init(&net_device->recv_pkt_list_lock);

net_device->send_buf_size = NETVSC_SEND_BUFFER_SIZE;

INIT_LIST_HEAD(&net_device->recv_pkt_list);

for (i = 0; i < NETVSC_RECEIVE_PACKETLIST_COUNT; i++) {
packet = kzalloc(sizeof(struct hv_netvsc_packet) +
(NETVSC_RECEIVE_SG_COUNT *
sizeof(struct hv_page_buffer)), GFP_KERNEL);
if (!packet)
break;

list_add_tail(&packet->list_ent,
&net_device->recv_pkt_list);
}
init_waitqueue_head(&net_device->channel_init_wait);

/* Open the channel */
ret = vmbus_open(device->channel, net_driver->ring_buf_size,
net_driver->ring_buf_size, NULL, 0,
netvsc_channel_cb, device);

if (ret != 0) {
dev_err(&device->device, "unable to open channel: %d", ret);
ret = -1;
goto cleanup;
}

/* Channel is opened */
pr_info("hv_netvsc channel opened successfully");

/* Connect with the NetVsp */
ret = netvsc_connect_vsp(device);
if (ret != 0) {
dev_err(&device->device,
"unable to connect to NetVSP - %d", ret);
ret = -1;
goto close;
}

return ret;

close:
/* Now, we can close the channel safely */
vmbus_close(device->channel);

cleanup:

if (net_device) {
list_for_each_entry_safe(packet, pos,
&net_device->recv_pkt_list,
list_ent) {
list_del(&packet->list_ent);
kfree(packet);
}

release_outbound_net_device(device);
release_inbound_net_device(device);

free_net_device(net_device);
}

return ret;
}

/*
* netvsc_initialize - Main entry point
*/
Expand Down

0 comments on commit b637e02

Please sign in to comment.