WARN_ONCE on querying ecdev before ecdev_offer for igb

This commit is contained in:
Bjarne von Horn 2024-01-26 16:03:58 +01:00
parent dd7fc5b8eb
commit 188519459f
7 changed files with 178 additions and 141 deletions

View File

@ -37,6 +37,10 @@ REV := $(shell if test -s $(TOPDIR)/revision; then \
ifeq (@ENABLE_IGB@,1) ifeq (@ENABLE_IGB@,1)
obj-m += ec_igb.o obj-m += ec_igb.o
ifeq (@ENABLE_DRIVER_RESOURCE_VERIFYING@,1)
ccflags-y := -DEC_ENABLE_DRIVER_RESOURCE_VERIFYING
endif
ec_igb-objs := \ ec_igb-objs := \
e1000_82575-@KERNEL_IGB@-ethercat.o \ e1000_82575-@KERNEL_IGB@-ethercat.o \
e1000_i210-@KERNEL_IGB@-ethercat.o \ e1000_i210-@KERNEL_IGB@-ethercat.o \

View File

@ -670,11 +670,20 @@ struct igb_adapter {
struct vf_mac_filter *vf_mac_list; struct vf_mac_filter *vf_mac_list;
/* EtherCAT device variables */ /* EtherCAT device variables */
ec_device_t *ecdev; ec_device_t *ecdev_;
unsigned long ec_watchdog_jiffies; unsigned long ec_watchdog_jiffies;
struct irq_work ec_watchdog_kicker; struct irq_work ec_watchdog_kicker;
bool ecdev_initialized;
}; };
static inline ec_device_t *get_ecdev(struct igb_adapter *adapter)
{
#ifdef EC_ENABLE_DRIVER_RESOURCE_VERIFYING
WARN_ON(!adapter->ecdev_initialized);
#endif
return adapter->ecdev_;
}
/* flags controlling PTP/1588 function */ /* flags controlling PTP/1588 function */
#define IGB_PTP_ENABLED BIT(0) #define IGB_PTP_ENABLED BIT(0)
#define IGB_PTP_OVERFLOW_CHECK BIT(1) #define IGB_PTP_OVERFLOW_CHECK BIT(1)

View File

@ -670,11 +670,20 @@ struct igb_adapter {
struct vf_mac_filter *vf_mac_list; struct vf_mac_filter *vf_mac_list;
/* EtherCAT device variables */ /* EtherCAT device variables */
ec_device_t *ecdev; ec_device_t *ecdev_;
unsigned long ec_watchdog_jiffies; unsigned long ec_watchdog_jiffies;
struct irq_work ec_watchdog_kicker; struct irq_work ec_watchdog_kicker;
bool ecdev_initialized;
}; };
static inline ec_device_t *get_ecdev(struct igb_adapter *adapter)
{
#ifdef EC_ENABLE_DRIVER_RESOURCE_VERIFYING
WARN_ON(!adapter->ecdev_initialized);
#endif
return adapter->ecdev_;
}
/* flags controlling PTP/1588 function */ /* flags controlling PTP/1588 function */
#define IGB_PTP_ENABLED BIT(0) #define IGB_PTP_ENABLED BIT(0)
#define IGB_PTP_OVERFLOW_CHECK BIT(1) #define IGB_PTP_OVERFLOW_CHECK BIT(1)

View File

@ -672,11 +672,20 @@ struct igb_adapter {
spinlock_t vfs_lock; spinlock_t vfs_lock;
/* EtherCAT device variables */ /* EtherCAT device variables */
ec_device_t *ecdev; ec_device_t *ecdev_;
unsigned long ec_watchdog_jiffies; unsigned long ec_watchdog_jiffies;
struct irq_work ec_watchdog_kicker; struct irq_work ec_watchdog_kicker;
bool ecdev_initialized;
}; };
static inline ec_device_t *get_ecdev(struct igb_adapter *adapter)
{
#ifdef EC_ENABLE_DRIVER_RESOURCE_VERIFYING
WARN_ON(!adapter->ecdev_initialized);
#endif
return adapter->ecdev_;
}
/* flags controlling PTP/1588 function */ /* flags controlling PTP/1588 function */
#define IGB_PTP_ENABLED BIT(0) #define IGB_PTP_ENABLED BIT(0)
#define IGB_PTP_OVERFLOW_CHECK BIT(1) #define IGB_PTP_OVERFLOW_CHECK BIT(1)

View File

