WARN_ONCE on querying ecdev before ecdev_offer for e1000

This commit is contained in:
Bjarne von Horn 2024-02-16 17:17:25 +01:00
parent c2c4a1b27f
commit 45b526e99f
5 changed files with 150 additions and 124 deletions

View File

@ -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 := \

View File

@ -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,

View File

@ -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,

View File

@ -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);
}

View File

@ -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);
}