diff options
Diffstat (limited to 'drivers/net/ethernet/qlogic/qed/qed_fcoe.c')
| -rw-r--r-- | drivers/net/ethernet/qlogic/qed/qed_fcoe.c | 43 | 
1 files changed, 31 insertions, 12 deletions
| diff --git a/drivers/net/ethernet/qlogic/qed/qed_fcoe.c b/drivers/net/ethernet/qlogic/qed/qed_fcoe.c index 21a58fffd02b..df195c02b711 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_fcoe.c +++ b/drivers/net/ethernet/qlogic/qed/qed_fcoe.c @@ -43,7 +43,6 @@  #include <linux/slab.h>  #include <linux/stddef.h>  #include <linux/string.h> -#include <linux/version.h>  #include <linux/workqueue.h>  #include <linux/errno.h>  #include <linux/list.h> @@ -142,6 +141,15 @@ qed_sp_fcoe_func_start(struct qed_hwfn *p_hwfn,  	p_data = &p_ramrod->init_ramrod_data;  	fcoe_pf_params = &p_hwfn->pf_params.fcoe_pf_params; +	/* Sanity */ +	if (fcoe_pf_params->num_cqs > p_hwfn->hw_info.feat_num[QED_FCOE_CQ]) { +		DP_ERR(p_hwfn, +		       "Cannot satisfy CQ amount. CQs requested %d, CQs available %d. Aborting function start\n", +		       fcoe_pf_params->num_cqs, +		       p_hwfn->hw_info.feat_num[QED_FCOE_CQ]); +		return -EINVAL; +	} +  	p_data->mtu = cpu_to_le16(fcoe_pf_params->mtu);  	tmp = cpu_to_le16(fcoe_pf_params->sq_num_pbl_pages);  	p_data->sq_num_pages_in_pbl = tmp; @@ -184,7 +192,10 @@ qed_sp_fcoe_func_start(struct qed_hwfn *p_hwfn,  	p_data->q_params.queue_relative_offset = (u8)tmp;  	for (i = 0; i < fcoe_pf_params->num_cqs; i++) { -		tmp = cpu_to_le16(p_hwfn->sbs_info[i]->igu_sb_id); +		u16 igu_sb_id; + +		igu_sb_id = qed_get_igu_sb_id(p_hwfn, i); +		tmp = cpu_to_le16(igu_sb_id);  		p_data->q_params.cq_cmdq_sb_num_arr[i] = tmp;  	} @@ -539,7 +550,7 @@ static void __iomem *qed_fcoe_get_secondary_bdq_prod(struct qed_hwfn *p_hwfn,  	}  } -struct qed_fcoe_info *qed_fcoe_alloc(struct qed_hwfn *p_hwfn) +int qed_fcoe_alloc(struct qed_hwfn *p_hwfn)  {  	struct qed_fcoe_info *p_fcoe_info; @@ -547,19 +558,21 @@ struct qed_fcoe_info *qed_fcoe_alloc(struct qed_hwfn *p_hwfn)  	p_fcoe_info = kzalloc(sizeof(*p_fcoe_info), GFP_KERNEL);  	if (!p_fcoe_info) {  		DP_NOTICE(p_hwfn, "Failed to allocate qed_fcoe_info'\n"); -		return NULL; +		return -ENOMEM;  	}  	INIT_LIST_HEAD(&p_fcoe_info->free_list); -	return p_fcoe_info; + +	p_hwfn->p_fcoe_info = p_fcoe_info; +	return 0;  } -void qed_fcoe_setup(struct qed_hwfn *p_hwfn, struct qed_fcoe_info *p_fcoe_info) +void qed_fcoe_setup(struct qed_hwfn *p_hwfn)  {  	struct fcoe_task_context *p_task_ctx = NULL;  	int rc;  	u32 i; -	spin_lock_init(&p_fcoe_info->lock); +	spin_lock_init(&p_hwfn->p_fcoe_info->lock);  	for (i = 0; i < p_hwfn->pf_params.fcoe_pf_params.num_tasks; i++) {  		rc = qed_cxt_get_task_ctx(p_hwfn, i,  					  QED_CTX_WORKING_MEM, @@ -577,15 +590,15 @@ void qed_fcoe_setup(struct qed_hwfn *p_hwfn, struct qed_fcoe_info *p_fcoe_info)  	}  } -void qed_fcoe_free(struct qed_hwfn *p_hwfn, struct qed_fcoe_info *p_fcoe_info) +void qed_fcoe_free(struct qed_hwfn *p_hwfn)  {  	struct qed_fcoe_conn *p_conn = NULL; -	if (!p_fcoe_info) +	if (!p_hwfn->p_fcoe_info)  		return; -	while (!list_empty(&p_fcoe_info->free_list)) { -		p_conn = list_first_entry(&p_fcoe_info->free_list, +	while (!list_empty(&p_hwfn->p_fcoe_info->free_list)) { +		p_conn = list_first_entry(&p_hwfn->p_fcoe_info->free_list,  					  struct qed_fcoe_conn, list_entry);  		if (!p_conn)  			break; @@ -593,7 +606,8 @@ void qed_fcoe_free(struct qed_hwfn *p_hwfn, struct qed_fcoe_info *p_fcoe_info)  		qed_fcoe_free_connection(p_hwfn, p_conn);  	} -	kfree(p_fcoe_info); +	kfree(p_hwfn->p_fcoe_info); +	p_hwfn->p_fcoe_info = NULL;  }  static int @@ -734,6 +748,11 @@ static int qed_fill_fcoe_dev_info(struct qed_dev *cdev,  	info->secondary_bdq_rq_addr =  	    qed_fcoe_get_secondary_bdq_prod(hwfn, BDQ_ID_RQ); +	info->wwpn = hwfn->mcp_info->func_info.wwn_port; +	info->wwnn = hwfn->mcp_info->func_info.wwn_node; + +	info->num_cqs = FEAT_NUM(hwfn, QED_FCOE_CQ); +  	return rc;  } |