diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2010-09-10 02:41:36 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-09-10 15:27:32 -0400 |
commit | ba1e8a35b77f3bc7d109696dbd2a7fd5af208b62 (patch) | |
tree | 5c65eea772e85b7e31b3488fa09e523bbd68b272 /drivers/net/sfc/nic.c | |
parent | 58758aa505edc5b8f8393cee45b54c7485d76de5 (diff) |
sfc: Abstract channel and index lookup for RX queues
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/sfc/nic.c')
-rw-r--r-- | drivers/net/sfc/nic.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/drivers/net/sfc/nic.c b/drivers/net/sfc/nic.c index 8efe1ca83c1d..be4d5524054f 100644 --- a/drivers/net/sfc/nic.c +++ b/drivers/net/sfc/nic.c | |||
@@ -539,8 +539,8 @@ void efx_nic_notify_rx_desc(struct efx_rx_queue *rx_queue) | |||
539 | wmb(); | 539 | wmb(); |
540 | write_ptr = rx_queue->added_count & EFX_RXQ_MASK; | 540 | write_ptr = rx_queue->added_count & EFX_RXQ_MASK; |
541 | EFX_POPULATE_DWORD_1(reg, FRF_AZ_RX_DESC_WPTR_DWORD, write_ptr); | 541 | EFX_POPULATE_DWORD_1(reg, FRF_AZ_RX_DESC_WPTR_DWORD, write_ptr); |
542 | efx_writed_page(rx_queue->efx, ®, | 542 | efx_writed_page(rx_queue->efx, ®, FR_AZ_RX_DESC_UPD_DWORD_P0, |
543 | FR_AZ_RX_DESC_UPD_DWORD_P0, rx_queue->queue); | 543 | efx_rx_queue_index(rx_queue)); |
544 | } | 544 | } |
545 | 545 | ||
546 | int efx_nic_probe_rx(struct efx_rx_queue *rx_queue) | 546 | int efx_nic_probe_rx(struct efx_rx_queue *rx_queue) |
@@ -561,7 +561,7 @@ void efx_nic_init_rx(struct efx_rx_queue *rx_queue) | |||
561 | 561 | ||
562 | netif_dbg(efx, hw, efx->net_dev, | 562 | netif_dbg(efx, hw, efx->net_dev, |
563 | "RX queue %d ring in special buffers %d-%d\n", | 563 | "RX queue %d ring in special buffers %d-%d\n", |
564 | rx_queue->queue, rx_queue->rxd.index, | 564 | efx_rx_queue_index(rx_queue), rx_queue->rxd.index, |
565 | rx_queue->rxd.index + rx_queue->rxd.entries - 1); | 565 | rx_queue->rxd.index + rx_queue->rxd.entries - 1); |
566 | 566 | ||
567 | rx_queue->flushed = FLUSH_NONE; | 567 | rx_queue->flushed = FLUSH_NONE; |
@@ -575,9 +575,10 @@ void efx_nic_init_rx(struct efx_rx_queue *rx_queue) | |||
575 | FRF_AZ_RX_ISCSI_HDIG_EN, iscsi_digest_en, | 575 | FRF_AZ_RX_ISCSI_HDIG_EN, iscsi_digest_en, |
576 | FRF_AZ_RX_DESCQ_BUF_BASE_ID, rx_queue->rxd.index, | 576 | FRF_AZ_RX_DESCQ_BUF_BASE_ID, rx_queue->rxd.index, |
577 | FRF_AZ_RX_DESCQ_EVQ_ID, | 577 | FRF_AZ_RX_DESCQ_EVQ_ID, |
578 | rx_queue->channel->channel, | 578 | efx_rx_queue_channel(rx_queue)->channel, |
579 | FRF_AZ_RX_DESCQ_OWNER_ID, 0, | 579 | FRF_AZ_RX_DESCQ_OWNER_ID, 0, |
580 | FRF_AZ_RX_DESCQ_LABEL, rx_queue->queue, | 580 | FRF_AZ_RX_DESCQ_LABEL, |
581 | efx_rx_queue_index(rx_queue), | ||
581 | FRF_AZ_RX_DESCQ_SIZE, | 582 | FRF_AZ_RX_DESCQ_SIZE, |
582 | __ffs(rx_queue->rxd.entries), | 583 | __ffs(rx_queue->rxd.entries), |
583 | FRF_AZ_RX_DESCQ_TYPE, 0 /* kernel queue */ , | 584 | FRF_AZ_RX_DESCQ_TYPE, 0 /* kernel queue */ , |
@@ -585,7 +586,7 @@ void efx_nic_init_rx(struct efx_rx_queue *rx_queue) | |||
585 | FRF_AZ_RX_DESCQ_JUMBO, !is_b0, | 586 | FRF_AZ_RX_DESCQ_JUMBO, !is_b0, |
586 | FRF_AZ_RX_DESCQ_EN, 1); | 587 | FRF_AZ_RX_DESCQ_EN, 1); |
587 | efx_writeo_table(efx, &rx_desc_ptr, efx->type->rxd_ptr_tbl_base, | 588 | efx_writeo_table(efx, &rx_desc_ptr, efx->type->rxd_ptr_tbl_base, |
588 | rx_queue->queue); | 589 | efx_rx_queue_index(rx_queue)); |
589 | } | 590 | } |
590 | 591 | ||
591 | static void efx_flush_rx_queue(struct efx_rx_queue *rx_queue) | 592 | static void efx_flush_rx_queue(struct efx_rx_queue *rx_queue) |
@@ -598,7 +599,8 @@ static void efx_flush_rx_queue(struct efx_rx_queue *rx_queue) | |||
598 | /* Post a flush command */ | 599 | /* Post a flush command */ |
599 | EFX_POPULATE_OWORD_2(rx_flush_descq, | 600 | EFX_POPULATE_OWORD_2(rx_flush_descq, |
600 | FRF_AZ_RX_FLUSH_DESCQ_CMD, 1, | 601 | FRF_AZ_RX_FLUSH_DESCQ_CMD, 1, |
601 | FRF_AZ_RX_FLUSH_DESCQ, rx_queue->queue); | 602 | FRF_AZ_RX_FLUSH_DESCQ, |
603 | efx_rx_queue_index(rx_queue)); | ||
602 | efx_writeo(efx, &rx_flush_descq, FR_AZ_RX_FLUSH_DESCQ); | 604 | efx_writeo(efx, &rx_flush_descq, FR_AZ_RX_FLUSH_DESCQ); |
603 | } | 605 | } |
604 | 606 | ||
@@ -613,7 +615,7 @@ void efx_nic_fini_rx(struct efx_rx_queue *rx_queue) | |||
613 | /* Remove RX descriptor ring from card */ | 615 | /* Remove RX descriptor ring from card */ |
614 | EFX_ZERO_OWORD(rx_desc_ptr); | 616 | EFX_ZERO_OWORD(rx_desc_ptr); |
615 | efx_writeo_table(efx, &rx_desc_ptr, efx->type->rxd_ptr_tbl_base, | 617 | efx_writeo_table(efx, &rx_desc_ptr, efx->type->rxd_ptr_tbl_base, |
616 | rx_queue->queue); | 618 | efx_rx_queue_index(rx_queue)); |
617 | 619 | ||
618 | /* Unpin RX descriptor ring */ | 620 | /* Unpin RX descriptor ring */ |
619 | efx_fini_special_buffer(efx, &rx_queue->rxd); | 621 | efx_fini_special_buffer(efx, &rx_queue->rxd); |
@@ -714,6 +716,7 @@ static void efx_handle_rx_not_ok(struct efx_rx_queue *rx_queue, | |||
714 | bool *rx_ev_pkt_ok, | 716 | bool *rx_ev_pkt_ok, |
715 | bool *discard) | 717 | bool *discard) |
716 | { | 718 | { |
719 | struct efx_channel *channel = efx_rx_queue_channel(rx_queue); | ||
717 | struct efx_nic *efx = rx_queue->efx; | 720 | struct efx_nic *efx = rx_queue->efx; |
718 | bool rx_ev_buf_owner_id_err, rx_ev_ip_hdr_chksum_err; | 721 | bool rx_ev_buf_owner_id_err, rx_ev_ip_hdr_chksum_err; |
719 | bool rx_ev_tcp_udp_chksum_err, rx_ev_eth_crc_err; | 722 | bool rx_ev_tcp_udp_chksum_err, rx_ev_eth_crc_err; |
@@ -746,14 +749,14 @@ static void efx_handle_rx_not_ok(struct efx_rx_queue *rx_queue, | |||
746 | /* Count errors that are not in MAC stats. Ignore expected | 749 | /* Count errors that are not in MAC stats. Ignore expected |
747 | * checksum errors during self-test. */ | 750 | * checksum errors during self-test. */ |
748 | if (rx_ev_frm_trunc) | 751 | if (rx_ev_frm_trunc) |
749 | ++rx_queue->channel->n_rx_frm_trunc; | 752 | ++channel->n_rx_frm_trunc; |
750 | else if (rx_ev_tobe_disc) | 753 | else if (rx_ev_tobe_disc) |
751 | ++rx_queue->channel->n_rx_tobe_disc; | 754 | ++channel->n_rx_tobe_disc; |
752 | else if (!efx->loopback_selftest) { | 755 | else if (!efx->loopback_selftest) { |
753 | if (rx_ev_ip_hdr_chksum_err) | 756 | if (rx_ev_ip_hdr_chksum_err) |
754 | ++rx_queue->channel->n_rx_ip_hdr_chksum_err; | 757 | ++channel->n_rx_ip_hdr_chksum_err; |
755 | else if (rx_ev_tcp_udp_chksum_err) | 758 | else if (rx_ev_tcp_udp_chksum_err) |
756 | ++rx_queue->channel->n_rx_tcp_udp_chksum_err; | 759 | ++channel->n_rx_tcp_udp_chksum_err; |
757 | } | 760 | } |
758 | 761 | ||
759 | /* The frame must be discarded if any of these are true. */ | 762 | /* The frame must be discarded if any of these are true. */ |
@@ -769,7 +772,7 @@ static void efx_handle_rx_not_ok(struct efx_rx_queue *rx_queue, | |||
769 | netif_dbg(efx, rx_err, efx->net_dev, | 772 | netif_dbg(efx, rx_err, efx->net_dev, |
770 | " RX queue %d unexpected RX event " | 773 | " RX queue %d unexpected RX event " |
771 | EFX_QWORD_FMT "%s%s%s%s%s%s%s%s\n", | 774 | EFX_QWORD_FMT "%s%s%s%s%s%s%s%s\n", |
772 | rx_queue->queue, EFX_QWORD_VAL(*event), | 775 | efx_rx_queue_index(rx_queue), EFX_QWORD_VAL(*event), |
773 | rx_ev_buf_owner_id_err ? " [OWNER_ID_ERR]" : "", | 776 | rx_ev_buf_owner_id_err ? " [OWNER_ID_ERR]" : "", |
774 | rx_ev_ip_hdr_chksum_err ? | 777 | rx_ev_ip_hdr_chksum_err ? |
775 | " [IP_HDR_CHKSUM_ERR]" : "", | 778 | " [IP_HDR_CHKSUM_ERR]" : "", |
@@ -1269,7 +1272,7 @@ int efx_nic_flush_queues(struct efx_nic *efx) | |||
1269 | if (rx_queue->flushed != FLUSH_DONE) | 1272 | if (rx_queue->flushed != FLUSH_DONE) |
1270 | netif_err(efx, hw, efx->net_dev, | 1273 | netif_err(efx, hw, efx->net_dev, |
1271 | "rx queue %d flush command timed out\n", | 1274 | "rx queue %d flush command timed out\n", |
1272 | rx_queue->queue); | 1275 | efx_rx_queue_index(rx_queue)); |
1273 | rx_queue->flushed = FLUSH_DONE; | 1276 | rx_queue->flushed = FLUSH_DONE; |
1274 | } | 1277 | } |
1275 | 1278 | ||