1 /* QLogic qed NIC Driver
2 * Copyright (c) 2015 QLogic Corporation
4 * This software is available under the terms of the GNU General Public License
5 * (GPL) Version 2, available from the file COPYING in the main directory of
9 #include <linux/types.h>
10 #include <asm/byteorder.h>
11 #include <linux/bitops.h>
12 #include <linux/errno.h>
13 #include <linux/kernel.h>
14 #include <linux/slab.h>
15 #include <linux/string.h>
22 #define QED_DCBX_MAX_MIB_READ_TRY (100)
23 #define QED_ETH_TYPE_DEFAULT (0)
24 #define QED_ETH_TYPE_ROCE (0x8915)
25 #define QED_UDP_PORT_TYPE_ROCE_V2 (0x12B7)
26 #define QED_ETH_TYPE_FCOE (0x8906)
27 #define QED_TCP_PORT_ISCSI (0xCBC)
29 #define QED_DCBX_INVALID_PRIORITY 0xFF
31 /* Get Traffic Class from priority traffic class table, 4 bits represent
32 * the traffic class corresponding to the priority.
34 #define QED_DCBX_PRIO2TC(prio_tc_tbl, prio) \
35 ((u32)(prio_tc_tbl >> ((7 - prio) * 4)) & 0x7)
37 static const struct qed_dcbx_app_metadata qed_dcbx_app_update
[] = {
38 {DCBX_PROTOCOL_ISCSI
, "ISCSI", QED_PCI_DEFAULT
},
39 {DCBX_PROTOCOL_FCOE
, "FCOE", QED_PCI_DEFAULT
},
40 {DCBX_PROTOCOL_ROCE
, "ROCE", QED_PCI_DEFAULT
},
41 {DCBX_PROTOCOL_ROCE_V2
, "ROCE_V2", QED_PCI_DEFAULT
},
42 {DCBX_PROTOCOL_ETH
, "ETH", QED_PCI_ETH
}
45 static bool qed_dcbx_app_ethtype(u32 app_info_bitmap
)
47 return !!(QED_MFW_GET_FIELD(app_info_bitmap
, DCBX_APP_SF
) ==
51 static bool qed_dcbx_app_port(u32 app_info_bitmap
)
53 return !!(QED_MFW_GET_FIELD(app_info_bitmap
, DCBX_APP_SF
) ==
57 static bool qed_dcbx_default_tlv(u32 app_info_bitmap
, u16 proto_id
)
59 return !!(qed_dcbx_app_ethtype(app_info_bitmap
) &&
60 proto_id
== QED_ETH_TYPE_DEFAULT
);
63 static bool qed_dcbx_iscsi_tlv(u32 app_info_bitmap
, u16 proto_id
)
65 return !!(qed_dcbx_app_port(app_info_bitmap
) &&
66 proto_id
== QED_TCP_PORT_ISCSI
);
69 static bool qed_dcbx_fcoe_tlv(u32 app_info_bitmap
, u16 proto_id
)
71 return !!(qed_dcbx_app_ethtype(app_info_bitmap
) &&
72 proto_id
== QED_ETH_TYPE_FCOE
);
75 static bool qed_dcbx_roce_tlv(u32 app_info_bitmap
, u16 proto_id
)
77 return !!(qed_dcbx_app_ethtype(app_info_bitmap
) &&
78 proto_id
== QED_ETH_TYPE_ROCE
);
81 static bool qed_dcbx_roce_v2_tlv(u32 app_info_bitmap
, u16 proto_id
)
83 return !!(qed_dcbx_app_port(app_info_bitmap
) &&
84 proto_id
== QED_UDP_PORT_TYPE_ROCE_V2
);
88 qed_dcbx_dp_protocol(struct qed_hwfn
*p_hwfn
, struct qed_dcbx_results
*p_data
)
90 enum dcbx_protocol_type id
;
93 DP_VERBOSE(p_hwfn
, QED_MSG_DCB
, "DCBX negotiated: %d\n",
94 p_data
->dcbx_enabled
);
96 for (i
= 0; i
< ARRAY_SIZE(qed_dcbx_app_update
); i
++) {
97 id
= qed_dcbx_app_update
[i
].id
;
99 DP_VERBOSE(p_hwfn
, QED_MSG_DCB
,
100 "%s info: update %d, enable %d, prio %d, tc %d, num_tc %d\n",
101 qed_dcbx_app_update
[i
].name
, p_data
->arr
[id
].update
,
102 p_data
->arr
[id
].enable
, p_data
->arr
[id
].priority
,
103 p_data
->arr
[id
].tc
, p_hwfn
->hw_info
.num_tc
);
108 qed_dcbx_set_params(struct qed_dcbx_results
*p_data
,
109 struct qed_hw_info
*p_info
,
114 enum dcbx_protocol_type type
,
115 enum qed_pci_personality personality
)
117 /* PF update ramrod data */
118 p_data
->arr
[type
].update
= update
;
119 p_data
->arr
[type
].enable
= enable
;
120 p_data
->arr
[type
].priority
= prio
;
121 p_data
->arr
[type
].tc
= tc
;
124 if (p_info
->personality
== personality
) {
125 if (personality
== QED_PCI_ETH
)
126 p_info
->non_offload_tc
= tc
;
128 p_info
->offload_tc
= tc
;
132 /* Update app protocol data and hw_info fields with the TLV info */
134 qed_dcbx_update_app_info(struct qed_dcbx_results
*p_data
,
135 struct qed_hwfn
*p_hwfn
,
138 u8 prio
, u8 tc
, enum dcbx_protocol_type type
)
140 struct qed_hw_info
*p_info
= &p_hwfn
->hw_info
;
141 enum qed_pci_personality personality
;
142 enum dcbx_protocol_type id
;
146 for (i
= 0; i
< ARRAY_SIZE(qed_dcbx_app_update
); i
++) {
147 id
= qed_dcbx_app_update
[i
].id
;
152 personality
= qed_dcbx_app_update
[i
].personality
;
153 name
= qed_dcbx_app_update
[i
].name
;
155 qed_dcbx_set_params(p_data
, p_info
, enable
, update
,
156 prio
, tc
, type
, personality
);
161 qed_dcbx_get_app_protocol_type(struct qed_hwfn
*p_hwfn
,
163 u16 id
, enum dcbx_protocol_type
*type
)
165 if (qed_dcbx_fcoe_tlv(app_prio_bitmap
, id
)) {
166 *type
= DCBX_PROTOCOL_FCOE
;
167 } else if (qed_dcbx_roce_tlv(app_prio_bitmap
, id
)) {
168 *type
= DCBX_PROTOCOL_ROCE
;
169 } else if (qed_dcbx_iscsi_tlv(app_prio_bitmap
, id
)) {
170 *type
= DCBX_PROTOCOL_ISCSI
;
171 } else if (qed_dcbx_default_tlv(app_prio_bitmap
, id
)) {
172 *type
= DCBX_PROTOCOL_ETH
;
173 } else if (qed_dcbx_roce_v2_tlv(app_prio_bitmap
, id
)) {
174 *type
= DCBX_PROTOCOL_ROCE_V2
;
176 *type
= DCBX_MAX_PROTOCOL_TYPE
;
178 "No action required, App TLV id = 0x%x app_prio_bitmap = 0x%x\n",
179 id
, app_prio_bitmap
);
186 /* Parse app TLV's to update TC information in hw_info structure for
187 * reconfiguring QM. Get protocol specific data for PF update ramrod command.
190 qed_dcbx_process_tlv(struct qed_hwfn
*p_hwfn
,
191 struct qed_dcbx_results
*p_data
,
192 struct dcbx_app_priority_entry
*p_tbl
,
193 u32 pri_tc_tbl
, int count
, bool dcbx_enabled
)
195 u8 tc
, priority
, priority_map
;
196 enum dcbx_protocol_type type
;
201 DP_VERBOSE(p_hwfn
, QED_MSG_DCB
, "Num APP entries = %d\n", count
);
204 for (i
= 0; i
< count
; i
++) {
205 protocol_id
= QED_MFW_GET_FIELD(p_tbl
[i
].entry
,
206 DCBX_APP_PROTOCOL_ID
);
207 priority_map
= QED_MFW_GET_FIELD(p_tbl
[i
].entry
,
209 priority
= ffs(priority_map
) - 1;
211 DP_ERR(p_hwfn
, "Invalid priority\n");
215 tc
= QED_DCBX_PRIO2TC(pri_tc_tbl
, priority
);
216 if (qed_dcbx_get_app_protocol_type(p_hwfn
, p_tbl
[i
].entry
,
217 protocol_id
, &type
)) {
218 /* ETH always have the enable bit reset, as it gets
219 * vlan information per packet. For other protocols,
220 * should be set according to the dcbx_enabled
221 * indication, but we only got here if there was an
222 * app tlv for the protocol, so dcbx must be enabled.
224 enable
= !!(type
== DCBX_PROTOCOL_ETH
);
226 qed_dcbx_update_app_info(p_data
, p_hwfn
, enable
, true,
231 /* If RoCE-V2 TLV is not detected, driver need to use RoCE app
232 * data for RoCE-v2 not the default app data.
234 if (!p_data
->arr
[DCBX_PROTOCOL_ROCE_V2
].update
&&
235 p_data
->arr
[DCBX_PROTOCOL_ROCE
].update
) {
236 tc
= p_data
->arr
[DCBX_PROTOCOL_ROCE
].tc
;
237 priority
= p_data
->arr
[DCBX_PROTOCOL_ROCE
].priority
;
238 qed_dcbx_update_app_info(p_data
, p_hwfn
, true, true,
239 priority
, tc
, DCBX_PROTOCOL_ROCE_V2
);
242 /* Update ramrod protocol data and hw_info fields
243 * with default info when corresponding APP TLV's are not detected.
244 * The enabled field has a different logic for ethernet as only for
245 * ethernet dcb should disabled by default, as the information arrives
246 * from the OS (unless an explicit app tlv was present).
248 tc
= p_data
->arr
[DCBX_PROTOCOL_ETH
].tc
;
249 priority
= p_data
->arr
[DCBX_PROTOCOL_ETH
].priority
;
250 for (type
= 0; type
< DCBX_MAX_PROTOCOL_TYPE
; type
++) {
251 if (p_data
->arr
[type
].update
)
254 enable
= (type
== DCBX_PROTOCOL_ETH
) ? false : dcbx_enabled
;
255 qed_dcbx_update_app_info(p_data
, p_hwfn
, enable
, true,
262 /* Parse app TLV's to update TC information in hw_info structure for
263 * reconfiguring QM. Get protocol specific data for PF update ramrod command.
265 static int qed_dcbx_process_mib_info(struct qed_hwfn
*p_hwfn
)
267 struct dcbx_app_priority_feature
*p_app
;
268 struct dcbx_app_priority_entry
*p_tbl
;
269 struct qed_dcbx_results data
= { 0 };
270 struct dcbx_ets_feature
*p_ets
;
271 struct qed_hw_info
*p_info
;
272 u32 pri_tc_tbl
, flags
;
277 /* If DCBx version is non zero, then negotiation was
278 * successfuly performed
280 flags
= p_hwfn
->p_dcbx_info
->operational
.flags
;
281 dcbx_enabled
= !!QED_MFW_GET_FIELD(flags
, DCBX_CONFIG_VERSION
);
283 p_app
= &p_hwfn
->p_dcbx_info
->operational
.features
.app
;
284 p_tbl
= p_app
->app_pri_tbl
;
286 p_ets
= &p_hwfn
->p_dcbx_info
->operational
.features
.ets
;
287 pri_tc_tbl
= p_ets
->pri_tc_tbl
[0];
289 p_info
= &p_hwfn
->hw_info
;
290 num_entries
= QED_MFW_GET_FIELD(p_app
->flags
, DCBX_APP_NUM_ENTRIES
);
292 rc
= qed_dcbx_process_tlv(p_hwfn
, &data
, p_tbl
, pri_tc_tbl
,
293 num_entries
, dcbx_enabled
);
297 p_info
->num_tc
= QED_MFW_GET_FIELD(p_ets
->flags
, DCBX_ETS_MAX_TCS
);
298 data
.pf_id
= p_hwfn
->rel_pf_id
;
299 data
.dcbx_enabled
= dcbx_enabled
;
301 qed_dcbx_dp_protocol(p_hwfn
, &data
);
303 memcpy(&p_hwfn
->p_dcbx_info
->results
, &data
,
304 sizeof(struct qed_dcbx_results
));
310 qed_dcbx_copy_mib(struct qed_hwfn
*p_hwfn
,
311 struct qed_ptt
*p_ptt
,
312 struct qed_dcbx_mib_meta_data
*p_data
,
313 enum qed_mib_read_type type
)
315 u32 prefix_seq_num
, suffix_seq_num
;
319 /* The data is considered to be valid only if both sequence numbers are
323 if (type
== QED_DCBX_REMOTE_LLDP_MIB
) {
324 qed_memcpy_from(p_hwfn
, p_ptt
, p_data
->lldp_remote
,
325 p_data
->addr
, p_data
->size
);
326 prefix_seq_num
= p_data
->lldp_remote
->prefix_seq_num
;
327 suffix_seq_num
= p_data
->lldp_remote
->suffix_seq_num
;
329 qed_memcpy_from(p_hwfn
, p_ptt
, p_data
->mib
,
330 p_data
->addr
, p_data
->size
);
331 prefix_seq_num
= p_data
->mib
->prefix_seq_num
;
332 suffix_seq_num
= p_data
->mib
->suffix_seq_num
;
338 "mib type = %d, try count = %d prefix seq num = %d suffix seq num = %d\n",
339 type
, read_count
, prefix_seq_num
, suffix_seq_num
);
340 } while ((prefix_seq_num
!= suffix_seq_num
) &&
341 (read_count
< QED_DCBX_MAX_MIB_READ_TRY
));
343 if (read_count
>= QED_DCBX_MAX_MIB_READ_TRY
) {
345 "MIB read err, mib type = %d, try count = %d prefix seq num = %d suffix seq num = %d\n",
346 type
, read_count
, prefix_seq_num
, suffix_seq_num
);
354 qed_dcbx_read_local_lldp_mib(struct qed_hwfn
*p_hwfn
, struct qed_ptt
*p_ptt
)
356 struct qed_dcbx_mib_meta_data data
;
359 memset(&data
, 0, sizeof(data
));
360 data
.addr
= p_hwfn
->mcp_info
->port_addr
+ offsetof(struct public_port
,
362 data
.lldp_local
= p_hwfn
->p_dcbx_info
->lldp_local
;
363 data
.size
= sizeof(struct lldp_config_params_s
);
364 qed_memcpy_from(p_hwfn
, p_ptt
, data
.lldp_local
, data
.addr
, data
.size
);
370 qed_dcbx_read_remote_lldp_mib(struct qed_hwfn
*p_hwfn
,
371 struct qed_ptt
*p_ptt
,
372 enum qed_mib_read_type type
)
374 struct qed_dcbx_mib_meta_data data
;
377 memset(&data
, 0, sizeof(data
));
378 data
.addr
= p_hwfn
->mcp_info
->port_addr
+ offsetof(struct public_port
,
380 data
.lldp_remote
= p_hwfn
->p_dcbx_info
->lldp_remote
;
381 data
.size
= sizeof(struct lldp_status_params_s
);
382 rc
= qed_dcbx_copy_mib(p_hwfn
, p_ptt
, &data
, type
);
388 qed_dcbx_read_operational_mib(struct qed_hwfn
*p_hwfn
,
389 struct qed_ptt
*p_ptt
,
390 enum qed_mib_read_type type
)
392 struct qed_dcbx_mib_meta_data data
;
395 memset(&data
, 0, sizeof(data
));
396 data
.addr
= p_hwfn
->mcp_info
->port_addr
+
397 offsetof(struct public_port
, operational_dcbx_mib
);
398 data
.mib
= &p_hwfn
->p_dcbx_info
->operational
;
399 data
.size
= sizeof(struct dcbx_mib
);
400 rc
= qed_dcbx_copy_mib(p_hwfn
, p_ptt
, &data
, type
);
406 qed_dcbx_read_remote_mib(struct qed_hwfn
*p_hwfn
,
407 struct qed_ptt
*p_ptt
, enum qed_mib_read_type type
)
409 struct qed_dcbx_mib_meta_data data
;
412 memset(&data
, 0, sizeof(data
));
413 data
.addr
= p_hwfn
->mcp_info
->port_addr
+
414 offsetof(struct public_port
, remote_dcbx_mib
);
415 data
.mib
= &p_hwfn
->p_dcbx_info
->remote
;
416 data
.size
= sizeof(struct dcbx_mib
);
417 rc
= qed_dcbx_copy_mib(p_hwfn
, p_ptt
, &data
, type
);
423 qed_dcbx_read_local_mib(struct qed_hwfn
*p_hwfn
, struct qed_ptt
*p_ptt
)
425 struct qed_dcbx_mib_meta_data data
;
428 memset(&data
, 0, sizeof(data
));
429 data
.addr
= p_hwfn
->mcp_info
->port_addr
+
430 offsetof(struct public_port
, local_admin_dcbx_mib
);
431 data
.local_admin
= &p_hwfn
->p_dcbx_info
->local_admin
;
432 data
.size
= sizeof(struct dcbx_local_params
);
433 qed_memcpy_from(p_hwfn
, p_ptt
, data
.local_admin
, data
.addr
, data
.size
);
438 static int qed_dcbx_read_mib(struct qed_hwfn
*p_hwfn
,
439 struct qed_ptt
*p_ptt
, enum qed_mib_read_type type
)
444 case QED_DCBX_OPERATIONAL_MIB
:
445 rc
= qed_dcbx_read_operational_mib(p_hwfn
, p_ptt
, type
);
447 case QED_DCBX_REMOTE_MIB
:
448 rc
= qed_dcbx_read_remote_mib(p_hwfn
, p_ptt
, type
);
450 case QED_DCBX_LOCAL_MIB
:
451 rc
= qed_dcbx_read_local_mib(p_hwfn
, p_ptt
);
453 case QED_DCBX_REMOTE_LLDP_MIB
:
454 rc
= qed_dcbx_read_remote_lldp_mib(p_hwfn
, p_ptt
, type
);
456 case QED_DCBX_LOCAL_LLDP_MIB
:
457 rc
= qed_dcbx_read_local_lldp_mib(p_hwfn
, p_ptt
);
460 DP_ERR(p_hwfn
, "MIB read err, unknown mib type %d\n", type
);
467 * Reconfigure QM and invoke PF update ramrod command if operational MIB
468 * change is detected.
471 qed_dcbx_mib_update_event(struct qed_hwfn
*p_hwfn
,
472 struct qed_ptt
*p_ptt
, enum qed_mib_read_type type
)
476 rc
= qed_dcbx_read_mib(p_hwfn
, p_ptt
, type
);
480 if (type
== QED_DCBX_OPERATIONAL_MIB
) {
481 rc
= qed_dcbx_process_mib_info(p_hwfn
);
483 /* reconfigure tcs of QM queues according
484 * to negotiation results
486 qed_qm_reconf(p_hwfn
, p_ptt
);
488 /* update storm FW with negotiation results */
489 qed_sp_pf_update(p_hwfn
);
496 int qed_dcbx_info_alloc(struct qed_hwfn
*p_hwfn
)
500 p_hwfn
->p_dcbx_info
= kzalloc(sizeof(*p_hwfn
->p_dcbx_info
), GFP_KERNEL
);
501 if (!p_hwfn
->p_dcbx_info
) {
503 "Failed to allocate 'struct qed_dcbx_info'\n");
510 void qed_dcbx_info_free(struct qed_hwfn
*p_hwfn
,
511 struct qed_dcbx_info
*p_dcbx_info
)
513 kfree(p_hwfn
->p_dcbx_info
);
516 static void qed_dcbx_update_protocol_data(struct protocol_dcb_data
*p_data
,
517 struct qed_dcbx_results
*p_src
,
518 enum dcbx_protocol_type type
)
520 p_data
->dcb_enable_flag
= p_src
->arr
[type
].enable
;
521 p_data
->dcb_priority
= p_src
->arr
[type
].priority
;
522 p_data
->dcb_tc
= p_src
->arr
[type
].tc
;
525 /* Set pf update ramrod command params */
526 void qed_dcbx_set_pf_update_params(struct qed_dcbx_results
*p_src
,
527 struct pf_update_ramrod_data
*p_dest
)
529 struct protocol_dcb_data
*p_dcb_data
;
530 bool update_flag
= false;
532 p_dest
->pf_id
= p_src
->pf_id
;
534 update_flag
= p_src
->arr
[DCBX_PROTOCOL_FCOE
].update
;
535 p_dest
->update_fcoe_dcb_data_flag
= update_flag
;
537 update_flag
= p_src
->arr
[DCBX_PROTOCOL_ROCE
].update
;
538 p_dest
->update_roce_dcb_data_flag
= update_flag
;
539 update_flag
= p_src
->arr
[DCBX_PROTOCOL_ROCE_V2
].update
;
540 p_dest
->update_roce_dcb_data_flag
= update_flag
;
542 update_flag
= p_src
->arr
[DCBX_PROTOCOL_ISCSI
].update
;
543 p_dest
->update_iscsi_dcb_data_flag
= update_flag
;
544 update_flag
= p_src
->arr
[DCBX_PROTOCOL_ETH
].update
;
545 p_dest
->update_eth_dcb_data_flag
= update_flag
;
547 p_dcb_data
= &p_dest
->fcoe_dcb_data
;
548 qed_dcbx_update_protocol_data(p_dcb_data
, p_src
, DCBX_PROTOCOL_FCOE
);
549 p_dcb_data
= &p_dest
->roce_dcb_data
;
551 if (p_src
->arr
[DCBX_PROTOCOL_ROCE
].update
)
552 qed_dcbx_update_protocol_data(p_dcb_data
, p_src
,
554 if (p_src
->arr
[DCBX_PROTOCOL_ROCE_V2
].update
)
555 qed_dcbx_update_protocol_data(p_dcb_data
, p_src
,
556 DCBX_PROTOCOL_ROCE_V2
);
558 p_dcb_data
= &p_dest
->iscsi_dcb_data
;
559 qed_dcbx_update_protocol_data(p_dcb_data
, p_src
, DCBX_PROTOCOL_ISCSI
);
560 p_dcb_data
= &p_dest
->eth_dcb_data
;
561 qed_dcbx_update_protocol_data(p_dcb_data
, p_src
, DCBX_PROTOCOL_ETH
);