 f30e6d3e41
			
		
	
	
	f30e6d3e41
	
	
	
		
			
			We do not need slab allocations anymore in order to satisfy
streaming DMA mapping constraints, thanks to commit da28947e7e
"firewire: ohci: avoid separate DMA mapping for small AT payloads".
(Besides, the slab-allocated buffers that firewire-core, firewire-sbp2,
and firedtv used to provide for 8-byte write and lock requests were
still not fully portable since they crossed cacheline boundaries or
shared a cacheline with unrelated CPU-accessed data.  snd-firewire-lib
got this aspect right by using an extra kmalloc/ kfree just for the
8-byte transaction buffer.)
This change replaces kmalloc'ed lock transaction scratch buffers in
firewire-core, firedtv, and snd-firewire-lib by local stack allocations.
Perhaps the most notable result of the change is simpler locking because
there is no need to serialize usages of preallocated per-device buffers
anymore.  Also, allocations and deallocations are simpler.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Acked-by: Clemens Ladisch <clemens@ladisch.de>
		
	
			
		
			
				
	
	
		
			38 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef SOUND_FIREWIRE_ISO_RESOURCES_H_INCLUDED
 | |
| #define SOUND_FIREWIRE_ISO_RESOURCES_H_INCLUDED
 | |
| 
 | |
| #include <linux/mutex.h>
 | |
| #include <linux/types.h>
 | |
| 
 | |
| struct fw_unit;
 | |
| 
 | |
| /**
 | |
|  * struct fw_iso_resources - manages channel/bandwidth allocation
 | |
|  * @channels_mask: if the device does not support all channel numbers, set this
 | |
|  *                 bit mask to something else than the default (all ones)
 | |
|  *
 | |
|  * This structure manages (de)allocation of isochronous resources (channel and
 | |
|  * bandwidth) for one isochronous stream.
 | |
|  */
 | |
| struct fw_iso_resources {
 | |
| 	u64 channels_mask;
 | |
| 	/* private: */
 | |
| 	struct fw_unit *unit;
 | |
| 	struct mutex mutex;
 | |
| 	unsigned int channel;
 | |
| 	unsigned int bandwidth; /* in bandwidth units, without overhead */
 | |
| 	unsigned int bandwidth_overhead;
 | |
| 	int generation; /* in which allocation is valid */
 | |
| 	bool allocated;
 | |
| };
 | |
| 
 | |
| int fw_iso_resources_init(struct fw_iso_resources *r,
 | |
| 			  struct fw_unit *unit);
 | |
| void fw_iso_resources_destroy(struct fw_iso_resources *r);
 | |
| 
 | |
| int fw_iso_resources_allocate(struct fw_iso_resources *r,
 | |
| 			      unsigned int max_payload_bytes, int speed);
 | |
| int fw_iso_resources_update(struct fw_iso_resources *r);
 | |
| void fw_iso_resources_free(struct fw_iso_resources *r);
 | |
| 
 | |
| #endif
 |