aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/sfc/nic.c
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2010-09-10 02:41:36 -0400
committerDavid S. Miller <davem@davemloft.net>2010-09-10 15:27:32 -0400
commitba1e8a35b77f3bc7d109696dbd2a7fd5af208b62 (patch)
tree5c65eea772e85b7e31b3488fa09e523bbd68b272 /drivers/net/sfc/nic.c
parent58758aa505edc5b8f8393cee45b54c7485d76de5 (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.c31
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, &reg, 542 efx_writed_page(rx_queue->efx, &reg, 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
546int efx_nic_probe_rx(struct efx_rx_queue *rx_queue) 546int 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
591static void efx_flush_rx_queue(struct efx_rx_queue *rx_queue) 592static 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