@@ -155,12 +155,14 @@ void qed_resc_free(struct qed_dev *cdev)
155155 }
156156}
157157
158- static int qed_init_qm_info (struct qed_hwfn * p_hwfn )
158+ static int qed_init_qm_info (struct qed_hwfn * p_hwfn , bool b_sleepable )
159159{
160160 u8 num_vports , vf_offset = 0 , i , vport_id , num_ports , curr_queue = 0 ;
161161 struct qed_qm_info * qm_info = & p_hwfn -> qm_info ;
162162 struct init_qm_port_params * p_qm_port ;
163163 u16 num_pqs , multi_cos_tcs = 1 ;
164+ u8 pf_wfq = qm_info -> pf_wfq ;
165+ u32 pf_rl = qm_info -> pf_rl ;
164166 u16 num_vfs = 0 ;
165167
166168#ifdef CONFIG_QED_SRIOV
@@ -182,23 +184,28 @@ static int qed_init_qm_info(struct qed_hwfn *p_hwfn)
182184
183185 /* PQs will be arranged as follows: First per-TC PQ then pure-LB quete.
184186 */
185- qm_info -> qm_pq_params = kzalloc (sizeof (* qm_info -> qm_pq_params ) *
186- num_pqs , GFP_KERNEL );
187+ qm_info -> qm_pq_params = kcalloc (num_pqs ,
188+ sizeof (struct init_qm_pq_params ),
189+ b_sleepable ? GFP_KERNEL : GFP_ATOMIC );
187190 if (!qm_info -> qm_pq_params )
188191 goto alloc_err ;
189192
190- qm_info -> qm_vport_params = kzalloc (sizeof (* qm_info -> qm_vport_params ) *
191- num_vports , GFP_KERNEL );
193+ qm_info -> qm_vport_params = kcalloc (num_vports ,
194+ sizeof (struct init_qm_vport_params ),
195+ b_sleepable ? GFP_KERNEL
196+ : GFP_ATOMIC );
192197 if (!qm_info -> qm_vport_params )
193198 goto alloc_err ;
194199
195- qm_info -> qm_port_params = kzalloc (sizeof (* qm_info -> qm_port_params ) *
196- MAX_NUM_PORTS , GFP_KERNEL );
200+ qm_info -> qm_port_params = kcalloc (MAX_NUM_PORTS ,
201+ sizeof (struct init_qm_port_params ),
202+ b_sleepable ? GFP_KERNEL
203+ : GFP_ATOMIC );
197204 if (!qm_info -> qm_port_params )
198205 goto alloc_err ;
199206
200- qm_info -> wfq_data = kcalloc (num_vports , sizeof (* qm_info -> wfq_data ),
201- GFP_KERNEL );
207+ qm_info -> wfq_data = kcalloc (num_vports , sizeof (struct qed_wfq_data ),
208+ b_sleepable ? GFP_KERNEL : GFP_ATOMIC );
202209 if (!qm_info -> wfq_data )
203210 goto alloc_err ;
204211
@@ -264,10 +271,10 @@ static int qed_init_qm_info(struct qed_hwfn *p_hwfn)
264271 for (i = 0 ; i < qm_info -> num_vports ; i ++ )
265272 qm_info -> qm_vport_params [i ].vport_wfq = 1 ;
266273
267- qm_info -> pf_wfq = 0 ;
268- qm_info -> pf_rl = 0 ;
269274 qm_info -> vport_rl_en = 1 ;
270275 qm_info -> vport_wfq_en = 1 ;
276+ qm_info -> pf_rl = pf_rl ;
277+ qm_info -> pf_wfq = pf_wfq ;
271278
272279 return 0 ;
273280
@@ -299,7 +306,7 @@ int qed_qm_reconf(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
299306 qed_qm_info_free (p_hwfn );
300307
301308 /* initialize qed's qm data structure */
302- rc = qed_init_qm_info (p_hwfn );
309+ rc = qed_init_qm_info (p_hwfn , false );
303310 if (rc )
304311 return rc ;
305312
@@ -388,7 +395,7 @@ int qed_resc_alloc(struct qed_dev *cdev)
388395 goto alloc_err ;
389396
390397 /* Prepare and process QM requirements */
391- rc = qed_init_qm_info (p_hwfn );
398+ rc = qed_init_qm_info (p_hwfn , true );
392399 if (rc )
393400 goto alloc_err ;
394401
@@ -581,7 +588,14 @@ static void qed_calc_hw_mode(struct qed_hwfn *p_hwfn)
581588
582589 hw_mode |= 1 << MODE_ASIC ;
583590
591+ if (p_hwfn -> cdev -> num_hwfns > 1 )
592+ hw_mode |= 1 << MODE_100G ;
593+
584594 p_hwfn -> hw_info .hw_mode = hw_mode ;
595+
596+ DP_VERBOSE (p_hwfn , (NETIF_MSG_PROBE | NETIF_MSG_IFUP ),
597+ "Configuring function for hw_mode: 0x%08x\n" ,
598+ p_hwfn -> hw_info .hw_mode );
585599}
586600
587601/* Init run time data for all PFs on an engine. */
@@ -821,6 +835,11 @@ int qed_hw_init(struct qed_dev *cdev,
821835 u32 load_code , param ;
822836 int rc , mfw_rc , i ;
823837
838+ if ((int_mode == QED_INT_MODE_MSI ) && (cdev -> num_hwfns > 1 )) {
839+ DP_NOTICE (cdev , "MSI mode is not supported for CMT devices\n" );
840+ return - EINVAL ;
841+ }
842+
824843 if (IS_PF (cdev )) {
825844 rc = qed_init_fw_data (cdev , bin_fw_data );
826845 if (rc != 0 )
@@ -2086,6 +2105,13 @@ void qed_configure_vp_wfq_on_link_change(struct qed_dev *cdev, u32 min_pf_rate)
20862105{
20872106 int i ;
20882107
2108+ if (cdev -> num_hwfns > 1 ) {
2109+ DP_VERBOSE (cdev ,
2110+ NETIF_MSG_LINK ,
2111+ "WFQ configuration is not supported for this device\n" );
2112+ return ;
2113+ }
2114+
20892115 for_each_hwfn (cdev , i ) {
20902116 struct qed_hwfn * p_hwfn = & cdev -> hwfns [i ];
20912117
0 commit comments