diff --git a/drivers/wireless/gs2200m.c b/drivers/wireless/gs2200m.c index 65424298577..2d526c6809a 100644 --- a/drivers/wireless/gs2200m.c +++ b/drivers/wireless/gs2200m.c @@ -1450,6 +1450,7 @@ static enum pkt_type_e gs2200m_send_cmd(FAR struct gs2200m_dev_s *dev, { enum spi_status_e s; enum pkt_type_e r = TYPE_SPI_ERROR; + int n = 1; /* Disable gs2200m irq to poll dready */ @@ -1457,6 +1458,8 @@ static enum pkt_type_e gs2200m_send_cmd(FAR struct gs2200m_dev_s *dev, wlinfo("+++ cmd=%s", cmd); +retry: + s = gs2200m_hal_write(dev, cmd, strlen(cmd)); r = _spi_err_to_pkt_type(s); @@ -1467,6 +1470,22 @@ static enum pkt_type_e gs2200m_send_cmd(FAR struct gs2200m_dev_s *dev, r = gs2200m_recv_pkt(dev, pkt_dat); + /* NOTE: retry in case of errors */ + + if ((TYPE_OK != r) && (0 <= --n)) + { + if (pkt_dat) + { + /* release & initialize pkt_dat before retry */ + + _release_pkt_dat(dev, pkt_dat); + memset(pkt_dat, 0, sizeof(pkt_dat)); + } + + wlwarn("*** retry cmd=%s (n=%d) \n", cmd, n); + goto retry; + } + errout: /* Enable gs2200m irq again */