Skip to content

Commit

Permalink
fix that restart interface in case of error (DEBUG LOG TO BE REMOVED)
Browse files Browse the repository at this point in the history
  • Loading branch information
maidnl committed Jul 5, 2024
1 parent f1c8d7a commit 7204508
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 6 deletions.
27 changes: 27 additions & 0 deletions connectivity/drivers/emac/TARGET_STM/stm32xx_emac.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,33 @@ bool STM32_EMAC::low_level_init_successful()
}
#endif // ETH_IP_VERSION_V2

/**
* This function get the state of emac interface
*/
int STM32_EMAC::get_interface_status() {
return HAL_ETH_GetStateOnly(&EthHandle);
}

/**
* This function returns true if the status of the interface is in the
* correct state for the trasmission
*/
bool STM32_EMAC::is_ready_to_tx() {
return (HAL_ETH_GetStateOnly(&EthHandle) == HAL_ETH_STATE_READY);
}

/**
* This function reset the emac interface in case the status is in error
* Apparently there was not anything to recover from an error state
*/
void STM32_EMAC::restart() {
if(HAL_ETH_STATE_ERROR == HAL_ETH_GetStateOnly(&EthHandle)){
HAL_ETH_Stop(&EthHandle);
HAL_ETH_Start(&EthHandle);
}
}


/**
* This function should do the actual transmission of the packet. The packet is
* contained in the memory buffer chain that is passed to the function.
Expand Down
7 changes: 7 additions & 0 deletions connectivity/drivers/emac/TARGET_STM/stm32xx_emac.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,13 @@ class STM32_EMAC : public EMAC {
*/
virtual void set_memory_manager(EMACMemoryManager &mem_mngr);

/* return the status of the interface as integer */
int get_interface_status() override;
/* return true if the interface is in the correct state to transmit */
bool is_ready_to_tx() override;
/* restart only if the interface is in error state */
void restart() override;

// Called from driver functions
ETH_HandleTypeDef EthHandle;
osThreadId_t thread; /**< Processing thread */
Expand Down
4 changes: 0 additions & 4 deletions connectivity/lwipstack/source/LWIPInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,6 @@ nsapi_error_t LWIP::Interface::set_dhcp()
}

err_t err = dhcp_start(&netif);
dhcp_has_to_be_set = false;
if (err) {
connected = NSAPI_STATUS_DISCONNECTED;
if (client_callback) {
Expand Down Expand Up @@ -204,9 +203,6 @@ void LWIP::Interface::netif_link_irq(struct netif *netif)
netif_set_down(&interface->netif);
}
} else {
if(interface->dhcp_started) {
interface->dhcp_has_to_be_set = true;
}
osSemaphoreRelease(interface->unlinked);
if (netif_is_up(&interface->netif)) {
interface->connected = NSAPI_STATUS_CONNECTING;
Expand Down
17 changes: 15 additions & 2 deletions connectivity/lwipstack/source/LWIPInterfaceEMAC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,28 @@

#if LWIP_ETHERNET

extern "C" void log_add(const char *fmt, ...);

err_t LWIP::Interface::emac_low_level_output(struct netif *netif, struct pbuf *p)
{
bool ret = false;
/* Increase reference counter since lwip stores handle to pbuf and frees
it after output */
pbuf_ref(p);

LWIP::Interface *mbed_if = static_cast<LWIP::Interface *>(netif->state);
bool ret = mbed_if->emac->link_out(p);
return ret ? ERR_OK : ERR_IF;

if(mbed_if->emac->is_ready_to_tx()) {
ret = mbed_if->emac->link_out(p);
}
else {
log_add("!!!! emac is NOT OK ---> RESTART!!!");
mbed_if->emac->restart();
ret = mbed_if->emac->link_out(p);
}

err_t rv = ret ? ERR_OK : ERR_IF;
return rv;
}

void LWIP::Interface::emac_input(emac_mem_buf_t *buf)
Expand Down
4 changes: 4 additions & 0 deletions connectivity/netsocket/include/netsocket/EMAC.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,10 @@ class EMAC {
* @param mem_mngr Pointer to memory manager
*/
virtual void set_memory_manager(EMACMemoryManager &mem_mngr) = 0;

virtual bool is_ready_to_tx() { return false;}
virtual void restart() {}
virtual int get_interface_status() { return -1; }
};


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2333,6 +2333,10 @@ HAL_StatusTypeDef HAL_ETH_SetWakeUpFilter(ETH_HandleTypeDef *heth, uint32_t *pFi
* @{
*/

HAL_ETH_StateTypeDef HAL_ETH_GetStateOnly(ETH_HandleTypeDef *heth) {
return heth->gState;
}

/**
* @brief Returns the ETH state.
* @param heth: pointer to a ETH_HandleTypeDef structure that contains
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1654,6 +1654,7 @@ HAL_StatusTypeDef HAL_ETH_SetWakeUpFilter(ETH_HandleTypeDef *heth, uint32_t *pFi
*/
/* Peripheral State functions **************************************************/
HAL_ETH_StateTypeDef HAL_ETH_GetState(ETH_HandleTypeDef *heth);
HAL_ETH_StateTypeDef HAL_ETH_GetStateOnly(ETH_HandleTypeDef *heth);
uint32_t HAL_ETH_GetError(ETH_HandleTypeDef *heth);
uint32_t HAL_ETH_GetDMAError(ETH_HandleTypeDef *heth);
uint32_t HAL_ETH_GetMACError(ETH_HandleTypeDef *heth);
Expand Down

0 comments on commit 7204508

Please sign in to comment.