diff --git a/drivers/staging/rtl8712/rtl8712_recv.c b/drivers/staging/rtl8712/rtl8712_recv.c index 0ffb30f1af7e..97e866c63876 100644 --- a/drivers/staging/rtl8712/rtl8712_recv.c +++ b/drivers/staging/rtl8712/rtl8712_recv.c @@ -51,8 +51,16 @@ void r8712_init_recv_priv(struct recv_priv *precvpriv, for (i = 0; i < NR_RECVBUFF; i++) { INIT_LIST_HEAD(&precvbuf->list); spin_lock_init(&precvbuf->recvbuf_lock); - if (r8712_os_recvbuf_resource_alloc(padapter, precvbuf)) + if (r8712_os_recvbuf_resource_alloc(padapter, precvbuf)) { + int j = i; + + while (j-- > 0) { + if (precvbuf) + r8712_os_recvbuf_resource_free(padapter, precvbuf); + precvbuf--; + } break; + } precvbuf->ref_cnt = 0; precvbuf->adapter = padapter; list_add_tail(&precvbuf->list,