1
2
3
4
5
6
7
8#include <linux/delay.h>
9#include <linux/device.h>
10#include <linux/firewire.h>
11#include <linux/module.h>
12#include "lib.h"
13
14#define ERROR_RETRY_DELAY_MS 5
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29int snd_fw_transaction(struct fw_unit *unit, int tcode,
30 u64 offset, void *buffer, size_t length)
31{
32 struct fw_device *device = fw_parent_device(unit);
33 int generation, rcode, tries = 0;
34
35 for (;;) {
36 generation = device->generation;
37 smp_rmb();
38 rcode = fw_run_transaction(device->card, tcode,
39 device->node_id, generation,
40 device->max_speed, offset,
41 buffer, length);
42
43 if (rcode == RCODE_COMPLETE)
44 return 0;
45
46 if (rcode_is_permanent_error(rcode) || ++tries >= 3) {
47 dev_err(&unit->device, "transaction failed: %s\n",
48 fw_rcode_string(rcode));
49 return -EIO;
50 }
51
52 msleep(ERROR_RETRY_DELAY_MS);
53 }
54}
55EXPORT_SYMBOL(snd_fw_transaction);
56
57MODULE_DESCRIPTION("FireWire audio helper functions");
58MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
59MODULE_LICENSE("GPL v2");
60