Commit b637e023 authored by Haiyang Zhang's avatar Haiyang Zhang Committed by Greg Kroah-Hartman
Browse files

staging: hv: move netvsc_device_add() to clean up forward declaration

parent 0021e71e
Loading
Loading
Loading
Loading
+87 −89
Original line number Diff line number Diff line
@@ -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);
@@ -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
 */
@@ -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
 */