diff options
author | Adam Goldman <adamg@pobox.com> | 2024-03-25 07:37:25 +0900 |
---|---|---|
committer | Takashi Sakamoto <o-takashi@sakamocchi.jp> | 2024-05-06 11:06:03 +0900 |
commit | f83a052f9a0b62318d4f6e9bdddf9fc0103ac908 (patch) | |
tree | a3fb357983f12894001956c9b79530cace2a7f1d /drivers/firewire | |
parent | dd5a440a31fae6e459c0d6271dddd62825505361 (diff) | |
download | linux-f83a052f9a0b62318d4f6e9bdddf9fc0103ac908.tar.gz linux-f83a052f9a0b62318d4f6e9bdddf9fc0103ac908.tar.bz2 linux-f83a052f9a0b62318d4f6e9bdddf9fc0103ac908.zip |
firewire: core: option to log bus reset initiation
Add a debug parameter to firewire-core, analogous to the one in
firewire-ohci. When this is set to 1, log when we schedule, delay, or
initiate a bus reset. Since FireWire bus resets can originate from any
node on the bus, specific logging of the resets we initiate provides
additional insight.
Signed-off-by: Adam Goldman <adamg@pobox.com>
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Diffstat (limited to 'drivers/firewire')
-rw-r--r-- | drivers/firewire/core-card.c | 10 | ||||
-rw-r--r-- | drivers/firewire/core-transaction.c | 7 | ||||
-rw-r--r-- | drivers/firewire/core.h | 4 |
3 files changed, 21 insertions, 0 deletions
diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c index 401a77e3b5fa..dac1b0fc7a42 100644 --- a/drivers/firewire/core-card.c +++ b/drivers/firewire/core-card.c @@ -221,11 +221,19 @@ static int reset_bus(struct fw_card *card, bool short_reset) int reg = short_reset ? 5 : 1; int bit = short_reset ? PHY_BUS_SHORT_RESET : PHY_BUS_RESET; + if (unlikely(fw_core_param_debug & FW_CORE_PARAM_DEBUG_BUSRESETS)) + fw_notice(card, "initiating %s bus reset\n", + short_reset ? "short" : "long"); + return card->driver->update_phy_reg(card, reg, 0, bit); } void fw_schedule_bus_reset(struct fw_card *card, bool delayed, bool short_reset) { + if (unlikely(fw_core_param_debug & FW_CORE_PARAM_DEBUG_BUSRESETS)) + fw_notice(card, "scheduling %s bus reset\n", + short_reset ? "short" : "long"); + /* We don't try hard to sort out requests of long vs. short resets. */ card->br_short = short_reset; @@ -244,6 +252,8 @@ static void br_work(struct work_struct *work) /* Delay for 2s after last reset per IEEE 1394 clause 8.2.1. */ if (card->reset_jiffies != 0 && time_before64(get_jiffies_64(), card->reset_jiffies + 2 * HZ)) { + if (unlikely(fw_core_param_debug & FW_CORE_PARAM_DEBUG_BUSRESETS)) + fw_notice(card, "delaying bus reset\n"); if (!queue_delayed_work(fw_workqueue, &card->br_work, 2 * HZ)) fw_card_put(card); return; diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-transaction.c index 130b95aca629..c427b7861eaf 100644 --- a/drivers/firewire/core-transaction.c +++ b/drivers/firewire/core-transaction.c @@ -1385,5 +1385,12 @@ static void __exit fw_core_cleanup(void) idr_destroy(&fw_device_idr); } +int fw_core_param_debug; +module_param_named(debug, fw_core_param_debug, int, 0644); +MODULE_PARM_DESC(debug, "Verbose logging (default = 0" + ", bus resets = " __stringify(FW_CORE_PARAM_DEBUG_BUSRESETS) + ")"); + + module_init(fw_core_init); module_exit(fw_core_cleanup); diff --git a/drivers/firewire/core.h b/drivers/firewire/core.h index 95c10f3d2282..ff96e5456b5d 100644 --- a/drivers/firewire/core.h +++ b/drivers/firewire/core.h @@ -238,6 +238,10 @@ static inline bool is_next_generation(int new_generation, int old_generation) /* OHCI-1394's default upper bound for physical DMA: 4 GB */ #define FW_MAX_PHYSICAL_RANGE (1ULL << 32) +#define FW_CORE_PARAM_DEBUG_BUSRESETS 1 + +extern int fw_core_param_debug; + void fw_core_handle_request(struct fw_card *card, struct fw_packet *request); void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet); int fw_get_response_length(struct fw_request *request); |