diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2016-08-20 17:24:08 -0700 |
---|---|---|
committer | Shawn N <shawnn@chromium.org> | 2016-08-21 00:27:56 +0000 |
commit | 152dd753e085a5c91eb74f7e3602c36f6d6bdc1e (patch) | |
tree | 9fdc332593433017d64bc3cc6e4dd7e324768f1b | |
parent | 77ae58a3a32c40d42ac0d66b0ac772c64fb39bf6 (diff) | |
download | chrome-ec-152dd753e085a5c91eb74f7e3602c36f6d6bdc1e.tar.gz |
Revert "shi: Enable SHI interrupt from CS interrupt"
This reverts commit 77ae58a3a32c40d42ac0d66b0ac772c64fb39bf6. Host
command interface still getting wedged.
BUG=chrome-os-partner:55710,chrome-os-partner:55795,chrome-os-partner:56254
BRANCH=None
TEST=None
Change-Id: I2a4d39d222ebfd9aa78cc9f5231c38ebd50e80ce
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/373739
-rw-r--r-- | chip/npcx/shi.c | 63 |
1 files changed, 20 insertions, 43 deletions
diff --git a/chip/npcx/shi.c b/chip/npcx/shi.c index 154bc3a5d7..6cf030cf7c 100644 --- a/chip/npcx/shi.c +++ b/chip/npcx/shi.c @@ -195,15 +195,13 @@ static uint8_t shi_read_buf_pointer(void); */ static void shi_send_response_packet(struct host_packet *pkt) { - /* - * Disable interrupts. This routine is not called from interrupt - * context and buffer underrun will likely occur if it is - * preempted after writing its initial reply byte. Also, we must be - * sure our state doesn't unexpectedly change, in case we're expected - * to take RESP_NOT_RDY actions. - */ - interrupt_disable(); if (state == SHI_STATE_PROCESSING) { + /* + * Disable interrupts. This routine is not called from interrupt + * context and buffer underrun will likely occur if it is + * preempted after writing its initial reply byte. + */ + interrupt_disable(); /* Append our past-end byte, which we reserved space for. */ ((uint8_t *) pkt->response)[pkt->response_size + 0] = @@ -228,6 +226,8 @@ static void shi_send_response_packet(struct host_packet *pkt) #ifdef NPCX_SHI_BYPASS_OVER_256B } #endif + + interrupt_enable(); } /* * If we're not processing, then the AP has already terminated the @@ -239,8 +239,6 @@ static void shi_send_response_packet(struct host_packet *pkt) DEBUG_CPRINTF("END\n"); } else DEBUG_CPRINTS("Unexpected state %d in response handler", state); - - interrupt_enable(); } void shi_handle_host_package(void) @@ -295,6 +293,9 @@ void shi_handle_host_package(void) /* Parse header for version of spi-protocol */ static void shi_parse_header(void) { + /* Disable SHI interrupt until we're sure the size of request package.*/ + task_disable_irq(NPCX_IRQ_SHI); + /* We're now inside a transaction */ state = SHI_STATE_RECEIVING; DEBUG_CPRINTF("RV-"); @@ -329,6 +330,9 @@ static void shi_parse_header(void) /* Computing total bytes need to receive */ shi_params.sz_request = pkt_size; + /* Enable SHI interrupt & handle request package */ + task_enable_irq(NPCX_IRQ_SHI); + shi_handle_host_package(); } else { /* Invalid version number */ @@ -497,6 +501,12 @@ static void shi_bad_received_data(void) CPRINTF("%02x ", in_msg[i]); CPRINTF("]\n"); + /* + * Enable SHI interrupt again since we disable it + * at the begin of SHI_STATE_RECEIVING state + */ + task_enable_irq(NPCX_IRQ_SHI); + /* Reset shi's state machine for error recovery */ shi_reset_prepare(); @@ -549,14 +559,6 @@ void shi_int_handler(void) shi_fill_out_status(EC_SPI_NOT_READY); state = SHI_STATE_CNL_RESP_NOT_RDY; - - /* - * Disable SHI interrupt, it will remain disabled - * until shi_send_response_packet() is called and - * CS is asserted for a new transaction. - */ - task_disable_irq(NPCX_IRQ_SHI); - DEBUG_CPRINTF("CNL-"); return; /* Next transaction but we're not ready */ @@ -682,12 +684,6 @@ void shi_cs_event(enum gpio_signal signal) DEBUG_CPRINTF("CSL-"); - /* - * Enable SHI interrupt - we will either succeed to parse our host - * command or reset on failure from here. - */ - task_enable_irq(NPCX_IRQ_SHI); - /* Read first three bytes to parse which protocol is receiving */ shi_parse_header(); } @@ -703,9 +699,6 @@ static void shi_reset_prepare(void) { uint16_t i; - /* We no longer care about SHI interrupts, so disable them. */ - task_disable_irq(NPCX_IRQ_SHI); - /* Initialize parameters of next transaction */ shi_params.rx_msg = in_msg; shi_params.tx_msg = out_msg; @@ -742,7 +735,6 @@ static void shi_reset_prepare(void) static void shi_enable(void) { int gpio_flags; - int shi_cs_level; shi_reset_prepare(); @@ -762,23 +754,8 @@ static void shi_enable(void) */ SET_BIT(NPCX_DEVALT(ALT_GROUP_C), NPCX_DEVALTC_SHI_SL); - /* - * If CS is already asserted prior to enabling our GPIO interrupt then - * we have missed the falling edge and we need to handle the - * deassertion interrupt - to do so, we'll enable the SHI interrupt - * later. - */ - shi_cs_level = gpio_get_level(GPIO_SHI_CS_L); - /* Enable SHI_CS_L interrupt */ gpio_enable_interrupt(GPIO_SHI_CS_L); - - /* - * Check the CS level again, in case it was asserted after our previous - * check. - */ - if (!shi_cs_level || !gpio_get_level(GPIO_SHI_CS_L)) - task_enable_irq(NPCX_IRQ_SHI); } DECLARE_HOOK(HOOK_CHIPSET_RESUME, shi_enable, HOOK_PRIO_DEFAULT); |