linux/include/linux/qed/qed_eth_if.h
<<
>>
Prefs
   1/* QLogic qed NIC Driver
   2 * Copyright (c) 2015-2017  QLogic Corporation
   3 *
   4 * This software is available to you under a choice of one of two
   5 * licenses.  You may choose to be licensed under the terms of the GNU
   6 * General Public License (GPL) Version 2, available from the file
   7 * COPYING in the main directory of this source tree, or the
   8 * OpenIB.org BSD license below:
   9 *
  10 *     Redistribution and use in source and binary forms, with or
  11 *     without modification, are permitted provided that the following
  12 *     conditions are met:
  13 *
  14 *      - Redistributions of source code must retain the above
  15 *        copyright notice, this list of conditions and the following
  16 *        disclaimer.
  17 *
  18 *      - Redistributions in binary form must reproduce the above
  19 *        copyright notice, this list of conditions and the following
  20 *        disclaimer in the documentation and /or other materials
  21 *        provided with the distribution.
  22 *
  23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30 * SOFTWARE.
  31 */
  32
  33#ifndef _QED_ETH_IF_H
  34#define _QED_ETH_IF_H
  35
  36#include <linux/list.h>
  37#include <linux/if_link.h>
  38#include <linux/qed/eth_common.h>
  39#include <linux/qed/qed_if.h>
  40#include <linux/qed/qed_iov_if.h>
  41
  42/* 64 max queues * (1 rx + 4 tx-cos + 1 xdp) */
  43#define QED_MIN_L2_CONS (2 + NUM_PHYS_TCS_4PORT_K2)
  44#define QED_MAX_L2_CONS (64 * (QED_MIN_L2_CONS))
  45
  46struct qed_queue_start_common_params {
  47        /* Should always be relative to entity sending this. */
  48        u8 vport_id;
  49        u16 queue_id;
  50
  51        /* Relative, but relevant only for PFs */
  52        u8 stats_id;
  53
  54        struct qed_sb_info *p_sb;
  55        u8 sb_idx;
  56
  57        u8 tc;
  58};
  59
  60struct qed_rxq_start_ret_params {
  61        void __iomem *p_prod;
  62        void *p_handle;
  63};
  64
  65struct qed_txq_start_ret_params {
  66        void __iomem *p_doorbell;
  67        void *p_handle;
  68};
  69
  70enum qed_filter_config_mode {
  71        QED_FILTER_CONFIG_MODE_DISABLE,
  72        QED_FILTER_CONFIG_MODE_5_TUPLE,
  73        QED_FILTER_CONFIG_MODE_L4_PORT,
  74        QED_FILTER_CONFIG_MODE_IP_DEST,
  75        QED_FILTER_CONFIG_MODE_IP_SRC,
  76};
  77
  78struct qed_ntuple_filter_params {
  79        /* Physically mapped address containing header of buffer to be used
  80         * as filter.
  81         */
  82        dma_addr_t addr;
  83
  84        /* Length of header in bytes */
  85        u16 length;
  86
  87        /* Relative queue-id to receive classified packet */
  88#define QED_RFS_NTUPLE_QID_RSS ((u16)-1)
  89        u16 qid;
  90
  91        /* Identifier can either be according to vport-id or vfid */
  92        bool b_is_vf;
  93        u8 vport_id;
  94        u8 vf_id;
  95
  96        /* true iff this filter is to be added. Else to be removed */
  97        bool b_is_add;
  98
  99        /* If flow needs to be dropped */
 100        bool b_is_drop;
 101};
 102
 103struct qed_dev_eth_info {
 104        struct qed_dev_info common;
 105
 106        u8      num_queues;
 107        u8      num_tc;
 108
 109        u8      port_mac[ETH_ALEN];
 110        u16     num_vlan_filters;
 111        u16     num_mac_filters;
 112
 113        /* Legacy VF - this affects the datapath, so qede has to know */
 114        bool is_legacy;
 115
 116        /* Might depend on available resources [in case of VF] */
 117        bool xdp_supported;
 118};
 119
 120struct qed_update_vport_rss_params {
 121        void    *rss_ind_table[128];
 122        u32     rss_key[10];
 123        u8      rss_caps;
 124};
 125
 126struct qed_update_vport_params {
 127        u8 vport_id;
 128        u8 update_vport_active_flg;
 129        u8 vport_active_flg;
 130        u8 update_tx_switching_flg;
 131        u8 tx_switching_flg;
 132        u8 update_accept_any_vlan_flg;
 133        u8 accept_any_vlan;
 134        u8 update_rss_flg;
 135        struct qed_update_vport_rss_params rss_params;
 136};
 137
 138struct qed_start_vport_params {
 139        bool remove_inner_vlan;
 140        bool handle_ptp_pkts;
 141        bool gro_enable;
 142        bool drop_ttl0;
 143        u8 vport_id;
 144        u16 mtu;
 145        bool clear_stats;
 146};
 147
 148enum qed_filter_rx_mode_type {
 149        QED_FILTER_RX_MODE_TYPE_REGULAR,
 150        QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC,
 151        QED_FILTER_RX_MODE_TYPE_PROMISC,
 152};
 153
 154enum qed_filter_xcast_params_type {
 155        QED_FILTER_XCAST_TYPE_ADD,
 156        QED_FILTER_XCAST_TYPE_DEL,
 157        QED_FILTER_XCAST_TYPE_REPLACE,
 158};
 159
 160struct qed_filter_ucast_params {
 161        enum qed_filter_xcast_params_type type;
 162        u8 vlan_valid;
 163        u16 vlan;
 164        u8 mac_valid;
 165        unsigned char mac[ETH_ALEN];
 166};
 167
 168struct qed_filter_mcast_params {
 169        enum qed_filter_xcast_params_type type;
 170        u8 num;
 171        unsigned char mac[64][ETH_ALEN];
 172};
 173
 174union qed_filter_type_params {
 175        enum qed_filter_rx_mode_type accept_flags;
 176        struct qed_filter_ucast_params ucast;
 177        struct qed_filter_mcast_params mcast;
 178};
 179
 180enum qed_filter_type {
 181        QED_FILTER_TYPE_UCAST,
 182        QED_FILTER_TYPE_MCAST,
 183        QED_FILTER_TYPE_RX_MODE,
 184        QED_MAX_FILTER_TYPES,
 185};
 186
 187struct qed_filter_params {
 188        enum qed_filter_type type;
 189        union qed_filter_type_params filter;
 190};
 191
 192struct qed_tunn_params {
 193        u16 vxlan_port;
 194        u8 update_vxlan_port;
 195        u16 geneve_port;
 196        u8 update_geneve_port;
 197};
 198
 199struct qed_eth_cb_ops {
 200        struct qed_common_cb_ops common;
 201        void (*force_mac) (void *dev, u8 *mac, bool forced);
 202        void (*ports_update)(void *dev, u16 vxlan_port, u16 geneve_port);
 203};
 204
 205#define QED_MAX_PHC_DRIFT_PPB   291666666
 206
 207enum qed_ptp_filter_type {
 208        QED_PTP_FILTER_NONE,
 209        QED_PTP_FILTER_ALL,
 210        QED_PTP_FILTER_V1_L4_EVENT,
 211        QED_PTP_FILTER_V1_L4_GEN,
 212        QED_PTP_FILTER_V2_L4_EVENT,
 213        QED_PTP_FILTER_V2_L4_GEN,
 214        QED_PTP_FILTER_V2_L2_EVENT,
 215        QED_PTP_FILTER_V2_L2_GEN,
 216        QED_PTP_FILTER_V2_EVENT,
 217        QED_PTP_FILTER_V2_GEN
 218};
 219
 220enum qed_ptp_hwtstamp_tx_type {
 221        QED_PTP_HWTSTAMP_TX_OFF,
 222        QED_PTP_HWTSTAMP_TX_ON,
 223};
 224
 225#ifdef CONFIG_DCB
 226/* Prototype declaration of qed_eth_dcbnl_ops should match with the declaration
 227 * of dcbnl_rtnl_ops structure.
 228 */
 229struct qed_eth_dcbnl_ops {
 230        /* IEEE 802.1Qaz std */
 231        int (*ieee_getpfc)(struct qed_dev *cdev, struct ieee_pfc *pfc);
 232        int (*ieee_setpfc)(struct qed_dev *cdev, struct ieee_pfc *pfc);
 233        int (*ieee_getets)(struct qed_dev *cdev, struct ieee_ets *ets);
 234        int (*ieee_setets)(struct qed_dev *cdev, struct ieee_ets *ets);
 235        int (*ieee_peer_getets)(struct qed_dev *cdev, struct ieee_ets *ets);
 236        int (*ieee_peer_getpfc)(struct qed_dev *cdev, struct ieee_pfc *pfc);
 237        int (*ieee_getapp)(struct qed_dev *cdev, struct dcb_app *app);
 238        int (*ieee_setapp)(struct qed_dev *cdev, struct dcb_app *app);
 239
 240        /* CEE std */
 241        u8 (*getstate)(struct qed_dev *cdev);
 242        u8 (*setstate)(struct qed_dev *cdev, u8 state);
 243        void (*getpgtccfgtx)(struct qed_dev *cdev, int prio, u8 *prio_type,
 244                             u8 *pgid, u8 *bw_pct, u8 *up_map);
 245        void (*getpgbwgcfgtx)(struct qed_dev *cdev, int pgid, u8 *bw_pct);
 246        void (*getpgtccfgrx)(struct qed_dev *cdev, int prio, u8 *prio_type,
 247                             u8 *pgid, u8 *bw_pct, u8 *up_map);
 248        void (*getpgbwgcfgrx)(struct qed_dev *cdev, int pgid, u8 *bw_pct);
 249        void (*getpfccfg)(struct qed_dev *cdev, int prio, u8 *setting);
 250        void (*setpfccfg)(struct qed_dev *cdev, int prio, u8 setting);
 251        u8 (*getcap)(struct qed_dev *cdev, int capid, u8 *cap);
 252        int (*getnumtcs)(struct qed_dev *cdev, int tcid, u8 *num);
 253        u8 (*getpfcstate)(struct qed_dev *cdev);
 254        int (*getapp)(struct qed_dev *cdev, u8 idtype, u16 id);
 255        u8 (*getfeatcfg)(struct qed_dev *cdev, int featid, u8 *flags);
 256
 257        /* DCBX configuration */
 258        u8 (*getdcbx)(struct qed_dev *cdev);
 259        void (*setpgtccfgtx)(struct qed_dev *cdev, int prio,
 260                             u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map);
 261        void (*setpgtccfgrx)(struct qed_dev *cdev, int prio,
 262                             u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map);
 263        void (*setpgbwgcfgtx)(struct qed_dev *cdev, int pgid, u8 bw_pct);
 264        void (*setpgbwgcfgrx)(struct qed_dev *cdev, int pgid, u8 bw_pct);
 265        u8 (*setall)(struct qed_dev *cdev);
 266        int (*setnumtcs)(struct qed_dev *cdev, int tcid, u8 num);
 267        void (*setpfcstate)(struct qed_dev *cdev, u8 state);
 268        int (*setapp)(struct qed_dev *cdev, u8 idtype, u16 idval, u8 up);
 269        u8 (*setdcbx)(struct qed_dev *cdev, u8 state);
 270        u8 (*setfeatcfg)(struct qed_dev *cdev, int featid, u8 flags);
 271
 272        /* Peer apps */
 273        int (*peer_getappinfo)(struct qed_dev *cdev,
 274                               struct dcb_peer_app_info *info,
 275                               u16 *app_count);
 276        int (*peer_getapptable)(struct qed_dev *cdev, struct dcb_app *table);
 277
 278        /* CEE peer */
 279        int (*cee_peer_getpfc)(struct qed_dev *cdev, struct cee_pfc *pfc);
 280        int (*cee_peer_getpg)(struct qed_dev *cdev, struct cee_pg *pg);
 281};
 282#endif
 283
 284struct qed_eth_ptp_ops {
 285        int (*cfg_filters)(struct qed_dev *, enum qed_ptp_filter_type,
 286                           enum qed_ptp_hwtstamp_tx_type);
 287        int (*read_rx_ts)(struct qed_dev *, u64 *);
 288        int (*read_tx_ts)(struct qed_dev *, u64 *);
 289        int (*read_cc)(struct qed_dev *, u64 *);
 290        int (*disable)(struct qed_dev *);
 291        int (*adjfreq)(struct qed_dev *, s32);
 292        int (*enable)(struct qed_dev *);
 293};
 294
 295struct qed_eth_ops {
 296        const struct qed_common_ops *common;
 297#ifdef CONFIG_QED_SRIOV
 298        const struct qed_iov_hv_ops *iov;
 299#endif
 300#ifdef CONFIG_DCB
 301        const struct qed_eth_dcbnl_ops *dcb;
 302#endif
 303        const struct qed_eth_ptp_ops *ptp;
 304
 305        int (*fill_dev_info)(struct qed_dev *cdev,
 306                             struct qed_dev_eth_info *info);
 307
 308        void (*register_ops)(struct qed_dev *cdev,
 309                             struct qed_eth_cb_ops *ops,
 310                             void *cookie);
 311
 312         bool(*check_mac) (struct qed_dev *cdev, u8 *mac);
 313
 314        int (*vport_start)(struct qed_dev *cdev,
 315                           struct qed_start_vport_params *params);
 316
 317        int (*vport_stop)(struct qed_dev *cdev,
 318                          u8 vport_id);
 319
 320        int (*vport_update)(struct qed_dev *cdev,
 321                            struct qed_update_vport_params *params);
 322
 323        int (*q_rx_start)(struct qed_dev *cdev,
 324                          u8 rss_num,
 325                          struct qed_queue_start_common_params *params,
 326                          u16 bd_max_bytes,
 327                          dma_addr_t bd_chain_phys_addr,
 328                          dma_addr_t cqe_pbl_addr,
 329                          u16 cqe_pbl_size,
 330                          struct qed_rxq_start_ret_params *ret_params);
 331
 332        int (*q_rx_stop)(struct qed_dev *cdev, u8 rss_id, void *handle);
 333
 334        int (*q_tx_start)(struct qed_dev *cdev,
 335                          u8 rss_num,
 336                          struct qed_queue_start_common_params *params,
 337                          dma_addr_t pbl_addr,
 338                          u16 pbl_size,
 339                          struct qed_txq_start_ret_params *ret_params);
 340
 341        int (*q_tx_stop)(struct qed_dev *cdev, u8 rss_id, void *handle);
 342
 343        int (*filter_config)(struct qed_dev *cdev,
 344                             struct qed_filter_params *params);
 345
 346        int (*fastpath_stop)(struct qed_dev *cdev);
 347
 348        int (*eth_cqe_completion)(struct qed_dev *cdev,
 349                                  u8 rss_id,
 350                                  struct eth_slow_path_rx_cqe *cqe);
 351
 352        void (*get_vport_stats)(struct qed_dev *cdev,
 353                                struct qed_eth_stats *stats);
 354
 355        int (*tunn_config)(struct qed_dev *cdev,
 356                           struct qed_tunn_params *params);
 357
 358        int (*ntuple_filter_config)(struct qed_dev *cdev,
 359                                    void *cookie,
 360                                    struct qed_ntuple_filter_params *params);
 361
 362        int (*configure_arfs_searcher)(struct qed_dev *cdev,
 363                                       enum qed_filter_config_mode mode);
 364        int (*get_coalesce)(struct qed_dev *cdev, u16 *coal, void *handle);
 365        int (*req_bulletin_update_mac)(struct qed_dev *cdev, u8 *mac);
 366};
 367
 368const struct qed_eth_ops *qed_get_eth_ops(void);
 369void qed_put_eth_ops(void);
 370
 371#endif
 372