diff options
author | Selvin Xavier <selvin.xavier@emulex.com> | 2011-05-16 03:36:35 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-05-16 14:13:53 -0400 |
commit | 005d569600b404cae0b356e3c4085290ecc17775 (patch) | |
tree | b8c69da965d0588e5cc73f9cd716eabbe90f1899 /drivers/net/benet | |
parent | 89a88ab84b946a90839fb66ca3583a2504c11292 (diff) |
be2net: Stats for Lancer
Added Lancer stats implementation.
Signed-off-by: Selvin Xavier <selvin.xavier@emulex.com>
Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/benet')
-rw-r--r-- | drivers/net/benet/be.h | 74 | ||||
-rw-r--r-- | drivers/net/benet/be_cmds.c | 55 | ||||
-rw-r--r-- | drivers/net/benet/be_cmds.h | 197 | ||||
-rw-r--r-- | drivers/net/benet/be_main.c | 91 |
4 files changed, 367 insertions, 50 deletions
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h index 0da0384efee7..0b73dcf26924 100644 --- a/drivers/net/benet/be.h +++ b/drivers/net/benet/be.h | |||
@@ -244,43 +244,43 @@ struct be_rx_obj { | |||
244 | 244 | ||
245 | struct be_drv_stats { | 245 | struct be_drv_stats { |
246 | u8 be_on_die_temperature; | 246 | u8 be_on_die_temperature; |
247 | u32 be_tx_events; | 247 | u64 be_tx_events; |
248 | u32 eth_red_drops; | 248 | u64 eth_red_drops; |
249 | u32 rx_drops_no_pbuf; | 249 | u64 rx_drops_no_pbuf; |
250 | u32 rx_drops_no_txpb; | 250 | u64 rx_drops_no_txpb; |
251 | u32 rx_drops_no_erx_descr; | 251 | u64 rx_drops_no_erx_descr; |
252 | u32 rx_drops_no_tpre_descr; | 252 | u64 rx_drops_no_tpre_descr; |
253 | u32 rx_drops_too_many_frags; | 253 | u64 rx_drops_too_many_frags; |
254 | u32 rx_drops_invalid_ring; | 254 | u64 rx_drops_invalid_ring; |
255 | u32 forwarded_packets; | 255 | u64 forwarded_packets; |
256 | u32 rx_drops_mtu; | 256 | u64 rx_drops_mtu; |
257 | u32 rx_crc_errors; | 257 | u64 rx_crc_errors; |
258 | u32 rx_alignment_symbol_errors; | 258 | u64 rx_alignment_symbol_errors; |
259 | u32 rx_pause_frames; | 259 | u64 rx_pause_frames; |
260 | u32 rx_priority_pause_frames; | 260 | u64 rx_priority_pause_frames; |
261 | u32 rx_control_frames; | 261 | u64 rx_control_frames; |
262 | u32 rx_in_range_errors; | 262 | u64 rx_in_range_errors; |
263 | u32 rx_out_range_errors; | 263 | u64 rx_out_range_errors; |
264 | u32 rx_frame_too_long; | 264 | u64 rx_frame_too_long; |
265 | u32 rx_address_match_errors; | 265 | u64 rx_address_match_errors; |
266 | u32 rx_dropped_too_small; | 266 | u64 rx_dropped_too_small; |
267 | u32 rx_dropped_too_short; | 267 | u64 rx_dropped_too_short; |
268 | u32 rx_dropped_header_too_small; | 268 | u64 rx_dropped_header_too_small; |
269 | u32 rx_dropped_tcp_length; | 269 | u64 rx_dropped_tcp_length; |
270 | u32 rx_dropped_runt; | 270 | u64 rx_dropped_runt; |
271 | u32 rx_ip_checksum_errs; | 271 | u64 rx_ip_checksum_errs; |
272 | u32 rx_tcp_checksum_errs; | 272 | u64 rx_tcp_checksum_errs; |
273 | u32 rx_udp_checksum_errs; | 273 | u64 rx_udp_checksum_errs; |
274 | u32 rx_switched_unicast_packets; | 274 | u64 rx_switched_unicast_packets; |
275 | u32 rx_switched_multicast_packets; | 275 | u64 rx_switched_multicast_packets; |
276 | u32 rx_switched_broadcast_packets; | 276 | u64 rx_switched_broadcast_packets; |
277 | u32 tx_pauseframes; | 277 | u64 tx_pauseframes; |
278 | u32 tx_priority_pauseframes; | 278 | u64 tx_priority_pauseframes; |
279 | u32 tx_controlframes; | 279 | u64 tx_controlframes; |
280 | u32 rxpp_fifo_overflow_drop; | 280 | u64 rxpp_fifo_overflow_drop; |
281 | u32 rx_input_fifo_overflow_drop; | 281 | u64 rx_input_fifo_overflow_drop; |
282 | u32 pmem_fifo_overflow_drop; | 282 | u64 pmem_fifo_overflow_drop; |
283 | u32 jabber_events; | 283 | u64 jabber_events; |
284 | }; | 284 | }; |
285 | 285 | ||
286 | struct be_vf_cfg { | 286 | struct be_vf_cfg { |
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c index 08e09388789a..aaef0c731b9a 100644 --- a/drivers/net/benet/be_cmds.c +++ b/drivers/net/benet/be_cmds.c | |||
@@ -78,14 +78,22 @@ static int be_mcc_compl_process(struct be_adapter *adapter, | |||
78 | } | 78 | } |
79 | 79 | ||
80 | if (compl_status == MCC_STATUS_SUCCESS) { | 80 | if (compl_status == MCC_STATUS_SUCCESS) { |
81 | if ((compl->tag0 == OPCODE_ETH_GET_STATISTICS) && | 81 | if (((compl->tag0 == OPCODE_ETH_GET_STATISTICS) || |
82 | (compl->tag0 == OPCODE_ETH_GET_PPORT_STATS)) && | ||
82 | (compl->tag1 == CMD_SUBSYSTEM_ETH)) { | 83 | (compl->tag1 == CMD_SUBSYSTEM_ETH)) { |
83 | if (adapter->generation == BE_GEN3) { | 84 | if (adapter->generation == BE_GEN3) { |
84 | struct be_cmd_resp_get_stats_v1 *resp = | 85 | if (lancer_chip(adapter)) { |
86 | struct lancer_cmd_resp_pport_stats | ||
87 | *resp = adapter->stats_cmd.va; | ||
88 | be_dws_le_to_cpu(&resp->pport_stats, | ||
89 | sizeof(resp->pport_stats)); | ||
90 | } else { | ||
91 | struct be_cmd_resp_get_stats_v1 *resp = | ||
85 | adapter->stats_cmd.va; | 92 | adapter->stats_cmd.va; |
86 | 93 | ||
87 | be_dws_le_to_cpu(&resp->hw_stats, | 94 | be_dws_le_to_cpu(&resp->hw_stats, |
88 | sizeof(resp->hw_stats)); | 95 | sizeof(resp->hw_stats)); |
96 | } | ||
89 | } else { | 97 | } else { |
90 | struct be_cmd_resp_get_stats_v0 *resp = | 98 | struct be_cmd_resp_get_stats_v0 *resp = |
91 | adapter->stats_cmd.va; | 99 | adapter->stats_cmd.va; |
@@ -1124,6 +1132,49 @@ err: | |||
1124 | return status; | 1132 | return status; |
1125 | } | 1133 | } |
1126 | 1134 | ||
1135 | /* Lancer Stats */ | ||
1136 | int lancer_cmd_get_pport_stats(struct be_adapter *adapter, | ||
1137 | struct be_dma_mem *nonemb_cmd) | ||
1138 | { | ||
1139 | |||
1140 | struct be_mcc_wrb *wrb; | ||
1141 | struct lancer_cmd_req_pport_stats *req; | ||
1142 | struct be_sge *sge; | ||
1143 | int status = 0; | ||
1144 | |||
1145 | spin_lock_bh(&adapter->mcc_lock); | ||
1146 | |||
1147 | wrb = wrb_from_mccq(adapter); | ||
1148 | if (!wrb) { | ||
1149 | status = -EBUSY; | ||
1150 | goto err; | ||
1151 | } | ||
1152 | req = nonemb_cmd->va; | ||
1153 | sge = nonembedded_sgl(wrb); | ||
1154 | |||
1155 | be_wrb_hdr_prepare(wrb, nonemb_cmd->size, false, 1, | ||
1156 | OPCODE_ETH_GET_PPORT_STATS); | ||
1157 | |||
1158 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, | ||
1159 | OPCODE_ETH_GET_PPORT_STATS, nonemb_cmd->size); | ||
1160 | |||
1161 | |||
1162 | req->cmd_params.params.pport_num = cpu_to_le16(adapter->port_num); | ||
1163 | req->cmd_params.params.reset_stats = 0; | ||
1164 | |||
1165 | wrb->tag1 = CMD_SUBSYSTEM_ETH; | ||
1166 | sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma)); | ||
1167 | sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF); | ||
1168 | sge->len = cpu_to_le32(nonemb_cmd->size); | ||
1169 | |||
1170 | be_mcc_notify(adapter); | ||
1171 | adapter->stats_cmd_sent = true; | ||
1172 | |||
1173 | err: | ||
1174 | spin_unlock_bh(&adapter->mcc_lock); | ||
1175 | return status; | ||
1176 | } | ||
1177 | |||
1127 | /* Uses synchronous mcc */ | 1178 | /* Uses synchronous mcc */ |
1128 | int be_cmd_link_status_query(struct be_adapter *adapter, | 1179 | int be_cmd_link_status_query(struct be_adapter *adapter, |
1129 | bool *link_up, u8 *mac_speed, u16 *link_speed, u32 dom) | 1180 | bool *link_up, u8 *mac_speed, u16 *link_speed, u32 dom) |
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index bcf816d76521..9cff226c94f1 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
@@ -203,6 +203,7 @@ struct be_mcc_mailbox { | |||
203 | #define OPCODE_ETH_TX_DESTROY 9 | 203 | #define OPCODE_ETH_TX_DESTROY 9 |
204 | #define OPCODE_ETH_RX_DESTROY 10 | 204 | #define OPCODE_ETH_RX_DESTROY 10 |
205 | #define OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG 12 | 205 | #define OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG 12 |
206 | #define OPCODE_ETH_GET_PPORT_STATS 18 | ||
206 | 207 | ||
207 | #define OPCODE_LOWLEVEL_HOST_DDR_DMA 17 | 208 | #define OPCODE_LOWLEVEL_HOST_DDR_DMA 17 |
208 | #define OPCODE_LOWLEVEL_LOOPBACK_TEST 18 | 209 | #define OPCODE_LOWLEVEL_LOOPBACK_TEST 18 |
@@ -688,6 +689,200 @@ struct be_cmd_resp_get_stats_v0 { | |||
688 | struct be_hw_stats_v0 hw_stats; | 689 | struct be_hw_stats_v0 hw_stats; |
689 | }; | 690 | }; |
690 | 691 | ||
692 | #define make_64bit_val(hi_32, lo_32) (((u64)hi_32<<32) | lo_32) | ||
693 | struct lancer_cmd_pport_stats { | ||
694 | u32 tx_packets_lo; | ||
695 | u32 tx_packets_hi; | ||
696 | u32 tx_unicast_packets_lo; | ||
697 | u32 tx_unicast_packets_hi; | ||
698 | u32 tx_multicast_packets_lo; | ||
699 | u32 tx_multicast_packets_hi; | ||
700 | u32 tx_broadcast_packets_lo; | ||
701 | u32 tx_broadcast_packets_hi; | ||
702 | u32 tx_bytes_lo; | ||
703 | u32 tx_bytes_hi; | ||
704 | u32 tx_unicast_bytes_lo; | ||
705 | u32 tx_unicast_bytes_hi; | ||
706 | u32 tx_multicast_bytes_lo; | ||
707 | u32 tx_multicast_bytes_hi; | ||
708 | u32 tx_broadcast_bytes_lo; | ||
709 | u32 tx_broadcast_bytes_hi; | ||
710 | u32 tx_discards_lo; | ||
711 | u32 tx_discards_hi; | ||
712 | u32 tx_errors_lo; | ||
713 | u32 tx_errors_hi; | ||
714 | u32 tx_pause_frames_lo; | ||
715 | u32 tx_pause_frames_hi; | ||
716 | u32 tx_pause_on_frames_lo; | ||
717 | u32 tx_pause_on_frames_hi; | ||
718 | u32 tx_pause_off_frames_lo; | ||
719 | u32 tx_pause_off_frames_hi; | ||
720 | u32 tx_internal_mac_errors_lo; | ||
721 | u32 tx_internal_mac_errors_hi; | ||
722 | u32 tx_control_frames_lo; | ||
723 | u32 tx_control_frames_hi; | ||
724 | u32 tx_packets_64_bytes_lo; | ||
725 | u32 tx_packets_64_bytes_hi; | ||
726 | u32 tx_packets_65_to_127_bytes_lo; | ||
727 | u32 tx_packets_65_to_127_bytes_hi; | ||
728 | u32 tx_packets_128_to_255_bytes_lo; | ||
729 | u32 tx_packets_128_to_255_bytes_hi; | ||
730 | u32 tx_packets_256_to_511_bytes_lo; | ||
731 | u32 tx_packets_256_to_511_bytes_hi; | ||
732 | u32 tx_packets_512_to_1023_bytes_lo; | ||
733 | u32 tx_packets_512_to_1023_bytes_hi; | ||
734 | u32 tx_packets_1024_to_1518_bytes_lo; | ||
735 | u32 tx_packets_1024_to_1518_bytes_hi; | ||
736 | u32 tx_packets_1519_to_2047_bytes_lo; | ||
737 | u32 tx_packets_1519_to_2047_bytes_hi; | ||
738 | u32 tx_packets_2048_to_4095_bytes_lo; | ||
739 | u32 tx_packets_2048_to_4095_bytes_hi; | ||
740 | u32 tx_packets_4096_to_8191_bytes_lo; | ||
741 | u32 tx_packets_4096_to_8191_bytes_hi; | ||
742 | u32 tx_packets_8192_to_9216_bytes_lo; | ||
743 | u32 tx_packets_8192_to_9216_bytes_hi; | ||
744 | u32 tx_lso_packets_lo; | ||
745 | u32 tx_lso_packets_hi; | ||
746 | u32 rx_packets_lo; | ||
747 | u32 rx_packets_hi; | ||
748 | u32 rx_unicast_packets_lo; | ||
749 | u32 rx_unicast_packets_hi; | ||
750 | u32 rx_multicast_packets_lo; | ||
751 | u32 rx_multicast_packets_hi; | ||
752 | u32 rx_broadcast_packets_lo; | ||
753 | u32 rx_broadcast_packets_hi; | ||
754 | u32 rx_bytes_lo; | ||
755 | u32 rx_bytes_hi; | ||
756 | u32 rx_unicast_bytes_lo; | ||
757 | u32 rx_unicast_bytes_hi; | ||
758 | u32 rx_multicast_bytes_lo; | ||
759 | u32 rx_multicast_bytes_hi; | ||
760 | u32 rx_broadcast_bytes_lo; | ||
761 | u32 rx_broadcast_bytes_hi; | ||
762 | u32 rx_unknown_protos; | ||
763 | u32 rsvd_69; /* Word 69 is reserved */ | ||
764 | u32 rx_discards_lo; | ||
765 | u32 rx_discards_hi; | ||
766 | u32 rx_errors_lo; | ||
767 | u32 rx_errors_hi; | ||
768 | u32 rx_crc_errors_lo; | ||
769 | u32 rx_crc_errors_hi; | ||
770 | u32 rx_alignment_errors_lo; | ||
771 | u32 rx_alignment_errors_hi; | ||
772 | u32 rx_symbol_errors_lo; | ||
773 | u32 rx_symbol_errors_hi; | ||
774 | u32 rx_pause_frames_lo; | ||
775 | u32 rx_pause_frames_hi; | ||
776 | u32 rx_pause_on_frames_lo; | ||
777 | u32 rx_pause_on_frames_hi; | ||
778 | u32 rx_pause_off_frames_lo; | ||
779 | u32 rx_pause_off_frames_hi; | ||
780 | u32 rx_frames_too_long_lo; | ||
781 | u32 rx_frames_too_long_hi; | ||
782 | u32 rx_internal_mac_errors_lo; | ||
783 | u32 rx_internal_mac_errors_hi; | ||
784 | u32 rx_undersize_packets; | ||
785 | u32 rx_oversize_packets; | ||
786 | u32 rx_fragment_packets; | ||
787 | u32 rx_jabbers; | ||
788 | u32 rx_control_frames_lo; | ||
789 | u32 rx_control_frames_hi; | ||
790 | u32 rx_control_frames_unknown_opcode_lo; | ||
791 | u32 rx_control_frames_unknown_opcode_hi; | ||
792 | u32 rx_in_range_errors; | ||
793 | u32 rx_out_of_range_errors; | ||
794 | u32 rx_address_match_errors; | ||
795 | u32 rx_vlan_mismatch_errors; | ||
796 | u32 rx_dropped_too_small; | ||
797 | u32 rx_dropped_too_short; | ||
798 | u32 rx_dropped_header_too_small; | ||
799 | u32 rx_dropped_invalid_tcp_length; | ||
800 | u32 rx_dropped_runt; | ||
801 | u32 rx_ip_checksum_errors; | ||
802 | u32 rx_tcp_checksum_errors; | ||
803 | u32 rx_udp_checksum_errors; | ||
804 | u32 rx_non_rss_packets; | ||
805 | u32 rsvd_111; | ||
806 | u32 rx_ipv4_packets_lo; | ||
807 | u32 rx_ipv4_packets_hi; | ||
808 | u32 rx_ipv6_packets_lo; | ||
809 | u32 rx_ipv6_packets_hi; | ||
810 | u32 rx_ipv4_bytes_lo; | ||
811 | u32 rx_ipv4_bytes_hi; | ||
812 | u32 rx_ipv6_bytes_lo; | ||
813 | u32 rx_ipv6_bytes_hi; | ||
814 | u32 rx_nic_packets_lo; | ||
815 | u32 rx_nic_packets_hi; | ||
816 | u32 rx_tcp_packets_lo; | ||
817 | u32 rx_tcp_packets_hi; | ||
818 | u32 rx_iscsi_packets_lo; | ||
819 | u32 rx_iscsi_packets_hi; | ||
820 | u32 rx_management_packets_lo; | ||
821 | u32 rx_management_packets_hi; | ||
822 | u32 rx_switched_unicast_packets_lo; | ||
823 | u32 rx_switched_unicast_packets_hi; | ||
824 | u32 rx_switched_multicast_packets_lo; | ||
825 | u32 rx_switched_multicast_packets_hi; | ||
826 | u32 rx_switched_broadcast_packets_lo; | ||
827 | u32 rx_switched_broadcast_packets_hi; | ||
828 | u32 num_forwards_lo; | ||
829 | u32 num_forwards_hi; | ||
830 | u32 rx_fifo_overflow; | ||
831 | u32 rx_input_fifo_overflow; | ||
832 | u32 rx_drops_too_many_frags_lo; | ||
833 | u32 rx_drops_too_many_frags_hi; | ||
834 | u32 rx_drops_invalid_queue; | ||
835 | u32 rsvd_141; | ||
836 | u32 rx_drops_mtu_lo; | ||
837 | u32 rx_drops_mtu_hi; | ||
838 | u32 rx_packets_64_bytes_lo; | ||
839 | u32 rx_packets_64_bytes_hi; | ||
840 | u32 rx_packets_65_to_127_bytes_lo; | ||
841 | u32 rx_packets_65_to_127_bytes_hi; | ||
842 | u32 rx_packets_128_to_255_bytes_lo; | ||
843 | u32 rx_packets_128_to_255_bytes_hi; | ||
844 | u32 rx_packets_256_to_511_bytes_lo; | ||
845 | u32 rx_packets_256_to_511_bytes_hi; | ||
846 | u32 rx_packets_512_to_1023_bytes_lo; | ||
847 | u32 rx_packets_512_to_1023_bytes_hi; | ||
848 | u32 rx_packets_1024_to_1518_bytes_lo; | ||
849 | u32 rx_packets_1024_to_1518_bytes_hi; | ||
850 | u32 rx_packets_1519_to_2047_bytes_lo; | ||
851 | u32 rx_packets_1519_to_2047_bytes_hi; | ||
852 | u32 rx_packets_2048_to_4095_bytes_lo; | ||
853 | u32 rx_packets_2048_to_4095_bytes_hi; | ||
854 | u32 rx_packets_4096_to_8191_bytes_lo; | ||
855 | u32 rx_packets_4096_to_8191_bytes_hi; | ||
856 | u32 rx_packets_8192_to_9216_bytes_lo; | ||
857 | u32 rx_packets_8192_to_9216_bytes_hi; | ||
858 | }; | ||
859 | |||
860 | struct pport_stats_params { | ||
861 | u16 pport_num; | ||
862 | u8 rsvd; | ||
863 | u8 reset_stats; | ||
864 | }; | ||
865 | |||
866 | struct lancer_cmd_req_pport_stats { | ||
867 | struct be_cmd_req_hdr hdr; | ||
868 | union { | ||
869 | struct pport_stats_params params; | ||
870 | u8 rsvd[sizeof(struct lancer_cmd_pport_stats)]; | ||
871 | } cmd_params; | ||
872 | }; | ||
873 | |||
874 | struct lancer_cmd_resp_pport_stats { | ||
875 | struct be_cmd_resp_hdr hdr; | ||
876 | struct lancer_cmd_pport_stats pport_stats; | ||
877 | }; | ||
878 | |||
879 | static inline struct lancer_cmd_pport_stats* | ||
880 | pport_stats_from_cmd(struct be_adapter *adapter) | ||
881 | { | ||
882 | struct lancer_cmd_resp_pport_stats *cmd = adapter->stats_cmd.va; | ||
883 | return &cmd->pport_stats; | ||
884 | } | ||
885 | |||
691 | struct be_cmd_req_get_cntl_addnl_attribs { | 886 | struct be_cmd_req_get_cntl_addnl_attribs { |
692 | struct be_cmd_req_hdr hdr; | 887 | struct be_cmd_req_hdr hdr; |
693 | u8 rsvd[8]; | 888 | u8 rsvd[8]; |
@@ -1258,6 +1453,8 @@ extern int be_cmd_link_status_query(struct be_adapter *adapter, | |||
1258 | extern int be_cmd_reset(struct be_adapter *adapter); | 1453 | extern int be_cmd_reset(struct be_adapter *adapter); |
1259 | extern int be_cmd_get_stats(struct be_adapter *adapter, | 1454 | extern int be_cmd_get_stats(struct be_adapter *adapter, |
1260 | struct be_dma_mem *nonemb_cmd); | 1455 | struct be_dma_mem *nonemb_cmd); |
1456 | extern int lancer_cmd_get_pport_stats(struct be_adapter *adapter, | ||
1457 | struct be_dma_mem *nonemb_cmd); | ||
1261 | extern int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver); | 1458 | extern int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver); |
1262 | 1459 | ||
1263 | extern int be_cmd_modify_eqd(struct be_adapter *adapter, u32 eq_id, u32 eqd); | 1460 | extern int be_cmd_modify_eqd(struct be_adapter *adapter, u32 eq_id, u32 eqd); |
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index cff2cca3087d..93be84ce9bad 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
@@ -351,14 +351,73 @@ static void populate_be3_stats(struct be_adapter *adapter) | |||
351 | adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops; | 351 | adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops; |
352 | } | 352 | } |
353 | 353 | ||
354 | static void populate_lancer_stats(struct be_adapter *adapter) | ||
355 | { | ||
354 | 356 | ||
357 | struct be_drv_stats *drvs = &adapter->drv_stats; | ||
358 | struct lancer_cmd_pport_stats *pport_stats = pport_stats_from_cmd | ||
359 | (adapter); | ||
360 | drvs->rx_priority_pause_frames = 0; | ||
361 | drvs->pmem_fifo_overflow_drop = 0; | ||
362 | drvs->rx_pause_frames = | ||
363 | make_64bit_val(pport_stats->rx_pause_frames_lo, | ||
364 | pport_stats->rx_pause_frames_hi); | ||
365 | drvs->rx_crc_errors = make_64bit_val(pport_stats->rx_crc_errors_hi, | ||
366 | pport_stats->rx_crc_errors_lo); | ||
367 | drvs->rx_control_frames = | ||
368 | make_64bit_val(pport_stats->rx_control_frames_hi, | ||
369 | pport_stats->rx_control_frames_lo); | ||
370 | drvs->rx_in_range_errors = pport_stats->rx_in_range_errors; | ||
371 | drvs->rx_frame_too_long = | ||
372 | make_64bit_val(pport_stats->rx_internal_mac_errors_hi, | ||
373 | pport_stats->rx_frames_too_long_lo); | ||
374 | drvs->rx_dropped_runt = pport_stats->rx_dropped_runt; | ||
375 | drvs->rx_ip_checksum_errs = pport_stats->rx_ip_checksum_errors; | ||
376 | drvs->rx_tcp_checksum_errs = pport_stats->rx_tcp_checksum_errors; | ||
377 | drvs->rx_udp_checksum_errs = pport_stats->rx_udp_checksum_errors; | ||
378 | drvs->rx_dropped_tcp_length = | ||
379 | pport_stats->rx_dropped_invalid_tcp_length; | ||
380 | drvs->rx_dropped_too_small = pport_stats->rx_dropped_too_small; | ||
381 | drvs->rx_dropped_too_short = pport_stats->rx_dropped_too_short; | ||
382 | drvs->rx_out_range_errors = pport_stats->rx_out_of_range_errors; | ||
383 | drvs->rx_dropped_header_too_small = | ||
384 | pport_stats->rx_dropped_header_too_small; | ||
385 | drvs->rx_input_fifo_overflow_drop = pport_stats->rx_fifo_overflow; | ||
386 | drvs->rx_address_match_errors = pport_stats->rx_address_match_errors; | ||
387 | drvs->rx_alignment_symbol_errors = | ||
388 | make_64bit_val(pport_stats->rx_symbol_errors_hi, | ||
389 | pport_stats->rx_symbol_errors_lo); | ||
390 | drvs->rxpp_fifo_overflow_drop = pport_stats->rx_fifo_overflow; | ||
391 | drvs->tx_pauseframes = make_64bit_val(pport_stats->tx_pause_frames_hi, | ||
392 | pport_stats->tx_pause_frames_lo); | ||
393 | drvs->tx_controlframes = | ||
394 | make_64bit_val(pport_stats->tx_control_frames_hi, | ||
395 | pport_stats->tx_control_frames_lo); | ||
396 | drvs->jabber_events = pport_stats->rx_jabbers; | ||
397 | drvs->rx_drops_no_pbuf = 0; | ||
398 | drvs->rx_drops_no_txpb = 0; | ||
399 | drvs->rx_drops_no_erx_descr = 0; | ||
400 | drvs->rx_drops_invalid_ring = pport_stats->rx_drops_invalid_queue; | ||
401 | drvs->forwarded_packets = make_64bit_val(pport_stats->num_forwards_hi, | ||
402 | pport_stats->num_forwards_lo); | ||
403 | drvs->rx_drops_mtu = make_64bit_val(pport_stats->rx_drops_mtu_hi, | ||
404 | pport_stats->rx_drops_mtu_lo); | ||
405 | drvs->rx_drops_no_tpre_descr = 0; | ||
406 | drvs->rx_drops_too_many_frags = | ||
407 | make_64bit_val(pport_stats->rx_drops_too_many_frags_hi, | ||
408 | pport_stats->rx_drops_too_many_frags_lo); | ||
409 | } | ||
355 | 410 | ||
356 | void be_parse_stats(struct be_adapter *adapter) | 411 | void be_parse_stats(struct be_adapter *adapter) |
357 | { | 412 | { |
358 | if (adapter->generation == BE_GEN3) | 413 | if (adapter->generation == BE_GEN3) { |
359 | populate_be3_stats(adapter); | 414 | if (lancer_chip(adapter)) |
360 | else | 415 | populate_lancer_stats(adapter); |
416 | else | ||
417 | populate_be3_stats(adapter); | ||
418 | } else { | ||
361 | populate_be2_stats(adapter); | 419 | populate_be2_stats(adapter); |
420 | } | ||
362 | } | 421 | } |
363 | 422 | ||
364 | void netdev_stats_update(struct be_adapter *adapter) | 423 | void netdev_stats_update(struct be_adapter *adapter) |
@@ -375,10 +434,12 @@ void netdev_stats_update(struct be_adapter *adapter) | |||
375 | dev_stats->multicast += rx_stats(rxo)->rx_mcast_pkts; | 434 | dev_stats->multicast += rx_stats(rxo)->rx_mcast_pkts; |
376 | /* no space in linux buffers: best possible approximation */ | 435 | /* no space in linux buffers: best possible approximation */ |
377 | if (adapter->generation == BE_GEN3) { | 436 | if (adapter->generation == BE_GEN3) { |
378 | struct be_erx_stats_v1 *erx_stats = | 437 | if (!(lancer_chip(adapter))) { |
438 | struct be_erx_stats_v1 *erx_stats = | ||
379 | be_erx_stats_from_cmd(adapter); | 439 | be_erx_stats_from_cmd(adapter); |
380 | dev_stats->rx_dropped += | 440 | dev_stats->rx_dropped += |
381 | erx_stats->rx_drops_no_fragments[rxo->q.id]; | 441 | erx_stats->rx_drops_no_fragments[rxo->q.id]; |
442 | } | ||
382 | } else { | 443 | } else { |
383 | struct be_erx_stats_v0 *erx_stats = | 444 | struct be_erx_stats_v0 *erx_stats = |
384 | be_erx_stats_from_cmd(adapter); | 445 | be_erx_stats_from_cmd(adapter); |
@@ -2022,9 +2083,13 @@ static void be_worker(struct work_struct *work) | |||
2022 | goto reschedule; | 2083 | goto reschedule; |
2023 | } | 2084 | } |
2024 | 2085 | ||
2025 | if (!adapter->stats_cmd_sent) | 2086 | if (!adapter->stats_cmd_sent) { |
2026 | be_cmd_get_stats(adapter, &adapter->stats_cmd); | 2087 | if (lancer_chip(adapter)) |
2027 | 2088 | lancer_cmd_get_pport_stats(adapter, | |
2089 | &adapter->stats_cmd); | ||
2090 | else | ||
2091 | be_cmd_get_stats(adapter, &adapter->stats_cmd); | ||
2092 | } | ||
2028 | be_tx_rate_update(adapter); | 2093 | be_tx_rate_update(adapter); |
2029 | 2094 | ||
2030 | for_all_rx_queues(adapter, rxo, i) { | 2095 | for_all_rx_queues(adapter, rxo, i) { |
@@ -2944,10 +3009,14 @@ static int be_stats_init(struct be_adapter *adapter) | |||
2944 | { | 3009 | { |
2945 | struct be_dma_mem *cmd = &adapter->stats_cmd; | 3010 | struct be_dma_mem *cmd = &adapter->stats_cmd; |
2946 | 3011 | ||
2947 | if (adapter->generation == BE_GEN2) | 3012 | if (adapter->generation == BE_GEN2) { |
2948 | cmd->size = sizeof(struct be_cmd_req_get_stats_v0); | 3013 | cmd->size = sizeof(struct be_cmd_req_get_stats_v0); |
2949 | else | 3014 | } else { |
2950 | cmd->size = sizeof(struct be_cmd_req_get_stats_v1); | 3015 | if (lancer_chip(adapter)) |
3016 | cmd->size = sizeof(struct lancer_cmd_req_pport_stats); | ||
3017 | else | ||
3018 | cmd->size = sizeof(struct be_cmd_req_get_stats_v1); | ||
3019 | } | ||
2951 | cmd->va = dma_alloc_coherent(&adapter->pdev->dev, cmd->size, &cmd->dma, | 3020 | cmd->va = dma_alloc_coherent(&adapter->pdev->dev, cmd->size, &cmd->dma, |
2952 | GFP_KERNEL); | 3021 | GFP_KERNEL); |
2953 | if (cmd->va == NULL) | 3022 | if (cmd->va == NULL) |