wil6210: Find free vring for Tx
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Thu, 27 Feb 2014 14:20:45 +0000 (16:20 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 28 Feb 2014 19:33:31 +0000 (14:33 -0500)
There are 24 possible Tx vrings; when doind multiple connections, more then
one vring has to be used. Search for free one and select it.

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

index 38906f1bc769c3345e3bd8bb8ec14f73adfc09d9..5079e49442057cfa95e296977febee823a5173f1 100644 (file)
@@ -107,12 +107,23 @@ static void wil_connect_timer_fn(ulong x)
        schedule_work(&wil->disconnect_worker);
 }
 
+static int wil_find_free_vring(struct wil6210_priv *wil)
+{
+       int i;
+       for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) {
+               if (!wil->vring_tx[i].va)
+                       return i;
+       }
+       return -EINVAL;
+}
+
 static void wil_connect_worker(struct work_struct *work)
 {
        int rc;
        struct wil6210_priv *wil = container_of(work, struct wil6210_priv,
                                                connect_worker);
        int cid = wil->pending_connect_cid;
+       int ringid = wil_find_free_vring(wil);
 
        if (cid < 0) {
                wil_err(wil, "No connection pending\n");
@@ -121,7 +132,7 @@ static void wil_connect_worker(struct work_struct *work)
 
        wil_dbg_wmi(wil, "Configure for connection CID %d\n", cid);
 
-       rc = wil_vring_init_tx(wil, 0, WIL6210_TX_RING_SIZE, cid, 0);
+       rc = wil_vring_init_tx(wil, ringid, WIL6210_TX_RING_SIZE, cid, 0);
        wil->pending_connect_cid = -1;
        if (rc == 0) {
                wil->sta[cid].status = wil_sta_connected;