diff for duplicates of <20161111085707.GC16907@hardcore> diff --git a/a/2.txt b/N1/2.txt index 6a48a28..8b13789 100644 --- a/a/2.txt +++ b/N1/2.txt @@ -1,38 +1 @@ ->From 21a158efd0b6c5a08af8f1c1b078bc4b40291bbf Mon Sep 17 00:00:00 2001 -From: Jan Glauber <jglauber@cavium.com> -Date: Fri, 11 Nov 2016 09:17:19 +0100 -Subject: [PATCH 1/3] i2c: octeon: thunderx: TWSI software reset in recovery -I've seen i2c recovery reporting long loops of: - -[ 1035.887818] i2c i2c-4: SCL is stuck low, exit recovery -[ 1037.999748] i2c i2c-4: SCL is stuck low, exit recovery -[ 1040.111694] i2c i2c-4: SCL is stuck low, exit recovery -... - -Add a TWSI software reset which clears the status and -STA,STP,IFLG in SW_TWSI_EOP_TWSI_CTL. - -With this the recovery works fine and above message is not seen. - -Signed-off-by: Jan Glauber <jglauber@cavium.com> ---- - drivers/i2c/busses/i2c-octeon-core.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c -index 419b54b..0b02070 100644 ---- a/drivers/i2c/busses/i2c-octeon-core.c -+++ b/drivers/i2c/busses/i2c-octeon-core.c -@@ -791,6 +791,9 @@ static void octeon_i2c_prepare_recovery(struct i2c_adapter *adap) - struct octeon_i2c *i2c = i2c_get_adapdata(adap); - - octeon_i2c_hlc_disable(i2c); -+ octeon_i2c_reg_write(i2c, SW_TWSI_EOP_TWSI_RST, 0); -+ /* wait for software reset to settle */ -+ udelay(5); - - /* - * Bring control register to a good state regardless --- -1.9.1 diff --git a/a/3.hdr b/a/3.hdr deleted file mode 100644 index fc050d7..0000000 --- a/a/3.hdr +++ /dev/null @@ -1,3 +0,0 @@ -Content-Type: text/x-diff; charset="us-ascii" -Content-Disposition: attachment; - filename="0002-i2c-octeon-thunderx-Remove-polling-after-interrupt.patch" diff --git a/a/3.txt b/a/3.txt deleted file mode 100644 index c395530..0000000 --- a/a/3.txt +++ /dev/null @@ -1,109 +0,0 @@ ->From d904526a298edcf1bfba173b1b71a677eb413677 Mon Sep 17 00:00:00 2001 -From: Jan Glauber <jglauber@cavium.com> -Date: Fri, 11 Nov 2016 09:34:34 +0100 -Subject: [PATCH 2/3] i2c: octeon: thunderx: Remove polling after interrupt - -Remove the polling after the interrupt. In case the IFLG -is not set although the interrupt occured we will run into -a timeout and retry the operation. This should happen very -seldom. - -Note: the default timeout (1s) can be changed via an ioclt -per device. - -Signed-off-by: Jan Glauber <jglauber@cavium.com> ---- - drivers/i2c/busses/i2c-octeon-core.c | 43 ++---------------------------------- - 1 file changed, 2 insertions(+), 41 deletions(-) - -diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c -index 0b02070..1d8775799 100644 ---- a/drivers/i2c/busses/i2c-octeon-core.c -+++ b/drivers/i2c/busses/i2c-octeon-core.c -@@ -36,24 +36,6 @@ static bool octeon_i2c_test_iflg(struct octeon_i2c *i2c) - return (octeon_i2c_ctl_read(i2c) & TWSI_CTL_IFLG); - } - --static bool octeon_i2c_test_ready(struct octeon_i2c *i2c, bool *first) --{ -- if (octeon_i2c_test_iflg(i2c)) -- return true; -- -- if (*first) { -- *first = false; -- return false; -- } -- -- /* -- * IRQ has signaled an event but IFLG hasn't changed. -- * Sleep and retry once. -- */ -- usleep_range(I2C_OCTEON_EVENT_WAIT, 2 * I2C_OCTEON_EVENT_WAIT); -- return octeon_i2c_test_iflg(i2c); --} -- - /** - * octeon_i2c_wait - wait for the IFLG to be set - * @i2c: The struct octeon_i2c -@@ -63,7 +45,6 @@ static bool octeon_i2c_test_ready(struct octeon_i2c *i2c, bool *first) - static int octeon_i2c_wait(struct octeon_i2c *i2c) - { - long time_left; -- bool first = true; - - /* - * Some chip revisions don't assert the irq in the interrupt -@@ -80,7 +61,7 @@ static int octeon_i2c_wait(struct octeon_i2c *i2c) - } - - i2c->int_enable(i2c); -- time_left = wait_event_timeout(i2c->queue, octeon_i2c_test_ready(i2c, &first), -+ time_left = wait_event_timeout(i2c->queue, octeon_i2c_test_iflg(i2c), - i2c->adap.timeout); - i2c->int_disable(i2c); - -@@ -102,25 +83,6 @@ static bool octeon_i2c_hlc_test_valid(struct octeon_i2c *i2c) - return (__raw_readq(i2c->twsi_base + SW_TWSI(i2c)) & SW_TWSI_V) == 0; - } - --static bool octeon_i2c_hlc_test_ready(struct octeon_i2c *i2c, bool *first) --{ -- /* check if valid bit is cleared */ -- if (octeon_i2c_hlc_test_valid(i2c)) -- return true; -- -- if (*first) { -- *first = false; -- return false; -- } -- -- /* -- * IRQ has signaled an event but valid bit isn't cleared. -- * Sleep and retry once. -- */ -- usleep_range(I2C_OCTEON_EVENT_WAIT, 2 * I2C_OCTEON_EVENT_WAIT); -- return octeon_i2c_hlc_test_valid(i2c); --} -- - static void octeon_i2c_hlc_int_clear(struct octeon_i2c *i2c) - { - /* clear ST/TS events, listen for neither */ -@@ -176,7 +138,6 @@ static void octeon_i2c_hlc_disable(struct octeon_i2c *i2c) - */ - static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c) - { -- bool first = true; - int time_left; - - /* -@@ -195,7 +156,7 @@ static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c) - - i2c->hlc_int_enable(i2c); - time_left = wait_event_timeout(i2c->queue, -- octeon_i2c_hlc_test_ready(i2c, &first), -+ octeon_i2c_hlc_test_valid(i2c), - i2c->adap.timeout); - i2c->hlc_int_disable(i2c); - if (!time_left) --- -1.9.1 diff --git a/a/4.hdr b/a/4.hdr deleted file mode 100644 index ddd6fe3..0000000 --- a/a/4.hdr +++ /dev/null @@ -1,3 +0,0 @@ -Content-Type: text/x-diff; charset="us-ascii" -Content-Disposition: attachment; - filename="0003-i2c-octeon-thunderx-Debug-prints-for-timeout-and-rec.patch" diff --git a/a/4.txt b/a/4.txt deleted file mode 100644 index 968b337..0000000 --- a/a/4.txt +++ /dev/null @@ -1,50 +0,0 @@ ->From 45eae05b8d793f5652f77ab1d5faa62c30927a10 Mon Sep 17 00:00:00 2001 -From: Jan Glauber <jglauber@cavium.com> -Date: Fri, 11 Nov 2016 09:40:15 +0100 -Subject: [PATCH 3/3] i2c: octeon: thunderx: Debug prints for timeout and - recovery - -Signed-off-by: Jan Glauber <jglauber@cavium.com> ---- - drivers/i2c/busses/i2c-octeon-core.c | 10 +++++++--- - 1 file changed, 7 insertions(+), 3 deletions(-) - -diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c -index 1d8775799..a2a92b6 100644 ---- a/drivers/i2c/busses/i2c-octeon-core.c -+++ b/drivers/i2c/busses/i2c-octeon-core.c -@@ -72,9 +72,10 @@ static int octeon_i2c_wait(struct octeon_i2c *i2c) - return 0; - } - -- if (!time_left) -+ if (!time_left) { -+ pr_err("%s: timed out\n", __func__); - return -ETIMEDOUT; -- -+ } - return 0; - } - -@@ -169,8 +170,10 @@ static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c) - return 0; - } - -- if (!time_left) -+ if (!time_left) { -+ pr_err("%s: timed out\n", __func__); - return -ETIMEDOUT; -+ } - return 0; - } - -@@ -280,6 +283,7 @@ static int octeon_i2c_start(struct octeon_i2c *i2c) - - error: - /* START failed, try to recover */ -+ pr_err("%s: try to recover from status: %d\n", __func__, stat); - ret = octeon_i2c_recovery(i2c); - return (ret) ? ret : -EAGAIN; - } --- -1.9.1 diff --git a/a/content_digest b/N1/content_digest index b1857b3..b8fdc70 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -6,8 +6,8 @@ "Subject\0Re: [PATCH 2/2] i2c: octeon: Fix waiting for operation completion\0" "Date\0Fri, 11 Nov 2016 09:57:07 +0100\0" "To\0Paul Burton <paul.burton@imgtec.com>\0" - "Cc\0linux-i2c@vger.kernel.org" - linux-mips@linux-mips.org + "Cc\0<linux-i2c@vger.kernel.org>" + <linux-mips@linux-mips.org> David Daney <david.daney@cavium.com> Peter Swain <pswain@cavium.com> Wolfram Sang <wsa@the-dreams.de> @@ -38,208 +38,5 @@ "\01:2\0" "fn\00001-i2c-octeon-thunderx-TWSI-software-reset-in-recovery.patch\0" "b\0" - ">From 21a158efd0b6c5a08af8f1c1b078bc4b40291bbf Mon Sep 17 00:00:00 2001\n" - "From: Jan Glauber <jglauber@cavium.com>\n" - "Date: Fri, 11 Nov 2016 09:17:19 +0100\n" - "Subject: [PATCH 1/3] i2c: octeon: thunderx: TWSI software reset in recovery\n" - "\n" - "I've seen i2c recovery reporting long loops of:\n" - "\n" - "[ 1035.887818] i2c i2c-4: SCL is stuck low, exit recovery\n" - "[ 1037.999748] i2c i2c-4: SCL is stuck low, exit recovery\n" - "[ 1040.111694] i2c i2c-4: SCL is stuck low, exit recovery\n" - "...\n" - "\n" - "Add a TWSI software reset which clears the status and\n" - "STA,STP,IFLG in SW_TWSI_EOP_TWSI_CTL.\n" - "\n" - "With this the recovery works fine and above message is not seen.\n" - "\n" - "Signed-off-by: Jan Glauber <jglauber@cavium.com>\n" - "---\n" - " drivers/i2c/busses/i2c-octeon-core.c | 3 +++\n" - " 1 file changed, 3 insertions(+)\n" - "\n" - "diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c\n" - "index 419b54b..0b02070 100644\n" - "--- a/drivers/i2c/busses/i2c-octeon-core.c\n" - "+++ b/drivers/i2c/busses/i2c-octeon-core.c\n" - "@@ -791,6 +791,9 @@ static void octeon_i2c_prepare_recovery(struct i2c_adapter *adap)\n" - " \tstruct octeon_i2c *i2c = i2c_get_adapdata(adap);\n" - " \n" - " \tocteon_i2c_hlc_disable(i2c);\n" - "+\tocteon_i2c_reg_write(i2c, SW_TWSI_EOP_TWSI_RST, 0);\n" - "+\t/* wait for software reset to settle */\n" - "+\tudelay(5);\n" - " \n" - " \t/*\n" - " \t * Bring control register to a good state regardless\n" - "-- \n" - 1.9.1 - "\01:3\0" - "fn\00002-i2c-octeon-thunderx-Remove-polling-after-interrupt.patch\0" - "b\0" - ">From d904526a298edcf1bfba173b1b71a677eb413677 Mon Sep 17 00:00:00 2001\n" - "From: Jan Glauber <jglauber@cavium.com>\n" - "Date: Fri, 11 Nov 2016 09:34:34 +0100\n" - "Subject: [PATCH 2/3] i2c: octeon: thunderx: Remove polling after interrupt\n" - "\n" - "Remove the polling after the interrupt. In case the IFLG\n" - "is not set although the interrupt occured we will run into\n" - "a timeout and retry the operation. This should happen very\n" - "seldom.\n" - "\n" - "Note: the default timeout (1s) can be changed via an ioclt\n" - "per device.\n" - "\n" - "Signed-off-by: Jan Glauber <jglauber@cavium.com>\n" - "---\n" - " drivers/i2c/busses/i2c-octeon-core.c | 43 ++----------------------------------\n" - " 1 file changed, 2 insertions(+), 41 deletions(-)\n" - "\n" - "diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c\n" - "index 0b02070..1d8775799 100644\n" - "--- a/drivers/i2c/busses/i2c-octeon-core.c\n" - "+++ b/drivers/i2c/busses/i2c-octeon-core.c\n" - "@@ -36,24 +36,6 @@ static bool octeon_i2c_test_iflg(struct octeon_i2c *i2c)\n" - " \treturn (octeon_i2c_ctl_read(i2c) & TWSI_CTL_IFLG);\n" - " }\n" - " \n" - "-static bool octeon_i2c_test_ready(struct octeon_i2c *i2c, bool *first)\n" - "-{\n" - "-\tif (octeon_i2c_test_iflg(i2c))\n" - "-\t\treturn true;\n" - "-\n" - "-\tif (*first) {\n" - "-\t\t*first = false;\n" - "-\t\treturn false;\n" - "-\t}\n" - "-\n" - "-\t/*\n" - "-\t * IRQ has signaled an event but IFLG hasn't changed.\n" - "-\t * Sleep and retry once.\n" - "-\t */\n" - "-\tusleep_range(I2C_OCTEON_EVENT_WAIT, 2 * I2C_OCTEON_EVENT_WAIT);\n" - "-\treturn octeon_i2c_test_iflg(i2c);\n" - "-}\n" - "-\n" - " /**\n" - " * octeon_i2c_wait - wait for the IFLG to be set\n" - " * @i2c: The struct octeon_i2c\n" - "@@ -63,7 +45,6 @@ static bool octeon_i2c_test_ready(struct octeon_i2c *i2c, bool *first)\n" - " static int octeon_i2c_wait(struct octeon_i2c *i2c)\n" - " {\n" - " \tlong time_left;\n" - "-\tbool first = true;\n" - " \n" - " \t/*\n" - " \t * Some chip revisions don't assert the irq in the interrupt\n" - "@@ -80,7 +61,7 @@ static int octeon_i2c_wait(struct octeon_i2c *i2c)\n" - " \t}\n" - " \n" - " \ti2c->int_enable(i2c);\n" - "-\ttime_left = wait_event_timeout(i2c->queue, octeon_i2c_test_ready(i2c, &first),\n" - "+\ttime_left = wait_event_timeout(i2c->queue, octeon_i2c_test_iflg(i2c),\n" - " \t\t\t\t i2c->adap.timeout);\n" - " \ti2c->int_disable(i2c);\n" - " \n" - "@@ -102,25 +83,6 @@ static bool octeon_i2c_hlc_test_valid(struct octeon_i2c *i2c)\n" - " \treturn (__raw_readq(i2c->twsi_base + SW_TWSI(i2c)) & SW_TWSI_V) == 0;\n" - " }\n" - " \n" - "-static bool octeon_i2c_hlc_test_ready(struct octeon_i2c *i2c, bool *first)\n" - "-{\n" - "-\t/* check if valid bit is cleared */\n" - "-\tif (octeon_i2c_hlc_test_valid(i2c))\n" - "-\t\treturn true;\n" - "-\n" - "-\tif (*first) {\n" - "-\t\t*first = false;\n" - "-\t\treturn false;\n" - "-\t}\n" - "-\n" - "-\t/*\n" - "-\t * IRQ has signaled an event but valid bit isn't cleared.\n" - "-\t * Sleep and retry once.\n" - "-\t */\n" - "-\tusleep_range(I2C_OCTEON_EVENT_WAIT, 2 * I2C_OCTEON_EVENT_WAIT);\n" - "-\treturn octeon_i2c_hlc_test_valid(i2c);\n" - "-}\n" - "-\n" - " static void octeon_i2c_hlc_int_clear(struct octeon_i2c *i2c)\n" - " {\n" - " \t/* clear ST/TS events, listen for neither */\n" - "@@ -176,7 +138,6 @@ static void octeon_i2c_hlc_disable(struct octeon_i2c *i2c)\n" - " */\n" - " static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c)\n" - " {\n" - "-\tbool first = true;\n" - " \tint time_left;\n" - " \n" - " \t/*\n" - "@@ -195,7 +156,7 @@ static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c)\n" - " \n" - " \ti2c->hlc_int_enable(i2c);\n" - " \ttime_left = wait_event_timeout(i2c->queue,\n" - "-\t\t\t\t octeon_i2c_hlc_test_ready(i2c, &first),\n" - "+\t\t\t\t octeon_i2c_hlc_test_valid(i2c),\n" - " \t\t\t\t i2c->adap.timeout);\n" - " \ti2c->hlc_int_disable(i2c);\n" - " \tif (!time_left)\n" - "-- \n" - 1.9.1 - "\01:4\0" - "fn\00003-i2c-octeon-thunderx-Debug-prints-for-timeout-and-rec.patch\0" - "b\0" - ">From 45eae05b8d793f5652f77ab1d5faa62c30927a10 Mon Sep 17 00:00:00 2001\n" - "From: Jan Glauber <jglauber@cavium.com>\n" - "Date: Fri, 11 Nov 2016 09:40:15 +0100\n" - "Subject: [PATCH 3/3] i2c: octeon: thunderx: Debug prints for timeout and\n" - " recovery\n" - "\n" - "Signed-off-by: Jan Glauber <jglauber@cavium.com>\n" - "---\n" - " drivers/i2c/busses/i2c-octeon-core.c | 10 +++++++---\n" - " 1 file changed, 7 insertions(+), 3 deletions(-)\n" - "\n" - "diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c\n" - "index 1d8775799..a2a92b6 100644\n" - "--- a/drivers/i2c/busses/i2c-octeon-core.c\n" - "+++ b/drivers/i2c/busses/i2c-octeon-core.c\n" - "@@ -72,9 +72,10 @@ static int octeon_i2c_wait(struct octeon_i2c *i2c)\n" - " \t\treturn 0;\n" - " \t}\n" - " \n" - "-\tif (!time_left)\n" - "+\tif (!time_left) {\n" - "+\t\tpr_err(\"%s: timed out\\n\", __func__);\n" - " \t\treturn -ETIMEDOUT;\n" - "-\n" - "+\t}\n" - " \treturn 0;\n" - " }\n" - " \n" - "@@ -169,8 +170,10 @@ static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c)\n" - " \t\treturn 0;\n" - " \t}\n" - " \n" - "-\tif (!time_left)\n" - "+\tif (!time_left) {\n" - "+\t\tpr_err(\"%s: timed out\\n\", __func__);\n" - " \t\treturn -ETIMEDOUT;\n" - "+\t}\n" - " \treturn 0;\n" - " }\n" - " \n" - "@@ -280,6 +283,7 @@ static int octeon_i2c_start(struct octeon_i2c *i2c)\n" - " \n" - " error:\n" - " \t/* START failed, try to recover */\n" - "+\tpr_err(\"%s: try to recover from status: %d\\n\", __func__, stat);\n" - " \tret = octeon_i2c_recovery(i2c);\n" - " \treturn (ret) ? ret : -EAGAIN;\n" - " }\n" - "-- \n" - 1.9.1 -4741b4c185cc0fd3310be07e6df9b36b5b7050ffcb2c75cdee35b35793476bf7 +cef949e0d86af6603a7fad03d274b354a326370871916e78e0668ee0821c60db
diff --git a/a/2.txt b/N2/2.txt index 6a48a28..8b13789 100644 --- a/a/2.txt +++ b/N2/2.txt @@ -1,38 +1 @@ ->From 21a158efd0b6c5a08af8f1c1b078bc4b40291bbf Mon Sep 17 00:00:00 2001 -From: Jan Glauber <jglauber@cavium.com> -Date: Fri, 11 Nov 2016 09:17:19 +0100 -Subject: [PATCH 1/3] i2c: octeon: thunderx: TWSI software reset in recovery -I've seen i2c recovery reporting long loops of: - -[ 1035.887818] i2c i2c-4: SCL is stuck low, exit recovery -[ 1037.999748] i2c i2c-4: SCL is stuck low, exit recovery -[ 1040.111694] i2c i2c-4: SCL is stuck low, exit recovery -... - -Add a TWSI software reset which clears the status and -STA,STP,IFLG in SW_TWSI_EOP_TWSI_CTL. - -With this the recovery works fine and above message is not seen. - -Signed-off-by: Jan Glauber <jglauber@cavium.com> ---- - drivers/i2c/busses/i2c-octeon-core.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c -index 419b54b..0b02070 100644 ---- a/drivers/i2c/busses/i2c-octeon-core.c -+++ b/drivers/i2c/busses/i2c-octeon-core.c -@@ -791,6 +791,9 @@ static void octeon_i2c_prepare_recovery(struct i2c_adapter *adap) - struct octeon_i2c *i2c = i2c_get_adapdata(adap); - - octeon_i2c_hlc_disable(i2c); -+ octeon_i2c_reg_write(i2c, SW_TWSI_EOP_TWSI_RST, 0); -+ /* wait for software reset to settle */ -+ udelay(5); - - /* - * Bring control register to a good state regardless --- -1.9.1 diff --git a/a/3.hdr b/a/3.hdr deleted file mode 100644 index fc050d7..0000000 --- a/a/3.hdr +++ /dev/null @@ -1,3 +0,0 @@ -Content-Type: text/x-diff; charset="us-ascii" -Content-Disposition: attachment; - filename="0002-i2c-octeon-thunderx-Remove-polling-after-interrupt.patch" diff --git a/a/3.txt b/a/3.txt deleted file mode 100644 index c395530..0000000 --- a/a/3.txt +++ /dev/null @@ -1,109 +0,0 @@ ->From d904526a298edcf1bfba173b1b71a677eb413677 Mon Sep 17 00:00:00 2001 -From: Jan Glauber <jglauber@cavium.com> -Date: Fri, 11 Nov 2016 09:34:34 +0100 -Subject: [PATCH 2/3] i2c: octeon: thunderx: Remove polling after interrupt - -Remove the polling after the interrupt. In case the IFLG -is not set although the interrupt occured we will run into -a timeout and retry the operation. This should happen very -seldom. - -Note: the default timeout (1s) can be changed via an ioclt -per device. - -Signed-off-by: Jan Glauber <jglauber@cavium.com> ---- - drivers/i2c/busses/i2c-octeon-core.c | 43 ++---------------------------------- - 1 file changed, 2 insertions(+), 41 deletions(-) - -diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c -index 0b02070..1d8775799 100644 ---- a/drivers/i2c/busses/i2c-octeon-core.c -+++ b/drivers/i2c/busses/i2c-octeon-core.c -@@ -36,24 +36,6 @@ static bool octeon_i2c_test_iflg(struct octeon_i2c *i2c) - return (octeon_i2c_ctl_read(i2c) & TWSI_CTL_IFLG); - } - --static bool octeon_i2c_test_ready(struct octeon_i2c *i2c, bool *first) --{ -- if (octeon_i2c_test_iflg(i2c)) -- return true; -- -- if (*first) { -- *first = false; -- return false; -- } -- -- /* -- * IRQ has signaled an event but IFLG hasn't changed. -- * Sleep and retry once. -- */ -- usleep_range(I2C_OCTEON_EVENT_WAIT, 2 * I2C_OCTEON_EVENT_WAIT); -- return octeon_i2c_test_iflg(i2c); --} -- - /** - * octeon_i2c_wait - wait for the IFLG to be set - * @i2c: The struct octeon_i2c -@@ -63,7 +45,6 @@ static bool octeon_i2c_test_ready(struct octeon_i2c *i2c, bool *first) - static int octeon_i2c_wait(struct octeon_i2c *i2c) - { - long time_left; -- bool first = true; - - /* - * Some chip revisions don't assert the irq in the interrupt -@@ -80,7 +61,7 @@ static int octeon_i2c_wait(struct octeon_i2c *i2c) - } - - i2c->int_enable(i2c); -- time_left = wait_event_timeout(i2c->queue, octeon_i2c_test_ready(i2c, &first), -+ time_left = wait_event_timeout(i2c->queue, octeon_i2c_test_iflg(i2c), - i2c->adap.timeout); - i2c->int_disable(i2c); - -@@ -102,25 +83,6 @@ static bool octeon_i2c_hlc_test_valid(struct octeon_i2c *i2c) - return (__raw_readq(i2c->twsi_base + SW_TWSI(i2c)) & SW_TWSI_V) == 0; - } - --static bool octeon_i2c_hlc_test_ready(struct octeon_i2c *i2c, bool *first) --{ -- /* check if valid bit is cleared */ -- if (octeon_i2c_hlc_test_valid(i2c)) -- return true; -- -- if (*first) { -- *first = false; -- return false; -- } -- -- /* -- * IRQ has signaled an event but valid bit isn't cleared. -- * Sleep and retry once. -- */ -- usleep_range(I2C_OCTEON_EVENT_WAIT, 2 * I2C_OCTEON_EVENT_WAIT); -- return octeon_i2c_hlc_test_valid(i2c); --} -- - static void octeon_i2c_hlc_int_clear(struct octeon_i2c *i2c) - { - /* clear ST/TS events, listen for neither */ -@@ -176,7 +138,6 @@ static void octeon_i2c_hlc_disable(struct octeon_i2c *i2c) - */ - static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c) - { -- bool first = true; - int time_left; - - /* -@@ -195,7 +156,7 @@ static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c) - - i2c->hlc_int_enable(i2c); - time_left = wait_event_timeout(i2c->queue, -- octeon_i2c_hlc_test_ready(i2c, &first), -+ octeon_i2c_hlc_test_valid(i2c), - i2c->adap.timeout); - i2c->hlc_int_disable(i2c); - if (!time_left) --- -1.9.1 diff --git a/a/4.hdr b/a/4.hdr deleted file mode 100644 index ddd6fe3..0000000 --- a/a/4.hdr +++ /dev/null @@ -1,3 +0,0 @@ -Content-Type: text/x-diff; charset="us-ascii" -Content-Disposition: attachment; - filename="0003-i2c-octeon-thunderx-Debug-prints-for-timeout-and-rec.patch" diff --git a/a/4.txt b/a/4.txt deleted file mode 100644 index 968b337..0000000 --- a/a/4.txt +++ /dev/null @@ -1,50 +0,0 @@ ->From 45eae05b8d793f5652f77ab1d5faa62c30927a10 Mon Sep 17 00:00:00 2001 -From: Jan Glauber <jglauber@cavium.com> -Date: Fri, 11 Nov 2016 09:40:15 +0100 -Subject: [PATCH 3/3] i2c: octeon: thunderx: Debug prints for timeout and - recovery - -Signed-off-by: Jan Glauber <jglauber@cavium.com> ---- - drivers/i2c/busses/i2c-octeon-core.c | 10 +++++++--- - 1 file changed, 7 insertions(+), 3 deletions(-) - -diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c -index 1d8775799..a2a92b6 100644 ---- a/drivers/i2c/busses/i2c-octeon-core.c -+++ b/drivers/i2c/busses/i2c-octeon-core.c -@@ -72,9 +72,10 @@ static int octeon_i2c_wait(struct octeon_i2c *i2c) - return 0; - } - -- if (!time_left) -+ if (!time_left) { -+ pr_err("%s: timed out\n", __func__); - return -ETIMEDOUT; -- -+ } - return 0; - } - -@@ -169,8 +170,10 @@ static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c) - return 0; - } - -- if (!time_left) -+ if (!time_left) { -+ pr_err("%s: timed out\n", __func__); - return -ETIMEDOUT; -+ } - return 0; - } - -@@ -280,6 +283,7 @@ static int octeon_i2c_start(struct octeon_i2c *i2c) - - error: - /* START failed, try to recover */ -+ pr_err("%s: try to recover from status: %d\n", __func__, stat); - ret = octeon_i2c_recovery(i2c); - return (ret) ? ret : -EAGAIN; - } --- -1.9.1 diff --git a/a/content_digest b/N2/content_digest index b1857b3..96bdc46 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -38,208 +38,5 @@ "\01:2\0" "fn\00001-i2c-octeon-thunderx-TWSI-software-reset-in-recovery.patch\0" "b\0" - ">From 21a158efd0b6c5a08af8f1c1b078bc4b40291bbf Mon Sep 17 00:00:00 2001\n" - "From: Jan Glauber <jglauber@cavium.com>\n" - "Date: Fri, 11 Nov 2016 09:17:19 +0100\n" - "Subject: [PATCH 1/3] i2c: octeon: thunderx: TWSI software reset in recovery\n" - "\n" - "I've seen i2c recovery reporting long loops of:\n" - "\n" - "[ 1035.887818] i2c i2c-4: SCL is stuck low, exit recovery\n" - "[ 1037.999748] i2c i2c-4: SCL is stuck low, exit recovery\n" - "[ 1040.111694] i2c i2c-4: SCL is stuck low, exit recovery\n" - "...\n" - "\n" - "Add a TWSI software reset which clears the status and\n" - "STA,STP,IFLG in SW_TWSI_EOP_TWSI_CTL.\n" - "\n" - "With this the recovery works fine and above message is not seen.\n" - "\n" - "Signed-off-by: Jan Glauber <jglauber@cavium.com>\n" - "---\n" - " drivers/i2c/busses/i2c-octeon-core.c | 3 +++\n" - " 1 file changed, 3 insertions(+)\n" - "\n" - "diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c\n" - "index 419b54b..0b02070 100644\n" - "--- a/drivers/i2c/busses/i2c-octeon-core.c\n" - "+++ b/drivers/i2c/busses/i2c-octeon-core.c\n" - "@@ -791,6 +791,9 @@ static void octeon_i2c_prepare_recovery(struct i2c_adapter *adap)\n" - " \tstruct octeon_i2c *i2c = i2c_get_adapdata(adap);\n" - " \n" - " \tocteon_i2c_hlc_disable(i2c);\n" - "+\tocteon_i2c_reg_write(i2c, SW_TWSI_EOP_TWSI_RST, 0);\n" - "+\t/* wait for software reset to settle */\n" - "+\tudelay(5);\n" - " \n" - " \t/*\n" - " \t * Bring control register to a good state regardless\n" - "-- \n" - 1.9.1 - "\01:3\0" - "fn\00002-i2c-octeon-thunderx-Remove-polling-after-interrupt.patch\0" - "b\0" - ">From d904526a298edcf1bfba173b1b71a677eb413677 Mon Sep 17 00:00:00 2001\n" - "From: Jan Glauber <jglauber@cavium.com>\n" - "Date: Fri, 11 Nov 2016 09:34:34 +0100\n" - "Subject: [PATCH 2/3] i2c: octeon: thunderx: Remove polling after interrupt\n" - "\n" - "Remove the polling after the interrupt. In case the IFLG\n" - "is not set although the interrupt occured we will run into\n" - "a timeout and retry the operation. This should happen very\n" - "seldom.\n" - "\n" - "Note: the default timeout (1s) can be changed via an ioclt\n" - "per device.\n" - "\n" - "Signed-off-by: Jan Glauber <jglauber@cavium.com>\n" - "---\n" - " drivers/i2c/busses/i2c-octeon-core.c | 43 ++----------------------------------\n" - " 1 file changed, 2 insertions(+), 41 deletions(-)\n" - "\n" - "diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c\n" - "index 0b02070..1d8775799 100644\n" - "--- a/drivers/i2c/busses/i2c-octeon-core.c\n" - "+++ b/drivers/i2c/busses/i2c-octeon-core.c\n" - "@@ -36,24 +36,6 @@ static bool octeon_i2c_test_iflg(struct octeon_i2c *i2c)\n" - " \treturn (octeon_i2c_ctl_read(i2c) & TWSI_CTL_IFLG);\n" - " }\n" - " \n" - "-static bool octeon_i2c_test_ready(struct octeon_i2c *i2c, bool *first)\n" - "-{\n" - "-\tif (octeon_i2c_test_iflg(i2c))\n" - "-\t\treturn true;\n" - "-\n" - "-\tif (*first) {\n" - "-\t\t*first = false;\n" - "-\t\treturn false;\n" - "-\t}\n" - "-\n" - "-\t/*\n" - "-\t * IRQ has signaled an event but IFLG hasn't changed.\n" - "-\t * Sleep and retry once.\n" - "-\t */\n" - "-\tusleep_range(I2C_OCTEON_EVENT_WAIT, 2 * I2C_OCTEON_EVENT_WAIT);\n" - "-\treturn octeon_i2c_test_iflg(i2c);\n" - "-}\n" - "-\n" - " /**\n" - " * octeon_i2c_wait - wait for the IFLG to be set\n" - " * @i2c: The struct octeon_i2c\n" - "@@ -63,7 +45,6 @@ static bool octeon_i2c_test_ready(struct octeon_i2c *i2c, bool *first)\n" - " static int octeon_i2c_wait(struct octeon_i2c *i2c)\n" - " {\n" - " \tlong time_left;\n" - "-\tbool first = true;\n" - " \n" - " \t/*\n" - " \t * Some chip revisions don't assert the irq in the interrupt\n" - "@@ -80,7 +61,7 @@ static int octeon_i2c_wait(struct octeon_i2c *i2c)\n" - " \t}\n" - " \n" - " \ti2c->int_enable(i2c);\n" - "-\ttime_left = wait_event_timeout(i2c->queue, octeon_i2c_test_ready(i2c, &first),\n" - "+\ttime_left = wait_event_timeout(i2c->queue, octeon_i2c_test_iflg(i2c),\n" - " \t\t\t\t i2c->adap.timeout);\n" - " \ti2c->int_disable(i2c);\n" - " \n" - "@@ -102,25 +83,6 @@ static bool octeon_i2c_hlc_test_valid(struct octeon_i2c *i2c)\n" - " \treturn (__raw_readq(i2c->twsi_base + SW_TWSI(i2c)) & SW_TWSI_V) == 0;\n" - " }\n" - " \n" - "-static bool octeon_i2c_hlc_test_ready(struct octeon_i2c *i2c, bool *first)\n" - "-{\n" - "-\t/* check if valid bit is cleared */\n" - "-\tif (octeon_i2c_hlc_test_valid(i2c))\n" - "-\t\treturn true;\n" - "-\n" - "-\tif (*first) {\n" - "-\t\t*first = false;\n" - "-\t\treturn false;\n" - "-\t}\n" - "-\n" - "-\t/*\n" - "-\t * IRQ has signaled an event but valid bit isn't cleared.\n" - "-\t * Sleep and retry once.\n" - "-\t */\n" - "-\tusleep_range(I2C_OCTEON_EVENT_WAIT, 2 * I2C_OCTEON_EVENT_WAIT);\n" - "-\treturn octeon_i2c_hlc_test_valid(i2c);\n" - "-}\n" - "-\n" - " static void octeon_i2c_hlc_int_clear(struct octeon_i2c *i2c)\n" - " {\n" - " \t/* clear ST/TS events, listen for neither */\n" - "@@ -176,7 +138,6 @@ static void octeon_i2c_hlc_disable(struct octeon_i2c *i2c)\n" - " */\n" - " static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c)\n" - " {\n" - "-\tbool first = true;\n" - " \tint time_left;\n" - " \n" - " \t/*\n" - "@@ -195,7 +156,7 @@ static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c)\n" - " \n" - " \ti2c->hlc_int_enable(i2c);\n" - " \ttime_left = wait_event_timeout(i2c->queue,\n" - "-\t\t\t\t octeon_i2c_hlc_test_ready(i2c, &first),\n" - "+\t\t\t\t octeon_i2c_hlc_test_valid(i2c),\n" - " \t\t\t\t i2c->adap.timeout);\n" - " \ti2c->hlc_int_disable(i2c);\n" - " \tif (!time_left)\n" - "-- \n" - 1.9.1 - "\01:4\0" - "fn\00003-i2c-octeon-thunderx-Debug-prints-for-timeout-and-rec.patch\0" - "b\0" - ">From 45eae05b8d793f5652f77ab1d5faa62c30927a10 Mon Sep 17 00:00:00 2001\n" - "From: Jan Glauber <jglauber@cavium.com>\n" - "Date: Fri, 11 Nov 2016 09:40:15 +0100\n" - "Subject: [PATCH 3/3] i2c: octeon: thunderx: Debug prints for timeout and\n" - " recovery\n" - "\n" - "Signed-off-by: Jan Glauber <jglauber@cavium.com>\n" - "---\n" - " drivers/i2c/busses/i2c-octeon-core.c | 10 +++++++---\n" - " 1 file changed, 7 insertions(+), 3 deletions(-)\n" - "\n" - "diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c\n" - "index 1d8775799..a2a92b6 100644\n" - "--- a/drivers/i2c/busses/i2c-octeon-core.c\n" - "+++ b/drivers/i2c/busses/i2c-octeon-core.c\n" - "@@ -72,9 +72,10 @@ static int octeon_i2c_wait(struct octeon_i2c *i2c)\n" - " \t\treturn 0;\n" - " \t}\n" - " \n" - "-\tif (!time_left)\n" - "+\tif (!time_left) {\n" - "+\t\tpr_err(\"%s: timed out\\n\", __func__);\n" - " \t\treturn -ETIMEDOUT;\n" - "-\n" - "+\t}\n" - " \treturn 0;\n" - " }\n" - " \n" - "@@ -169,8 +170,10 @@ static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c)\n" - " \t\treturn 0;\n" - " \t}\n" - " \n" - "-\tif (!time_left)\n" - "+\tif (!time_left) {\n" - "+\t\tpr_err(\"%s: timed out\\n\", __func__);\n" - " \t\treturn -ETIMEDOUT;\n" - "+\t}\n" - " \treturn 0;\n" - " }\n" - " \n" - "@@ -280,6 +283,7 @@ static int octeon_i2c_start(struct octeon_i2c *i2c)\n" - " \n" - " error:\n" - " \t/* START failed, try to recover */\n" - "+\tpr_err(\"%s: try to recover from status: %d\\n\", __func__, stat);\n" - " \tret = octeon_i2c_recovery(i2c);\n" - " \treturn (ret) ? ret : -EAGAIN;\n" - " }\n" - "-- \n" - 1.9.1 -4741b4c185cc0fd3310be07e6df9b36b5b7050ffcb2c75cdee35b35793476bf7 +4b182968f7d4a863758c1656ca3424076658e21aa7774c2cb39c14968173eda2
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.