summaryrefslogtreecommitdiffstats
path: root/drivers/net/benet
diff options
context:
space:
mode:
authorSelvin Xavier <selvin.xavier@emulex.com>2011-05-16 03:36:35 -0400
committerDavid S. Miller <davem@davemloft.net>2011-05-16 14:13:53 -0400
commit005d569600b404cae0b356e3c4085290ecc17775 (patch)
treeb8c69da965d0588e5cc73f9cd716eabbe90f1899 /drivers/net/benet
parent89a88ab84b946a90839fb66ca3583a2504c11292 (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.h74
-rw-r--r--drivers/net/benet/be_cmds.c55
-rw-r--r--drivers/net/benet/be_cmds.h197
-rw-r--r--drivers/net/benet/be_main.c91
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
245struct be_drv_stats { 245struct 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
286struct be_vf_cfg { 286struct 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 */
1136int 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
1173err:
1174 spin_unlock_bh(&adapter->mcc_lock);
1175 return status;
1176}
1177
1127/* Uses synchronous mcc */ 1178/* Uses synchronous mcc */
1128int be_cmd_link_status_query(struct be_adapter *adapter, 1179int 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)
693struct 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
860struct pport_stats_params {
861 u16 pport_num;
862 u8 rsvd;
863 u8 reset_stats;
864};
865
866struct 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
874struct lancer_cmd_resp_pport_stats {
875 struct be_cmd_resp_hdr hdr;
876 struct lancer_cmd_pport_stats pport_stats;
877};
878
879static 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
691struct be_cmd_req_get_cntl_addnl_attribs { 886struct 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,
1258extern int be_cmd_reset(struct be_adapter *adapter); 1453extern int be_cmd_reset(struct be_adapter *adapter);
1259extern int be_cmd_get_stats(struct be_adapter *adapter, 1454extern int be_cmd_get_stats(struct be_adapter *adapter,
1260 struct be_dma_mem *nonemb_cmd); 1455 struct be_dma_mem *nonemb_cmd);
1456extern int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
1457 struct be_dma_mem *nonemb_cmd);
1261extern int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver); 1458extern int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver);
1262 1459
1263extern int be_cmd_modify_eqd(struct be_adapter *adapter, u32 eq_id, u32 eqd); 1460extern 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
354static 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
356void be_parse_stats(struct be_adapter *adapter) 411void 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
364void netdev_stats_update(struct be_adapter *adapter) 423void 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)