Lines Matching refs:mmsv
287 static void ethtool_mmsv_configure_tx(struct ethtool_mmsv *mmsv, in ethtool_mmsv_configure_tx() argument
290 if (mmsv->ops->configure_tx) in ethtool_mmsv_configure_tx()
291 mmsv->ops->configure_tx(mmsv, tx_active); in ethtool_mmsv_configure_tx()
294 static void ethtool_mmsv_configure_pmac(struct ethtool_mmsv *mmsv, in ethtool_mmsv_configure_pmac() argument
297 if (mmsv->ops->configure_pmac) in ethtool_mmsv_configure_pmac()
298 mmsv->ops->configure_pmac(mmsv, pmac_enabled); in ethtool_mmsv_configure_pmac()
301 static void ethtool_mmsv_send_mpacket(struct ethtool_mmsv *mmsv, in ethtool_mmsv_send_mpacket() argument
304 if (mmsv->ops->send_mpacket) in ethtool_mmsv_send_mpacket()
305 mmsv->ops->send_mpacket(mmsv, mpacket); in ethtool_mmsv_send_mpacket()
318 struct ethtool_mmsv *mmsv = timer_container_of(mmsv, t, verify_timer); in ethtool_mmsv_verify_timer() local
322 spin_lock_irqsave(&mmsv->lock, flags); in ethtool_mmsv_verify_timer()
324 switch (mmsv->status) { in ethtool_mmsv_verify_timer()
327 if (mmsv->verify_retries != 0) { in ethtool_mmsv_verify_timer()
328 ethtool_mmsv_send_mpacket(mmsv, ETHTOOL_MPACKET_VERIFY); in ethtool_mmsv_verify_timer()
331 mmsv->status = ETHTOOL_MM_VERIFY_STATUS_FAILED; in ethtool_mmsv_verify_timer()
334 mmsv->verify_retries--; in ethtool_mmsv_verify_timer()
338 ethtool_mmsv_configure_tx(mmsv, true); in ethtool_mmsv_verify_timer()
346 mod_timer(&mmsv->verify_timer, in ethtool_mmsv_verify_timer()
347 jiffies + msecs_to_jiffies(mmsv->verify_time)); in ethtool_mmsv_verify_timer()
350 spin_unlock_irqrestore(&mmsv->lock, flags); in ethtool_mmsv_verify_timer()
353 static void ethtool_mmsv_verify_timer_arm(struct ethtool_mmsv *mmsv) in ethtool_mmsv_verify_timer_arm() argument
355 if (mmsv->pmac_enabled && mmsv->tx_enabled && mmsv->verify_enabled && in ethtool_mmsv_verify_timer_arm()
356 mmsv->status != ETHTOOL_MM_VERIFY_STATUS_FAILED && in ethtool_mmsv_verify_timer_arm()
357 mmsv->status != ETHTOOL_MM_VERIFY_STATUS_SUCCEEDED) { in ethtool_mmsv_verify_timer_arm()
358 timer_setup(&mmsv->verify_timer, ethtool_mmsv_verify_timer, 0); in ethtool_mmsv_verify_timer_arm()
359 mod_timer(&mmsv->verify_timer, jiffies); in ethtool_mmsv_verify_timer_arm()
363 static void ethtool_mmsv_apply(struct ethtool_mmsv *mmsv) in ethtool_mmsv_apply() argument
368 if (!mmsv->verify_enabled) { in ethtool_mmsv_apply()
369 ethtool_mmsv_configure_pmac(mmsv, mmsv->pmac_enabled); in ethtool_mmsv_apply()
370 ethtool_mmsv_configure_tx(mmsv, mmsv->tx_enabled); in ethtool_mmsv_apply()
372 mmsv->status = ETHTOOL_MM_VERIFY_STATUS_INITIAL; in ethtool_mmsv_apply()
373 mmsv->verify_retries = ETHTOOL_MM_MAX_VERIFY_RETRIES; in ethtool_mmsv_apply()
375 if (netif_running(mmsv->dev)) in ethtool_mmsv_apply()
376 ethtool_mmsv_verify_timer_arm(mmsv); in ethtool_mmsv_apply()
389 void ethtool_mmsv_stop(struct ethtool_mmsv *mmsv) in ethtool_mmsv_stop() argument
391 timer_shutdown_sync(&mmsv->verify_timer); in ethtool_mmsv_stop()
403 void ethtool_mmsv_link_state_handle(struct ethtool_mmsv *mmsv, bool up) in ethtool_mmsv_link_state_handle() argument
407 ethtool_mmsv_stop(mmsv); in ethtool_mmsv_link_state_handle()
409 spin_lock_irqsave(&mmsv->lock, flags); in ethtool_mmsv_link_state_handle()
411 if (up && mmsv->pmac_enabled) { in ethtool_mmsv_link_state_handle()
413 ethtool_mmsv_configure_pmac(mmsv, true); in ethtool_mmsv_link_state_handle()
416 ethtool_mmsv_apply(mmsv); in ethtool_mmsv_link_state_handle()
419 if (mmsv->verify_enabled) in ethtool_mmsv_link_state_handle()
420 mmsv->status = ETHTOOL_MM_VERIFY_STATUS_INITIAL; in ethtool_mmsv_link_state_handle()
423 ethtool_mmsv_configure_pmac(mmsv, false); in ethtool_mmsv_link_state_handle()
424 ethtool_mmsv_configure_tx(mmsv, false); in ethtool_mmsv_link_state_handle()
427 spin_unlock_irqrestore(&mmsv->lock, flags); in ethtool_mmsv_link_state_handle()
439 void ethtool_mmsv_event_handle(struct ethtool_mmsv *mmsv, in ethtool_mmsv_event_handle() argument
443 spin_lock(&mmsv->lock); in ethtool_mmsv_event_handle()
445 if (!mmsv->pmac_enabled) in ethtool_mmsv_event_handle()
451 ethtool_mmsv_send_mpacket(mmsv, ETHTOOL_MPACKET_RESPONSE); in ethtool_mmsv_event_handle()
455 if (mmsv->status != ETHTOOL_MM_VERIFY_STATUS_SUCCEEDED) in ethtool_mmsv_event_handle()
456 mmsv->status = ETHTOOL_MM_VERIFY_STATUS_VERIFYING; in ethtool_mmsv_event_handle()
460 if (mmsv->status == ETHTOOL_MM_VERIFY_STATUS_VERIFYING) in ethtool_mmsv_event_handle()
461 mmsv->status = ETHTOOL_MM_VERIFY_STATUS_SUCCEEDED; in ethtool_mmsv_event_handle()
466 spin_unlock(&mmsv->lock); in ethtool_mmsv_event_handle()
470 static bool ethtool_mmsv_is_tx_active(struct ethtool_mmsv *mmsv) in ethtool_mmsv_is_tx_active() argument
475 return mmsv->tx_enabled && in ethtool_mmsv_is_tx_active()
476 (mmsv->status == ETHTOOL_MM_VERIFY_STATUS_SUCCEEDED || in ethtool_mmsv_is_tx_active()
477 mmsv->status == ETHTOOL_MM_VERIFY_STATUS_DISABLED); in ethtool_mmsv_is_tx_active()
488 void ethtool_mmsv_get_mm(struct ethtool_mmsv *mmsv, in ethtool_mmsv_get_mm() argument
493 spin_lock_irqsave(&mmsv->lock, flags); in ethtool_mmsv_get_mm()
496 state->verify_enabled = mmsv->verify_enabled; in ethtool_mmsv_get_mm()
497 state->pmac_enabled = mmsv->pmac_enabled; in ethtool_mmsv_get_mm()
498 state->verify_time = mmsv->verify_time; in ethtool_mmsv_get_mm()
499 state->tx_enabled = mmsv->tx_enabled; in ethtool_mmsv_get_mm()
500 state->verify_status = mmsv->status; in ethtool_mmsv_get_mm()
501 state->tx_active = ethtool_mmsv_is_tx_active(mmsv); in ethtool_mmsv_get_mm()
503 spin_unlock_irqrestore(&mmsv->lock, flags); in ethtool_mmsv_get_mm()
515 void ethtool_mmsv_set_mm(struct ethtool_mmsv *mmsv, struct ethtool_mm_cfg *cfg) in ethtool_mmsv_set_mm() argument
520 ethtool_mmsv_stop(mmsv); in ethtool_mmsv_set_mm()
522 spin_lock_irqsave(&mmsv->lock, flags); in ethtool_mmsv_set_mm()
524 mmsv->verify_enabled = cfg->verify_enabled; in ethtool_mmsv_set_mm()
525 mmsv->pmac_enabled = cfg->pmac_enabled; in ethtool_mmsv_set_mm()
526 mmsv->verify_time = cfg->verify_time; in ethtool_mmsv_set_mm()
527 mmsv->tx_enabled = cfg->tx_enabled; in ethtool_mmsv_set_mm()
530 mmsv->status = ETHTOOL_MM_VERIFY_STATUS_DISABLED; in ethtool_mmsv_set_mm()
532 ethtool_mmsv_apply(mmsv); in ethtool_mmsv_set_mm()
534 spin_unlock_irqrestore(&mmsv->lock, flags); in ethtool_mmsv_set_mm()
550 void ethtool_mmsv_init(struct ethtool_mmsv *mmsv, struct net_device *dev, in ethtool_mmsv_init() argument
553 mmsv->ops = ops; in ethtool_mmsv_init()
554 mmsv->dev = dev; in ethtool_mmsv_init()
555 mmsv->verify_retries = ETHTOOL_MM_MAX_VERIFY_RETRIES; in ethtool_mmsv_init()
556 mmsv->verify_time = ETHTOOL_MM_MAX_VERIFY_TIME_MS; in ethtool_mmsv_init()
557 mmsv->status = ETHTOOL_MM_VERIFY_STATUS_DISABLED; in ethtool_mmsv_init()
558 timer_setup(&mmsv->verify_timer, ethtool_mmsv_verify_timer, 0); in ethtool_mmsv_init()
559 spin_lock_init(&mmsv->lock); in ethtool_mmsv_init()