From 45b526e99f054a31f2f849d28ebe3643a813de18 Mon Sep 17 00:00:00 2001 From: Bjarne von Horn Date: Fri, 16 Feb 2024 17:17:25 +0100 Subject: [PATCH] WARN_ONCE on querying ecdev before ecdev_offer for e1000 --- devices/e1000/Kbuild.in | 4 + devices/e1000/e1000-5.14-ethercat.h | 11 +- devices/e1000/e1000-6.1-ethercat.h | 11 +- devices/e1000/e1000_main-5.14-ethercat.c | 124 ++++++++++++----------- devices/e1000/e1000_main-6.1-ethercat.c | 124 ++++++++++++----------- 5 files changed, 150 insertions(+), 124 deletions(-) diff --git a/devices/e1000/Kbuild.in b/devices/e1000/Kbuild.in index b3738dd8..1bf2fd9a 100644 --- a/devices/e1000/Kbuild.in +++ b/devices/e1000/Kbuild.in @@ -43,6 +43,10 @@ ifeq (@ENABLE_E1000@,1) obj-m += ec_e1000.o ec_e1000-objs := $(EC_E1000_OBJ) CFLAGS_e1000_main-@KERNEL_E1000@-ethercat.o = -DREV=$(REV) + + ifeq (@ENABLE_DRIVER_RESOURCE_VERIFYING@,1) + ccflags-y := -DEC_ENABLE_DRIVER_RESOURCE_VERIFYING + endif endif KBUILD_EXTRA_SYMBOLS := \ diff --git a/devices/e1000/e1000-5.14-ethercat.h b/devices/e1000/e1000-5.14-ethercat.h index 71aa37ad..f25cd253 100644 --- a/devices/e1000/e1000-5.14-ethercat.h +++ b/devices/e1000/e1000-5.14-ethercat.h @@ -303,11 +303,20 @@ struct e1000_adapter { struct delayed_work fifo_stall_task; struct delayed_work phy_info_task; - ec_device_t *ecdev; + ec_device_t *ecdev_; unsigned long ec_watchdog_jiffies; struct irq_work ec_watchdog_kicker; + bool ecdev_initialized; }; +static inline ec_device_t *get_ecdev(struct e1000_adapter *adapter) +{ +#ifdef EC_ENABLE_DRIVER_RESOURCE_VERIFYING + WARN_ON(!adapter->ecdev_initialized); +#endif + return adapter->ecdev_; +} + enum e1000_state_t { __E1000_TESTING, __E1000_RESETTING, diff --git a/devices/e1000/e1000-6.1-ethercat.h b/devices/e1000/e1000-6.1-ethercat.h index 0769b47c..9e986c25 100644 --- a/devices/e1000/e1000-6.1-ethercat.h +++ b/devices/e1000/e1000-6.1-ethercat.h @@ -303,11 +303,20 @@ struct e1000_adapter { struct delayed_work fifo_stall_task; struct delayed_work phy_info_task; - ec_device_t *ecdev; + ec_device_t *ecdev_; unsigned long ec_watchdog_jiffies; struct irq_work ec_watchdog_kicker; + bool ecdev_initialized; }; +static inline ec_device_t *get_ecdev(struct e1000_adapter *adapter) +{ +#ifdef EC_ENABLE_DRIVER_RESOURCE_VERIFYING + WARN_ON(!adapter->ecdev_initialized); +#endif + return adapter->ecdev_; +} + enum e1000_state_t { __E1000_TESTING, __E1000_RESETTING, diff --git a/devices/e1000/e1000_main-5.14-ethercat.c b/devices/e1000/e1000_main-5.14-ethercat.c index 2fe1e6ca..128d353e 100644 --- a/devices/e1000/e1000_main-5.14-ethercat.c +++ b/devices/e1000/e1000_main-5.14-ethercat.c @@ -271,7 +271,7 @@ static int e1000_request_irq(struct e1000_adapter *adapter) int irq_flags = IRQF_SHARED; int err; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return 0; } @@ -288,7 +288,7 @@ static void e1000_free_irq(struct e1000_adapter *adapter) { struct net_device *netdev = adapter->netdev; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return; } @@ -303,7 +303,7 @@ static void e1000_irq_disable(struct e1000_adapter *adapter) { struct e1000_hw *hw = &adapter->hw; - if (adapter->ecdev) { + if (!adapter->ecdev_) { return; } @@ -320,7 +320,7 @@ static void e1000_irq_enable(struct e1000_adapter *adapter) { struct e1000_hw *hw = &adapter->hw; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return; } @@ -407,7 +407,7 @@ static void e1000_configure(struct e1000_adapter *adapter) */ for (i = 0; i < adapter->num_rx_queues; i++) { struct e1000_rx_ring *ring = &adapter->rx_ring[i]; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { /* fill rx ring completely! */ adapter->alloc_rx_buf(adapter, ring, ring->count); } else { @@ -427,7 +427,7 @@ int e1000_up(struct e1000_adapter *adapter) clear_bit(__E1000_DOWN, &adapter->flags); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { napi_enable(&adapter->napi); e1000_irq_enable(adapter); @@ -516,13 +516,13 @@ static void e1000_down_and_stop(struct e1000_adapter *adapter) * still running after the adapter has been turned down. */ - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { cancel_delayed_work_sync(&adapter->phy_info_task); cancel_delayed_work_sync(&adapter->fifo_stall_task); } /* Only kill reset task if adapter is not resetting */ - if (!adapter->ecdev && !test_bit(__E1000_RESETTING, &adapter->flags)) + if (!get_ecdev(adapter) && !test_bit(__E1000_RESETTING, &adapter->flags)) cancel_work_sync(&adapter->reset_task); } @@ -537,7 +537,7 @@ void e1000_down(struct e1000_adapter *adapter) ew32(RCTL, rctl & ~E1000_RCTL_EN); /* flush and sleep below */ - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { netif_tx_disable(netdev); } @@ -557,7 +557,7 @@ void e1000_down(struct e1000_adapter *adapter) * in the hardware until the next IFF_DOWN+IFF_UP cycle. */ - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { netif_carrier_off(netdev); napi_disable(&adapter->napi); @@ -1012,6 +1012,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE); adapter->bars = bars; adapter->need_ioport = need_ioport; + adapter->ecdev_initialized = 0; hw = &adapter->hw; hw->back = adapter; @@ -1246,12 +1247,13 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) e1000_reset(adapter); // offer device to EtherCAT master module - adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); - if (adapter->ecdev) { + adapter->ecdev_ = ecdev_offer(netdev, ec_poll, THIS_MODULE); + adapter->ecdev_initialized = 1; + if (get_ecdev(adapter)) { init_irq_work(&adapter->ec_watchdog_kicker, ec_kick_watchdog); - err = ecdev_open(adapter->ecdev); + err = ecdev_open(get_ecdev(adapter)); if (err) { - ecdev_withdraw(adapter->ecdev); + ecdev_withdraw(get_ecdev(adapter)); goto err_register; } } else { @@ -1273,7 +1275,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ((hw->bus_width == e1000_bus_width_64) ? 64 : 32), netdev->dev_addr); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { /* carrier off reporting is important to ethtool even BEFORE open */ netif_carrier_off(netdev); } @@ -1323,15 +1325,15 @@ static void e1000_remove(struct pci_dev *pdev) struct e1000_hw *hw = &adapter->hw; bool disable_dev; - if (adapter->ecdev) + if (get_ecdev(adapter)) irq_work_sync(&adapter->ec_watchdog_kicker); e1000_down_and_stop(adapter); e1000_release_manageability(adapter); - if (adapter->ecdev) { - ecdev_close(adapter->ecdev); - ecdev_withdraw(adapter->ecdev); + if (get_ecdev(adapter)) { + ecdev_close(get_ecdev(adapter)); + ecdev_withdraw(get_ecdev(adapter)); } else { unregister_netdev(netdev); } @@ -1464,7 +1466,7 @@ int e1000_open(struct net_device *netdev) /* From here on the code is the same as e1000_up() */ clear_bit(__E1000_DOWN, &adapter->flags); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { napi_enable(&adapter->napi); e1000_irq_enable(adapter); @@ -1926,7 +1928,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter) struct e1000_hw *hw = &adapter->hw; u32 rdlen, rctl, rxcsum; - if (!adapter->ecdev && adapter->netdev->mtu > ETH_DATA_LEN) { + if (!get_ecdev(adapter) && adapter->netdev->mtu > ETH_DATA_LEN) { rdlen = adapter->rx_ring[0].count * sizeof(struct e1000_rx_desc); adapter->clean_rx = e1000_clean_jumbo_rx_irq; @@ -2026,7 +2028,7 @@ static void e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter, struct e1000_tx_buffer *buffer_info) { - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return; } @@ -2236,7 +2238,7 @@ static void e1000_enter_82542_rst(struct e1000_adapter *adapter) E1000_WRITE_FLUSH(); mdelay(5); - if (!adapter->ecdev && netif_running(netdev)) + if (!get_ecdev(adapter) && netif_running(netdev)) e1000_clean_all_rx_rings(adapter); } @@ -2259,7 +2261,7 @@ static void e1000_leave_82542_rst(struct e1000_adapter *adapter) /* No need to loop, because 82542 supports only 1 queue */ struct e1000_rx_ring *ring = &adapter->rx_ring[0]; e1000_configure_rx(adapter); - if (adapter->ecdev) { + if (get_ecdev(adapter)) { /* fill rx ring completely! */ adapter->alloc_rx_buf(adapter, ring, ring->count); } else { @@ -2519,12 +2521,12 @@ static void e1000_watchdog(struct work_struct *work) u32 link, tctl; link = e1000_has_link(adapter); - if (!adapter->ecdev && (netif_carrier_ok(netdev)) && link) + if (!get_ecdev(adapter) && (netif_carrier_ok(netdev)) && link) goto link_up; if (link) { - if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) || - (!adapter->ecdev && !netif_carrier_ok(netdev))) { + if ((get_ecdev(adapter) && !ecdev_get_link(get_ecdev(adapter))) || + (!get_ecdev(adapter) && !netif_carrier_ok(netdev))) { u32 ctrl; /* update snapshot of PHY registers on LSC */ e1000_get_speed_and_duplex(hw, @@ -2559,8 +2561,8 @@ static void e1000_watchdog(struct work_struct *work) tctl |= E1000_TCTL_EN; ew32(TCTL, tctl); - if (adapter->ecdev) { - ecdev_set_link(adapter->ecdev, 1); + if (get_ecdev(adapter)) { + ecdev_set_link(get_ecdev(adapter), 1); } else { netif_carrier_on(netdev); @@ -2571,15 +2573,15 @@ static void e1000_watchdog(struct work_struct *work) adapter->smartspeed = 0; } } else { - if ((adapter->ecdev && ecdev_get_link(adapter->ecdev)) - || (!adapter->ecdev && netif_carrier_ok(netdev))) { + if ((get_ecdev(adapter) && ecdev_get_link(get_ecdev(adapter))) + || (!get_ecdev(adapter) && netif_carrier_ok(netdev))) { adapter->link_speed = 0; adapter->link_duplex = 0; pr_info("%s NIC Link is Down\n", netdev->name); - if (adapter->ecdev) { - ecdev_set_link(adapter->ecdev, 0); + if (get_ecdev(adapter)) { + ecdev_set_link(get_ecdev(adapter), 0); } else { netif_carrier_off(netdev); @@ -2607,7 +2609,7 @@ link_up: e1000_update_adaptive(hw); - if (!adapter->ecdev && !netif_carrier_ok(netdev)) { + if (!get_ecdev(adapter) && !netif_carrier_ok(netdev)) { if (E1000_DESC_UNUSED(txdr) + 1 < txdr->count) { /* We've lost link, so the controller stops DMA, * but we've got queued Tx work that's never going @@ -2643,7 +2645,7 @@ link_up: adapter->detect_tx_hung = true; /* Reschedule the task */ - if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->flags)) + if (!get_ecdev(adapter) && !test_bit(__E1000_DOWN, &adapter->flags)) schedule_delayed_work(&adapter->watchdog_task, 2 * HZ); } @@ -3164,7 +3166,7 @@ static int __e1000_maybe_stop_tx(struct net_device *netdev, int size) struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_tx_ring *tx_ring = adapter->tx_ring; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return -EBUSY; } @@ -3260,7 +3262,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, if (!__pskb_pull_tail(skb, pull_size)) { e_err(drv, "__pskb_pull_tail " "failed.\n"); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { dev_kfree_skb_any(skb); } return NETDEV_TX_OK; @@ -3311,7 +3313,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, if (unlikely((hw->mac_type == e1000_82547) && (e1000_82547_fifo_workaround(adapter, skb)))) { - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { netif_stop_queue(netdev); if (!test_bit(__E1000_DOWN, &adapter->flags)) schedule_delayed_work(&adapter->fifo_stall_task, 1); @@ -3329,7 +3331,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, tso = e1000_tso(adapter, tx_ring, skb, protocol); if (tso < 0) { - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { dev_kfree_skb_any(skb); } return NETDEV_TX_OK; @@ -3361,7 +3363,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, */ int desc_needed = MAX_SKB_FRAGS + 7; - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { netdev_sent_queue(netdev, skb->len); skb_tx_timestamp(skb); } @@ -3378,12 +3380,12 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, /* Make sure there is space in the ring for the next send. */ e1000_maybe_stop_tx(netdev, tx_ring, desc_needed); - if (adapter->ecdev || !netdev_xmit_more() || + if (get_ecdev(adapter) || !netdev_xmit_more() || netif_xmit_stopped(netdev_get_tx_queue(netdev, 0))) { writel(tx_ring->next_to_use, hw->hw_addr + tx_ring->tdt); } } else { - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { dev_kfree_skb_any(skb); } tx_ring->buffer_info[first].time_stamp = 0; @@ -3634,7 +3636,7 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) struct e1000_hw *hw = &adapter->hw; int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return -EBUSY; } @@ -3720,7 +3722,7 @@ void e1000_update_stats(struct e1000_adapter *adapter) if (pci_channel_offline(pdev)) return; - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { spin_lock_irqsave(&adapter->stats_lock, flags); } @@ -3851,7 +3853,7 @@ void e1000_update_stats(struct e1000_adapter *adapter) adapter->stats.mgpdc += er32(MGTPDC); } - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { spin_unlock_irqrestore(&adapter->stats_lock, flags); } } @@ -3900,11 +3902,11 @@ static irqreturn_t e1000_intr(int irq, void *data) if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) { hw->get_link_status = 1; /* guard against interrupt when we're going down */ - if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->flags)) + if (!get_ecdev(adapter) && !test_bit(__E1000_DOWN, &adapter->flags)) schedule_delayed_work(&adapter->watchdog_task, 1); } - if (adapter->ecdev) { + if (get_ecdev(adapter)) { int i, ec_work_done = 0; for (i = 0; i < E1000_MAX_INTR; i++) { if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring, @@ -4022,12 +4024,12 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, */ smp_store_release(&tx_ring->next_to_clean, i); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { netdev_completed_queue(netdev, pkts_compl, bytes_compl); } #define TX_WAKE_THRESHOLD 32 - if (!adapter->ecdev && unlikely(count && netif_carrier_ok(netdev) && + if (!get_ecdev(adapter) && unlikely(count && netif_carrier_ok(netdev) && E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD)) { /* Make sure that anybody stopping the queue after this * sees the new next_to_clean. @@ -4041,7 +4043,7 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, } } - if (!adapter->ecdev && adapter->detect_tx_hung) { + if (!get_ecdev(adapter) && adapter->detect_tx_hung) { /* Detect a transmit hang in hardware, this serializes the * check with the clearing of time_stamp and movement of i */ @@ -4529,7 +4531,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, length = le16_to_cpu(rx_desc->length); data = buffer_info->rxbuf.data; - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { prefetch(data); skb = e1000_copybreak(adapter, buffer_info, length, data); if (!skb) { @@ -4573,7 +4575,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, if (adapter->discarding) { /* All receives must fit into a single buffer */ netdev_dbg(netdev, "Receive packet consumed multiple buffers\n"); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { dev_kfree_skb(skb); } if (status & E1000_RXD_STAT_EOP) @@ -4589,7 +4591,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, } else if (netdev->features & NETIF_F_RXALL) { goto process_skb; } else { - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { dev_kfree_skb(skb); } goto next_desc; @@ -4606,7 +4608,7 @@ process_skb: */ length -= 4; - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { if (buffer_info->rxbuf.data == NULL) skb_put(skb, length); else /* copybreak skb */ @@ -4619,10 +4621,10 @@ process_skb: le16_to_cpu(rx_desc->csum), skb); } - if (adapter->ecdev) { + if (get_ecdev(adapter)) { dma_sync_single_for_cpu(&adapter->pdev->dev, buffer_info->dma, adapter->rx_buffer_len, DMA_FROM_DEVICE); - ecdev_receive(adapter->ecdev, data, length); + ecdev_receive(get_ecdev(adapter), data, length); // No need to detect link status as // long as frames are received: Reset watchdog. @@ -4941,7 +4943,7 @@ static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, data->phy_id = hw->phy_addr; break; case SIOCGMIIREG: - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return -EPERM; } spin_lock_irqsave(&adapter->stats_lock, flags); @@ -4953,7 +4955,7 @@ static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, spin_unlock_irqrestore(&adapter->stats_lock, flags); break; case SIOCSMIIREG: - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return -EPERM; } if (data->reg_num & ~(0x1F)) @@ -5243,7 +5245,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake) u32 ctrl, ctrl_ext, rctl, status; u32 wufc = adapter->wol; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return -EBUSY; } @@ -5339,7 +5341,7 @@ static int __maybe_unused e1000_resume(struct device *dev) struct e1000_hw *hw = &adapter->hw; u32 err; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return -EBUSY; } @@ -5375,7 +5377,7 @@ static int __maybe_unused e1000_resume(struct device *dev) if (netif_running(netdev)) e1000_up(adapter); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { netif_device_attach(netdev); } diff --git a/devices/e1000/e1000_main-6.1-ethercat.c b/devices/e1000/e1000_main-6.1-ethercat.c index e9514e51..8d8518ac 100644 --- a/devices/e1000/e1000_main-6.1-ethercat.c +++ b/devices/e1000/e1000_main-6.1-ethercat.c @@ -260,7 +260,7 @@ static int e1000_request_irq(struct e1000_adapter *adapter) int irq_flags = IRQF_SHARED; int err; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return 0; } @@ -277,7 +277,7 @@ static void e1000_free_irq(struct e1000_adapter *adapter) { struct net_device *netdev = adapter->netdev; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return; } @@ -292,7 +292,7 @@ static void e1000_irq_disable(struct e1000_adapter *adapter) { struct e1000_hw *hw = &adapter->hw; - if (adapter->ecdev) { + if (adapter->ecdev_) { return; } @@ -309,7 +309,7 @@ static void e1000_irq_enable(struct e1000_adapter *adapter) { struct e1000_hw *hw = &adapter->hw; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return; } @@ -396,7 +396,7 @@ static void e1000_configure(struct e1000_adapter *adapter) */ for (i = 0; i < adapter->num_rx_queues; i++) { struct e1000_rx_ring *ring = &adapter->rx_ring[i]; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { /* fill rx ring completely! */ adapter->alloc_rx_buf(adapter, ring, ring->count); } else { @@ -416,7 +416,7 @@ int e1000_up(struct e1000_adapter *adapter) clear_bit(__E1000_DOWN, &adapter->flags); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { napi_enable(&adapter->napi); e1000_irq_enable(adapter); @@ -505,13 +505,13 @@ static void e1000_down_and_stop(struct e1000_adapter *adapter) * still running after the adapter has been turned down. */ - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { cancel_delayed_work_sync(&adapter->phy_info_task); cancel_delayed_work_sync(&adapter->fifo_stall_task); } /* Only kill reset task if adapter is not resetting */ - if (!adapter->ecdev && !test_bit(__E1000_RESETTING, &adapter->flags)) + if (!get_ecdev(adapter) && !test_bit(__E1000_RESETTING, &adapter->flags)) cancel_work_sync(&adapter->reset_task); } @@ -526,7 +526,7 @@ void e1000_down(struct e1000_adapter *adapter) ew32(RCTL, rctl & ~E1000_RCTL_EN); /* flush and sleep below */ - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { netif_tx_disable(netdev); } @@ -546,7 +546,7 @@ void e1000_down(struct e1000_adapter *adapter) * in the hardware until the next IFF_DOWN+IFF_UP cycle. */ - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { netif_carrier_off(netdev); napi_disable(&adapter->napi); @@ -1001,6 +1001,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE); adapter->bars = bars; adapter->need_ioport = need_ioport; + adapter->ecdev_initialized = 0; hw = &adapter->hw; hw->back = adapter; @@ -1231,12 +1232,13 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) e1000_reset(adapter); // offer device to EtherCAT master module - adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); - if (adapter->ecdev) { + adapter->ecdev_ = ecdev_offer(netdev, ec_poll, THIS_MODULE); + adapter->ecdev_initialized = 1; + if (get_ecdev(adapter)) { init_irq_work(&adapter->ec_watchdog_kicker, ec_kick_watchdog); - err = ecdev_open(adapter->ecdev); + err = ecdev_open(get_ecdev(adapter)); if (err) { - ecdev_withdraw(adapter->ecdev); + ecdev_withdraw(get_ecdev(adapter)); goto err_register; } } else { @@ -1258,7 +1260,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ((hw->bus_width == e1000_bus_width_64) ? 64 : 32), netdev->dev_addr); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { /* carrier off reporting is important to ethtool even BEFORE open */ netif_carrier_off(netdev); } @@ -1308,15 +1310,15 @@ static void e1000_remove(struct pci_dev *pdev) struct e1000_hw *hw = &adapter->hw; bool disable_dev; - if (adapter->ecdev) + if (get_ecdev(adapter)) irq_work_sync(&adapter->ec_watchdog_kicker); e1000_down_and_stop(adapter); e1000_release_manageability(adapter); - if (adapter->ecdev) { - ecdev_close(adapter->ecdev); - ecdev_withdraw(adapter->ecdev); + if (get_ecdev(adapter)) { + ecdev_close(get_ecdev(adapter)); + ecdev_withdraw(get_ecdev(adapter)); } else { unregister_netdev(netdev); } @@ -1449,7 +1451,7 @@ int e1000_open(struct net_device *netdev) /* From here on the code is the same as e1000_up() */ clear_bit(__E1000_DOWN, &adapter->flags); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { napi_enable(&adapter->napi); e1000_irq_enable(adapter); @@ -1911,7 +1913,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter) struct e1000_hw *hw = &adapter->hw; u32 rdlen, rctl, rxcsum; - if (!adapter->ecdev && adapter->netdev->mtu > ETH_DATA_LEN) { + if (!get_ecdev(adapter) && adapter->netdev->mtu > ETH_DATA_LEN) { rdlen = adapter->rx_ring[0].count * sizeof(struct e1000_rx_desc); adapter->clean_rx = e1000_clean_jumbo_rx_irq; @@ -2012,7 +2014,7 @@ e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter, struct e1000_tx_buffer *buffer_info, int budget) { - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return; } @@ -2222,7 +2224,7 @@ static void e1000_enter_82542_rst(struct e1000_adapter *adapter) E1000_WRITE_FLUSH(); mdelay(5); - if (!adapter->ecdev && netif_running(netdev)) + if (!get_ecdev(adapter) && netif_running(netdev)) e1000_clean_all_rx_rings(adapter); } @@ -2245,7 +2247,7 @@ static void e1000_leave_82542_rst(struct e1000_adapter *adapter) /* No need to loop, because 82542 supports only 1 queue */ struct e1000_rx_ring *ring = &adapter->rx_ring[0]; e1000_configure_rx(adapter); - if (adapter->ecdev) { + if (get_ecdev(adapter)) { /* fill rx ring completely! */ adapter->alloc_rx_buf(adapter, ring, ring->count); } else { @@ -2501,12 +2503,12 @@ static void e1000_watchdog(struct work_struct *work) u32 link, tctl; link = e1000_has_link(adapter); - if (!adapter->ecdev && (netif_carrier_ok(netdev)) && link) + if (!get_ecdev(adapter) && (netif_carrier_ok(netdev)) && link) goto link_up; if (link) { - if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) || - (!adapter->ecdev && !netif_carrier_ok(netdev))) { + if ((get_ecdev(adapter) && !ecdev_get_link(get_ecdev(adapter))) || + (!get_ecdev(adapter) && !netif_carrier_ok(netdev))) { u32 ctrl; /* update snapshot of PHY registers on LSC */ e1000_get_speed_and_duplex(hw, @@ -2541,8 +2543,8 @@ static void e1000_watchdog(struct work_struct *work) tctl |= E1000_TCTL_EN; ew32(TCTL, tctl); - if (adapter->ecdev) { - ecdev_set_link(adapter->ecdev, 1); + if (get_ecdev(adapter)) { + ecdev_set_link(get_ecdev(adapter), 1); } else { netif_carrier_on(netdev); @@ -2553,15 +2555,15 @@ static void e1000_watchdog(struct work_struct *work) adapter->smartspeed = 0; } } else { - if ((adapter->ecdev && ecdev_get_link(adapter->ecdev)) - || (!adapter->ecdev && netif_carrier_ok(netdev))) { + if ((get_ecdev(adapter) && ecdev_get_link(get_ecdev(adapter))) + || (!get_ecdev(adapter) && netif_carrier_ok(netdev))) { adapter->link_speed = 0; adapter->link_duplex = 0; pr_info("%s NIC Link is Down\n", netdev->name); - if (adapter->ecdev) { - ecdev_set_link(adapter->ecdev, 0); + if (get_ecdev(adapter)) { + ecdev_set_link(get_ecdev(adapter), 0); } else { netif_carrier_off(netdev); @@ -2589,7 +2591,7 @@ link_up: e1000_update_adaptive(hw); - if (!adapter->ecdev && !netif_carrier_ok(netdev)) { + if (!get_ecdev(adapter) && !netif_carrier_ok(netdev)) { if (E1000_DESC_UNUSED(txdr) + 1 < txdr->count) { /* We've lost link, so the controller stops DMA, * but we've got queued Tx work that's never going @@ -2625,7 +2627,7 @@ link_up: adapter->detect_tx_hung = true; /* Reschedule the task */ - if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->flags)) + if (!get_ecdev(adapter) && !test_bit(__E1000_DOWN, &adapter->flags)) schedule_delayed_work(&adapter->watchdog_task, 2 * HZ); } @@ -3146,7 +3148,7 @@ static int __e1000_maybe_stop_tx(struct net_device *netdev, int size) struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_tx_ring *tx_ring = adapter->tx_ring; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return -EBUSY; } @@ -3242,7 +3244,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, if (!__pskb_pull_tail(skb, pull_size)) { e_err(drv, "__pskb_pull_tail " "failed.\n"); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { dev_kfree_skb_any(skb); } return NETDEV_TX_OK; @@ -3293,7 +3295,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, if (unlikely((hw->mac_type == e1000_82547) && (e1000_82547_fifo_workaround(adapter, skb)))) { - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { netif_stop_queue(netdev); if (!test_bit(__E1000_DOWN, &adapter->flags)) schedule_delayed_work(&adapter->fifo_stall_task, 1); @@ -3311,7 +3313,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, tso = e1000_tso(adapter, tx_ring, skb, protocol); if (tso < 0) { - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { dev_kfree_skb_any(skb); } return NETDEV_TX_OK; @@ -3343,7 +3345,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, */ int desc_needed = MAX_SKB_FRAGS + 7; - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { netdev_sent_queue(netdev, skb->len); skb_tx_timestamp(skb); } @@ -3360,12 +3362,12 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, /* Make sure there is space in the ring for the next send. */ e1000_maybe_stop_tx(netdev, tx_ring, desc_needed); - if (adapter->ecdev || !netdev_xmit_more() || + if (get_ecdev(adapter) || !netdev_xmit_more() || netif_xmit_stopped(netdev_get_tx_queue(netdev, 0))) { writel(tx_ring->next_to_use, hw->hw_addr + tx_ring->tdt); } } else { - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { dev_kfree_skb_any(skb); } tx_ring->buffer_info[first].time_stamp = 0; @@ -3616,7 +3618,7 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) struct e1000_hw *hw = &adapter->hw; int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return -EBUSY; } @@ -3702,7 +3704,7 @@ void e1000_update_stats(struct e1000_adapter *adapter) if (pci_channel_offline(pdev)) return; - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { spin_lock_irqsave(&adapter->stats_lock, flags); } @@ -3833,7 +3835,7 @@ void e1000_update_stats(struct e1000_adapter *adapter) adapter->stats.mgpdc += er32(MGTPDC); } - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { spin_unlock_irqrestore(&adapter->stats_lock, flags); } } @@ -3882,11 +3884,11 @@ static irqreturn_t e1000_intr(int irq, void *data) if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) { hw->get_link_status = 1; /* guard against interrupt when we're going down */ - if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->flags)) + if (!get_ecdev(adapter) && !test_bit(__E1000_DOWN, &adapter->flags)) schedule_delayed_work(&adapter->watchdog_task, 1); } - if (adapter->ecdev) { + if (get_ecdev(adapter)) { int i, ec_work_done = 0; for (i = 0; i < E1000_MAX_INTR; i++) { if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring, @@ -4005,12 +4007,12 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, */ smp_store_release(&tx_ring->next_to_clean, i); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { netdev_completed_queue(netdev, pkts_compl, bytes_compl); } #define TX_WAKE_THRESHOLD 32 - if (!adapter->ecdev && unlikely(count && netif_carrier_ok(netdev) && + if (!get_ecdev(adapter) && unlikely(count && netif_carrier_ok(netdev) && E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD)) { /* Make sure that anybody stopping the queue after this * sees the new next_to_clean. @@ -4024,7 +4026,7 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, } } - if (!adapter->ecdev && adapter->detect_tx_hung) { + if (!get_ecdev(adapter) && adapter->detect_tx_hung) { /* Detect a transmit hang in hardware, this serializes the * check with the clearing of time_stamp and movement of i */ @@ -4512,7 +4514,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, length = le16_to_cpu(rx_desc->length); data = buffer_info->rxbuf.data; - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { prefetch(data); skb = e1000_copybreak(adapter, buffer_info, length, data); if (!skb) { @@ -4556,7 +4558,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, if (adapter->discarding) { /* All receives must fit into a single buffer */ netdev_dbg(netdev, "Receive packet consumed multiple buffers\n"); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { dev_kfree_skb(skb); } if (status & E1000_RXD_STAT_EOP) @@ -4572,7 +4574,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, } else if (netdev->features & NETIF_F_RXALL) { goto process_skb; } else { - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { dev_kfree_skb(skb); } goto next_desc; @@ -4589,7 +4591,7 @@ process_skb: */ length -= 4; - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { if (buffer_info->rxbuf.data == NULL) skb_put(skb, length); else /* copybreak skb */ @@ -4602,10 +4604,10 @@ process_skb: le16_to_cpu(rx_desc->csum), skb); } - if (adapter->ecdev) { + if (get_ecdev(adapter)) { dma_sync_single_for_cpu(&adapter->pdev->dev, buffer_info->dma, adapter->rx_buffer_len, DMA_FROM_DEVICE); - ecdev_receive(adapter->ecdev, data, length); + ecdev_receive(get_ecdev(adapter), data, length); // No need to detect link status as // long as frames are received: Reset watchdog. @@ -4924,7 +4926,7 @@ static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, data->phy_id = hw->phy_addr; break; case SIOCGMIIREG: - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return -EPERM; } spin_lock_irqsave(&adapter->stats_lock, flags); @@ -4936,7 +4938,7 @@ static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, spin_unlock_irqrestore(&adapter->stats_lock, flags); break; case SIOCSMIIREG: - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return -EPERM; } if (data->reg_num & ~(0x1F)) @@ -5226,7 +5228,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake) u32 ctrl, ctrl_ext, rctl, status; u32 wufc = adapter->wol; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return -EBUSY; } @@ -5322,7 +5324,7 @@ static int __maybe_unused e1000_resume(struct device *dev) struct e1000_hw *hw = &adapter->hw; u32 err; - if (adapter->ecdev) { + if (get_ecdev(adapter)) { return -EBUSY; } @@ -5358,7 +5360,7 @@ static int __maybe_unused e1000_resume(struct device *dev) if (netif_running(netdev)) e1000_up(adapter); - if (!adapter->ecdev) { + if (!get_ecdev(adapter)) { netif_device_attach(netdev); }