qcacmn: Link descriptor IDs to assist debug

We need only 3 bits of cookie field in link descriptor buff_addr_info
to store bank ID. The remaining bytes will be used set a unique ID,
which will be useful in debugging. Also fixed an issue in scatter idle
list setup.

Change-Id: Id3cc9a8a316fe942e749611c2f57e9324419dd40
diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c
index 07d78df..fbe14d9 100644
--- a/dp/wifi3.0/dp_main.c
+++ b/dp/wifi3.0/dp_main.c
@@ -1065,6 +1065,7 @@
 	uint32_t last_bank_size = 0;
 	uint32_t entry_size, num_entries;
 	int i;
+	uint32_t desc_id = 0;
 
 	/* Only Tx queue descriptors are allocated from common link descriptor
 	 * pool Rx queue descriptors are not included in this because (REO queue
@@ -1195,8 +1196,10 @@
 			while (num_entries && (desc = hal_srng_src_get_next(
 				soc->hal_soc,
 				soc->wbm_idle_link_ring.hal_srng))) {
-				hal_set_link_desc_addr(desc, i, paddr);
+				hal_set_link_desc_addr(desc,
+					LINK_DESC_COOKIE(desc_id, i), paddr);
 				num_entries--;
+				desc_id++;
 				paddr += link_desc_size;
 			}
 		}
@@ -1249,14 +1252,12 @@
 				/ link_desc_size;
 			unsigned long paddr = (unsigned long)(
 				soc->link_desc_banks[i].base_paddr);
-			void *desc = NULL;
 
-			while (num_link_descs && (desc =
-				hal_srng_src_get_next(soc->hal_soc,
-				soc->wbm_idle_link_ring.hal_srng))) {
+			while (num_link_descs) {
 				hal_set_link_desc_addr((void *)scatter_buf_ptr,
-					i, paddr);
+					LINK_DESC_COOKIE(desc_id, i), paddr);
 				num_link_descs--;
+				desc_id++;
 				paddr += link_desc_size;
 				if (rem_entries) {
 					rem_entries--;
diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h
index 18fdc87..2193762 100644
--- a/dp/wifi3.0/dp_rx.h
+++ b/dp/wifi3.0/dp_rx.h
@@ -505,13 +505,15 @@
 				  struct hal_buf_info *buf_info)
 {
 	void *link_desc_va;
+	uint32_t bank_id = LINK_DESC_COOKIE_BANK_ID(buf_info->sw_cookie);
+
 
 	/* TODO */
 	/* Add sanity for  cookie */
 
-	link_desc_va = soc->link_desc_banks[buf_info->sw_cookie].base_vaddr +
+	link_desc_va = soc->link_desc_banks[bank_id].base_vaddr +
 		(buf_info->paddr -
-			soc->link_desc_banks[buf_info->sw_cookie].base_paddr);
+			soc->link_desc_banks[bank_id].base_paddr);
 
 	return link_desc_va;
 }
diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h
index df83bfc..86f05c6 100644
--- a/dp/wifi3.0/dp_types.h
+++ b/dp/wifi3.0/dp_types.h
@@ -834,6 +834,21 @@
 /* Same as NAC_MAX_CLENT */
 #define DP_NAC_MAX_CLIENT  24
 
+/*
+ * Macros to setup link descriptor cookies - for link descriptors, we just
+ * need first 3 bits to store bank ID. The remaining bytes will be used set a
+ * unique ID, which will be useful in debugging
+ */
+#define LINK_DESC_BANK_ID_MASK 0x7
+#define LINK_DESC_ID_SHIFT 3
+#define LINK_DESC_ID_START 0x8000
+
+#define LINK_DESC_COOKIE(_desc_id, _bank_id) \
+	((((_desc_id) + LINK_DESC_ID_START) << LINK_DESC_ID_SHIFT) | (_bank_id))
+
+#define LINK_DESC_COOKIE_BANK_ID(_cookie) \
+	((_cookie) & LINK_DESC_BANK_ID_MASK)
+
 /* same as ieee80211_nac_param */
 enum dp_nac_param_cmd {
 	/* IEEE80211_NAC_PARAM_ADD */