@@ -323,6 +323,7 @@ void xhci_initialize_ring_info(struct xhci_ring *ring,
323
323
*/
324
324
ring -> num_trbs_free = ring -> num_segs * (TRBS_PER_SEGMENT - 1 ) - 1 ;
325
325
}
326
+ EXPORT_SYMBOL_GPL (xhci_initialize_ring_info );
326
327
327
328
/* Allocate segments and link them for a ring */
328
329
static int xhci_alloc_segments_for_ring (struct xhci_hcd * xhci ,
@@ -1855,17 +1856,46 @@ xhci_free_interrupter(struct xhci_hcd *xhci, struct xhci_interrupter *ir)
1855
1856
kfree (ir );
1856
1857
}
1857
1858
1859
+ void xhci_remove_secondary_interrupter (struct usb_hcd * hcd , struct xhci_interrupter * ir )
1860
+ {
1861
+ struct xhci_hcd * xhci = hcd_to_xhci (hcd );
1862
+ unsigned int intr_num ;
1863
+
1864
+ /* interrupter 0 is primary interrupter, don't touch it */
1865
+ if (!ir || !ir -> intr_num || ir -> intr_num >= xhci -> max_interrupters )
1866
+ xhci_dbg (xhci , "Invalid secondary interrupter, can't remove\n" );
1867
+
1868
+ /* fixme, should we check xhci->interrupter[intr_num] == ir */
1869
+ /* fixme locking */
1870
+
1871
+ spin_lock_irq (& xhci -> lock );
1872
+
1873
+ intr_num = ir -> intr_num ;
1874
+
1875
+ xhci_remove_interrupter (xhci , ir );
1876
+ xhci -> interrupters [intr_num ] = NULL ;
1877
+
1878
+ spin_unlock_irq (& xhci -> lock );
1879
+
1880
+ xhci_free_interrupter (xhci , ir );
1881
+ }
1882
+ EXPORT_SYMBOL_GPL (xhci_remove_secondary_interrupter );
1883
+
1858
1884
void xhci_mem_cleanup (struct xhci_hcd * xhci )
1859
1885
{
1860
1886
struct device * dev = xhci_to_hcd (xhci )-> self .sysdev ;
1861
1887
int i , j , num_ports ;
1862
1888
1863
1889
cancel_delayed_work_sync (& xhci -> cmd_timer );
1864
1890
1865
- xhci_remove_interrupter (xhci , xhci -> interrupter );
1866
- xhci_free_interrupter (xhci , xhci -> interrupter );
1867
- xhci -> interrupter = NULL ;
1868
- xhci_dbg_trace (xhci , trace_xhci_dbg_init , "Freed primary event ring" );
1891
+ for (i = 0 ; i < xhci -> max_interrupters ; i ++ ) {
1892
+ if (xhci -> interrupters [i ]) {
1893
+ xhci_remove_interrupter (xhci , xhci -> interrupters [i ]);
1894
+ xhci_free_interrupter (xhci , xhci -> interrupters [i ]);
1895
+ xhci -> interrupters [i ] = NULL ;
1896
+ }
1897
+ }
1898
+ xhci_dbg_trace (xhci , trace_xhci_dbg_init , "Freed interrupters" );
1869
1899
1870
1900
if (xhci -> cmd_ring )
1871
1901
xhci_ring_free (xhci , xhci -> cmd_ring );
@@ -1935,6 +1965,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
1935
1965
for (i = 0 ; i < xhci -> num_port_caps ; i ++ )
1936
1966
kfree (xhci -> port_caps [i ].psi );
1937
1967
kfree (xhci -> port_caps );
1968
+ kfree (xhci -> interrupters );
1938
1969
xhci -> num_port_caps = 0 ;
1939
1970
1940
1971
xhci -> usb2_rhub .ports = NULL ;
@@ -1943,6 +1974,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
1943
1974
xhci -> rh_bw = NULL ;
1944
1975
xhci -> ext_caps = NULL ;
1945
1976
xhci -> port_caps = NULL ;
1977
+ xhci -> interrupters = NULL ;
1946
1978
1947
1979
xhci -> page_size = 0 ;
1948
1980
xhci -> page_shift = 0 ;
@@ -2248,18 +2280,20 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags)
2248
2280
}
2249
2281
2250
2282
static struct xhci_interrupter *
2251
- xhci_alloc_interrupter (struct xhci_hcd * xhci , gfp_t flags )
2283
+ xhci_alloc_interrupter (struct xhci_hcd * xhci , int segs , gfp_t flags )
2252
2284
{
2253
2285
struct device * dev = xhci_to_hcd (xhci )-> self .sysdev ;
2254
2286
struct xhci_interrupter * ir ;
2255
- unsigned int num_segs ;
2287
+ unsigned int num_segs = segs ;
2256
2288
int ret ;
2257
2289
2258
2290
ir = kzalloc_node (sizeof (* ir ), flags , dev_to_node (dev ));
2259
2291
if (!ir )
2260
2292
return NULL ;
2261
2293
2262
- num_segs = min_t (unsigned int , 1 << HCS_ERST_MAX (xhci -> hcs_params2 ),
2294
+ /* number of ring segments should be greater than 0 */
2295
+ if (segs <= 0 )
2296
+ num_segs = min_t (unsigned int , 1 << HCS_ERST_MAX (xhci -> hcs_params2 ),
2263
2297
ERST_MAX_SEGS );
2264
2298
2265
2299
ir -> event_ring = xhci_ring_alloc (xhci , num_segs , 1 , TYPE_EVENT , 0 ,
@@ -2294,6 +2328,13 @@ xhci_add_interrupter(struct xhci_hcd *xhci, struct xhci_interrupter *ir,
2294
2328
return - EINVAL ;
2295
2329
}
2296
2330
2331
+ if (xhci -> interrupters [intr_num ]) {
2332
+ xhci_warn (xhci , "Interrupter %d\n already set up" , intr_num );
2333
+ return - EINVAL ;
2334
+ }
2335
+
2336
+ xhci -> interrupters [intr_num ] = ir ;
2337
+ ir -> intr_num = intr_num ;
2297
2338
ir -> ir_set = & xhci -> run_regs -> ir_set [intr_num ];
2298
2339
2299
2340
/* set ERST count with the number of entries in the segment table */
@@ -2313,10 +2354,52 @@ xhci_add_interrupter(struct xhci_hcd *xhci, struct xhci_interrupter *ir,
2313
2354
return 0 ;
2314
2355
}
2315
2356
2357
+ struct xhci_interrupter *
2358
+ xhci_create_secondary_interrupter (struct usb_hcd * hcd , int num_seg )
2359
+ {
2360
+ struct xhci_hcd * xhci = hcd_to_xhci (hcd );
2361
+ struct xhci_interrupter * ir ;
2362
+ unsigned int i ;
2363
+ int err = - ENOSPC ;
2364
+
2365
+ if (!xhci -> interrupters || xhci -> max_interrupters <= 1 )
2366
+ return NULL ;
2367
+
2368
+ ir = xhci_alloc_interrupter (xhci , num_seg , GFP_KERNEL );
2369
+ if (!ir )
2370
+ return NULL ;
2371
+
2372
+ spin_lock_irq (& xhci -> lock );
2373
+
2374
+ /* Find available secondary interrupter, interrupter 0 is reserved for primary */
2375
+ for (i = 1 ; i < xhci -> max_interrupters ; i ++ ) {
2376
+ if (xhci -> interrupters [i ] == NULL ) {
2377
+ err = xhci_add_interrupter (xhci , ir , i );
2378
+ break ;
2379
+ }
2380
+ }
2381
+
2382
+ spin_unlock_irq (& xhci -> lock );
2383
+
2384
+ if (err ) {
2385
+ xhci_warn (xhci , "Failed to add secondary interrupter, max interrupters %d\n" ,
2386
+ xhci -> max_interrupters );
2387
+ xhci_free_interrupter (xhci , ir );
2388
+ return NULL ;
2389
+ }
2390
+
2391
+ xhci_dbg (xhci , "Add secondary interrupter %d, max interrupters %d\n" ,
2392
+ i , xhci -> max_interrupters );
2393
+
2394
+ return ir ;
2395
+ }
2396
+ EXPORT_SYMBOL_GPL (xhci_create_secondary_interrupter );
2397
+
2316
2398
int xhci_mem_init (struct xhci_hcd * xhci , gfp_t flags )
2317
2399
{
2318
- dma_addr_t dma ;
2400
+ struct xhci_interrupter * ir ;
2319
2401
struct device * dev = xhci_to_hcd (xhci )-> self .sysdev ;
2402
+ dma_addr_t dma ;
2320
2403
unsigned int val , val2 ;
2321
2404
u64 val_64 ;
2322
2405
u32 page_size , temp ;
@@ -2440,11 +2523,14 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
2440
2523
/* Allocate and set up primary interrupter 0 with an event ring. */
2441
2524
xhci_dbg_trace (xhci , trace_xhci_dbg_init ,
2442
2525
"Allocating primary event ring" );
2443
- xhci -> interrupter = xhci_alloc_interrupter (xhci , flags );
2444
- if (!xhci -> interrupter )
2526
+ xhci -> interrupters = kcalloc_node (xhci -> max_interrupters , sizeof (* xhci -> interrupters ),
2527
+ flags , dev_to_node (dev ));
2528
+
2529
+ ir = xhci_alloc_interrupter (xhci , 0 , flags );
2530
+ if (!ir )
2445
2531
goto fail ;
2446
2532
2447
- if (xhci_add_interrupter (xhci , xhci -> interrupter , 0 ))
2533
+ if (xhci_add_interrupter (xhci , ir , 0 ))
2448
2534
goto fail ;
2449
2535
2450
2536
xhci -> isoc_bei_interval = AVOID_BEI_INTERVAL_MAX ;
0 commit comments