net/sfc: avoid Rx queue setup failure if thresholds are set
[dpdk.git] / drivers / net / sfc / base / ef10_impl.h
index b901ccc..8f9eb7a 100644 (file)
 extern "C" {
 #endif
 
-#if   EFSYS_OPT_HUNTINGTON
+#if (EFSYS_OPT_HUNTINGTON && EFSYS_OPT_MEDFORD)
+#define        EF10_MAX_PIOBUF_NBUFS   MAX(HUNT_PIOBUF_NBUFS, MEDFORD_PIOBUF_NBUFS)
+#elif EFSYS_OPT_HUNTINGTON
 #define        EF10_MAX_PIOBUF_NBUFS   HUNT_PIOBUF_NBUFS
+#elif EFSYS_OPT_MEDFORD
+#define        EF10_MAX_PIOBUF_NBUFS   MEDFORD_PIOBUF_NBUFS
 #endif
 
 /*
@@ -101,6 +105,13 @@ ef10_ev_qmoderate(
        __in            efx_evq_t *eep,
        __in            unsigned int us);
 
+#if EFSYS_OPT_QSTATS
+                       void
+ef10_ev_qstats_update(
+       __in                            efx_evq_t *eep,
+       __inout_ecount(EV_NQSTATS)      efsys_stat_t *stat);
+#endif /* EFSYS_OPT_QSTATS */
+
                void
 ef10_ev_rxlabel_init(
        __in            efx_evq_t *eep,
@@ -188,6 +199,14 @@ extern     __checkReturn   efx_rc_t
 ef10_nic_init(
        __in            efx_nic_t *enp);
 
+#if EFSYS_OPT_DIAG
+
+extern __checkReturn   efx_rc_t
+ef10_nic_register_test(
+       __in            efx_nic_t *enp);
+
+#endif /* EFSYS_OPT_DIAG */
+
 extern                 void
 ef10_nic_fini(
        __in            efx_nic_t *enp);
@@ -240,6 +259,33 @@ extern                     void
 ef10_mac_filter_default_rxq_clear(
        __in            efx_nic_t *enp);
 
+#if EFSYS_OPT_LOOPBACK
+
+extern __checkReturn   efx_rc_t
+ef10_mac_loopback_set(
+       __in            efx_nic_t *enp,
+       __in            efx_link_mode_t link_mode,
+       __in            efx_loopback_type_t loopback_type);
+
+#endif /* EFSYS_OPT_LOOPBACK */
+
+#if EFSYS_OPT_MAC_STATS
+
+extern __checkReturn                   efx_rc_t
+ef10_mac_stats_get_mask(
+       __in                            efx_nic_t *enp,
+       __inout_bcount(mask_size)       uint32_t *maskp,
+       __in                            size_t mask_size);
+
+extern __checkReturn                   efx_rc_t
+ef10_mac_stats_update(
+       __in                            efx_nic_t *enp,
+       __in                            efsys_mem_t *esmp,
+       __inout_ecount(EFX_MAC_NSTATS)  efsys_stat_t *stat,
+       __inout_opt                     uint32_t *generationp);
+
+#endif /* EFSYS_OPT_MAC_STATS */
+
 
 /* MCDI */
 
@@ -293,6 +339,228 @@ ef10_mcdi_get_timeout(
 
 /* NVRAM */
 
+#if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buf_read_tlv(
+       __in                            efx_nic_t *enp,
+       __in_bcount(max_seg_size)       caddr_t seg_data,
+       __in                            size_t max_seg_size,
+       __in                            uint32_t tag,
+       __deref_out_bcount_opt(*sizep)  caddr_t *datap,
+       __out                           size_t *sizep);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buf_write_tlv(
+       __inout_bcount(partn_size)      caddr_t partn_data,
+       __in                            size_t partn_size,
+       __in                            uint32_t tag,
+       __in_bcount(tag_size)           caddr_t tag_data,
+       __in                            size_t tag_size,
+       __out                           size_t *total_lengthp);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_read_tlv(
+       __in                            efx_nic_t *enp,
+       __in                            uint32_t partn,
+       __in                            uint32_t tag,
+       __deref_out_bcount_opt(*sizep)  caddr_t *datap,
+       __out                           size_t *sizep);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_write_tlv(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in                    uint32_t tag,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_write_segment_tlv(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in                    uint32_t tag,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size,
+       __in                    boolean_t all_segments);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_lock(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_unlock(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __out_opt               uint32_t *resultp);
+
+#endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
+
+#if EFSYS_OPT_NVRAM
+
+#if EFSYS_OPT_DIAG
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_test(
+       __in                    efx_nic_t *enp);
+
+#endif /* EFSYS_OPT_DIAG */
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_type_to_partn(
+       __in                    efx_nic_t *enp,
+       __in                    efx_nvram_type_t type,
+       __out                   uint32_t *partnp);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_size(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __out                   size_t *sizep);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_rw_start(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __out                   size_t *chunk_sizep);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_read_mode(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in                    unsigned int offset,
+       __out_bcount(size)      caddr_t data,
+       __in                    size_t size,
+       __in                    uint32_t mode);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_read(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in                    unsigned int offset,
+       __out_bcount(size)      caddr_t data,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_erase(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in                    unsigned int offset,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_write(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in                    unsigned int offset,
+       __out_bcount(size)      caddr_t data,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_rw_finish(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_get_version(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __out                   uint32_t *subtypep,
+       __out_ecount(4)         uint16_t version[4]);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_partn_set_version(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in_ecount(4)          uint16_t version[4]);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_validate(
+       __in                    efx_nic_t *enp,
+       __in                    uint32_t partn,
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_create(
+       __in                    efx_nic_t *enp,
+       __in                    uint16_t partn_type,
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size);
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_find_item_start(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size,
+       __out                   uint32_t *startp
+       );
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_find_end(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size,
+       __in                    uint32_t offset,
+       __out                   uint32_t *endp
+       );
+
+extern __checkReturn   __success(return != B_FALSE)    boolean_t
+ef10_nvram_buffer_find_item(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size,
+       __in                    uint32_t offset,
+       __out                   uint32_t *startp,
+       __out                   uint32_t *lengthp
+       );
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_get_item(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size,
+       __in                    uint32_t offset,
+       __in                    uint32_t length,
+       __out_bcount_part(item_max_size, *lengthp)
+                               caddr_t itemp,
+       __in                    size_t item_max_size,
+       __out                   uint32_t *lengthp
+       );
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_insert_item(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size,
+       __in                    uint32_t offset,
+       __in_bcount(length)     caddr_t keyp,
+       __in                    uint32_t length,
+       __out                   uint32_t *lengthp
+       );
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_delete_item(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size,
+       __in                    uint32_t offset,
+       __in                    uint32_t length,
+       __in                    uint32_t end
+       );
+
+extern __checkReturn           efx_rc_t
+ef10_nvram_buffer_finish(
+       __in_bcount(buffer_size)
+                               caddr_t bufferp,
+       __in                    size_t buffer_size
+       );
+
+#endif /* EFSYS_OPT_NVRAM */
+
 
 /* PHY */
 
@@ -301,6 +569,9 @@ typedef struct ef10_link_state_s {
        uint32_t                els_lp_cap_mask;
        unsigned int            els_fcntl;
        efx_link_mode_t         els_link_mode;
+#if EFSYS_OPT_LOOPBACK
+       efx_loopback_type_t     els_loopback;
+#endif
        boolean_t               els_mac_up;
 } ef10_link_state_t;
 
@@ -333,6 +604,45 @@ ef10_phy_oui_get(
        __in            efx_nic_t *enp,
        __out           uint32_t *ouip);
 
+#if EFSYS_OPT_PHY_STATS
+
+extern __checkReturn                   efx_rc_t
+ef10_phy_stats_update(
+       __in                            efx_nic_t *enp,
+       __in                            efsys_mem_t *esmp,
+       __inout_ecount(EFX_PHY_NSTATS)  uint32_t *stat);
+
+#endif /* EFSYS_OPT_PHY_STATS */
+
+#if EFSYS_OPT_BIST
+
+extern __checkReturn           efx_rc_t
+ef10_bist_enable_offline(
+       __in                    efx_nic_t *enp);
+
+extern __checkReturn           efx_rc_t
+ef10_bist_start(
+       __in                    efx_nic_t *enp,
+       __in                    efx_bist_type_t type);
+
+extern __checkReturn           efx_rc_t
+ef10_bist_poll(
+       __in                    efx_nic_t *enp,
+       __in                    efx_bist_type_t type,
+       __out                   efx_bist_result_t *resultp,
+       __out_opt __drv_when(count > 0, __notnull)
+       uint32_t        *value_maskp,
+       __out_ecount_opt(count) __drv_when(count > 0, __notnull)
+       unsigned long   *valuesp,
+       __in                    size_t count);
+
+extern                         void
+ef10_bist_stop(
+       __in                    efx_nic_t *enp,
+       __in                    efx_bist_type_t type);
+
+#endif /* EFSYS_OPT_BIST */
+
 /* TX */
 
 extern __checkReturn   efx_rc_t
@@ -374,6 +684,22 @@ ef10_tx_qpush(
        __in            unsigned int added,
        __in            unsigned int pushed);
 
+#if EFSYS_OPT_RX_PACKED_STREAM
+extern                 void
+ef10_rx_qps_update_credits(
+       __in    efx_rxq_t *erp);
+
+extern __checkReturn   uint8_t *
+ef10_rx_qps_packet_info(
+       __in            efx_rxq_t *erp,
+       __in            uint8_t *buffer,
+       __in            uint32_t buffer_length,
+       __in            uint32_t current_offset,
+       __out           uint16_t *lengthp,
+       __out           uint32_t *next_offsetp,
+       __out           uint32_t *timestamp);
+#endif
+
 extern __checkReturn   efx_rc_t
 ef10_tx_qpace(
        __in            efx_txq_t *etp,
@@ -449,6 +775,15 @@ ef10_tx_qdesc_vlantci_create(
        __out   efx_desc_t *edp);
 
 
+#if EFSYS_OPT_QSTATS
+
+extern                 void
+ef10_tx_qstats_update(
+       __in                            efx_txq_t *etp,
+       __inout_ecount(TX_NQSTATS)      efsys_stat_t *stat);
+
+#endif /* EFSYS_OPT_QSTATS */
+
 typedef uint32_t       efx_piobuf_handle_t;
 
 #define        EFX_PIOBUF_HANDLE_INVALID       ((efx_piobuf_handle_t) -1)
@@ -482,6 +817,69 @@ ef10_nic_pio_unlink(
 
 /* VPD */
 
+#if EFSYS_OPT_VPD
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_init(
+       __in                    efx_nic_t *enp);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_size(
+       __in                    efx_nic_t *enp,
+       __out                   size_t *sizep);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_read(
+       __in                    efx_nic_t *enp,
+       __out_bcount(size)      caddr_t data,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_verify(
+       __in                    efx_nic_t *enp,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_reinit(
+       __in                    efx_nic_t *enp,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_get(
+       __in                    efx_nic_t *enp,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size,
+       __inout                 efx_vpd_value_t *evvp);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_set(
+       __in                    efx_nic_t *enp,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size,
+       __in                    efx_vpd_value_t *evvp);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_next(
+       __in                    efx_nic_t *enp,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size,
+       __out                   efx_vpd_value_t *evvp,
+       __inout                 unsigned int *contp);
+
+extern __checkReturn           efx_rc_t
+ef10_vpd_write(
+       __in                    efx_nic_t *enp,
+       __in_bcount(size)       caddr_t data,
+       __in                    size_t size);
+
+extern                         void
+ef10_vpd_fini(
+       __in                    efx_nic_t *enp);
+
+#endif /* EFSYS_OPT_VPD */
+
 
 /* RX */
 
@@ -489,6 +887,57 @@ extern     __checkReturn   efx_rc_t
 ef10_rx_init(
        __in            efx_nic_t *enp);
 
+#if EFSYS_OPT_RX_SCATTER
+extern __checkReturn   efx_rc_t
+ef10_rx_scatter_enable(
+       __in            efx_nic_t *enp,
+       __in            unsigned int buf_size);
+#endif /* EFSYS_OPT_RX_SCATTER */
+
+
+#if EFSYS_OPT_RX_SCALE
+
+extern __checkReturn   efx_rc_t
+ef10_rx_scale_context_alloc(
+       __in            efx_nic_t *enp,
+       __in            efx_rx_scale_context_type_t type,
+       __in            uint32_t num_queues,
+       __out           uint32_t *rss_contextp);
+
+extern __checkReturn   efx_rc_t
+ef10_rx_scale_context_free(
+       __in            efx_nic_t *enp,
+       __in            uint32_t rss_context);
+
+extern __checkReturn   efx_rc_t
+ef10_rx_scale_mode_set(
+       __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
+       __in            efx_rx_hash_alg_t alg,
+       __in            efx_rx_hash_type_t type,
+       __in            boolean_t insert);
+
+extern __checkReturn   efx_rc_t
+ef10_rx_scale_key_set(
+       __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
+       __in_ecount(n)  uint8_t *key,
+       __in            size_t n);
+
+extern __checkReturn   efx_rc_t
+ef10_rx_scale_tbl_set(
+       __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
+       __in_ecount(n)  unsigned int *table,
+       __in            size_t n);
+
+extern __checkReturn   uint32_t
+ef10_rx_prefix_hash(
+       __in            efx_nic_t *enp,
+       __in            efx_rx_hash_alg_t func,
+       __in            uint8_t *buffer);
+
+#endif /* EFSYS_OPT_RX_SCALE */
 
 extern __checkReturn   efx_rc_t
 ef10_rx_prefix_pktlen(
@@ -571,6 +1020,13 @@ typedef struct ef10_filter_entry_s {
 /* Allow for the broadcast address to be added to the multicast list */
 #define        EFX_EF10_FILTER_MULTICAST_FILTERS_MAX   (EFX_MAC_MULTICAST_LIST_MAX + 1)
 
+/*
+ * For encapsulated packets, there is one filter each for each combination of
+ * IPv4 or IPv6 outer frame, VXLAN, GENEVE or NVGRE packet type, and unicast or
+ * multicast inner frames.
+ */
+#define EFX_EF10_FILTER_ENCAP_FILTERS_MAX      12
+
 typedef struct ef10_filter_table_s {
        ef10_filter_entry_t     eft_entry[EFX_EF10_FILTER_TBL_ROWS];
        efx_rxq_t               *eft_default_rxq;
@@ -582,6 +1038,9 @@ typedef struct ef10_filter_table_s {
            EFX_EF10_FILTER_MULTICAST_FILTERS_MAX];
        uint32_t                eft_mulcst_filter_count;
        boolean_t               eft_using_all_mulcst;
+       uint32_t                eft_encap_filter_indexes[
+           EFX_EF10_FILTER_ENCAP_FILTERS_MAX];
+       uint32_t                eft_encap_filter_count;
 } ef10_filter_table_t;
 
        __checkReturn   efx_rc_t
@@ -609,9 +1068,10 @@ ef10_filter_delete(
 
 extern __checkReturn   efx_rc_t
 ef10_filter_supported_filters(
-       __in            efx_nic_t *enp,
-       __out           uint32_t *list,
-       __out           size_t *length);
+       __in                            efx_nic_t *enp,
+       __out_ecount(buffer_length)     uint32_t *buffer,
+       __in                            size_t buffer_length,
+       __out                           size_t *list_lengthp);
 
 extern __checkReturn   efx_rc_t
 ef10_filter_reconfigure(
@@ -711,6 +1171,36 @@ ef10_external_port_mapping(
        __in            uint32_t port,
        __out           uint8_t *external_portp);
 
+#if EFSYS_OPT_RX_PACKED_STREAM
+
+/* Data space per credit in packed stream mode */
+#define        EFX_RX_PACKED_STREAM_MEM_PER_CREDIT (1 << 16)
+
+/*
+ * Received packets are always aligned at this boundary. Also there always
+ * exists a gap of this size between packets.
+ * (see SF-112241-TC, 4.5)
+ */
+#define        EFX_RX_PACKED_STREAM_ALIGNMENT 64
+
+/*
+ * Size of a pseudo-header prepended to received packets
+ * in packed stream mode
+ */
+#define        EFX_RX_PACKED_STREAM_RX_PREFIX_SIZE 8
+
+/* Minimum space for packet in packed stream mode */
+#define        EFX_RX_PACKED_STREAM_MIN_PACKET_SPACE                \
+       P2ROUNDUP(EFX_RX_PACKED_STREAM_RX_PREFIX_SIZE +      \
+                 EFX_MAC_PDU_MIN +                          \
+                 EFX_RX_PACKED_STREAM_ALIGNMENT,            \
+                 EFX_RX_PACKED_STREAM_ALIGNMENT)
+
+/* Maximum number of credits */
+#define        EFX_RX_PACKED_STREAM_MAX_CREDITS 127
+
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
+
 #ifdef __cplusplus
 }
 #endif