22 #define SDIO_RETRIES 3
23 #define CSR_WIFI_HIP_SDIO_TRACE_DATA_LENGTH 16
26 #define retryable_sdio_error(_csrResult) (((_csrResult) == CSR_SDIO_RESULT_CRC_ERROR) || ((_csrResult) == CSR_SDIO_RESULT_TIMEOUT))
68 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
69 unifi_debug_log_to_buf(
"r0@%02X", addr);
75 #ifdef CSR_WIFI_TRANSPORT_CSPI
77 "retrying_read_f0_8: F1 8-bit reads are not allowed.\n");
80 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
81 unifi_debug_log_to_buf(
"r@%02X", addr);
86 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
89 unifi_debug_log_to_buf(
"error=%X\n", csrResult);
93 unifi_debug_log_to_buf(
"=%X\n", *pdata);
106 #ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
107 card->cmd_prof.cmd52_count++;
111 unifi_trace(card->ospriv,
UDBG2,
"retryable SDIO error reading F%d 0x%lX\n", funcnum, addr);
116 unifi_warning(card->ospriv,
"Read succeeded after %d attempts\n", retries);
121 unifi_error(card->ospriv,
"Failed to read from UniFi (addr 0x%lX) after %d tries\n",
143 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
144 unifi_debug_log_to_buf(
"w0@%02X=%X", addr, data);
150 #ifdef CSR_WIFI_TRANSPORT_CSPI
152 "retrying_write_f0_8: F1 8-bit writes are not allowed.\n");
155 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
156 unifi_debug_log_to_buf(
"w@%02X=%X", addr, data);
161 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
164 unifi_debug_log_to_buf(
",error=%X", csrResult);
166 unifi_debug_string_to_buf(
"\n");
178 #ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
179 card->cmd_prof.cmd52_count++;
183 unifi_trace(card->ospriv,
UDBG2,
"retryable SDIO error writing %02X to F%d 0x%lX\n",
184 data, funcnum, addr);
189 unifi_warning(card->ospriv,
"Write succeeded after %d attempts\n", retries);
194 unifi_error(card->ospriv,
"Failed to write to UniFi (addr 0x%lX) after %d tries\n",
215 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
216 unifi_debug_log_to_buf(
"r@%02X", addr);
219 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
222 unifi_debug_log_to_buf(
"error=%X\n", csrResult);
226 unifi_debug_log_to_buf(
"=%X\n", *pdata);
240 #ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
241 card->cmd_prof.cmd52_count++;
245 unifi_trace(card->ospriv,
UDBG2,
"retryable SDIO error reading F%d 0x%lX\n", funcnum, addr);
250 unifi_warning(card->ospriv,
"Read succeeded after %d attempts\n", retries);
255 unifi_error(card->ospriv,
"Failed to read from UniFi (addr 0x%lX) after %d tries\n",
276 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
277 unifi_debug_log_to_buf(
"w@%02X=%X", addr, data);
280 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
283 unifi_debug_log_to_buf(
",error=%X", csrResult);
285 unifi_debug_string_to_buf(
"\n");
298 #ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
299 card->cmd_prof.cmd52_count++;
303 unifi_trace(card->ospriv,
UDBG2,
"retryable SDIO error writing %02X to F%d 0x%lX\n",
304 data, funcnum, addr);
309 unifi_warning(card->ospriv,
"Write succeeded after %d attempts\n", retries);
314 unifi_error(card->ospriv,
"Failed to write to UniFi (addr 0x%lX) after %d tries\n",
343 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
344 card->cmd_prof.cmd52_f0_r_count++;
346 return retrying_read8(card, 0, addr, pdata);
369 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
370 card->cmd_prof.cmd52_f0_w_count++;
372 return retrying_write8(card, 0, addr, data);
393 #ifdef CSR_WIFI_TRANSPORT_CSPI
397 r = retrying_read16(card, card->function, addr, &w);
398 *pdata = (
u8)(w & 0xFF);
401 return retrying_read8(card, card->function, addr, pdata);
431 "Warning: Byte write to an odd address (0x%lX) is dangerous\n",
435 #ifdef CSR_WIFI_TRANSPORT_CSPI
436 return retrying_write16(card, card->function, addr, (
u16)data);
438 return retrying_write8(card, card->function, addr, data);
467 return retrying_read16(card, card->function, addr, pdata);
495 return retrying_write16(card, card->function, addr, data);
521 r = retrying_read16(card, card->function, addr, &w0);
527 r = retrying_read16(card, card->function, addr + 2, &w1);
533 *pdata = ((
u32)w1 << 16) | (
u32)w0;
577 for (i = 0; i < len; i += 2)
579 r = retrying_read16(card, card->function, addr, &w);
585 *cptr++ = ((
u8)w & 0xFF);
586 if ((m >= 0) && (((
s8)w & 0xFF) ==
m))
597 *cptr++ = ((
u8)(w >> 8) & 0xFF);
598 if ((m >= 0) && (((
s8)(w >> 8) & 0xFF) == m))
638 return unifi_read_directn_match(card, addr, pdata, len, -1, &num);
674 signed_len = (
s16)len;
675 while (signed_len > 0)
678 r = retrying_write16(card, card->function, addr, *cptr);
731 unifi_error(card->ospriv,
"Failed to decode SHARED_DMEM_PAGE %08lx\n", dmem_addr);
735 if (page != card->dmem_page)
737 unifi_trace(card->ospriv,
UDBG6,
"setting dmem page=0x%X, addr=0x%lX\n", page, addr);
743 unifi_error(card->ospriv,
"Failed to write SHARED_DMEM_PAGE\n");
747 card->dmem_page =
page;
750 *paddr = ((
s32)addr * 2) + (dmem_addr & 1);
771 unifi_error(card->ospriv,
"Failed to decode PROG MEM PAGE %08lx %d\n", pmem_addr, mem_type);
775 if (page != card->pmem_page)
777 unifi_trace(card->ospriv,
UDBG6,
"setting pmem page=0x%X, addr=0x%lX\n", page, addr);
783 unifi_error(card->ospriv,
"Failed to write PROG MEM PAGE\n");
787 card->pmem_page =
page;
790 *paddr = ((
s32)addr * 2) + (pmem_addr & 1);
834 r = set_dmem_page(card, addr, paddr);
842 if (!ChipHelper_HasFlash(card->helper))
844 unifi_error(card->ospriv,
"Bad address space for chip in generic pointer 0x%08lX (helper=0x%x)\n",
845 generic_addr, card->helper);
853 if (!ChipHelper_HasExtSram(card->helper))
855 unifi_error(card->ospriv,
"Bad address space for chip in generic pointer 0x%08l (helper=0x%x)\n",
856 generic_addr, card->helper);
874 *paddr = ChipHelper_DATA_MEMORY_RAM_OFFSET(card->helper) * 2 +
addr;
883 *paddr = ChipHelper_DATA_MEMORY_RAM_OFFSET(card->helper) * 2 +
addr;
887 if (!ChipHelper_HasBt(card->helper))
889 unifi_error(card->ospriv,
"Bad address space for chip in generic pointer 0x%08lX (helper=0x%x)\n",
890 generic_addr, card->helper);
898 *paddr = ChipHelper_DATA_MEMORY_RAM_OFFSET(card->helper) * 2 +
addr;
920 if (!ChipHelper_HasBt(card->helper))
922 unifi_error(card->ospriv,
"Bad address space for chip in generic pointer 0x%08lX (helper=0x%x)\n",
923 generic_addr, card->helper);
935 if (!ChipHelper_HasRom(card->helper))
937 unifi_error(card->ospriv,
"Bad address space for chip in generic pointer 0x%08lX (helper=0x%x)\n",
938 generic_addr, card->helper);
950 if (!ChipHelper_HasRom(card->helper))
952 unifi_error(card->ospriv,
"Bad address space for chip in generic pointer 0x%08lX (helper=0x%x)\n",
953 generic_addr, card->helper);
965 if (!ChipHelper_HasRom(card->helper) || !ChipHelper_HasBt(card->helper))
967 unifi_error(card->ospriv,
"Bad address space for chip in generic pointer 0x%08lX (helper=0x%x)\n",
968 generic_addr, card->helper);
980 unifi_error(card->ospriv,
"Bad address space %d in generic pointer 0x%08lX (helper=0x%x)\n",
981 space, generic_addr, card->helper);
1021 if (card->proc_select != (
u32)select)
1024 ChipHelper_DBG_HOST_PROC_SELECT(card->helper) * 2,
1032 unifi_error(card->ospriv,
"Failed to write to Proc Select register\n");
1036 card->proc_select = (
u32)select;
1066 #ifdef CSR_WIFI_TRANSPORT_CSPI
1070 r = set_page(card, unifi_addr, &sdio_addr);
1076 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
1077 card->cmd_prof.cmd52_r8or16_count++;
1079 #ifdef CSR_WIFI_TRANSPORT_CSPI
1080 r = retrying_read16(card, card->function, sdio_addr, &w);
1081 *pdata = (
u8)(w & 0xFF);
1084 return retrying_read8(card, card->function, sdio_addr, pdata);
1117 #ifdef CSR_WIFI_TRANSPORT_CSPI
1121 r = set_page(card, unifi_addr, &sdio_addr);
1130 "Warning: Byte write to an odd address (0x%lX) is dangerous\n",
1134 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
1135 card->cmd_prof.cmd52_w8or16_count++;
1137 #ifdef CSR_WIFI_TRANSPORT_CSPI
1139 return retrying_write16(card, card->function, sdio_addr, w);
1141 return retrying_write8(card, card->function, sdio_addr, data);
1170 r = set_page(card, unifi_addr, &sdio_addr);
1176 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
1177 card->cmd_prof.cmd52_r16_count++;
1207 r = set_page(card, unifi_addr, &sdio_addr);
1213 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
1214 card->cmd_prof.cmd52_w16_count++;
1244 r = set_page(card, unifi_addr, &sdio_addr);
1250 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
1251 card->cmd_prof.cmd52_r32_count++;
1287 r = set_page(card, unifi_addr, &sdio_addr);
1293 r = unifi_read_directn_match(card, sdio_addr, pdata, len, match, &num);
1334 #define SHARED_READ_RETRY_LIMIT 10
1358 return (
s32)(b & 0xff);
1392 r = set_page(card, unifi_addr, &sdio_addr);
1403 u32 addr,
u8 *pdata,
1410 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
1411 unifi_debug_log_to_buf(
"r@%02X#%X=", addr, count);
1413 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
1414 unifi_debug_log_to_buf(
"R");
1416 csrResult =
CsrSdioRead(card->sdio_if, addr, pdata, count);
1417 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
1418 unifi_debug_log_to_buf(
"<");
1423 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
1424 unifi_debug_log_to_buf(
"w@%02X#%X=", addr, count);
1427 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
1428 unifi_debug_log_to_buf(
"W");
1430 csrResult =
CsrSdioWrite(card->sdio_if, addr, pdata, count);
1431 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
1432 unifi_debug_log_to_buf(
">");
1435 #ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
1436 card->cmd_prof.cmd53_count++;
1438 #if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
1441 unifi_debug_log_to_buf(
"error=%X", csrResult);
1447 unifi_debug_string_to_buf(
"\n");
1478 #define CMD53_RETRIES 3
1484 #define REWIND_RETRIES 15
1485 #define REWIND_POLLING_RETRIES 5
1486 #define REWIND_DELAY 1
1494 u8 *pdata_lsb = ((
u8 *)&pdata) + card->lsb;
1496 #ifdef CSR_WIFI_MAKE_FAKE_CMD53_ERRORS
1497 static s16 fake_error;
1504 unifi_notice(card->ospriv,
"CD53 request on a unaligned buffer (addr: 0x%X) dir %s-Host\n",
1520 unifi_error(card->ospriv,
"Null pdata for unifi_bulk_rw() len: %d\n", len);
1523 if ((len & 1) || (len > 0xffff))
1525 unifi_error(card->ospriv,
"Impossible CMD53 length requested: %d\n", len);
1531 csrResult = csr_sdio_block_rw(card, card->function, handle,
1532 (
u8 *)pdata, (
u16)len,
1538 #ifdef CSR_WIFI_MAKE_FAKE_CMD53_ERRORS
1539 if (++fake_error > 100)
1576 unifi_error(card->ospriv,
"Fatal error in a CMD53 transfer\n");
1589 "Error in a CMD53 transfer, retrying (h:%d,l:%u)...\n",
1590 (
s16)handle & 0xff, len);
1594 (
u8)(handle & 0xff));
1605 unifi_error(card->ospriv,
"Failed to write REWIND cmd\n");
1627 unifi_error(card->ospriv,
"Failed to read REWIND status\n");
1635 if (--stat_retries == 0)
1637 unifi_error(card->ospriv,
"Timeout waiting for REWIND ready\n");
1652 unifi_error(card->ospriv,
"Block %s failed after %d retries\n",
1662 card->sdio_bytes_read += len;
1666 card->sdio_bytes_written += len;
1701 csrResult = csr_sdio_block_rw(card, card->function, handle,
1702 (
u8 *)pdata, (
u16)len, direction);