28
28
29
29
static DEFINE_IDA (bnxt_aux_dev_ids );
30
30
31
+ static void bnxt_fill_msix_vecs (struct bnxt * bp , struct bnxt_msix_entry * ent )
32
+ {
33
+ struct bnxt_en_dev * edev = bp -> edev ;
34
+ int num_msix , idx , i ;
35
+
36
+ if (!edev -> ulp_tbl -> msix_requested ) {
37
+ netdev_warn (bp -> dev , "Requested MSI-X vectors insufficient\n" );
38
+ return ;
39
+ }
40
+ num_msix = edev -> ulp_tbl -> msix_requested ;
41
+ idx = edev -> ulp_tbl -> msix_base ;
42
+ for (i = 0 ; i < num_msix ; i ++ ) {
43
+ ent [i ].vector = bp -> irq_tbl [idx + i ].vector ;
44
+ ent [i ].ring_idx = idx + i ;
45
+ if (bp -> flags & BNXT_FLAG_CHIP_P5 ) {
46
+ ent [i ].db_offset = DB_PF_OFFSET_P5 ;
47
+ if (BNXT_VF (bp ))
48
+ ent [i ].db_offset = DB_VF_OFFSET_P5 ;
49
+ } else {
50
+ ent [i ].db_offset = (idx + i ) * 0x80 ;
51
+ }
52
+ }
53
+ }
54
+
31
55
int bnxt_register_dev (struct bnxt_en_dev * edev ,
32
56
struct bnxt_ulp_ops * ulp_ops ,
33
57
void * handle )
@@ -42,17 +66,18 @@ int bnxt_register_dev(struct bnxt_en_dev *edev,
42
66
bp -> cp_nr_rings == max_stat_ctxs )
43
67
return - ENOMEM ;
44
68
45
- ulp = kzalloc ( sizeof ( * ulp ), GFP_KERNEL ) ;
69
+ ulp = edev -> ulp_tbl ;
46
70
if (!ulp )
47
71
return - ENOMEM ;
48
72
49
- edev -> ulp_tbl = ulp ;
50
73
ulp -> handle = handle ;
51
74
rcu_assign_pointer (ulp -> ulp_ops , ulp_ops );
52
75
53
76
if (test_bit (BNXT_STATE_OPEN , & bp -> state ))
54
77
bnxt_hwrm_vnic_cfg (bp , 0 );
55
78
79
+ bnxt_fill_msix_vecs (bp , bp -> edev -> msix_entries );
80
+ edev -> flags |= BNXT_EN_FLAG_MSIX_REQUESTED ;
56
81
return 0 ;
57
82
}
58
83
EXPORT_SYMBOL (bnxt_register_dev );
@@ -66,7 +91,7 @@ void bnxt_unregister_dev(struct bnxt_en_dev *edev)
66
91
67
92
ulp = edev -> ulp_tbl ;
68
93
if (ulp -> msix_requested )
69
- bnxt_free_msix_vecs ( edev ) ;
94
+ edev -> flags &= ~ BNXT_EN_FLAG_MSIX_REQUESTED ;
70
95
71
96
if (ulp -> max_async_event_id )
72
97
bnxt_hwrm_func_drv_rgtr (bp , NULL , 0 , true);
@@ -79,125 +104,17 @@ void bnxt_unregister_dev(struct bnxt_en_dev *edev)
79
104
msleep (100 );
80
105
i ++ ;
81
106
}
82
- kfree (ulp );
83
- edev -> ulp_tbl = NULL ;
84
107
return ;
85
108
}
86
109
EXPORT_SYMBOL (bnxt_unregister_dev );
87
110
88
- static void bnxt_fill_msix_vecs (struct bnxt * bp , struct bnxt_msix_entry * ent )
89
- {
90
- struct bnxt_en_dev * edev = bp -> edev ;
91
- int num_msix , idx , i ;
92
-
93
- num_msix = edev -> ulp_tbl -> msix_requested ;
94
- idx = edev -> ulp_tbl -> msix_base ;
95
- for (i = 0 ; i < num_msix ; i ++ ) {
96
- ent [i ].vector = bp -> irq_tbl [idx + i ].vector ;
97
- ent [i ].ring_idx = idx + i ;
98
- if (bp -> flags & BNXT_FLAG_CHIP_P5 ) {
99
- ent [i ].db_offset = DB_PF_OFFSET_P5 ;
100
- if (BNXT_VF (bp ))
101
- ent [i ].db_offset = DB_VF_OFFSET_P5 ;
102
- } else {
103
- ent [i ].db_offset = (idx + i ) * 0x80 ;
104
- }
105
- }
106
- }
107
-
108
- int bnxt_req_msix_vecs (struct bnxt_en_dev * edev ,
109
- struct bnxt_msix_entry * ent ,
110
- int num_msix )
111
- {
112
- struct net_device * dev = edev -> net ;
113
- struct bnxt * bp = netdev_priv (dev );
114
- struct bnxt_hw_resc * hw_resc ;
115
- int max_idx , max_cp_rings ;
116
- int avail_msix , idx ;
117
- int total_vecs ;
118
- int rc = 0 ;
119
-
120
- if (!(bp -> flags & BNXT_FLAG_USING_MSIX ))
121
- return - ENODEV ;
122
-
123
- if (edev -> ulp_tbl -> msix_requested )
124
- return - EAGAIN ;
125
-
126
- max_cp_rings = bnxt_get_max_func_cp_rings (bp );
127
- avail_msix = bnxt_get_avail_msix (bp , num_msix );
128
- if (!avail_msix )
129
- return - ENOMEM ;
130
- if (avail_msix > num_msix )
131
- avail_msix = num_msix ;
132
-
133
- if (BNXT_NEW_RM (bp )) {
134
- idx = bp -> cp_nr_rings ;
135
- } else {
136
- max_idx = min_t (int , bp -> total_irqs , max_cp_rings );
137
- idx = max_idx - avail_msix ;
138
- }
139
- edev -> ulp_tbl -> msix_base = idx ;
140
- edev -> ulp_tbl -> msix_requested = avail_msix ;
141
- hw_resc = & bp -> hw_resc ;
142
- total_vecs = idx + avail_msix ;
143
- rtnl_lock ();
144
- if (bp -> total_irqs < total_vecs ||
145
- (BNXT_NEW_RM (bp ) && hw_resc -> resv_irqs < total_vecs )) {
146
- if (netif_running (dev )) {
147
- bnxt_close_nic (bp , true, false);
148
- rc = bnxt_open_nic (bp , true, false);
149
- } else {
150
- rc = bnxt_reserve_rings (bp , true);
151
- }
152
- }
153
- rtnl_unlock ();
154
- if (rc ) {
155
- edev -> ulp_tbl -> msix_requested = 0 ;
156
- return - EAGAIN ;
157
- }
158
-
159
- if (BNXT_NEW_RM (bp )) {
160
- int resv_msix ;
161
-
162
- resv_msix = hw_resc -> resv_irqs - bp -> cp_nr_rings ;
163
- avail_msix = min_t (int , resv_msix , avail_msix );
164
- edev -> ulp_tbl -> msix_requested = avail_msix ;
165
- }
166
- bnxt_fill_msix_vecs (bp , ent );
167
- edev -> flags |= BNXT_EN_FLAG_MSIX_REQUESTED ;
168
- return avail_msix ;
169
- }
170
- EXPORT_SYMBOL (bnxt_req_msix_vecs );
171
-
172
- void bnxt_free_msix_vecs (struct bnxt_en_dev * edev )
173
- {
174
- struct net_device * dev = edev -> net ;
175
- struct bnxt * bp = netdev_priv (dev );
176
-
177
- if (!(edev -> flags & BNXT_EN_FLAG_MSIX_REQUESTED ))
178
- return ;
179
-
180
- edev -> ulp_tbl -> msix_requested = 0 ;
181
- edev -> flags &= ~BNXT_EN_FLAG_MSIX_REQUESTED ;
182
- rtnl_lock ();
183
- if (netif_running (dev ) && !(edev -> flags & BNXT_EN_FLAG_ULP_STOPPED )) {
184
- bnxt_close_nic (bp , true, false);
185
- bnxt_open_nic (bp , true, false);
186
- }
187
- rtnl_unlock ();
188
-
189
- return ;
190
- }
191
- EXPORT_SYMBOL (bnxt_free_msix_vecs );
192
-
193
111
int bnxt_get_ulp_msix_num (struct bnxt * bp )
194
112
{
195
- if ( bnxt_ulp_registered ( bp -> edev )) {
196
- struct bnxt_en_dev * edev = bp -> edev ;
113
+ u32 roce_msix = BNXT_VF ( bp ) ?
114
+ BNXT_MAX_VF_ROCE_MSIX : BNXT_MAX_ROCE_MSIX ;
197
115
198
- return edev -> ulp_tbl -> msix_requested ;
199
- }
200
- return 0 ;
116
+ return ((bp -> flags & BNXT_FLAG_ROCE_CAP ) ?
117
+ min_t (u32 , roce_msix , num_online_cpus ()) : 0 );
201
118
}
202
119
203
120
int bnxt_get_ulp_msix_base (struct bnxt * bp )
@@ -402,6 +319,7 @@ static void bnxt_aux_dev_release(struct device *dev)
402
319
container_of (dev , struct bnxt_aux_priv , aux_dev .dev );
403
320
404
321
ida_free (& bnxt_aux_dev_ids , aux_priv -> id );
322
+ kfree (aux_priv -> edev -> ulp_tbl );
405
323
kfree (aux_priv -> edev );
406
324
kfree (aux_priv );
407
325
}
@@ -424,13 +342,16 @@ static void bnxt_set_edev_info(struct bnxt_en_dev *edev, struct bnxt *bp)
424
342
edev -> hw_ring_stats_size = bp -> hw_ring_stats_size ;
425
343
edev -> pf_port_id = bp -> pf .port_id ;
426
344
edev -> en_state = bp -> state ;
345
+
346
+ edev -> ulp_tbl -> msix_requested = bnxt_get_ulp_msix_num (bp );
427
347
}
428
348
429
349
void bnxt_rdma_aux_device_init (struct bnxt * bp )
430
350
{
431
351
struct auxiliary_device * aux_dev ;
432
352
struct bnxt_aux_priv * aux_priv ;
433
353
struct bnxt_en_dev * edev ;
354
+ struct bnxt_ulp * ulp ;
434
355
int rc ;
435
356
436
357
if (!(bp -> flags & BNXT_FLAG_ROCE_CAP ))
@@ -470,6 +391,11 @@ void bnxt_rdma_aux_device_init(struct bnxt *bp)
470
391
if (!edev )
471
392
goto aux_dev_uninit ;
472
393
394
+ ulp = kzalloc (sizeof (* ulp ), GFP_KERNEL );
395
+ if (!ulp )
396
+ goto aux_dev_uninit ;
397
+
398
+ edev -> ulp_tbl = ulp ;
473
399
aux_priv -> edev = edev ;
474
400
bp -> edev = edev ;
475
401
bnxt_set_edev_info (edev , bp );
0 commit comments