// SPDX-License-Identifier: GPL-2.0-only /* * ff-transaction.c - a part of driver for RME Fireface series * * Copyright (c) 2015-2017 Takashi Sakamoto
*/
/* * In Linux FireWire core, when generation is updated with memory * barrier, node id has already been updated. In this module, After * this smp_rmb(), load/store instructions to memory are completed. * Thus, both of generation and node id are available with recent * values. This is a light-serialization solution to handle bus reset * events on IEEE 1394 bus.
*/
generation = fw_dev->generation;
smp_rmb();
fw_send_request(fw_dev->card, &ff->transactions[port], tcode,
fw_dev->node_id, generation, fw_dev->max_speed,
addr, &ff->msg_buf[port], quad_count * 4,
callback, &ff->transactions[port]);
}
err = fw_core_add_address_handler(&ff->async_handler, &midi_msg_region); if (err >= 0) { /* Controllers are allowed to register this region. */ if (ff->async_handler.offset & 0x0000ffffffff) {
fw_core_remove_address_handler(&ff->async_handler);
err = -EAGAIN;
}
}
return err;
}
// Controllers are allowed to register higher 4 bytes of destination address to // receive asynchronous transactions for MIDI messages, while the way to // register lower 4 bytes of address is different depending on protocols. For // details, please refer to comments in protocol implementations. // // This driver expects userspace applications to configure registers for the // lower address because in most cases such registers has the other settings. int snd_ff_transaction_reregister(struct snd_ff *ff)
{ struct fw_card *fw_card = fw_parent_device(ff->unit)->card;
u32 addr;
__le32 reg;
/* * Controllers are allowed to register its node ID and upper 2 byte of * local address to listen asynchronous transactions.
*/
addr = (fw_card->node_id << 16) | (ff->async_handler.offset >> 32);
reg = cpu_to_le32(addr); return snd_fw_transaction(ff->unit, TCODE_WRITE_QUADLET_REQUEST,
ff->spec->midi_high_addr,
®, sizeof(reg), 0);
}
int snd_ff_transaction_register(struct snd_ff *ff)
{ int i, err;
/* * Allocate in Memory Space of IEC 13213, but lower 4 byte in LSB should * be zero due to device specification.
*/ for (i = 0; i < 0xffff; i++) {
err = allocate_own_address(ff, i); if (err != -EBUSY && err != -EAGAIN) break;
} if (err < 0) return err;
err = snd_ff_transaction_reregister(ff); if (err < 0) return err;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.