WARN_ONCE on querying ecdev before ecdev_offer for e1000
This commit is contained in:
parent
c2c4a1b27f
commit
45b526e99f
|
|
@ -43,6 +43,10 @@ ifeq (@ENABLE_E1000@,1)
|
||||||
obj-m += ec_e1000.o
|
obj-m += ec_e1000.o
|
||||||
ec_e1000-objs := $(EC_E1000_OBJ)
|
ec_e1000-objs := $(EC_E1000_OBJ)
|
||||||
CFLAGS_e1000_main-@KERNEL_E1000@-ethercat.o = -DREV=$(REV)
|
CFLAGS_e1000_main-@KERNEL_E1000@-ethercat.o = -DREV=$(REV)
|
||||||
|
|
||||||
|
ifeq (@ENABLE_DRIVER_RESOURCE_VERIFYING@,1)
|
||||||
|
ccflags-y := -DEC_ENABLE_DRIVER_RESOURCE_VERIFYING
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
KBUILD_EXTRA_SYMBOLS := \
|
KBUILD_EXTRA_SYMBOLS := \
|
||||||
|
|
|
||||||
|
|
@ -303,11 +303,20 @@ struct e1000_adapter {
|
||||||
struct delayed_work fifo_stall_task;
|
struct delayed_work fifo_stall_task;
|
||||||
struct delayed_work phy_info_task;
|
struct delayed_work phy_info_task;
|
||||||
|
|
||||||
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 e1000_adapter *adapter)
|
||||||
|
{
|
||||||
|
#ifdef EC_ENABLE_DRIVER_RESOURCE_VERIFYING
|
||||||
|
WARN_ON(!adapter->ecdev_initialized);
|
||||||
|
#endif
|
||||||
|
return adapter->ecdev_;
|
||||||
|
}
|
||||||
|
|
||||||
enum e1000_state_t {
|
enum e1000_state_t {
|
||||||
__E1000_TESTING,
|
__E1000_TESTING,
|
||||||
__E1000_RESETTING,
|
__E1000_RESETTING,
|
||||||
|
|
|
||||||
|
|
@ -303,11 +303,20 @@ struct e1000_adapter {
|
||||||
struct delayed_work fifo_stall_task;
|
struct delayed_work fifo_stall_task;
|
||||||
struct delayed_work phy_info_task;
|
struct delayed_work phy_info_task;
|
||||||
|
|
||||||
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 e1000_adapter *adapter)
|
||||||
|
{
|
||||||
|
#ifdef EC_ENABLE_DRIVER_RESOURCE_VERIFYING
|
||||||
|
WARN_ON(!adapter->ecdev_initialized);
|
||||||
|
#endif
|
||||||
|
return adapter->ecdev_;
|
||||||
|
}
|
||||||
|
|
||||||
enum e1000_state_t {
|
enum e1000_state_t {
|
||||||
__E1000_TESTING,
|
__E1000_TESTING,
|
||||||
__E1000_RESETTING,
|
__E1000_RESETTING,
|
||||||
|
|
|
||||||
|
|
@ -271,7 +271,7 @@ static int e1000_request_irq(struct e1000_adapter *adapter)
|
||||||
int irq_flags = IRQF_SHARED;
|
int irq_flags = IRQF_SHARED;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -288,7 +288,7 @@ static void e1000_free_irq(struct e1000_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct net_device *netdev = adapter->netdev;
|
struct net_device *netdev = adapter->netdev;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -303,7 +303,7 @@ static void e1000_irq_disable(struct e1000_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (!adapter->ecdev_) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -320,7 +320,7 @@ static void e1000_irq_enable(struct e1000_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -407,7 +407,7 @@ static void e1000_configure(struct e1000_adapter *adapter)
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < adapter->num_rx_queues; i++) {
|
for (i = 0; i < adapter->num_rx_queues; i++) {
|
||||||
struct e1000_rx_ring *ring = &adapter->rx_ring[i];
|
struct e1000_rx_ring *ring = &adapter->rx_ring[i];
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
/* fill rx ring completely! */
|
/* fill rx ring completely! */
|
||||||
adapter->alloc_rx_buf(adapter, ring, ring->count);
|
adapter->alloc_rx_buf(adapter, ring, ring->count);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -427,7 +427,7 @@ int e1000_up(struct e1000_adapter *adapter)
|
||||||
|
|
||||||
clear_bit(__E1000_DOWN, &adapter->flags);
|
clear_bit(__E1000_DOWN, &adapter->flags);
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
napi_enable(&adapter->napi);
|
napi_enable(&adapter->napi);
|
||||||
|
|
||||||
e1000_irq_enable(adapter);
|
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.
|
* 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->phy_info_task);
|
||||||
cancel_delayed_work_sync(&adapter->fifo_stall_task);
|
cancel_delayed_work_sync(&adapter->fifo_stall_task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Only kill reset task if adapter is not resetting */
|
/* 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);
|
cancel_work_sync(&adapter->reset_task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -537,7 +537,7 @@ void e1000_down(struct e1000_adapter *adapter)
|
||||||
ew32(RCTL, rctl & ~E1000_RCTL_EN);
|
ew32(RCTL, rctl & ~E1000_RCTL_EN);
|
||||||
/* flush and sleep below */
|
/* flush and sleep below */
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
netif_tx_disable(netdev);
|
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.
|
* in the hardware until the next IFF_DOWN+IFF_UP cycle.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
netif_carrier_off(netdev);
|
netif_carrier_off(netdev);
|
||||||
napi_disable(&adapter->napi);
|
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->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);
|
||||||
adapter->bars = bars;
|
adapter->bars = bars;
|
||||||
adapter->need_ioport = need_ioport;
|
adapter->need_ioport = need_ioport;
|
||||||
|
adapter->ecdev_initialized = 0;
|
||||||
|
|
||||||
hw = &adapter->hw;
|
hw = &adapter->hw;
|
||||||
hw->back = adapter;
|
hw->back = adapter;
|
||||||
|
|
@ -1246,12 +1247,13 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
e1000_reset(adapter);
|
e1000_reset(adapter);
|
||||||
|
|
||||||
// offer device to EtherCAT master module
|
// offer device to EtherCAT master module
|
||||||
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;
|
||||||
}
|
}
|
||||||
} else {
|
} 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),
|
((hw->bus_width == e1000_bus_width_64) ? 64 : 32),
|
||||||
netdev->dev_addr);
|
netdev->dev_addr);
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
/* carrier off reporting is important to ethtool even BEFORE open */
|
/* carrier off reporting is important to ethtool even BEFORE open */
|
||||||
netif_carrier_off(netdev);
|
netif_carrier_off(netdev);
|
||||||
}
|
}
|
||||||
|
|
@ -1323,15 +1325,15 @@ static void e1000_remove(struct pci_dev *pdev)
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
bool disable_dev;
|
bool disable_dev;
|
||||||
|
|
||||||
if (adapter->ecdev)
|
if (get_ecdev(adapter))
|
||||||
irq_work_sync(&adapter->ec_watchdog_kicker);
|
irq_work_sync(&adapter->ec_watchdog_kicker);
|
||||||
|
|
||||||
e1000_down_and_stop(adapter);
|
e1000_down_and_stop(adapter);
|
||||||
e1000_release_manageability(adapter);
|
e1000_release_manageability(adapter);
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
ecdev_close(adapter->ecdev);
|
ecdev_close(get_ecdev(adapter));
|
||||||
ecdev_withdraw(adapter->ecdev);
|
ecdev_withdraw(get_ecdev(adapter));
|
||||||
} else {
|
} else {
|
||||||
unregister_netdev(netdev);
|
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() */
|
/* From here on the code is the same as e1000_up() */
|
||||||
clear_bit(__E1000_DOWN, &adapter->flags);
|
clear_bit(__E1000_DOWN, &adapter->flags);
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
napi_enable(&adapter->napi);
|
napi_enable(&adapter->napi);
|
||||||
|
|
||||||
e1000_irq_enable(adapter);
|
e1000_irq_enable(adapter);
|
||||||
|
|
@ -1926,7 +1928,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
u32 rdlen, rctl, rxcsum;
|
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 *
|
rdlen = adapter->rx_ring[0].count *
|
||||||
sizeof(struct e1000_rx_desc);
|
sizeof(struct e1000_rx_desc);
|
||||||
adapter->clean_rx = e1000_clean_jumbo_rx_irq;
|
adapter->clean_rx = e1000_clean_jumbo_rx_irq;
|
||||||
|
|
@ -2026,7 +2028,7 @@ static void
|
||||||
e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
|
e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
|
||||||
struct e1000_tx_buffer *buffer_info)
|
struct e1000_tx_buffer *buffer_info)
|
||||||
{
|
{
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2236,7 +2238,7 @@ static void e1000_enter_82542_rst(struct e1000_adapter *adapter)
|
||||||
E1000_WRITE_FLUSH();
|
E1000_WRITE_FLUSH();
|
||||||
mdelay(5);
|
mdelay(5);
|
||||||
|
|
||||||
if (!adapter->ecdev && netif_running(netdev))
|
if (!get_ecdev(adapter) && netif_running(netdev))
|
||||||
e1000_clean_all_rx_rings(adapter);
|
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 */
|
/* No need to loop, because 82542 supports only 1 queue */
|
||||||
struct e1000_rx_ring *ring = &adapter->rx_ring[0];
|
struct e1000_rx_ring *ring = &adapter->rx_ring[0];
|
||||||
e1000_configure_rx(adapter);
|
e1000_configure_rx(adapter);
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
/* fill rx ring completely! */
|
/* fill rx ring completely! */
|
||||||
adapter->alloc_rx_buf(adapter, ring, ring->count);
|
adapter->alloc_rx_buf(adapter, ring, ring->count);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -2519,12 +2521,12 @@ static void e1000_watchdog(struct work_struct *work)
|
||||||
u32 link, tctl;
|
u32 link, tctl;
|
||||||
|
|
||||||
link = e1000_has_link(adapter);
|
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;
|
goto link_up;
|
||||||
|
|
||||||
if (link) {
|
if (link) {
|
||||||
if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) ||
|
if ((get_ecdev(adapter) && !ecdev_get_link(get_ecdev(adapter))) ||
|
||||||
(!adapter->ecdev && !netif_carrier_ok(netdev))) {
|
(!get_ecdev(adapter) && !netif_carrier_ok(netdev))) {
|
||||||
u32 ctrl;
|
u32 ctrl;
|
||||||
/* update snapshot of PHY registers on LSC */
|
/* update snapshot of PHY registers on LSC */
|
||||||
e1000_get_speed_and_duplex(hw,
|
e1000_get_speed_and_duplex(hw,
|
||||||
|
|
@ -2559,8 +2561,8 @@ static void e1000_watchdog(struct work_struct *work)
|
||||||
tctl |= E1000_TCTL_EN;
|
tctl |= E1000_TCTL_EN;
|
||||||
ew32(TCTL, tctl);
|
ew32(TCTL, tctl);
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
ecdev_set_link(adapter->ecdev, 1);
|
ecdev_set_link(get_ecdev(adapter), 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
netif_carrier_on(netdev);
|
netif_carrier_on(netdev);
|
||||||
|
|
@ -2571,15 +2573,15 @@ static void e1000_watchdog(struct work_struct *work)
|
||||||
adapter->smartspeed = 0;
|
adapter->smartspeed = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((adapter->ecdev && ecdev_get_link(adapter->ecdev))
|
if ((get_ecdev(adapter) && ecdev_get_link(get_ecdev(adapter)))
|
||||||
|| (!adapter->ecdev && netif_carrier_ok(netdev))) {
|
|| (!get_ecdev(adapter) && netif_carrier_ok(netdev))) {
|
||||||
adapter->link_speed = 0;
|
adapter->link_speed = 0;
|
||||||
adapter->link_duplex = 0;
|
adapter->link_duplex = 0;
|
||||||
pr_info("%s NIC Link is Down\n",
|
pr_info("%s NIC Link is Down\n",
|
||||||
netdev->name);
|
netdev->name);
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
|
@ -2607,7 +2609,7 @@ link_up:
|
||||||
|
|
||||||
e1000_update_adaptive(hw);
|
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) {
|
if (E1000_DESC_UNUSED(txdr) + 1 < txdr->count) {
|
||||||
/* We've lost link, so the controller stops DMA,
|
/* We've lost link, so the controller stops DMA,
|
||||||
* but we've got queued Tx work that's never going
|
* but we've got queued Tx work that's never going
|
||||||
|
|
@ -2643,7 +2645,7 @@ link_up:
|
||||||
adapter->detect_tx_hung = true;
|
adapter->detect_tx_hung = true;
|
||||||
|
|
||||||
/* Reschedule the task */
|
/* 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);
|
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_adapter *adapter = netdev_priv(netdev);
|
||||||
struct e1000_tx_ring *tx_ring = adapter->tx_ring;
|
struct e1000_tx_ring *tx_ring = adapter->tx_ring;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3260,7 +3262,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
|
||||||
if (!__pskb_pull_tail(skb, pull_size)) {
|
if (!__pskb_pull_tail(skb, pull_size)) {
|
||||||
e_err(drv, "__pskb_pull_tail "
|
e_err(drv, "__pskb_pull_tail "
|
||||||
"failed.\n");
|
"failed.\n");
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
}
|
}
|
||||||
return NETDEV_TX_OK;
|
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) &&
|
if (unlikely((hw->mac_type == e1000_82547) &&
|
||||||
(e1000_82547_fifo_workaround(adapter, skb)))) {
|
(e1000_82547_fifo_workaround(adapter, skb)))) {
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
netif_stop_queue(netdev);
|
netif_stop_queue(netdev);
|
||||||
if (!test_bit(__E1000_DOWN, &adapter->flags))
|
if (!test_bit(__E1000_DOWN, &adapter->flags))
|
||||||
schedule_delayed_work(&adapter->fifo_stall_task, 1);
|
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);
|
tso = e1000_tso(adapter, tx_ring, skb, protocol);
|
||||||
if (tso < 0) {
|
if (tso < 0) {
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
}
|
}
|
||||||
return NETDEV_TX_OK;
|
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;
|
int desc_needed = MAX_SKB_FRAGS + 7;
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
netdev_sent_queue(netdev, skb->len);
|
netdev_sent_queue(netdev, skb->len);
|
||||||
skb_tx_timestamp(skb);
|
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. */
|
/* Make sure there is space in the ring for the next send. */
|
||||||
e1000_maybe_stop_tx(netdev, tx_ring, desc_needed);
|
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))) {
|
netif_xmit_stopped(netdev_get_tx_queue(netdev, 0))) {
|
||||||
writel(tx_ring->next_to_use, hw->hw_addr + tx_ring->tdt);
|
writel(tx_ring->next_to_use, hw->hw_addr + tx_ring->tdt);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
}
|
}
|
||||||
tx_ring->buffer_info[first].time_stamp = 0;
|
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;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
|
int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3720,7 +3722,7 @@ void e1000_update_stats(struct e1000_adapter *adapter)
|
||||||
if (pci_channel_offline(pdev))
|
if (pci_channel_offline(pdev))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
spin_lock_irqsave(&adapter->stats_lock, flags);
|
spin_lock_irqsave(&adapter->stats_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3851,7 +3853,7 @@ void e1000_update_stats(struct e1000_adapter *adapter)
|
||||||
adapter->stats.mgpdc += er32(MGTPDC);
|
adapter->stats.mgpdc += er32(MGTPDC);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
spin_unlock_irqrestore(&adapter->stats_lock, flags);
|
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))) {
|
if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) {
|
||||||
hw->get_link_status = 1;
|
hw->get_link_status = 1;
|
||||||
/* guard against interrupt when we're going down */
|
/* 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);
|
schedule_delayed_work(&adapter->watchdog_task, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
int i, ec_work_done = 0;
|
int i, ec_work_done = 0;
|
||||||
for (i = 0; i < E1000_MAX_INTR; i++) {
|
for (i = 0; i < E1000_MAX_INTR; i++) {
|
||||||
if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring,
|
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);
|
smp_store_release(&tx_ring->next_to_clean, i);
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
netdev_completed_queue(netdev, pkts_compl, bytes_compl);
|
netdev_completed_queue(netdev, pkts_compl, bytes_compl);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TX_WAKE_THRESHOLD 32
|
#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)) {
|
E1000_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
|
||||||
* sees the new next_to_clean.
|
* 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
|
/* Detect a transmit hang in hardware, this serializes the
|
||||||
* check with the clearing of time_stamp and movement of i
|
* 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);
|
length = le16_to_cpu(rx_desc->length);
|
||||||
|
|
||||||
data = buffer_info->rxbuf.data;
|
data = buffer_info->rxbuf.data;
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
prefetch(data);
|
prefetch(data);
|
||||||
skb = e1000_copybreak(adapter, buffer_info, length, data);
|
skb = e1000_copybreak(adapter, buffer_info, length, data);
|
||||||
if (!skb) {
|
if (!skb) {
|
||||||
|
|
@ -4573,7 +4575,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
|
||||||
if (adapter->discarding) {
|
if (adapter->discarding) {
|
||||||
/* All receives must fit into a single buffer */
|
/* All receives must fit into a single buffer */
|
||||||
netdev_dbg(netdev, "Receive packet consumed multiple buffers\n");
|
netdev_dbg(netdev, "Receive packet consumed multiple buffers\n");
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
dev_kfree_skb(skb);
|
dev_kfree_skb(skb);
|
||||||
}
|
}
|
||||||
if (status & E1000_RXD_STAT_EOP)
|
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) {
|
} else if (netdev->features & NETIF_F_RXALL) {
|
||||||
goto process_skb;
|
goto process_skb;
|
||||||
} else {
|
} else {
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
dev_kfree_skb(skb);
|
dev_kfree_skb(skb);
|
||||||
}
|
}
|
||||||
goto next_desc;
|
goto next_desc;
|
||||||
|
|
@ -4606,7 +4608,7 @@ process_skb:
|
||||||
*/
|
*/
|
||||||
length -= 4;
|
length -= 4;
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
if (buffer_info->rxbuf.data == NULL)
|
if (buffer_info->rxbuf.data == NULL)
|
||||||
skb_put(skb, length);
|
skb_put(skb, length);
|
||||||
else /* copybreak skb */
|
else /* copybreak skb */
|
||||||
|
|
@ -4619,10 +4621,10 @@ process_skb:
|
||||||
le16_to_cpu(rx_desc->csum), 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,
|
dma_sync_single_for_cpu(&adapter->pdev->dev, buffer_info->dma,
|
||||||
adapter->rx_buffer_len, DMA_FROM_DEVICE);
|
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
|
// No need to detect link status as
|
||||||
// long as frames are received: Reset watchdog.
|
// 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;
|
data->phy_id = hw->phy_addr;
|
||||||
break;
|
break;
|
||||||
case SIOCGMIIREG:
|
case SIOCGMIIREG:
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
spin_lock_irqsave(&adapter->stats_lock, flags);
|
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);
|
spin_unlock_irqrestore(&adapter->stats_lock, flags);
|
||||||
break;
|
break;
|
||||||
case SIOCSMIIREG:
|
case SIOCSMIIREG:
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
if (data->reg_num & ~(0x1F))
|
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 ctrl, ctrl_ext, rctl, status;
|
||||||
u32 wufc = adapter->wol;
|
u32 wufc = adapter->wol;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5339,7 +5341,7 @@ static int __maybe_unused e1000_resume(struct device *dev)
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
u32 err;
|
u32 err;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5375,7 +5377,7 @@ static int __maybe_unused e1000_resume(struct device *dev)
|
||||||
if (netif_running(netdev))
|
if (netif_running(netdev))
|
||||||
e1000_up(adapter);
|
e1000_up(adapter);
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
netif_device_attach(netdev);
|
netif_device_attach(netdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -260,7 +260,7 @@ static int e1000_request_irq(struct e1000_adapter *adapter)
|
||||||
int irq_flags = IRQF_SHARED;
|
int irq_flags = IRQF_SHARED;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -277,7 +277,7 @@ static void e1000_free_irq(struct e1000_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct net_device *netdev = adapter->netdev;
|
struct net_device *netdev = adapter->netdev;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -292,7 +292,7 @@ static void e1000_irq_disable(struct e1000_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (adapter->ecdev_) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -309,7 +309,7 @@ static void e1000_irq_enable(struct e1000_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -396,7 +396,7 @@ static void e1000_configure(struct e1000_adapter *adapter)
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < adapter->num_rx_queues; i++) {
|
for (i = 0; i < adapter->num_rx_queues; i++) {
|
||||||
struct e1000_rx_ring *ring = &adapter->rx_ring[i];
|
struct e1000_rx_ring *ring = &adapter->rx_ring[i];
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
/* fill rx ring completely! */
|
/* fill rx ring completely! */
|
||||||
adapter->alloc_rx_buf(adapter, ring, ring->count);
|
adapter->alloc_rx_buf(adapter, ring, ring->count);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -416,7 +416,7 @@ int e1000_up(struct e1000_adapter *adapter)
|
||||||
|
|
||||||
clear_bit(__E1000_DOWN, &adapter->flags);
|
clear_bit(__E1000_DOWN, &adapter->flags);
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
napi_enable(&adapter->napi);
|
napi_enable(&adapter->napi);
|
||||||
|
|
||||||
e1000_irq_enable(adapter);
|
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.
|
* 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->phy_info_task);
|
||||||
cancel_delayed_work_sync(&adapter->fifo_stall_task);
|
cancel_delayed_work_sync(&adapter->fifo_stall_task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Only kill reset task if adapter is not resetting */
|
/* 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);
|
cancel_work_sync(&adapter->reset_task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -526,7 +526,7 @@ void e1000_down(struct e1000_adapter *adapter)
|
||||||
ew32(RCTL, rctl & ~E1000_RCTL_EN);
|
ew32(RCTL, rctl & ~E1000_RCTL_EN);
|
||||||
/* flush and sleep below */
|
/* flush and sleep below */
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
netif_tx_disable(netdev);
|
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.
|
* in the hardware until the next IFF_DOWN+IFF_UP cycle.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
netif_carrier_off(netdev);
|
netif_carrier_off(netdev);
|
||||||
napi_disable(&adapter->napi);
|
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->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);
|
||||||
adapter->bars = bars;
|
adapter->bars = bars;
|
||||||
adapter->need_ioport = need_ioport;
|
adapter->need_ioport = need_ioport;
|
||||||
|
adapter->ecdev_initialized = 0;
|
||||||
|
|
||||||
hw = &adapter->hw;
|
hw = &adapter->hw;
|
||||||
hw->back = adapter;
|
hw->back = adapter;
|
||||||
|
|
@ -1231,12 +1232,13 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
e1000_reset(adapter);
|
e1000_reset(adapter);
|
||||||
|
|
||||||
// offer device to EtherCAT master module
|
// offer device to EtherCAT master module
|
||||||
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;
|
||||||
}
|
}
|
||||||
} else {
|
} 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),
|
((hw->bus_width == e1000_bus_width_64) ? 64 : 32),
|
||||||
netdev->dev_addr);
|
netdev->dev_addr);
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
/* carrier off reporting is important to ethtool even BEFORE open */
|
/* carrier off reporting is important to ethtool even BEFORE open */
|
||||||
netif_carrier_off(netdev);
|
netif_carrier_off(netdev);
|
||||||
}
|
}
|
||||||
|
|
@ -1308,15 +1310,15 @@ static void e1000_remove(struct pci_dev *pdev)
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
bool disable_dev;
|
bool disable_dev;
|
||||||
|
|
||||||
if (adapter->ecdev)
|
if (get_ecdev(adapter))
|
||||||
irq_work_sync(&adapter->ec_watchdog_kicker);
|
irq_work_sync(&adapter->ec_watchdog_kicker);
|
||||||
|
|
||||||
e1000_down_and_stop(adapter);
|
e1000_down_and_stop(adapter);
|
||||||
e1000_release_manageability(adapter);
|
e1000_release_manageability(adapter);
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
ecdev_close(adapter->ecdev);
|
ecdev_close(get_ecdev(adapter));
|
||||||
ecdev_withdraw(adapter->ecdev);
|
ecdev_withdraw(get_ecdev(adapter));
|
||||||
} else {
|
} else {
|
||||||
unregister_netdev(netdev);
|
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() */
|
/* From here on the code is the same as e1000_up() */
|
||||||
clear_bit(__E1000_DOWN, &adapter->flags);
|
clear_bit(__E1000_DOWN, &adapter->flags);
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
napi_enable(&adapter->napi);
|
napi_enable(&adapter->napi);
|
||||||
|
|
||||||
e1000_irq_enable(adapter);
|
e1000_irq_enable(adapter);
|
||||||
|
|
@ -1911,7 +1913,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
u32 rdlen, rctl, rxcsum;
|
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 *
|
rdlen = adapter->rx_ring[0].count *
|
||||||
sizeof(struct e1000_rx_desc);
|
sizeof(struct e1000_rx_desc);
|
||||||
adapter->clean_rx = e1000_clean_jumbo_rx_irq;
|
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,
|
struct e1000_tx_buffer *buffer_info,
|
||||||
int budget)
|
int budget)
|
||||||
{
|
{
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2222,7 +2224,7 @@ static void e1000_enter_82542_rst(struct e1000_adapter *adapter)
|
||||||
E1000_WRITE_FLUSH();
|
E1000_WRITE_FLUSH();
|
||||||
mdelay(5);
|
mdelay(5);
|
||||||
|
|
||||||
if (!adapter->ecdev && netif_running(netdev))
|
if (!get_ecdev(adapter) && netif_running(netdev))
|
||||||
e1000_clean_all_rx_rings(adapter);
|
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 */
|
/* No need to loop, because 82542 supports only 1 queue */
|
||||||
struct e1000_rx_ring *ring = &adapter->rx_ring[0];
|
struct e1000_rx_ring *ring = &adapter->rx_ring[0];
|
||||||
e1000_configure_rx(adapter);
|
e1000_configure_rx(adapter);
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
/* fill rx ring completely! */
|
/* fill rx ring completely! */
|
||||||
adapter->alloc_rx_buf(adapter, ring, ring->count);
|
adapter->alloc_rx_buf(adapter, ring, ring->count);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -2501,12 +2503,12 @@ static void e1000_watchdog(struct work_struct *work)
|
||||||
u32 link, tctl;
|
u32 link, tctl;
|
||||||
|
|
||||||
link = e1000_has_link(adapter);
|
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;
|
goto link_up;
|
||||||
|
|
||||||
if (link) {
|
if (link) {
|
||||||
if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) ||
|
if ((get_ecdev(adapter) && !ecdev_get_link(get_ecdev(adapter))) ||
|
||||||
(!adapter->ecdev && !netif_carrier_ok(netdev))) {
|
(!get_ecdev(adapter) && !netif_carrier_ok(netdev))) {
|
||||||
u32 ctrl;
|
u32 ctrl;
|
||||||
/* update snapshot of PHY registers on LSC */
|
/* update snapshot of PHY registers on LSC */
|
||||||
e1000_get_speed_and_duplex(hw,
|
e1000_get_speed_and_duplex(hw,
|
||||||
|
|
@ -2541,8 +2543,8 @@ static void e1000_watchdog(struct work_struct *work)
|
||||||
tctl |= E1000_TCTL_EN;
|
tctl |= E1000_TCTL_EN;
|
||||||
ew32(TCTL, tctl);
|
ew32(TCTL, tctl);
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
ecdev_set_link(adapter->ecdev, 1);
|
ecdev_set_link(get_ecdev(adapter), 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
netif_carrier_on(netdev);
|
netif_carrier_on(netdev);
|
||||||
|
|
@ -2553,15 +2555,15 @@ static void e1000_watchdog(struct work_struct *work)
|
||||||
adapter->smartspeed = 0;
|
adapter->smartspeed = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((adapter->ecdev && ecdev_get_link(adapter->ecdev))
|
if ((get_ecdev(adapter) && ecdev_get_link(get_ecdev(adapter)))
|
||||||
|| (!adapter->ecdev && netif_carrier_ok(netdev))) {
|
|| (!get_ecdev(adapter) && netif_carrier_ok(netdev))) {
|
||||||
adapter->link_speed = 0;
|
adapter->link_speed = 0;
|
||||||
adapter->link_duplex = 0;
|
adapter->link_duplex = 0;
|
||||||
pr_info("%s NIC Link is Down\n",
|
pr_info("%s NIC Link is Down\n",
|
||||||
netdev->name);
|
netdev->name);
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
|
@ -2589,7 +2591,7 @@ link_up:
|
||||||
|
|
||||||
e1000_update_adaptive(hw);
|
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) {
|
if (E1000_DESC_UNUSED(txdr) + 1 < txdr->count) {
|
||||||
/* We've lost link, so the controller stops DMA,
|
/* We've lost link, so the controller stops DMA,
|
||||||
* but we've got queued Tx work that's never going
|
* but we've got queued Tx work that's never going
|
||||||
|
|
@ -2625,7 +2627,7 @@ link_up:
|
||||||
adapter->detect_tx_hung = true;
|
adapter->detect_tx_hung = true;
|
||||||
|
|
||||||
/* Reschedule the task */
|
/* 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);
|
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_adapter *adapter = netdev_priv(netdev);
|
||||||
struct e1000_tx_ring *tx_ring = adapter->tx_ring;
|
struct e1000_tx_ring *tx_ring = adapter->tx_ring;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3242,7 +3244,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
|
||||||
if (!__pskb_pull_tail(skb, pull_size)) {
|
if (!__pskb_pull_tail(skb, pull_size)) {
|
||||||
e_err(drv, "__pskb_pull_tail "
|
e_err(drv, "__pskb_pull_tail "
|
||||||
"failed.\n");
|
"failed.\n");
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
}
|
}
|
||||||
return NETDEV_TX_OK;
|
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) &&
|
if (unlikely((hw->mac_type == e1000_82547) &&
|
||||||
(e1000_82547_fifo_workaround(adapter, skb)))) {
|
(e1000_82547_fifo_workaround(adapter, skb)))) {
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
netif_stop_queue(netdev);
|
netif_stop_queue(netdev);
|
||||||
if (!test_bit(__E1000_DOWN, &adapter->flags))
|
if (!test_bit(__E1000_DOWN, &adapter->flags))
|
||||||
schedule_delayed_work(&adapter->fifo_stall_task, 1);
|
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);
|
tso = e1000_tso(adapter, tx_ring, skb, protocol);
|
||||||
if (tso < 0) {
|
if (tso < 0) {
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
}
|
}
|
||||||
return NETDEV_TX_OK;
|
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;
|
int desc_needed = MAX_SKB_FRAGS + 7;
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
netdev_sent_queue(netdev, skb->len);
|
netdev_sent_queue(netdev, skb->len);
|
||||||
skb_tx_timestamp(skb);
|
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. */
|
/* Make sure there is space in the ring for the next send. */
|
||||||
e1000_maybe_stop_tx(netdev, tx_ring, desc_needed);
|
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))) {
|
netif_xmit_stopped(netdev_get_tx_queue(netdev, 0))) {
|
||||||
writel(tx_ring->next_to_use, hw->hw_addr + tx_ring->tdt);
|
writel(tx_ring->next_to_use, hw->hw_addr + tx_ring->tdt);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
}
|
}
|
||||||
tx_ring->buffer_info[first].time_stamp = 0;
|
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;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
|
int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3702,7 +3704,7 @@ void e1000_update_stats(struct e1000_adapter *adapter)
|
||||||
if (pci_channel_offline(pdev))
|
if (pci_channel_offline(pdev))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
spin_lock_irqsave(&adapter->stats_lock, flags);
|
spin_lock_irqsave(&adapter->stats_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3833,7 +3835,7 @@ void e1000_update_stats(struct e1000_adapter *adapter)
|
||||||
adapter->stats.mgpdc += er32(MGTPDC);
|
adapter->stats.mgpdc += er32(MGTPDC);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
spin_unlock_irqrestore(&adapter->stats_lock, flags);
|
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))) {
|
if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) {
|
||||||
hw->get_link_status = 1;
|
hw->get_link_status = 1;
|
||||||
/* guard against interrupt when we're going down */
|
/* 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);
|
schedule_delayed_work(&adapter->watchdog_task, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
int i, ec_work_done = 0;
|
int i, ec_work_done = 0;
|
||||||
for (i = 0; i < E1000_MAX_INTR; i++) {
|
for (i = 0; i < E1000_MAX_INTR; i++) {
|
||||||
if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring,
|
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);
|
smp_store_release(&tx_ring->next_to_clean, i);
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
netdev_completed_queue(netdev, pkts_compl, bytes_compl);
|
netdev_completed_queue(netdev, pkts_compl, bytes_compl);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TX_WAKE_THRESHOLD 32
|
#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)) {
|
E1000_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
|
||||||
* sees the new next_to_clean.
|
* 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
|
/* Detect a transmit hang in hardware, this serializes the
|
||||||
* check with the clearing of time_stamp and movement of i
|
* 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);
|
length = le16_to_cpu(rx_desc->length);
|
||||||
|
|
||||||
data = buffer_info->rxbuf.data;
|
data = buffer_info->rxbuf.data;
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
prefetch(data);
|
prefetch(data);
|
||||||
skb = e1000_copybreak(adapter, buffer_info, length, data);
|
skb = e1000_copybreak(adapter, buffer_info, length, data);
|
||||||
if (!skb) {
|
if (!skb) {
|
||||||
|
|
@ -4556,7 +4558,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
|
||||||
if (adapter->discarding) {
|
if (adapter->discarding) {
|
||||||
/* All receives must fit into a single buffer */
|
/* All receives must fit into a single buffer */
|
||||||
netdev_dbg(netdev, "Receive packet consumed multiple buffers\n");
|
netdev_dbg(netdev, "Receive packet consumed multiple buffers\n");
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
dev_kfree_skb(skb);
|
dev_kfree_skb(skb);
|
||||||
}
|
}
|
||||||
if (status & E1000_RXD_STAT_EOP)
|
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) {
|
} else if (netdev->features & NETIF_F_RXALL) {
|
||||||
goto process_skb;
|
goto process_skb;
|
||||||
} else {
|
} else {
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
dev_kfree_skb(skb);
|
dev_kfree_skb(skb);
|
||||||
}
|
}
|
||||||
goto next_desc;
|
goto next_desc;
|
||||||
|
|
@ -4589,7 +4591,7 @@ process_skb:
|
||||||
*/
|
*/
|
||||||
length -= 4;
|
length -= 4;
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
if (buffer_info->rxbuf.data == NULL)
|
if (buffer_info->rxbuf.data == NULL)
|
||||||
skb_put(skb, length);
|
skb_put(skb, length);
|
||||||
else /* copybreak skb */
|
else /* copybreak skb */
|
||||||
|
|
@ -4602,10 +4604,10 @@ process_skb:
|
||||||
le16_to_cpu(rx_desc->csum), 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,
|
dma_sync_single_for_cpu(&adapter->pdev->dev, buffer_info->dma,
|
||||||
adapter->rx_buffer_len, DMA_FROM_DEVICE);
|
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
|
// No need to detect link status as
|
||||||
// long as frames are received: Reset watchdog.
|
// 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;
|
data->phy_id = hw->phy_addr;
|
||||||
break;
|
break;
|
||||||
case SIOCGMIIREG:
|
case SIOCGMIIREG:
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
spin_lock_irqsave(&adapter->stats_lock, flags);
|
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);
|
spin_unlock_irqrestore(&adapter->stats_lock, flags);
|
||||||
break;
|
break;
|
||||||
case SIOCSMIIREG:
|
case SIOCSMIIREG:
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
if (data->reg_num & ~(0x1F))
|
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 ctrl, ctrl_ext, rctl, status;
|
||||||
u32 wufc = adapter->wol;
|
u32 wufc = adapter->wol;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5322,7 +5324,7 @@ static int __maybe_unused e1000_resume(struct device *dev)
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
u32 err;
|
u32 err;
|
||||||
|
|
||||||
if (adapter->ecdev) {
|
if (get_ecdev(adapter)) {
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5358,7 +5360,7 @@ static int __maybe_unused e1000_resume(struct device *dev)
|
||||||
if (netif_running(netdev))
|
if (netif_running(netdev))
|
||||||
e1000_up(adapter);
|
e1000_up(adapter);
|
||||||
|
|
||||||
if (!adapter->ecdev) {
|
if (!get_ecdev(adapter)) {
|
||||||
netif_device_attach(netdev);
|
netif_device_attach(netdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue