1 /* SPDX-License-Identifier: BSD-3-Clause
3 * Copyright (c) 2009-2018 Solarflare Communications Inc.
13 #if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM
15 static __checkReturn efx_rc_t
16 siena_nic_get_partn_mask(
18 __out unsigned int *maskp)
21 EFX_MCDI_DECLARE_BUF(payload, MC_CMD_NVRAM_TYPES_IN_LEN,
22 MC_CMD_NVRAM_TYPES_OUT_LEN);
25 req.emr_cmd = MC_CMD_NVRAM_TYPES;
26 req.emr_in_buf = payload;
27 req.emr_in_length = MC_CMD_NVRAM_TYPES_IN_LEN;
28 req.emr_out_buf = payload;
29 req.emr_out_length = MC_CMD_NVRAM_TYPES_OUT_LEN;
31 efx_mcdi_execute(enp, &req);
33 if (req.emr_rc != 0) {
38 if (req.emr_out_length_used < MC_CMD_NVRAM_TYPES_OUT_LEN) {
43 *maskp = MCDI_OUT_DWORD(req, NVRAM_TYPES_OUT_TYPES);
50 EFSYS_PROBE1(fail1, efx_rc_t, rc);
55 #endif /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */
57 static __checkReturn efx_rc_t
61 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
63 efx_dword_t capabilities;
65 uint32_t nevq, nrxq, ntxq;
68 /* Siena has a fixed 8Kbyte VI window size */
69 EFX_STATIC_ASSERT(1U << EFX_VI_WINDOW_SHIFT_8K == 8192);
70 encp->enc_vi_window_shift = EFX_VI_WINDOW_SHIFT_8K;
72 /* External port identifier using one-based port numbering */
73 encp->enc_external_port = (uint8_t)enp->en_mcdi.em_emip.emi_port;
75 /* Board configuration */
76 if ((rc = efx_mcdi_get_board_cfg(enp, &board_type,
77 &capabilities, mac_addr)) != 0)
80 EFX_MAC_ADDR_COPY(encp->enc_mac_addr, mac_addr);
82 encp->enc_board_type = board_type;
85 * There is no possibility to determine the number of PFs on Siena
86 * by issuing MCDI request, and it is not an easy task to find the
87 * value based on the board type, so 'enc_hw_pf_count' is set to 1
89 encp->enc_hw_pf_count = 1;
91 /* Additional capabilities */
92 encp->enc_clk_mult = 1;
93 if (EFX_DWORD_FIELD(capabilities, MC_CMD_CAPABILITIES_TURBO)) {
94 enp->en_features |= EFX_FEATURE_TURBO;
96 if (EFX_DWORD_FIELD(capabilities,
97 MC_CMD_CAPABILITIES_TURBO_ACTIVE)) {
98 encp->enc_clk_mult = 2;
102 encp->enc_evq_timer_quantum_ns =
103 EFX_EVQ_SIENA_TIMER_QUANTUM_NS / encp->enc_clk_mult;
104 encp->enc_evq_timer_max_us = (encp->enc_evq_timer_quantum_ns <<
105 FRF_CZ_TC_TIMER_VAL_WIDTH) / 1000;
107 /* When hash header insertion is enabled, Siena inserts 16 bytes */
108 encp->enc_rx_prefix_size = 16;
110 /* Alignment for receive packet DMA buffers */
111 encp->enc_rx_buf_align_start = 1;
112 encp->enc_rx_buf_align_end = 1;
114 /* Alignment for WPTR updates */
115 encp->enc_rx_push_align = 1;
117 #if EFSYS_OPT_RX_SCALE
118 /* There is one RSS context per function */
119 encp->enc_rx_scale_max_exclusive_contexts = 1;
121 encp->enc_rx_scale_hash_alg_mask |= (1U << EFX_RX_HASHALG_LFSR);
122 encp->enc_rx_scale_hash_alg_mask |= (1U << EFX_RX_HASHALG_TOEPLITZ);
125 * It is always possible to use port numbers
126 * as the input data for hash computation.
128 encp->enc_rx_scale_l4_hash_supported = B_TRUE;
130 /* There is no support for additional RSS modes */
131 encp->enc_rx_scale_additional_modes_supported = B_FALSE;
132 #endif /* EFSYS_OPT_RX_SCALE */
134 encp->enc_tx_dma_desc_size_max = EFX_MASK32(FSF_AZ_TX_KER_BYTE_COUNT);
135 /* Fragments must not span 4k boundaries. */
136 encp->enc_tx_dma_desc_boundary = 4096;
138 /* Resource limits */
139 rc = efx_mcdi_get_resource_limits(enp, &nevq, &nrxq, &ntxq);
145 nrxq = EFX_RXQ_LIMIT_TARGET;
146 ntxq = EFX_TXQ_LIMIT_TARGET;
148 encp->enc_evq_limit = nevq;
149 encp->enc_rxq_limit = MIN(EFX_RXQ_LIMIT_TARGET, nrxq);
150 encp->enc_txq_limit = MIN(EFX_TXQ_LIMIT_TARGET, ntxq);
152 encp->enc_evq_max_nevs = SIENA_EVQ_MAXNEVS;
153 encp->enc_evq_min_nevs = SIENA_EVQ_MINNEVS;
155 encp->enc_rxq_max_ndescs = EF10_RXQ_MAXNDESCS;
156 encp->enc_rxq_min_ndescs = EF10_RXQ_MINNDESCS;
158 encp->enc_txq_max_ndescs = SIENA_TXQ_MAXNDESCS;
159 encp->enc_txq_min_ndescs = SIENA_TXQ_MINNDESCS;
161 encp->enc_buftbl_limit = SIENA_SRAM_ROWS -
162 (encp->enc_txq_limit * EFX_TXQ_DC_NDESCS(EFX_TXQ_DC_SIZE)) -
163 (encp->enc_rxq_limit * EFX_RXQ_DC_NDESCS(EFX_RXQ_DC_SIZE));
165 encp->enc_hw_tx_insert_vlan_enabled = B_FALSE;
166 encp->enc_fw_assisted_tso_enabled = B_FALSE;
167 encp->enc_fw_assisted_tso_v2_enabled = B_FALSE;
168 encp->enc_fw_assisted_tso_v2_n_contexts = 0;
169 encp->enc_allow_set_mac_with_installed_filters = B_TRUE;
170 encp->enc_rx_packed_stream_supported = B_FALSE;
171 encp->enc_rx_var_packed_stream_supported = B_FALSE;
172 encp->enc_rx_es_super_buffer_supported = B_FALSE;
173 encp->enc_fw_subvariant_no_tx_csum_supported = B_FALSE;
175 /* Siena supports two 10G ports, and 8 lanes of PCIe Gen2 */
176 encp->enc_required_pcie_bandwidth_mbps = 2 * 10000;
177 encp->enc_max_pcie_link_gen = EFX_PCIE_LINK_SPEED_GEN2;
179 encp->enc_nvram_update_verify_result_supported = B_FALSE;
181 encp->enc_mac_stats_nstats = MC_CMD_MAC_NSTATS;
183 encp->enc_filter_action_flag_supported = B_FALSE;
184 encp->enc_filter_action_mark_supported = B_FALSE;
185 encp->enc_filter_action_mark_max = 0;
192 EFSYS_PROBE1(fail1, efx_rc_t, rc);
197 static __checkReturn efx_rc_t
201 #if EFSYS_OPT_PHY_STATS
202 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
203 #endif /* EFSYS_OPT_PHY_STATS */
206 /* Fill out fields in enp->en_port and enp->en_nic_cfg from MCDI */
207 if ((rc = efx_mcdi_get_phy_cfg(enp)) != 0)
210 #if EFSYS_OPT_PHY_STATS
211 /* Convert the MCDI statistic mask into the EFX_PHY_STAT mask */
212 siena_phy_decode_stats(enp, encp->enc_mcdi_phy_stat_mask,
213 NULL, &encp->enc_phy_stat_mask, NULL);
214 #endif /* EFSYS_OPT_PHY_STATS */
219 EFSYS_PROBE1(fail1, efx_rc_t, rc);
224 #define SIENA_BIU_MAGIC0 0x01234567
225 #define SIENA_BIU_MAGIC1 0xfedcba98
227 static __checkReturn efx_rc_t
235 * Write magic values to scratch registers 0 and 1, then
236 * verify that the values were written correctly. Interleave
237 * the accesses to ensure that the BIU is not just reading
238 * back the cached value that was last written.
240 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, SIENA_BIU_MAGIC0);
241 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
243 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, SIENA_BIU_MAGIC1);
244 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
246 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
247 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != SIENA_BIU_MAGIC0) {
252 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
253 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != SIENA_BIU_MAGIC1) {
259 * Perform the same test, with the values swapped. This
260 * ensures that subsequent tests don't start with the correct
261 * values already written into the scratch registers.
263 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, SIENA_BIU_MAGIC1);
264 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
266 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, SIENA_BIU_MAGIC0);
267 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
269 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
270 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != SIENA_BIU_MAGIC1) {
275 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
276 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != SIENA_BIU_MAGIC0) {
290 EFSYS_PROBE1(fail1, efx_rc_t, rc);
295 __checkReturn efx_rc_t
299 efx_port_t *epp = &(enp->en_port);
300 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
301 siena_link_state_t sls;
306 EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_SIENA);
309 if ((rc = siena_nic_biu_test(enp)) != 0)
312 /* Clear the region register */
313 EFX_POPULATE_OWORD_4(oword,
314 FRF_AZ_ADR_REGION0, 0,
315 FRF_AZ_ADR_REGION1, (1 << 16),
316 FRF_AZ_ADR_REGION2, (2 << 16),
317 FRF_AZ_ADR_REGION3, (3 << 16));
318 EFX_BAR_WRITEO(enp, FR_AZ_ADR_REGION_REG, &oword);
320 /* Read clear any assertion state */
321 if ((rc = efx_mcdi_read_assertion(enp)) != 0)
324 /* Exit the assertion handler */
325 if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
328 /* Wrestle control from the BMC */
329 if ((rc = efx_mcdi_drv_attach(enp, B_TRUE)) != 0)
332 if ((rc = siena_board_cfg(enp)) != 0)
335 if ((rc = siena_phy_cfg(enp)) != 0)
338 /* Obtain the default PHY advertised capabilities */
339 if ((rc = siena_nic_reset(enp)) != 0)
341 if ((rc = siena_phy_get_link(enp, &sls)) != 0)
343 epp->ep_default_adv_cap_mask = sls.sls_adv_cap_mask;
344 epp->ep_adv_cap_mask = sls.sls_adv_cap_mask;
346 #if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM
347 if ((rc = siena_nic_get_partn_mask(enp, &mask)) != 0)
349 enp->en_u.siena.enu_partn_mask = mask;
352 #if EFSYS_OPT_MAC_STATS
353 /* Wipe the MAC statistics */
354 if ((rc = efx_mcdi_mac_stats_clear(enp)) != 0)
358 #if EFSYS_OPT_LOOPBACK
359 if ((rc = efx_mcdi_get_loopback_modes(enp)) != 0)
363 #if EFSYS_OPT_MON_STATS
364 if ((rc = mcdi_mon_cfg_build(enp)) != 0)
368 encp->enc_features = enp->en_features;
372 #if EFSYS_OPT_MON_STATS
376 #if EFSYS_OPT_LOOPBACK
380 #if EFSYS_OPT_MAC_STATS
384 #if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM
403 EFSYS_PROBE1(fail1, efx_rc_t, rc);
408 __checkReturn efx_rc_t
415 EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_SIENA);
417 /* siena_nic_reset() is called to recover from BADASSERT failures. */
418 if ((rc = efx_mcdi_read_assertion(enp)) != 0)
420 if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
424 * Bug24908: ENTITY_RESET_IN_LEN is non zero but zero may be supplied
425 * for backwards compatibility with PORT_RESET_IN_LEN.
427 EFX_STATIC_ASSERT(MC_CMD_ENTITY_RESET_OUT_LEN == 0);
429 req.emr_cmd = MC_CMD_ENTITY_RESET;
430 req.emr_in_buf = NULL;
431 req.emr_in_length = 0;
432 req.emr_out_buf = NULL;
433 req.emr_out_length = 0;
435 efx_mcdi_execute(enp, &req);
437 if (req.emr_rc != 0) {
449 EFSYS_PROBE1(fail1, efx_rc_t, rc);
461 * RX_INGR_EN is always enabled on Siena, because we rely on
462 * the RX parser to be resiliant to missing SOP/EOP.
464 EFX_BAR_READO(enp, FR_AZ_RX_CFG_REG, &oword);
465 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_INGR_EN, 1);
466 EFX_BAR_WRITEO(enp, FR_AZ_RX_CFG_REG, &oword);
468 /* Disable parsing of additional 802.1Q in Q packets */
469 EFX_BAR_READO(enp, FR_AZ_RX_FILTER_CTL_REG, &oword);
470 EFX_SET_OWORD_FIELD(oword, FRF_CZ_RX_FILTER_ALL_VLAN_ETHERTYPES, 0);
471 EFX_BAR_WRITEO(enp, FR_AZ_RX_FILTER_CTL_REG, &oword);
480 EFX_POPULATE_OWORD_1(oword, FRF_CZ_USREV_DIS, 1);
481 EFX_BAR_WRITEO(enp, FR_CZ_USR_EV_CFG, &oword);
484 __checkReturn efx_rc_t
490 EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_SIENA);
492 /* Enable reporting of some events (e.g. link change) */
493 if ((rc = efx_mcdi_log_ctrl(enp)) != 0)
496 siena_sram_init(enp);
498 /* Configure Siena's RX block */
499 siena_nic_rx_cfg(enp);
501 /* Disable USR_EVents for now */
502 siena_nic_usrev_dis(enp);
504 /* bug17057: Ensure set_link is called */
505 if ((rc = siena_phy_reconfigure(enp)) != 0)
508 enp->en_nic_cfg.enc_mcdi_max_payload_length = MCDI_CTL_SDU_LEN_MAX_V1;
515 EFSYS_PROBE1(fail1, efx_rc_t, rc);
524 _NOTE(ARGUNUSED(enp))
531 #if EFSYS_OPT_MON_STATS
532 mcdi_mon_cfg_free(enp);
533 #endif /* EFSYS_OPT_MON_STATS */
534 (void) efx_mcdi_drv_attach(enp, B_FALSE);
539 static siena_register_set_t __siena_registers[] = {
540 { FR_AZ_ADR_REGION_REG_OFST, 0, 1 },
541 { FR_CZ_USR_EV_CFG_OFST, 0, 1 },
542 { FR_AZ_RX_CFG_REG_OFST, 0, 1 },
543 { FR_AZ_TX_CFG_REG_OFST, 0, 1 },
544 { FR_AZ_TX_RESERVED_REG_OFST, 0, 1 },
545 { FR_AZ_SRM_TX_DC_CFG_REG_OFST, 0, 1 },
546 { FR_AZ_RX_DC_CFG_REG_OFST, 0, 1 },
547 { FR_AZ_RX_DC_PF_WM_REG_OFST, 0, 1 },
548 { FR_AZ_DP_CTRL_REG_OFST, 0, 1 },
549 { FR_BZ_RX_RSS_TKEY_REG_OFST, 0, 1},
550 { FR_CZ_RX_RSS_IPV6_REG1_OFST, 0, 1},
551 { FR_CZ_RX_RSS_IPV6_REG2_OFST, 0, 1},
552 { FR_CZ_RX_RSS_IPV6_REG3_OFST, 0, 1}
555 static const uint32_t __siena_register_masks[] = {
556 0x0003FFFF, 0x0003FFFF, 0x0003FFFF, 0x0003FFFF,
557 0x000103FF, 0x00000000, 0x00000000, 0x00000000,
558 0xFFFFFFFE, 0xFFFFFFFF, 0x0003FFFF, 0x00000000,
559 0x7FFF0037, 0xFFFF8000, 0xFFFFFFFF, 0x03FFFFFF,
560 0xFFFEFE80, 0x1FFFFFFF, 0x020000FE, 0x007FFFFF,
561 0x001FFFFF, 0x00000000, 0x00000000, 0x00000000,
562 0x00000003, 0x00000000, 0x00000000, 0x00000000,
563 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
564 0x00000FFF, 0x00000000, 0x00000000, 0x00000000,
565 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
566 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
567 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
568 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007, 0x00000000
571 static siena_register_set_t __siena_tables[] = {
572 { FR_AZ_RX_FILTER_TBL0_OFST, FR_AZ_RX_FILTER_TBL0_STEP,
573 FR_AZ_RX_FILTER_TBL0_ROWS },
574 { FR_CZ_RX_MAC_FILTER_TBL0_OFST, FR_CZ_RX_MAC_FILTER_TBL0_STEP,
575 FR_CZ_RX_MAC_FILTER_TBL0_ROWS },
576 { FR_AZ_RX_DESC_PTR_TBL_OFST,
577 FR_AZ_RX_DESC_PTR_TBL_STEP, FR_CZ_RX_DESC_PTR_TBL_ROWS },
578 { FR_AZ_TX_DESC_PTR_TBL_OFST,
579 FR_AZ_TX_DESC_PTR_TBL_STEP, FR_CZ_TX_DESC_PTR_TBL_ROWS },
580 { FR_AZ_TIMER_TBL_OFST, FR_AZ_TIMER_TBL_STEP, FR_CZ_TIMER_TBL_ROWS },
581 { FR_CZ_TX_FILTER_TBL0_OFST,
582 FR_CZ_TX_FILTER_TBL0_STEP, FR_CZ_TX_FILTER_TBL0_ROWS },
583 { FR_CZ_TX_MAC_FILTER_TBL0_OFST,
584 FR_CZ_TX_MAC_FILTER_TBL0_STEP, FR_CZ_TX_MAC_FILTER_TBL0_ROWS }
587 static const uint32_t __siena_table_masks[] = {
588 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF,
589 0xFFFF0FFF, 0xFFFFFFFF, 0x00000E7F, 0x00000000,
590 0xFFFFFFFE, 0x0FFFFFFF, 0x01800000, 0x00000000,
591 0xFFFFFFFE, 0x0FFFFFFF, 0x0C000000, 0x00000000,
592 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
593 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000013FF,
594 0xFFFF07FF, 0xFFFFFFFF, 0x0000007F, 0x00000000,
597 __checkReturn efx_rc_t
598 siena_nic_test_registers(
600 __in siena_register_set_t *rsp,
604 efx_oword_t original;
610 /* This function is only suitable for registers */
611 EFSYS_ASSERT(rsp->rows == 1);
613 /* bit sweep on and off */
614 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &original,
616 for (bit = 0; bit < 128; bit++) {
617 /* Is this bit in the mask? */
618 if (~(rsp->mask.eo_u32[bit >> 5]) & (1 << bit))
621 /* Test this bit can be set in isolation */
623 EFX_AND_OWORD(reg, rsp->mask);
624 EFX_SET_OWORD_BIT(reg, bit);
626 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, ®,
628 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &buf,
631 EFX_AND_OWORD(buf, rsp->mask);
632 if (memcmp(®, &buf, sizeof (reg))) {
637 /* Test this bit can be cleared in isolation */
638 EFX_OR_OWORD(reg, rsp->mask);
639 EFX_CLEAR_OWORD_BIT(reg, bit);
641 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, ®,
643 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &buf,
646 EFX_AND_OWORD(buf, rsp->mask);
647 if (memcmp(®, &buf, sizeof (reg))) {
653 /* Restore the old value */
654 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, &original,
666 EFSYS_PROBE1(fail1, efx_rc_t, rc);
668 /* Restore the old value */
669 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, &original, B_TRUE);
674 __checkReturn efx_rc_t
675 siena_nic_test_tables(
677 __in siena_register_set_t *rsp,
678 __in efx_pattern_type_t pattern,
681 efx_sram_pattern_fn_t func;
683 unsigned int address;
688 EFSYS_ASSERT(pattern < EFX_PATTERN_NTYPES);
689 func = __efx_sram_pattern_fns[pattern];
693 address = rsp->address;
694 for (index = 0; index < rsp->rows; ++index) {
695 func(2 * index + 0, B_FALSE, ®.eo_qword[0]);
696 func(2 * index + 1, B_FALSE, ®.eo_qword[1]);
697 EFX_AND_OWORD(reg, rsp->mask);
698 EFSYS_BAR_WRITEO(enp->en_esbp, address, ®, B_TRUE);
700 address += rsp->step;
704 address = rsp->address;
705 for (index = 0; index < rsp->rows; ++index) {
706 func(2 * index + 0, B_FALSE, ®.eo_qword[0]);
707 func(2 * index + 1, B_FALSE, ®.eo_qword[1]);
708 EFX_AND_OWORD(reg, rsp->mask);
709 EFSYS_BAR_READO(enp->en_esbp, address, &buf, B_TRUE);
710 if (memcmp(®, &buf, sizeof (reg))) {
715 address += rsp->step;
725 EFSYS_PROBE1(fail1, efx_rc_t, rc);
731 __checkReturn efx_rc_t
732 siena_nic_register_test(
735 siena_register_set_t *rsp;
736 const uint32_t *dwordp;
741 /* Fill out the register mask entries */
742 EFX_STATIC_ASSERT(EFX_ARRAY_SIZE(__siena_register_masks)
743 == EFX_ARRAY_SIZE(__siena_registers) * 4);
745 nitems = EFX_ARRAY_SIZE(__siena_registers);
746 dwordp = __siena_register_masks;
747 for (count = 0; count < nitems; ++count) {
748 rsp = __siena_registers + count;
749 rsp->mask.eo_u32[0] = *dwordp++;
750 rsp->mask.eo_u32[1] = *dwordp++;
751 rsp->mask.eo_u32[2] = *dwordp++;
752 rsp->mask.eo_u32[3] = *dwordp++;
755 /* Fill out the register table entries */
756 EFX_STATIC_ASSERT(EFX_ARRAY_SIZE(__siena_table_masks)
757 == EFX_ARRAY_SIZE(__siena_tables) * 4);
759 nitems = EFX_ARRAY_SIZE(__siena_tables);
760 dwordp = __siena_table_masks;
761 for (count = 0; count < nitems; ++count) {
762 rsp = __siena_tables + count;
763 rsp->mask.eo_u32[0] = *dwordp++;
764 rsp->mask.eo_u32[1] = *dwordp++;
765 rsp->mask.eo_u32[2] = *dwordp++;
766 rsp->mask.eo_u32[3] = *dwordp++;
769 if ((rc = siena_nic_test_registers(enp, __siena_registers,
770 EFX_ARRAY_SIZE(__siena_registers))) != 0)
773 if ((rc = siena_nic_test_tables(enp, __siena_tables,
774 EFX_PATTERN_BYTE_ALTERNATE,
775 EFX_ARRAY_SIZE(__siena_tables))) != 0)
778 if ((rc = siena_nic_test_tables(enp, __siena_tables,
779 EFX_PATTERN_BYTE_CHANGING,
780 EFX_ARRAY_SIZE(__siena_tables))) != 0)
783 if ((rc = siena_nic_test_tables(enp, __siena_tables,
784 EFX_PATTERN_BIT_SWEEP, EFX_ARRAY_SIZE(__siena_tables))) != 0)
796 EFSYS_PROBE1(fail1, efx_rc_t, rc);
801 #endif /* EFSYS_OPT_DIAG */
803 #endif /* EFSYS_OPT_SIENA */