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
)
196 enum dcbx_protocol_type type
;
202 DP_VERBOSE(p_hwfn
, QED_MSG_DCB
, "Num APP entries = %d\n", count
);
205 for (i
= 0; i
< count
; i
++) {
206 protocol_id
= QED_MFW_GET_FIELD(p_tbl
[i
].entry
,
207 DCBX_APP_PROTOCOL_ID
);
208 priority_map
= QED_MFW_GET_FIELD(p_tbl
[i
].entry
,
210 priority
= ffs(priority_map
) - 1;
212 DP_ERR(p_hwfn
, "Invalid priority\n");
216 tc
= QED_DCBX_PRIO2TC(pri_tc_tbl
, priority
);
217 if (qed_dcbx_get_app_protocol_type(p_hwfn
, p_tbl
[i
].entry
,
218 protocol_id
, &type
)) {
219 /* ETH always have the enable bit reset, as it gets
220 * vlan information per packet. For other protocols,
221 * should be set according to the dcbx_enabled
222 * indication, but we only got here if there was an
223 * app tlv for the protocol, so dcbx must be enabled.
225 enable
= !!(type
== DCBX_PROTOCOL_ETH
);
227 qed_dcbx_update_app_info(p_data
, p_hwfn
, enable
, true,
232 /* If RoCE-V2 TLV is not detected, driver need to use RoCE app
233 * data for RoCE-v2 not the default app data.
235 if (!p_data
->arr
[DCBX_PROTOCOL_ROCE_V2
].update
&&
236 p_data
->arr
[DCBX_PROTOCOL_ROCE
].update
) {
237 tc
= p_data
->arr
[DCBX_PROTOCOL_ROCE
].tc
;
238 priority
= p_data
->arr
[DCBX_PROTOCOL_ROCE
].priority
;
239 qed_dcbx_update_app_info(p_data
, p_hwfn
, true, true,
240 priority
, tc
, DCBX_PROTOCOL_ROCE_V2
);
243 /* Update ramrod protocol data and hw_info fields
244 * with default info when corresponding APP TLV's are not detected.
245 * The enabled field has a different logic for ethernet as only for
246 * ethernet dcb should disabled by default, as the information arrives
247 * from the OS (unless an explicit app tlv was present).
249 tc
= p_data
->arr
[DCBX_PROTOCOL_ETH
].tc
;
250 priority
= p_data
->arr
[DCBX_PROTOCOL_ETH
].priority
;
251 for (type
= 0; type
< DCBX_MAX_PROTOCOL_TYPE
; type
++) {
252 if (p_data
->arr
[type
].update
)
255 enable
= (type
== DCBX_PROTOCOL_ETH
) ? false : dcbx_enabled
;
256 qed_dcbx_update_app_info(p_data
, p_hwfn
, enable
, true,
263 /* Parse app TLV's to update TC information in hw_info structure for
264 * reconfiguring QM. Get protocol specific data for PF update ramrod command.
266 static int qed_dcbx_process_mib_info(struct qed_hwfn
*p_hwfn
)
268 struct dcbx_app_priority_feature
*p_app
;
269 struct dcbx_app_priority_entry
*p_tbl
;
270 struct qed_dcbx_results data
= { 0 };
271 struct dcbx_ets_feature
*p_ets
;
272 struct qed_hw_info
*p_info
;
273 u32 pri_tc_tbl
, flags
;
278 /* If DCBx version is non zero, then negotiation was
279 * successfuly performed
281 flags
= p_hwfn
->p_dcbx_info
->operational
.flags
;
282 dcbx_enabled
= !!QED_MFW_GET_FIELD(flags
, DCBX_CONFIG_VERSION
);
284 p_app
= &p_hwfn
->p_dcbx_info
->operational
.features
.app
;
285 p_tbl
= p_app
->app_pri_tbl
;
287 p_ets
= &p_hwfn
->p_dcbx_info
->operational
.features
.ets
;
288 pri_tc_tbl
= p_ets
->pri_tc_tbl
[0];
290 p_info
= &p_hwfn
->hw_info
;
291 num_entries
= QED_MFW_GET_FIELD(p_app
->flags
, DCBX_APP_NUM_ENTRIES
);
293 rc
= qed_dcbx_process_tlv(p_hwfn
, &data
, p_tbl
, pri_tc_tbl
,
294 num_entries
, dcbx_enabled
);
298 p_info
->num_tc
= QED_MFW_GET_FIELD(p_ets
->flags
, DCBX_ETS_MAX_TCS
);
299 data
.pf_id
= p_hwfn
->rel_pf_id
;
300 data
.dcbx_enabled
= dcbx_enabled
;
302 qed_dcbx_dp_protocol(p_hwfn
, &data
);
304 memcpy(&p_hwfn
->p_dcbx_info
->results
, &data
,
305 sizeof(struct qed_dcbx_results
));
311 qed_dcbx_copy_mib(struct qed_hwfn
*p_hwfn
,
312 struct qed_ptt
*p_ptt
,
313 struct qed_dcbx_mib_meta_data
*p_data
,
314 enum qed_mib_read_type type
)
316 u32 prefix_seq_num
, suffix_seq_num
;
320 /* The data is considered to be valid only if both sequence numbers are
324 if (type
== QED_DCBX_REMOTE_LLDP_MIB
) {
325 qed_memcpy_from(p_hwfn
, p_ptt
, p_data
->lldp_remote
,
326 p_data
->addr
, p_data
->size
);
327 prefix_seq_num
= p_data
->lldp_remote
->prefix_seq_num
;
328 suffix_seq_num
= p_data
->lldp_remote
->suffix_seq_num
;
330 qed_memcpy_from(p_hwfn
, p_ptt
, p_data
->mib
,
331 p_data
->addr
, p_data
->size
);
332 prefix_seq_num
= p_data
->mib
->prefix_seq_num
;
333 suffix_seq_num
= p_data
->mib
->suffix_seq_num
;
339 "mib type = %d, try count = %d prefix seq num = %d suffix seq num = %d\n",
340 type
, read_count
, prefix_seq_num
, suffix_seq_num
);
341 } while ((prefix_seq_num
!= suffix_seq_num
) &&
342 (read_count
< QED_DCBX_MAX_MIB_READ_TRY
));
344 if (read_count
>= QED_DCBX_MAX_MIB_READ_TRY
) {
346 "MIB read err, mib type = %d, try count = %d prefix seq num = %d suffix seq num = %d\n",
347 type
, read_count
, prefix_seq_num
, suffix_seq_num
);
355 qed_dcbx_read_local_lldp_mib(struct qed_hwfn
*p_hwfn
, struct qed_ptt
*p_ptt
)
357 struct qed_dcbx_mib_meta_data data
;
360 memset(&data
, 0, sizeof(data
));
361 data
.addr
= p_hwfn
->mcp_info
->port_addr
+ offsetof(struct public_port
,
363 data
.lldp_local
= p_hwfn
->p_dcbx_info
->lldp_local
;
364 data
.size
= sizeof(struct lldp_config_params_s
);
365 qed_memcpy_from(p_hwfn
, p_ptt
, data
.lldp_local
, data
.addr
, data
.size
);
371 qed_dcbx_read_remote_lldp_mib(struct qed_hwfn
*p_hwfn
,
372 struct qed_ptt
*p_ptt
,
373 enum qed_mib_read_type type
)
375 struct qed_dcbx_mib_meta_data data
;
378 memset(&data
, 0, sizeof(data
));
379 data
.addr
= p_hwfn
->mcp_info
->port_addr
+ offsetof(struct public_port
,
381 data
.lldp_remote
= p_hwfn
->p_dcbx_info
->lldp_remote
;
382 data
.size
= sizeof(struct lldp_status_params_s
);
383 rc
= qed_dcbx_copy_mib(p_hwfn
, p_ptt
, &data
, type
);
389 qed_dcbx_read_operational_mib(struct qed_hwfn
*p_hwfn
,
390 struct qed_ptt
*p_ptt
,
391 enum qed_mib_read_type type
)
393 struct qed_dcbx_mib_meta_data data
;
396 memset(&data
, 0, sizeof(data
));
397 data
.addr
= p_hwfn
->mcp_info
->port_addr
+
398 offsetof(struct public_port
, operational_dcbx_mib
);
399 data
.mib
= &p_hwfn
->p_dcbx_info
->operational
;
400 data
.size
= sizeof(struct dcbx_mib
);
401 rc
= qed_dcbx_copy_mib(p_hwfn
, p_ptt
, &data
, type
);
407 qed_dcbx_read_remote_mib(struct qed_hwfn
*p_hwfn
,
408 struct qed_ptt
*p_ptt
, enum qed_mib_read_type type
)
410 struct qed_dcbx_mib_meta_data data
;
413 memset(&data
, 0, sizeof(data
));
414 data
.addr
= p_hwfn
->mcp_info
->port_addr
+
415 offsetof(struct public_port
, remote_dcbx_mib
);
416 data
.mib
= &p_hwfn
->p_dcbx_info
->remote
;
417 data
.size
= sizeof(struct dcbx_mib
);
418 rc
= qed_dcbx_copy_mib(p_hwfn
, p_ptt
, &data
, type
);
424 qed_dcbx_read_local_mib(struct qed_hwfn
*p_hwfn
, struct qed_ptt
*p_ptt
)
426 struct qed_dcbx_mib_meta_data data
;
429 memset(&data
, 0, sizeof(data
));
430 data
.addr
= p_hwfn
->mcp_info
->port_addr
+
431 offsetof(struct public_port
, local_admin_dcbx_mib
);
432 data
.local_admin
= &p_hwfn
->p_dcbx_info
->local_admin
;
433 data
.size
= sizeof(struct dcbx_local_params
);
434 qed_memcpy_from(p_hwfn
, p_ptt
, data
.local_admin
, data
.addr
, data
.size
);
439 static int qed_dcbx_read_mib(struct qed_hwfn
*p_hwfn
,
440 struct qed_ptt
*p_ptt
, enum qed_mib_read_type type
)
445 case QED_DCBX_OPERATIONAL_MIB
:
446 rc
= qed_dcbx_read_operational_mib(p_hwfn
, p_ptt
, type
);
448 case QED_DCBX_REMOTE_MIB
:
449 rc
= qed_dcbx_read_remote_mib(p_hwfn
, p_ptt
, type
);
451 case QED_DCBX_LOCAL_MIB
:
452 rc
= qed_dcbx_read_local_mib(p_hwfn
, p_ptt
);
454 case QED_DCBX_REMOTE_LLDP_MIB
:
455 rc
= qed_dcbx_read_remote_lldp_mib(p_hwfn
, p_ptt
, type
);
457 case QED_DCBX_LOCAL_LLDP_MIB
:
458 rc
= qed_dcbx_read_local_lldp_mib(p_hwfn
, p_ptt
);
461 DP_ERR(p_hwfn
, "MIB read err, unknown mib type %d\n", type
);
468 * Reconfigure QM and invoke PF update ramrod command if operational MIB
469 * change is detected.
472 qed_dcbx_mib_update_event(struct qed_hwfn
*p_hwfn
,
473 struct qed_ptt
*p_ptt
, enum qed_mib_read_type type
)
477 rc
= qed_dcbx_read_mib(p_hwfn
, p_ptt
, type
);
481 if (type
== QED_DCBX_OPERATIONAL_MIB
) {
482 rc
= qed_dcbx_process_mib_info(p_hwfn
);
484 /* reconfigure tcs of QM queues according
485 * to negotiation results
487 qed_qm_reconf(p_hwfn
, p_ptt
);
489 /* update storm FW with negotiation results */
490 qed_sp_pf_update(p_hwfn
);
497 int qed_dcbx_info_alloc(struct qed_hwfn
*p_hwfn
)
501 p_hwfn
->p_dcbx_info
= kzalloc(sizeof(*p_hwfn
->p_dcbx_info
), GFP_KERNEL
);
502 if (!p_hwfn
->p_dcbx_info
) {
504 "Failed to allocate 'struct qed_dcbx_info'\n");
511 void qed_dcbx_info_free(struct qed_hwfn
*p_hwfn
,
512 struct qed_dcbx_info
*p_dcbx_info
)
514 kfree(p_hwfn
->p_dcbx_info
);
517 static void qed_dcbx_update_protocol_data(struct protocol_dcb_data
*p_data
,
518 struct qed_dcbx_results
*p_src
,
519 enum dcbx_protocol_type type
)
521 p_data
->dcb_enable_flag
= p_src
->arr
[type
].enable
;
522 p_data
->dcb_priority
= p_src
->arr
[type
].priority
;
523 p_data
->dcb_tc
= p_src
->arr
[type
].tc
;
526 /* Set pf update ramrod command params */
527 void qed_dcbx_set_pf_update_params(struct qed_dcbx_results
*p_src
,
528 struct pf_update_ramrod_data
*p_dest
)
530 struct protocol_dcb_data
*p_dcb_data
;
531 bool update_flag
= false;
533 p_dest
->pf_id
= p_src
->pf_id
;
535 update_flag
= p_src
->arr
[DCBX_PROTOCOL_FCOE
].update
;
536 p_dest
->update_fcoe_dcb_data_flag
= update_flag
;
538 update_flag
= p_src
->arr
[DCBX_PROTOCOL_ROCE
].update
;
539 p_dest
->update_roce_dcb_data_flag
= update_flag
;
540 update_flag
= p_src
->arr
[DCBX_PROTOCOL_ROCE_V2
].update
;
541 p_dest
->update_roce_dcb_data_flag
= update_flag
;
543 update_flag
= p_src
->arr
[DCBX_PROTOCOL_ISCSI
].update
;
544 p_dest
->update_iscsi_dcb_data_flag
= update_flag
;
545 update_flag
= p_src
->arr
[DCBX_PROTOCOL_ETH
].update
;
546 p_dest
->update_eth_dcb_data_flag
= update_flag
;
548 p_dcb_data
= &p_dest
->fcoe_dcb_data
;
549 qed_dcbx_update_protocol_data(p_dcb_data
, p_src
, DCBX_PROTOCOL_FCOE
);
550 p_dcb_data
= &p_dest
->roce_dcb_data
;
552 if (p_src
->arr
[DCBX_PROTOCOL_ROCE
].update
)
553 qed_dcbx_update_protocol_data(p_dcb_data
, p_src
,
555 if (p_src
->arr
[DCBX_PROTOCOL_ROCE_V2
].update
)
556 qed_dcbx_update_protocol_data(p_dcb_data
, p_src
,
557 DCBX_PROTOCOL_ROCE_V2
);
559 p_dcb_data
= &p_dest
->iscsi_dcb_data
;
560 qed_dcbx_update_protocol_data(p_dcb_data
, p_src
, DCBX_PROTOCOL_ISCSI
);
561 p_dcb_data
= &p_dest
->eth_dcb_data
;
562 qed_dcbx_update_protocol_data(p_dcb_data
, p_src
, DCBX_PROTOCOL_ETH
);