drivers: espi: Obtain correct Rx lenght during OOB transaction.
MEC15xx eSPI OOB RX length register holds received message length and receive buffer length, need to extract rcvd msg length. Signed-off-by: Jose Alberto Meza <jose.a.meza.arellano@intel.com>
This commit is contained in:
parent
8b14807e55
commit
b803b32541
1 changed files with 10 additions and 9 deletions
|
@ -417,16 +417,17 @@ static int espi_xec_send_oob(struct device *dev, struct espi_oob_packet pckt)
|
||||||
LOG_DBG("%s\n", __func__);
|
LOG_DBG("%s\n", __func__);
|
||||||
|
|
||||||
if (!(ESPI_OOB_REGS->TX_STS & MCHP_ESPI_OOB_TX_STS_CHEN)) {
|
if (!(ESPI_OOB_REGS->TX_STS & MCHP_ESPI_OOB_TX_STS_CHEN)) {
|
||||||
LOG_WRN("OOB channel is disabled\n");
|
LOG_ERR("OOB channel is disabled");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ESPI_OOB_REGS->TX_STS & MCHP_ESPI_OOB_TX_STS_BUSY) {
|
if (ESPI_OOB_REGS->TX_STS & MCHP_ESPI_OOB_TX_STS_BUSY) {
|
||||||
LOG_WRN("OOB channel is busy\n");
|
LOG_ERR("OOB channel is busy");
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pckt.len > MAX_OOB_BUFFER_SIZE) {
|
if (pckt.len > MAX_OOB_BUFFER_SIZE) {
|
||||||
|
LOG_ERR("insufficient space");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,7 +435,7 @@ static int espi_xec_send_oob(struct device *dev, struct espi_oob_packet pckt)
|
||||||
|
|
||||||
ESPI_OOB_REGS->TX_LEN = pckt.len;
|
ESPI_OOB_REGS->TX_LEN = pckt.len;
|
||||||
ESPI_OOB_REGS->TX_CTRL = MCHP_ESPI_OOB_TX_CTRL_START;
|
ESPI_OOB_REGS->TX_CTRL = MCHP_ESPI_OOB_TX_CTRL_START;
|
||||||
LOG_DBG("%s %d\n", __func__, ESPI_OOB_REGS->TX_LEN);
|
LOG_DBG("%s %d", __func__, ESPI_OOB_REGS->TX_LEN);
|
||||||
|
|
||||||
/* Wait until ISR or timeout */
|
/* Wait until ISR or timeout */
|
||||||
ret = k_sem_take(&data->tx_lock, MAX_OOB_TIMEOUT);
|
ret = k_sem_take(&data->tx_lock, MAX_OOB_TIMEOUT);
|
||||||
|
@ -457,9 +458,6 @@ static int espi_xec_receive_oob(struct device *dev,
|
||||||
MCHP_ESPI_OOB_RX_STS_OVRUN;
|
MCHP_ESPI_OOB_RX_STS_OVRUN;
|
||||||
struct espi_xec_data *data = (struct espi_xec_data *)(dev->driver_data);
|
struct espi_xec_data *data = (struct espi_xec_data *)(dev->driver_data);
|
||||||
|
|
||||||
LOG_DBG("%s\n", __func__);
|
|
||||||
|
|
||||||
|
|
||||||
if (ESPI_OOB_REGS->TX_STS & err_mask) {
|
if (ESPI_OOB_REGS->TX_STS & err_mask) {
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
@ -470,12 +468,15 @@ static int espi_xec_receive_oob(struct device *dev,
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if buffer passed to driver can fit the received packet */
|
/* Check if buffer passed to driver can fit the received buffer */
|
||||||
if (ESPI_OOB_REGS->RX_LEN > pckt.len) {
|
u32_t rcvd_len = ESPI_OOB_REGS->RX_LEN & ESPI_XEC_OOB_RX_LEN_MASK;
|
||||||
|
|
||||||
|
if (rcvd_len > pckt.len) {
|
||||||
|
LOG_ERR("space rcvd %d vs %d", rcvd_len, pckt.len);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
pckt.len = ESPI_OOB_REGS->RX_LEN;
|
pckt.len = rcvd_len;
|
||||||
memcpy(pckt.buf, slave_rx_mem, pckt.len);
|
memcpy(pckt.buf, slave_rx_mem, pckt.len);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue