diff options
Diffstat (limited to 'drivers/input/serio/hyperv-keyboard.c')
| -rw-r--r-- | drivers/input/serio/hyperv-keyboard.c | 35 | 
1 files changed, 6 insertions, 29 deletions
diff --git a/drivers/input/serio/hyperv-keyboard.c b/drivers/input/serio/hyperv-keyboard.c index 88ae7c2ac3c8..e486a8a74c40 100644 --- a/drivers/input/serio/hyperv-keyboard.c +++ b/drivers/input/serio/hyperv-keyboard.c @@ -237,40 +237,17 @@ static void hv_kbd_handle_received_packet(struct hv_device *hv_dev,  static void hv_kbd_on_channel_callback(void *context)  { +	struct vmpacket_descriptor *desc;  	struct hv_device *hv_dev = context; -	void *buffer; -	int bufferlen = 0x100; /* Start with sensible size */  	u32 bytes_recvd;  	u64 req_id; -	int error; -	buffer = kmalloc(bufferlen, GFP_ATOMIC); -	if (!buffer) -		return; - -	while (1) { -		error = vmbus_recvpacket_raw(hv_dev->channel, buffer, bufferlen, -					     &bytes_recvd, &req_id); -		switch (error) { -		case 0: -			if (bytes_recvd == 0) { -				kfree(buffer); -				return; -			} - -			hv_kbd_handle_received_packet(hv_dev, buffer, -						      bytes_recvd, req_id); -			break; +	foreach_vmbus_pkt(desc, hv_dev->channel) { +		bytes_recvd = desc->len8 * 8; +		req_id = desc->trans_id; -		case -ENOBUFS: -			kfree(buffer); -			/* Handle large packet */ -			bufferlen = bytes_recvd; -			buffer = kmalloc(bytes_recvd, GFP_ATOMIC); -			if (!buffer) -				return; -			break; -		} +		hv_kbd_handle_received_packet(hv_dev, desc, bytes_recvd, +					      req_id);  	}  }  |