summaryrefslogtreecommitdiffstats
path: root/sys/dev/bxe/bxe_dcb.h
blob: 79515e00106302c9c593128a6b2405f60db3eeae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
/*-
 * Copyright (c) 2007-2014 QLogic Corporation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS'
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");

#ifndef BXE_DCB_H
#define BXE_DCB_H

#define LLFC_DRIVER_TRAFFIC_TYPE_MAX 3 /* NW, iSCSI, FCoE */
struct bxe_dcbx_app_params {
    uint32_t enabled;
    uint32_t traffic_type_priority[LLFC_DRIVER_TRAFFIC_TYPE_MAX];
};

#define DCBX_COS_MAX_NUM_E2 DCBX_E2E3_MAX_NUM_COS
/* bxe currently limits numbers of supported COSes to 3 to be extended to 6 */
#define BXE_MAX_COS_SUPPORT   3
#define DCBX_COS_MAX_NUM_E3B0 BXE_MAX_COS_SUPPORT
#define DCBX_COS_MAX_NUM      BXE_MAX_COS_SUPPORT

struct bxe_dcbx_cos_params {
    uint32_t bw_tbl;
    uint32_t pri_bitmask;
    /*
     * strict priority: valid values are 0..5; 0 is highest priority.
     * There can't be two COSes with the same priority.
     */
    uint8_t  strict;
#define BXE_DCBX_STRICT_INVALID                DCBX_COS_MAX_NUM
#define BXE_DCBX_STRICT_COS_HIGHEST            0
#define BXE_DCBX_STRICT_COS_NEXT_LOWER_PRI(sp) ((sp) + 1)
    uint8_t  pauseable;
};

struct bxe_dcbx_pg_params {
    uint32_t enabled;
    uint8_t  num_of_cos; /* valid COS entries */
    struct bxe_dcbx_cos_params cos_params[DCBX_COS_MAX_NUM];
};

struct bxe_dcbx_pfc_params {
    uint32_t enabled;
    uint32_t priority_non_pauseable_mask;
};

struct bxe_dcbx_port_params {
    struct bxe_dcbx_pfc_params pfc;
    struct bxe_dcbx_pg_params  ets;
    struct bxe_dcbx_app_params app;
};

#define BXE_DCBX_CONFIG_INV_VALUE           (0xFFFFFFFF)
#define BXE_DCBX_OVERWRITE_SETTINGS_DISABLE 0
#define BXE_DCBX_OVERWRITE_SETTINGS_ENABLE  1
#define BXE_DCBX_OVERWRITE_SETTINGS_INVALID (BXE_DCBX_CONFIG_INV_VALUE)
#define BXE_IS_ETS_ENABLED(sc)              \
    ((sc)->dcb_state == BXE_DCB_STATE_ON && \
     (sc)->dcbx_port_params.ets.enabled)

struct bxe_config_lldp_params {
    uint32_t overwrite_settings;
    uint32_t msg_tx_hold;
    uint32_t msg_fast_tx;
    uint32_t tx_credit_max;
    uint32_t msg_tx_interval;
    uint32_t tx_fast;
};

struct bxe_lldp_params_get {
    uint32_t ver_num;
#define LLDP_PARAMS_VER_NUM 2
    struct bxe_config_lldp_params config_lldp_params;
    /* The reserved field should follow in case the struct above will increase*/
    uint32_t _reserved[20];
    uint32_t admin_status;
#define LLDP_TX_ONLY  0x01
#define LLDP_RX_ONLY  0x02
#define LLDP_TX_RX    0x03
#define LLDP_DISABLED 0x04
    uint32_t remote_chassis_id[REM_CHASSIS_ID_STAT_LEN];
    uint32_t remote_port_id[REM_PORT_ID_STAT_LEN];
    uint32_t local_chassis_id[LOCAL_CHASSIS_ID_STAT_LEN];
    uint32_t local_port_id[LOCAL_PORT_ID_STAT_LEN];
};

struct bxe_admin_priority_app_table {
    uint32_t valid;
    uint32_t priority;
#define INVALID_TRAFFIC_TYPE_PRIORITY   (0xFFFFFFFF)
    uint32_t traffic_type;
#define TRAFFIC_TYPE_ETH        0
#define TRAFFIC_TYPE_PORT       1
    uint32_t app_id;
};

