diff options
-rw-r--r-- | drivers/net/ethernet/sfc/falcon.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/net_driver.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/nic.c | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/nic.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/siena.c | 15 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/siena_sriov.c | 6 |
6 files changed, 23 insertions, 7 deletions
diff --git a/drivers/net/ethernet/sfc/falcon.c b/drivers/net/ethernet/sfc/falcon.c index 12b573a8e82b..49bcd196e10d 100644 --- a/drivers/net/ethernet/sfc/falcon.c +++ b/drivers/net/ethernet/sfc/falcon.c | |||
@@ -1792,6 +1792,7 @@ const struct efx_nic_type falcon_a1_nic_type = { | |||
1792 | .remove_port = falcon_remove_port, | 1792 | .remove_port = falcon_remove_port, |
1793 | .handle_global_event = falcon_handle_global_event, | 1793 | .handle_global_event = falcon_handle_global_event, |
1794 | .prepare_flush = falcon_prepare_flush, | 1794 | .prepare_flush = falcon_prepare_flush, |
1795 | .finish_flush = efx_port_dummy_op_void, | ||
1795 | .update_stats = falcon_update_nic_stats, | 1796 | .update_stats = falcon_update_nic_stats, |
1796 | .start_stats = falcon_start_nic_stats, | 1797 | .start_stats = falcon_start_nic_stats, |
1797 | .stop_stats = falcon_stop_nic_stats, | 1798 | .stop_stats = falcon_stop_nic_stats, |
@@ -1834,6 +1835,7 @@ const struct efx_nic_type falcon_b0_nic_type = { | |||
1834 | .remove_port = falcon_remove_port, | 1835 | .remove_port = falcon_remove_port, |
1835 | .handle_global_event = falcon_handle_global_event, | 1836 | .handle_global_event = falcon_handle_global_event, |
1836 | .prepare_flush = falcon_prepare_flush, | 1837 | .prepare_flush = falcon_prepare_flush, |
1838 | .finish_flush = efx_port_dummy_op_void, | ||
1837 | .update_stats = falcon_update_nic_stats, | 1839 | .update_stats = falcon_update_nic_stats, |
1838 | .start_stats = falcon_start_nic_stats, | 1840 | .start_stats = falcon_start_nic_stats, |
1839 | .stop_stats = falcon_stop_nic_stats, | 1841 | .stop_stats = falcon_stop_nic_stats, |
diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h index 2487f582ab04..1014556df0e7 100644 --- a/drivers/net/ethernet/sfc/net_driver.h +++ b/drivers/net/ethernet/sfc/net_driver.h | |||
@@ -907,6 +907,7 @@ static inline unsigned int efx_port_num(struct efx_nic *efx) | |||
907 | * @remove_port: Free resources allocated by probe_port() | 907 | * @remove_port: Free resources allocated by probe_port() |
908 | * @handle_global_event: Handle a "global" event (may be %NULL) | 908 | * @handle_global_event: Handle a "global" event (may be %NULL) |
909 | * @prepare_flush: Prepare the hardware for flushing the DMA queues | 909 | * @prepare_flush: Prepare the hardware for flushing the DMA queues |
910 | * @finish_flush: Clean up after flushing the DMA queues | ||
910 | * @update_stats: Update statistics not provided by event handling | 911 | * @update_stats: Update statistics not provided by event handling |
911 | * @start_stats: Start the regular fetching of statistics | 912 | * @start_stats: Start the regular fetching of statistics |
912 | * @stop_stats: Stop the regular fetching of statistics | 913 | * @stop_stats: Stop the regular fetching of statistics |
@@ -954,6 +955,7 @@ struct efx_nic_type { | |||
954 | void (*remove_port)(struct efx_nic *efx); | 955 | void (*remove_port)(struct efx_nic *efx); |
955 | bool (*handle_global_event)(struct efx_channel *channel, efx_qword_t *); | 956 | bool (*handle_global_event)(struct efx_channel *channel, efx_qword_t *); |
956 | void (*prepare_flush)(struct efx_nic *efx); | 957 | void (*prepare_flush)(struct efx_nic *efx); |
958 | void (*finish_flush)(struct efx_nic *efx); | ||
957 | void (*update_stats)(struct efx_nic *efx); | 959 | void (*update_stats)(struct efx_nic *efx); |
958 | void (*start_stats)(struct efx_nic *efx); | 960 | void (*start_stats)(struct efx_nic *efx); |
959 | void (*stop_stats)(struct efx_nic *efx); | 961 | void (*stop_stats)(struct efx_nic *efx); |
diff --git a/drivers/net/ethernet/sfc/nic.c b/drivers/net/ethernet/sfc/nic.c index aab7cacb2e34..e10b7ec046c3 100644 --- a/drivers/net/ethernet/sfc/nic.c +++ b/drivers/net/ethernet/sfc/nic.c | |||
@@ -680,7 +680,6 @@ int efx_nic_flush_queues(struct efx_nic *efx) | |||
680 | struct efx_tx_queue *tx_queue; | 680 | struct efx_tx_queue *tx_queue; |
681 | int rc = 0; | 681 | int rc = 0; |
682 | 682 | ||
683 | efx->fc_disable++; | ||
684 | efx->type->prepare_flush(efx); | 683 | efx->type->prepare_flush(efx); |
685 | 684 | ||
686 | efx_for_each_channel(channel, efx) { | 685 | efx_for_each_channel(channel, efx) { |
@@ -742,7 +741,7 @@ int efx_nic_flush_queues(struct efx_nic *efx) | |||
742 | atomic_set(&efx->rxq_flush_outstanding, 0); | 741 | atomic_set(&efx->rxq_flush_outstanding, 0); |
743 | } | 742 | } |
744 | 743 | ||
745 | efx->fc_disable--; | 744 | efx->type->finish_flush(efx); |
746 | 745 | ||
747 | return rc; | 746 | return rc; |
748 | } | 747 | } |
diff --git a/drivers/net/ethernet/sfc/nic.h b/drivers/net/ethernet/sfc/nic.h index 7a9647a3c565..1b0003323498 100644 --- a/drivers/net/ethernet/sfc/nic.h +++ b/drivers/net/ethernet/sfc/nic.h | |||
@@ -344,6 +344,8 @@ static inline int efx_nic_irq_test_irq_cpu(struct efx_nic *efx) | |||
344 | 344 | ||
345 | /* Global Resources */ | 345 | /* Global Resources */ |
346 | extern int efx_nic_flush_queues(struct efx_nic *efx); | 346 | extern int efx_nic_flush_queues(struct efx_nic *efx); |
347 | extern void siena_prepare_flush(struct efx_nic *efx); | ||
348 | extern void siena_finish_flush(struct efx_nic *efx); | ||
347 | extern void falcon_start_nic_stats(struct efx_nic *efx); | 349 | extern void falcon_start_nic_stats(struct efx_nic *efx); |
348 | extern void falcon_stop_nic_stats(struct efx_nic *efx); | 350 | extern void falcon_stop_nic_stats(struct efx_nic *efx); |
349 | extern void falcon_setup_xaui(struct efx_nic *efx); | 351 | extern void falcon_setup_xaui(struct efx_nic *efx); |
diff --git a/drivers/net/ethernet/sfc/siena.c b/drivers/net/ethernet/sfc/siena.c index 84b41bf08a38..3553d77a3fdc 100644 --- a/drivers/net/ethernet/sfc/siena.c +++ b/drivers/net/ethernet/sfc/siena.c | |||
@@ -127,6 +127,18 @@ static void siena_remove_port(struct efx_nic *efx) | |||
127 | efx_nic_free_buffer(efx, &efx->stats_buffer); | 127 | efx_nic_free_buffer(efx, &efx->stats_buffer); |
128 | } | 128 | } |
129 | 129 | ||
130 | void siena_prepare_flush(struct efx_nic *efx) | ||
131 | { | ||
132 | if (efx->fc_disable++ == 0) | ||
133 | efx_mcdi_set_mac(efx); | ||
134 | } | ||
135 | |||
136 | void siena_finish_flush(struct efx_nic *efx) | ||
137 | { | ||
138 | if (--efx->fc_disable == 0) | ||
139 | efx_mcdi_set_mac(efx); | ||
140 | } | ||
141 | |||
130 | static const struct efx_nic_register_test siena_register_tests[] = { | 142 | static const struct efx_nic_register_test siena_register_tests[] = { |
131 | { FR_AZ_ADR_REGION, | 143 | { FR_AZ_ADR_REGION, |
132 | EFX_OWORD32(0x0003FFFF, 0x0003FFFF, 0x0003FFFF, 0x0003FFFF) }, | 144 | EFX_OWORD32(0x0003FFFF, 0x0003FFFF, 0x0003FFFF, 0x0003FFFF) }, |
@@ -659,7 +671,8 @@ const struct efx_nic_type siena_a0_nic_type = { | |||
659 | .reset = siena_reset_hw, | 671 | .reset = siena_reset_hw, |
660 | .probe_port = siena_probe_port, | 672 | .probe_port = siena_probe_port, |
661 | .remove_port = siena_remove_port, | 673 | .remove_port = siena_remove_port, |
662 | .prepare_flush = efx_port_dummy_op_void, | 674 | .prepare_flush = siena_prepare_flush, |
675 | .finish_flush = siena_finish_flush, | ||
663 | .update_stats = siena_update_nic_stats, | 676 | .update_stats = siena_update_nic_stats, |
664 | .start_stats = siena_start_nic_stats, | 677 | .start_stats = siena_start_nic_stats, |
665 | .stop_stats = siena_stop_nic_stats, | 678 | .stop_stats = siena_stop_nic_stats, |
diff --git a/drivers/net/ethernet/sfc/siena_sriov.c b/drivers/net/ethernet/sfc/siena_sriov.c index d49b53dc2a50..6e62a018ea32 100644 --- a/drivers/net/ethernet/sfc/siena_sriov.c +++ b/drivers/net/ethernet/sfc/siena_sriov.c | |||
@@ -695,8 +695,7 @@ static int efx_vfdi_fini_all_queues(struct efx_vf *vf) | |||
695 | return VFDI_RC_ENOMEM; | 695 | return VFDI_RC_ENOMEM; |
696 | 696 | ||
697 | rtnl_lock(); | 697 | rtnl_lock(); |
698 | if (efx->fc_disable++ == 0) | 698 | siena_prepare_flush(efx); |
699 | efx_mcdi_set_mac(efx); | ||
700 | rtnl_unlock(); | 699 | rtnl_unlock(); |
701 | 700 | ||
702 | /* Flush all the initialized queues */ | 701 | /* Flush all the initialized queues */ |
@@ -733,8 +732,7 @@ static int efx_vfdi_fini_all_queues(struct efx_vf *vf) | |||
733 | } | 732 | } |
734 | 733 | ||
735 | rtnl_lock(); | 734 | rtnl_lock(); |
736 | if (--efx->fc_disable == 0) | 735 | siena_finish_flush(efx); |
737 | efx_mcdi_set_mac(efx); | ||
738 | rtnl_unlock(); | 736 | rtnl_unlock(); |
739 | 737 | ||
740 | /* Irrespective of success/failure, fini the queues */ | 738 | /* Irrespective of success/failure, fini the queues */ |