• Home
  • Raw
  • Download

Lines Matching refs:efx

194 static int ef4_soft_enable_interrupts(struct ef4_nic *efx);
195 static void ef4_soft_disable_interrupts(struct ef4_nic *efx);
197 static void ef4_remove_channels(struct ef4_nic *efx);
199 static void ef4_remove_port(struct ef4_nic *efx);
201 static void ef4_fini_napi(struct ef4_nic *efx);
203 static void ef4_fini_struct(struct ef4_nic *efx);
204 static void ef4_start_all(struct ef4_nic *efx);
205 static void ef4_stop_all(struct ef4_nic *efx);
207 #define EF4_ASSERT_RESET_SERIALISED(efx) \ argument
209 if ((efx->state == STATE_READY) || \
210 (efx->state == STATE_RECOVERY) || \
211 (efx->state == STATE_DISABLED)) \
215 static int ef4_check_disabled(struct ef4_nic *efx) in ef4_check_disabled() argument
217 if (efx->state == STATE_DISABLED || efx->state == STATE_RECOVERY) { in ef4_check_disabled()
218 netif_err(efx, drv, efx->net_dev, in ef4_check_disabled()
276 static void ef4_update_irq_mod(struct ef4_nic *efx, struct ef4_channel *channel) in ef4_update_irq_mod() argument
278 int step = efx->irq_mod_step_us; in ef4_update_irq_mod()
283 efx->type->push_irq_moderation(channel); in ef4_update_irq_mod()
287 efx->irq_rx_moderation_us) { in ef4_update_irq_mod()
289 efx->type->push_irq_moderation(channel); in ef4_update_irq_mod()
301 struct ef4_nic *efx = channel->efx; in ef4_poll() local
304 netif_vdbg(efx, intr, efx->net_dev, in ef4_poll()
312 efx->irq_rx_adaptive && in ef4_poll()
314 ef4_update_irq_mod(efx, channel); in ef4_poll()
338 struct ef4_nic *efx = channel->efx; in ef4_probe_eventq() local
341 netif_dbg(efx, probe, efx->net_dev, in ef4_probe_eventq()
346 entries = roundup_pow_of_two(efx->rxq_entries + efx->txq_entries + 128); in ef4_probe_eventq()
356 struct ef4_nic *efx = channel->efx; in ef4_init_eventq() local
361 netif_dbg(efx, drv, efx->net_dev, in ef4_init_eventq()
366 efx->type->push_irq_moderation(channel); in ef4_init_eventq()
376 netif_dbg(channel->efx, ifup, channel->efx->net_dev, in ef4_start_eventq()
402 netif_dbg(channel->efx, drv, channel->efx->net_dev, in ef4_fini_eventq()
411 netif_dbg(channel->efx, drv, channel->efx->net_dev, in ef4_remove_eventq()
425 ef4_alloc_channel(struct ef4_nic *efx, int i, struct ef4_channel *old_channel) in ef4_alloc_channel() argument
436 channel->efx = efx; in ef4_alloc_channel()
442 tx_queue->efx = efx; in ef4_alloc_channel()
448 rx_queue->efx = efx; in ef4_alloc_channel()
499 netif_dbg(channel->efx, probe, channel->efx->net_dev, in ef4_probe_channel()
532 struct ef4_nic *efx = channel->efx; in ef4_get_channel_name() local
537 if (efx->tx_channel_offset == 0) { in ef4_get_channel_name()
539 } else if (channel->channel < efx->tx_channel_offset) { in ef4_get_channel_name()
543 number -= efx->tx_channel_offset; in ef4_get_channel_name()
545 snprintf(buf, len, "%s%s-%d", efx->name, type, number); in ef4_get_channel_name()
548 static void ef4_set_channel_names(struct ef4_nic *efx) in ef4_set_channel_names() argument
552 ef4_for_each_channel(channel, efx) in ef4_set_channel_names()
554 efx->msi_context[channel->channel].name, in ef4_set_channel_names()
555 sizeof(efx->msi_context[0].name)); in ef4_set_channel_names()
558 static int ef4_probe_channels(struct ef4_nic *efx) in ef4_probe_channels() argument
564 efx->next_buffer_table = 0; in ef4_probe_channels()
571 ef4_for_each_channel_rev(channel, efx) { in ef4_probe_channels()
574 netif_err(efx, probe, efx->net_dev, in ef4_probe_channels()
580 ef4_set_channel_names(efx); in ef4_probe_channels()
585 ef4_remove_channels(efx); in ef4_probe_channels()
593 static void ef4_start_datapath(struct ef4_nic *efx) in ef4_start_datapath() argument
595 netdev_features_t old_features = efx->net_dev->features; in ef4_start_datapath()
596 bool old_rx_scatter = efx->rx_scatter; in ef4_start_datapath()
606 efx->rx_dma_len = (efx->rx_prefix_size + in ef4_start_datapath()
607 EF4_MAX_FRAME_LEN(efx->net_dev->mtu) + in ef4_start_datapath()
608 efx->type->rx_buffer_padding); in ef4_start_datapath()
610 efx->rx_ip_align + efx->rx_dma_len); in ef4_start_datapath()
612 efx->rx_scatter = efx->type->always_rx_scatter; in ef4_start_datapath()
613 efx->rx_buffer_order = 0; in ef4_start_datapath()
614 } else if (efx->type->can_rx_scatter) { in ef4_start_datapath()
620 efx->rx_scatter = true; in ef4_start_datapath()
621 efx->rx_dma_len = EF4_RX_USR_BUF_SIZE; in ef4_start_datapath()
622 efx->rx_buffer_order = 0; in ef4_start_datapath()
624 efx->rx_scatter = false; in ef4_start_datapath()
625 efx->rx_buffer_order = get_order(rx_buf_len); in ef4_start_datapath()
628 ef4_rx_config_page_split(efx); in ef4_start_datapath()
629 if (efx->rx_buffer_order) in ef4_start_datapath()
630 netif_dbg(efx, drv, efx->net_dev, in ef4_start_datapath()
632 efx->rx_dma_len, efx->rx_buffer_order, in ef4_start_datapath()
633 efx->rx_pages_per_batch); in ef4_start_datapath()
635 netif_dbg(efx, drv, efx->net_dev, in ef4_start_datapath()
637 efx->rx_dma_len, efx->rx_page_buf_step, in ef4_start_datapath()
638 efx->rx_bufs_per_page, efx->rx_pages_per_batch); in ef4_start_datapath()
643 efx->net_dev->hw_features |= efx->net_dev->features; in ef4_start_datapath()
644 efx->net_dev->hw_features &= ~efx->fixed_features; in ef4_start_datapath()
645 efx->net_dev->features |= efx->fixed_features; in ef4_start_datapath()
646 if (efx->net_dev->features != old_features) in ef4_start_datapath()
647 netdev_features_change(efx->net_dev); in ef4_start_datapath()
650 if (efx->rx_scatter != old_rx_scatter) in ef4_start_datapath()
651 efx->type->filter_update_rx_scatter(efx); in ef4_start_datapath()
660 efx->txq_stop_thresh = efx->txq_entries - ef4_tx_max_skb_descs(efx); in ef4_start_datapath()
661 efx->txq_wake_thresh = efx->txq_stop_thresh / 2; in ef4_start_datapath()
664 ef4_for_each_channel(channel, efx) { in ef4_start_datapath()
667 atomic_inc(&efx->active_queues); in ef4_start_datapath()
672 atomic_inc(&efx->active_queues); in ef4_start_datapath()
681 if (netif_device_present(efx->net_dev)) in ef4_start_datapath()
682 netif_tx_wake_all_queues(efx->net_dev); in ef4_start_datapath()
685 static void ef4_stop_datapath(struct ef4_nic *efx) in ef4_stop_datapath() argument
692 EF4_ASSERT_RESET_SERIALISED(efx); in ef4_stop_datapath()
693 BUG_ON(efx->port_enabled); in ef4_stop_datapath()
696 ef4_for_each_channel(channel, efx) { in ef4_stop_datapath()
701 ef4_for_each_channel(channel, efx) { in ef4_stop_datapath()
714 rc = efx->type->fini_dmaq(efx); in ef4_stop_datapath()
715 if (rc && EF4_WORKAROUND_7803(efx)) { in ef4_stop_datapath()
721 netif_err(efx, drv, efx->net_dev, in ef4_stop_datapath()
723 ef4_schedule_reset(efx, RESET_TYPE_ALL); in ef4_stop_datapath()
725 netif_err(efx, drv, efx->net_dev, "failed to flush queues\n"); in ef4_stop_datapath()
727 netif_dbg(efx, drv, efx->net_dev, in ef4_stop_datapath()
731 ef4_for_each_channel(channel, efx) { in ef4_stop_datapath()
744 netif_dbg(channel->efx, drv, channel->efx->net_dev, in ef4_remove_channel()
755 static void ef4_remove_channels(struct ef4_nic *efx) in ef4_remove_channels() argument
759 ef4_for_each_channel(channel, efx) in ef4_remove_channels()
764 ef4_realloc_channels(struct ef4_nic *efx, u32 rxq_entries, u32 txq_entries) in ef4_realloc_channels() argument
771 rc = ef4_check_disabled(efx); in ef4_realloc_channels()
778 ef4_for_each_channel(channel, efx) { in ef4_realloc_channels()
797 ef4_device_detach_sync(efx); in ef4_realloc_channels()
798 ef4_stop_all(efx); in ef4_realloc_channels()
799 ef4_soft_disable_interrupts(efx); in ef4_realloc_channels()
803 for (i = 0; i < efx->n_channels; i++) { in ef4_realloc_channels()
804 channel = efx->channel[i]; in ef4_realloc_channels()
815 old_rxq_entries = efx->rxq_entries; in ef4_realloc_channels()
816 old_txq_entries = efx->txq_entries; in ef4_realloc_channels()
817 efx->rxq_entries = rxq_entries; in ef4_realloc_channels()
818 efx->txq_entries = txq_entries; in ef4_realloc_channels()
819 for (i = 0; i < efx->n_channels; i++) { in ef4_realloc_channels()
820 channel = efx->channel[i]; in ef4_realloc_channels()
821 efx->channel[i] = other_channel[i]; in ef4_realloc_channels()
826 efx->next_buffer_table = next_buffer_table; in ef4_realloc_channels()
828 for (i = 0; i < efx->n_channels; i++) { in ef4_realloc_channels()
829 channel = efx->channel[i]; in ef4_realloc_channels()
835 ef4_init_napi_channel(efx->channel[i]); in ef4_realloc_channels()
840 for (i = 0; i < efx->n_channels; i++) { in ef4_realloc_channels()
849 rc2 = ef4_soft_enable_interrupts(efx); in ef4_realloc_channels()
852 netif_err(efx, drv, efx->net_dev, in ef4_realloc_channels()
854 ef4_schedule_reset(efx, RESET_TYPE_DISABLE); in ef4_realloc_channels()
856 ef4_start_all(efx); in ef4_realloc_channels()
857 netif_device_attach(efx->net_dev); in ef4_realloc_channels()
863 efx->rxq_entries = old_rxq_entries; in ef4_realloc_channels()
864 efx->txq_entries = old_txq_entries; in ef4_realloc_channels()
865 for (i = 0; i < efx->n_channels; i++) { in ef4_realloc_channels()
866 channel = efx->channel[i]; in ef4_realloc_channels()
867 efx->channel[i] = other_channel[i]; in ef4_realloc_channels()
905 void ef4_link_status_changed(struct ef4_nic *efx) in ef4_link_status_changed() argument
907 struct ef4_link_state *link_state = &efx->link_state; in ef4_link_status_changed()
913 if (!netif_running(efx->net_dev)) in ef4_link_status_changed()
916 if (link_state->up != netif_carrier_ok(efx->net_dev)) { in ef4_link_status_changed()
917 efx->n_link_state_changes++; in ef4_link_status_changed()
920 netif_carrier_on(efx->net_dev); in ef4_link_status_changed()
922 netif_carrier_off(efx->net_dev); in ef4_link_status_changed()
927 netif_info(efx, link, efx->net_dev, in ef4_link_status_changed()
930 efx->net_dev->mtu); in ef4_link_status_changed()
932 netif_info(efx, link, efx->net_dev, "link down\n"); in ef4_link_status_changed()
935 void ef4_link_set_advertising(struct ef4_nic *efx, u32 advertising) in ef4_link_set_advertising() argument
937 efx->link_advertising = advertising; in ef4_link_set_advertising()
940 efx->wanted_fc |= (EF4_FC_TX | EF4_FC_RX); in ef4_link_set_advertising()
942 efx->wanted_fc &= ~(EF4_FC_TX | EF4_FC_RX); in ef4_link_set_advertising()
944 efx->wanted_fc ^= EF4_FC_TX; in ef4_link_set_advertising()
948 void ef4_link_set_wanted_fc(struct ef4_nic *efx, u8 wanted_fc) in ef4_link_set_wanted_fc() argument
950 efx->wanted_fc = wanted_fc; in ef4_link_set_wanted_fc()
951 if (efx->link_advertising) { in ef4_link_set_wanted_fc()
953 efx->link_advertising |= (ADVERTISED_Pause | in ef4_link_set_wanted_fc()
956 efx->link_advertising &= ~(ADVERTISED_Pause | in ef4_link_set_wanted_fc()
959 efx->link_advertising ^= ADVERTISED_Asym_Pause; in ef4_link_set_wanted_fc()
963 static void ef4_fini_port(struct ef4_nic *efx);
968 void ef4_mac_reconfigure(struct ef4_nic *efx) in ef4_mac_reconfigure() argument
970 down_read(&efx->filter_sem); in ef4_mac_reconfigure()
971 efx->type->reconfigure_mac(efx); in ef4_mac_reconfigure()
972 up_read(&efx->filter_sem); in ef4_mac_reconfigure()
982 int __ef4_reconfigure_port(struct ef4_nic *efx) in __ef4_reconfigure_port() argument
987 WARN_ON(!mutex_is_locked(&efx->mac_lock)); in __ef4_reconfigure_port()
990 phy_mode = efx->phy_mode; in __ef4_reconfigure_port()
991 if (LOOPBACK_INTERNAL(efx)) in __ef4_reconfigure_port()
992 efx->phy_mode |= PHY_MODE_TX_DISABLED; in __ef4_reconfigure_port()
994 efx->phy_mode &= ~PHY_MODE_TX_DISABLED; in __ef4_reconfigure_port()
996 rc = efx->type->reconfigure_port(efx); in __ef4_reconfigure_port()
999 efx->phy_mode = phy_mode; in __ef4_reconfigure_port()
1006 int ef4_reconfigure_port(struct ef4_nic *efx) in ef4_reconfigure_port() argument
1010 EF4_ASSERT_RESET_SERIALISED(efx); in ef4_reconfigure_port()
1012 mutex_lock(&efx->mac_lock); in ef4_reconfigure_port()
1013 rc = __ef4_reconfigure_port(efx); in ef4_reconfigure_port()
1014 mutex_unlock(&efx->mac_lock); in ef4_reconfigure_port()
1024 struct ef4_nic *efx = container_of(data, struct ef4_nic, mac_work); in ef4_mac_work() local
1026 mutex_lock(&efx->mac_lock); in ef4_mac_work()
1027 if (efx->port_enabled) in ef4_mac_work()
1028 ef4_mac_reconfigure(efx); in ef4_mac_work()
1029 mutex_unlock(&efx->mac_lock); in ef4_mac_work()
1032 static int ef4_probe_port(struct ef4_nic *efx) in ef4_probe_port() argument
1036 netif_dbg(efx, probe, efx->net_dev, "create port\n"); in ef4_probe_port()
1039 efx->phy_mode = PHY_MODE_SPECIAL; in ef4_probe_port()
1042 rc = efx->type->probe_port(efx); in ef4_probe_port()
1047 ether_addr_copy(efx->net_dev->dev_addr, efx->net_dev->perm_addr); in ef4_probe_port()
1052 static int ef4_init_port(struct ef4_nic *efx) in ef4_init_port() argument
1056 netif_dbg(efx, drv, efx->net_dev, "init port\n"); in ef4_init_port()
1058 mutex_lock(&efx->mac_lock); in ef4_init_port()
1060 rc = efx->phy_op->init(efx); in ef4_init_port()
1064 efx->port_initialized = true; in ef4_init_port()
1068 ef4_mac_reconfigure(efx); in ef4_init_port()
1071 rc = efx->phy_op->reconfigure(efx); in ef4_init_port()
1075 mutex_unlock(&efx->mac_lock); in ef4_init_port()
1079 efx->phy_op->fini(efx); in ef4_init_port()
1081 mutex_unlock(&efx->mac_lock); in ef4_init_port()
1085 static void ef4_start_port(struct ef4_nic *efx) in ef4_start_port() argument
1087 netif_dbg(efx, ifup, efx->net_dev, "start port\n"); in ef4_start_port()
1088 BUG_ON(efx->port_enabled); in ef4_start_port()
1090 mutex_lock(&efx->mac_lock); in ef4_start_port()
1091 efx->port_enabled = true; in ef4_start_port()
1094 ef4_mac_reconfigure(efx); in ef4_start_port()
1096 mutex_unlock(&efx->mac_lock); in ef4_start_port()
1104 static void ef4_stop_port(struct ef4_nic *efx) in ef4_stop_port() argument
1106 netif_dbg(efx, ifdown, efx->net_dev, "stop port\n"); in ef4_stop_port()
1108 EF4_ASSERT_RESET_SERIALISED(efx); in ef4_stop_port()
1110 mutex_lock(&efx->mac_lock); in ef4_stop_port()
1111 efx->port_enabled = false; in ef4_stop_port()
1112 mutex_unlock(&efx->mac_lock); in ef4_stop_port()
1115 netif_addr_lock_bh(efx->net_dev); in ef4_stop_port()
1116 netif_addr_unlock_bh(efx->net_dev); in ef4_stop_port()
1118 cancel_delayed_work_sync(&efx->monitor_work); in ef4_stop_port()
1119 ef4_selftest_async_cancel(efx); in ef4_stop_port()
1120 cancel_work_sync(&efx->mac_work); in ef4_stop_port()
1123 static void ef4_fini_port(struct ef4_nic *efx) in ef4_fini_port() argument
1125 netif_dbg(efx, drv, efx->net_dev, "shut down port\n"); in ef4_fini_port()
1127 if (!efx->port_initialized) in ef4_fini_port()
1130 efx->phy_op->fini(efx); in ef4_fini_port()
1131 efx->port_initialized = false; in ef4_fini_port()
1133 efx->link_state.up = false; in ef4_fini_port()
1134 ef4_link_status_changed(efx); in ef4_fini_port()
1137 static void ef4_remove_port(struct ef4_nic *efx) in ef4_remove_port() argument
1139 netif_dbg(efx, drv, efx->net_dev, "destroying port\n"); in ef4_remove_port()
1141 efx->type->remove_port(efx); in ef4_remove_port()
1160 static void ef4_associate(struct ef4_nic *efx) in ef4_associate() argument
1164 if (efx->primary == efx) { in ef4_associate()
1167 netif_dbg(efx, probe, efx->net_dev, "adding to primary list\n"); in ef4_associate()
1168 list_add_tail(&efx->node, &ef4_primary_list); in ef4_associate()
1172 if (ef4_same_controller(efx, other)) { in ef4_associate()
1176 pci_name(efx->pci_dev), in ef4_associate()
1177 efx->net_dev->name); in ef4_associate()
1179 &efx->secondary_list); in ef4_associate()
1180 other->primary = efx; in ef4_associate()
1187 if (ef4_same_controller(efx, other)) { in ef4_associate()
1188 netif_dbg(efx, probe, efx->net_dev, in ef4_associate()
1192 list_add_tail(&efx->node, in ef4_associate()
1194 efx->primary = other; in ef4_associate()
1199 netif_dbg(efx, probe, efx->net_dev, in ef4_associate()
1201 list_add_tail(&efx->node, &ef4_unassociated_list); in ef4_associate()
1205 static void ef4_dissociate(struct ef4_nic *efx) in ef4_dissociate() argument
1209 list_del(&efx->node); in ef4_dissociate()
1210 efx->primary = NULL; in ef4_dissociate()
1212 list_for_each_entry_safe(other, next, &efx->secondary_list, node) { in ef4_dissociate()
1222 static int ef4_init_io(struct ef4_nic *efx) in ef4_init_io() argument
1224 struct pci_dev *pci_dev = efx->pci_dev; in ef4_init_io()
1225 dma_addr_t dma_mask = efx->type->max_dma_mask; in ef4_init_io()
1226 unsigned int mem_map_size = efx->type->mem_map_size(efx); in ef4_init_io()
1229 netif_dbg(efx, probe, efx->net_dev, "initialising I/O\n"); in ef4_init_io()
1231 bar = efx->type->mem_bar; in ef4_init_io()
1235 netif_err(efx, probe, efx->net_dev, in ef4_init_io()
1253 netif_err(efx, probe, efx->net_dev, in ef4_init_io()
1257 netif_dbg(efx, probe, efx->net_dev, in ef4_init_io()
1260 efx->membase_phys = pci_resource_start(efx->pci_dev, bar); in ef4_init_io()
1263 netif_err(efx, probe, efx->net_dev, in ef4_init_io()
1268 efx->membase = ioremap(efx->membase_phys, mem_map_size); in ef4_init_io()
1269 if (!efx->membase) { in ef4_init_io()
1270 netif_err(efx, probe, efx->net_dev, in ef4_init_io()
1272 (unsigned long long)efx->membase_phys, mem_map_size); in ef4_init_io()
1276 netif_dbg(efx, probe, efx->net_dev, in ef4_init_io()
1278 (unsigned long long)efx->membase_phys, mem_map_size, in ef4_init_io()
1279 efx->membase); in ef4_init_io()
1284 pci_release_region(efx->pci_dev, bar); in ef4_init_io()
1286 efx->membase_phys = 0; in ef4_init_io()
1288 pci_disable_device(efx->pci_dev); in ef4_init_io()
1293 static void ef4_fini_io(struct ef4_nic *efx) in ef4_fini_io() argument
1297 netif_dbg(efx, drv, efx->net_dev, "shutting down I/O\n"); in ef4_fini_io()
1299 if (efx->membase) { in ef4_fini_io()
1300 iounmap(efx->membase); in ef4_fini_io()
1301 efx->membase = NULL; in ef4_fini_io()
1304 if (efx->membase_phys) { in ef4_fini_io()
1305 bar = efx->type->mem_bar; in ef4_fini_io()
1306 pci_release_region(efx->pci_dev, bar); in ef4_fini_io()
1307 efx->membase_phys = 0; in ef4_fini_io()
1311 if (!pci_vfs_assigned(efx->pci_dev)) in ef4_fini_io()
1312 pci_disable_device(efx->pci_dev); in ef4_fini_io()
1315 void ef4_set_default_rx_indir_table(struct ef4_nic *efx) in ef4_set_default_rx_indir_table() argument
1319 for (i = 0; i < ARRAY_SIZE(efx->rx_indir_table); i++) in ef4_set_default_rx_indir_table()
1320 efx->rx_indir_table[i] = in ef4_set_default_rx_indir_table()
1321 ethtool_rxfh_indir_default(i, efx->rss_spread); in ef4_set_default_rx_indir_table()
1324 static unsigned int ef4_wanted_parallelism(struct ef4_nic *efx) in ef4_wanted_parallelism() argument
1334 netif_warn(efx, probe, efx->net_dev, in ef4_wanted_parallelism()
1352 netif_cond_dbg(efx, probe, efx->net_dev, !rss_cpus, warn, in ef4_wanted_parallelism()
1364 static int ef4_probe_interrupts(struct ef4_nic *efx) in ef4_probe_interrupts() argument
1371 if (efx->extra_channel_type[i]) in ef4_probe_interrupts()
1374 if (efx->interrupt_mode == EF4_INT_MODE_MSIX) { in ef4_probe_interrupts()
1378 n_channels = ef4_wanted_parallelism(efx); in ef4_probe_interrupts()
1382 n_channels = min(n_channels, efx->max_channels); in ef4_probe_interrupts()
1386 rc = pci_enable_msix_range(efx->pci_dev, in ef4_probe_interrupts()
1390 efx->interrupt_mode = EF4_INT_MODE_MSI; in ef4_probe_interrupts()
1391 netif_err(efx, drv, efx->net_dev, in ef4_probe_interrupts()
1394 netif_err(efx, drv, efx->net_dev, in ef4_probe_interrupts()
1397 netif_err(efx, drv, efx->net_dev, in ef4_probe_interrupts()
1403 efx->n_channels = n_channels; in ef4_probe_interrupts()
1407 efx->n_tx_channels = min(max(n_channels / 2, in ef4_probe_interrupts()
1409 efx->max_tx_channels); in ef4_probe_interrupts()
1410 efx->n_rx_channels = max(n_channels - in ef4_probe_interrupts()
1411 efx->n_tx_channels, in ef4_probe_interrupts()
1414 efx->n_tx_channels = min(n_channels, in ef4_probe_interrupts()
1415 efx->max_tx_channels); in ef4_probe_interrupts()
1416 efx->n_rx_channels = n_channels; in ef4_probe_interrupts()
1418 for (i = 0; i < efx->n_channels; i++) in ef4_probe_interrupts()
1419 ef4_get_channel(efx, i)->irq = in ef4_probe_interrupts()
1425 if (efx->interrupt_mode == EF4_INT_MODE_MSI) { in ef4_probe_interrupts()
1426 efx->n_channels = 1; in ef4_probe_interrupts()
1427 efx->n_rx_channels = 1; in ef4_probe_interrupts()
1428 efx->n_tx_channels = 1; in ef4_probe_interrupts()
1429 rc = pci_enable_msi(efx->pci_dev); in ef4_probe_interrupts()
1431 ef4_get_channel(efx, 0)->irq = efx->pci_dev->irq; in ef4_probe_interrupts()
1433 netif_err(efx, drv, efx->net_dev, in ef4_probe_interrupts()
1435 efx->interrupt_mode = EF4_INT_MODE_LEGACY; in ef4_probe_interrupts()
1440 if (efx->interrupt_mode == EF4_INT_MODE_LEGACY) { in ef4_probe_interrupts()
1441 efx->n_channels = 1 + (ef4_separate_tx_channels ? 1 : 0); in ef4_probe_interrupts()
1442 efx->n_rx_channels = 1; in ef4_probe_interrupts()
1443 efx->n_tx_channels = 1; in ef4_probe_interrupts()
1444 efx->legacy_irq = efx->pci_dev->irq; in ef4_probe_interrupts()
1448 j = efx->n_channels; in ef4_probe_interrupts()
1450 if (!efx->extra_channel_type[i]) in ef4_probe_interrupts()
1452 if (efx->interrupt_mode != EF4_INT_MODE_MSIX || in ef4_probe_interrupts()
1453 efx->n_channels <= extra_channels) { in ef4_probe_interrupts()
1454 efx->extra_channel_type[i]->handle_no_channel(efx); in ef4_probe_interrupts()
1457 ef4_get_channel(efx, j)->type = in ef4_probe_interrupts()
1458 efx->extra_channel_type[i]; in ef4_probe_interrupts()
1462 efx->rss_spread = efx->n_rx_channels; in ef4_probe_interrupts()
1467 static int ef4_soft_enable_interrupts(struct ef4_nic *efx) in ef4_soft_enable_interrupts() argument
1472 BUG_ON(efx->state == STATE_DISABLED); in ef4_soft_enable_interrupts()
1474 efx->irq_soft_enabled = true; in ef4_soft_enable_interrupts()
1477 ef4_for_each_channel(channel, efx) { in ef4_soft_enable_interrupts()
1489 ef4_for_each_channel(channel, efx) { in ef4_soft_enable_interrupts()
1500 static void ef4_soft_disable_interrupts(struct ef4_nic *efx) in ef4_soft_disable_interrupts() argument
1504 if (efx->state == STATE_DISABLED) in ef4_soft_disable_interrupts()
1507 efx->irq_soft_enabled = false; in ef4_soft_disable_interrupts()
1510 if (efx->legacy_irq) in ef4_soft_disable_interrupts()
1511 synchronize_irq(efx->legacy_irq); in ef4_soft_disable_interrupts()
1513 ef4_for_each_channel(channel, efx) { in ef4_soft_disable_interrupts()
1523 static int ef4_enable_interrupts(struct ef4_nic *efx) in ef4_enable_interrupts() argument
1528 BUG_ON(efx->state == STATE_DISABLED); in ef4_enable_interrupts()
1530 if (efx->eeh_disabled_legacy_irq) { in ef4_enable_interrupts()
1531 enable_irq(efx->legacy_irq); in ef4_enable_interrupts()
1532 efx->eeh_disabled_legacy_irq = false; in ef4_enable_interrupts()
1535 efx->type->irq_enable_master(efx); in ef4_enable_interrupts()
1537 ef4_for_each_channel(channel, efx) { in ef4_enable_interrupts()
1545 rc = ef4_soft_enable_interrupts(efx); in ef4_enable_interrupts()
1553 ef4_for_each_channel(channel, efx) { in ef4_enable_interrupts()
1560 efx->type->irq_disable_non_ev(efx); in ef4_enable_interrupts()
1565 static void ef4_disable_interrupts(struct ef4_nic *efx) in ef4_disable_interrupts() argument
1569 ef4_soft_disable_interrupts(efx); in ef4_disable_interrupts()
1571 ef4_for_each_channel(channel, efx) { in ef4_disable_interrupts()
1576 efx->type->irq_disable_non_ev(efx); in ef4_disable_interrupts()
1579 static void ef4_remove_interrupts(struct ef4_nic *efx) in ef4_remove_interrupts() argument
1584 ef4_for_each_channel(channel, efx) in ef4_remove_interrupts()
1586 pci_disable_msi(efx->pci_dev); in ef4_remove_interrupts()
1587 pci_disable_msix(efx->pci_dev); in ef4_remove_interrupts()
1590 efx->legacy_irq = 0; in ef4_remove_interrupts()
1593 static void ef4_set_channels(struct ef4_nic *efx) in ef4_set_channels() argument
1598 efx->tx_channel_offset = in ef4_set_channels()
1600 efx->n_channels - efx->n_tx_channels : 0; in ef4_set_channels()
1606 ef4_for_each_channel(channel, efx) { in ef4_set_channels()
1607 if (channel->channel < efx->n_rx_channels) in ef4_set_channels()
1613 tx_queue->queue -= (efx->tx_channel_offset * in ef4_set_channels()
1618 static int ef4_probe_nic(struct ef4_nic *efx) in ef4_probe_nic() argument
1622 netif_dbg(efx, probe, efx->net_dev, "creating NIC\n"); in ef4_probe_nic()
1625 rc = efx->type->probe(efx); in ef4_probe_nic()
1630 if (!efx->max_channels || !efx->max_tx_channels) { in ef4_probe_nic()
1631 netif_err(efx, drv, efx->net_dev, in ef4_probe_nic()
1641 rc = ef4_probe_interrupts(efx); in ef4_probe_nic()
1645 ef4_set_channels(efx); in ef4_probe_nic()
1648 rc = efx->type->dimension_resources(efx); in ef4_probe_nic()
1654 ef4_remove_interrupts(efx); in ef4_probe_nic()
1658 if (efx->n_channels > 1) in ef4_probe_nic()
1659 netdev_rss_key_fill(&efx->rx_hash_key, in ef4_probe_nic()
1660 sizeof(efx->rx_hash_key)); in ef4_probe_nic()
1661 ef4_set_default_rx_indir_table(efx); in ef4_probe_nic()
1663 netif_set_real_num_tx_queues(efx->net_dev, efx->n_tx_channels); in ef4_probe_nic()
1664 netif_set_real_num_rx_queues(efx->net_dev, efx->n_rx_channels); in ef4_probe_nic()
1667 efx->irq_mod_step_us = DIV_ROUND_UP(efx->timer_quantum_ns, 1000); in ef4_probe_nic()
1668 ef4_init_irq_moderation(efx, tx_irq_mod_usec, rx_irq_mod_usec, true, in ef4_probe_nic()
1674 ef4_remove_interrupts(efx); in ef4_probe_nic()
1676 efx->type->remove(efx); in ef4_probe_nic()
1680 static void ef4_remove_nic(struct ef4_nic *efx) in ef4_remove_nic() argument
1682 netif_dbg(efx, drv, efx->net_dev, "destroying NIC\n"); in ef4_remove_nic()
1684 ef4_remove_interrupts(efx); in ef4_remove_nic()
1685 efx->type->remove(efx); in ef4_remove_nic()
1688 static int ef4_probe_filters(struct ef4_nic *efx) in ef4_probe_filters() argument
1692 spin_lock_init(&efx->filter_lock); in ef4_probe_filters()
1693 init_rwsem(&efx->filter_sem); in ef4_probe_filters()
1694 mutex_lock(&efx->mac_lock); in ef4_probe_filters()
1695 down_write(&efx->filter_sem); in ef4_probe_filters()
1696 rc = efx->type->filter_table_probe(efx); in ef4_probe_filters()
1701 if (efx->type->offload_features & NETIF_F_NTUPLE) { in ef4_probe_filters()
1705 ef4_for_each_channel(channel, efx) { in ef4_probe_filters()
1707 kcalloc(efx->type->max_rx_ip_filters, in ef4_probe_filters()
1714 i < efx->type->max_rx_ip_filters; in ef4_probe_filters()
1721 ef4_for_each_channel(channel, efx) in ef4_probe_filters()
1723 efx->type->filter_table_remove(efx); in ef4_probe_filters()
1728 efx->rps_expire_index = efx->rps_expire_channel = 0; in ef4_probe_filters()
1732 up_write(&efx->filter_sem); in ef4_probe_filters()
1733 mutex_unlock(&efx->mac_lock); in ef4_probe_filters()
1737 static void ef4_remove_filters(struct ef4_nic *efx) in ef4_remove_filters() argument
1742 ef4_for_each_channel(channel, efx) in ef4_remove_filters()
1745 down_write(&efx->filter_sem); in ef4_remove_filters()
1746 efx->type->filter_table_remove(efx); in ef4_remove_filters()
1747 up_write(&efx->filter_sem); in ef4_remove_filters()
1750 static void ef4_restore_filters(struct ef4_nic *efx) in ef4_restore_filters() argument
1752 down_read(&efx->filter_sem); in ef4_restore_filters()
1753 efx->type->filter_table_restore(efx); in ef4_restore_filters()
1754 up_read(&efx->filter_sem); in ef4_restore_filters()
1763 static int ef4_probe_all(struct ef4_nic *efx) in ef4_probe_all() argument
1767 rc = ef4_probe_nic(efx); in ef4_probe_all()
1769 netif_err(efx, probe, efx->net_dev, "failed to create NIC\n"); in ef4_probe_all()
1773 rc = ef4_probe_port(efx); in ef4_probe_all()
1775 netif_err(efx, probe, efx->net_dev, "failed to create port\n"); in ef4_probe_all()
1780 if (WARN_ON(EF4_DEFAULT_DMAQ_SIZE < EF4_TXQ_MIN_ENT(efx))) { in ef4_probe_all()
1784 efx->rxq_entries = efx->txq_entries = EF4_DEFAULT_DMAQ_SIZE; in ef4_probe_all()
1786 rc = ef4_probe_filters(efx); in ef4_probe_all()
1788 netif_err(efx, probe, efx->net_dev, in ef4_probe_all()
1793 rc = ef4_probe_channels(efx); in ef4_probe_all()
1800 ef4_remove_filters(efx); in ef4_probe_all()
1803 ef4_remove_port(efx); in ef4_probe_all()
1805 ef4_remove_nic(efx); in ef4_probe_all()
1817 static void ef4_start_all(struct ef4_nic *efx) in ef4_start_all() argument
1819 EF4_ASSERT_RESET_SERIALISED(efx); in ef4_start_all()
1820 BUG_ON(efx->state == STATE_DISABLED); in ef4_start_all()
1824 if (efx->port_enabled || !netif_running(efx->net_dev) || in ef4_start_all()
1825 efx->reset_pending) in ef4_start_all()
1828 ef4_start_port(efx); in ef4_start_all()
1829 ef4_start_datapath(efx); in ef4_start_all()
1832 if (efx->type->monitor != NULL) in ef4_start_all()
1833 queue_delayed_work(efx->workqueue, &efx->monitor_work, in ef4_start_all()
1836 efx->type->start_stats(efx); in ef4_start_all()
1837 efx->type->pull_stats(efx); in ef4_start_all()
1838 spin_lock_bh(&efx->stats_lock); in ef4_start_all()
1839 efx->type->update_stats(efx, NULL, NULL); in ef4_start_all()
1840 spin_unlock_bh(&efx->stats_lock); in ef4_start_all()
1848 static void ef4_stop_all(struct ef4_nic *efx) in ef4_stop_all() argument
1850 EF4_ASSERT_RESET_SERIALISED(efx); in ef4_stop_all()
1853 if (!efx->port_enabled) in ef4_stop_all()
1859 efx->type->pull_stats(efx); in ef4_stop_all()
1860 spin_lock_bh(&efx->stats_lock); in ef4_stop_all()
1861 efx->type->update_stats(efx, NULL, NULL); in ef4_stop_all()
1862 spin_unlock_bh(&efx->stats_lock); in ef4_stop_all()
1863 efx->type->stop_stats(efx); in ef4_stop_all()
1864 ef4_stop_port(efx); in ef4_stop_all()
1870 WARN_ON(netif_running(efx->net_dev) && in ef4_stop_all()
1871 netif_device_present(efx->net_dev)); in ef4_stop_all()
1872 netif_tx_disable(efx->net_dev); in ef4_stop_all()
1874 ef4_stop_datapath(efx); in ef4_stop_all()
1877 static void ef4_remove_all(struct ef4_nic *efx) in ef4_remove_all() argument
1879 ef4_remove_channels(efx); in ef4_remove_all()
1880 ef4_remove_filters(efx); in ef4_remove_all()
1881 ef4_remove_port(efx); in ef4_remove_all()
1882 ef4_remove_nic(efx); in ef4_remove_all()
1890 unsigned int ef4_usecs_to_ticks(struct ef4_nic *efx, unsigned int usecs) in ef4_usecs_to_ticks() argument
1894 if (usecs * 1000 < efx->timer_quantum_ns) in ef4_usecs_to_ticks()
1896 return usecs * 1000 / efx->timer_quantum_ns; in ef4_usecs_to_ticks()
1899 unsigned int ef4_ticks_to_usecs(struct ef4_nic *efx, unsigned int ticks) in ef4_ticks_to_usecs() argument
1904 return DIV_ROUND_UP(ticks * efx->timer_quantum_ns, 1000); in ef4_ticks_to_usecs()
1908 int ef4_init_irq_moderation(struct ef4_nic *efx, unsigned int tx_usecs, in ef4_init_irq_moderation() argument
1915 EF4_ASSERT_RESET_SERIALISED(efx); in ef4_init_irq_moderation()
1917 timer_max_us = efx->timer_max_ns / 1000; in ef4_init_irq_moderation()
1922 if (tx_usecs != rx_usecs && efx->tx_channel_offset == 0 && in ef4_init_irq_moderation()
1924 netif_err(efx, drv, efx->net_dev, "Channels are shared. " in ef4_init_irq_moderation()
1929 efx->irq_rx_adaptive = rx_adaptive; in ef4_init_irq_moderation()
1930 efx->irq_rx_moderation_us = rx_usecs; in ef4_init_irq_moderation()
1931 ef4_for_each_channel(channel, efx) { in ef4_init_irq_moderation()
1941 void ef4_get_irq_moderation(struct ef4_nic *efx, unsigned int *tx_usecs, in ef4_get_irq_moderation() argument
1944 *rx_adaptive = efx->irq_rx_adaptive; in ef4_get_irq_moderation()
1945 *rx_usecs = efx->irq_rx_moderation_us; in ef4_get_irq_moderation()
1951 if (efx->tx_channel_offset == 0) { in ef4_get_irq_moderation()
1956 tx_channel = efx->channel[efx->tx_channel_offset]; in ef4_get_irq_moderation()
1970 struct ef4_nic *efx = container_of(data, struct ef4_nic, in ef4_monitor() local
1973 netif_vdbg(efx, timer, efx->net_dev, in ef4_monitor()
1976 BUG_ON(efx->type->monitor == NULL); in ef4_monitor()
1981 if (mutex_trylock(&efx->mac_lock)) { in ef4_monitor()
1982 if (efx->port_enabled) in ef4_monitor()
1983 efx->type->monitor(efx); in ef4_monitor()
1984 mutex_unlock(&efx->mac_lock); in ef4_monitor()
1987 queue_delayed_work(efx->workqueue, &efx->monitor_work, in ef4_monitor()
2002 struct ef4_nic *efx = netdev_priv(net_dev); in ef4_ioctl() local
2010 return mdio_mii_ioctl(&efx->mdio, data, cmd); in ef4_ioctl()
2021 struct ef4_nic *efx = channel->efx; in ef4_init_napi_channel() local
2023 channel->napi_dev = efx->net_dev; in ef4_init_napi_channel()
2028 static void ef4_init_napi(struct ef4_nic *efx) in ef4_init_napi() argument
2032 ef4_for_each_channel(channel, efx) in ef4_init_napi()
2044 static void ef4_fini_napi(struct ef4_nic *efx) in ef4_fini_napi() argument
2048 ef4_for_each_channel(channel, efx) in ef4_fini_napi()
2061 struct ef4_nic *efx = netdev_priv(net_dev); in ef4_net_open() local
2064 netif_dbg(efx, ifup, efx->net_dev, "opening device on CPU %d\n", in ef4_net_open()
2067 rc = ef4_check_disabled(efx); in ef4_net_open()
2070 if (efx->phy_mode & PHY_MODE_SPECIAL) in ef4_net_open()
2075 ef4_link_status_changed(efx); in ef4_net_open()
2077 ef4_start_all(efx); in ef4_net_open()
2078 ef4_selftest_async_start(efx); in ef4_net_open()
2088 struct ef4_nic *efx = netdev_priv(net_dev); in ef4_net_stop() local
2090 netif_dbg(efx, ifdown, efx->net_dev, "closing on CPU %d\n", in ef4_net_stop()
2094 ef4_stop_all(efx); in ef4_net_stop()
2103 struct ef4_nic *efx = netdev_priv(net_dev); in ef4_net_stats() local
2105 spin_lock_bh(&efx->stats_lock); in ef4_net_stats()
2106 efx->type->update_stats(efx, NULL, stats); in ef4_net_stats()
2107 spin_unlock_bh(&efx->stats_lock); in ef4_net_stats()
2113 struct ef4_nic *efx = netdev_priv(net_dev); in ef4_watchdog() local
2115 netif_err(efx, tx_err, efx->net_dev, in ef4_watchdog()
2117 efx->port_enabled); in ef4_watchdog()
2119 ef4_schedule_reset(efx, RESET_TYPE_TX_WATCHDOG); in ef4_watchdog()
2126 struct ef4_nic *efx = netdev_priv(net_dev); in ef4_change_mtu() local
2129 rc = ef4_check_disabled(efx); in ef4_change_mtu()
2133 netif_dbg(efx, drv, efx->net_dev, "changing MTU to %d\n", new_mtu); in ef4_change_mtu()
2135 ef4_device_detach_sync(efx); in ef4_change_mtu()
2136 ef4_stop_all(efx); in ef4_change_mtu()
2138 mutex_lock(&efx->mac_lock); in ef4_change_mtu()
2140 ef4_mac_reconfigure(efx); in ef4_change_mtu()
2141 mutex_unlock(&efx->mac_lock); in ef4_change_mtu()
2143 ef4_start_all(efx); in ef4_change_mtu()
2144 netif_device_attach(efx->net_dev); in ef4_change_mtu()
2150 struct ef4_nic *efx = netdev_priv(net_dev); in ef4_set_mac_address() local
2157 netif_err(efx, drv, efx->net_dev, in ef4_set_mac_address()
2166 if (efx->type->set_mac_address) { in ef4_set_mac_address()
2167 rc = efx->type->set_mac_address(efx); in ef4_set_mac_address()
2175 mutex_lock(&efx->mac_lock); in ef4_set_mac_address()
2176 ef4_mac_reconfigure(efx); in ef4_set_mac_address()
2177 mutex_unlock(&efx->mac_lock); in ef4_set_mac_address()
2185 struct ef4_nic *efx = netdev_priv(net_dev); in ef4_set_rx_mode() local
2187 if (efx->port_enabled) in ef4_set_rx_mode()
2188 queue_work(efx->workqueue, &efx->mac_work); in ef4_set_rx_mode()
2194 struct ef4_nic *efx = netdev_priv(net_dev); in ef4_set_features() local
2199 rc = efx->type->filter_clear_rx(efx, EF4_FILTER_PRI_MANUAL); in ef4_set_features()
2233 static void ef4_update_name(struct ef4_nic *efx) in ef4_update_name() argument
2235 strcpy(efx->name, efx->net_dev->name); in ef4_update_name()
2236 ef4_mtd_rename(efx); in ef4_update_name()
2237 ef4_set_channel_names(efx); in ef4_update_name()
2259 struct ef4_nic *efx = dev_get_drvdata(dev); in show_phy_type() local
2260 return sprintf(buf, "%d\n", efx->phy_type); in show_phy_type()
2264 static int ef4_register_netdev(struct ef4_nic *efx) in ef4_register_netdev() argument
2266 struct net_device *net_dev = efx->net_dev; in ef4_register_netdev()
2271 net_dev->irq = efx->pci_dev->irq; in ef4_register_netdev()
2284 efx->state = STATE_READY; in ef4_register_netdev()
2286 if (efx->reset_pending) { in ef4_register_netdev()
2287 netif_err(efx, probe, efx->net_dev, in ef4_register_netdev()
2296 ef4_update_name(efx); in ef4_register_netdev()
2305 ef4_for_each_channel(channel, efx) { in ef4_register_netdev()
2311 ef4_associate(efx); in ef4_register_netdev()
2315 rc = device_create_file(&efx->pci_dev->dev, &dev_attr_phy_type); in ef4_register_netdev()
2317 netif_err(efx, drv, efx->net_dev, in ef4_register_netdev()
2325 ef4_dissociate(efx); in ef4_register_netdev()
2328 efx->state = STATE_UNINIT; in ef4_register_netdev()
2330 netif_err(efx, drv, efx->net_dev, "could not register net dev\n"); in ef4_register_netdev()
2334 static void ef4_unregister_netdev(struct ef4_nic *efx) in ef4_unregister_netdev() argument
2336 if (!efx->net_dev) in ef4_unregister_netdev()
2339 BUG_ON(netdev_priv(efx->net_dev) != efx); in ef4_unregister_netdev()
2341 if (ef4_dev_registered(efx)) { in ef4_unregister_netdev()
2342 strlcpy(efx->name, pci_name(efx->pci_dev), sizeof(efx->name)); in ef4_unregister_netdev()
2343 device_remove_file(&efx->pci_dev->dev, &dev_attr_phy_type); in ef4_unregister_netdev()
2344 unregister_netdev(efx->net_dev); in ef4_unregister_netdev()
2356 void ef4_reset_down(struct ef4_nic *efx, enum reset_type method) in ef4_reset_down() argument
2358 EF4_ASSERT_RESET_SERIALISED(efx); in ef4_reset_down()
2360 ef4_stop_all(efx); in ef4_reset_down()
2361 ef4_disable_interrupts(efx); in ef4_reset_down()
2363 mutex_lock(&efx->mac_lock); in ef4_reset_down()
2364 if (efx->port_initialized && method != RESET_TYPE_INVISIBLE && in ef4_reset_down()
2366 efx->phy_op->fini(efx); in ef4_reset_down()
2367 efx->type->fini(efx); in ef4_reset_down()
2375 int ef4_reset_up(struct ef4_nic *efx, enum reset_type method, bool ok) in ef4_reset_up() argument
2379 EF4_ASSERT_RESET_SERIALISED(efx); in ef4_reset_up()
2382 rc = efx->type->init(efx); in ef4_reset_up()
2384 netif_err(efx, drv, efx->net_dev, "failed to initialise NIC\n"); in ef4_reset_up()
2391 if (efx->port_initialized && method != RESET_TYPE_INVISIBLE && in ef4_reset_up()
2393 rc = efx->phy_op->init(efx); in ef4_reset_up()
2396 rc = efx->phy_op->reconfigure(efx); in ef4_reset_up()
2398 netif_err(efx, drv, efx->net_dev, in ef4_reset_up()
2402 rc = ef4_enable_interrupts(efx); in ef4_reset_up()
2406 down_read(&efx->filter_sem); in ef4_reset_up()
2407 ef4_restore_filters(efx); in ef4_reset_up()
2408 up_read(&efx->filter_sem); in ef4_reset_up()
2410 mutex_unlock(&efx->mac_lock); in ef4_reset_up()
2412 ef4_start_all(efx); in ef4_reset_up()
2417 efx->port_initialized = false; in ef4_reset_up()
2419 mutex_unlock(&efx->mac_lock); in ef4_reset_up()
2429 int ef4_reset(struct ef4_nic *efx, enum reset_type method) in ef4_reset() argument
2434 netif_info(efx, drv, efx->net_dev, "resetting (%s)\n", in ef4_reset()
2437 ef4_device_detach_sync(efx); in ef4_reset()
2438 ef4_reset_down(efx, method); in ef4_reset()
2440 rc = efx->type->reset(efx, method); in ef4_reset()
2442 netif_err(efx, drv, efx->net_dev, "failed to reset hardware\n"); in ef4_reset()
2450 efx->reset_pending &= -(1 << (method + 1)); in ef4_reset()
2452 __clear_bit(method, &efx->reset_pending); in ef4_reset()
2458 pci_set_master(efx->pci_dev); in ef4_reset()
2465 rc2 = ef4_reset_up(efx, method, !disabled); in ef4_reset()
2473 dev_close(efx->net_dev); in ef4_reset()
2474 netif_err(efx, drv, efx->net_dev, "has been disabled\n"); in ef4_reset()
2475 efx->state = STATE_DISABLED; in ef4_reset()
2477 netif_dbg(efx, drv, efx->net_dev, "reset complete\n"); in ef4_reset()
2478 netif_device_attach(efx->net_dev); in ef4_reset()
2488 int ef4_try_recovery(struct ef4_nic *efx) in ef4_try_recovery() argument
2496 struct eeh_dev *eehdev = pci_dev_to_eeh_dev(efx->pci_dev); in ef4_try_recovery()
2512 struct ef4_nic *efx = container_of(data, struct ef4_nic, reset_work); in ef4_reset_work() local
2516 pending = READ_ONCE(efx->reset_pending); in ef4_reset_work()
2521 ef4_try_recovery(efx)) in ef4_reset_work()
2533 if (efx->state == STATE_READY) in ef4_reset_work()
2534 (void)ef4_reset(efx, method); in ef4_reset_work()
2539 void ef4_schedule_reset(struct ef4_nic *efx, enum reset_type type) in ef4_schedule_reset() argument
2543 if (efx->state == STATE_RECOVERY) { in ef4_schedule_reset()
2544 netif_dbg(efx, drv, efx->net_dev, in ef4_schedule_reset()
2559 netif_dbg(efx, drv, efx->net_dev, "scheduling %s reset\n", in ef4_schedule_reset()
2563 method = efx->type->map_reset_reason(type); in ef4_schedule_reset()
2564 netif_dbg(efx, drv, efx->net_dev, in ef4_schedule_reset()
2570 set_bit(method, &efx->reset_pending); in ef4_schedule_reset()
2576 if (READ_ONCE(efx->state) != STATE_READY) in ef4_schedule_reset()
2579 queue_work(reset_workqueue, &efx->reset_work); in ef4_schedule_reset()
2608 int ef4_port_dummy_op_int(struct ef4_nic *efx) in ef4_port_dummy_op_int() argument
2612 void ef4_port_dummy_op_void(struct ef4_nic *efx) {} in ef4_port_dummy_op_void() argument
2614 static bool ef4_port_dummy_op_poll(struct ef4_nic *efx) in ef4_port_dummy_op_poll() argument
2635 static int ef4_init_struct(struct ef4_nic *efx, in ef4_init_struct() argument
2641 INIT_LIST_HEAD(&efx->node); in ef4_init_struct()
2642 INIT_LIST_HEAD(&efx->secondary_list); in ef4_init_struct()
2643 spin_lock_init(&efx->biu_lock); in ef4_init_struct()
2645 INIT_LIST_HEAD(&efx->mtd_list); in ef4_init_struct()
2647 INIT_WORK(&efx->reset_work, ef4_reset_work); in ef4_init_struct()
2648 INIT_DELAYED_WORK(&efx->monitor_work, ef4_monitor); in ef4_init_struct()
2649 INIT_DELAYED_WORK(&efx->selftest_work, ef4_selftest_async_work); in ef4_init_struct()
2650 efx->pci_dev = pci_dev; in ef4_init_struct()
2651 efx->msg_enable = debug; in ef4_init_struct()
2652 efx->state = STATE_UNINIT; in ef4_init_struct()
2653 strlcpy(efx->name, pci_name(pci_dev), sizeof(efx->name)); in ef4_init_struct()
2655 efx->net_dev = net_dev; in ef4_init_struct()
2656 efx->rx_prefix_size = efx->type->rx_prefix_size; in ef4_init_struct()
2657 efx->rx_ip_align = in ef4_init_struct()
2658 NET_IP_ALIGN ? (efx->rx_prefix_size + NET_IP_ALIGN) % 4 : 0; in ef4_init_struct()
2659 efx->rx_packet_hash_offset = in ef4_init_struct()
2660 efx->type->rx_hash_offset - efx->type->rx_prefix_size; in ef4_init_struct()
2661 efx->rx_packet_ts_offset = in ef4_init_struct()
2662 efx->type->rx_ts_offset - efx->type->rx_prefix_size; in ef4_init_struct()
2663 spin_lock_init(&efx->stats_lock); in ef4_init_struct()
2664 mutex_init(&efx->mac_lock); in ef4_init_struct()
2665 efx->phy_op = &ef4_dummy_phy_operations; in ef4_init_struct()
2666 efx->mdio.dev = net_dev; in ef4_init_struct()
2667 INIT_WORK(&efx->mac_work, ef4_mac_work); in ef4_init_struct()
2668 init_waitqueue_head(&efx->flush_wq); in ef4_init_struct()
2671 efx->channel[i] = ef4_alloc_channel(efx, i, NULL); in ef4_init_struct()
2672 if (!efx->channel[i]) in ef4_init_struct()
2674 efx->msi_context[i].efx = efx; in ef4_init_struct()
2675 efx->msi_context[i].index = i; in ef4_init_struct()
2679 efx->interrupt_mode = max(efx->type->max_interrupt_mode, in ef4_init_struct()
2683 snprintf(efx->workqueue_name, sizeof(efx->workqueue_name), "sfc%s", in ef4_init_struct()
2685 efx->workqueue = create_singlethread_workqueue(efx->workqueue_name); in ef4_init_struct()
2686 if (!efx->workqueue) in ef4_init_struct()
2692 ef4_fini_struct(efx); in ef4_init_struct()
2696 static void ef4_fini_struct(struct ef4_nic *efx) in ef4_fini_struct() argument
2701 kfree(efx->channel[i]); in ef4_fini_struct()
2703 kfree(efx->vpd_sn); in ef4_fini_struct()
2705 if (efx->workqueue) { in ef4_fini_struct()
2706 destroy_workqueue(efx->workqueue); in ef4_fini_struct()
2707 efx->workqueue = NULL; in ef4_fini_struct()
2711 void ef4_update_sw_stats(struct ef4_nic *efx, u64 *stats) in ef4_update_sw_stats() argument
2716 ef4_for_each_channel(channel, efx) in ef4_update_sw_stats()
2719 stats[GENERIC_STAT_rx_noskb_drops] = atomic_read(&efx->n_rx_noskb_drops); in ef4_update_sw_stats()
2731 static void ef4_pci_remove_main(struct ef4_nic *efx) in ef4_pci_remove_main() argument
2736 BUG_ON(efx->state == STATE_READY); in ef4_pci_remove_main()
2737 cancel_work_sync(&efx->reset_work); in ef4_pci_remove_main()
2739 ef4_disable_interrupts(efx); in ef4_pci_remove_main()
2740 ef4_nic_fini_interrupt(efx); in ef4_pci_remove_main()
2741 ef4_fini_port(efx); in ef4_pci_remove_main()
2742 efx->type->fini(efx); in ef4_pci_remove_main()
2743 ef4_fini_napi(efx); in ef4_pci_remove_main()
2744 ef4_remove_all(efx); in ef4_pci_remove_main()
2753 struct ef4_nic *efx; in ef4_pci_remove() local
2755 efx = pci_get_drvdata(pci_dev); in ef4_pci_remove()
2756 if (!efx) in ef4_pci_remove()
2761 ef4_dissociate(efx); in ef4_pci_remove()
2762 dev_close(efx->net_dev); in ef4_pci_remove()
2763 ef4_disable_interrupts(efx); in ef4_pci_remove()
2764 efx->state = STATE_UNINIT; in ef4_pci_remove()
2767 ef4_unregister_netdev(efx); in ef4_pci_remove()
2769 ef4_mtd_remove(efx); in ef4_pci_remove()
2771 ef4_pci_remove_main(efx); in ef4_pci_remove()
2773 ef4_fini_io(efx); in ef4_pci_remove()
2774 netif_dbg(efx, drv, efx->net_dev, "shutdown successful\n"); in ef4_pci_remove()
2776 ef4_fini_struct(efx); in ef4_pci_remove()
2777 free_netdev(efx->net_dev); in ef4_pci_remove()
2788 static void ef4_probe_vpd_strings(struct ef4_nic *efx) in ef4_probe_vpd_strings() argument
2790 struct pci_dev *dev = efx->pci_dev; in ef4_probe_vpd_strings()
2798 netif_err(efx, drv, efx->net_dev, "Unable to read VPD\n"); in ef4_probe_vpd_strings()
2805 netif_err(efx, drv, efx->net_dev, "VPD Read-only not found\n"); in ef4_probe_vpd_strings()
2818 netif_err(efx, drv, efx->net_dev, "Part number not found\n"); in ef4_probe_vpd_strings()
2825 netif_err(efx, drv, efx->net_dev, "Incomplete part number\n"); in ef4_probe_vpd_strings()
2829 netif_info(efx, drv, efx->net_dev, in ef4_probe_vpd_strings()
2836 netif_err(efx, drv, efx->net_dev, "Serial number not found\n"); in ef4_probe_vpd_strings()
2843 netif_err(efx, drv, efx->net_dev, "Incomplete serial number\n"); in ef4_probe_vpd_strings()
2847 efx->vpd_sn = kmalloc(j + 1, GFP_KERNEL); in ef4_probe_vpd_strings()
2848 if (!efx->vpd_sn) in ef4_probe_vpd_strings()
2851 snprintf(efx->vpd_sn, j + 1, "%s", &vpd_data[i]); in ef4_probe_vpd_strings()
2858 static int ef4_pci_probe_main(struct ef4_nic *efx) in ef4_pci_probe_main() argument
2863 rc = ef4_probe_all(efx); in ef4_pci_probe_main()
2867 ef4_init_napi(efx); in ef4_pci_probe_main()
2869 rc = efx->type->init(efx); in ef4_pci_probe_main()
2871 netif_err(efx, probe, efx->net_dev, in ef4_pci_probe_main()
2876 rc = ef4_init_port(efx); in ef4_pci_probe_main()
2878 netif_err(efx, probe, efx->net_dev, in ef4_pci_probe_main()
2883 rc = ef4_nic_init_interrupt(efx); in ef4_pci_probe_main()
2886 rc = ef4_enable_interrupts(efx); in ef4_pci_probe_main()
2893 ef4_nic_fini_interrupt(efx); in ef4_pci_probe_main()
2895 ef4_fini_port(efx); in ef4_pci_probe_main()
2897 efx->type->fini(efx); in ef4_pci_probe_main()
2899 ef4_fini_napi(efx); in ef4_pci_probe_main()
2900 ef4_remove_all(efx); in ef4_pci_probe_main()
2918 struct ef4_nic *efx; in ef4_pci_probe() local
2922 net_dev = alloc_etherdev_mqs(sizeof(*efx), EF4_MAX_CORE_TX_QUEUES, in ef4_pci_probe()
2926 efx = netdev_priv(net_dev); in ef4_pci_probe()
2927 efx->type = (const struct ef4_nic_type *) entry->driver_data; in ef4_pci_probe()
2928 efx->fixed_features |= NETIF_F_HIGHDMA; in ef4_pci_probe()
2930 pci_set_drvdata(pci_dev, efx); in ef4_pci_probe()
2932 rc = ef4_init_struct(efx, pci_dev, net_dev); in ef4_pci_probe()
2936 netif_info(efx, probe, efx->net_dev, in ef4_pci_probe()
2939 ef4_probe_vpd_strings(efx); in ef4_pci_probe()
2942 rc = ef4_init_io(efx); in ef4_pci_probe()
2946 rc = ef4_pci_probe_main(efx); in ef4_pci_probe()
2950 net_dev->features |= (efx->type->offload_features | NETIF_F_SG | in ef4_pci_probe()
2956 net_dev->hw_features = net_dev->features & ~efx->fixed_features; in ef4_pci_probe()
2963 net_dev->features |= efx->fixed_features; in ef4_pci_probe()
2965 rc = ef4_register_netdev(efx); in ef4_pci_probe()
2969 netif_dbg(efx, probe, efx->net_dev, "initialisation successful\n"); in ef4_pci_probe()
2973 rc = ef4_mtd_probe(efx); in ef4_pci_probe()
2976 netif_warn(efx, probe, efx->net_dev, in ef4_pci_probe()
2981 netif_notice(efx, probe, efx->net_dev, in ef4_pci_probe()
2988 ef4_pci_remove_main(efx); in ef4_pci_probe()
2990 ef4_fini_io(efx); in ef4_pci_probe()
2992 ef4_fini_struct(efx); in ef4_pci_probe()
2995 netif_dbg(efx, drv, efx->net_dev, "initialisation failed. rc=%d\n", rc); in ef4_pci_probe()
3002 struct ef4_nic *efx = dev_get_drvdata(dev); in ef4_pm_freeze() local
3006 if (efx->state != STATE_DISABLED) { in ef4_pm_freeze()
3007 efx->state = STATE_UNINIT; in ef4_pm_freeze()
3009 ef4_device_detach_sync(efx); in ef4_pm_freeze()
3011 ef4_stop_all(efx); in ef4_pm_freeze()
3012 ef4_disable_interrupts(efx); in ef4_pm_freeze()
3023 struct ef4_nic *efx = dev_get_drvdata(dev); in ef4_pm_thaw() local
3027 if (efx->state != STATE_DISABLED) { in ef4_pm_thaw()
3028 rc = ef4_enable_interrupts(efx); in ef4_pm_thaw()
3032 mutex_lock(&efx->mac_lock); in ef4_pm_thaw()
3033 efx->phy_op->reconfigure(efx); in ef4_pm_thaw()
3034 mutex_unlock(&efx->mac_lock); in ef4_pm_thaw()
3036 ef4_start_all(efx); in ef4_pm_thaw()
3038 netif_device_attach(efx->net_dev); in ef4_pm_thaw()
3040 efx->state = STATE_READY; in ef4_pm_thaw()
3042 efx->type->resume_wol(efx); in ef4_pm_thaw()
3048 queue_work(reset_workqueue, &efx->reset_work); in ef4_pm_thaw()
3061 struct ef4_nic *efx = pci_get_drvdata(pci_dev); in ef4_pm_poweroff() local
3063 efx->type->fini(efx); in ef4_pm_poweroff()
3065 efx->reset_pending = 0; in ef4_pm_poweroff()
3075 struct ef4_nic *efx = pci_get_drvdata(pci_dev); in ef4_pm_resume() local
3085 pci_set_master(efx->pci_dev); in ef4_pm_resume()
3086 rc = efx->type->reset(efx, RESET_TYPE_ALL); in ef4_pm_resume()
3089 rc = efx->type->init(efx); in ef4_pm_resume()
3124 struct ef4_nic *efx = pci_get_drvdata(pdev); in ef4_io_error_detected() local
3131 if (efx->state != STATE_DISABLED) { in ef4_io_error_detected()
3132 efx->state = STATE_RECOVERY; in ef4_io_error_detected()
3133 efx->reset_pending = 0; in ef4_io_error_detected()
3135 ef4_device_detach_sync(efx); in ef4_io_error_detected()
3137 ef4_stop_all(efx); in ef4_io_error_detected()
3138 ef4_disable_interrupts(efx); in ef4_io_error_detected()
3158 struct ef4_nic *efx = pci_get_drvdata(pdev); in ef4_io_slot_reset() local
3162 netif_err(efx, hw, efx->net_dev, in ef4_io_slot_reset()
3173 struct ef4_nic *efx = pci_get_drvdata(pdev); in ef4_io_resume() local
3178 if (efx->state == STATE_DISABLED) in ef4_io_resume()
3181 rc = ef4_reset(efx, RESET_TYPE_ALL); in ef4_io_resume()
3183 netif_err(efx, hw, efx->net_dev, in ef4_io_resume()
3186 efx->state = STATE_READY; in ef4_io_resume()
3187 netif_dbg(efx, hw, efx->net_dev, in ef4_io_resume()