#define DCBX_CONFIG_MAX_APP_PROTOCOL 4
struct bxe_config_dcbx_params {
    uint32_t overwrite_settings;
    uint32_t admin_dcbx_version;
    uint32_t admin_ets_enable;
    uint32_t admin_pfc_enable;
    uint32_t admin_tc_supported_tx_enable;
    uint32_t admin_ets_configuration_tx_enable;
    uint32_t admin_ets_recommendation_tx_enable;
    uint32_t admin_pfc_tx_enable;
    uint32_t admin_application_priority_tx_enable;
    uint32_t admin_ets_willing;
    uint32_t admin_ets_reco_valid;
    uint32_t admin_pfc_willing;
    uint32_t admin_app_priority_willing;
    uint32_t admin_configuration_bw_precentage[8];
    uint32_t admin_configuration_ets_pg[8];
    uint32_t admin_recommendation_bw_precentage[8];
    uint32_t admin_recommendation_ets_pg[8];
    uint32_t admin_pfc_bitmap;
    struct bxe_admin_priority_app_table
        admin_priority_app_table[DCBX_CONFIG_MAX_APP_PROTOCOL];
    uint32_t admin_default_priority;
};

//#define DCBX_PARAMS_VER_NUM 3 /* XXX conflict with common_uif.h */
struct bxe_dcbx_params_get {
    uint32_t ver_num;
    uint32_t dcb_state;
    uint32_t dcbx_enabled;
    struct bxe_config_dcbx_params config_dcbx_params;
    /* The reserved field should follow in case the struct above will increase*/
    uint32_t _reserved[19];

    uint32_t dcb_current_state;
#define BXE_DCBX_CURRENT_STATE_IS_SYNC            (1 << 0)
#define BXE_PFC_IS_CURRENTLY_OPERATIONAL          (1 << 1)
#define BXE_ETS_IS_CURRENTLY_OPERATIONAL          (1 << 2)
#define BXE_PRIORITY_TAGGING_IS_CURRENTLY_OPERATIONAL     (1 << 3)

    uint32_t local_tc_supported;
    uint32_t local_pfc_caps;
    uint32_t remote_tc_supported;
    uint32_t remote_pfc_cap;
    uint32_t remote_ets_willing;
    uint32_t remote_ets_reco_valid;
    uint32_t remote_pfc_willing;
    uint32_t remote_app_priority_willing;
    uint32_t remote_configuration_bw_precentage[8];
    uint32_t remote_configuration_ets_pg[8];
    uint32_t remote_recommendation_bw_precentage[8];
    uint32_t remote_recommendation_ets_pg[8];
    uint32_t remote_pfc_bitmap;
    struct bxe_admin_priority_app_table
        remote_priority_app_table[DCBX_MAX_APP_PROTOCOL];
    uint32_t local_ets_enable;
    uint32_t local_pfc_enable;
    uint32_t local_configuration_bw_precentage[8];
    uint32_t local_configuration_ets_pg[8];
    uint32_t local_pfc_bitmap;
    struct bxe_admin_priority_app_table
        local_priority_app_table[DCBX_MAX_APP_PROTOCOL];
    uint32_t pfc_mismatch;
    uint32_t priority_app_mismatch;
    uint32_t dcbx_frames_sent;
    uint32_t dcbx_frames_received;
    uint32_t pfc_frames_sent[2];
    uint32_t pfc_frames_received[2];
};

struct bxe_dcbx_params_set {
    uint32_t ver_num;
    uint32_t dcb_state;
    uint32_t dcbx_enabled;
    struct bxe_config_dcbx_params config_dcbx_params;
};

#define GET_FLAGS(flags, bits)   ((flags) & (bits))
#define SET_FLAGS(flags, bits)   ((flags) |= (bits))
#define RESET_FLAGS(flags, bits) ((flags) &= ~(bits))

enum {
    DCBX_READ_LOCAL_MIB,
    DCBX_READ_REMOTE_MIB
};

#define ETH_TYPE_FCOE  (0x8906)
#define TCP_PORT_ISCSI (0xCBC)