@ -946,7 +946,7 @@ static int igb_request_msix(struct igb_adapter *adapter)
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
int i, err = 0, vector = 0, free_vector = 0; int i, err = 0, vector = 0, free_vector = 0;
if (adapter->ecdev) { if (get_ecdev(adapter)) {
return 0; return 0;
} }
@ -1047,7 +1047,7 @@ static void igb_reset_q_vector(struct igb_adapter *adapter, int v_idx)
if (q_vector->rx.ring) if (q_vector->rx.ring)
adapter->rx_ring[q_vector->rx.ring->queue_index] = NULL; adapter->rx_ring[q_vector->rx.ring->queue_index] = NULL;
if (!adapter->ecdev) if (!get_ecdev(adapter))
netif_napi_del(&q_vector->napi); netif_napi_del(&q_vector->napi);
} }
@ -1229,7 +1229,7 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter,
return -ENOMEM; return -ENOMEM;
/* initialize NAPI */ /* initialize NAPI */
if (!adapter->ecdev) { if (get_ecdev(adapter)) {
netif_napi_add(adapter->netdev, &q_vector->napi, netif_napi_add(adapter->netdev, &q_vector->napi,
igb_poll, 64); igb_poll, 64);
} }
@ -1450,7 +1450,7 @@ static int igb_request_irq(struct igb_adapter *adapter)
igb_assign_vector(adapter->q_vector[0], 0); igb_assign_vector(adapter->q_vector[0], 0);
if (!adapter->ecdev && adapter->flags & IGB_FLAG_HAS_MSI) { if (!get_ecdev(adapter) && adapter->flags & IGB_FLAG_HAS_MSI) {
err = request_irq(pdev->irq, igb_intr_msi, 0, err = request_irq(pdev->irq, igb_intr_msi, 0,
netdev->name, adapter); netdev->name, adapter);
if (!err) if (!err)
@ -1461,7 +1461,7 @@ static int igb_request_irq(struct igb_adapter *adapter)
adapter->flags &= ~IGB_FLAG_HAS_MSI; adapter->flags &= ~IGB_FLAG_HAS_MSI;
} }
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
err = request_irq(pdev->irq, igb_intr, IRQF_SHARED, err = request_irq(pdev->irq, igb_intr, IRQF_SHARED,
netdev->name, adapter); netdev->name, adapter);
@ -1476,7 +1476,7 @@ request_done:
static void igb_free_irq(struct igb_adapter *adapter) static void igb_free_irq(struct igb_adapter *adapter)
{ {
if (adapter->ecdev) if (get_ecdev(adapter))
return; return;
if (adapter->flags & IGB_FLAG_HAS_MSIX) { if (adapter->flags & IGB_FLAG_HAS_MSIX) {
int vector = 0, i; int vector = 0, i;
@ -1516,7 +1516,7 @@ static void igb_irq_disable(struct igb_adapter *adapter)
wr32(E1000_IMC, ~0); wr32(E1000_IMC, ~0);
wrfl(); wrfl();
if (adapter->ecdev) { if (get_ecdev(adapter)) {
/* skip synchronizing IRQs */ /* skip synchronizing IRQs */
return; return;
} }
@ -1538,7 +1538,7 @@ static void igb_irq_enable(struct igb_adapter *adapter)
{ {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
if (adapter->ecdev) if (get_ecdev(adapter))
return; return;
if (adapter->flags & IGB_FLAG_HAS_MSIX) { if (adapter->flags & IGB_FLAG_HAS_MSIX) {
@ -2156,7 +2156,7 @@ int igb_up(struct igb_adapter *adapter)
clear_bit(__IGB_DOWN, &adapter->state); clear_bit(__IGB_DOWN, &adapter->state);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
for (i = 0; i < adapter->num_q_vectors; i++) for (i = 0; i < adapter->num_q_vectors; i++)
napi_enable(&(adapter->q_vector[i]->napi)); napi_enable(&(adapter->q_vector[i]->napi));
} }
@ -2179,7 +2179,7 @@ int igb_up(struct igb_adapter *adapter)
wr32(E1000_CTRL_EXT, reg_data); wr32(E1000_CTRL_EXT, reg_data);
} }
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_tx_start_all_queues(adapter->netdev); netif_tx_start_all_queues(adapter->netdev);
/* start the watchdog. */ /* start the watchdog. */
@ -2213,7 +2213,7 @@ void igb_down(struct igb_adapter *adapter)
igb_nfc_filter_exit(adapter); igb_nfc_filter_exit(adapter);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_carrier_off(netdev); netif_carrier_off(netdev);
netif_tx_stop_all_queues(netdev); netif_tx_stop_all_queues(netdev);
} }
@ -2231,7 +2231,7 @@ void igb_down(struct igb_adapter *adapter)
adapter->flags &= ~IGB_FLAG_NEED_LINK_UPDATE; adapter->flags &= ~IGB_FLAG_NEED_LINK_UPDATE;
for (i = 0; i < adapter->num_q_vectors; i++) { for (i = 0; i < adapter->num_q_vectors; i++) {
if (!adapter->ecdev && adapter->q_vector[i]) { if (!get_ecdev(adapter) && adapter->q_vector[i]) {
napi_synchronize(&adapter->q_vector[i]->napi); napi_synchronize(&adapter->q_vector[i]->napi);
napi_disable(&adapter->q_vector[i]->napi); napi_disable(&adapter->q_vector[i]->napi);
} }
@ -2454,7 +2454,7 @@ void igb_reset(struct igb_adapter *adapter)
break; break;
} }
} }
if (!adapter->ecdev && !netif_running(adapter->netdev)) if (!get_ecdev(adapter) && !netif_running(adapter->netdev))
igb_power_down_link(adapter); igb_power_down_link(adapter);
igb_update_mng_vlan(adapter); igb_update_mng_vlan(adapter);
@ -2918,7 +2918,7 @@ static int igb_xdp_setup(struct net_device *dev, struct netdev_bpf *bpf)
static int igb_xdp(struct net_device *dev, struct netdev_bpf *xdp) static int igb_xdp(struct net_device *dev, struct netdev_bpf *xdp)
{ {
struct igb_adapter *adapter = netdev_priv(dev); struct igb_adapter *adapter = netdev_priv(dev);
if (adapter->ecdev) if (get_ecdev(adapter))
return -EBUSY; return -EBUSY;
@ -2987,7 +2987,7 @@ static int igb_xdp_xmit(struct net_device *dev, int n,
int nxmit = 0; int nxmit = 0;
int i; int i;
if (adapter->ecdev) if (get_ecdev(adapter))
return -EBUSY; return -EBUSY;
if (unlikely(test_bit(__IGB_DOWN, &adapter->state))) if (unlikely(test_bit(__IGB_DOWN, &adapter->state)))
@ -3289,6 +3289,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
adapter = netdev_priv(netdev); adapter = netdev_priv(netdev);
adapter->netdev = netdev; adapter->netdev = netdev;
adapter->pdev = pdev; adapter->pdev = pdev;
adapter->ecdev_initialized = 0;
hw = &adapter->hw; hw = &adapter->hw;
hw->back = adapter; hw->back = adapter;
adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE); adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);
@ -3576,12 +3577,13 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
igb_get_hw_control(adapter); igb_get_hw_control(adapter);
adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); adapter->ecdev_ = ecdev_offer(netdev, ec_poll, THIS_MODULE);
if (adapter->ecdev) { adapter->ecdev_initialized = 1;
if (get_ecdev(adapter)) {
init_irq_work(&adapter->ec_watchdog_kicker, ec_kick_watchdog); init_irq_work(&adapter->ec_watchdog_kicker, ec_kick_watchdog);
err = ecdev_open(adapter->ecdev); err = ecdev_open(get_ecdev(adapter));
if (err) { if (err) {
ecdev_withdraw(adapter->ecdev); ecdev_withdraw(get_ecdev(adapter));
goto err_register; goto err_register;
} }
adapter->ec_watchdog_jiffies = jiffies; adapter->ec_watchdog_jiffies = jiffies;
@ -3881,10 +3883,10 @@ static void igb_remove(struct pci_dev *pdev)
struct igb_adapter *adapter = netdev_priv(netdev); struct igb_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
if (adapter->ecdev) { if (get_ecdev(adapter)) {
ecdev_close(adapter->ecdev); ecdev_close(get_ecdev(adapter));
irq_work_sync(&adapter->ec_watchdog_kicker); irq_work_sync(&adapter->ec_watchdog_kicker);
ecdev_withdraw(adapter->ecdev); ecdev_withdraw(get_ecdev(adapter));
} }
pm_runtime_get_noresume(&pdev->dev); pm_runtime_get_noresume(&pdev->dev);
@ -3921,7 +3923,7 @@ static void igb_remove(struct pci_dev *pdev)
igb_disable_sriov(pdev); igb_disable_sriov(pdev);
#endif #endif
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
unregister_netdev(netdev); unregister_netdev(netdev);
} }
@ -4164,8 +4166,8 @@ static int __igb_open(struct net_device *netdev, bool resuming)
if (!resuming) if (!resuming)
pm_runtime_get_sync(&pdev->dev); pm_runtime_get_sync(&pdev->dev);
if (adapter->ecdev) { if (get_ecdev(adapter)) {
ecdev_set_link(adapter->ecdev, 0); ecdev_set_link(get_ecdev(adapter), 0);
} else { } else {
netif_carrier_off(netdev); netif_carrier_off(netdev);
} }
@ -4193,7 +4195,7 @@ static int __igb_open(struct net_device *netdev, bool resuming)
if (err) if (err)
goto err_req_irq; goto err_req_irq;
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
/* Notify the stack of the actual queue counts. */ /* Notify the stack of the actual queue counts. */
err = netif_set_real_num_tx_queues(adapter->netdev, err = netif_set_real_num_tx_queues(adapter->netdev,
adapter->num_tx_queues); adapter->num_tx_queues);
@ -4209,7 +4211,7 @@ static int __igb_open(struct net_device *netdev, bool resuming)
/* From here on the code is the same as igb_up() */ /* From here on the code is the same as igb_up() */
clear_bit(__IGB_DOWN, &adapter->state); clear_bit(__IGB_DOWN, &adapter->state);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
for (i = 0; i < adapter->num_q_vectors; i++) for (i = 0; i < adapter->num_q_vectors; i++)
napi_enable(&(adapter->q_vector[i]->napi)); napi_enable(&(adapter->q_vector[i]->napi));
} }
@ -4228,14 +4230,14 @@ static int __igb_open(struct net_device *netdev, bool resuming)
wr32(E1000_CTRL_EXT, reg_data); wr32(E1000_CTRL_EXT, reg_data);
} }
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_tx_start_all_queues(netdev); netif_tx_start_all_queues(netdev);
} }
if (!resuming) if (!resuming)
pm_runtime_put(&pdev->dev); pm_runtime_put(&pdev->dev);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
/* start the watchdog. */ /* start the watchdog. */
hw->mac.get_link_status = 1; hw->mac.get_link_status = 1;
schedule_work(&adapter->watchdog_task); schedule_work(&adapter->watchdog_task);
@ -4484,7 +4486,7 @@ int igb_setup_rx_resources(struct igb_ring *rx_ring)
rx_ring->next_to_clean = 0; rx_ring->next_to_clean = 0;
rx_ring->next_to_use = 0; rx_ring->next_to_use = 0;
if (!adapter->ecdev) if (!get_ecdev(adapter))
rx_ring->xdp_prog = adapter->xdp_prog; rx_ring->xdp_prog = adapter->xdp_prog;
/* XDP RX-queue info */ /* XDP RX-queue info */
@ -4795,7 +4797,7 @@ void igb_configure_rx_ring(struct igb_adapter *adapter,
int reg_idx = ring->reg_idx; int reg_idx = ring->reg_idx;
u32 rxdctl = 0; u32 rxdctl = 0;
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
xdp_rxq_info_unreg_mem_model(&ring->xdp_rxq); xdp_rxq_info_unreg_mem_model(&ring->xdp_rxq);
WARN_ON(xdp_rxq_info_reg_mem_model(&ring->xdp_rxq, WARN_ON(xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
MEM_TYPE_PAGE_SHARED, NULL)); MEM_TYPE_PAGE_SHARED, NULL));
@ -4935,7 +4937,7 @@ static void igb_clean_tx_ring(struct igb_ring *tx_ring)
/* Free all the Tx ring sk_buffs */ /* Free all the Tx ring sk_buffs */
struct igb_adapter *adapter = netdev_priv(tx_ring->netdev); struct igb_adapter *adapter = netdev_priv(tx_ring->netdev);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
dev_kfree_skb_any(tx_buffer->skb); dev_kfree_skb_any(tx_buffer->skb);
} }
@ -6206,7 +6208,7 @@ static int __igb_maybe_stop_tx(struct igb_ring *tx_ring, const u16 size)
struct net_device *netdev = tx_ring->netdev; struct net_device *netdev = tx_ring->netdev;
struct igb_adapter *adapter = netdev_priv(netdev); struct igb_adapter *adapter = netdev_priv(netdev);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_stop_subqueue(netdev, tx_ring->queue_index); netif_stop_subqueue(netdev, tx_ring->queue_index);
} }
@ -6223,7 +6225,7 @@ static int __igb_maybe_stop_tx(struct igb_ring *tx_ring, const u16 size)
return -EBUSY; return -EBUSY;
/* A reprieve! */ /* A reprieve! */
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_wake_subqueue(netdev, tx_ring->queue_index); netif_wake_subqueue(netdev, tx_ring->queue_index);
} }
@ -6379,7 +6381,7 @@ dma_error:
DMA_TO_DEVICE); DMA_TO_DEVICE);
dma_unmap_len_set(tx_buffer, len, 0); dma_unmap_len_set(tx_buffer, len, 0);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
dev_kfree_skb_any(tx_buffer->skb); dev_kfree_skb_any(tx_buffer->skb);
tx_buffer->skb = NULL; tx_buffer->skb = NULL;
} }
@ -6497,7 +6499,7 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,
first->bytecount = skb->len; first->bytecount = skb->len;
first->gso_segs = 1; first->gso_segs = 1;
if (unlikely(!adapter->ecdev && if (unlikely(!get_ecdev(adapter) &&
skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) { skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
if (adapter->tstamp_config.tx_type == HWTSTAMP_TX_ON && if (adapter->tstamp_config.tx_type == HWTSTAMP_TX_ON &&
@ -6536,12 +6538,12 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,
return NETDEV_TX_OK; return NETDEV_TX_OK;
out_drop: out_drop:
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
dev_kfree_skb_any(first->skb); dev_kfree_skb_any(first->skb);
first->skb = NULL; first->skb = NULL;
} }
cleanup_tx_tstamp: cleanup_tx_tstamp:
if (unlikely(!adapter->ecdev && tx_flags & IGB_TX_FLAGS_TSTAMP)) { if (unlikely(!get_ecdev(adapter) && tx_flags & IGB_TX_FLAGS_TSTAMP)) {
dev_kfree_skb_any(adapter->ptp_tx_skb); dev_kfree_skb_any(adapter->ptp_tx_skb);
adapter->ptp_tx_skb = NULL; adapter->ptp_tx_skb = NULL;
if (adapter->hw.mac.type == e1000_82576) if (adapter->hw.mac.type == e1000_82576)
@ -8213,7 +8215,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget)
total_packets += tx_buffer->gso_segs; total_packets += tx_buffer->gso_segs;
/* free the skb */ /* free the skb */
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
if (tx_buffer->type == IGB_TYPE_SKB) if (tx_buffer->type == IGB_TYPE_SKB)
napi_consume_skb(tx_buffer->skb, napi_budget); napi_consume_skb(tx_buffer->skb, napi_budget);
else else
@ -8267,7 +8269,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget)
budget--; budget--;
} while (likely(budget)); } while (likely(budget));
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netdev_tx_completed_queue(txring_txq(tx_ring), netdev_tx_completed_queue(txring_txq(tx_ring),
total_packets, total_bytes); total_packets, total_bytes);
} }
@ -8280,7 +8282,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget)
q_vector->tx.total_bytes += total_bytes; q_vector->tx.total_bytes += total_bytes;
q_vector->tx.total_packets += total_packets; q_vector->tx.total_packets += total_packets;
if (!adapter->ecdev && if (!get_ecdev(adapter) &&
test_bit(IGB_RING_FLAG_TX_DETECT_HANG, &tx_ring->flags)) { test_bit(IGB_RING_FLAG_TX_DETECT_HANG, &tx_ring->flags)) {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
@ -8324,7 +8326,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget)
} }
#define TX_WAKE_THRESHOLD (DESC_NEEDED * 2) #define TX_WAKE_THRESHOLD (DESC_NEEDED * 2)
if (unlikely(!adapter->ecdev && total_packets && if (unlikely(!get_ecdev(adapter) && total_packets &&
netif_carrier_ok(tx_ring->netdev) && netif_carrier_ok(tx_ring->netdev) &&
igb_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD)) { igb_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD)) {
/* Make sure that anybody stopping the queue after this /* Make sure that anybody stopping the queue after this
@ -8866,9 +8868,9 @@ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)
rx_buffer = igb_get_rx_buffer(rx_ring, size, &rx_buf_pgcnt); rx_buffer = igb_get_rx_buffer(rx_ring, size, &rx_buf_pgcnt);
pktbuf = page_address(rx_buffer->page) + rx_buffer->page_offset; pktbuf = page_address(rx_buffer->page) + rx_buffer->page_offset;
if (adapter->ecdev) { if (get_ecdev(adapter)) {
unsigned int size = le16_to_cpu(rx_desc->wb.upper.length); unsigned int size = le16_to_cpu(rx_desc->wb.upper.length);
ecdev_receive(adapter->ecdev, pktbuf, size); ecdev_receive(get_ecdev(adapter), pktbuf, size);
adapter->ec_watchdog_jiffies = jiffies; adapter->ec_watchdog_jiffies = jiffies;
igb_reuse_rx_page(rx_ring, rx_buffer); igb_reuse_rx_page(rx_ring, rx_buffer);
} else { } else {
@ -8931,7 +8933,7 @@ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)
if (igb_is_non_eop(rx_ring, rx_desc)) if (igb_is_non_eop(rx_ring, rx_desc))
continue; continue;
if (adapter->ecdev) { if (get_ecdev(adapter)) {
total_packets++; total_packets++;
continue; continue;
} }

View File

@ -935,7 +935,7 @@ static int igb_request_msix(struct igb_adapter *adapter)
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
int i, err = 0, vector = 0, free_vector = 0; int i, err = 0, vector = 0, free_vector = 0;
if (adapter->ecdev) { if (get_ecdev(adapter)) {
return 0; return 0;
} }
@ -1036,7 +1036,7 @@ static void igb_reset_q_vector(struct igb_adapter *adapter, int v_idx)
if (q_vector->rx.ring) if (q_vector->rx.ring)
adapter->rx_ring[q_vector->rx.ring->queue_index] = NULL; adapter->rx_ring[q_vector->rx.ring->queue_index] = NULL;
if (!adapter->ecdev) if (!get_ecdev(adapter))
netif_napi_del(&q_vector->napi); netif_napi_del(&q_vector->napi);
} }
@ -1218,7 +1218,7 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter,
return -ENOMEM; return -ENOMEM;
/* initialize NAPI */ /* initialize NAPI */
if (!adapter->ecdev) { if (get_ecdev(adapter)) {
netif_napi_add(adapter->netdev, &q_vector->napi, netif_napi_add(adapter->netdev, &q_vector->napi,
igb_poll, 64); igb_poll, 64);
} }
@ -1439,7 +1439,7 @@ static int igb_request_irq(struct igb_adapter *adapter)
igb_assign_vector(adapter->q_vector[0], 0); igb_assign_vector(adapter->q_vector[0], 0);
if (!adapter->ecdev && adapter->flags & IGB_FLAG_HAS_MSI) { if (!get_ecdev(adapter) && adapter->flags & IGB_FLAG_HAS_MSI) {
err = request_irq(pdev->irq, igb_intr_msi, 0, err = request_irq(pdev->irq, igb_intr_msi, 0,
netdev->name, adapter); netdev->name, adapter);
if (!err) if (!err)
@ -1450,7 +1450,7 @@ static int igb_request_irq(struct igb_adapter *adapter)
adapter->flags &= ~IGB_FLAG_HAS_MSI; adapter->flags &= ~IGB_FLAG_HAS_MSI;
} }
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
err = request_irq(pdev->irq, igb_intr, IRQF_SHARED, err = request_irq(pdev->irq, igb_intr, IRQF_SHARED,
netdev->name, adapter); netdev->name, adapter);
@ -1465,7 +1465,7 @@ request_done:
static void igb_free_irq(struct igb_adapter *adapter) static void igb_free_irq(struct igb_adapter *adapter)
{ {
if (adapter->ecdev) if (get_ecdev(adapter))
return; return;
if (adapter->flags & IGB_FLAG_HAS_MSIX) { if (adapter->flags & IGB_FLAG_HAS_MSIX) {
int vector = 0, i; int vector = 0, i;
@ -1505,7 +1505,7 @@ static void igb_irq_disable(struct igb_adapter *adapter)
wr32(E1000_IMC, ~0); wr32(E1000_IMC, ~0);
wrfl(); wrfl();
if (adapter->ecdev) { if (get_ecdev(adapter)) {
/* skip synchronizing IRQs */ /* skip synchronizing IRQs */
return; return;
} }
@ -1527,7 +1527,7 @@ static void igb_irq_enable(struct igb_adapter *adapter)
{ {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
if (adapter->ecdev) if (get_ecdev(adapter))
return; return;
if (adapter->flags & IGB_FLAG_HAS_MSIX) { if (adapter->flags & IGB_FLAG_HAS_MSIX) {
@ -2145,7 +2145,7 @@ int igb_up(struct igb_adapter *adapter)
clear_bit(__IGB_DOWN, &adapter->state); clear_bit(__IGB_DOWN, &adapter->state);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
for (i = 0; i < adapter->num_q_vectors; i++) for (i = 0; i < adapter->num_q_vectors; i++)
napi_enable(&(adapter->q_vector[i]->napi)); napi_enable(&(adapter->q_vector[i]->napi));
} }
@ -2168,7 +2168,7 @@ int igb_up(struct igb_adapter *adapter)
wr32(E1000_CTRL_EXT, reg_data); wr32(E1000_CTRL_EXT, reg_data);
} }
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_tx_start_all_queues(adapter->netdev); netif_tx_start_all_queues(adapter->netdev);
/* start the watchdog. */ /* start the watchdog. */
@ -2202,7 +2202,7 @@ void igb_down(struct igb_adapter *adapter)
igb_nfc_filter_exit(adapter); igb_nfc_filter_exit(adapter);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_carrier_off(netdev); netif_carrier_off(netdev);
netif_tx_stop_all_queues(netdev); netif_tx_stop_all_queues(netdev);
} }
@ -2220,7 +2220,7 @@ void igb_down(struct igb_adapter *adapter)
adapter->flags &= ~IGB_FLAG_NEED_LINK_UPDATE; adapter->flags &= ~IGB_FLAG_NEED_LINK_UPDATE;
for (i = 0; i < adapter->num_q_vectors; i++) { for (i = 0; i < adapter->num_q_vectors; i++) {
if (!adapter->ecdev && adapter->q_vector[i]) { if (!get_ecdev(adapter) && adapter->q_vector[i]) {
napi_synchronize(&adapter->q_vector[i]->napi); napi_synchronize(&adapter->q_vector[i]->napi);
napi_disable(&adapter->q_vector[i]->napi); napi_disable(&adapter->q_vector[i]->napi);
} }
@ -2443,7 +2443,7 @@ void igb_reset(struct igb_adapter *adapter)
break; break;
} }
} }
if (!adapter->ecdev && !netif_running(adapter->netdev)) if (!get_ecdev(adapter) && !netif_running(adapter->netdev))
igb_power_down_link(adapter); igb_power_down_link(adapter);
igb_update_mng_vlan(adapter); igb_update_mng_vlan(adapter);
@ -2907,7 +2907,7 @@ static int igb_xdp_setup(struct net_device *dev, struct netdev_bpf *bpf)
static int igb_xdp(struct net_device *dev, struct netdev_bpf *xdp) static int igb_xdp(struct net_device *dev, struct netdev_bpf *xdp)
{ {
struct igb_adapter *adapter = netdev_priv(dev); struct igb_adapter *adapter = netdev_priv(dev);
if (adapter->ecdev) if (get_ecdev(adapter))
return -EBUSY; return -EBUSY;
@ -2976,7 +2976,7 @@ static int igb_xdp_xmit(struct net_device *dev, int n,
int nxmit = 0; int nxmit = 0;
int i; int i;
if (adapter->ecdev) if (get_ecdev(adapter))
return -EBUSY; return -EBUSY;
if (unlikely(test_bit(__IGB_DOWN, &adapter->state))) if (unlikely(test_bit(__IGB_DOWN, &adapter->state)))
@ -3278,6 +3278,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
adapter = netdev_priv(netdev); adapter = netdev_priv(netdev);
adapter->netdev = netdev; adapter->netdev = netdev;
adapter->pdev = pdev; adapter->pdev = pdev;
adapter->ecdev_initialized = 0;
hw = &adapter->hw; hw = &adapter->hw;
hw->back = adapter; hw->back = adapter;
adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE); adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);
@ -3561,12 +3562,13 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
igb_get_hw_control(adapter); igb_get_hw_control(adapter);
adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); adapter->ecdev_ = ecdev_offer(netdev, ec_poll, THIS_MODULE);
if (adapter->ecdev) { adapter->ecdev_initialized = 1;
if (get_ecdev(adapter)) {
init_irq_work(&adapter->ec_watchdog_kicker, ec_kick_watchdog); init_irq_work(&adapter->ec_watchdog_kicker, ec_kick_watchdog);
err = ecdev_open(adapter->ecdev); err = ecdev_open(get_ecdev(adapter));
if (err) { if (err) {
ecdev_withdraw(adapter->ecdev); ecdev_withdraw(get_ecdev(adapter));
goto err_register; goto err_register;
} }
adapter->ec_watchdog_jiffies = jiffies; adapter->ec_watchdog_jiffies = jiffies;
@ -3866,10 +3868,10 @@ static void igb_remove(struct pci_dev *pdev)
struct igb_adapter *adapter = netdev_priv(netdev); struct igb_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
if (adapter->ecdev) { if (get_ecdev(adapter)) {
ecdev_close(adapter->ecdev); ecdev_close(get_ecdev(adapter));
irq_work_sync(&adapter->ec_watchdog_kicker); irq_work_sync(&adapter->ec_watchdog_kicker);
ecdev_withdraw(adapter->ecdev); ecdev_withdraw(get_ecdev(adapter));
} }
pm_runtime_get_noresume(&pdev->dev); pm_runtime_get_noresume(&pdev->dev);
@ -3906,7 +3908,7 @@ static void igb_remove(struct pci_dev *pdev)
igb_disable_sriov(pdev); igb_disable_sriov(pdev);
#endif #endif
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
unregister_netdev(netdev); unregister_netdev(netdev);
} }
@ -4149,8 +4151,8 @@ static int __igb_open(struct net_device *netdev, bool resuming)
if (!resuming) if (!resuming)
pm_runtime_get_sync(&pdev->dev); pm_runtime_get_sync(&pdev->dev);
if (adapter->ecdev) { if (get_ecdev(adapter)) {
ecdev_set_link(adapter->ecdev, 0); ecdev_set_link(get_ecdev(adapter), 0);
} else { } else {
netif_carrier_off(netdev); netif_carrier_off(netdev);
} }
@ -4178,7 +4180,7 @@ static int __igb_open(struct net_device *netdev, bool resuming)
if (err) if (err)
goto err_req_irq; goto err_req_irq;
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
/* Notify the stack of the actual queue counts. */ /* Notify the stack of the actual queue counts. */
err = netif_set_real_num_tx_queues(adapter->netdev, err = netif_set_real_num_tx_queues(adapter->netdev,
adapter->num_tx_queues); adapter->num_tx_queues);
@ -4194,7 +4196,7 @@ static int __igb_open(struct net_device *netdev, bool resuming)
/* From here on the code is the same as igb_up() */ /* From here on the code is the same as igb_up() */
clear_bit(__IGB_DOWN, &adapter->state); clear_bit(__IGB_DOWN, &adapter->state);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
for (i = 0; i < adapter->num_q_vectors; i++) for (i = 0; i < adapter->num_q_vectors; i++)
napi_enable(&(adapter->q_vector[i]->napi)); napi_enable(&(adapter->q_vector[i]->napi));
} }
@ -4213,14 +4215,14 @@ static int __igb_open(struct net_device *netdev, bool resuming)
wr32(E1000_CTRL_EXT, reg_data); wr32(E1000_CTRL_EXT, reg_data);
} }
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_tx_start_all_queues(netdev); netif_tx_start_all_queues(netdev);
} }
if (!resuming) if (!resuming)
pm_runtime_put(&pdev->dev); pm_runtime_put(&pdev->dev);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
/* start the watchdog. */ /* start the watchdog. */
hw->mac.get_link_status = 1; hw->mac.get_link_status = 1;
schedule_work(&adapter->watchdog_task); schedule_work(&adapter->watchdog_task);
@ -4450,7 +4452,7 @@ int igb_setup_rx_resources(struct igb_ring *rx_ring)
struct device *dev = rx_ring->dev; struct device *dev = rx_ring->dev;
int size, res; int size, res;
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
/* XDP RX-queue info */ /* XDP RX-queue info */
if (xdp_rxq_info_is_reg(&rx_ring->xdp_rxq)) if (xdp_rxq_info_is_reg(&rx_ring->xdp_rxq))
xdp_rxq_info_unreg(&rx_ring->xdp_rxq); xdp_rxq_info_unreg(&rx_ring->xdp_rxq);
@ -4482,7 +4484,7 @@ int igb_setup_rx_resources(struct igb_ring *rx_ring)
rx_ring->next_to_clean = 0; rx_ring->next_to_clean = 0;
rx_ring->next_to_use = 0; rx_ring->next_to_use = 0;
if (!adapter->ecdev) if (!get_ecdev(adapter))
rx_ring->xdp_prog = adapter->xdp_prog; rx_ring->xdp_prog = adapter->xdp_prog;
return 0; return 0;
@ -4789,7 +4791,7 @@ void igb_configure_rx_ring(struct igb_adapter *adapter,
int reg_idx = ring->reg_idx; int reg_idx = ring->reg_idx;
u32 rxdctl = 0; u32 rxdctl = 0;
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
xdp_rxq_info_unreg_mem_model(&ring->xdp_rxq); xdp_rxq_info_unreg_mem_model(&ring->xdp_rxq);
WARN_ON(xdp_rxq_info_reg_mem_model(&ring->xdp_rxq, WARN_ON(xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
MEM_TYPE_PAGE_SHARED, NULL)); MEM_TYPE_PAGE_SHARED, NULL));
@ -4929,7 +4931,7 @@ static void igb_clean_tx_ring(struct igb_ring *tx_ring)
/* Free all the Tx ring sk_buffs */ /* Free all the Tx ring sk_buffs */
struct igb_adapter *adapter = netdev_priv(tx_ring->netdev); struct igb_adapter *adapter = netdev_priv(tx_ring->netdev);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
dev_kfree_skb_any(tx_buffer->skb); dev_kfree_skb_any(tx_buffer->skb);
} }
@ -6196,7 +6198,7 @@ static int __igb_maybe_stop_tx(struct igb_ring *tx_ring, const u16 size)
struct net_device *netdev = tx_ring->netdev; struct net_device *netdev = tx_ring->netdev;
struct igb_adapter *adapter = netdev_priv(netdev); struct igb_adapter *adapter = netdev_priv(netdev);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_stop_subqueue(netdev, tx_ring->queue_index); netif_stop_subqueue(netdev, tx_ring->queue_index);
} }
@ -6213,7 +6215,7 @@ static int __igb_maybe_stop_tx(struct igb_ring *tx_ring, const u16 size)
return -EBUSY; return -EBUSY;
/* A reprieve! */ /* A reprieve! */
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_wake_subqueue(netdev, tx_ring->queue_index); netif_wake_subqueue(netdev, tx_ring->queue_index);
} }
@ -6369,7 +6371,7 @@ dma_error:
DMA_TO_DEVICE); DMA_TO_DEVICE);
dma_unmap_len_set(tx_buffer, len, 0); dma_unmap_len_set(tx_buffer, len, 0);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
dev_kfree_skb_any(tx_buffer->skb); dev_kfree_skb_any(tx_buffer->skb);
tx_buffer->skb = NULL; tx_buffer->skb = NULL;
} }
@ -6487,7 +6489,7 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,
first->bytecount = skb->len; first->bytecount = skb->len;
first->gso_segs = 1; first->gso_segs = 1;
if (unlikely(!adapter->ecdev && if (unlikely(!get_ecdev(adapter) &&
skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) { skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
if (adapter->tstamp_config.tx_type == HWTSTAMP_TX_ON && if (adapter->tstamp_config.tx_type == HWTSTAMP_TX_ON &&
@ -6526,12 +6528,12 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,
return NETDEV_TX_OK; return NETDEV_TX_OK;
out_drop: out_drop:
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
dev_kfree_skb_any(first->skb); dev_kfree_skb_any(first->skb);
first->skb = NULL; first->skb = NULL;
} }
cleanup_tx_tstamp: cleanup_tx_tstamp:
if (unlikely(!adapter->ecdev && tx_flags & IGB_TX_FLAGS_TSTAMP)) { if (unlikely(!get_ecdev(adapter) && tx_flags & IGB_TX_FLAGS_TSTAMP)) {
dev_kfree_skb_any(adapter->ptp_tx_skb); dev_kfree_skb_any(adapter->ptp_tx_skb);
adapter->ptp_tx_skb = NULL; adapter->ptp_tx_skb = NULL;
if (adapter->hw.mac.type == e1000_82576) if (adapter->hw.mac.type == e1000_82576)
@ -8203,7 +8205,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget)
total_packets += tx_buffer->gso_segs; total_packets += tx_buffer->gso_segs;
/* free the skb */ /* free the skb */
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
if (tx_buffer->type == IGB_TYPE_SKB) if (tx_buffer->type == IGB_TYPE_SKB)
napi_consume_skb(tx_buffer->skb, napi_budget); napi_consume_skb(tx_buffer->skb, napi_budget);
else else
@ -8257,7 +8259,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget)
budget--; budget--;
} while (likely(budget)); } while (likely(budget));
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netdev_tx_completed_queue(txring_txq(tx_ring), netdev_tx_completed_queue(txring_txq(tx_ring),
total_packets, total_bytes); total_packets, total_bytes);
} }
@ -8270,7 +8272,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget)
q_vector->tx.total_bytes += total_bytes; q_vector->tx.total_bytes += total_bytes;
q_vector->tx.total_packets += total_packets; q_vector->tx.total_packets += total_packets;
if (!adapter->ecdev && if (!get_ecdev(adapter) &&
test_bit(IGB_RING_FLAG_TX_DETECT_HANG, &tx_ring->flags)) { test_bit(IGB_RING_FLAG_TX_DETECT_HANG, &tx_ring->flags)) {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
@ -8314,7 +8316,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget)
} }
#define TX_WAKE_THRESHOLD (DESC_NEEDED * 2) #define TX_WAKE_THRESHOLD (DESC_NEEDED * 2)
if (unlikely(!adapter->ecdev && total_packets && if (unlikely(!get_ecdev(adapter) && total_packets &&
netif_carrier_ok(tx_ring->netdev) && netif_carrier_ok(tx_ring->netdev) &&
igb_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD)) { igb_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD)) {
/* Make sure that anybody stopping the queue after this /* Make sure that anybody stopping the queue after this
@ -8852,9 +8854,9 @@ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)
rx_buffer = igb_get_rx_buffer(rx_ring, size, &rx_buf_pgcnt); rx_buffer = igb_get_rx_buffer(rx_ring, size, &rx_buf_pgcnt);
pktbuf = page_address(rx_buffer->page) + rx_buffer->page_offset; pktbuf = page_address(rx_buffer->page) + rx_buffer->page_offset;
if (adapter->ecdev) { if (get_ecdev(adapter)) {
unsigned int size = le16_to_cpu(rx_desc->wb.upper.length); unsigned int size = le16_to_cpu(rx_desc->wb.upper.length);
ecdev_receive(adapter->ecdev, pktbuf, size); ecdev_receive(get_ecdev(adapter), pktbuf, size);
adapter->ec_watchdog_jiffies = jiffies; adapter->ec_watchdog_jiffies = jiffies;
igb_reuse_rx_page(rx_ring, rx_buffer); igb_reuse_rx_page(rx_ring, rx_buffer);
} else { } else {
@ -8917,11 +8919,11 @@ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)
if (igb_is_non_eop(rx_ring, rx_desc)) if (igb_is_non_eop(rx_ring, rx_desc))
continue; continue;
if (adapter->ecdev) { if (get_ecdev(adapter)) {
total_packets++; total_packets++;
continue; continue;
} }
/* verify the packet layout is correct */ /* verify the packet layout is correct */
if (igb_cleanup_headers(rx_ring, rx_desc, skb)) { if (igb_cleanup_headers(rx_ring, rx_desc, skb)) {
skb = NULL; skb = NULL;

View File

@ -933,7 +933,7 @@ static int igb_request_msix(struct igb_adapter *adapter)
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
int i, err = 0, vector = 0, free_vector = 0; int i, err = 0, vector = 0, free_vector = 0;
if (adapter->ecdev) { if (get_ecdev(adapter)) {
return 0; return 0;
} }
@ -1034,7 +1034,7 @@ static void igb_reset_q_vector(struct igb_adapter *adapter, int v_idx)
if (q_vector->rx.ring) if (q_vector->rx.ring)
adapter->rx_ring[q_vector->rx.ring->queue_index] = NULL; adapter->rx_ring[q_vector->rx.ring->queue_index] = NULL;
if (!adapter->ecdev) if (!get_ecdev(adapter))
netif_napi_del(&q_vector->napi); netif_napi_del(&q_vector->napi);
} }
@ -1220,7 +1220,7 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter,
return -ENOMEM; return -ENOMEM;
/* initialize NAPI */ /* initialize NAPI */
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_napi_add(adapter->netdev, &q_vector->napi, igb_poll); netif_napi_add(adapter->netdev, &q_vector->napi, igb_poll);
} }
@ -1440,7 +1440,7 @@ static int igb_request_irq(struct igb_adapter *adapter)
igb_assign_vector(adapter->q_vector[0], 0); igb_assign_vector(adapter->q_vector[0], 0);
if (!adapter->ecdev && adapter->flags & IGB_FLAG_HAS_MSI) { if (!get_ecdev(adapter) && adapter->flags & IGB_FLAG_HAS_MSI) {
err = request_irq(pdev->irq, igb_intr_msi, 0, err = request_irq(pdev->irq, igb_intr_msi, 0,
netdev->name, adapter); netdev->name, adapter);
if (!err) if (!err)
@ -1451,7 +1451,7 @@ static int igb_request_irq(struct igb_adapter *adapter)
adapter->flags &= ~IGB_FLAG_HAS_MSI; adapter->flags &= ~IGB_FLAG_HAS_MSI;
} }
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
err = request_irq(pdev->irq, igb_intr, IRQF_SHARED, err = request_irq(pdev->irq, igb_intr, IRQF_SHARED,
netdev->name, adapter); netdev->name, adapter);
@ -1466,7 +1466,7 @@ request_done:
static void igb_free_irq(struct igb_adapter *adapter) static void igb_free_irq(struct igb_adapter *adapter)
{ {
if (adapter->ecdev) if (get_ecdev(adapter))
return; return;
if (adapter->flags & IGB_FLAG_HAS_MSIX) { if (adapter->flags & IGB_FLAG_HAS_MSIX) {
int vector = 0, i; int vector = 0, i;
@ -1506,7 +1506,7 @@ static void igb_irq_disable(struct igb_adapter *adapter)
wr32(E1000_IMC, ~0); wr32(E1000_IMC, ~0);
wrfl(); wrfl();
if (adapter->ecdev) { if (get_ecdev(adapter)) {
/* skip synchronizing IRQs */ /* skip synchronizing IRQs */
return; return;
} }
@ -1528,7 +1528,7 @@ static void igb_irq_enable(struct igb_adapter *adapter)
{ {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
if (adapter->ecdev) if (get_ecdev(adapter))
return; return;
if (adapter->flags & IGB_FLAG_HAS_MSIX) { if (adapter->flags & IGB_FLAG_HAS_MSIX) {
@ -2146,7 +2146,7 @@ int igb_up(struct igb_adapter *adapter)
clear_bit(__IGB_DOWN, &adapter->state); clear_bit(__IGB_DOWN, &adapter->state);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
for (i = 0; i < adapter->num_q_vectors; i++) for (i = 0; i < adapter->num_q_vectors; i++)
napi_enable(&(adapter->q_vector[i]->napi)); napi_enable(&(adapter->q_vector[i]->napi));
} }
@ -2169,7 +2169,7 @@ int igb_up(struct igb_adapter *adapter)
wr32(E1000_CTRL_EXT, reg_data); wr32(E1000_CTRL_EXT, reg_data);
} }
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_tx_start_all_queues(adapter->netdev); netif_tx_start_all_queues(adapter->netdev);
/* start the watchdog. */ /* start the watchdog. */
@ -2203,7 +2203,7 @@ void igb_down(struct igb_adapter *adapter)
igb_nfc_filter_exit(adapter); igb_nfc_filter_exit(adapter);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_carrier_off(netdev); netif_carrier_off(netdev);
netif_tx_stop_all_queues(netdev); netif_tx_stop_all_queues(netdev);
} }
@ -2221,7 +2221,7 @@ void igb_down(struct igb_adapter *adapter)
adapter->flags &= ~IGB_FLAG_NEED_LINK_UPDATE; adapter->flags &= ~IGB_FLAG_NEED_LINK_UPDATE;
for (i = 0; i < adapter->num_q_vectors; i++) { for (i = 0; i < adapter->num_q_vectors; i++) {
if (!adapter->ecdev && adapter->q_vector[i]) { if (!get_ecdev(adapter) && adapter->q_vector[i]) {
napi_synchronize(&adapter->q_vector[i]->napi); napi_synchronize(&adapter->q_vector[i]->napi);
napi_disable(&adapter->q_vector[i]->napi); napi_disable(&adapter->q_vector[i]->napi);
} }
@ -2469,7 +2469,7 @@ void igb_reset(struct igb_adapter *adapter)
break; break;
} }
} }
if (!adapter->ecdev && !netif_running(adapter->netdev)) if (!get_ecdev(adapter) && !netif_running(adapter->netdev))
igb_power_down_link(adapter); igb_power_down_link(adapter);
igb_update_mng_vlan(adapter); igb_update_mng_vlan(adapter);
@ -2933,7 +2933,7 @@ static int igb_xdp_setup(struct net_device *dev, struct netdev_bpf *bpf)
static int igb_xdp(struct net_device *dev, struct netdev_bpf *xdp) static int igb_xdp(struct net_device *dev, struct netdev_bpf *xdp)
{ {
struct igb_adapter *adapter = netdev_priv(dev); struct igb_adapter *adapter = netdev_priv(dev);
if (adapter->ecdev) if (get_ecdev(adapter))
return -EBUSY; return -EBUSY;
@ -3002,7 +3002,7 @@ static int igb_xdp_xmit(struct net_device *dev, int n,
int nxmit = 0; int nxmit = 0;
int i; int i;
if (adapter->ecdev) if (get_ecdev(adapter))
return -EBUSY; return -EBUSY;
if (unlikely(test_bit(__IGB_DOWN, &adapter->state))) if (unlikely(test_bit(__IGB_DOWN, &adapter->state)))
@ -3298,6 +3298,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
adapter = netdev_priv(netdev); adapter = netdev_priv(netdev);
adapter->netdev = netdev; adapter->netdev = netdev;
adapter->pdev = pdev; adapter->pdev = pdev;
adapter->ecdev_initialized = 0;
hw = &adapter->hw; hw = &adapter->hw;
hw->back = adapter; hw->back = adapter;
adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE); adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);
@ -3580,12 +3581,13 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
igb_get_hw_control(adapter); igb_get_hw_control(adapter);
adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); adapter->ecdev_ = ecdev_offer(netdev, ec_poll, THIS_MODULE);
if (adapter->ecdev) { adapter->ecdev_initialized = 1;
if (get_ecdev(adapter)) {
init_irq_work(&adapter->ec_watchdog_kicker, ec_kick_watchdog); init_irq_work(&adapter->ec_watchdog_kicker, ec_kick_watchdog);
err = ecdev_open(adapter->ecdev); err = ecdev_open(get_ecdev(adapter));
if (err) { if (err) {
ecdev_withdraw(adapter->ecdev); ecdev_withdraw(get_ecdev(adapter));
goto err_register; goto err_register;
} }
adapter->ec_watchdog_jiffies = jiffies; adapter->ec_watchdog_jiffies = jiffies;
@ -3893,10 +3895,10 @@ static void igb_remove(struct pci_dev *pdev)
struct igb_adapter *adapter = netdev_priv(netdev); struct igb_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
if (adapter->ecdev) { if (get_ecdev(adapter)) {
ecdev_close(adapter->ecdev); ecdev_close(get_ecdev(adapter));
irq_work_sync(&adapter->ec_watchdog_kicker); irq_work_sync(&adapter->ec_watchdog_kicker);
ecdev_withdraw(adapter->ecdev); ecdev_withdraw(get_ecdev(adapter));
} }
pm_runtime_get_noresume(&pdev->dev); pm_runtime_get_noresume(&pdev->dev);
@ -3933,7 +3935,7 @@ static void igb_remove(struct pci_dev *pdev)
igb_disable_sriov(pdev); igb_disable_sriov(pdev);
#endif #endif
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
unregister_netdev(netdev); unregister_netdev(netdev);
} }
@ -4179,8 +4181,8 @@ static int __igb_open(struct net_device *netdev, bool resuming)
if (!resuming) if (!resuming)
pm_runtime_get_sync(&pdev->dev); pm_runtime_get_sync(&pdev->dev);
if (adapter->ecdev) { if (get_ecdev(adapter)) {
ecdev_set_link(adapter->ecdev, 0); ecdev_set_link(get_ecdev(adapter), 0);
} else { } else {
netif_carrier_off(netdev); netif_carrier_off(netdev);
} }
@ -4208,7 +4210,7 @@ static int __igb_open(struct net_device *netdev, bool resuming)
if (err) if (err)
goto err_req_irq; goto err_req_irq;
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
/* Notify the stack of the actual queue counts. */ /* Notify the stack of the actual queue counts. */
err = netif_set_real_num_tx_queues(adapter->netdev, err = netif_set_real_num_tx_queues(adapter->netdev,
adapter->num_tx_queues); adapter->num_tx_queues);
@ -4224,7 +4226,7 @@ static int __igb_open(struct net_device *netdev, bool resuming)
/* From here on the code is the same as igb_up() */ /* From here on the code is the same as igb_up() */
clear_bit(__IGB_DOWN, &adapter->state); clear_bit(__IGB_DOWN, &adapter->state);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
for (i = 0; i < adapter->num_q_vectors; i++) for (i = 0; i < adapter->num_q_vectors; i++)
napi_enable(&(adapter->q_vector[i]->napi)); napi_enable(&(adapter->q_vector[i]->napi));
} }
@ -4243,14 +4245,14 @@ static int __igb_open(struct net_device *netdev, bool resuming)
wr32(E1000_CTRL_EXT, reg_data); wr32(E1000_CTRL_EXT, reg_data);
} }
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_tx_start_all_queues(netdev); netif_tx_start_all_queues(netdev);
} }
if (!resuming) if (!resuming)
pm_runtime_put(&pdev->dev); pm_runtime_put(&pdev->dev);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
/* start the watchdog. */ /* start the watchdog. */
hw->mac.get_link_status = 1; hw->mac.get_link_status = 1;
schedule_work(&adapter->watchdog_task); schedule_work(&adapter->watchdog_task);
@ -4480,7 +4482,7 @@ int igb_setup_rx_resources(struct igb_ring *rx_ring)
struct device *dev = rx_ring->dev; struct device *dev = rx_ring->dev;
int size, res; int size, res;
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
/* XDP RX-queue info */ /* XDP RX-queue info */
if (xdp_rxq_info_is_reg(&rx_ring->xdp_rxq)) if (xdp_rxq_info_is_reg(&rx_ring->xdp_rxq))
xdp_rxq_info_unreg(&rx_ring->xdp_rxq); xdp_rxq_info_unreg(&rx_ring->xdp_rxq);
@ -4512,7 +4514,7 @@ int igb_setup_rx_resources(struct igb_ring *rx_ring)
rx_ring->next_to_clean = 0; rx_ring->next_to_clean = 0;
rx_ring->next_to_use = 0; rx_ring->next_to_use = 0;
if (!adapter->ecdev) if (!get_ecdev(adapter))
rx_ring->xdp_prog = adapter->xdp_prog; rx_ring->xdp_prog = adapter->xdp_prog;
return 0; return 0;
@ -4819,7 +4821,7 @@ void igb_configure_rx_ring(struct igb_adapter *adapter,
int reg_idx = ring->reg_idx; int reg_idx = ring->reg_idx;
u32 rxdctl = 0; u32 rxdctl = 0;
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
xdp_rxq_info_unreg_mem_model(&ring->xdp_rxq); xdp_rxq_info_unreg_mem_model(&ring->xdp_rxq);
WARN_ON(xdp_rxq_info_reg_mem_model(&ring->xdp_rxq, WARN_ON(xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
MEM_TYPE_PAGE_SHARED, NULL)); MEM_TYPE_PAGE_SHARED, NULL));
@ -4959,7 +4961,7 @@ static void igb_clean_tx_ring(struct igb_ring *tx_ring)
/* Free all the Tx ring sk_buffs or xdp frames */ /* Free all the Tx ring sk_buffs or xdp frames */
struct igb_adapter *adapter = netdev_priv(tx_ring->netdev); struct igb_adapter *adapter = netdev_priv(tx_ring->netdev);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
if (tx_buffer->type == IGB_TYPE_SKB) if (tx_buffer->type == IGB_TYPE_SKB)
dev_kfree_skb_any(tx_buffer->skb); dev_kfree_skb_any(tx_buffer->skb);
else else
@ -6230,7 +6232,7 @@ static int __igb_maybe_stop_tx(struct igb_ring *tx_ring, const u16 size)
struct net_device *netdev = tx_ring->netdev; struct net_device *netdev = tx_ring->netdev;
struct igb_adapter *adapter = netdev_priv(netdev); struct igb_adapter *adapter = netdev_priv(netdev);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_stop_subqueue(netdev, tx_ring->queue_index); netif_stop_subqueue(netdev, tx_ring->queue_index);
} }
@ -6247,7 +6249,7 @@ static int __igb_maybe_stop_tx(struct igb_ring *tx_ring, const u16 size)
return -EBUSY; return -EBUSY;
/* A reprieve! */ /* A reprieve! */
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netif_wake_subqueue(netdev, tx_ring->queue_index); netif_wake_subqueue(netdev, tx_ring->queue_index);
} }
@ -6403,7 +6405,7 @@ dma_error:
DMA_TO_DEVICE); DMA_TO_DEVICE);
dma_unmap_len_set(tx_buffer, len, 0); dma_unmap_len_set(tx_buffer, len, 0);
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
dev_kfree_skb_any(tx_buffer->skb); dev_kfree_skb_any(tx_buffer->skb);
tx_buffer->skb = NULL; tx_buffer->skb = NULL;
} }
@ -6555,7 +6557,7 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,
first->bytecount = skb->len; first->bytecount = skb->len;
first->gso_segs = 1; first->gso_segs = 1;
if (unlikely(!adapter->ecdev && if (unlikely(!get_ecdev(adapter) &&
skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) { skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
if (adapter->tstamp_config.tx_type == HWTSTAMP_TX_ON && if (adapter->tstamp_config.tx_type == HWTSTAMP_TX_ON &&
@ -6594,12 +6596,12 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,
return NETDEV_TX_OK; return NETDEV_TX_OK;
out_drop: out_drop:
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
dev_kfree_skb_any(first->skb); dev_kfree_skb_any(first->skb);
first->skb = NULL; first->skb = NULL;
} }
cleanup_tx_tstamp: cleanup_tx_tstamp:
if (unlikely(!adapter->ecdev && tx_flags & IGB_TX_FLAGS_TSTAMP)) { if (unlikely(!get_ecdev(adapter) && tx_flags & IGB_TX_FLAGS_TSTAMP)) {
dev_kfree_skb_any(adapter->ptp_tx_skb); dev_kfree_skb_any(adapter->ptp_tx_skb);
adapter->ptp_tx_skb = NULL; adapter->ptp_tx_skb = NULL;
if (adapter->hw.mac.type == e1000_82576) if (adapter->hw.mac.type == e1000_82576)
@ -8356,7 +8358,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget)
total_packets += tx_buffer->gso_segs; total_packets += tx_buffer->gso_segs;
/* free the skb */ /* free the skb */
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
if (tx_buffer->type == IGB_TYPE_SKB) if (tx_buffer->type == IGB_TYPE_SKB)
napi_consume_skb(tx_buffer->skb, napi_budget); napi_consume_skb(tx_buffer->skb, napi_budget);
else else
@ -8410,7 +8412,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget)
budget--; budget--;
} while (likely(budget)); } while (likely(budget));
if (!adapter->ecdev) { if (!get_ecdev(adapter)) {
netdev_tx_completed_queue(txring_txq(tx_ring), netdev_tx_completed_queue(txring_txq(tx_ring),
total_packets, total_bytes); total_packets, total_bytes);
} }
@ -8423,7 +8425,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget)
q_vector->tx.total_bytes += total_bytes; q_vector->tx.total_bytes += total_bytes;
q_vector->tx.total_packets += total_packets; q_vector->tx.total_packets += total_packets;
if (!adapter->ecdev && if (!get_ecdev(adapter) &&
test_bit(IGB_RING_FLAG_TX_DETECT_HANG, &tx_ring->flags)) { test_bit(IGB_RING_FLAG_TX_DETECT_HANG, &tx_ring->flags)) {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
@ -8467,7 +8469,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget)
} }
#define TX_WAKE_THRESHOLD (DESC_NEEDED * 2) #define TX_WAKE_THRESHOLD (DESC_NEEDED * 2)
if (unlikely(!adapter->ecdev && total_packets && if (unlikely(!get_ecdev(adapter) && total_packets &&
netif_carrier_ok(tx_ring->netdev) && netif_carrier_ok(tx_ring->netdev) &&
igb_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD)) { igb_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD)) {
/* Make sure that anybody stopping the queue after this /* Make sure that anybody stopping the queue after this
@ -9005,9 +9007,9 @@ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)
rx_buffer = igb_get_rx_buffer(rx_ring, size, &rx_buf_pgcnt); rx_buffer = igb_get_rx_buffer(rx_ring, size, &rx_buf_pgcnt);
pktbuf = page_address(rx_buffer->page) + rx_buffer->page_offset; pktbuf = page_address(rx_buffer->page) + rx_buffer->page_offset;
if (adapter->ecdev) { if (get_ecdev(adapter)) {
unsigned int size = le16_to_cpu(rx_desc->wb.upper.length); unsigned int size = le16_to_cpu(rx_desc->wb.upper.length);
ecdev_receive(adapter->ecdev, pktbuf, size); ecdev_receive(get_ecdev(adapter), pktbuf, size);
adapter->ec_watchdog_jiffies = jiffies; adapter->ec_watchdog_jiffies = jiffies;
igb_reuse_rx_page(rx_ring, rx_buffer); igb_reuse_rx_page(rx_ring, rx_buffer);
} else { } else {
@ -9071,7 +9073,7 @@ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)
if (igb_is_non_eop(rx_ring, rx_desc)) if (igb_is_non_eop(rx_ring, rx_desc))
continue; continue;
if (adapter->ecdev) { if (get_ecdev(adapter)) {
total_packets++; total_packets++;
continue; continue;
} }