summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2023-09-23 01:25:37 +0300
committerTom Rini <trini@konsulko.com>2023-09-23 01:25:37 +0300
commit4cb31a9f3560b293670de95e76c1f3cf2f9e1ca8 (patch)
treeb32b0d1da40fb08ad70f564da42b39e9ccec9b77
parentd01a8541d62d78ad76706617e9f8690c8cb01fb8 (diff)
parentff6156f0300d3bf77e9d9091a4f1f6f9112d7278 (diff)
downloadu-boot-4cb31a9f3560b293670de95e76c1f3cf2f9e1ca8.tar.xz
Merge branch '2023-09-22-assorted-bugfixes'
- A few driver fixes and MAINTAINER updates
-rw-r--r--MAINTAINERS5
-rw-r--r--board/technexion/pico-imx7d/MAINTAINERS1
-rw-r--r--configs/am65x_evm_r5_usbmsc_defconfig2
-rw-r--r--drivers/i2c/mtk_i2c.c2
-rw-r--r--drivers/net/sni_netsec.c50
-rw-r--r--net/wget.c10
6 files changed, 57 insertions, 13 deletions
diff --git a/MAINTAINERS b/MAINTAINERS
index 0a10a436bc..281a3f81f7 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -723,7 +723,10 @@ F: drivers/usb/musb-new/ux500.c
F: drivers/video/mcde_simple.c
ARM UNIPHIER
-S: Orphan (Since 2020-09)
+M: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
+R: Dai Okamura <okamura.dai@socionext.com>
+S: Maintained
+F: arch/arm/dts/uniphier-*
F: arch/arm/mach-uniphier/
F: configs/uniphier_*_defconfig
N: uniphier
diff --git a/board/technexion/pico-imx7d/MAINTAINERS b/board/technexion/pico-imx7d/MAINTAINERS
index 325e1735c3..5dccac4d55 100644
--- a/board/technexion/pico-imx7d/MAINTAINERS
+++ b/board/technexion/pico-imx7d/MAINTAINERS
@@ -1,5 +1,4 @@
TechNexion PICO-IMX7D board
-M: Vanessa Maegima <vanessa.maegima@nxp.com>
M: Otavio Salvador <otavio@ossystems.com.br>
S: Maintained
F: board/technexion/pico-imx7d/
diff --git a/configs/am65x_evm_r5_usbmsc_defconfig b/configs/am65x_evm_r5_usbmsc_defconfig
index 8da49c78c8..733a1c1874 100644
--- a/configs/am65x_evm_r5_usbmsc_defconfig
+++ b/configs/am65x_evm_r5_usbmsc_defconfig
@@ -85,6 +85,7 @@ CONFIG_SYS_I2C_OMAP24XX=y
CONFIG_DM_MAILBOX=y
CONFIG_K3_SEC_PROXY=y
CONFIG_MISC=y
+CONFIG_SPL_MISC=y
CONFIG_K3_AVS0=y
# CONFIG_MMC is not set
CONFIG_PHY=y
@@ -122,6 +123,7 @@ CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GENERIC=y
+CONFIG_SPL_USB_DWC3_GENERIC=y
CONFIG_USB_STORAGE=y
CONFIG_SPL_USB_STORAGE=y
CONFIG_USB_GADGET=y
diff --git a/drivers/i2c/mtk_i2c.c b/drivers/i2c/mtk_i2c.c
index 2f331d3216..5592fe9181 100644
--- a/drivers/i2c/mtk_i2c.c
+++ b/drivers/i2c/mtk_i2c.c
@@ -621,7 +621,7 @@ static int mtk_i2c_do_transfer(struct mtk_i2c_priv *priv,
i2c_writel(priv, REG_INTR_MASK, ~(restart_flag | I2C_HS_NACKERR |
I2C_ACKERR | I2C_TRANSAC_COMP));
- if (!tmo && trans_error != 0) {
+ if (tmo || trans_error != 0) {
if (tmo) {
ret = -ETIMEDOUT;
if (!priv->filter_msg)
diff --git a/drivers/net/sni_netsec.c b/drivers/net/sni_netsec.c
index 9780f2092b..71afe78fd2 100644
--- a/drivers/net/sni_netsec.c
+++ b/drivers/net/sni_netsec.c
@@ -286,6 +286,8 @@ struct netsec_rx_pkt_info {
bool err_flag;
};
+static int netsec_reset_hardware(struct netsec_priv *priv, bool load_ucode);
+
static void netsec_write_reg(struct netsec_priv *priv, u32 reg_addr, u32 val)
{
writel(val, priv->ioaddr + reg_addr);
@@ -532,18 +534,11 @@ static int netsec_mac_update_to_phy_state(struct netsec_priv *priv)
return 0;
}
-static int netsec_start_gmac(struct netsec_priv *priv)
+static int netsec_reset_gmac(struct netsec_priv *priv)
{
u32 value = 0;
int ret;
- if (priv->max_speed != SPEED_1000)
- value = (NETSEC_GMAC_MCR_REG_CST |
- NETSEC_GMAC_MCR_REG_HALF_DUPLEX_COMMON);
-
- if (netsec_set_mac_reg(priv, GMAC_REG_MCR, value))
- return -ETIMEDOUT;
-
if (netsec_set_mac_reg(priv, GMAC_REG_BMR,
NETSEC_GMAC_BMR_REG_RESET))
return -ETIMEDOUT;
@@ -558,10 +553,47 @@ static int netsec_start_gmac(struct netsec_priv *priv)
if (value & NETSEC_GMAC_BMR_REG_SWR)
return -EAGAIN;
+ /**
+ * NETSEC GMAC sometimes shows the peculiar behaviour where
+ * MAC_REG_DESC_SOFT_RST never been cleared, resulting in the loss of
+ * sending packets.
+ *
+ * Workaround:
+ * Restart NETSEC and PHY, retry again.
+ */
netsec_write_reg(priv, MAC_REG_DESC_SOFT_RST, 1);
- if (netsec_wait_while_busy(priv, MAC_REG_DESC_SOFT_RST, 1))
+ udelay(1000);
+ if (netsec_read_reg(priv, MAC_REG_DESC_SOFT_RST)) {
+ phy_shutdown(priv->phydev);
+ netsec_reset_hardware(priv, false);
+ phy_startup(priv->phydev);
+ return -EAGAIN;
+ }
+ return 0;
+}
+
+static int netsec_start_gmac(struct netsec_priv *priv)
+{
+ u32 value = 0;
+ u32 failure = 0;
+ int ret;
+
+ if (priv->max_speed != SPEED_1000)
+ value = (NETSEC_GMAC_MCR_REG_CST |
+ NETSEC_GMAC_MCR_REG_HALF_DUPLEX_COMMON);
+
+ if (netsec_set_mac_reg(priv, GMAC_REG_MCR, value))
return -ETIMEDOUT;
+ /* Reset GMAC */
+ while ((ret = netsec_reset_gmac(priv)) == -EAGAIN && ++failure < 3)
+ ;
+
+ if (ret) {
+ pr_err("%s: failed to reset gmac(err=%d).\n", __func__, ret);
+ return ret;
+ }
+
netsec_write_reg(priv, MAC_REG_DESC_INIT, 1);
if (netsec_wait_while_busy(priv, MAC_REG_DESC_INIT, 1))
return -ETIMEDOUT;
diff --git a/net/wget.c b/net/wget.c
index 2dbfeb1a1d..8bb4d72db1 100644
--- a/net/wget.c
+++ b/net/wget.c
@@ -35,7 +35,8 @@ struct pkt_qd {
* The actual packet bufers are in the kernel space, and are
* expected to be overwritten by the downloaded image.
*/
-static struct pkt_qd pkt_q[PKTBUFSRX / 4];
+#define PKTQ_SZ (PKTBUFSRX / 4)
+static struct pkt_qd pkt_q[PKTQ_SZ];
static int pkt_q_idx;
static unsigned long content_length;
static unsigned int packets;
@@ -202,6 +203,13 @@ static void wget_connected(uchar *pkt, unsigned int tcp_seq_num,
pkt_q[pkt_q_idx].tcp_seq_num = tcp_seq_num;
pkt_q[pkt_q_idx].len = len;
pkt_q_idx++;
+
+ if (pkt_q_idx >= PKTQ_SZ) {
+ printf("wget: Fatal error, queue overrun!\n");
+ net_set_state(NETLOOP_FAIL);
+
+ return;
+ }
} else {
debug_cond(DEBUG_WGET, "wget: Connected HTTP Header %p\n", pkt);
/* sizeof(http_eom) - 1 is the string length of (http_eom) */