Mon Jul 20 06:44:55 2020 UTC ()
only ask for SDPCMD_INTSTATUS_HMB_SW_MASK and SDPCMD_INTSTATUS_CHIPACTIVE
interrupts, not all of them.  we only ack these ones.

mostly fixes pinebookpro wifi hard hangs.  still is problematic and can
trigger interrupt storm that appears as a hard hang without NET_MPSAFE,
and a follow up, less clearly right, change will reduce that to a soft
hang of the interface that can be cleared with 'ifconfig bwfm0 down up',
and even often recovers itself now.


(mrg)
diff -r1.19 -r1.20 src/sys/dev/sdmmc/if_bwfm_sdio.c

cvs diff -r1.19 -r1.20 src/sys/dev/sdmmc/if_bwfm_sdio.c (expand / switch to unified diff)

--- src/sys/dev/sdmmc/if_bwfm_sdio.c 2020/06/23 10:09:33 1.19
+++ src/sys/dev/sdmmc/if_bwfm_sdio.c 2020/07/20 06:44:55 1.20
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: if_bwfm_sdio.c,v 1.19 2020/06/23 10:09:33 martin Exp $ */ 1/* $NetBSD: if_bwfm_sdio.c,v 1.20 2020/07/20 06:44:55 mrg Exp $ */
2/* $OpenBSD: if_bwfm_sdio.c,v 1.1 2017/10/11 17:19:50 patrick Exp $ */ 2/* $OpenBSD: if_bwfm_sdio.c,v 1.1 2017/10/11 17:19:50 patrick Exp $ */
3/* 3/*
4 * Copyright (c) 2010-2016 Broadcom Corporation 4 * Copyright (c) 2010-2016 Broadcom Corporation
5 * Copyright (c) 2016,2017 Patrick Wildt <patrick@blueri.se> 5 * Copyright (c) 2016,2017 Patrick Wildt <patrick@blueri.se>
6 * 6 *
7 * Permission to use, copy, modify, and/or distribute this software for any 7 * Permission to use, copy, modify, and/or distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above 8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies. 9 * copyright notice and this permission notice appear in all copies.
10 * 10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
@@ -495,29 +495,28 @@ bwfm_sdio_attachhook(device_t self) @@ -495,29 +495,28 @@ bwfm_sdio_attachhook(device_t self)
495 } 495 }
496 496
497 clk = bwfm_sdio_read_1(sc, BWFM_SDIO_FUNC1_CHIPCLKCSR); 497 clk = bwfm_sdio_read_1(sc, BWFM_SDIO_FUNC1_CHIPCLKCSR);
498 bwfm_sdio_write_1(sc, BWFM_SDIO_FUNC1_CHIPCLKCSR, 498 bwfm_sdio_write_1(sc, BWFM_SDIO_FUNC1_CHIPCLKCSR,
499 clk | BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_HT); 499 clk | BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_HT);
500 500
501 bwfm_sdio_dev_write(sc, SDPCMD_TOSBMAILBOXDATA, 501 bwfm_sdio_dev_write(sc, SDPCMD_TOSBMAILBOXDATA,
502 SDPCM_PROT_VERSION << SDPCM_PROT_VERSION_SHIFT); 502 SDPCM_PROT_VERSION << SDPCM_PROT_VERSION_SHIFT);
503 if (sdmmc_io_function_enable(sc->sc_sf[2])) { 503 if (sdmmc_io_function_enable(sc->sc_sf[2])) {
504 aprint_error_dev(bwfm->sc_dev, "cannot enable function 2\n"); 504 aprint_error_dev(bwfm->sc_dev, "cannot enable function 2\n");
505 goto err; 505 goto err;
506 } 506 }
507 507
508// bwfm_sdio_dev_write(sc, SDPCMD_HOSTINTMASK, 508 bwfm_sdio_dev_write(sc, SDPCMD_HOSTINTMASK,
509// SDPCMD_INTSTATUS_HMB_SW_MASK | SDPCMD_INTSTATUS_CHIPACTIVE); 509 SDPCMD_INTSTATUS_HMB_SW_MASK | SDPCMD_INTSTATUS_CHIPACTIVE);
510 bwfm_sdio_dev_write(sc, SDPCMD_HOSTINTMASK, 0xffffffff); 
511 bwfm_sdio_write_1(sc, BWFM_SDIO_WATERMARK, 8); 510 bwfm_sdio_write_1(sc, BWFM_SDIO_WATERMARK, 8);
512 511
513 if (bwfm_chip_sr_capable(bwfm)) { 512 if (bwfm_chip_sr_capable(bwfm)) {
514 reg = bwfm_sdio_read_1(sc, BWFM_SDIO_FUNC1_WAKEUPCTRL); 513 reg = bwfm_sdio_read_1(sc, BWFM_SDIO_FUNC1_WAKEUPCTRL);
515 reg |= BWFM_SDIO_FUNC1_WAKEUPCTRL_HTWAIT; 514 reg |= BWFM_SDIO_FUNC1_WAKEUPCTRL_HTWAIT;
516 bwfm_sdio_write_1(sc, BWFM_SDIO_FUNC1_WAKEUPCTRL, reg); 515 bwfm_sdio_write_1(sc, BWFM_SDIO_FUNC1_WAKEUPCTRL, reg);
517 bwfm_sdio_write_1(sc, BWFM_SDIO_CCCR_CARDCAP, 516 bwfm_sdio_write_1(sc, BWFM_SDIO_CCCR_CARDCAP,
518 BWFM_SDIO_CCCR_CARDCAP_CMD14_SUPPORT | 517 BWFM_SDIO_CCCR_CARDCAP_CMD14_SUPPORT |
519 BWFM_SDIO_CCCR_CARDCAP_CMD14_EXT); 518 BWFM_SDIO_CCCR_CARDCAP_CMD14_EXT);
520 bwfm_sdio_write_1(sc, BWFM_SDIO_FUNC1_CHIPCLKCSR, 519 bwfm_sdio_write_1(sc, BWFM_SDIO_FUNC1_CHIPCLKCSR,
521 BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_HT); 520 BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_HT);
522 sc->sc_sr_enabled = 1; 521 sc->sc_sr_enabled = 1;
523 } else { 522 } else {