[Intel-wired-lan] [PATCH v3 11/11] igc: Add watchdog
kbuild test robot
lkp at intel.com
Mon Jun 25 12:30:59 UTC 2018
Hi Sasha,
Thank you for the patch! Perhaps something to improve:
url: https://github.com/0day-ci/linux/commits/Sasha-Neftin/igc-Add-skeletal-frame-for-Intel-R-2-5G-Ethernet-Controller-support/20180624-164739
base: https://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue.git dev-queue
smatch warnings:
drivers/net/ethernet/intel/igc/igc_main.c:2464 igc_watchdog_task() error: uninitialized symbol 'phy_data'.
# https://github.com/0day-ci/linux/commit/d32b0b485e39c7c5a2ef4e9484919d6fa6a6733e
git remote add linux-review https://github.com/0day-ci/linux
git remote update linux-review
git checkout d32b0b485e39c7c5a2ef4e9484919d6fa6a6733e
vim +/phy_data +2464 drivers/net/ethernet/intel/igc/igc_main.c
3e307bfc Sasha Neftin 2018-06-24 2382
d32b0b48 Sasha Neftin 2018-06-24 2383 static void igc_watchdog_task(struct work_struct *work)
d32b0b48 Sasha Neftin 2018-06-24 2384 {
d32b0b48 Sasha Neftin 2018-06-24 2385 struct igc_adapter *adapter = container_of(work,
d32b0b48 Sasha Neftin 2018-06-24 2386 struct igc_adapter,
d32b0b48 Sasha Neftin 2018-06-24 2387 watchdog_task);
d32b0b48 Sasha Neftin 2018-06-24 2388 struct e1000_hw *hw = &adapter->hw;
d32b0b48 Sasha Neftin 2018-06-24 2389 struct e1000_phy_info *phy = &hw->phy;
d32b0b48 Sasha Neftin 2018-06-24 2390 struct net_device *netdev = adapter->netdev;
d32b0b48 Sasha Neftin 2018-06-24 2391 u32 link;
d32b0b48 Sasha Neftin 2018-06-24 2392 int i;
d32b0b48 Sasha Neftin 2018-06-24 2393 u32 connsw;
d32b0b48 Sasha Neftin 2018-06-24 2394 u16 phy_data, retry_count = 20;
d32b0b48 Sasha Neftin 2018-06-24 2395
d32b0b48 Sasha Neftin 2018-06-24 2396 link = igc_has_link(adapter);
d32b0b48 Sasha Neftin 2018-06-24 2397
d32b0b48 Sasha Neftin 2018-06-24 2398 if (adapter->flags & IGC_FLAG_NEED_LINK_UPDATE) {
d32b0b48 Sasha Neftin 2018-06-24 2399 if (time_after(jiffies, (adapter->link_check_timeout + HZ)))
d32b0b48 Sasha Neftin 2018-06-24 2400 adapter->flags &= ~IGC_FLAG_NEED_LINK_UPDATE;
d32b0b48 Sasha Neftin 2018-06-24 2401 else
d32b0b48 Sasha Neftin 2018-06-24 2402 link = false;
d32b0b48 Sasha Neftin 2018-06-24 2403 }
d32b0b48 Sasha Neftin 2018-06-24 2404
d32b0b48 Sasha Neftin 2018-06-24 2405 /* Force link down if we have fiber to swap to */
d32b0b48 Sasha Neftin 2018-06-24 2406 if (adapter->flags & IGC_FLAG_MAS_ENABLE) {
d32b0b48 Sasha Neftin 2018-06-24 2407 if (hw->phy.media_type == e1000_media_type_copper) {
d32b0b48 Sasha Neftin 2018-06-24 2408 connsw = rd32(E1000_CONNSW);
d32b0b48 Sasha Neftin 2018-06-24 2409 if (!(connsw & E1000_CONNSW_AUTOSENSE_EN))
d32b0b48 Sasha Neftin 2018-06-24 2410 link = 0;
d32b0b48 Sasha Neftin 2018-06-24 2411 }
d32b0b48 Sasha Neftin 2018-06-24 2412 }
d32b0b48 Sasha Neftin 2018-06-24 2413 if (link) {
d32b0b48 Sasha Neftin 2018-06-24 2414 /* Perform a reset if the media type changed. */
d32b0b48 Sasha Neftin 2018-06-24 2415 if (hw->dev_spec._base.media_changed) {
d32b0b48 Sasha Neftin 2018-06-24 2416 hw->dev_spec._base.media_changed = false;
d32b0b48 Sasha Neftin 2018-06-24 2417 adapter->flags |= IGC_FLAG_MEDIA_RESET;
d32b0b48 Sasha Neftin 2018-06-24 2418 igc_reset(adapter);
d32b0b48 Sasha Neftin 2018-06-24 2419 }
d32b0b48 Sasha Neftin 2018-06-24 2420
d32b0b48 Sasha Neftin 2018-06-24 2421 if (!netif_carrier_ok(netdev)) {
d32b0b48 Sasha Neftin 2018-06-24 2422 u32 ctrl;
d32b0b48 Sasha Neftin 2018-06-24 2423
d32b0b48 Sasha Neftin 2018-06-24 2424 hw->mac.ops.get_speed_and_duplex(hw,
d32b0b48 Sasha Neftin 2018-06-24 2425 &adapter->link_speed,
d32b0b48 Sasha Neftin 2018-06-24 2426 &adapter->link_duplex);
d32b0b48 Sasha Neftin 2018-06-24 2427
d32b0b48 Sasha Neftin 2018-06-24 2428 ctrl = rd32(E1000_CTRL);
d32b0b48 Sasha Neftin 2018-06-24 2429 /* Links status message must follow this format */
d32b0b48 Sasha Neftin 2018-06-24 2430 netdev_info(netdev,
d32b0b48 Sasha Neftin 2018-06-24 2431 "igc: %s NIC Link is Up %d Mbps %s Duplex, Flow Control: %s\n",
d32b0b48 Sasha Neftin 2018-06-24 2432 netdev->name,
d32b0b48 Sasha Neftin 2018-06-24 2433 adapter->link_speed,
d32b0b48 Sasha Neftin 2018-06-24 2434 adapter->link_duplex == FULL_DUPLEX ?
d32b0b48 Sasha Neftin 2018-06-24 2435 "Full" : "Half",
d32b0b48 Sasha Neftin 2018-06-24 2436 (ctrl & E1000_CTRL_TFCE) &&
d32b0b48 Sasha Neftin 2018-06-24 2437 (ctrl & E1000_CTRL_RFCE) ? "RX/TX" :
d32b0b48 Sasha Neftin 2018-06-24 2438 (ctrl & E1000_CTRL_RFCE) ? "RX" :
d32b0b48 Sasha Neftin 2018-06-24 2439 (ctrl & E1000_CTRL_TFCE) ? "TX" : "None");
d32b0b48 Sasha Neftin 2018-06-24 2440
d32b0b48 Sasha Neftin 2018-06-24 2441 /* check if SmartSpeed worked */
d32b0b48 Sasha Neftin 2018-06-24 2442 igc_check_downshift(hw);
d32b0b48 Sasha Neftin 2018-06-24 2443 if (phy->speed_downgraded)
d32b0b48 Sasha Neftin 2018-06-24 2444 netdev_warn(netdev, "Link Speed was downgraded by SmartSpeed\n");
d32b0b48 Sasha Neftin 2018-06-24 2445
d32b0b48 Sasha Neftin 2018-06-24 2446 /* adjust timeout factor according to speed/duplex */
d32b0b48 Sasha Neftin 2018-06-24 2447 adapter->tx_timeout_factor = 1;
d32b0b48 Sasha Neftin 2018-06-24 2448 switch (adapter->link_speed) {
d32b0b48 Sasha Neftin 2018-06-24 2449 case SPEED_10:
d32b0b48 Sasha Neftin 2018-06-24 2450 adapter->tx_timeout_factor = 14;
d32b0b48 Sasha Neftin 2018-06-24 2451 break;
d32b0b48 Sasha Neftin 2018-06-24 2452 case SPEED_100:
d32b0b48 Sasha Neftin 2018-06-24 2453 /* maybe add some timeout factor ? */
d32b0b48 Sasha Neftin 2018-06-24 2454 break;
d32b0b48 Sasha Neftin 2018-06-24 2455 }
d32b0b48 Sasha Neftin 2018-06-24 2456
d32b0b48 Sasha Neftin 2018-06-24 2457 if (adapter->link_speed != SPEED_1000)
d32b0b48 Sasha Neftin 2018-06-24 2458 goto no_wait;
d32b0b48 Sasha Neftin 2018-06-24 2459
d32b0b48 Sasha Neftin 2018-06-24 2460 /* wait for Remote receiver status OK */
d32b0b48 Sasha Neftin 2018-06-24 2461 retry_read_status:
d32b0b48 Sasha Neftin 2018-06-24 2462 if (!igc_read_phy_reg(hw, PHY_1000T_STATUS,
^^^^^^^^^^^^^^^^
If the function isn't implemented the this returns success without initializing "phy_data".
d32b0b48 Sasha Neftin 2018-06-24 2463 &phy_data)) {
d32b0b48 Sasha Neftin 2018-06-24 @2464 if (!(phy_data & SR_1000T_REMOTE_RX_STATUS) &&
^^^^^^^^
d32b0b48 Sasha Neftin 2018-06-24 2465 retry_count) {
d32b0b48 Sasha Neftin 2018-06-24 2466 msleep(100);
d32b0b48 Sasha Neftin 2018-06-24 2467 retry_count--;
d32b0b48 Sasha Neftin 2018-06-24 2468 goto retry_read_status;
d32b0b48 Sasha Neftin 2018-06-24 2469 } else if (!retry_count) {
d32b0b48 Sasha Neftin 2018-06-24 2470 dev_err(&adapter->pdev->dev, "exceed max 2 second\n");
d32b0b48 Sasha Neftin 2018-06-24 2471 }
d32b0b48 Sasha Neftin 2018-06-24 2472 } else {
d32b0b48 Sasha Neftin 2018-06-24 2473 dev_err(&adapter->pdev->dev, "read 1000Base-T Status Reg\n");
d32b0b48 Sasha Neftin 2018-06-24 2474 }
d32b0b48 Sasha Neftin 2018-06-24 2475 no_wait:
d32b0b48 Sasha Neftin 2018-06-24 2476 netif_carrier_on(netdev);
d32b0b48 Sasha Neftin 2018-06-24 2477
d32b0b48 Sasha Neftin 2018-06-24 2478 /* link state has changed, schedule phy info update */
d32b0b48 Sasha Neftin 2018-06-24 2479 if (!test_bit(__IGC_DOWN, &adapter->state))
d32b0b48 Sasha Neftin 2018-06-24 2480 mod_timer(&adapter->phy_info_timer,
d32b0b48 Sasha Neftin 2018-06-24 2481 round_jiffies(jiffies + 2 * HZ));
d32b0b48 Sasha Neftin 2018-06-24 2482 }
d32b0b48 Sasha Neftin 2018-06-24 2483 } else {
d32b0b48 Sasha Neftin 2018-06-24 2484 if (netif_carrier_ok(netdev)) {
d32b0b48 Sasha Neftin 2018-06-24 2485 adapter->link_speed = 0;
d32b0b48 Sasha Neftin 2018-06-24 2486 adapter->link_duplex = 0;
d32b0b48 Sasha Neftin 2018-06-24 2487
d32b0b48 Sasha Neftin 2018-06-24 2488 /* Links status message must follow this format */
d32b0b48 Sasha Neftin 2018-06-24 2489 netdev_info(netdev, "igc: %s NIC Link is Down\n",
d32b0b48 Sasha Neftin 2018-06-24 2490 netdev->name);
d32b0b48 Sasha Neftin 2018-06-24 2491 netif_carrier_off(netdev);
d32b0b48 Sasha Neftin 2018-06-24 2492
d32b0b48 Sasha Neftin 2018-06-24 2493 /* link state has changed, schedule phy info update */
d32b0b48 Sasha Neftin 2018-06-24 2494 if (!test_bit(__IGC_DOWN, &adapter->state))
d32b0b48 Sasha Neftin 2018-06-24 2495 mod_timer(&adapter->phy_info_timer,
d32b0b48 Sasha Neftin 2018-06-24 2496 round_jiffies(jiffies + 2 * HZ));
d32b0b48 Sasha Neftin 2018-06-24 2497
d32b0b48 Sasha Neftin 2018-06-24 2498 /* link is down, time to check for alternate media */
d32b0b48 Sasha Neftin 2018-06-24 2499 if (adapter->flags & IGC_FLAG_MAS_ENABLE) {
d32b0b48 Sasha Neftin 2018-06-24 2500 igc_check_swap_media(adapter);
d32b0b48 Sasha Neftin 2018-06-24 2501 if (adapter->flags & IGC_FLAG_MEDIA_RESET) {
d32b0b48 Sasha Neftin 2018-06-24 2502 schedule_work(&adapter->reset_task);
d32b0b48 Sasha Neftin 2018-06-24 2503 /* return immediately */
d32b0b48 Sasha Neftin 2018-06-24 2504 return;
d32b0b48 Sasha Neftin 2018-06-24 2505 }
d32b0b48 Sasha Neftin 2018-06-24 2506 }
d32b0b48 Sasha Neftin 2018-06-24 2507
d32b0b48 Sasha Neftin 2018-06-24 2508 /* also check for alternate media here */
d32b0b48 Sasha Neftin 2018-06-24 2509 } else if (!netif_carrier_ok(netdev) &&
d32b0b48 Sasha Neftin 2018-06-24 2510 (adapter->flags & IGC_FLAG_MAS_ENABLE)) {
d32b0b48 Sasha Neftin 2018-06-24 2511 igc_check_swap_media(adapter);
d32b0b48 Sasha Neftin 2018-06-24 2512 if (adapter->flags & IGC_FLAG_MEDIA_RESET) {
d32b0b48 Sasha Neftin 2018-06-24 2513 schedule_work(&adapter->reset_task);
d32b0b48 Sasha Neftin 2018-06-24 2514 /* return immediately */
d32b0b48 Sasha Neftin 2018-06-24 2515 return;
d32b0b48 Sasha Neftin 2018-06-24 2516 }
d32b0b48 Sasha Neftin 2018-06-24 2517 }
d32b0b48 Sasha Neftin 2018-06-24 2518 }
d32b0b48 Sasha Neftin 2018-06-24 2519
d32b0b48 Sasha Neftin 2018-06-24 2520 spin_lock(&adapter->stats64_lock);
d32b0b48 Sasha Neftin 2018-06-24 2521 igc_update_stats(adapter);
d32b0b48 Sasha Neftin 2018-06-24 2522 spin_unlock(&adapter->stats64_lock);
d32b0b48 Sasha Neftin 2018-06-24 2523
d32b0b48 Sasha Neftin 2018-06-24 2524 for (i = 0; i < adapter->num_tx_queues; i++) {
d32b0b48 Sasha Neftin 2018-06-24 2525 struct igc_ring *tx_ring = adapter->tx_ring[i];
d32b0b48 Sasha Neftin 2018-06-24 2526
d32b0b48 Sasha Neftin 2018-06-24 2527 if (!netif_carrier_ok(netdev)) {
d32b0b48 Sasha Neftin 2018-06-24 2528 /* We've lost link, so the controller stops DMA,
d32b0b48 Sasha Neftin 2018-06-24 2529 * but we've got queued Tx work that's never going
d32b0b48 Sasha Neftin 2018-06-24 2530 * to get done, so reset controller to flush Tx.
d32b0b48 Sasha Neftin 2018-06-24 2531 * (Do the reset outside of interrupt context).
d32b0b48 Sasha Neftin 2018-06-24 2532 */
d32b0b48 Sasha Neftin 2018-06-24 2533 if (igc_desc_unused(tx_ring) + 1 < tx_ring->count) {
d32b0b48 Sasha Neftin 2018-06-24 2534 adapter->tx_timeout_count++;
d32b0b48 Sasha Neftin 2018-06-24 2535 schedule_work(&adapter->reset_task);
d32b0b48 Sasha Neftin 2018-06-24 2536 /* return immediately since reset is imminent */
d32b0b48 Sasha Neftin 2018-06-24 2537 return;
d32b0b48 Sasha Neftin 2018-06-24 2538 }
d32b0b48 Sasha Neftin 2018-06-24 2539 }
d32b0b48 Sasha Neftin 2018-06-24 2540
d32b0b48 Sasha Neftin 2018-06-24 2541 /* Force detection of hung controller every watchdog period */
d32b0b48 Sasha Neftin 2018-06-24 2542 set_bit(IGC_RING_FLAG_TX_DETECT_HANG, &tx_ring->flags);
d32b0b48 Sasha Neftin 2018-06-24 2543 }
d32b0b48 Sasha Neftin 2018-06-24 2544
d32b0b48 Sasha Neftin 2018-06-24 2545 /* Cause software interrupt to ensure Rx ring is cleaned */
d32b0b48 Sasha Neftin 2018-06-24 2546 if (adapter->flags & IGC_FLAG_HAS_MSIX) {
d32b0b48 Sasha Neftin 2018-06-24 2547 u32 eics = 0;
d32b0b48 Sasha Neftin 2018-06-24 2548
d32b0b48 Sasha Neftin 2018-06-24 2549 for (i = 0; i < adapter->num_q_vectors; i++)
d32b0b48 Sasha Neftin 2018-06-24 2550 eics |= adapter->q_vector[i]->eims_value;
d32b0b48 Sasha Neftin 2018-06-24 2551 wr32(E1000_EICS, eics);
d32b0b48 Sasha Neftin 2018-06-24 2552 } else {
d32b0b48 Sasha Neftin 2018-06-24 2553 wr32(E1000_ICS, E1000_ICS_RXDMT0);
d32b0b48 Sasha Neftin 2018-06-24 2554 }
d32b0b48 Sasha Neftin 2018-06-24 2555
d32b0b48 Sasha Neftin 2018-06-24 2556 /* Reset the timer */
d32b0b48 Sasha Neftin 2018-06-24 2557 if (!test_bit(__IGC_DOWN, &adapter->state)) {
d32b0b48 Sasha Neftin 2018-06-24 2558 if (adapter->flags & IGC_FLAG_NEED_LINK_UPDATE)
d32b0b48 Sasha Neftin 2018-06-24 2559 mod_timer(&adapter->watchdog_timer,
d32b0b48 Sasha Neftin 2018-06-24 2560 round_jiffies(jiffies + HZ));
d32b0b48 Sasha Neftin 2018-06-24 2561 else
d32b0b48 Sasha Neftin 2018-06-24 2562 mod_timer(&adapter->watchdog_timer,
d32b0b48 Sasha Neftin 2018-06-24 2563 round_jiffies(jiffies + 2 * HZ));
d32b0b48 Sasha Neftin 2018-06-24 2564 }
d32b0b48 Sasha Neftin 2018-06-24 2565 }
d32b0b48 Sasha Neftin 2018-06-24 2566
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
More information about the Intel-wired-lan
mailing list