From 35efc0f34b56ca9d5fb5d080d5de0833ded7e3b8 Mon Sep 17 00:00:00 2001 From: Anji J Date: Tue, 21 Jun 2016 13:25:12 +0530 Subject: [PATCH 66/93] armv8:pfe Enable UDP checksum for proper tftp operation 1. Add CONFIG_UDP_CHECKSUM flag to perform UDP checksum in S/W instead of hardware 2. Rx descriptor model changed back to original removed strobe mode 3. Send more than one dummy packets to bring HIF BD to idle state Signed-off-by: Anji J --- common/cmd_pfe_commands.c | 12 +++++++----- drivers/net/pfe_eth/pfe_driver.c | 19 +++---------------- include/configs/ls1012a_common.h | 1 + 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/common/cmd_pfe_commands.c b/common/cmd_pfe_commands.c index 92917e0..3575ad4 100644 --- a/common/cmd_pfe_commands.c +++ b/common/cmd_pfe_commands.c @@ -929,7 +929,7 @@ static void send_dummy_pkt_to_hif(void) static void pfe_command_stop(int argc, char * const argv[]) { - int id; + int id, hif_stop_loop = 10; u32 rx_status; printf("Stopping PFE... \n"); @@ -937,10 +937,12 @@ static void pfe_command_stop(int argc, char * const argv[]) hif_rx_desc_disable(); /*If HIF Rx BDP is busy send a dummy packet */ - rx_status = readl(HIF_RX_STATUS); - if(rx_status & BDP_CSR_RX_DMA_ACTV) - send_dummy_pkt_to_hif(); - udelay(10); + do { + rx_status = readl(HIF_RX_STATUS); + if (rx_status & BDP_CSR_RX_DMA_ACTV) + send_dummy_pkt_to_hif(); + udelay(10); + } while (hif_stop_loop--); if(readl(HIF_RX_STATUS) & BDP_CSR_RX_DMA_ACTV) printf("Unable to stop HIF\n"); diff --git a/drivers/net/pfe_eth/pfe_driver.c b/drivers/net/pfe_eth/pfe_driver.c index e252fcf..6774fb4 100644 --- a/drivers/net/pfe_eth/pfe_driver.c +++ b/drivers/net/pfe_eth/pfe_driver.c @@ -37,13 +37,8 @@ int pfe_recv(unsigned int *pkt_ptr, int *phy_port) bd = rx_desc->rxBase + rx_desc->rxToRead; - if (bd->ctrl & BD_CTRL_DESC_EN) { - if(!(readl(HIF_RX_STATUS) & BDP_CSR_RX_DMA_ACTV)){ - /*If BDP is not active give write strobe */ - writel((readl(HIF_RX_CTRL) | HIF_CTRL_BDP_CH_START_WSTB), HIF_RX_CTRL); - } + if (bd->ctrl & BD_CTRL_DESC_EN) return len; //No pending Rx packet - } /* this len include hif_header(8bytes) */ len = bd->ctrl & 0xFFFF; @@ -72,15 +67,10 @@ int pfe_recv(unsigned int *pkt_ptr, int *phy_port) *phy_port = hif_header->port_no; len -= sizeof(struct hif_header_s); -#if defined(PFE_LS1012A_RESET_WA) - /* reset bd control field */ - ctrl = (MAX_FRAME_SIZE | BD_CTRL_LAST_BD | BD_CTRL_LIFM | BD_CTRL_DESC_EN | BD_CTRL_DIR); -#else /* reset bd control field */ ctrl = (MAX_FRAME_SIZE | BD_CTRL_LIFM | BD_CTRL_DESC_EN | BD_CTRL_DIR); - /* If we use BD_CTRL_LAST_BD, rxToRead never changes */ rx_desc->rxToRead = (rx_desc->rxToRead + 1) & (rx_desc->rxRingSize - 1); -#endif + bd->ctrl = ctrl; bd->status = 0; @@ -363,11 +353,8 @@ static int hif_rx_desc_init(struct pfe *pfe) memset(bd_va, 0, sizeof(struct bufDesc) * rx_desc->rxRingSize); -#if defined(PFE_LS1012A_RESET_WA) - ctrl = (MAX_FRAME_SIZE | BD_CTRL_LAST_BD | BD_CTRL_DESC_EN | BD_CTRL_DIR | BD_CTRL_LIFM); -#else ctrl = (MAX_FRAME_SIZE | BD_CTRL_DESC_EN | BD_CTRL_DIR | BD_CTRL_LIFM); -#endif + for (i=0; i < rx_desc->rxRingSize; i++) { bd_va->next = (unsigned long)(bd_pa + 1); bd_va->ctrl = ctrl; diff --git a/include/configs/ls1012a_common.h b/include/configs/ls1012a_common.h index 4c7c697..47b8ec3 100644 --- a/include/configs/ls1012a_common.h +++ b/include/configs/ls1012a_common.h @@ -116,6 +116,7 @@ #ifdef CONFIG_FSL_PPFE #define CONFIG_CMD_PFE_COMMANDS #define CONFIG_UTIL_PE_DISABLED +#define CONFIG_UDP_CHECKSUM #endif -- 1.7.9.5