diff options
Diffstat (limited to 'drivers/net/ethernet/sfc/nic.c')
-rw-r--r-- | drivers/net/ethernet/sfc/nic.c | 349 |
1 files changed, 178 insertions, 171 deletions
diff --git a/drivers/net/ethernet/sfc/nic.c b/drivers/net/ethernet/sfc/nic.c index 2b33afd4276d..03e4125d6b96 100644 --- a/drivers/net/ethernet/sfc/nic.c +++ b/drivers/net/ethernet/sfc/nic.c | |||
@@ -49,17 +49,14 @@ | |||
49 | #define EFX_INT_ERROR_EXPIRE 3600 | 49 | #define EFX_INT_ERROR_EXPIRE 3600 |
50 | #define EFX_MAX_INT_ERRORS 5 | 50 | #define EFX_MAX_INT_ERRORS 5 |
51 | 51 | ||
52 | /* We poll for events every FLUSH_INTERVAL ms, and check FLUSH_POLL_COUNT times | ||
53 | */ | ||
54 | #define EFX_FLUSH_INTERVAL 10 | ||
55 | #define EFX_FLUSH_POLL_COUNT 100 | ||
56 | |||
57 | /* Depth of RX flush request fifo */ | 52 | /* Depth of RX flush request fifo */ |
58 | #define EFX_RX_FLUSH_COUNT 4 | 53 | #define EFX_RX_FLUSH_COUNT 4 |
59 | 54 | ||
60 | /* Driver generated events */ | 55 | /* Driver generated events */ |
61 | #define _EFX_CHANNEL_MAGIC_TEST 0x000101 | 56 | #define _EFX_CHANNEL_MAGIC_TEST 0x000101 |
62 | #define _EFX_CHANNEL_MAGIC_FILL 0x000102 | 57 | #define _EFX_CHANNEL_MAGIC_FILL 0x000102 |
58 | #define _EFX_CHANNEL_MAGIC_RX_DRAIN 0x000103 | ||
59 | #define _EFX_CHANNEL_MAGIC_TX_DRAIN 0x000104 | ||
63 | 60 | ||
64 | #define _EFX_CHANNEL_MAGIC(_code, _data) ((_code) << 8 | (_data)) | 61 | #define _EFX_CHANNEL_MAGIC(_code, _data) ((_code) << 8 | (_data)) |
65 | #define _EFX_CHANNEL_MAGIC_CODE(_magic) ((_magic) >> 8) | 62 | #define _EFX_CHANNEL_MAGIC_CODE(_magic) ((_magic) >> 8) |
@@ -69,6 +66,12 @@ | |||
69 | #define EFX_CHANNEL_MAGIC_FILL(_rx_queue) \ | 66 | #define EFX_CHANNEL_MAGIC_FILL(_rx_queue) \ |
70 | _EFX_CHANNEL_MAGIC(_EFX_CHANNEL_MAGIC_FILL, \ | 67 | _EFX_CHANNEL_MAGIC(_EFX_CHANNEL_MAGIC_FILL, \ |
71 | efx_rx_queue_index(_rx_queue)) | 68 | efx_rx_queue_index(_rx_queue)) |
69 | #define EFX_CHANNEL_MAGIC_RX_DRAIN(_rx_queue) \ | ||
70 | _EFX_CHANNEL_MAGIC(_EFX_CHANNEL_MAGIC_RX_DRAIN, \ | ||
71 | efx_rx_queue_index(_rx_queue)) | ||
72 | #define EFX_CHANNEL_MAGIC_TX_DRAIN(_tx_queue) \ | ||
73 | _EFX_CHANNEL_MAGIC(_EFX_CHANNEL_MAGIC_TX_DRAIN, \ | ||
74 | (_tx_queue)->queue) | ||
72 | 75 | ||
73 | /************************************************************************** | 76 | /************************************************************************** |
74 | * | 77 | * |
@@ -432,8 +435,6 @@ void efx_nic_init_tx(struct efx_tx_queue *tx_queue) | |||
432 | struct efx_nic *efx = tx_queue->efx; | 435 | struct efx_nic *efx = tx_queue->efx; |
433 | efx_oword_t reg; | 436 | efx_oword_t reg; |
434 | 437 | ||
435 | tx_queue->flushed = FLUSH_NONE; | ||
436 | |||
437 | /* Pin TX descriptor ring */ | 438 | /* Pin TX descriptor ring */ |
438 | efx_init_special_buffer(efx, &tx_queue->txd); | 439 | efx_init_special_buffer(efx, &tx_queue->txd); |
439 | 440 | ||
@@ -490,9 +491,6 @@ static void efx_flush_tx_queue(struct efx_tx_queue *tx_queue) | |||
490 | struct efx_nic *efx = tx_queue->efx; | 491 | struct efx_nic *efx = tx_queue->efx; |
491 | efx_oword_t tx_flush_descq; | 492 | efx_oword_t tx_flush_descq; |
492 | 493 | ||
493 | tx_queue->flushed = FLUSH_PENDING; | ||
494 | |||
495 | /* Post a flush command */ | ||
496 | EFX_POPULATE_OWORD_2(tx_flush_descq, | 494 | EFX_POPULATE_OWORD_2(tx_flush_descq, |
497 | FRF_AZ_TX_FLUSH_DESCQ_CMD, 1, | 495 | FRF_AZ_TX_FLUSH_DESCQ_CMD, 1, |
498 | FRF_AZ_TX_FLUSH_DESCQ, tx_queue->queue); | 496 | FRF_AZ_TX_FLUSH_DESCQ, tx_queue->queue); |
@@ -504,9 +502,6 @@ void efx_nic_fini_tx(struct efx_tx_queue *tx_queue) | |||
504 | struct efx_nic *efx = tx_queue->efx; | 502 | struct efx_nic *efx = tx_queue->efx; |
505 | efx_oword_t tx_desc_ptr; | 503 | efx_oword_t tx_desc_ptr; |
506 | 504 | ||
507 | /* The queue should have been flushed */ | ||
508 | WARN_ON(tx_queue->flushed != FLUSH_DONE); | ||
509 | |||
510 | /* Remove TX descriptor ring from card */ | 505 | /* Remove TX descriptor ring from card */ |
511 | EFX_ZERO_OWORD(tx_desc_ptr); | 506 | EFX_ZERO_OWORD(tx_desc_ptr); |
512 | efx_writeo_table(efx, &tx_desc_ptr, efx->type->txd_ptr_tbl_base, | 507 | efx_writeo_table(efx, &tx_desc_ptr, efx->type->txd_ptr_tbl_base, |
@@ -597,8 +592,6 @@ void efx_nic_init_rx(struct efx_rx_queue *rx_queue) | |||
597 | efx_rx_queue_index(rx_queue), rx_queue->rxd.index, | 592 | efx_rx_queue_index(rx_queue), rx_queue->rxd.index, |
598 | rx_queue->rxd.index + rx_queue->rxd.entries - 1); | 593 | rx_queue->rxd.index + rx_queue->rxd.entries - 1); |
599 | 594 | ||
600 | rx_queue->flushed = FLUSH_NONE; | ||
601 | |||
602 | /* Pin RX descriptor ring */ | 595 | /* Pin RX descriptor ring */ |
603 | efx_init_special_buffer(efx, &rx_queue->rxd); | 596 | efx_init_special_buffer(efx, &rx_queue->rxd); |
604 | 597 | ||
@@ -627,9 +620,6 @@ static void efx_flush_rx_queue(struct efx_rx_queue *rx_queue) | |||
627 | struct efx_nic *efx = rx_queue->efx; | 620 | struct efx_nic *efx = rx_queue->efx; |
628 | efx_oword_t rx_flush_descq; | 621 | efx_oword_t rx_flush_descq; |
629 | 622 | ||
630 | rx_queue->flushed = FLUSH_PENDING; | ||
631 | |||
632 | /* Post a flush command */ | ||
633 | EFX_POPULATE_OWORD_2(rx_flush_descq, | 623 | EFX_POPULATE_OWORD_2(rx_flush_descq, |
634 | FRF_AZ_RX_FLUSH_DESCQ_CMD, 1, | 624 | FRF_AZ_RX_FLUSH_DESCQ_CMD, 1, |
635 | FRF_AZ_RX_FLUSH_DESCQ, | 625 | FRF_AZ_RX_FLUSH_DESCQ, |
@@ -642,9 +632,6 @@ void efx_nic_fini_rx(struct efx_rx_queue *rx_queue) | |||
642 | efx_oword_t rx_desc_ptr; | 632 | efx_oword_t rx_desc_ptr; |
643 | struct efx_nic *efx = rx_queue->efx; | 633 | struct efx_nic *efx = rx_queue->efx; |
644 | 634 | ||
645 | /* The queue should already have been flushed */ | ||
646 | WARN_ON(rx_queue->flushed != FLUSH_DONE); | ||
647 | |||
648 | /* Remove RX descriptor ring from card */ | 635 | /* Remove RX descriptor ring from card */ |
649 | EFX_ZERO_OWORD(rx_desc_ptr); | 636 | EFX_ZERO_OWORD(rx_desc_ptr); |
650 | efx_writeo_table(efx, &rx_desc_ptr, efx->type->rxd_ptr_tbl_base, | 637 | efx_writeo_table(efx, &rx_desc_ptr, efx->type->rxd_ptr_tbl_base, |
@@ -662,6 +649,89 @@ void efx_nic_remove_rx(struct efx_rx_queue *rx_queue) | |||
662 | 649 | ||
663 | /************************************************************************** | 650 | /************************************************************************** |
664 | * | 651 | * |
652 | * Flush handling | ||
653 | * | ||
654 | **************************************************************************/ | ||
655 | |||
656 | /* efx_nic_flush_queues() must be woken up when all flushes are completed, | ||
657 | * or more RX flushes can be kicked off. | ||
658 | */ | ||
659 | static bool efx_flush_wake(struct efx_nic *efx) | ||
660 | { | ||
661 | /* Ensure that all updates are visible to efx_nic_flush_queues() */ | ||
662 | smp_mb(); | ||
663 | |||
664 | return (atomic_read(&efx->drain_pending) == 0 || | ||
665 | (atomic_read(&efx->rxq_flush_outstanding) < EFX_RX_FLUSH_COUNT | ||
666 | && atomic_read(&efx->rxq_flush_pending) > 0)); | ||
667 | } | ||
668 | |||
669 | /* Flush all the transmit queues, and continue flushing receive queues until | ||
670 | * they're all flushed. Wait for the DRAIN events to be recieved so that there | ||
671 | * are no more RX and TX events left on any channel. */ | ||
672 | int efx_nic_flush_queues(struct efx_nic *efx) | ||
673 | { | ||
674 | unsigned timeout = msecs_to_jiffies(5000); /* 5s for all flushes and drains */ | ||
675 | struct efx_channel *channel; | ||
676 | struct efx_rx_queue *rx_queue; | ||
677 | struct efx_tx_queue *tx_queue; | ||
678 | int rc = 0; | ||
679 | |||
680 | efx->type->prepare_flush(efx); | ||
681 | |||
682 | efx_for_each_channel(channel, efx) { | ||
683 | efx_for_each_channel_tx_queue(tx_queue, channel) { | ||
684 | atomic_inc(&efx->drain_pending); | ||
685 | efx_flush_tx_queue(tx_queue); | ||
686 | } | ||
687 | efx_for_each_channel_rx_queue(rx_queue, channel) { | ||
688 | atomic_inc(&efx->drain_pending); | ||
689 | rx_queue->flush_pending = true; | ||
690 | atomic_inc(&efx->rxq_flush_pending); | ||
691 | } | ||
692 | } | ||
693 | |||
694 | while (timeout && atomic_read(&efx->drain_pending) > 0) { | ||
695 | /* The hardware supports four concurrent rx flushes, each of | ||
696 | * which may need to be retried if there is an outstanding | ||
697 | * descriptor fetch | ||
698 | */ | ||
699 | efx_for_each_channel(channel, efx) { | ||
700 | efx_for_each_channel_rx_queue(rx_queue, channel) { | ||
701 | if (atomic_read(&efx->rxq_flush_outstanding) >= | ||
702 | EFX_RX_FLUSH_COUNT) | ||
703 | break; | ||
704 | |||
705 | if (rx_queue->flush_pending) { | ||
706 | rx_queue->flush_pending = false; | ||
707 | atomic_dec(&efx->rxq_flush_pending); | ||
708 | atomic_inc(&efx->rxq_flush_outstanding); | ||
709 | efx_flush_rx_queue(rx_queue); | ||
710 | } | ||
711 | } | ||
712 | } | ||
713 | |||
714 | timeout = wait_event_timeout(efx->flush_wq, efx_flush_wake(efx), | ||
715 | timeout); | ||
716 | } | ||
717 | |||
718 | if (atomic_read(&efx->drain_pending)) { | ||
719 | netif_err(efx, hw, efx->net_dev, "failed to flush %d queues " | ||
720 | "(rx %d+%d)\n", atomic_read(&efx->drain_pending), | ||
721 | atomic_read(&efx->rxq_flush_outstanding), | ||
722 | atomic_read(&efx->rxq_flush_pending)); | ||
723 | rc = -ETIMEDOUT; | ||
724 | |||
725 | atomic_set(&efx->drain_pending, 0); | ||
726 | atomic_set(&efx->rxq_flush_pending, 0); | ||
727 | atomic_set(&efx->rxq_flush_outstanding, 0); | ||
728 | } | ||
729 | |||
730 | return rc; | ||
731 | } | ||
732 | |||
733 | /************************************************************************** | ||
734 | * | ||
665 | * Event queue processing | 735 | * Event queue processing |
666 | * Event queues are processed by per-channel tasklets. | 736 | * Event queues are processed by per-channel tasklets. |
667 | * | 737 | * |
@@ -722,6 +792,9 @@ efx_handle_tx_event(struct efx_channel *channel, efx_qword_t *event) | |||
722 | struct efx_nic *efx = channel->efx; | 792 | struct efx_nic *efx = channel->efx; |
723 | int tx_packets = 0; | 793 | int tx_packets = 0; |
724 | 794 | ||
795 | if (unlikely(ACCESS_ONCE(efx->reset_pending))) | ||
796 | return 0; | ||
797 | |||
725 | if (likely(EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_COMP))) { | 798 | if (likely(EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_COMP))) { |
726 | /* Transmit completion */ | 799 | /* Transmit completion */ |
727 | tx_ev_desc_ptr = EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_DESC_PTR); | 800 | tx_ev_desc_ptr = EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_DESC_PTR); |
@@ -863,6 +936,10 @@ efx_handle_rx_event(struct efx_channel *channel, const efx_qword_t *event) | |||
863 | bool rx_ev_pkt_ok; | 936 | bool rx_ev_pkt_ok; |
864 | u16 flags; | 937 | u16 flags; |
865 | struct efx_rx_queue *rx_queue; | 938 | struct efx_rx_queue *rx_queue; |
939 | struct efx_nic *efx = channel->efx; | ||
940 | |||
941 | if (unlikely(ACCESS_ONCE(efx->reset_pending))) | ||
942 | return; | ||
866 | 943 | ||
867 | /* Basic packet information */ | 944 | /* Basic packet information */ |
868 | rx_ev_byte_cnt = EFX_QWORD_FIELD(*event, FSF_AZ_RX_EV_BYTE_CNT); | 945 | rx_ev_byte_cnt = EFX_QWORD_FIELD(*event, FSF_AZ_RX_EV_BYTE_CNT); |
@@ -909,6 +986,72 @@ efx_handle_rx_event(struct efx_channel *channel, const efx_qword_t *event) | |||
909 | efx_rx_packet(rx_queue, rx_ev_desc_ptr, rx_ev_byte_cnt, flags); | 986 | efx_rx_packet(rx_queue, rx_ev_desc_ptr, rx_ev_byte_cnt, flags); |
910 | } | 987 | } |
911 | 988 | ||
989 | /* If this flush done event corresponds to a &struct efx_tx_queue, then | ||
990 | * send an %EFX_CHANNEL_MAGIC_TX_DRAIN event to drain the event queue | ||
991 | * of all transmit completions. | ||
992 | */ | ||
993 | static void | ||
994 | efx_handle_tx_flush_done(struct efx_nic *efx, efx_qword_t *event) | ||
995 | { | ||
996 | struct efx_tx_queue *tx_queue; | ||
997 | int qid; | ||
998 | |||
999 | qid = EFX_QWORD_FIELD(*event, FSF_AZ_DRIVER_EV_SUBDATA); | ||
1000 | if (qid < EFX_TXQ_TYPES * efx->n_tx_channels) { | ||
1001 | tx_queue = efx_get_tx_queue(efx, qid / EFX_TXQ_TYPES, | ||
1002 | qid % EFX_TXQ_TYPES); | ||
1003 | |||
1004 | efx_magic_event(tx_queue->channel, | ||
1005 | EFX_CHANNEL_MAGIC_TX_DRAIN(tx_queue)); | ||
1006 | } | ||
1007 | } | ||
1008 | |||
1009 | /* If this flush done event corresponds to a &struct efx_rx_queue: If the flush | ||
1010 | * was succesful then send an %EFX_CHANNEL_MAGIC_RX_DRAIN, otherwise add | ||
1011 | * the RX queue back to the mask of RX queues in need of flushing. | ||
1012 | */ | ||
1013 | static void | ||
1014 | efx_handle_rx_flush_done(struct efx_nic *efx, efx_qword_t *event) | ||
1015 | { | ||
1016 | struct efx_channel *channel; | ||
1017 | struct efx_rx_queue *rx_queue; | ||
1018 | int qid; | ||
1019 | bool failed; | ||
1020 | |||
1021 | qid = EFX_QWORD_FIELD(*event, FSF_AZ_DRIVER_EV_RX_DESCQ_ID); | ||
1022 | failed = EFX_QWORD_FIELD(*event, FSF_AZ_DRIVER_EV_RX_FLUSH_FAIL); | ||
1023 | if (qid >= efx->n_channels) | ||
1024 | return; | ||
1025 | channel = efx_get_channel(efx, qid); | ||
1026 | if (!efx_channel_has_rx_queue(channel)) | ||
1027 | return; | ||
1028 | rx_queue = efx_channel_get_rx_queue(channel); | ||
1029 | |||
1030 | if (failed) { | ||
1031 | netif_info(efx, hw, efx->net_dev, | ||
1032 | "RXQ %d flush retry\n", qid); | ||
1033 | rx_queue->flush_pending = true; | ||
1034 | atomic_inc(&efx->rxq_flush_pending); | ||
1035 | } else { | ||
1036 | efx_magic_event(efx_rx_queue_channel(rx_queue), | ||
1037 | EFX_CHANNEL_MAGIC_RX_DRAIN(rx_queue)); | ||
1038 | } | ||
1039 | atomic_dec(&efx->rxq_flush_outstanding); | ||
1040 | if (efx_flush_wake(efx)) | ||
1041 | wake_up(&efx->flush_wq); | ||
1042 | } | ||
1043 | |||
1044 | static void | ||
1045 | efx_handle_drain_event(struct efx_channel *channel) | ||
1046 | { | ||
1047 | struct efx_nic *efx = channel->efx; | ||
1048 | |||
1049 | WARN_ON(atomic_read(&efx->drain_pending) == 0); | ||
1050 | atomic_dec(&efx->drain_pending); | ||
1051 | if (efx_flush_wake(efx)) | ||
1052 | wake_up(&efx->flush_wq); | ||
1053 | } | ||
1054 | |||
912 | static void | 1055 | static void |
913 | efx_handle_generated_event(struct efx_channel *channel, efx_qword_t *event) | 1056 | efx_handle_generated_event(struct efx_channel *channel, efx_qword_t *event) |
914 | { | 1057 | { |
@@ -916,21 +1059,28 @@ efx_handle_generated_event(struct efx_channel *channel, efx_qword_t *event) | |||
916 | struct efx_rx_queue *rx_queue = | 1059 | struct efx_rx_queue *rx_queue = |
917 | efx_channel_has_rx_queue(channel) ? | 1060 | efx_channel_has_rx_queue(channel) ? |
918 | efx_channel_get_rx_queue(channel) : NULL; | 1061 | efx_channel_get_rx_queue(channel) : NULL; |
919 | unsigned magic; | 1062 | unsigned magic, code; |
920 | 1063 | ||
921 | magic = EFX_QWORD_FIELD(*event, FSF_AZ_DRV_GEN_EV_MAGIC); | 1064 | magic = EFX_QWORD_FIELD(*event, FSF_AZ_DRV_GEN_EV_MAGIC); |
1065 | code = _EFX_CHANNEL_MAGIC_CODE(magic); | ||
922 | 1066 | ||
923 | if (magic == EFX_CHANNEL_MAGIC_TEST(channel)) | 1067 | if (magic == EFX_CHANNEL_MAGIC_TEST(channel)) { |
924 | ; /* ignore */ | 1068 | /* ignore */ |
925 | else if (rx_queue && magic == EFX_CHANNEL_MAGIC_FILL(rx_queue)) | 1069 | } else if (rx_queue && magic == EFX_CHANNEL_MAGIC_FILL(rx_queue)) { |
926 | /* The queue must be empty, so we won't receive any rx | 1070 | /* The queue must be empty, so we won't receive any rx |
927 | * events, so efx_process_channel() won't refill the | 1071 | * events, so efx_process_channel() won't refill the |
928 | * queue. Refill it here */ | 1072 | * queue. Refill it here */ |
929 | efx_fast_push_rx_descriptors(rx_queue); | 1073 | efx_fast_push_rx_descriptors(rx_queue); |
930 | else | 1074 | } else if (rx_queue && magic == EFX_CHANNEL_MAGIC_RX_DRAIN(rx_queue)) { |
1075 | rx_queue->enabled = false; | ||
1076 | efx_handle_drain_event(channel); | ||
1077 | } else if (code == _EFX_CHANNEL_MAGIC_TX_DRAIN) { | ||
1078 | efx_handle_drain_event(channel); | ||
1079 | } else { | ||
931 | netif_dbg(efx, hw, efx->net_dev, "channel %d received " | 1080 | netif_dbg(efx, hw, efx->net_dev, "channel %d received " |
932 | "generated event "EFX_QWORD_FMT"\n", | 1081 | "generated event "EFX_QWORD_FMT"\n", |
933 | channel->channel, EFX_QWORD_VAL(*event)); | 1082 | channel->channel, EFX_QWORD_VAL(*event)); |
1083 | } | ||
934 | } | 1084 | } |
935 | 1085 | ||
936 | static void | 1086 | static void |
@@ -947,10 +1097,12 @@ efx_handle_driver_event(struct efx_channel *channel, efx_qword_t *event) | |||
947 | case FSE_AZ_TX_DESCQ_FLS_DONE_EV: | 1097 | case FSE_AZ_TX_DESCQ_FLS_DONE_EV: |
948 | netif_vdbg(efx, hw, efx->net_dev, "channel %d TXQ %d flushed\n", | 1098 | netif_vdbg(efx, hw, efx->net_dev, "channel %d TXQ %d flushed\n", |
949 | channel->channel, ev_sub_data); | 1099 | channel->channel, ev_sub_data); |
1100 | efx_handle_tx_flush_done(efx, event); | ||
950 | break; | 1101 | break; |
951 | case FSE_AZ_RX_DESCQ_FLS_DONE_EV: | 1102 | case FSE_AZ_RX_DESCQ_FLS_DONE_EV: |
952 | netif_vdbg(efx, hw, efx->net_dev, "channel %d RXQ %d flushed\n", | 1103 | netif_vdbg(efx, hw, efx->net_dev, "channel %d RXQ %d flushed\n", |
953 | channel->channel, ev_sub_data); | 1104 | channel->channel, ev_sub_data); |
1105 | efx_handle_rx_flush_done(efx, event); | ||
954 | break; | 1106 | break; |
955 | case FSE_AZ_EVQ_INIT_DONE_EV: | 1107 | case FSE_AZ_EVQ_INIT_DONE_EV: |
956 | netif_dbg(efx, hw, efx->net_dev, | 1108 | netif_dbg(efx, hw, efx->net_dev, |
@@ -1162,143 +1314,6 @@ void efx_nic_generate_fill_event(struct efx_rx_queue *rx_queue) | |||
1162 | 1314 | ||
1163 | /************************************************************************** | 1315 | /************************************************************************** |
1164 | * | 1316 | * |
1165 | * Flush handling | ||
1166 | * | ||
1167 | **************************************************************************/ | ||
1168 | |||
1169 | |||
1170 | static void efx_poll_flush_events(struct efx_nic *efx) | ||
1171 | { | ||
1172 | struct efx_channel *channel = efx_get_channel(efx, 0); | ||
1173 | struct efx_tx_queue *tx_queue; | ||
1174 | struct efx_rx_queue *rx_queue; | ||
1175 | unsigned int read_ptr = channel->eventq_read_ptr; | ||
1176 | unsigned int end_ptr = read_ptr + channel->eventq_mask - 1; | ||
1177 | |||
1178 | do { | ||
1179 | efx_qword_t *event = efx_event(channel, read_ptr); | ||
1180 | int ev_code, ev_sub_code, ev_queue; | ||
1181 | bool ev_failed; | ||
1182 | |||
1183 | if (!efx_event_present(event)) | ||
1184 | break; | ||
1185 | |||
1186 | ev_code = EFX_QWORD_FIELD(*event, FSF_AZ_EV_CODE); | ||
1187 | ev_sub_code = EFX_QWORD_FIELD(*event, | ||
1188 | FSF_AZ_DRIVER_EV_SUBCODE); | ||
1189 | if (ev_code == FSE_AZ_EV_CODE_DRIVER_EV && | ||
1190 | ev_sub_code == FSE_AZ_TX_DESCQ_FLS_DONE_EV) { | ||
1191 | ev_queue = EFX_QWORD_FIELD(*event, | ||
1192 | FSF_AZ_DRIVER_EV_SUBDATA); | ||
1193 | if (ev_queue < EFX_TXQ_TYPES * efx->n_tx_channels) { | ||
1194 | tx_queue = efx_get_tx_queue( | ||
1195 | efx, ev_queue / EFX_TXQ_TYPES, | ||
1196 | ev_queue % EFX_TXQ_TYPES); | ||
1197 | tx_queue->flushed = FLUSH_DONE; | ||
1198 | } | ||
1199 | } else if (ev_code == FSE_AZ_EV_CODE_DRIVER_EV && | ||
1200 | ev_sub_code == FSE_AZ_RX_DESCQ_FLS_DONE_EV) { | ||
1201 | ev_queue = EFX_QWORD_FIELD( | ||
1202 | *event, FSF_AZ_DRIVER_EV_RX_DESCQ_ID); | ||
1203 | ev_failed = EFX_QWORD_FIELD( | ||
1204 | *event, FSF_AZ_DRIVER_EV_RX_FLUSH_FAIL); | ||
1205 | if (ev_queue < efx->n_rx_channels) { | ||
1206 | rx_queue = efx_get_rx_queue(efx, ev_queue); | ||
1207 | rx_queue->flushed = | ||
1208 | ev_failed ? FLUSH_FAILED : FLUSH_DONE; | ||
1209 | } | ||
1210 | } | ||
1211 | |||
1212 | /* We're about to destroy the queue anyway, so | ||
1213 | * it's ok to throw away every non-flush event */ | ||
1214 | EFX_SET_QWORD(*event); | ||
1215 | |||
1216 | ++read_ptr; | ||
1217 | } while (read_ptr != end_ptr); | ||
1218 | |||
1219 | channel->eventq_read_ptr = read_ptr; | ||
1220 | } | ||
1221 | |||
1222 | /* Handle tx and rx flushes at the same time, since they run in | ||
1223 | * parallel in the hardware and there's no reason for us to | ||
1224 | * serialise them */ | ||
1225 | int efx_nic_flush_queues(struct efx_nic *efx) | ||
1226 | { | ||
1227 | struct efx_channel *channel; | ||
1228 | struct efx_rx_queue *rx_queue; | ||
1229 | struct efx_tx_queue *tx_queue; | ||
1230 | int i, tx_pending, rx_pending; | ||
1231 | |||
1232 | /* If necessary prepare the hardware for flushing */ | ||
1233 | efx->type->prepare_flush(efx); | ||
1234 | |||
1235 | /* Flush all tx queues in parallel */ | ||
1236 | efx_for_each_channel(channel, efx) { | ||
1237 | efx_for_each_possible_channel_tx_queue(tx_queue, channel) { | ||
1238 | if (tx_queue->initialised) | ||
1239 | efx_flush_tx_queue(tx_queue); | ||
1240 | } | ||
1241 | } | ||
1242 | |||
1243 | /* The hardware supports four concurrent rx flushes, each of which may | ||
1244 | * need to be retried if there is an outstanding descriptor fetch */ | ||
1245 | for (i = 0; i < EFX_FLUSH_POLL_COUNT; ++i) { | ||
1246 | rx_pending = tx_pending = 0; | ||
1247 | efx_for_each_channel(channel, efx) { | ||
1248 | efx_for_each_channel_rx_queue(rx_queue, channel) { | ||
1249 | if (rx_queue->flushed == FLUSH_PENDING) | ||
1250 | ++rx_pending; | ||
1251 | } | ||
1252 | } | ||
1253 | efx_for_each_channel(channel, efx) { | ||
1254 | efx_for_each_channel_rx_queue(rx_queue, channel) { | ||
1255 | if (rx_pending == EFX_RX_FLUSH_COUNT) | ||
1256 | break; | ||
1257 | if (rx_queue->flushed == FLUSH_FAILED || | ||
1258 | rx_queue->flushed == FLUSH_NONE) { | ||
1259 | efx_flush_rx_queue(rx_queue); | ||
1260 | ++rx_pending; | ||
1261 | } | ||
1262 | } | ||
1263 | efx_for_each_possible_channel_tx_queue(tx_queue, channel) { | ||
1264 | if (tx_queue->initialised && | ||
1265 | tx_queue->flushed != FLUSH_DONE) | ||
1266 | ++tx_pending; | ||
1267 | } | ||
1268 | } | ||
1269 | |||
1270 | if (rx_pending == 0 && tx_pending == 0) | ||
1271 | return 0; | ||
1272 | |||
1273 | msleep(EFX_FLUSH_INTERVAL); | ||
1274 | efx_poll_flush_events(efx); | ||
1275 | } | ||
1276 | |||
1277 | /* Mark the queues as all flushed. We're going to return failure | ||
1278 | * leading to a reset, or fake up success anyway */ | ||
1279 | efx_for_each_channel(channel, efx) { | ||
1280 | efx_for_each_possible_channel_tx_queue(tx_queue, channel) { | ||
1281 | if (tx_queue->initialised && | ||
1282 | tx_queue->flushed != FLUSH_DONE) | ||
1283 | netif_err(efx, hw, efx->net_dev, | ||
1284 | "tx queue %d flush command timed out\n", | ||
1285 | tx_queue->queue); | ||
1286 | tx_queue->flushed = FLUSH_DONE; | ||
1287 | } | ||
1288 | efx_for_each_channel_rx_queue(rx_queue, channel) { | ||
1289 | if (rx_queue->flushed != FLUSH_DONE) | ||
1290 | netif_err(efx, hw, efx->net_dev, | ||
1291 | "rx queue %d flush command timed out\n", | ||
1292 | efx_rx_queue_index(rx_queue)); | ||
1293 | rx_queue->flushed = FLUSH_DONE; | ||
1294 | } | ||
1295 | } | ||
1296 | |||
1297 | return -ETIMEDOUT; | ||
1298 | } | ||
1299 | |||
1300 | /************************************************************************** | ||
1301 | * | ||
1302 | * Hardware interrupts | 1317 | * Hardware interrupts |
1303 | * The hardware interrupt handler does very little work; all the event | 1318 | * The hardware interrupt handler does very little work; all the event |
1304 | * queue processing is carried out by per-channel tasklets. | 1319 | * queue processing is carried out by per-channel tasklets. |
@@ -1320,18 +1335,10 @@ static inline void efx_nic_interrupts(struct efx_nic *efx, | |||
1320 | 1335 | ||
1321 | void efx_nic_enable_interrupts(struct efx_nic *efx) | 1336 | void efx_nic_enable_interrupts(struct efx_nic *efx) |
1322 | { | 1337 | { |
1323 | struct efx_channel *channel; | ||
1324 | |||
1325 | EFX_ZERO_OWORD(*((efx_oword_t *) efx->irq_status.addr)); | 1338 | EFX_ZERO_OWORD(*((efx_oword_t *) efx->irq_status.addr)); |
1326 | wmb(); /* Ensure interrupt vector is clear before interrupts enabled */ | 1339 | wmb(); /* Ensure interrupt vector is clear before interrupts enabled */ |
1327 | 1340 | ||
1328 | /* Enable interrupts */ | ||
1329 | efx_nic_interrupts(efx, true, false); | 1341 | efx_nic_interrupts(efx, true, false); |
1330 | |||
1331 | /* Force processing of all the channels to get the EVQ RPTRs up to | ||
1332 | date */ | ||
1333 | efx_for_each_channel(channel, efx) | ||
1334 | efx_schedule_channel(channel); | ||
1335 | } | 1342 | } |
1336 | 1343 | ||
1337 | void efx_nic_disable_interrupts(struct efx_nic *efx) | 1344 | void efx_nic_disable_interrupts(struct efx_nic *efx) |