linux/sound/firewire/lib.c
<<
>>
Prefs
   1/*
   2 * miscellaneous helper functions
   3 *
   4 * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
   5 * Licensed under the terms of the GNU General Public License, version 2.
   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 * snd_fw_transaction - send a request and wait for its completion
  18 * @unit: the driver's unit on the target device
  19 * @tcode: the transaction code
  20 * @offset: the address in the target's address space
  21 * @buffer: input/output data
  22 * @length: length of @buffer
  23 *
  24 * Submits an asynchronous request to the target device, and waits for the
  25 * response.  The node ID and the current generation are derived from @unit.
  26 * On a bus reset or an error, the transaction is retried a few times.
  27 * Returns zero on success, or a negative error code.
  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(); /* node_id vs. generation */
  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
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.