From 3038e353cfaf548eb94f02b172b9dbe412abd24c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 19 Dec 2006 19:58:27 -0500 Subject: firewire: Add core firewire stack. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 730 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 730 insertions(+) create mode 100644 drivers/firewire/fw-transaction.c (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c new file mode 100644 index 0000000..c3acf74 --- /dev/null +++ b/drivers/firewire/fw-transaction.c @@ -0,0 +1,730 @@ +/* -*- c-basic-offset: 8 -*- + * + * fw-transaction.c - core IEEE1394 transaction logic + * + * Copyright (C) 2004-2006 Kristian Hoegsberg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fw-transaction.h" +#include "fw-topology.h" + +#define header_pri(pri) ((pri) << 0) +#define header_tcode(tcode) ((tcode) << 4) +#define header_retry(retry) ((retry) << 8) +#define header_tlabel(tlabel) ((tlabel) << 10) +#define header_destination(destination) ((destination) << 16) +#define header_source(source) ((source) << 16) +#define header_rcode(rcode) ((rcode) << 12) +#define header_offset_high(offset_high) ((offset_high) << 0) +#define header_data_length(length) ((length) << 16) +#define header_extended_tcode(tcode) ((tcode) << 0) + +#define header_get_tcode(q) (((q) >> 4) & 0x0f) +#define header_get_tlabel(q) (((q) >> 10) & 0x3f) +#define header_get_rcode(q) (((q) >> 4) & 0x0f) +#define header_get_destination(q) (((q) >> 16) & 0xffff) +#define header_get_source(q) (((q) >> 16) & 0xffff) +#define header_get_offset_high(q) (((q) >> 0) & 0xffff) +#define header_get_data_length(q) (((q) >> 16) & 0xffff) +#define header_get_extended_tcode(q) (((q) >> 0) & 0xffff) + +#define phy_config_gap_count(gap_count) (((gap_count) << 16) | (1 << 22)) +#define phy_config_root_id(node_id) (((node_id) << 24) | (1 << 23)) +#define phy_identifier(id) ((id) << 30) + +static void +close_transaction(struct fw_transaction *t, struct fw_card *card, int rcode, + u32 * payload, size_t length) +{ + unsigned long flags; + + spin_lock_irqsave(&card->lock, flags); + card->tlabel_mask &= ~(1 << t->tlabel); + list_del(&t->link); + spin_unlock_irqrestore(&card->lock, flags); + + t->callback(card, rcode, payload, length, t->callback_data); +} + +static void +transmit_complete_callback(struct fw_packet *packet, + struct fw_card *card, int status) +{ + struct fw_transaction *t = + container_of(packet, struct fw_transaction, packet); + + switch (status) { + case ACK_COMPLETE: + close_transaction(t, card, RCODE_COMPLETE, NULL, 0); + break; + case ACK_PENDING: + t->timestamp = packet->timestamp; + break; + case ACK_BUSY_X: + case ACK_BUSY_A: + case ACK_BUSY_B: + close_transaction(t, card, RCODE_BUSY, NULL, 0); + break; + case ACK_DATA_ERROR: + case ACK_TYPE_ERROR: + close_transaction(t, card, RCODE_SEND_ERROR, NULL, 0); + break; + default: + /* FIXME: In this case, status is a negative errno, + * corresponding to an OHCI specific transmit error + * code. We should map that to an RCODE instead of + * just the generic RCODE_SEND_ERROR. */ + close_transaction(t, card, RCODE_SEND_ERROR, NULL, 0); + break; + } +} + +void +fw_fill_packet(struct fw_packet *packet, int tcode, int tlabel, + int node_id, int generation, int speed, + unsigned long long offset, void *payload, size_t length) +{ + int ext_tcode; + + if (tcode > 0x10) { + ext_tcode = tcode - 0x10; + tcode = TCODE_LOCK_REQUEST; + } else + ext_tcode = 0; + + packet->header[0] = + header_retry(RETRY_X) | + header_tlabel(tlabel) | + header_tcode(tcode) | + header_destination(node_id | LOCAL_BUS); + packet->header[1] = + header_offset_high(offset >> 32) | header_source(0); + packet->header[2] = + offset; + + switch (tcode) { + case TCODE_WRITE_QUADLET_REQUEST: + packet->header[3] = *(u32 *)payload; + packet->header_length = 16; + packet->payload_length = 0; + break; + + case TCODE_LOCK_REQUEST: + case TCODE_WRITE_BLOCK_REQUEST: + packet->header[3] = + header_data_length(length) | + header_extended_tcode(ext_tcode); + packet->header_length = 16; + packet->payload = payload; + packet->payload_length = length; + break; + + case TCODE_READ_QUADLET_REQUEST: + packet->header_length = 12; + packet->payload_length = 0; + break; + + case TCODE_READ_BLOCK_REQUEST: + packet->header[3] = + header_data_length(length) | + header_extended_tcode(ext_tcode); + packet->header_length = 16; + packet->payload_length = 0; + break; + } + + packet->speed = speed; + packet->generation = generation; +} + +/** + * This function provides low-level access to the IEEE1394 transaction + * logic. Most C programs would use either fw_read(), fw_write() or + * fw_lock() instead - those function are convenience wrappers for + * this function. The fw_send_request() function is primarily + * provided as a flexible, one-stop entry point for languages bindings + * and protocol bindings. + * + * FIXME: Document this function further, in particular the possible + * values for rcode in the callback. In short, we map ACK_COMPLETE to + * RCODE_COMPLETE, internal errors set errno and set rcode to + * RCODE_SEND_ERROR (which is out of range for standard ieee1394 + * rcodes). All other rcodes are forwarded unchanged. For all + * errors, payload is NULL, length is 0. + * + * Can not expect the callback to be called before the function + * returns, though this does happen in some cases (ACK_COMPLETE and + * errors). + * + * The payload is only used for write requests and must not be freed + * until the callback has been called. + * + * @param card the card from which to send the request + * @param tcode the tcode for this transaction. Do not use + * TCODE_LOCK_REQUEST directly, insted use TCODE_LOCK_MASK_SWAP + * etc. to specify tcode and ext_tcode. + * @param node_id the node_id of the destination node + * @param generation the generation for which node_id is valid + * @param speed the speed to use for sending the request + * @param offset the 48 bit offset on the destination node + * @param payload the data payload for the request subaction + * @param length the length in bytes of the data to read + * @param callback function to be called when the transaction is completed + * @param callback_data pointer to arbitrary data, which will be + * passed to the callback + */ +void +fw_send_request(struct fw_card *card, struct fw_transaction *t, + int tcode, int node_id, int generation, int speed, + unsigned long long offset, + void *payload, size_t length, + fw_transaction_callback_t callback, void *callback_data) +{ + unsigned long flags; + int tlabel; + + /* Bump the flush timer up 100ms first of all so we + * don't race with a flush timer callback. */ + + mod_timer(&card->flush_timer, jiffies + DIV_ROUND_UP(HZ, 10)); + + /* Allocate tlabel from the bitmap and put the transaction on + * the list while holding the card spinlock. */ + + spin_lock_irqsave(&card->lock, flags); + + tlabel = card->current_tlabel; + if (card->tlabel_mask & (1 << tlabel)) { + spin_unlock_irqrestore(&card->lock, flags); + callback(card, RCODE_SEND_ERROR, NULL, 0, callback_data); + return; + } + + card->current_tlabel = (card->current_tlabel + 1) & 0x1f; + card->tlabel_mask |= (1 << tlabel); + + list_add_tail(&t->link, &card->transaction_list); + + spin_unlock_irqrestore(&card->lock, flags); + + /* Initialize rest of transaction, fill out packet and send it. */ + t->node_id = node_id; + t->tlabel = tlabel; + t->callback = callback; + t->callback_data = callback_data; + + fw_fill_packet(&t->packet, tcode, t->tlabel, + node_id, generation, speed, offset, payload, length); + t->packet.callback = transmit_complete_callback; + + card->driver->send_request(card, &t->packet); +} +EXPORT_SYMBOL(fw_send_request); + +static void +transmit_phy_packet_callback(struct fw_packet *packet, + struct fw_card *card, int status) +{ + kfree(packet); +} + +static void send_phy_packet(struct fw_card *card, u32 data, int generation) +{ + struct fw_packet *packet; + + packet = kzalloc(sizeof *packet, GFP_ATOMIC); + if (packet == NULL) + return; + + packet->header[0] = data; + packet->header[1] = ~data; + packet->header_length = 8; + packet->payload_length = 0; + packet->speed = SCODE_100; + packet->generation = generation; + packet->callback = transmit_phy_packet_callback; + + card->driver->send_request(card, packet); +} + +void fw_send_force_root(struct fw_card *card, int node_id, int generation) +{ + u32 q; + + q = phy_identifier(PHY_PACKET_CONFIG) | phy_config_root_id(node_id); + send_phy_packet(card, q, generation); +} + +void fw_flush_transactions(struct fw_card *card) +{ + struct fw_transaction *t, *next; + struct list_head list; + unsigned long flags; + + INIT_LIST_HEAD(&list); + spin_lock_irqsave(&card->lock, flags); + list_splice_init(&card->transaction_list, &list); + card->tlabel_mask = 0; + spin_unlock_irqrestore(&card->lock, flags); + + list_for_each_entry_safe(t, next, &list, link) + t->callback(card, RCODE_CANCELLED, NULL, 0, t->callback_data); +} + +static struct fw_address_handler * +lookup_overlapping_address_handler(struct list_head *list, + unsigned long long offset, size_t length) +{ + struct fw_address_handler *handler; + + list_for_each_entry(handler, list, link) { + if (handler->offset < offset + length && + offset < handler->offset + handler->length) + return handler; + } + + return NULL; +} + +static struct fw_address_handler * +lookup_enclosing_address_handler(struct list_head *list, + unsigned long long offset, size_t length) +{ + struct fw_address_handler *handler; + + list_for_each_entry(handler, list, link) { + if (handler->offset <= offset && + offset + length <= handler->offset + handler->length) + return handler; + } + + return NULL; +} + +static DEFINE_SPINLOCK(address_handler_lock); +static LIST_HEAD(address_handler_list); + +struct fw_address_region fw_low_memory_region = + { 0x000000000000ull, 0x000100000000ull }; +struct fw_address_region fw_high_memory_region = + { 0x000100000000ull, 0xffffe0000000ull }; +struct fw_address_region fw_private_region = + { 0xffffe0000000ull, 0xfffff0000000ull }; +struct fw_address_region fw_csr_region = + { 0xfffff0000000ULL, 0xfffff0000800ull }; +struct fw_address_region fw_unit_space_region = + { 0xfffff0000900ull, 0x1000000000000ull }; + +EXPORT_SYMBOL(fw_low_memory_region); +EXPORT_SYMBOL(fw_high_memory_region); +EXPORT_SYMBOL(fw_private_region); +EXPORT_SYMBOL(fw_csr_region); +EXPORT_SYMBOL(fw_unit_space_region); + +/** + * Allocate a range of addresses in the node space of the OHCI + * controller. When a request is received that falls within the + * specified address range, the specified callback is invoked. The + * parameters passed to the callback give the details of the + * particular request + */ + +int +fw_core_add_address_handler(struct fw_address_handler *handler, + struct fw_address_region *region) +{ + struct fw_address_handler *other; + unsigned long flags; + int ret = -EBUSY; + + spin_lock_irqsave(&address_handler_lock, flags); + + handler->offset = region->start; + while (handler->offset + handler->length <= region->end) { + other = + lookup_overlapping_address_handler(&address_handler_list, + handler->offset, + handler->length); + if (other != NULL) { + handler->offset += other->length; + } else { + list_add_tail(&handler->link, &address_handler_list); + ret = 0; + break; + } + } + + spin_unlock_irqrestore(&address_handler_lock, flags); + + return ret; +} + +EXPORT_SYMBOL(fw_core_add_address_handler); + +/** + * Deallocate a range of addresses allocated with fw_allocate. This + * will call the associated callback one last time with a the special + * tcode TCODE_DEALLOCATE, to let the client destroy the registered + * callback data. For convenience, the callback parameters offset and + * length are set to the start and the length respectively for the + * deallocated region, payload is set to NULL. + */ + +void fw_core_remove_address_handler(struct fw_address_handler *handler) +{ + unsigned long flags; + + spin_lock_irqsave(&address_handler_lock, flags); + list_del(&handler->link); + spin_unlock_irqrestore(&address_handler_lock, flags); +} + +EXPORT_SYMBOL(fw_core_remove_address_handler); + +struct fw_request { + struct fw_packet response; + int ack; + u32 length; + u32 data[0]; +}; + +static void +free_response_callback(struct fw_packet *packet, + struct fw_card *card, int status) +{ + struct fw_request *request; + + request = container_of(packet, struct fw_request, response); + kfree(request); +} + +static void +fw_fill_response(struct fw_packet *response, + u32 *request, u32 *data, size_t length) +{ + int tcode, tlabel, extended_tcode, source, destination; + + tcode = header_get_tcode(request[0]); + tlabel = header_get_tlabel(request[0]); + source = header_get_destination(request[0]); + destination = header_get_source(request[1]); + extended_tcode = header_get_extended_tcode(request[3]); + + response->header[0] = + header_retry(RETRY_1) | + header_tlabel(tlabel) | + header_destination(destination); + response->header[1] = header_source(source); + response->header[2] = 0; + + switch (tcode) { + case TCODE_WRITE_QUADLET_REQUEST: + case TCODE_WRITE_BLOCK_REQUEST: + response->header[0] |= header_tcode(TCODE_WRITE_RESPONSE); + response->header_length = 12; + response->payload_length = 0; + break; + + case TCODE_READ_QUADLET_REQUEST: + response->header[0] |= + header_tcode(TCODE_READ_QUADLET_RESPONSE); + response->header[3] = 0; + response->header_length = 16; + response->payload_length = 0; + break; + + case TCODE_READ_BLOCK_REQUEST: + case TCODE_LOCK_REQUEST: + response->header[0] |= header_tcode(tcode + 2); + response->header[3] = + header_data_length(length) | + header_extended_tcode(extended_tcode); + response->header_length = 16; + response->payload = data; + response->payload_length = length; + break; + + default: + BUG(); + return; + } +} + +static struct fw_request * +allocate_request(u32 *header, int ack, + int speed, int timestamp, int generation) +{ + struct fw_request *request; + u32 *data, length; + int request_tcode; + + request_tcode = header_get_tcode(header[0]); + switch (request_tcode) { + case TCODE_WRITE_QUADLET_REQUEST: + data = &header[3]; + length = 4; + break; + + case TCODE_WRITE_BLOCK_REQUEST: + case TCODE_LOCK_REQUEST: + data = &header[4]; + length = header_get_data_length(header[3]); + break; + + case TCODE_READ_QUADLET_REQUEST: + data = NULL; + length = 4; + break; + + case TCODE_READ_BLOCK_REQUEST: + data = NULL; + length = header_get_data_length(header[3]); + break; + + default: + BUG(); + return NULL; + } + + request = kmalloc(sizeof *request + length, GFP_ATOMIC); + if (request == NULL) + return NULL; + + request->response.speed = speed; + request->response.timestamp = timestamp; + request->response.generation = generation; + request->response.callback = free_response_callback; + request->ack = ack; + request->length = length; + if (data) + memcpy(request->data, data, length); + + fw_fill_response(&request->response, header, request->data, length); + + return request; +} + +void +fw_send_response(struct fw_card *card, struct fw_request *request, int rcode) +{ + int response_tcode; + + /* Broadcast packets are reported as ACK_COMPLETE, so this + * check is sufficient to ensure we don't send response to + * broadcast packets or posted writes. */ + if (request->ack != ACK_PENDING) + return; + + request->response.header[1] |= header_rcode(rcode); + response_tcode = header_get_tcode(request->response.header[0]); + if (rcode != RCODE_COMPLETE) + /* Clear the data_length field. */ + request->response.header[3] &= 0xffff; + else if (response_tcode == TCODE_READ_QUADLET_RESPONSE) + request->response.header[3] = request->data[0]; + + card->driver->send_response(card, &request->response); +} + +EXPORT_SYMBOL(fw_send_response); + +void +fw_core_handle_request(struct fw_card *card, + int speed, int ack, int timestamp, + int generation, u32 length, u32 *header) +{ + struct fw_address_handler *handler; + struct fw_request *request; + unsigned long long offset; + unsigned long flags; + int tcode, destination, source, t; + + if (length > 2048) { + /* FIXME: send error response. */ + return; + } + + if (ack != ACK_PENDING && ack != ACK_COMPLETE) + return; + + t = (timestamp & 0x1fff) + 4000; + if (t >= 8000) + t = (timestamp & ~0x1fff) + 0x2000 + t - 8000; + else + t = (timestamp & ~0x1fff) + t; + + request = allocate_request(header, ack, speed, t, generation); + if (request == NULL) { + /* FIXME: send statically allocated busy packet. */ + return; + } + + offset = + ((unsigned long long) + header_get_offset_high(header[1]) << 32) | header[2]; + tcode = header_get_tcode(header[0]); + destination = header_get_destination(header[0]); + source = header_get_source(header[0]); + + spin_lock_irqsave(&address_handler_lock, flags); + handler = lookup_enclosing_address_handler(&address_handler_list, + offset, request->length); + spin_unlock_irqrestore(&address_handler_lock, flags); + + /* FIXME: lookup the fw_node corresponding to the sender of + * this request and pass that to the address handler instead + * of the node ID. We may also want to move the address + * allocations to fw_node so we only do this callback if the + * upper layers registered it for this node. */ + + if (handler == NULL) + fw_send_response(card, request, RCODE_ADDRESS_ERROR); + else + handler->address_callback(card, request, + tcode, destination, source, + generation, speed, offset, + request->data, request->length, + handler->callback_data); +} + +EXPORT_SYMBOL(fw_core_handle_request); + +void +fw_core_handle_response(struct fw_card *card, + int speed, int ack, int timestamp, + u32 length, u32 *header) +{ + struct fw_transaction *t; + unsigned long flags; + u32 *data; + size_t data_length; + int tcode, tlabel, destination, source, rcode; + + tcode = header_get_tcode(header[0]); + tlabel = header_get_tlabel(header[0]); + destination = header_get_destination(header[0]); + source = header_get_source(header[1]); + rcode = header_get_rcode(header[1]); + + spin_lock_irqsave(&card->lock, flags); + list_for_each_entry(t, &card->transaction_list, link) { + if (t->node_id == source && t->tlabel == tlabel) { + list_del(&t->link); + card->tlabel_mask &= ~(1 << t->tlabel); + break; + } + } + spin_unlock_irqrestore(&card->lock, flags); + + if (&t->link == &card->transaction_list) { + fw_notify("Unsolicited response\n"); + return; + } + + /* FIXME: sanity check packet, is length correct, does tcodes + * and addresses match. */ + + switch (tcode) { + case TCODE_READ_QUADLET_RESPONSE: + data = (u32 *) &header[3]; + data_length = 4; + break; + + case TCODE_WRITE_RESPONSE: + data = NULL; + data_length = 0; + break; + + case TCODE_READ_BLOCK_RESPONSE: + case TCODE_LOCK_RESPONSE: + data = &header[4]; + data_length = header_get_data_length(header[3]); + break; + + default: + /* Should never happen, this is just to shut up gcc. */ + data = NULL; + data_length = 0; + break; + } + + t->callback(card, rcode, data, data_length, t->callback_data); +} + +EXPORT_SYMBOL(fw_core_handle_response); + +MODULE_AUTHOR("Kristian Hoegsberg "); +MODULE_DESCRIPTION("Core IEEE1394 transaction logic"); +MODULE_LICENSE("GPL"); + +static u32 vendor_textual_descriptor_data[] = { + /* textual descriptor leaf () */ + 0x00080000, + 0x00000000, + 0x00000000, + 0x4c696e75, /* L i n u */ + 0x78204669, /* x F i */ + 0x72657769, /* r e w i */ + 0x72652028, /* r e ( */ + 0x4a554a55, /* J U J U */ + 0x29000000, /* ) */ +}; + +static struct fw_descriptor vendor_textual_descriptor = { + .length = ARRAY_SIZE(vendor_textual_descriptor_data), + .key = 0x81000000, + .data = vendor_textual_descriptor_data +}; + +struct bus_type fw_bus_type = { + .name = "fw", +}; + +static int __init fw_core_init(void) +{ + int retval; + + retval = bus_register(&fw_bus_type); + if (retval < 0) + return retval; + + /* Add the vendor textual descriptor. */ + retval = fw_core_add_descriptor(&vendor_textual_descriptor); + BUG_ON(retval < 0); + + return 0; +} + +static void __exit fw_core_cleanup(void) +{ + bus_unregister(&fw_bus_type); +} + +module_init(fw_core_init); +module_exit(fw_core_cleanup); -- cgit v1.1 From 19a15b937b26638933307bb02f7b1801310d6eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 19 Dec 2006 19:58:31 -0500 Subject: firewire: Add device probing and sysfs integration. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index c3acf74..affd420 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -33,6 +33,7 @@ #include "fw-transaction.h" #include "fw-topology.h" +#include "fw-device.h" #define header_pri(pri) ((pri) << 0) #define header_tcode(tcode) ((tcode) << 4) @@ -702,10 +703,6 @@ static struct fw_descriptor vendor_textual_descriptor = { .data = vendor_textual_descriptor_data }; -struct bus_type fw_bus_type = { - .name = "fw", -}; - static int __init fw_core_init(void) { int retval; -- cgit v1.1 From 21ebcd1224d05c8673053e1e93ab9ec7ef3e0b84 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sun, 14 Jan 2007 15:29:07 +0100 Subject: firewire: mark some structs const Instances of struct file_operations and struct fw_card_driver can be qualified as "const". Ditto with struct fw_descriptor.data, struct fw_device_id, and predefined instances of struct fw_address_region, at least in the current implementation. Data qualified as const is placed into the .rodata section which won't be mixed with dirty data. Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index affd420..a72f502 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -331,15 +331,15 @@ lookup_enclosing_address_handler(struct list_head *list, static DEFINE_SPINLOCK(address_handler_lock); static LIST_HEAD(address_handler_list); -struct fw_address_region fw_low_memory_region = +const struct fw_address_region fw_low_memory_region = { 0x000000000000ull, 0x000100000000ull }; -struct fw_address_region fw_high_memory_region = +const struct fw_address_region fw_high_memory_region = { 0x000100000000ull, 0xffffe0000000ull }; -struct fw_address_region fw_private_region = +const struct fw_address_region fw_private_region = { 0xffffe0000000ull, 0xfffff0000000ull }; -struct fw_address_region fw_csr_region = +const struct fw_address_region fw_csr_region = { 0xfffff0000000ULL, 0xfffff0000800ull }; -struct fw_address_region fw_unit_space_region = +const struct fw_address_region fw_unit_space_region = { 0xfffff0000900ull, 0x1000000000000ull }; EXPORT_SYMBOL(fw_low_memory_region); @@ -358,7 +358,7 @@ EXPORT_SYMBOL(fw_unit_space_region); int fw_core_add_address_handler(struct fw_address_handler *handler, - struct fw_address_region *region) + const struct fw_address_region *region) { struct fw_address_handler *other; unsigned long flags; @@ -684,7 +684,7 @@ MODULE_AUTHOR("Kristian Hoegsberg "); MODULE_DESCRIPTION("Core IEEE1394 transaction logic"); MODULE_LICENSE("GPL"); -static u32 vendor_textual_descriptor_data[] = { +static const u32 vendor_textual_descriptor_data[] = { /* textual descriptor leaf () */ 0x00080000, 0x00000000, -- cgit v1.1 From 95688e97cdf7453cde22eaa73cc2ab6b113c1853 Mon Sep 17 00:00:00 2001 From: Adrian Bunk Date: Mon, 22 Jan 2007 19:17:37 +0100 Subject: firewire: cleanups This patch contains the following cleanups: - "extern inline" -> "static inline" - fw-topology.c: make struct fw_node_create static Signed-off-by: Adrian Bunk Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index a72f502..c2473a8 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -106,7 +106,7 @@ transmit_complete_callback(struct fw_packet *packet, } } -void +static void fw_fill_packet(struct fw_packet *packet, int tcode, int tlabel, int node_id, int generation, int speed, unsigned long long offset, void *payload, size_t length) -- cgit v1.1 From 5e20c282184fd5794661b6688883231ff5348abc Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sun, 21 Jan 2007 20:44:09 +0100 Subject: firewire: whitespace adjustments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Richter Signed-off-by: Kristian Høgsberg --- drivers/firewire/fw-transaction.c | 8 -------- 1 file changed, 8 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index c2473a8..79563b2 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -341,7 +341,6 @@ const struct fw_address_region fw_csr_region = { 0xfffff0000000ULL, 0xfffff0000800ull }; const struct fw_address_region fw_unit_space_region = { 0xfffff0000900ull, 0x1000000000000ull }; - EXPORT_SYMBOL(fw_low_memory_region); EXPORT_SYMBOL(fw_high_memory_region); EXPORT_SYMBOL(fw_private_region); @@ -355,7 +354,6 @@ EXPORT_SYMBOL(fw_unit_space_region); * parameters passed to the callback give the details of the * particular request */ - int fw_core_add_address_handler(struct fw_address_handler *handler, const struct fw_address_region *region) @@ -385,7 +383,6 @@ fw_core_add_address_handler(struct fw_address_handler *handler, return ret; } - EXPORT_SYMBOL(fw_core_add_address_handler); /** @@ -396,7 +393,6 @@ EXPORT_SYMBOL(fw_core_add_address_handler); * length are set to the start and the length respectively for the * deallocated region, payload is set to NULL. */ - void fw_core_remove_address_handler(struct fw_address_handler *handler) { unsigned long flags; @@ -405,7 +401,6 @@ void fw_core_remove_address_handler(struct fw_address_handler *handler) list_del(&handler->link); spin_unlock_irqrestore(&address_handler_lock, flags); } - EXPORT_SYMBOL(fw_core_remove_address_handler); struct fw_request { @@ -552,7 +547,6 @@ fw_send_response(struct fw_card *card, struct fw_request *request, int rcode) card->driver->send_response(card, &request->response); } - EXPORT_SYMBOL(fw_send_response); void @@ -613,7 +607,6 @@ fw_core_handle_request(struct fw_card *card, request->data, request->length, handler->callback_data); } - EXPORT_SYMBOL(fw_core_handle_request); void @@ -677,7 +670,6 @@ fw_core_handle_response(struct fw_card *card, t->callback(card, rcode, data, data_length, t->callback_data); } - EXPORT_SYMBOL(fw_core_handle_response); MODULE_AUTHOR("Kristian Hoegsberg "); -- cgit v1.1 From 5af4e5eab30d481f76b89a2167c873dfad960acb Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sun, 21 Jan 2007 20:45:32 +0100 Subject: firewire: comma after last enum item or initializer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Richter Signed-off-by: Kristian Høgsberg --- drivers/firewire/fw-transaction.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 79563b2..4c1275f 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -332,15 +332,15 @@ static DEFINE_SPINLOCK(address_handler_lock); static LIST_HEAD(address_handler_list); const struct fw_address_region fw_low_memory_region = - { 0x000000000000ull, 0x000100000000ull }; + { .start = 0x000000000000ULL, .end = 0x000100000000ULL, }; const struct fw_address_region fw_high_memory_region = - { 0x000100000000ull, 0xffffe0000000ull }; + { .start = 0x000100000000ULL, .end = 0xffffe0000000ULL, }; const struct fw_address_region fw_private_region = - { 0xffffe0000000ull, 0xfffff0000000ull }; + { .start = 0xffffe0000000ULL, .end = 0xfffff0000000ULL, }; const struct fw_address_region fw_csr_region = - { 0xfffff0000000ULL, 0xfffff0000800ull }; + { .start = 0xfffff0000000ULL, .end = 0xfffff0000800ULL, }; const struct fw_address_region fw_unit_space_region = - { 0xfffff0000900ull, 0x1000000000000ull }; + { .start = 0xfffff0000900ULL, .end = 0x1000000000000ULL, }; EXPORT_SYMBOL(fw_low_memory_region); EXPORT_SYMBOL(fw_high_memory_region); EXPORT_SYMBOL(fw_private_region); @@ -692,7 +692,7 @@ static const u32 vendor_textual_descriptor_data[] = { static struct fw_descriptor vendor_textual_descriptor = { .length = ARRAY_SIZE(vendor_textual_descriptor_data), .key = 0x81000000, - .data = vendor_textual_descriptor_data + .data = vendor_textual_descriptor_data, }; static int __init fw_core_init(void) -- cgit v1.1 From 907293d78872ee492ce6a114258dd853ec5082ae Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Tue, 23 Jan 2007 21:11:43 +0100 Subject: firewire: consistent usage of node_id Definitions as per IEEE 1212 and IEEE 1394: Node ID: Concatenation of bus ID and local ID. 16 bits long. Bus ID: Identifies a particular bus within a group of buses interconnected by bus bridges. Local ID: Identifies a particular node on a bus. PHY ID: Local ID of IEEE 1394 nodes. 6 bits long. Never ever use a variable called node_id for anything else than a node ID. Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 4c1275f..439a3e3 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -56,7 +56,7 @@ #define header_get_extended_tcode(q) (((q) >> 0) & 0xffff) #define phy_config_gap_count(gap_count) (((gap_count) << 16) | (1 << 22)) -#define phy_config_root_id(node_id) (((node_id) << 24) | (1 << 23)) +#define phy_config_root_id(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23)) #define phy_identifier(id) ((id) << 30) static void @@ -123,7 +123,7 @@ fw_fill_packet(struct fw_packet *packet, int tcode, int tlabel, header_retry(RETRY_X) | header_tlabel(tlabel) | header_tcode(tcode) | - header_destination(node_id | LOCAL_BUS); + header_destination(node_id); packet->header[1] = header_offset_high(offset >> 32) | header_source(0); packet->header[2] = @@ -190,7 +190,7 @@ fw_fill_packet(struct fw_packet *packet, int tcode, int tlabel, * @param tcode the tcode for this transaction. Do not use * TCODE_LOCK_REQUEST directly, insted use TCODE_LOCK_MASK_SWAP * etc. to specify tcode and ext_tcode. - * @param node_id the node_id of the destination node + * @param node_id the destination node ID (bus ID and PHY ID concatenated) * @param generation the generation for which node_id is valid * @param speed the speed to use for sending the request * @param offset the 48 bit offset on the destination node -- cgit v1.1 From 83db801ce8c644edee49f4364c7ebdfef1657762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Fri, 26 Jan 2007 00:37:50 -0500 Subject: firewire: Implement gap count optimization. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 439a3e3..57ecf95 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -274,11 +274,15 @@ static void send_phy_packet(struct fw_card *card, u32 data, int generation) card->driver->send_request(card, packet); } -void fw_send_force_root(struct fw_card *card, int node_id, int generation) +void fw_send_phy_config(struct fw_card *card, + int node_id, int generation, int gap_count) { u32 q; - q = phy_identifier(PHY_PACKET_CONFIG) | phy_config_root_id(node_id); + q = phy_identifier(PHY_PACKET_CONFIG) | + phy_config_root_id(node_id) | + phy_config_gap_count(gap_count); + send_phy_packet(card, q, generation); } -- cgit v1.1 From 2639a6fb268e1f2a7700fe3d31cbca9b39aa3ad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Fri, 26 Jan 2007 00:37:57 -0500 Subject: firewire: Use struct fw_packet for incoming packets too in controller interface. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 99 +++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 52 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 57ecf95..4ca39f0 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -426,15 +426,15 @@ free_response_callback(struct fw_packet *packet, static void fw_fill_response(struct fw_packet *response, - u32 *request, u32 *data, size_t length) + struct fw_packet *request, void *data) { int tcode, tlabel, extended_tcode, source, destination; - tcode = header_get_tcode(request[0]); - tlabel = header_get_tlabel(request[0]); - source = header_get_destination(request[0]); - destination = header_get_source(request[1]); - extended_tcode = header_get_extended_tcode(request[3]); + tcode = header_get_tcode(request->header[0]); + tlabel = header_get_tlabel(request->header[0]); + source = header_get_destination(request->header[0]); + destination = header_get_source(request->header[1]); + extended_tcode = header_get_extended_tcode(request->header[3]); response->header[0] = header_retry(RETRY_1) | @@ -463,11 +463,11 @@ fw_fill_response(struct fw_packet *response, case TCODE_LOCK_REQUEST: response->header[0] |= header_tcode(tcode + 2); response->header[3] = - header_data_length(length) | + header_data_length(request->payload_length) | header_extended_tcode(extended_tcode); response->header_length = 16; response->payload = data; - response->payload_length = length; + response->payload_length = request->payload_length; break; default: @@ -477,24 +477,23 @@ fw_fill_response(struct fw_packet *response, } static struct fw_request * -allocate_request(u32 *header, int ack, - int speed, int timestamp, int generation) +allocate_request(struct fw_packet *p) { struct fw_request *request; u32 *data, length; - int request_tcode; + int request_tcode, t; - request_tcode = header_get_tcode(header[0]); + request_tcode = header_get_tcode(p->header[0]); switch (request_tcode) { case TCODE_WRITE_QUADLET_REQUEST: - data = &header[3]; + data = &p->header[3]; length = 4; break; case TCODE_WRITE_BLOCK_REQUEST: case TCODE_LOCK_REQUEST: - data = &header[4]; - length = header_get_data_length(header[3]); + data = p->payload; + length = header_get_data_length(p->header[3]); break; case TCODE_READ_QUADLET_REQUEST: @@ -504,7 +503,7 @@ allocate_request(u32 *header, int ack, case TCODE_READ_BLOCK_REQUEST: data = NULL; - length = header_get_data_length(header[3]); + length = header_get_data_length(p->header[3]); break; default: @@ -516,16 +515,22 @@ allocate_request(u32 *header, int ack, if (request == NULL) return NULL; - request->response.speed = speed; - request->response.timestamp = timestamp; - request->response.generation = generation; + t = (p->timestamp & 0x1fff) + 4000; + if (t >= 8000) + t = (p->timestamp & ~0x1fff) + 0x2000 + t - 8000; + else + t = (p->timestamp & ~0x1fff) + t; + + request->response.speed = p->speed; + request->response.timestamp = t; + request->response.generation = p->generation; request->response.callback = free_response_callback; - request->ack = ack; - request->length = length; + request->ack = p->ack; + request->length = p->payload_length; if (data) - memcpy(request->data, data, length); + memcpy(request->data, p->payload, p->payload_length); - fw_fill_response(&request->response, header, request->data, length); + fw_fill_response(&request->response, p, request->data); return request; } @@ -554,31 +559,23 @@ fw_send_response(struct fw_card *card, struct fw_request *request, int rcode) EXPORT_SYMBOL(fw_send_response); void -fw_core_handle_request(struct fw_card *card, - int speed, int ack, int timestamp, - int generation, u32 length, u32 *header) +fw_core_handle_request(struct fw_card *card, struct fw_packet *p) { struct fw_address_handler *handler; struct fw_request *request; unsigned long long offset; unsigned long flags; - int tcode, destination, source, t; + int tcode, destination, source; - if (length > 2048) { + if (p->payload_length > 2048) { /* FIXME: send error response. */ return; } - if (ack != ACK_PENDING && ack != ACK_COMPLETE) + if (p->ack != ACK_PENDING && p->ack != ACK_COMPLETE) return; - t = (timestamp & 0x1fff) + 4000; - if (t >= 8000) - t = (timestamp & ~0x1fff) + 0x2000 + t - 8000; - else - t = (timestamp & ~0x1fff) + t; - - request = allocate_request(header, ack, speed, t, generation); + request = allocate_request(p); if (request == NULL) { /* FIXME: send statically allocated busy packet. */ return; @@ -586,10 +583,10 @@ fw_core_handle_request(struct fw_card *card, offset = ((unsigned long long) - header_get_offset_high(header[1]) << 32) | header[2]; - tcode = header_get_tcode(header[0]); - destination = header_get_destination(header[0]); - source = header_get_source(header[0]); + header_get_offset_high(p->header[1]) << 32) | p->header[2]; + tcode = header_get_tcode(p->header[0]); + destination = header_get_destination(p->header[0]); + source = header_get_source(p->header[0]); spin_lock_irqsave(&address_handler_lock, flags); handler = lookup_enclosing_address_handler(&address_handler_list, @@ -607,16 +604,14 @@ fw_core_handle_request(struct fw_card *card, else handler->address_callback(card, request, tcode, destination, source, - generation, speed, offset, + p->generation, p->speed, offset, request->data, request->length, handler->callback_data); } EXPORT_SYMBOL(fw_core_handle_request); void -fw_core_handle_response(struct fw_card *card, - int speed, int ack, int timestamp, - u32 length, u32 *header) +fw_core_handle_response(struct fw_card *card, struct fw_packet *p) { struct fw_transaction *t; unsigned long flags; @@ -624,11 +619,11 @@ fw_core_handle_response(struct fw_card *card, size_t data_length; int tcode, tlabel, destination, source, rcode; - tcode = header_get_tcode(header[0]); - tlabel = header_get_tlabel(header[0]); - destination = header_get_destination(header[0]); - source = header_get_source(header[1]); - rcode = header_get_rcode(header[1]); + tcode = header_get_tcode(p->header[0]); + tlabel = header_get_tlabel(p->header[0]); + destination = header_get_destination(p->header[0]); + source = header_get_source(p->header[1]); + rcode = header_get_rcode(p->header[1]); spin_lock_irqsave(&card->lock, flags); list_for_each_entry(t, &card->transaction_list, link) { @@ -650,7 +645,7 @@ fw_core_handle_response(struct fw_card *card, switch (tcode) { case TCODE_READ_QUADLET_RESPONSE: - data = (u32 *) &header[3]; + data = (u32 *) &p->header[3]; data_length = 4; break; @@ -661,8 +656,8 @@ fw_core_handle_response(struct fw_card *card, case TCODE_READ_BLOCK_RESPONSE: case TCODE_LOCK_RESPONSE: - data = &header[4]; - data_length = header_get_data_length(header[3]); + data = &p->header[4]; + data_length = header_get_data_length(p->header[3]); break; default: -- cgit v1.1 From 36bfe49d076404fcdf5766098de21724635a1816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Fri, 26 Jan 2007 00:38:13 -0500 Subject: firewire: Clean up response handling. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 54 +++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 4ca39f0..a116ffa 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -107,9 +107,9 @@ transmit_complete_callback(struct fw_packet *packet, } static void -fw_fill_packet(struct fw_packet *packet, int tcode, int tlabel, - int node_id, int generation, int speed, - unsigned long long offset, void *payload, size_t length) +fw_fill_request(struct fw_packet *packet, int tcode, int tlabel, + int node_id, int generation, int speed, + unsigned long long offset, void *payload, size_t length) { int ext_tcode; @@ -240,8 +240,8 @@ fw_send_request(struct fw_card *card, struct fw_transaction *t, t->callback = callback; t->callback_data = callback_data; - fw_fill_packet(&t->packet, tcode, t->tlabel, - node_id, generation, speed, offset, payload, length); + fw_fill_request(&t->packet, tcode, t->tlabel, + node_id, generation, speed, offset, payload, length); t->packet.callback = transmit_complete_callback; card->driver->send_request(card, &t->packet); @@ -409,6 +409,7 @@ EXPORT_SYMBOL(fw_core_remove_address_handler); struct fw_request { struct fw_packet response; + u32 request_header[4]; int ack; u32 length; u32 data[0]; @@ -425,22 +426,24 @@ free_response_callback(struct fw_packet *packet, } static void -fw_fill_response(struct fw_packet *response, - struct fw_packet *request, void *data) +fw_fill_response(struct fw_packet *response, u32 *request_header, + int rcode, void *payload, size_t length) { int tcode, tlabel, extended_tcode, source, destination; - tcode = header_get_tcode(request->header[0]); - tlabel = header_get_tlabel(request->header[0]); - source = header_get_destination(request->header[0]); - destination = header_get_source(request->header[1]); - extended_tcode = header_get_extended_tcode(request->header[3]); + tcode = header_get_tcode(request_header[0]); + tlabel = header_get_tlabel(request_header[0]); + source = header_get_destination(request_header[0]); + destination = header_get_source(request_header[1]); + extended_tcode = header_get_extended_tcode(request_header[3]); response->header[0] = header_retry(RETRY_1) | header_tlabel(tlabel) | header_destination(destination); - response->header[1] = header_source(source); + response->header[1] = + header_source(source) | + header_rcode(rcode); response->header[2] = 0; switch (tcode) { @@ -454,7 +457,7 @@ fw_fill_response(struct fw_packet *response, case TCODE_READ_QUADLET_REQUEST: response->header[0] |= header_tcode(TCODE_READ_QUADLET_RESPONSE); - response->header[3] = 0; + response->header[3] = *(u32 *)payload; response->header_length = 16; response->payload_length = 0; break; @@ -463,11 +466,11 @@ fw_fill_response(struct fw_packet *response, case TCODE_LOCK_REQUEST: response->header[0] |= header_tcode(tcode + 2); response->header[3] = - header_data_length(request->payload_length) | + header_data_length(length) | header_extended_tcode(extended_tcode); response->header_length = 16; - response->payload = data; - response->payload_length = request->payload_length; + response->payload = payload; + response->payload_length = length; break; default: @@ -530,7 +533,7 @@ allocate_request(struct fw_packet *p) if (data) memcpy(request->data, p->payload, p->payload_length); - fw_fill_response(&request->response, p, request->data); + memcpy(request->request_header, p->header, sizeof p->header); return request; } @@ -538,21 +541,18 @@ allocate_request(struct fw_packet *p) void fw_send_response(struct fw_card *card, struct fw_request *request, int rcode) { - int response_tcode; - /* Broadcast packets are reported as ACK_COMPLETE, so this * check is sufficient to ensure we don't send response to * broadcast packets or posted writes. */ if (request->ack != ACK_PENDING) return; - request->response.header[1] |= header_rcode(rcode); - response_tcode = header_get_tcode(request->response.header[0]); - if (rcode != RCODE_COMPLETE) - /* Clear the data_length field. */ - request->response.header[3] &= 0xffff; - else if (response_tcode == TCODE_READ_QUADLET_RESPONSE) - request->response.header[3] = request->data[0]; + if (rcode == RCODE_COMPLETE) + fw_fill_response(&request->response, request->request_header, + rcode, request->data, request->length); + else + fw_fill_response(&request->response, request->request_header, + rcode, NULL, 0); card->driver->send_response(card, &request->response); } -- cgit v1.1 From 93c4cceb963ebb133531e5e3f4f6e2da0d222656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Fri, 26 Jan 2007 00:38:26 -0500 Subject: firewire: Handle access to CSR resources on local node. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index a116ffa..780ed2b 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -425,7 +425,7 @@ free_response_callback(struct fw_packet *packet, kfree(request); } -static void +void fw_fill_response(struct fw_packet *response, u32 *request_header, int rcode, void *payload, size_t length) { @@ -457,7 +457,10 @@ fw_fill_response(struct fw_packet *response, u32 *request_header, case TCODE_READ_QUADLET_REQUEST: response->header[0] |= header_tcode(TCODE_READ_QUADLET_RESPONSE); - response->header[3] = *(u32 *)payload; + if (payload != NULL) + response->header[3] = *(u32 *)payload; + else + response->header[3] = 0; response->header_length = 16; response->payload_length = 0; break; @@ -478,6 +481,7 @@ fw_fill_response(struct fw_packet *response, u32 *request_header, return; } } +EXPORT_SYMBOL(fw_fill_response); static struct fw_request * allocate_request(struct fw_packet *p) @@ -529,9 +533,9 @@ allocate_request(struct fw_packet *p) request->response.generation = p->generation; request->response.callback = free_response_callback; request->ack = p->ack; - request->length = p->payload_length; + request->length = length; if (data) - memcpy(request->data, p->payload, p->payload_length); + memcpy(request->data, p->payload, length); memcpy(request->request_header, p->header, sizeof p->header); @@ -656,7 +660,7 @@ fw_core_handle_response(struct fw_card *card, struct fw_packet *p) case TCODE_READ_BLOCK_RESPONSE: case TCODE_LOCK_RESPONSE: - data = &p->header[4]; + data = p->payload; data_length = header_get_data_length(p->header[3]); break; -- cgit v1.1 From e5f49c3b837ff90c8aec2c6c66c4966080aced06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Fri, 26 Jan 2007 00:38:34 -0500 Subject: firewire: Sanitize send error codes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop the negative errnos and use RCODEs for all error codes in the complete transaction callback. Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 780ed2b..8387c8e 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -93,15 +93,15 @@ transmit_complete_callback(struct fw_packet *packet, close_transaction(t, card, RCODE_BUSY, NULL, 0); break; case ACK_DATA_ERROR: + close_transaction(t, card, RCODE_DATA_ERROR, NULL, 0); + break; case ACK_TYPE_ERROR: - close_transaction(t, card, RCODE_SEND_ERROR, NULL, 0); + close_transaction(t, card, RCODE_TYPE_ERROR, NULL, 0); break; default: - /* FIXME: In this case, status is a negative errno, - * corresponding to an OHCI specific transmit error - * code. We should map that to an RCODE instead of - * just the generic RCODE_SEND_ERROR. */ - close_transaction(t, card, RCODE_SEND_ERROR, NULL, 0); + /* In this case the ack is really a juju specific + * rcode, so just forward that to the callback. */ + close_transaction(t, card, status, NULL, 0); break; } } -- cgit v1.1 From 9fc82689bf2920e9b3a8cc1766bcb6ad6454a7c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Fri, 26 Jan 2007 00:38:38 -0500 Subject: firewire: Fix bit shift typo. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 8387c8e..4a48e2d 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -48,7 +48,7 @@ #define header_get_tcode(q) (((q) >> 4) & 0x0f) #define header_get_tlabel(q) (((q) >> 10) & 0x3f) -#define header_get_rcode(q) (((q) >> 4) & 0x0f) +#define header_get_rcode(q) (((q) >> 12) & 0x0f) #define header_get_destination(q) (((q) >> 16) & 0xffff) #define header_get_source(q) (((q) >> 16) & 0xffff) #define header_get_offset_high(q) (((q) >> 0) & 0xffff) -- cgit v1.1 From 32b46093a076986fa3c6e1dd484791624edf4585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 6 Feb 2007 14:49:30 -0500 Subject: firewire: Rework async receive DMA. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The old DMA program for receiving async packets stops DMA while processing received packets and only expects one packet per interrupt. Stopping DMA can silently drop packets and we need to handle multiple received packets per interrupt. This new version keeps DMA running at all times and just append new pages as buffers fill up, and supports multiple packets per interrupt. Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 4a48e2d..fb3b77e 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -640,7 +640,8 @@ fw_core_handle_response(struct fw_card *card, struct fw_packet *p) spin_unlock_irqrestore(&card->lock, flags); if (&t->link == &card->transaction_list) { - fw_notify("Unsolicited response\n"); + fw_notify("Unsolicited response (source %x, tlabel %x)\n", + source, tlabel); return; } -- cgit v1.1 From 730c32f58ba81b3a4fe6d19c7d9e9829dd96d363 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 6 Feb 2007 14:49:32 -0500 Subject: firewire: Implement proper transaction cancelation. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drivers such as fw-sbp2 had no way to properly cancel in-progress transactions, which could leave a pending transaction or an unset packet in the low-level queues after kfree'ing the containing structure. fw_cancel_transaction() lets drivers cancel a submitted transaction. Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 54 ++++++++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 7 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index fb3b77e..5394569 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -59,20 +59,52 @@ #define phy_config_root_id(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23)) #define phy_identifier(id) ((id) << 30) -static void -close_transaction(struct fw_transaction *t, struct fw_card *card, int rcode, - u32 * payload, size_t length) +static int +close_transaction(struct fw_transaction *transaction, + struct fw_card *card, int rcode, + u32 *payload, size_t length) { + struct fw_transaction *t; unsigned long flags; spin_lock_irqsave(&card->lock, flags); - card->tlabel_mask &= ~(1 << t->tlabel); - list_del(&t->link); + list_for_each_entry(t, &card->transaction_list, link) { + if (t == transaction) { + list_del(&t->link); + card->tlabel_mask &= ~(1 << t->tlabel); + break; + } + } spin_unlock_irqrestore(&card->lock, flags); - t->callback(card, rcode, payload, length, t->callback_data); + if (&t->link != &card->transaction_list) { + t->callback(card, rcode, payload, length, t->callback_data); + return 0; + } + + return -ENOENT; } +/* Only valid for transactions that are potentially pending (ie have + * been sent). */ +int +fw_cancel_transaction(struct fw_card *card, + struct fw_transaction *transaction) +{ + /* Cancel the packet transmission if it's still queued. That + * will call the packet transmission callback which cancels + * the transaction. */ + + if (card->driver->cancel_packet(card, &transaction->packet) == 0) + return 0; + + /* If the request packet has already been sent, we need to see + * if the transaction is still pending and remove it in that case. */ + + return close_transaction(transaction, card, RCODE_CANCELLED, NULL, 0); +} +EXPORT_SYMBOL(fw_cancel_transaction); + static void transmit_complete_callback(struct fw_packet *packet, struct fw_card *card, int status) @@ -162,6 +194,7 @@ fw_fill_request(struct fw_packet *packet, int tcode, int tlabel, packet->speed = speed; packet->generation = generation; + packet->ack = 0; } /** @@ -298,8 +331,14 @@ void fw_flush_transactions(struct fw_card *card) card->tlabel_mask = 0; spin_unlock_irqrestore(&card->lock, flags); - list_for_each_entry_safe(t, next, &list, link) + list_for_each_entry_safe(t, next, &list, link) { + card->driver->cancel_packet(card, &t->packet); + + /* At this point cancel_packet will never call the + * transaction callback, since we just took all the + * transactions out of the list. So do it here.*/ t->callback(card, RCODE_CANCELLED, NULL, 0, t->callback_data); + } } static struct fw_address_handler * @@ -531,6 +570,7 @@ allocate_request(struct fw_packet *p) request->response.speed = p->speed; request->response.timestamp = t; request->response.generation = p->generation; + request->response.ack = 0; request->response.callback = free_response_callback; request->ack = p->ack; request->length = length; -- cgit v1.1 From 6e2e8424d310507fa044649435114217826ed78a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Fri, 16 Feb 2007 17:34:37 -0500 Subject: firewire: Use correct payload pointer when demarshalling incoming requests. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 5394569..abc37fa 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -575,7 +575,7 @@ allocate_request(struct fw_packet *p) request->ack = p->ack; request->length = length; if (data) - memcpy(request->data, p->payload, length); + memcpy(request->data, data, length); memcpy(request->request_header, p->header, sizeof p->header); -- cgit v1.1 From 937f687969f77bfeee5efd71cadfa6f1a813665e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Wed, 7 Mar 2007 12:12:36 -0500 Subject: firewire: Let an fw_descriptor specify a leading immediate key/value pair. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This lets us break out "Juju" as the model name in the config rom. Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index abc37fa..8e2b945 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -720,23 +720,37 @@ MODULE_AUTHOR("Kristian Hoegsberg "); MODULE_DESCRIPTION("Core IEEE1394 transaction logic"); MODULE_LICENSE("GPL"); -static const u32 vendor_textual_descriptor_data[] = { +static const u32 vendor_textual_descriptor[] = { /* textual descriptor leaf () */ - 0x00080000, + 0x00060000, 0x00000000, 0x00000000, 0x4c696e75, /* L i n u */ 0x78204669, /* x F i */ 0x72657769, /* r e w i */ - 0x72652028, /* r e ( */ - 0x4a554a55, /* J U J U */ - 0x29000000, /* ) */ + 0x72650000, /* r e */ }; -static struct fw_descriptor vendor_textual_descriptor = { - .length = ARRAY_SIZE(vendor_textual_descriptor_data), +static const u32 model_textual_descriptor[] = { + /* model descriptor leaf () */ + 0x00030000, + 0x00000000, + 0x00000000, + 0x4a756a75, /* J u j u */ +}; + +static struct fw_descriptor vendor_id_descriptor = { + .length = ARRAY_SIZE(vendor_textual_descriptor), + .immediate = 0x03d00d1e, .key = 0x81000000, - .data = vendor_textual_descriptor_data, + .data = vendor_textual_descriptor, +}; + +static struct fw_descriptor model_id_descriptor = { + .length = ARRAY_SIZE(model_textual_descriptor), + .immediate = 0x17000001, + .key = 0x81000000, + .data = model_textual_descriptor, }; static int __init fw_core_init(void) @@ -748,7 +762,9 @@ static int __init fw_core_init(void) return retval; /* Add the vendor textual descriptor. */ - retval = fw_core_add_descriptor(&vendor_textual_descriptor); + retval = fw_core_add_descriptor(&vendor_id_descriptor); + BUG_ON(retval < 0); + retval = fw_core_add_descriptor(&model_id_descriptor); BUG_ON(retval < 0); return 0; -- cgit v1.1 From a3aca3dabbcf00f2088d472f27755c29acaa992e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Wed, 7 Mar 2007 12:12:44 -0500 Subject: firewire: Switch cdev code over to use register_chrdev and keep a list of devices. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The old mechanism kept a struct cdev for each fw device, but fops->release would reference this struct after the device got freed in some cases. Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 8e2b945..3052698 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -761,6 +761,12 @@ static int __init fw_core_init(void) if (retval < 0) return retval; + fw_cdev_major = register_chrdev(0, "firewire", &fw_device_ops); + if (fw_cdev_major < 0) { + bus_unregister(&fw_bus_type); + return fw_cdev_major; + } + /* Add the vendor textual descriptor. */ retval = fw_core_add_descriptor(&vendor_id_descriptor); BUG_ON(retval < 0); @@ -772,6 +778,7 @@ static int __init fw_core_init(void) static void __exit fw_core_cleanup(void) { + unregister_chrdev(fw_cdev_major, "firewire"); bus_unregister(&fw_bus_type); } -- cgit v1.1 From 473d28c730e2de888c24b226cfe4183868eacde2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Wed, 7 Mar 2007 12:12:55 -0500 Subject: firewire: Implement topology map and fix a couple of loopback bugs. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 52 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 4 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 3052698..38b286ed 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -140,7 +140,7 @@ transmit_complete_callback(struct fw_packet *packet, static void fw_fill_request(struct fw_packet *packet, int tcode, int tlabel, - int node_id, int generation, int speed, + int node_id, int source_id, int generation, int speed, unsigned long long offset, void *payload, size_t length) { int ext_tcode; @@ -157,7 +157,7 @@ fw_fill_request(struct fw_packet *packet, int tcode, int tlabel, header_tcode(tcode) | header_destination(node_id); packet->header[1] = - header_offset_high(offset >> 32) | header_source(0); + header_offset_high(offset >> 32) | header_source(source_id); packet->header[2] = offset; @@ -241,7 +241,7 @@ fw_send_request(struct fw_card *card, struct fw_transaction *t, fw_transaction_callback_t callback, void *callback_data) { unsigned long flags; - int tlabel; + int tlabel, source; /* Bump the flush timer up 100ms first of all so we * don't race with a flush timer callback. */ @@ -253,6 +253,7 @@ fw_send_request(struct fw_card *card, struct fw_transaction *t, spin_lock_irqsave(&card->lock, flags); + source = card->node_id; tlabel = card->current_tlabel; if (card->tlabel_mask & (1 << tlabel)) { spin_unlock_irqrestore(&card->lock, flags); @@ -274,7 +275,8 @@ fw_send_request(struct fw_card *card, struct fw_transaction *t, t->callback_data = callback_data; fw_fill_request(&t->packet, tcode, t->tlabel, - node_id, generation, speed, offset, payload, length); + node_id, source, generation, + speed, offset, payload, length); t->packet.callback = transmit_complete_callback; card->driver->send_request(card, &t->packet); @@ -716,6 +718,44 @@ fw_core_handle_response(struct fw_card *card, struct fw_packet *p) } EXPORT_SYMBOL(fw_core_handle_response); +const struct fw_address_region topology_map_region = + { .start = 0xfffff0001000ull, .end = 0xfffff0001400ull, }; + +static void +handle_topology_map(struct fw_card *card, struct fw_request *request, + int tcode, int destination, int source, + int generation, int speed, + unsigned long long offset, + void *payload, size_t length, void *callback_data) +{ + int i, start, end; + u32 *map; + + if (!TCODE_IS_READ_REQUEST(tcode)) { + fw_send_response(card, request, RCODE_TYPE_ERROR); + return; + } + + if ((offset & 3) > 0 || (length & 3) > 0) { + fw_send_response(card, request, RCODE_ADDRESS_ERROR); + return; + } + + start = (offset - topology_map_region.start) / 4; + end = start + length / 4; + map = payload; + + for (i = 0; i < length / 4; i++) + map[i] = cpu_to_be32(card->topology_map[start + i]); + + fw_send_response(card, request, RCODE_COMPLETE); +} + +static struct fw_address_handler topology_map = { + .length = 0x400, + .address_callback = handle_topology_map, +}; + MODULE_AUTHOR("Kristian Hoegsberg "); MODULE_DESCRIPTION("Core IEEE1394 transaction logic"); MODULE_LICENSE("GPL"); @@ -767,6 +807,10 @@ static int __init fw_core_init(void) return fw_cdev_major; } + retval = fw_core_add_address_handler(&topology_map, + &topology_map_region); + BUG_ON(retval < 0); + /* Add the vendor textual descriptor. */ retval = fw_core_add_descriptor(&vendor_id_descriptor); BUG_ON(retval < 0); -- cgit v1.1 From d60d7f1d5ce83d1be8d79256f711d6a645b7a2fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Wed, 7 Mar 2007 12:12:56 -0500 Subject: firewire: Implement CSR cycle time and bus time registers. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kristian Høgsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 61 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 38b286ed..d36dd51 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -752,10 +752,65 @@ handle_topology_map(struct fw_card *card, struct fw_request *request, } static struct fw_address_handler topology_map = { - .length = 0x400, + .length = 0x200, .address_callback = handle_topology_map, }; +const struct fw_address_region registers_region = + { .start = 0xfffff0000000ull, .end = 0xfffff0000400ull, }; + +static void +handle_registers(struct fw_card *card, struct fw_request *request, + int tcode, int destination, int source, + int generation, int speed, + unsigned long long offset, + void *payload, size_t length, void *callback_data) +{ + int reg = offset - CSR_REGISTER_BASE; + unsigned long long bus_time; + __be32 *data = payload; + + switch (reg) { + case CSR_CYCLE_TIME: + case CSR_BUS_TIME: + if (!TCODE_IS_READ_REQUEST(tcode) || length != 4) { + fw_send_response(card, request, RCODE_TYPE_ERROR); + break; + } + + bus_time = card->driver->get_bus_time(card); + if (reg == CSR_CYCLE_TIME) + *data = cpu_to_be32(bus_time); + else + *data = cpu_to_be32(bus_time >> 25); + fw_send_response(card, request, RCODE_COMPLETE); + break; + + case CSR_BUS_MANAGER_ID: + case CSR_BANDWIDTH_AVAILABLE: + case CSR_CHANNELS_AVAILABLE_HI: + case CSR_CHANNELS_AVAILABLE_LO: + /* FIXME: these are handled by the OHCI hardware and + * the stack never sees these request. If we add + * support for a new type of controller that doesn't + * handle this in hardware we need to deal with these + * transactions. */ + BUG(); + break; + + case CSR_BUSY_TIMEOUT: + /* FIXME: Implement this. */ + default: + fw_send_response(card, request, RCODE_ADDRESS_ERROR); + break; + } +} + +static struct fw_address_handler registers = { + .length = 0x400, + .address_callback = handle_registers, +}; + MODULE_AUTHOR("Kristian Hoegsberg "); MODULE_DESCRIPTION("Core IEEE1394 transaction logic"); MODULE_LICENSE("GPL"); @@ -811,6 +866,10 @@ static int __init fw_core_init(void) &topology_map_region); BUG_ON(retval < 0); + retval = fw_core_add_address_handler(®isters, + ®isters_region); + BUG_ON(retval < 0); + /* Add the vendor textual descriptor. */ retval = fw_core_add_descriptor(&vendor_id_descriptor); BUG_ON(retval < 0); -- cgit v1.1 From c781c06d119d04601727f2fbc30151e6760d536d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Mon, 7 May 2007 20:33:32 -0400 Subject: firewire: Clean up comment style. Drop filenames from file preamble, drop editor annotations and use standard indent style for block comments. Signed-off-by: Kristian Hoegsberg Signed-off-by: Stefan Richter (fixed typo) --- drivers/firewire/fw-transaction.c | 71 +++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 25 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index d36dd51..e4355de 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -1,6 +1,5 @@ -/* -*- c-basic-offset: 8 -*- - * - * fw-transaction.c - core IEEE1394 transaction logic +/* + * Core IEEE1394 transaction logic * * Copyright (C) 2004-2006 Kristian Hoegsberg * @@ -85,21 +84,27 @@ close_transaction(struct fw_transaction *transaction, return -ENOENT; } -/* Only valid for transactions that are potentially pending (ie have - * been sent). */ +/* + * Only valid for transactions that are potentially pending (ie have + * been sent). + */ int fw_cancel_transaction(struct fw_card *card, struct fw_transaction *transaction) { - /* Cancel the packet transmission if it's still queued. That + /* + * Cancel the packet transmission if it's still queued. That * will call the packet transmission callback which cancels - * the transaction. */ + * the transaction. + */ if (card->driver->cancel_packet(card, &transaction->packet) == 0) return 0; - /* If the request packet has already been sent, we need to see - * if the transaction is still pending and remove it in that case. */ + /* + * If the request packet has already been sent, we need to see + * if the transaction is still pending and remove it in that case. + */ return close_transaction(transaction, card, RCODE_CANCELLED, NULL, 0); } @@ -131,8 +136,10 @@ transmit_complete_callback(struct fw_packet *packet, close_transaction(t, card, RCODE_TYPE_ERROR, NULL, 0); break; default: - /* In this case the ack is really a juju specific - * rcode, so just forward that to the callback. */ + /* + * In this case the ack is really a juju specific + * rcode, so just forward that to the callback. + */ close_transaction(t, card, status, NULL, 0); break; } @@ -243,13 +250,17 @@ fw_send_request(struct fw_card *card, struct fw_transaction *t, unsigned long flags; int tlabel, source; - /* Bump the flush timer up 100ms first of all so we - * don't race with a flush timer callback. */ + /* + * Bump the flush timer up 100ms first of all so we + * don't race with a flush timer callback. + */ mod_timer(&card->flush_timer, jiffies + DIV_ROUND_UP(HZ, 10)); - /* Allocate tlabel from the bitmap and put the transaction on - * the list while holding the card spinlock. */ + /* + * Allocate tlabel from the bitmap and put the transaction on + * the list while holding the card spinlock. + */ spin_lock_irqsave(&card->lock, flags); @@ -336,9 +347,11 @@ void fw_flush_transactions(struct fw_card *card) list_for_each_entry_safe(t, next, &list, link) { card->driver->cancel_packet(card, &t->packet); - /* At this point cancel_packet will never call the + /* + * At this point cancel_packet will never call the * transaction callback, since we just took all the - * transactions out of the list. So do it here.*/ + * transactions out of the list. So do it here. + */ t->callback(card, RCODE_CANCELLED, NULL, 0, t->callback_data); } } @@ -587,9 +600,11 @@ allocate_request(struct fw_packet *p) void fw_send_response(struct fw_card *card, struct fw_request *request, int rcode) { - /* Broadcast packets are reported as ACK_COMPLETE, so this + /* + * Broadcast packets are reported as ACK_COMPLETE, so this * check is sufficient to ensure we don't send response to - * broadcast packets or posted writes. */ + * broadcast packets or posted writes. + */ if (request->ack != ACK_PENDING) return; @@ -639,11 +654,13 @@ fw_core_handle_request(struct fw_card *card, struct fw_packet *p) offset, request->length); spin_unlock_irqrestore(&address_handler_lock, flags); - /* FIXME: lookup the fw_node corresponding to the sender of + /* + * FIXME: lookup the fw_node corresponding to the sender of * this request and pass that to the address handler instead * of the node ID. We may also want to move the address * allocations to fw_node so we only do this callback if the - * upper layers registered it for this node. */ + * upper layers registered it for this node. + */ if (handler == NULL) fw_send_response(card, request, RCODE_ADDRESS_ERROR); @@ -687,8 +704,10 @@ fw_core_handle_response(struct fw_card *card, struct fw_packet *p) return; } - /* FIXME: sanity check packet, is length correct, does tcodes - * and addresses match. */ + /* + * FIXME: sanity check packet, is length correct, does tcodes + * and addresses match. + */ switch (tcode) { case TCODE_READ_QUADLET_RESPONSE: @@ -790,11 +809,13 @@ handle_registers(struct fw_card *card, struct fw_request *request, case CSR_BANDWIDTH_AVAILABLE: case CSR_CHANNELS_AVAILABLE_HI: case CSR_CHANNELS_AVAILABLE_LO: - /* FIXME: these are handled by the OHCI hardware and + /* + * FIXME: these are handled by the OHCI hardware and * the stack never sees these request. If we add * support for a new type of controller that doesn't * handle this in hardware we need to deal with these - * transactions. */ + * transactions. + */ BUG(); break; -- cgit v1.1 From a77754a75d58d534fd34a5add8ac1bb91d4ffc0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Mon, 7 May 2007 20:33:35 -0400 Subject: firewire: Uppercase most macro names. Signed-off-by: Kristian Hoegsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 126 +++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 63 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index e4355de..01c438f 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -34,29 +34,29 @@ #include "fw-topology.h" #include "fw-device.h" -#define header_pri(pri) ((pri) << 0) -#define header_tcode(tcode) ((tcode) << 4) -#define header_retry(retry) ((retry) << 8) -#define header_tlabel(tlabel) ((tlabel) << 10) -#define header_destination(destination) ((destination) << 16) -#define header_source(source) ((source) << 16) -#define header_rcode(rcode) ((rcode) << 12) -#define header_offset_high(offset_high) ((offset_high) << 0) -#define header_data_length(length) ((length) << 16) -#define header_extended_tcode(tcode) ((tcode) << 0) - -#define header_get_tcode(q) (((q) >> 4) & 0x0f) -#define header_get_tlabel(q) (((q) >> 10) & 0x3f) -#define header_get_rcode(q) (((q) >> 12) & 0x0f) -#define header_get_destination(q) (((q) >> 16) & 0xffff) -#define header_get_source(q) (((q) >> 16) & 0xffff) -#define header_get_offset_high(q) (((q) >> 0) & 0xffff) -#define header_get_data_length(q) (((q) >> 16) & 0xffff) -#define header_get_extended_tcode(q) (((q) >> 0) & 0xffff) - -#define phy_config_gap_count(gap_count) (((gap_count) << 16) | (1 << 22)) -#define phy_config_root_id(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23)) -#define phy_identifier(id) ((id) << 30) +#define HEADER_PRI(pri) ((pri) << 0) +#define HEADER_TCODE(tcode) ((tcode) << 4) +#define HEADER_RETRY(retry) ((retry) << 8) +#define HEADER_TLABEL(tlabel) ((tlabel) << 10) +#define HEADER_DESTINATION(destination) ((destination) << 16) +#define HEADER_SOURCE(source) ((source) << 16) +#define HEADER_RCODE(rcode) ((rcode) << 12) +#define HEADER_OFFSET_HIGH(offset_high) ((offset_high) << 0) +#define HEADER_DATA_LENGTH(length) ((length) << 16) +#define HEADER_EXTENDED_TCODE(tcode) ((tcode) << 0) + +#define HEADER_GET_TCODE(q) (((q) >> 4) & 0x0f) +#define HEADER_GET_TLABEL(q) (((q) >> 10) & 0x3f) +#define HEADER_GET_RCODE(q) (((q) >> 12) & 0x0f) +#define HEADER_GET_DESTINATION(q) (((q) >> 16) & 0xffff) +#define HEADER_GET_SOURCE(q) (((q) >> 16) & 0xffff) +#define HEADER_GET_OFFSET_HIGH(q) (((q) >> 0) & 0xffff) +#define HEADER_GET_DATA_LENGTH(q) (((q) >> 16) & 0xffff) +#define HEADER_GET_EXTENDED_TCODE(q) (((q) >> 0) & 0xffff) + +#define PHY_CONFIG_GAP_COUNT(gap_count) (((gap_count) << 16) | (1 << 22)) +#define PHY_CONFIG_ROOT_ID(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23)) +#define PHY_IDENTIFIER(id) ((id) << 30) static int close_transaction(struct fw_transaction *transaction, @@ -159,12 +159,12 @@ fw_fill_request(struct fw_packet *packet, int tcode, int tlabel, ext_tcode = 0; packet->header[0] = - header_retry(RETRY_X) | - header_tlabel(tlabel) | - header_tcode(tcode) | - header_destination(node_id); + HEADER_RETRY(RETRY_X) | + HEADER_TLABEL(tlabel) | + HEADER_TCODE(tcode) | + HEADER_DESTINATION(node_id); packet->header[1] = - header_offset_high(offset >> 32) | header_source(source_id); + HEADER_OFFSET_HIGH(offset >> 32) | HEADER_SOURCE(source_id); packet->header[2] = offset; @@ -178,8 +178,8 @@ fw_fill_request(struct fw_packet *packet, int tcode, int tlabel, case TCODE_LOCK_REQUEST: case TCODE_WRITE_BLOCK_REQUEST: packet->header[3] = - header_data_length(length) | - header_extended_tcode(ext_tcode); + HEADER_DATA_LENGTH(length) | + HEADER_EXTENDED_TCODE(ext_tcode); packet->header_length = 16; packet->payload = payload; packet->payload_length = length; @@ -192,8 +192,8 @@ fw_fill_request(struct fw_packet *packet, int tcode, int tlabel, case TCODE_READ_BLOCK_REQUEST: packet->header[3] = - header_data_length(length) | - header_extended_tcode(ext_tcode); + HEADER_DATA_LENGTH(length) | + HEADER_EXTENDED_TCODE(ext_tcode); packet->header_length = 16; packet->payload_length = 0; break; @@ -325,9 +325,9 @@ void fw_send_phy_config(struct fw_card *card, { u32 q; - q = phy_identifier(PHY_PACKET_CONFIG) | - phy_config_root_id(node_id) | - phy_config_gap_count(gap_count); + q = PHY_IDENTIFIER(PHY_PACKET_CONFIG) | + PHY_CONFIG_ROOT_ID(node_id) | + PHY_CONFIG_GAP_COUNT(gap_count); send_phy_packet(card, q, generation); } @@ -485,32 +485,32 @@ fw_fill_response(struct fw_packet *response, u32 *request_header, { int tcode, tlabel, extended_tcode, source, destination; - tcode = header_get_tcode(request_header[0]); - tlabel = header_get_tlabel(request_header[0]); - source = header_get_destination(request_header[0]); - destination = header_get_source(request_header[1]); - extended_tcode = header_get_extended_tcode(request_header[3]); + tcode = HEADER_GET_TCODE(request_header[0]); + tlabel = HEADER_GET_TLABEL(request_header[0]); + source = HEADER_GET_DESTINATION(request_header[0]); + destination = HEADER_GET_SOURCE(request_header[1]); + extended_tcode = HEADER_GET_EXTENDED_TCODE(request_header[3]); response->header[0] = - header_retry(RETRY_1) | - header_tlabel(tlabel) | - header_destination(destination); + HEADER_RETRY(RETRY_1) | + HEADER_TLABEL(tlabel) | + HEADER_DESTINATION(destination); response->header[1] = - header_source(source) | - header_rcode(rcode); + HEADER_SOURCE(source) | + HEADER_RCODE(rcode); response->header[2] = 0; switch (tcode) { case TCODE_WRITE_QUADLET_REQUEST: case TCODE_WRITE_BLOCK_REQUEST: - response->header[0] |= header_tcode(TCODE_WRITE_RESPONSE); + response->header[0] |= HEADER_TCODE(TCODE_WRITE_RESPONSE); response->header_length = 12; response->payload_length = 0; break; case TCODE_READ_QUADLET_REQUEST: response->header[0] |= - header_tcode(TCODE_READ_QUADLET_RESPONSE); + HEADER_TCODE(TCODE_READ_QUADLET_RESPONSE); if (payload != NULL) response->header[3] = *(u32 *)payload; else @@ -521,10 +521,10 @@ fw_fill_response(struct fw_packet *response, u32 *request_header, case TCODE_READ_BLOCK_REQUEST: case TCODE_LOCK_REQUEST: - response->header[0] |= header_tcode(tcode + 2); + response->header[0] |= HEADER_TCODE(tcode + 2); response->header[3] = - header_data_length(length) | - header_extended_tcode(extended_tcode); + HEADER_DATA_LENGTH(length) | + HEADER_EXTENDED_TCODE(extended_tcode); response->header_length = 16; response->payload = payload; response->payload_length = length; @@ -544,7 +544,7 @@ allocate_request(struct fw_packet *p) u32 *data, length; int request_tcode, t; - request_tcode = header_get_tcode(p->header[0]); + request_tcode = HEADER_GET_TCODE(p->header[0]); switch (request_tcode) { case TCODE_WRITE_QUADLET_REQUEST: data = &p->header[3]; @@ -554,7 +554,7 @@ allocate_request(struct fw_packet *p) case TCODE_WRITE_BLOCK_REQUEST: case TCODE_LOCK_REQUEST: data = p->payload; - length = header_get_data_length(p->header[3]); + length = HEADER_GET_DATA_LENGTH(p->header[3]); break; case TCODE_READ_QUADLET_REQUEST: @@ -564,7 +564,7 @@ allocate_request(struct fw_packet *p) case TCODE_READ_BLOCK_REQUEST: data = NULL; - length = header_get_data_length(p->header[3]); + length = HEADER_GET_DATA_LENGTH(p->header[3]); break; default: @@ -644,10 +644,10 @@ fw_core_handle_request(struct fw_card *card, struct fw_packet *p) offset = ((unsigned long long) - header_get_offset_high(p->header[1]) << 32) | p->header[2]; - tcode = header_get_tcode(p->header[0]); - destination = header_get_destination(p->header[0]); - source = header_get_source(p->header[0]); + HEADER_GET_OFFSET_HIGH(p->header[1]) << 32) | p->header[2]; + tcode = HEADER_GET_TCODE(p->header[0]); + destination = HEADER_GET_DESTINATION(p->header[0]); + source = HEADER_GET_SOURCE(p->header[0]); spin_lock_irqsave(&address_handler_lock, flags); handler = lookup_enclosing_address_handler(&address_handler_list, @@ -682,11 +682,11 @@ fw_core_handle_response(struct fw_card *card, struct fw_packet *p) size_t data_length; int tcode, tlabel, destination, source, rcode; - tcode = header_get_tcode(p->header[0]); - tlabel = header_get_tlabel(p->header[0]); - destination = header_get_destination(p->header[0]); - source = header_get_source(p->header[1]); - rcode = header_get_rcode(p->header[1]); + tcode = HEADER_GET_TCODE(p->header[0]); + tlabel = HEADER_GET_TLABEL(p->header[0]); + destination = HEADER_GET_DESTINATION(p->header[0]); + source = HEADER_GET_SOURCE(p->header[1]); + rcode = HEADER_GET_RCODE(p->header[1]); spin_lock_irqsave(&card->lock, flags); list_for_each_entry(t, &card->transaction_list, link) { @@ -723,7 +723,7 @@ fw_core_handle_response(struct fw_card *card, struct fw_packet *p) case TCODE_READ_BLOCK_RESPONSE: case TCODE_LOCK_RESPONSE: data = p->payload; - data_length = header_get_data_length(p->header[3]); + data_length = HEADER_GET_DATA_LENGTH(p->header[3]); break; default: -- cgit v1.1 From 2d826cc5c791bdc5f5651324c485746be9492be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Wed, 9 May 2007 19:23:14 -0400 Subject: firewire: Always use parens with sizeof. Signed-off-by: Kristian Hoegsberg Signed-off-by: Stefan Richter --- drivers/firewire/fw-transaction.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'drivers/firewire/fw-transaction.c') diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 01c438f..80d0121 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c @@ -305,7 +305,7 @@ static void send_phy_packet(struct fw_card *card, u32 data, int generation) { struct fw_packet *packet; - packet = kzalloc(sizeof *packet, GFP_ATOMIC); + packet = kzalloc(sizeof(*packet), GFP_ATOMIC); if (packet == NULL) return; @@ -572,7 +572,7 @@ allocate_request(struct fw_packet *p) return NULL; } - request = kmalloc(sizeof *request + length, GFP_ATOMIC); + request = kmalloc(sizeof(*request) + length, GFP_ATOMIC); if (request == NULL) return NULL; @@ -592,7 +592,7 @@ allocate_request(struct fw_packet *p) if (data) memcpy(request->data, data, length); - memcpy(request->request_header, p->header, sizeof p->header); + memcpy(request->request_header, p->header, sizeof(p->header)); return request; } -- cgit v1.1