#define PFC_VALUE_FRAME_SIZE (512)
#define PFC_QUANTA_IN_NANOSEC_FROM_SPEED_MEGA(mega_speed) \
    ((1000 * PFC_VALUE_FRAME_SIZE)/(mega_speed))

#define PFC_BRB1_REG_HIGH_LLFC_LOW_THRESHOLD  130
#define PFC_BRB1_REG_HIGH_LLFC_HIGH_THRESHOLD 170

struct cos_entry_help_data {
    uint32_t pri_join_mask;
    uint32_t cos_bw;
    uint8_t  strict;
    uint8_t  pausable;
};

struct cos_help_data {
    struct cos_entry_help_data data[DCBX_COS_MAX_NUM];
    uint8_t num_of_cos;
};

#define DCBX_ILLEGAL_PG      (0xFF)
#define DCBX_PFC_PRI_MASK    (0xFF)
#define DCBX_STRICT_PRIORITY (15)
#define DCBX_INVALID_COS_BW  (0xFFFFFFFF)
#define DCBX_PFC_PRI_NON_PAUSE_MASK(sc)                      \
    ((sc)->dcbx_port_params.pfc.priority_non_pauseable_mask)
#define DCBX_PFC_PRI_PAUSE_MASK(sc)             \
    ((uint8_t)~DCBX_PFC_PRI_NON_PAUSE_MASK(sc))
#define DCBX_PFC_PRI_GET_PAUSE(sc, pg_pri)     \
    ((pg_pri) & (DCBX_PFC_PRI_PAUSE_MASK(sc)))
#define DCBX_PFC_PRI_GET_NON_PAUSE(sc, pg_pri)   \
    (DCBX_PFC_PRI_NON_PAUSE_MASK(sc) & (pg_pri))
#define DCBX_IS_PFC_PRI_SOME_PAUSE(sc, pg_pri) \
    (0 != DCBX_PFC_PRI_GET_PAUSE(sc, pg_pri))
#define IS_DCBX_PFC_PRI_ONLY_PAUSE(sc, pg_pri)         \
    (pg_pri == DCBX_PFC_PRI_GET_PAUSE((sc), (pg_pri)))
#define IS_DCBX_PFC_PRI_ONLY_NON_PAUSE(sc, pg_pri)           \
    ((pg_pri) == DCBX_PFC_PRI_GET_NON_PAUSE((sc), (pg_pri)))
#define IS_DCBX_PFC_PRI_MIX_PAUSE(sc, pg_pri)            \
    (!(IS_DCBX_PFC_PRI_ONLY_NON_PAUSE((sc), (pg_pri)) || \
       IS_DCBX_PFC_PRI_ONLY_PAUSE((sc), (pg_pri))))

struct pg_entry_help_data {
    uint8_t  num_of_dif_pri;
    uint8_t  pg;
    uint32_t pg_priority;
};

struct pg_help_data {
    struct pg_entry_help_data data[LLFC_DRIVER_TRAFFIC_TYPE_MAX];
    uint8_t num_of_pg;
};

/* forward DCB/PFC related declarations */
struct bxe_softc;
/* void bxe_dcbx_update(struct work_struct *work); */
void bxe_dcbx_init_params(struct bxe_softc *sc);
void bxe_dcbx_set_state(struct bxe_softc *sc, uint8_t dcb_on, uint32_t dcbx_enabled);
int  bxe_dcb_get_lldp_params_ioctl(struct bxe_softc *sc, void *uaddr);
int  bxe_dcb_get_dcbx_params_ioctl(struct bxe_softc *sc, void *uaddr);
int  bxe_dcb_set_dcbx_params_ioctl(struct bxe_softc *sc, void *uaddr);

enum {
    BXE_DCBX_STATE_NEG_RECEIVED = 0x1,
    BXE_DCBX_STATE_TX_PAUSED,
    BXE_DCBX_STATE_TX_RELEASED
};

void bxe_dcbx_set_params(struct bxe_softc *sc, uint32_t state);
void bxe_dcbx_pmf_update(struct bxe_softc *sc);

#endif /* BXE_DCB_H */

OpenPOWER on IntegriCloud