1 #ifndef SOUND_FIREWIRE_LIB_H_INCLUDED 2 #define SOUND_FIREWIRE_LIB_H_INCLUDED 3 4 #include <linux/firewire-constants.h> 5 #include <linux/types.h> 6 #include <linux/sched.h> 7 #include <sound/rawmidi.h> 8 9 struct fw_unit; 10 11 #define FW_GENERATION_MASK 0x00ff 12 #define FW_FIXED_GENERATION 0x0100 13 #define FW_QUIET 0x0200 14 15 int snd_fw_transaction(struct fw_unit *unit, int tcode, 16 u64 offset, void *buffer, size_t length, 17 unsigned int flags); 18 19 /* returns true if retrying the transaction would not make sense */ 20 static inline bool rcode_is_permanent_error(int rcode) 21 { 22 return rcode == RCODE_TYPE_ERROR || rcode == RCODE_ADDRESS_ERROR; 23 } 24 25 struct snd_fw_async_midi_port; 26 typedef int (*snd_fw_async_midi_port_fill)( 27 struct snd_rawmidi_substream *substream, 28 u8 *buf); 29 30 struct snd_fw_async_midi_port { 31 struct fw_device *parent; 32 struct work_struct work; 33 bool idling; 34 ktime_t next_ktime; 35 bool error; 36 37 u64 addr; 38 struct fw_transaction transaction; 39 40 u8 *buf; 41 unsigned int len; 42 43 struct snd_rawmidi_substream *substream; 44 snd_fw_async_midi_port_fill fill; 45 unsigned int consume_bytes; 46 }; 47 48 int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port, 49 struct fw_unit *unit, u64 addr, unsigned int len, 50 snd_fw_async_midi_port_fill fill); 51 void snd_fw_async_midi_port_destroy(struct snd_fw_async_midi_port *port); 52 53 /** 54 * snd_fw_async_midi_port_run - run transactions for the async MIDI port 55 * @port: the asynchronous MIDI port 56 * @substream: the MIDI substream 57 */ 58 static inline void 59 snd_fw_async_midi_port_run(struct snd_fw_async_midi_port *port, 60 struct snd_rawmidi_substream *substream) 61 { 62 if (!port->error) { 63 port->substream = substream; 64 schedule_work(&port->work); 65 } 66 } 67 68 /** 69 * snd_fw_async_midi_port_finish - finish the asynchronous MIDI port 70 * @port: the asynchronous MIDI port 71 */ 72 static inline void 73 snd_fw_async_midi_port_finish(struct snd_fw_async_midi_port *port) 74 { 75 port->substream = NULL; 76 port->error = false; 77 } 78 79 #endif 80