Message ID | 522A04B4.3050708@hauke-m.de (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
On 09/06/2013 06:37 PM, Hauke Mehrtens wrote: > On 09/06/2013 05:25 PM, Arend van Spriel wrote: >> On 09/06/2013 11:05 AM, Arend van Spriel wrote: >>> On 09/06/2013 10:05 AM, Rafa? Mi?ecki wrote: >>>> Hi, >>>> >>>> 2013/9/5 Arend van Spriel <arend@broadcom.com>: >>>>> Since 3.11-rc4 I am seeing a problem with bcma on x64 (see attached >>>>> log). I >>>>> thought I misconfigured my setup, but just upgraded to 3.11 and I am >>>>> still >>>>> seeing the same issue. Did you have any reports like this? >>>> >>>> Unfortunately I wasn't testing final 3.11 with x86_64, I'll give it a >>>> try over the weekend. >>>> >>> >>> I am bisecting. Will let you know when I find something. >> >> Bisect points to: >> >> fd4edf197544bae1c77d84bad354aa7ce1d08ce1 is the first bad commit >> commit fd4edf197544bae1c77d84bad354aa7ce1d08ce1 >> Author: Hauke Mehrtens <hauke@hauke-m.de> >> Date: Mon Jul 15 13:15:08 2013 +0200 >> >> bcma: fix handling of big addrl >> >> The return value of bcma_erom_get_addr_desc() is a unsigned value >> and it >> could wrap around in the two complement writing. This happens for one >> core in the BCM4708 SoC. >> >> Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> >> Signed-off-by: John W. Linville <linville@tuxdriver.com> >> >> It is probably caused by using IS_ERR_VALUE() macro which does a >> unsigned long cast, which gives different results on 64-bit platform. >> >> This patch was submitted upstream yesterday by Dave for 3.12-rc1. >> >> Regards, >> Arend >> > Hi Arend, > > Thanks for spotting this. This commit is not in final 3.11, otherwise > I would have suspected it before. Yeah. It will need to be fixed for 3.12 after the merge window. > Could you please try the attached patch. Just tried my own patch, which essentially does the same (not using a macro). So you may add Acked-by: or Tested-by: Arend van Spriel <arend@broadcom.com> Whatever you think is most appropriate. Regards, Arend -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From 4a6337b38369977b94d6e752c57b09e7f4539830 Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens <hauke@hauke-m.de> Date: Fri, 6 Sep 2013 18:32:41 +0200 Subject: [PATCH] bcma: fix error handling --- drivers/bcma/scan.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/bcma/scan.c b/drivers/bcma/scan.c index cd6b20f..b7906d5 100644 --- a/drivers/bcma/scan.c +++ b/drivers/bcma/scan.c @@ -269,6 +269,8 @@ static struct bcma_device *bcma_find_core_reverse(struct bcma_bus *bus, u16 core return NULL; } +#define IS_ERR_VALUE_U32 unlikely((x) >= (u32)-MAX_ERRNO) + static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr, struct bcma_device_id *match, int core_num, struct bcma_device *core) @@ -351,11 +353,11 @@ static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr, * the main register space for the core */ tmp = bcma_erom_get_addr_desc(bus, eromptr, SCAN_ADDR_TYPE_SLAVE, 0); - if (tmp == 0 || IS_ERR_VALUE(tmp)) { + if (tmp == 0 || IS_ERR_VALUE_U32(tmp)) { /* Try again to see if it is a bridge */ tmp = bcma_erom_get_addr_desc(bus, eromptr, SCAN_ADDR_TYPE_BRIDGE, 0); - if (tmp == 0 || IS_ERR_VALUE(tmp)) { + if (tmp == 0 || IS_ERR_VALUE_U32(tmp)) { return -EILSEQ; } else { bcma_info(bus, "Bridge found\n"); @@ -369,7 +371,7 @@ static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr, for (j = 0; ; j++) { tmp = bcma_erom_get_addr_desc(bus, eromptr, SCAN_ADDR_TYPE_SLAVE, i); - if (IS_ERR_VALUE(tmp)) { + if (IS_ERR_VALUE_U32(tmp)) { /* no more entries for port _i_ */ /* pr_debug("erom: slave port %d " * "has %d descriptors\n", i, j); */ @@ -386,7 +388,7 @@ static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr, for (j = 0; ; j++) { tmp = bcma_erom_get_addr_desc(bus, eromptr, SCAN_ADDR_TYPE_MWRAP, i); - if (IS_ERR_VALUE(tmp)) { + if (IS_ERR_VALUE_U32(tmp)) { /* no more entries for port _i_ */ /* pr_debug("erom: master wrapper %d " * "has %d descriptors\n", i, j); */ @@ -404,7 +406,7 @@ static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr, for (j = 0; ; j++) { tmp = bcma_erom_get_addr_desc(bus, eromptr, SCAN_ADDR_TYPE_SWRAP, i + hack); - if (IS_ERR_VALUE(tmp)) { + if (IS_ERR_VALUE_U32(tmp)) { /* no more entries for port _i_ */ /* pr_debug("erom: master wrapper %d " * has %d descriptors\n", i, j); */ -- 1.7.10.4