aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/sfc/efx.c44
-rw-r--r--drivers/net/sfc/ethtool.c2
-rw-r--r--drivers/net/sfc/falcon.c79
-rw-r--r--drivers/net/sfc/falcon.h12
-rw-r--r--drivers/net/sfc/net_driver.h29
-rw-r--r--drivers/net/sfc/selftest.c2
6 files changed, 105 insertions, 63 deletions
diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c
index f5e81114270a..73ab246d9f2a 100644
--- a/drivers/net/sfc/efx.c
+++ b/drivers/net/sfc/efx.c
@@ -274,14 +274,14 @@ static int efx_poll(struct napi_struct *napi, int budget)
274 irq_adapt_low_thresh)) { 274 irq_adapt_low_thresh)) {
275 if (channel->irq_moderation > 1) { 275 if (channel->irq_moderation > 1) {
276 channel->irq_moderation -= 1; 276 channel->irq_moderation -= 1;
277 falcon_set_int_moderation(channel); 277 efx->type->push_irq_moderation(channel);
278 } 278 }
279 } else if (unlikely(channel->irq_mod_score > 279 } else if (unlikely(channel->irq_mod_score >
280 irq_adapt_high_thresh)) { 280 irq_adapt_high_thresh)) {
281 if (channel->irq_moderation < 281 if (channel->irq_moderation <
282 efx->irq_rx_moderation) { 282 efx->irq_rx_moderation) {
283 channel->irq_moderation += 1; 283 channel->irq_moderation += 1;
284 falcon_set_int_moderation(channel); 284 efx->type->push_irq_moderation(channel);
285 } 285 }
286 } 286 }
287 channel->irq_count = 0; 287 channel->irq_count = 0;
@@ -637,7 +637,7 @@ void __efx_reconfigure_port(struct efx_nic *efx)
637 netif_addr_unlock_bh(efx->net_dev); 637 netif_addr_unlock_bh(efx->net_dev);
638 } 638 }
639 639
640 falcon_stop_nic_stats(efx); 640 efx->type->stop_stats(efx);
641 falcon_deconfigure_mac_wrapper(efx); 641 falcon_deconfigure_mac_wrapper(efx);
642 642
643 /* Reconfigure the PHY, disabling transmit in mac level loopback. */ 643 /* Reconfigure the PHY, disabling transmit in mac level loopback. */
@@ -652,7 +652,7 @@ void __efx_reconfigure_port(struct efx_nic *efx)
652 652
653 efx->mac_op->reconfigure(efx); 653 efx->mac_op->reconfigure(efx);
654 654
655 falcon_start_nic_stats(efx); 655 efx->type->start_stats(efx);
656 656
657 /* Inform kernel of loss/gain of carrier */ 657 /* Inform kernel of loss/gain of carrier */
658 efx_link_status_changed(efx); 658 efx_link_status_changed(efx);
@@ -684,7 +684,7 @@ static void efx_mac_work(struct work_struct *data)
684 684
685 mutex_lock(&efx->mac_lock); 685 mutex_lock(&efx->mac_lock);
686 if (efx->port_enabled) { 686 if (efx->port_enabled) {
687 falcon_push_multicast_hash(efx); 687 efx->type->push_multicast_hash(efx);
688 efx->mac_op->reconfigure(efx); 688 efx->mac_op->reconfigure(efx);
689 } 689 }
690 mutex_unlock(&efx->mac_lock); 690 mutex_unlock(&efx->mac_lock);
@@ -696,8 +696,8 @@ static int efx_probe_port(struct efx_nic *efx)
696 696
697 EFX_LOG(efx, "create port\n"); 697 EFX_LOG(efx, "create port\n");
698 698
699 /* Connect up MAC/PHY operations table and read MAC address */ 699 /* Connect up MAC/PHY operations table */
700 rc = falcon_probe_port(efx); 700 rc = efx->type->probe_port(efx);
701 if (rc) 701 if (rc)
702 goto err; 702 goto err;
703 703
@@ -765,7 +765,7 @@ static void efx_start_port(struct efx_nic *efx)
765 765
766 /* efx_mac_work() might have been scheduled after efx_stop_port(), 766 /* efx_mac_work() might have been scheduled after efx_stop_port(),
767 * and then cancelled by efx_flush_all() */ 767 * and then cancelled by efx_flush_all() */
768 falcon_push_multicast_hash(efx); 768 efx->type->push_multicast_hash(efx);
769 efx->mac_op->reconfigure(efx); 769 efx->mac_op->reconfigure(efx);
770 770
771 mutex_unlock(&efx->mac_lock); 771 mutex_unlock(&efx->mac_lock);
@@ -805,7 +805,7 @@ static void efx_remove_port(struct efx_nic *efx)
805{ 805{
806 EFX_LOG(efx, "destroying port\n"); 806 EFX_LOG(efx, "destroying port\n");
807 807
808 falcon_remove_port(efx); 808 efx->type->remove_port(efx);
809} 809}
810 810
811/************************************************************************** 811/**************************************************************************
@@ -1042,7 +1042,7 @@ static int efx_probe_nic(struct efx_nic *efx)
1042 EFX_LOG(efx, "creating NIC\n"); 1042 EFX_LOG(efx, "creating NIC\n");
1043 1043
1044 /* Carry out hardware-type specific initialisation */ 1044 /* Carry out hardware-type specific initialisation */
1045 rc = falcon_probe_nic(efx); 1045 rc = efx->type->probe(efx);
1046 if (rc) 1046 if (rc)
1047 return rc; 1047 return rc;
1048 1048
@@ -1063,7 +1063,7 @@ static void efx_remove_nic(struct efx_nic *efx)
1063 EFX_LOG(efx, "destroying NIC\n"); 1063 EFX_LOG(efx, "destroying NIC\n");
1064 1064
1065 efx_remove_interrupts(efx); 1065 efx_remove_interrupts(efx);
1066 falcon_remove_nic(efx); 1066 efx->type->remove(efx);
1067} 1067}
1068 1068
1069/************************************************************************** 1069/**************************************************************************
@@ -1145,12 +1145,12 @@ static void efx_start_all(struct efx_nic *efx)
1145 1145
1146 falcon_enable_interrupts(efx); 1146 falcon_enable_interrupts(efx);
1147 1147
1148 /* Start hardware monitor if we're in RUNNING */ 1148 /* Start the hardware monitor (if there is one) if we're in RUNNING */
1149 if (efx->state == STATE_RUNNING) 1149 if (efx->state == STATE_RUNNING && efx->type->monitor != NULL)
1150 queue_delayed_work(efx->workqueue, &efx->monitor_work, 1150 queue_delayed_work(efx->workqueue, &efx->monitor_work,
1151 efx_monitor_interval); 1151 efx_monitor_interval);
1152 1152
1153 falcon_start_nic_stats(efx); 1153 efx->type->start_stats(efx);
1154} 1154}
1155 1155
1156/* Flush all delayed work. Should only be called when no more delayed work 1156/* Flush all delayed work. Should only be called when no more delayed work
@@ -1186,7 +1186,7 @@ static void efx_stop_all(struct efx_nic *efx)
1186 if (!efx->port_enabled) 1186 if (!efx->port_enabled)
1187 return; 1187 return;
1188 1188
1189 falcon_stop_nic_stats(efx); 1189 efx->type->stop_stats(efx);
1190 1190
1191 /* Disable interrupts and wait for ISR to complete */ 1191 /* Disable interrupts and wait for ISR to complete */
1192 falcon_disable_interrupts(efx); 1192 falcon_disable_interrupts(efx);
@@ -1284,6 +1284,7 @@ static void efx_monitor(struct work_struct *data)
1284 1284
1285 EFX_TRACE(efx, "hardware monitor executing on CPU %d\n", 1285 EFX_TRACE(efx, "hardware monitor executing on CPU %d\n",
1286 raw_smp_processor_id()); 1286 raw_smp_processor_id());
1287 BUG_ON(efx->type->monitor == NULL);
1287 1288
1288 /* If the mac_lock is already held then it is likely a port 1289 /* If the mac_lock is already held then it is likely a port
1289 * reconfiguration is already in place, which will likely do 1290 * reconfiguration is already in place, which will likely do
@@ -1292,7 +1293,7 @@ static void efx_monitor(struct work_struct *data)
1292 goto out_requeue; 1293 goto out_requeue;
1293 if (!efx->port_enabled) 1294 if (!efx->port_enabled)
1294 goto out_unlock; 1295 goto out_unlock;
1295 falcon_monitor(efx); 1296 efx->type->monitor(efx);
1296 1297
1297out_unlock: 1298out_unlock:
1298 mutex_unlock(&efx->mac_lock); 1299 mutex_unlock(&efx->mac_lock);
@@ -1430,7 +1431,7 @@ static struct net_device_stats *efx_net_stats(struct net_device *net_dev)
1430 struct net_device_stats *stats = &net_dev->stats; 1431 struct net_device_stats *stats = &net_dev->stats;
1431 1432
1432 spin_lock_bh(&efx->stats_lock); 1433 spin_lock_bh(&efx->stats_lock);
1433 falcon_update_nic_stats(efx); 1434 efx->type->update_stats(efx);
1434 spin_unlock_bh(&efx->stats_lock); 1435 spin_unlock_bh(&efx->stats_lock);
1435 1436
1436 stats->rx_packets = mac_stats->rx_packets; 1437 stats->rx_packets = mac_stats->rx_packets;
@@ -1695,6 +1696,7 @@ void efx_reset_down(struct efx_nic *efx, enum reset_type method,
1695 efx_fini_channels(efx); 1696 efx_fini_channels(efx);
1696 if (efx->port_initialized && method != RESET_TYPE_INVISIBLE) 1697 if (efx->port_initialized && method != RESET_TYPE_INVISIBLE)
1697 efx->phy_op->fini(efx); 1698 efx->phy_op->fini(efx);
1699 efx->type->fini(efx);
1698} 1700}
1699 1701
1700/* This function will always ensure that the locks acquired in 1702/* This function will always ensure that the locks acquired in
@@ -1709,7 +1711,7 @@ int efx_reset_up(struct efx_nic *efx, enum reset_type method,
1709 1711
1710 EFX_ASSERT_RESET_SERIALISED(efx); 1712 EFX_ASSERT_RESET_SERIALISED(efx);
1711 1713
1712 rc = falcon_init_nic(efx); 1714 rc = efx->type->init(efx);
1713 if (rc) { 1715 if (rc) {
1714 EFX_ERR(efx, "failed to initialise NIC\n"); 1716 EFX_ERR(efx, "failed to initialise NIC\n");
1715 ok = false; 1717 ok = false;
@@ -1769,7 +1771,7 @@ static int efx_reset(struct efx_nic *efx)
1769 1771
1770 efx_reset_down(efx, method, &ecmd); 1772 efx_reset_down(efx, method, &ecmd);
1771 1773
1772 rc = falcon_reset_hw(efx, method); 1774 rc = efx->type->reset(efx, method);
1773 if (rc) { 1775 if (rc) {
1774 EFX_ERR(efx, "failed to reset hardware\n"); 1776 EFX_ERR(efx, "failed to reset hardware\n");
1775 goto out_disable; 1777 goto out_disable;
@@ -2005,6 +2007,7 @@ static void efx_pci_remove_main(struct efx_nic *efx)
2005 falcon_fini_interrupt(efx); 2007 falcon_fini_interrupt(efx);
2006 efx_fini_channels(efx); 2008 efx_fini_channels(efx);
2007 efx_fini_port(efx); 2009 efx_fini_port(efx);
2010 efx->type->fini(efx);
2008 efx_fini_napi(efx); 2011 efx_fini_napi(efx);
2009 efx_remove_all(efx); 2012 efx_remove_all(efx);
2010} 2013}
@@ -2064,7 +2067,7 @@ static int efx_pci_probe_main(struct efx_nic *efx)
2064 if (rc) 2067 if (rc)
2065 goto fail2; 2068 goto fail2;
2066 2069
2067 rc = falcon_init_nic(efx); 2070 rc = efx->type->init(efx);
2068 if (rc) { 2071 if (rc) {
2069 EFX_ERR(efx, "failed to initialise NIC\n"); 2072 EFX_ERR(efx, "failed to initialise NIC\n");
2070 goto fail3; 2073 goto fail3;
@@ -2088,6 +2091,7 @@ static int efx_pci_probe_main(struct efx_nic *efx)
2088 efx_fini_channels(efx); 2091 efx_fini_channels(efx);
2089 efx_fini_port(efx); 2092 efx_fini_port(efx);
2090 fail4: 2093 fail4:
2094 efx->type->fini(efx);
2091 fail3: 2095 fail3:
2092 efx_fini_napi(efx); 2096 efx_fini_napi(efx);
2093 fail2: 2097 fail2:
diff --git a/drivers/net/sfc/ethtool.c b/drivers/net/sfc/ethtool.c
index d3da360f09bc..49e0aed920d3 100644
--- a/drivers/net/sfc/ethtool.c
+++ b/drivers/net/sfc/ethtool.c
@@ -649,7 +649,7 @@ static int efx_ethtool_set_coalesce(struct net_device *net_dev,
649 649
650 efx_init_irq_moderation(efx, tx_usecs, rx_usecs, adaptive); 650 efx_init_irq_moderation(efx, tx_usecs, rx_usecs, adaptive);
651 efx_for_each_channel(channel, efx) 651 efx_for_each_channel(channel, efx)
652 falcon_set_int_moderation(channel); 652 efx->type->push_irq_moderation(channel);
653 653
654 return 0; 654 return 0;
655} 655}
diff --git a/drivers/net/sfc/falcon.c b/drivers/net/sfc/falcon.c
index 040f553de665..f6d10213d0b7 100644
--- a/drivers/net/sfc/falcon.c
+++ b/drivers/net/sfc/falcon.c
@@ -1041,7 +1041,7 @@ int falcon_process_eventq(struct efx_channel *channel, int rx_quota)
1041 return rx_packets; 1041 return rx_packets;
1042} 1042}
1043 1043
1044void falcon_set_int_moderation(struct efx_channel *channel) 1044static void falcon_push_irq_moderation(struct efx_channel *channel)
1045{ 1045{
1046 efx_dword_t timer_cmd; 1046 efx_dword_t timer_cmd;
1047 struct efx_nic *efx = channel->efx; 1047 struct efx_nic *efx = channel->efx;
@@ -1098,7 +1098,7 @@ void falcon_init_eventq(struct efx_channel *channel)
1098 efx_writeo_table(efx, &evq_ptr, efx->type->evq_ptr_tbl_base, 1098 efx_writeo_table(efx, &evq_ptr, efx->type->evq_ptr_tbl_base,
1099 channel->channel); 1099 channel->channel);
1100 1100
1101 falcon_set_int_moderation(channel); 1101 falcon_push_irq_moderation(channel);
1102} 1102}
1103 1103
1104void falcon_fini_eventq(struct efx_channel *channel) 1104void falcon_fini_eventq(struct efx_channel *channel)
@@ -1212,7 +1212,8 @@ int falcon_flush_queues(struct efx_nic *efx)
1212 struct efx_tx_queue *tx_queue; 1212 struct efx_tx_queue *tx_queue;
1213 int i, tx_pending, rx_pending; 1213 int i, tx_pending, rx_pending;
1214 1214
1215 falcon_prepare_flush(efx); 1215 /* If necessary prepare the hardware for flushing */
1216 efx->type->prepare_flush(efx);
1216 1217
1217 /* Flush all tx queues in parallel */ 1218 /* Flush all tx queues in parallel */
1218 efx_for_each_tx_queue(tx_queue, efx) 1219 efx_for_each_tx_queue(tx_queue, efx)
@@ -1825,6 +1826,16 @@ int falcon_spi_write(const struct efx_spi_device *spi, loff_t start,
1825 ************************************************************************** 1826 **************************************************************************
1826 */ 1827 */
1827 1828
1829static void falcon_push_multicast_hash(struct efx_nic *efx)
1830{
1831 union efx_multicast_hash *mc_hash = &efx->multicast_hash;
1832
1833 WARN_ON(!mutex_is_locked(&efx->mac_lock));
1834
1835 efx_writeo(efx, &mc_hash->oword[0], FR_AB_MAC_MC_HASH_REG0);
1836 efx_writeo(efx, &mc_hash->oword[1], FR_AB_MAC_MC_HASH_REG1);
1837}
1838
1828static int falcon_reset_macs(struct efx_nic *efx) 1839static int falcon_reset_macs(struct efx_nic *efx)
1829{ 1840{
1830 efx_oword_t reg; 1841 efx_oword_t reg;
@@ -2240,7 +2251,7 @@ out:
2240} 2251}
2241 2252
2242/* This call is responsible for hooking in the MAC and PHY operations */ 2253/* This call is responsible for hooking in the MAC and PHY operations */
2243int falcon_probe_port(struct efx_nic *efx) 2254static int falcon_probe_port(struct efx_nic *efx)
2244{ 2255{
2245 int rc; 2256 int rc;
2246 2257
@@ -2299,31 +2310,13 @@ int falcon_probe_port(struct efx_nic *efx)
2299 return 0; 2310 return 0;
2300} 2311}
2301 2312
2302void falcon_remove_port(struct efx_nic *efx) 2313static void falcon_remove_port(struct efx_nic *efx)
2303{ 2314{
2304 falcon_free_buffer(efx, &efx->stats_buffer); 2315 falcon_free_buffer(efx, &efx->stats_buffer);
2305} 2316}
2306 2317
2307/************************************************************************** 2318/**************************************************************************
2308 * 2319 *
2309 * Multicast filtering
2310 *
2311 **************************************************************************
2312 */
2313
2314void falcon_push_multicast_hash(struct efx_nic *efx)
2315{
2316 union efx_multicast_hash *mc_hash = &efx->multicast_hash;
2317
2318 WARN_ON(!mutex_is_locked(&efx->mac_lock));
2319
2320 efx_writeo(efx, &mc_hash->oword[0], FR_AB_MAC_MC_HASH_REG0);
2321 efx_writeo(efx, &mc_hash->oword[1], FR_AB_MAC_MC_HASH_REG1);
2322}
2323
2324
2325/**************************************************************************
2326 *
2327 * Falcon test code 2320 * Falcon test code
2328 * 2321 *
2329 **************************************************************************/ 2322 **************************************************************************/
@@ -2503,7 +2496,7 @@ fail:
2503 2496
2504/* Resets NIC to known state. This routine must be called in process 2497/* Resets NIC to known state. This routine must be called in process
2505 * context and is allowed to sleep. */ 2498 * context and is allowed to sleep. */
2506int falcon_reset_hw(struct efx_nic *efx, enum reset_type method) 2499static int falcon_reset_hw(struct efx_nic *efx, enum reset_type method)
2507{ 2500{
2508 struct falcon_nic_data *nic_data = efx->nic_data; 2501 struct falcon_nic_data *nic_data = efx->nic_data;
2509 efx_oword_t glb_ctl_reg_ker; 2502 efx_oword_t glb_ctl_reg_ker;
@@ -2592,7 +2585,7 @@ fail5:
2592 return rc; 2585 return rc;
2593} 2586}
2594 2587
2595void falcon_monitor(struct efx_nic *efx) 2588static void falcon_monitor(struct efx_nic *efx)
2596{ 2589{
2597 bool link_changed; 2590 bool link_changed;
2598 int rc; 2591 int rc;
@@ -2850,7 +2843,7 @@ static void falcon_probe_spi_devices(struct efx_nic *efx)
2850 large_eeprom_type); 2843 large_eeprom_type);
2851} 2844}
2852 2845
2853int falcon_probe_nic(struct efx_nic *efx) 2846static int falcon_probe_nic(struct efx_nic *efx)
2854{ 2847{
2855 struct falcon_nic_data *nic_data; 2848 struct falcon_nic_data *nic_data;
2856 struct falcon_board *board; 2849 struct falcon_board *board;
@@ -3006,7 +2999,7 @@ static void falcon_init_rx_cfg(struct efx_nic *efx)
3006 * defining the descriptor cache sizes and number of RSS channels. 2999 * defining the descriptor cache sizes and number of RSS channels.
3007 * It does not set up any buffers, descriptor rings or event queues. 3000 * It does not set up any buffers, descriptor rings or event queues.
3008 */ 3001 */
3009int falcon_init_nic(struct efx_nic *efx) 3002static int falcon_init_nic(struct efx_nic *efx)
3010{ 3003{
3011 efx_oword_t temp; 3004 efx_oword_t temp;
3012 int rc; 3005 int rc;
@@ -3139,7 +3132,7 @@ int falcon_init_nic(struct efx_nic *efx)
3139 return 0; 3132 return 0;
3140} 3133}
3141 3134
3142void falcon_remove_nic(struct efx_nic *efx) 3135static void falcon_remove_nic(struct efx_nic *efx)
3143{ 3136{
3144 struct falcon_nic_data *nic_data = efx->nic_data; 3137 struct falcon_nic_data *nic_data = efx->nic_data;
3145 struct falcon_board *board = falcon_board(efx); 3138 struct falcon_board *board = falcon_board(efx);
@@ -3168,7 +3161,7 @@ void falcon_remove_nic(struct efx_nic *efx)
3168 efx->nic_data = NULL; 3161 efx->nic_data = NULL;
3169} 3162}
3170 3163
3171void falcon_update_nic_stats(struct efx_nic *efx) 3164static void falcon_update_nic_stats(struct efx_nic *efx)
3172{ 3165{
3173 struct falcon_nic_data *nic_data = efx->nic_data; 3166 struct falcon_nic_data *nic_data = efx->nic_data;
3174 efx_oword_t cnt; 3167 efx_oword_t cnt;
@@ -3232,6 +3225,20 @@ void falcon_stop_nic_stats(struct efx_nic *efx)
3232 */ 3225 */
3233 3226
3234struct efx_nic_type falcon_a1_nic_type = { 3227struct efx_nic_type falcon_a1_nic_type = {
3228 .probe = falcon_probe_nic,
3229 .remove = falcon_remove_nic,
3230 .init = falcon_init_nic,
3231 .fini = efx_port_dummy_op_void,
3232 .monitor = falcon_monitor,
3233 .reset = falcon_reset_hw,
3234 .probe_port = falcon_probe_port,
3235 .remove_port = falcon_remove_port,
3236 .prepare_flush = falcon_prepare_flush,
3237 .update_stats = falcon_update_nic_stats,
3238 .start_stats = falcon_start_nic_stats,
3239 .stop_stats = falcon_stop_nic_stats,
3240 .push_irq_moderation = falcon_push_irq_moderation,
3241 .push_multicast_hash = falcon_push_multicast_hash,
3235 .default_mac_ops = &falcon_xmac_operations, 3242 .default_mac_ops = &falcon_xmac_operations,
3236 3243
3237 .revision = EFX_REV_FALCON_A1, 3244 .revision = EFX_REV_FALCON_A1,
@@ -3250,6 +3257,20 @@ struct efx_nic_type falcon_a1_nic_type = {
3250}; 3257};
3251 3258
3252struct efx_nic_type falcon_b0_nic_type = { 3259struct efx_nic_type falcon_b0_nic_type = {
3260 .probe = falcon_probe_nic,
3261 .remove = falcon_remove_nic,
3262 .init = falcon_init_nic,
3263 .fini = efx_port_dummy_op_void,
3264 .monitor = falcon_monitor,
3265 .reset = falcon_reset_hw,
3266 .probe_port = falcon_probe_port,
3267 .remove_port = falcon_remove_port,
3268 .prepare_flush = falcon_prepare_flush,
3269 .update_stats = falcon_update_nic_stats,
3270 .start_stats = falcon_start_nic_stats,
3271 .stop_stats = falcon_stop_nic_stats,
3272 .push_irq_moderation = falcon_push_irq_moderation,
3273 .push_multicast_hash = falcon_push_multicast_hash,
3253 .default_mac_ops = &falcon_xmac_operations, 3274 .default_mac_ops = &falcon_xmac_operations,
3254 3275
3255 .revision = EFX_REV_FALCON_B0, 3276 .revision = EFX_REV_FALCON_B0,
diff --git a/drivers/net/sfc/falcon.h b/drivers/net/sfc/falcon.h
index 81196a0fb504..3fe64849c98d 100644
--- a/drivers/net/sfc/falcon.h
+++ b/drivers/net/sfc/falcon.h
@@ -129,10 +129,6 @@ extern void falcon_remove_eventq(struct efx_channel *channel);
129extern int falcon_process_eventq(struct efx_channel *channel, int rx_quota); 129extern int falcon_process_eventq(struct efx_channel *channel, int rx_quota);
130extern void falcon_eventq_read_ack(struct efx_channel *channel); 130extern void falcon_eventq_read_ack(struct efx_channel *channel);
131 131
132/* Ports */
133extern int falcon_probe_port(struct efx_nic *efx);
134extern void falcon_remove_port(struct efx_nic *efx);
135
136/* MAC/PHY */ 132/* MAC/PHY */
137extern int falcon_switch_mac(struct efx_nic *efx); 133extern int falcon_switch_mac(struct efx_nic *efx);
138extern bool falcon_xaui_link_ok(struct efx_nic *efx); 134extern bool falcon_xaui_link_ok(struct efx_nic *efx);
@@ -146,23 +142,15 @@ extern void falcon_enable_interrupts(struct efx_nic *efx);
146extern void falcon_generate_test_event(struct efx_channel *channel, 142extern void falcon_generate_test_event(struct efx_channel *channel,
147 unsigned int magic); 143 unsigned int magic);
148extern void falcon_generate_interrupt(struct efx_nic *efx); 144extern void falcon_generate_interrupt(struct efx_nic *efx);
149extern void falcon_set_int_moderation(struct efx_channel *channel);
150extern void falcon_disable_interrupts(struct efx_nic *efx); 145extern void falcon_disable_interrupts(struct efx_nic *efx);
151extern void falcon_fini_interrupt(struct efx_nic *efx); 146extern void falcon_fini_interrupt(struct efx_nic *efx);
152 147
153#define FALCON_IRQ_MOD_RESOLUTION 5 148#define FALCON_IRQ_MOD_RESOLUTION 5
154 149
155/* Global Resources */ 150/* Global Resources */
156extern int falcon_probe_nic(struct efx_nic *efx);
157extern int falcon_init_nic(struct efx_nic *efx);
158extern int falcon_flush_queues(struct efx_nic *efx); 151extern int falcon_flush_queues(struct efx_nic *efx);
159extern int falcon_reset_hw(struct efx_nic *efx, enum reset_type method);
160extern void falcon_monitor(struct efx_nic *efx);
161extern void falcon_remove_nic(struct efx_nic *efx);
162extern void falcon_update_nic_stats(struct efx_nic *efx);
163extern void falcon_start_nic_stats(struct efx_nic *efx); 152extern void falcon_start_nic_stats(struct efx_nic *efx);
164extern void falcon_stop_nic_stats(struct efx_nic *efx); 153extern void falcon_stop_nic_stats(struct efx_nic *efx);
165extern void falcon_push_multicast_hash(struct efx_nic *efx);
166extern int falcon_reset_xaui(struct efx_nic *efx); 154extern int falcon_reset_xaui(struct efx_nic *efx);
167 155
168/* Tests */ 156/* Tests */
diff --git a/drivers/net/sfc/net_driver.h b/drivers/net/sfc/net_driver.h
index fddf8f5870ce..32806f9a7e49 100644
--- a/drivers/net/sfc/net_driver.h
+++ b/drivers/net/sfc/net_driver.h
@@ -843,6 +843,21 @@ static inline const char *efx_dev_name(struct efx_nic *efx)
843 843
844/** 844/**
845 * struct efx_nic_type - Efx device type definition 845 * struct efx_nic_type - Efx device type definition
846 * @probe: Probe the controller
847 * @remove: Free resources allocated by probe()
848 * @init: Initialise the controller
849 * @fini: Shut down the controller
850 * @monitor: Periodic function for polling link state and hardware monitor
851 * @reset: Reset the controller hardware and possibly the PHY. This will
852 * be called while the controller is uninitialised.
853 * @probe_port: Probe the MAC and PHY
854 * @remove_port: Free resources allocated by probe_port()
855 * @prepare_flush: Prepare the hardware for flushing the DMA queues
856 * @update_stats: Update statistics not provided by event handling
857 * @start_stats: Start the regular fetching of statistics
858 * @stop_stats: Stop the regular fetching of statistics
859 * @push_irq_moderation: Apply interrupt moderation value
860 * @push_multicast_hash: Apply multicast hash table
846 * @default_mac_ops: efx_mac_operations to set at startup 861 * @default_mac_ops: efx_mac_operations to set at startup
847 * @revision: Hardware architecture revision 862 * @revision: Hardware architecture revision
848 * @mem_map_size: Memory BAR mapped size 863 * @mem_map_size: Memory BAR mapped size
@@ -861,6 +876,20 @@ static inline const char *efx_dev_name(struct efx_nic *efx)
861 * @rx_dc_base: Base address in SRAM of RX queue descriptor caches 876 * @rx_dc_base: Base address in SRAM of RX queue descriptor caches
862 */ 877 */
863struct efx_nic_type { 878struct efx_nic_type {
879 int (*probe)(struct efx_nic *efx);
880 void (*remove)(struct efx_nic *efx);
881 int (*init)(struct efx_nic *efx);
882 void (*fini)(struct efx_nic *efx);
883 void (*monitor)(struct efx_nic *efx);
884 int (*reset)(struct efx_nic *efx, enum reset_type method);
885 int (*probe_port)(struct efx_nic *efx);
886 void (*remove_port)(struct efx_nic *efx);
887 void (*prepare_flush)(struct efx_nic *efx);
888 void (*update_stats)(struct efx_nic *efx);
889 void (*start_stats)(struct efx_nic *efx);
890 void (*stop_stats)(struct efx_nic *efx);
891 void (*push_irq_moderation)(struct efx_channel *channel);
892 void (*push_multicast_hash)(struct efx_nic *efx);
864 struct efx_mac_operations *default_mac_ops; 893 struct efx_mac_operations *default_mac_ops;
865 894
866 int revision; 895 int revision;
diff --git a/drivers/net/sfc/selftest.c b/drivers/net/sfc/selftest.c
index 74e84afd5b6b..15d4d9c81362 100644
--- a/drivers/net/sfc/selftest.c
+++ b/drivers/net/sfc/selftest.c
@@ -719,7 +719,7 @@ int efx_selftest(struct efx_nic *efx, struct efx_self_tests *tests,
719 rc_test = rc; 719 rc_test = rc;
720 720
721 /* reset the chip to recover from the register test */ 721 /* reset the chip to recover from the register test */
722 rc_reset = falcon_reset_hw(efx, reset_method); 722 rc_reset = efx->type->reset(efx, reset_method);
723 723
724 /* Ensure that the phy is powered and out of loopback 724 /* Ensure that the phy is powered and out of loopback
725 * for the bist and loopback tests */ 725 * for the bist and loopback tests */