wil6210: fix memory leak in the AP flow
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Mon, 17 Mar 2014 13:34:17 +0000 (15:34 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 17 Mar 2014 17:44:18 +0000 (13:44 -0400)
When switching between STA and AP modes, memory allocated for Rx vring leaks
This is because start_ap() allocates Rx vring but stop_ap() do not free it.
Logically, Rx vring is not valid (HW can't use it anymore), so free it in reset()
Also, check double init for Rx vring and bail out with -EINVAL

Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/wil6210/main.c
drivers/net/wireless/ath/wil6210/txrx.c

index 684762203a62ce94f538f22fbe54d2514c78e12e..de952ab78607746ec215ea1ee98fb1b876bc8611 100644 (file)
@@ -343,6 +343,8 @@ int wil_reset(struct wil6210_priv *wil)
        /* TODO: put MAC in reset */
        wil_target_reset(wil);
 
+       wil_rx_fini(wil);
+
        /* init after reset */
        wil->pending_connect_cid = -1;
        reinit_completion(&wil->wmi_ready);
index 5cda0ea9925f214a54bcb7a8f1f851c2b0217fb7..97d036adb3821dc930483f275aafe4246521d8e3 100644 (file)
@@ -557,6 +557,11 @@ int wil_rx_init(struct wil6210_priv *wil)
        struct vring *vring = &wil->vring_rx;
        int rc;
 
+       if (vring->va) {
+               wil_err(wil, "Rx ring already allocated\n");
+               return -EINVAL;
+       }
+
        vring->size = WIL6210_RX_RING_SIZE;
        rc = wil_vring_alloc(wil, vring);
        if (rc)