Hi Greg, Today's linux-next merge of the driver-core tree got a conflict in drivers/net/wireless/ath/ath9k/debug.c between commits 70e535ed0029 ("ath9k: clean up debugfs print of reset causes"), 7b8aaead958e ("ath9k: restart hardware after noise floor calibration failure") and 325e18817668 ("ath9k: fix misc debugfs when not using chan context") from the net-next tree and commit 631bee257bd5 ("ath: use seq_file api for ath9k debugfs files") from the driver-core tree. I fixed it up (see below) and can carry the fix as necessary (no action is required). Greg, I am not sure why those 2 commits are even in your tree. Do they depend on something else in your tree? -- Cheers, Stephen Rothwell sfr@canb.auug.org.au diff --cc drivers/net/wireless/ath/ath9k/debug.c index 696e3d5309c6,a1f1614a05c2..000000000000 --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c @@@ -832,57 -731,42 +731,46 @@@ static int read_file_misc(struct seq_fi continue; ath9k_calculate_iter_data(sc, ctx, &iter_data); - len += scnprintf(buf + len, sizeof(buf) - len, - "VIFS: CTX %i(%i) AP: %i STA: %i MESH: %i WDS: %i", - i++, (int)(ctx->assigned), iter_data.naps, - iter_data.nstations, - iter_data.nmeshes, iter_data.nwds); - len += scnprintf(buf + len, sizeof(buf) - len, - " ADHOC: %i TOTAL: %hi BEACON-VIF: %hi\n", - iter_data.nadhocs, sc->cur_chan->nvifs, sc->nbcnvifs); + seq_printf(file, - "VIF-COUNTS: CTX %i AP: %i STA: %i MESH: %i WDS: %i", - i++, iter_data.naps, iter_data.nstations, ++ "VIFS: CTX %i(%i) AP: %i STA: %i MESH: %i WDS: %i", ++ i++, (int)(ctx->assigned), iter_data.naps, ++ iter_data.nstations, + iter_data.nmeshes, iter_data.nwds); + seq_printf(file, " ADHOC: %i TOTAL: %hi BEACON-VIF: %hi\n", + iter_data.nadhocs, sc->cur_chan->nvifs, + sc->nbcnvifs); } - if (len > sizeof(buf)) - len = sizeof(buf); - - retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); - return retval; + return 0; } - static ssize_t read_file_reset(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) + static int read_file_reset(struct seq_file *file, void *data) { - struct ath_softc *sc = file->private_data; + struct ath_softc *sc = dev_get_drvdata(file->private); + static const char * const reset_cause[__RESET_TYPE_MAX] = { + [RESET_TYPE_BB_HANG] = "Baseband Hang", + [RESET_TYPE_BB_WATCHDOG] = "Baseband Watchdog", + [RESET_TYPE_FATAL_INT] = "Fatal HW Error", + [RESET_TYPE_TX_ERROR] = "TX HW error", + [RESET_TYPE_TX_GTT] = "Transmit timeout", + [RESET_TYPE_TX_HANG] = "TX Path Hang", + [RESET_TYPE_PLL_HANG] = "PLL RX Hang", + [RESET_TYPE_MAC_HANG] = "MAC Hang", + [RESET_TYPE_BEACON_STUCK] = "Stuck Beacon", + [RESET_TYPE_MCI] = "MCI Reset", + [RESET_TYPE_CALIBRATION] = "Calibration error", + }; - char buf[512]; - unsigned int len = 0; + int i; - seq_printf(file, "%17s: %2d\n", "Baseband Hang", - sc->debug.stats.reset[RESET_TYPE_BB_HANG]); - seq_printf(file, "%17s: %2d\n", "Baseband Watchdog", - sc->debug.stats.reset[RESET_TYPE_BB_WATCHDOG]); - seq_printf(file, "%17s: %2d\n", "Fatal HW Error", - sc->debug.stats.reset[RESET_TYPE_FATAL_INT]); - seq_printf(file, "%17s: %2d\n", "TX HW error", - sc->debug.stats.reset[RESET_TYPE_TX_ERROR]); - seq_printf(file, "%17s: %2d\n", "TX Path Hang", - sc->debug.stats.reset[RESET_TYPE_TX_HANG]); - seq_printf(file, "%17s: %2d\n", "PLL RX Hang", - sc->debug.stats.reset[RESET_TYPE_PLL_HANG]); - seq_printf(file, "%17s: %2d\n", "MAC Hang", - sc->debug.stats.reset[RESET_TYPE_MAC_HANG]); - seq_printf(file, "%17s: %2d\n", "Stuck Beacon", - sc->debug.stats.reset[RESET_TYPE_BEACON_STUCK]); - seq_printf(file, "%17s: %2d\n", "MCI Reset", - sc->debug.stats.reset[RESET_TYPE_MCI]); + for (i = 0; i < ARRAY_SIZE(reset_cause); i++) { + if (!reset_cause[i]) + continue; + - len += scnprintf(buf + len, sizeof(buf) - len, - "%17s: %2d\n", reset_cause[i], - sc->debug.stats.reset[i]); ++ seq_printf(file, "%17s: %2d\n", reset_cause[i], ++ sc->debug.stats.reset[i]); + } - if (len > sizeof(buf)) - len = sizeof(buf); - - return simple_read_from_buffer(user_buf, count, ppos, buf, len); + return 0; } void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf, @@@ -1331,16 -1175,16 +1179,16 @@@ int ath9k_init_debug(struct ath_hw *ah ath9k_dfs_init_debug(sc); ath9k_tx99_init_debug(sc); - ath9k_spectral_init_debug(sc); + ath9k_cmn_spectral_init_debug(&sc->spec_priv, sc->debug.debugfs_phy); - debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc, - &fops_dma); - debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc, - &fops_interrupt); - debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc, - &fops_xmit); - debugfs_create_file("queues", S_IRUSR, sc->debug.debugfs_phy, sc, - &fops_queues); + debugfs_create_devm_seqfile(sc->dev, "dma", sc->debug.debugfs_phy, + read_file_dma); + debugfs_create_devm_seqfile(sc->dev, "interrupt", sc->debug.debugfs_phy, + read_file_interrupt); + debugfs_create_devm_seqfile(sc->dev, "xmit", sc->debug.debugfs_phy, + read_file_xmit); + debugfs_create_devm_seqfile(sc->dev, "queues", sc->debug.debugfs_phy, + read_file_queues); debugfs_create_u32("qlen_bk", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, &sc->tx.txq_max_pending[IEEE80211_AC_BK]); debugfs_create_u32("qlen_be", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,