diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2008-09-01 07:47:48 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-09-03 09:53:46 -0400 |
commit | 8831da7b6c4b15c0be0ba849be4aea5eed3999c6 (patch) | |
tree | 6bdfd5433f9eb4358a67504d85fb903fe17fd9d9 /drivers/net/sfc | |
parent | 64ee3120f73b9e904d97ba66386b1e8e93b81385 (diff) |
sfc: Cleanup RX queue information
Rename efx_nic::rss_queues to the more obvious n_rx_queues
Remove efx_rx_queue::used and other stuff that's redundant with it.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/net/sfc')
-rw-r--r-- | drivers/net/sfc/efx.c | 43 | ||||
-rw-r--r-- | drivers/net/sfc/falcon.c | 4 | ||||
-rw-r--r-- | drivers/net/sfc/net_driver.h | 16 | ||||
-rw-r--r-- | drivers/net/sfc/rx.c | 22 |
4 files changed, 27 insertions, 58 deletions
diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c index 2deac7b04282..ba4369c8a834 100644 --- a/drivers/net/sfc/efx.c +++ b/drivers/net/sfc/efx.c | |||
@@ -859,20 +859,20 @@ static void efx_probe_interrupts(struct efx_nic *efx) | |||
859 | * We will need one channel per interrupt. | 859 | * We will need one channel per interrupt. |
860 | */ | 860 | */ |
861 | wanted_ints = rss_cpus ? rss_cpus : efx_wanted_rx_queues(); | 861 | wanted_ints = rss_cpus ? rss_cpus : efx_wanted_rx_queues(); |
862 | efx->rss_queues = min(wanted_ints, max_channels); | 862 | efx->n_rx_queues = min(wanted_ints, max_channels); |
863 | 863 | ||
864 | for (i = 0; i < efx->rss_queues; i++) | 864 | for (i = 0; i < efx->n_rx_queues; i++) |
865 | xentries[i].entry = i; | 865 | xentries[i].entry = i; |
866 | rc = pci_enable_msix(efx->pci_dev, xentries, efx->rss_queues); | 866 | rc = pci_enable_msix(efx->pci_dev, xentries, efx->n_rx_queues); |
867 | if (rc > 0) { | 867 | if (rc > 0) { |
868 | EFX_BUG_ON_PARANOID(rc >= efx->rss_queues); | 868 | EFX_BUG_ON_PARANOID(rc >= efx->n_rx_queues); |
869 | efx->rss_queues = rc; | 869 | efx->n_rx_queues = rc; |
870 | rc = pci_enable_msix(efx->pci_dev, xentries, | 870 | rc = pci_enable_msix(efx->pci_dev, xentries, |
871 | efx->rss_queues); | 871 | efx->n_rx_queues); |
872 | } | 872 | } |
873 | 873 | ||
874 | if (rc == 0) { | 874 | if (rc == 0) { |
875 | for (i = 0; i < efx->rss_queues; i++) | 875 | for (i = 0; i < efx->n_rx_queues; i++) |
876 | efx->channel[i].irq = xentries[i].vector; | 876 | efx->channel[i].irq = xentries[i].vector; |
877 | } else { | 877 | } else { |
878 | /* Fall back to single channel MSI */ | 878 | /* Fall back to single channel MSI */ |
@@ -883,7 +883,7 @@ static void efx_probe_interrupts(struct efx_nic *efx) | |||
883 | 883 | ||
884 | /* Try single interrupt MSI */ | 884 | /* Try single interrupt MSI */ |
885 | if (efx->interrupt_mode == EFX_INT_MODE_MSI) { | 885 | if (efx->interrupt_mode == EFX_INT_MODE_MSI) { |
886 | efx->rss_queues = 1; | 886 | efx->n_rx_queues = 1; |
887 | rc = pci_enable_msi(efx->pci_dev); | 887 | rc = pci_enable_msi(efx->pci_dev); |
888 | if (rc == 0) { | 888 | if (rc == 0) { |
889 | efx->channel[0].irq = efx->pci_dev->irq; | 889 | efx->channel[0].irq = efx->pci_dev->irq; |
@@ -895,7 +895,7 @@ static void efx_probe_interrupts(struct efx_nic *efx) | |||
895 | 895 | ||
896 | /* Assume legacy interrupts */ | 896 | /* Assume legacy interrupts */ |
897 | if (efx->interrupt_mode == EFX_INT_MODE_LEGACY) { | 897 | if (efx->interrupt_mode == EFX_INT_MODE_LEGACY) { |
898 | efx->rss_queues = 1; | 898 | efx->n_rx_queues = 1; |
899 | efx->legacy_irq = efx->pci_dev->irq; | 899 | efx->legacy_irq = efx->pci_dev->irq; |
900 | } | 900 | } |
901 | } | 901 | } |
@@ -914,14 +914,10 @@ static void efx_remove_interrupts(struct efx_nic *efx) | |||
914 | efx->legacy_irq = 0; | 914 | efx->legacy_irq = 0; |
915 | } | 915 | } |
916 | 916 | ||
917 | /* Select number of used resources | 917 | static void efx_set_channels(struct efx_nic *efx) |
918 | * Should be called after probe_interrupts() | ||
919 | */ | ||
920 | static void efx_select_used(struct efx_nic *efx) | ||
921 | { | 918 | { |
922 | struct efx_tx_queue *tx_queue; | 919 | struct efx_tx_queue *tx_queue; |
923 | struct efx_rx_queue *rx_queue; | 920 | struct efx_rx_queue *rx_queue; |
924 | int i; | ||
925 | 921 | ||
926 | efx_for_each_tx_queue(tx_queue, efx) { | 922 | efx_for_each_tx_queue(tx_queue, efx) { |
927 | if (!EFX_INT_MODE_USE_MSI(efx) && separate_tx_and_rx_channels) | 923 | if (!EFX_INT_MODE_USE_MSI(efx) && separate_tx_and_rx_channels) |
@@ -931,19 +927,9 @@ static void efx_select_used(struct efx_nic *efx) | |||
931 | tx_queue->channel->used_flags |= EFX_USED_BY_TX; | 927 | tx_queue->channel->used_flags |= EFX_USED_BY_TX; |
932 | } | 928 | } |
933 | 929 | ||
934 | /* RX queues. Each has a dedicated channel. */ | 930 | efx_for_each_rx_queue(rx_queue, efx) { |
935 | for (i = 0; i < EFX_MAX_RX_QUEUES; i++) { | 931 | rx_queue->channel = &efx->channel[rx_queue->queue]; |
936 | rx_queue = &efx->rx_queue[i]; | 932 | rx_queue->channel->used_flags |= EFX_USED_BY_RX; |
937 | |||
938 | if (i < efx->rss_queues) { | ||
939 | rx_queue->used = true; | ||
940 | /* If we allow multiple RX queues per channel | ||
941 | * we need to decide that here | ||
942 | */ | ||
943 | rx_queue->channel = &efx->channel[rx_queue->queue]; | ||
944 | rx_queue->channel->used_flags |= EFX_USED_BY_RX; | ||
945 | rx_queue++; | ||
946 | } | ||
947 | } | 933 | } |
948 | } | 934 | } |
949 | 935 | ||
@@ -962,8 +948,7 @@ static int efx_probe_nic(struct efx_nic *efx) | |||
962 | * in MSI-X interrupts. */ | 948 | * in MSI-X interrupts. */ |
963 | efx_probe_interrupts(efx); | 949 | efx_probe_interrupts(efx); |
964 | 950 | ||
965 | /* Determine number of RX queues and TX queues */ | 951 | efx_set_channels(efx); |
966 | efx_select_used(efx); | ||
967 | 952 | ||
968 | /* Initialise the interrupt moderation settings */ | 953 | /* Initialise the interrupt moderation settings */ |
969 | efx_init_irq_moderation(efx, tx_irq_mod_usec, rx_irq_mod_usec); | 954 | efx_init_irq_moderation(efx, tx_irq_mod_usec, rx_irq_mod_usec); |
diff --git a/drivers/net/sfc/falcon.c b/drivers/net/sfc/falcon.c index 40dd643e930d..03194d6034ef 100644 --- a/drivers/net/sfc/falcon.c +++ b/drivers/net/sfc/falcon.c | |||
@@ -1535,7 +1535,7 @@ static void falcon_setup_rss_indir_table(struct efx_nic *efx) | |||
1535 | offset < RX_RSS_INDIR_TBL_B0 + 0x800; | 1535 | offset < RX_RSS_INDIR_TBL_B0 + 0x800; |
1536 | offset += 0x10) { | 1536 | offset += 0x10) { |
1537 | EFX_POPULATE_DWORD_1(dword, RX_RSS_INDIR_ENT_B0, | 1537 | EFX_POPULATE_DWORD_1(dword, RX_RSS_INDIR_ENT_B0, |
1538 | i % efx->rss_queues); | 1538 | i % efx->n_rx_queues); |
1539 | falcon_writel(efx, &dword, offset); | 1539 | falcon_writel(efx, &dword, offset); |
1540 | i++; | 1540 | i++; |
1541 | } | 1541 | } |
@@ -2785,7 +2785,7 @@ int falcon_init_nic(struct efx_nic *efx) | |||
2785 | if (falcon_rev(efx) >= FALCON_REV_B0) | 2785 | if (falcon_rev(efx) >= FALCON_REV_B0) |
2786 | EFX_SET_OWORD_FIELD(temp, NUM_KER, 0); | 2786 | EFX_SET_OWORD_FIELD(temp, NUM_KER, 0); |
2787 | else | 2787 | else |
2788 | EFX_SET_OWORD_FIELD(temp, NUM_KER, efx->rss_queues - 1); | 2788 | EFX_SET_OWORD_FIELD(temp, NUM_KER, efx->n_rx_queues - 1); |
2789 | if (EFX_WORKAROUND_7244(efx)) { | 2789 | if (EFX_WORKAROUND_7244(efx)) { |
2790 | EFX_SET_OWORD_FIELD(temp, UDP_FULL_SRCH_LIMIT, 8); | 2790 | EFX_SET_OWORD_FIELD(temp, UDP_FULL_SRCH_LIMIT, 8); |
2791 | EFX_SET_OWORD_FIELD(temp, UDP_WILD_SRCH_LIMIT, 8); | 2791 | EFX_SET_OWORD_FIELD(temp, UDP_WILD_SRCH_LIMIT, 8); |
diff --git a/drivers/net/sfc/net_driver.h b/drivers/net/sfc/net_driver.h index 1fa134ab8eb8..b5649b16cd43 100644 --- a/drivers/net/sfc/net_driver.h +++ b/drivers/net/sfc/net_driver.h | |||
@@ -231,7 +231,6 @@ struct efx_rx_buffer { | |||
231 | * struct efx_rx_queue - An Efx RX queue | 231 | * struct efx_rx_queue - An Efx RX queue |
232 | * @efx: The associated Efx NIC | 232 | * @efx: The associated Efx NIC |
233 | * @queue: DMA queue number | 233 | * @queue: DMA queue number |
234 | * @used: Queue is used by net driver | ||
235 | * @channel: The associated channel | 234 | * @channel: The associated channel |
236 | * @buffer: The software buffer ring | 235 | * @buffer: The software buffer ring |
237 | * @rxd: The hardware descriptor ring | 236 | * @rxd: The hardware descriptor ring |
@@ -265,7 +264,6 @@ struct efx_rx_buffer { | |||
265 | struct efx_rx_queue { | 264 | struct efx_rx_queue { |
266 | struct efx_nic *efx; | 265 | struct efx_nic *efx; |
267 | int queue; | 266 | int queue; |
268 | bool used; | ||
269 | struct efx_channel *channel; | 267 | struct efx_channel *channel; |
270 | struct efx_rx_buffer *buffer; | 268 | struct efx_rx_buffer *buffer; |
271 | struct efx_special_buffer rxd; | 269 | struct efx_special_buffer rxd; |
@@ -628,7 +626,7 @@ union efx_multicast_hash { | |||
628 | * @tx_queue: TX DMA queues | 626 | * @tx_queue: TX DMA queues |
629 | * @rx_queue: RX DMA queues | 627 | * @rx_queue: RX DMA queues |
630 | * @channel: Channels | 628 | * @channel: Channels |
631 | * @rss_queues: Number of RSS queues | 629 | * @n_rx_queues: Number of RX queues |
632 | * @rx_buffer_len: RX buffer length | 630 | * @rx_buffer_len: RX buffer length |
633 | * @rx_buffer_order: Order (log2) of number of pages for each RX buffer | 631 | * @rx_buffer_order: Order (log2) of number of pages for each RX buffer |
634 | * @irq_status: Interrupt status buffer | 632 | * @irq_status: Interrupt status buffer |
@@ -704,7 +702,7 @@ struct efx_nic { | |||
704 | struct efx_rx_queue rx_queue[EFX_MAX_RX_QUEUES]; | 702 | struct efx_rx_queue rx_queue[EFX_MAX_RX_QUEUES]; |
705 | struct efx_channel channel[EFX_MAX_CHANNELS]; | 703 | struct efx_channel channel[EFX_MAX_CHANNELS]; |
706 | 704 | ||
707 | int rss_queues; | 705 | int n_rx_queues; |
708 | unsigned int rx_buffer_len; | 706 | unsigned int rx_buffer_len; |
709 | unsigned int rx_buffer_order; | 707 | unsigned int rx_buffer_order; |
710 | 708 | ||
@@ -850,19 +848,15 @@ struct efx_nic_type { | |||
850 | /* Iterate over all used RX queues */ | 848 | /* Iterate over all used RX queues */ |
851 | #define efx_for_each_rx_queue(_rx_queue, _efx) \ | 849 | #define efx_for_each_rx_queue(_rx_queue, _efx) \ |
852 | for (_rx_queue = &_efx->rx_queue[0]; \ | 850 | for (_rx_queue = &_efx->rx_queue[0]; \ |
853 | _rx_queue < &_efx->rx_queue[EFX_MAX_RX_QUEUES]; \ | 851 | _rx_queue < &_efx->rx_queue[_efx->n_rx_queues]; \ |
854 | _rx_queue++) \ | 852 | _rx_queue++) |
855 | if (!_rx_queue->used) \ | ||
856 | continue; \ | ||
857 | else | ||
858 | 853 | ||
859 | /* Iterate over all RX queues belonging to a channel */ | 854 | /* Iterate over all RX queues belonging to a channel */ |
860 | #define efx_for_each_channel_rx_queue(_rx_queue, _channel) \ | 855 | #define efx_for_each_channel_rx_queue(_rx_queue, _channel) \ |
861 | for (_rx_queue = &_channel->efx->rx_queue[0]; \ | 856 | for (_rx_queue = &_channel->efx->rx_queue[0]; \ |
862 | _rx_queue < &_channel->efx->rx_queue[EFX_MAX_RX_QUEUES]; \ | 857 | _rx_queue < &_channel->efx->rx_queue[EFX_MAX_RX_QUEUES]; \ |
863 | _rx_queue++) \ | 858 | _rx_queue++) \ |
864 | if ((!_rx_queue->used) || \ | 859 | if (_rx_queue->channel != _channel) \ |
865 | (_rx_queue->channel != _channel)) \ | ||
866 | continue; \ | 860 | continue; \ |
867 | else | 861 | else |
868 | 862 | ||
diff --git a/drivers/net/sfc/rx.c b/drivers/net/sfc/rx.c index fa1a62aacbae..7d2dc20d0ca3 100644 --- a/drivers/net/sfc/rx.c +++ b/drivers/net/sfc/rx.c | |||
@@ -789,23 +789,14 @@ int efx_probe_rx_queue(struct efx_rx_queue *rx_queue) | |||
789 | /* Allocate RX buffers */ | 789 | /* Allocate RX buffers */ |
790 | rxq_size = (efx->type->rxd_ring_mask + 1) * sizeof(*rx_queue->buffer); | 790 | rxq_size = (efx->type->rxd_ring_mask + 1) * sizeof(*rx_queue->buffer); |
791 | rx_queue->buffer = kzalloc(rxq_size, GFP_KERNEL); | 791 | rx_queue->buffer = kzalloc(rxq_size, GFP_KERNEL); |
792 | if (!rx_queue->buffer) { | 792 | if (!rx_queue->buffer) |
793 | rc = -ENOMEM; | 793 | return -ENOMEM; |
794 | goto fail1; | ||
795 | } | ||
796 | 794 | ||
797 | rc = falcon_probe_rx(rx_queue); | 795 | rc = falcon_probe_rx(rx_queue); |
798 | if (rc) | 796 | if (rc) { |
799 | goto fail2; | 797 | kfree(rx_queue->buffer); |
800 | 798 | rx_queue->buffer = NULL; | |
801 | return 0; | 799 | } |
802 | |||
803 | fail2: | ||
804 | kfree(rx_queue->buffer); | ||
805 | rx_queue->buffer = NULL; | ||
806 | fail1: | ||
807 | rx_queue->used = 0; | ||
808 | |||
809 | return rc; | 800 | return rc; |
810 | } | 801 | } |
811 | 802 | ||
@@ -872,7 +863,6 @@ void efx_remove_rx_queue(struct efx_rx_queue *rx_queue) | |||
872 | 863 | ||
873 | kfree(rx_queue->buffer); | 864 | kfree(rx_queue->buffer); |
874 | rx_queue->buffer = NULL; | 865 | rx_queue->buffer = NULL; |
875 | rx_queue->used = 0; | ||
876 | } | 866 | } |
877 | 867 | ||
878 | void efx_flush_lro(struct efx_channel *channel) | 868 | void efx_flush_lro(struct efx_channel *channel) |