diff options
| -rw-r--r-- | net/mac80211/debugfs_netdev.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c index 6ed0455902c6..b0fc205411c1 100644 --- a/net/mac80211/debugfs_netdev.c +++ b/net/mac80211/debugfs_netdev.c | |||
| @@ -424,6 +424,7 @@ static ssize_t ieee80211_if_parse_tsf( | |||
| 424 | struct ieee80211_local *local = sdata->local; | 424 | struct ieee80211_local *local = sdata->local; |
| 425 | unsigned long long tsf; | 425 | unsigned long long tsf; |
| 426 | int ret; | 426 | int ret; |
| 427 | int tsf_is_delta = 0; | ||
| 427 | 428 | ||
| 428 | if (strncmp(buf, "reset", 5) == 0) { | 429 | if (strncmp(buf, "reset", 5) == 0) { |
| 429 | if (local->ops->reset_tsf) { | 430 | if (local->ops->reset_tsf) { |
| @@ -431,9 +432,20 @@ static ssize_t ieee80211_if_parse_tsf( | |||
| 431 | wiphy_info(local->hw.wiphy, "debugfs reset TSF\n"); | 432 | wiphy_info(local->hw.wiphy, "debugfs reset TSF\n"); |
| 432 | } | 433 | } |
| 433 | } else { | 434 | } else { |
| 435 | if (buflen > 10 && buf[1] == '=') { | ||
| 436 | if (buf[0] == '+') | ||
| 437 | tsf_is_delta = 1; | ||
| 438 | else if (buf[0] == '-') | ||
| 439 | tsf_is_delta = -1; | ||
| 440 | else | ||
| 441 | return -EINVAL; | ||
| 442 | buf += 2; | ||
| 443 | } | ||
| 434 | ret = kstrtoull(buf, 10, &tsf); | 444 | ret = kstrtoull(buf, 10, &tsf); |
| 435 | if (ret < 0) | 445 | if (ret < 0) |
| 436 | return -EINVAL; | 446 | return -EINVAL; |
| 447 | if (tsf_is_delta) | ||
| 448 | tsf = drv_get_tsf(local, sdata) + tsf_is_delta * tsf; | ||
| 437 | if (local->ops->set_tsf) { | 449 | if (local->ops->set_tsf) { |
| 438 | drv_set_tsf(local, sdata, tsf); | 450 | drv_set_tsf(local, sdata, tsf); |
| 439 | wiphy_info(local->hw.wiphy, | 451 | wiphy_info(local->hw.wiphy, |
