drivers: wireless: Improve packet receiving performance in gs2200m.c

Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
This commit is contained in:
Masayuki Ishikawa 2020-04-30 14:03:42 +09:00 committed by Alin Jerpelea
parent a5e4f0435d
commit 350ffb20ad

View File

@ -97,6 +97,8 @@
#define RD_RESP_NOK 0x14 #define RD_RESP_NOK 0x14
#define LED_GPIO 30 #define LED_GPIO 30
#define HAL_TIMEOUT 5000000 /* in us */
#define WR_MAX_RETRY 100
/**************************************************************************** /****************************************************************************
* Private Data Types * Private Data Types
@ -827,15 +829,8 @@ static void _write_data(FAR struct gs2200m_dev_s *dev,
FAR uint8_t *buf, FAR uint8_t *buf,
FAR uint16_t len) FAR uint16_t len)
{ {
int i;
SPI_SELECT(dev->spi, SPIDEV_WIRELESS(0), true); SPI_SELECT(dev->spi, SPIDEV_WIRELESS(0), true);
SPI_SNDBLOCK(dev->spi, buf, len);
for (i = 0; i < len; i++, buf++)
{
SPI_SEND(dev->spi, *buf);
}
SPI_SELECT(dev->spi, SPIDEV_WIRELESS(0), false); SPI_SELECT(dev->spi, SPIDEV_WIRELESS(0), false);
} }
@ -848,18 +843,12 @@ static void _read_data(FAR struct gs2200m_dev_s *dev,
FAR uint8_t *buff, FAR uint8_t *buff,
FAR uint16_t len) FAR uint16_t len)
{ {
int i;
uint8_t req = 0xf5; /* idle character */ uint8_t req = 0xf5; /* idle character */
memset(buff, 0, len); memset(buff, 0, len);
SPI_SELECT(dev->spi, SPIDEV_WIRELESS(0), true); SPI_SELECT(dev->spi, SPIDEV_WIRELESS(0), true);
SPI_EXCHANGE(dev->spi, &req, buff, len);
for (i = 0; i < len; i++, buff++)
{
SPI_EXCHANGE(dev->spi, &req, buff, 1);
}
SPI_SELECT(dev->spi, SPIDEV_WIRELESS(0), false); SPI_SELECT(dev->spi, SPIDEV_WIRELESS(0), false);
} }
@ -889,15 +878,13 @@ retry:
while (!dev->lower->dready(NULL)) while (!dev->lower->dready(NULL))
{ {
/* TODO: timeout */ /* TODO: timeout */
nxsig_usleep(10);
} }
/* NOTE: wait 100us /* NOTE: busy wait 50us
* workaround to avoid really receiving an invalid frame response * workaround to avoid an invalid frame response
*/ */
nxsig_usleep(100); up_udelay(50);
/* Read frame response */ /* Read frame response */
@ -999,7 +986,7 @@ retry:
wlwarn("*** warning: WR_RESP_NOK received.. retrying. (n=%d) \n", n); wlwarn("*** warning: WR_RESP_NOK received.. retrying. (n=%d) \n", n);
nxsig_usleep(10 * 1000); nxsig_usleep(10 * 1000);
if (9 < n) if (WR_MAX_RETRY < n)
{ {
return SPI_TIMEOUT; return SPI_TIMEOUT;
} }
@ -1039,17 +1026,19 @@ enum spi_status_e gs2200m_hal_read(FAR struct gs2200m_dev_s *dev,
/* NOTE: need to wait for data ready even if we use irq */ /* NOTE: need to wait for data ready even if we use irq */
for (i = 0; i < 500; i++) for (i = 0; i < HAL_TIMEOUT; i++)
{ {
if (dev->lower->dready(NULL)) if (dev->lower->dready(NULL))
{ {
break; break;
} }
nxsig_usleep(10 * 1000); /* Busy wait 1us */
up_udelay(1);
} }
if (500 == i) if (HAL_TIMEOUT == i)
{ {
wlerr("***** error: timeout! \n"); wlerr("***** error: timeout! \n");
r = SPI_TIMEOUT; r = SPI_TIMEOUT;