162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * QLogic qlcnic NIC Driver
462306a36Sopenharmony_ci * Copyright (c)  2009-2013 QLogic Corporation
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef __QLCNIC_DCBX_H
862306a36Sopenharmony_ci#define __QLCNIC_DCBX_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define QLCNIC_DCB_STATE	0
1162306a36Sopenharmony_ci#define QLCNIC_DCB_AEN_MODE	1
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#ifdef CONFIG_QLCNIC_DCB
1462306a36Sopenharmony_ciint qlcnic_register_dcb(struct qlcnic_adapter *);
1562306a36Sopenharmony_ci#else
1662306a36Sopenharmony_cistatic inline int qlcnic_register_dcb(struct qlcnic_adapter *adapter)
1762306a36Sopenharmony_ci{ return 0; }
1862306a36Sopenharmony_ci#endif
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistruct qlcnic_dcb;
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct qlcnic_dcb_ops {
2362306a36Sopenharmony_ci	int (*query_hw_capability) (struct qlcnic_dcb *, char *);
2462306a36Sopenharmony_ci	int (*get_hw_capability) (struct qlcnic_dcb *);
2562306a36Sopenharmony_ci	int (*query_cee_param) (struct qlcnic_dcb *, char *, u8);
2662306a36Sopenharmony_ci	void (*init_dcbnl_ops) (struct qlcnic_dcb *);
2762306a36Sopenharmony_ci	void (*aen_handler) (struct qlcnic_dcb *, void *);
2862306a36Sopenharmony_ci	int (*get_cee_cfg) (struct qlcnic_dcb *);
2962306a36Sopenharmony_ci	void (*get_info) (struct qlcnic_dcb *);
3062306a36Sopenharmony_ci	int (*attach) (struct qlcnic_dcb *);
3162306a36Sopenharmony_ci	void (*free) (struct qlcnic_dcb *);
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistruct qlcnic_dcb {
3562306a36Sopenharmony_ci	struct qlcnic_dcb_mbx_params	*param;
3662306a36Sopenharmony_ci	struct qlcnic_adapter		*adapter;
3762306a36Sopenharmony_ci	struct delayed_work		aen_work;
3862306a36Sopenharmony_ci	struct workqueue_struct		*wq;
3962306a36Sopenharmony_ci	const struct qlcnic_dcb_ops	*ops;
4062306a36Sopenharmony_ci	struct qlcnic_dcb_cfg		*cfg;
4162306a36Sopenharmony_ci	unsigned long			state;
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic inline int qlcnic_dcb_get_hw_capability(struct qlcnic_dcb *dcb)
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	if (dcb && dcb->ops->get_hw_capability)
4762306a36Sopenharmony_ci		return dcb->ops->get_hw_capability(dcb);
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	return -EOPNOTSUPP;
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic inline void qlcnic_dcb_free(struct qlcnic_dcb *dcb)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	if (dcb && dcb->ops->free)
5562306a36Sopenharmony_ci		dcb->ops->free(dcb);
5662306a36Sopenharmony_ci}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistatic inline int qlcnic_dcb_attach(struct qlcnic_dcb *dcb)
5962306a36Sopenharmony_ci{
6062306a36Sopenharmony_ci	if (dcb && dcb->ops->attach)
6162306a36Sopenharmony_ci		return dcb->ops->attach(dcb);
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	return -EOPNOTSUPP;
6462306a36Sopenharmony_ci}
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistatic inline int
6762306a36Sopenharmony_ciqlcnic_dcb_query_hw_capability(struct qlcnic_dcb *dcb, char *buf)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	if (dcb && dcb->ops->query_hw_capability)
7062306a36Sopenharmony_ci		return dcb->ops->query_hw_capability(dcb, buf);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	return -EOPNOTSUPP;
7362306a36Sopenharmony_ci}
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistatic inline void qlcnic_dcb_get_info(struct qlcnic_dcb *dcb)
7662306a36Sopenharmony_ci{
7762306a36Sopenharmony_ci	if (dcb && dcb->ops->get_info)
7862306a36Sopenharmony_ci		dcb->ops->get_info(dcb);
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistatic inline int
8262306a36Sopenharmony_ciqlcnic_dcb_query_cee_param(struct qlcnic_dcb *dcb, char *buf, u8 type)
8362306a36Sopenharmony_ci{
8462306a36Sopenharmony_ci	if (dcb && dcb->ops->query_cee_param)
8562306a36Sopenharmony_ci		return dcb->ops->query_cee_param(dcb, buf, type);
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	return -EOPNOTSUPP;
8862306a36Sopenharmony_ci}
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistatic inline int qlcnic_dcb_get_cee_cfg(struct qlcnic_dcb *dcb)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci	if (dcb && dcb->ops->get_cee_cfg)
9362306a36Sopenharmony_ci		return dcb->ops->get_cee_cfg(dcb);
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	return -EOPNOTSUPP;
9662306a36Sopenharmony_ci}
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistatic inline void qlcnic_dcb_aen_handler(struct qlcnic_dcb *dcb, void *msg)
9962306a36Sopenharmony_ci{
10062306a36Sopenharmony_ci	if (dcb && dcb->ops->aen_handler)
10162306a36Sopenharmony_ci		dcb->ops->aen_handler(dcb, msg);
10262306a36Sopenharmony_ci}
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cistatic inline void qlcnic_dcb_init_dcbnl_ops(struct qlcnic_dcb *dcb)
10562306a36Sopenharmony_ci{
10662306a36Sopenharmony_ci	if (dcb && dcb->ops->init_dcbnl_ops)
10762306a36Sopenharmony_ci		dcb->ops->init_dcbnl_ops(dcb);
10862306a36Sopenharmony_ci}
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistatic inline int qlcnic_dcb_enable(struct qlcnic_dcb *dcb)
11162306a36Sopenharmony_ci{
11262306a36Sopenharmony_ci	return dcb ? qlcnic_dcb_attach(dcb) : 0;
11362306a36Sopenharmony_ci}
11462306a36Sopenharmony_ci#endif
115