summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/firewire/nosy-user.h6
-rw-r--r--drivers/firewire/nosy.c74
2 files changed, 29 insertions, 51 deletions
diff --git a/drivers/firewire/nosy-user.h b/drivers/firewire/nosy-user.h
index ebef97f4ecf9..e48aa6200c72 100644
--- a/drivers/firewire/nosy-user.h
+++ b/drivers/firewire/nosy-user.h
@@ -17,9 +17,9 @@ struct nosy_stats {
/*
* Format of packets returned from the kernel driver:
*
- * quadlet with timestamp (microseconds)
- * quadlet padded packet data...
- * quadlet with ack
+ * quadlet with timestamp (microseconds, CPU endian)
+ * quadlet-padded packet data... (little endian)
+ * quadlet with ack (little endian)
*/
#endif /* __nosy_user_h */
diff --git a/drivers/firewire/nosy.c b/drivers/firewire/nosy.c
index b8dcaa28e1ad..225e64956823 100644
--- a/drivers/firewire/nosy.c
+++ b/drivers/firewire/nosy.c
@@ -51,33 +51,19 @@
static char driver_name[] = KBUILD_MODNAME;
-struct pcl_status {
- unsigned int transfer_count : 13;
- unsigned int reserved0 : 1;
- unsigned int ack_type : 1;
- unsigned int ack : 4;
- unsigned int rcv_speed : 2;
- unsigned int rcv_dma_channel : 6;
- unsigned int packet_complete : 1;
- unsigned int packet_error : 1;
- unsigned int master_error : 1;
- unsigned int iso_mode : 1;
- unsigned int self_id : 1;
-};
-
/* this is the physical layout of a PCL, its size is 128 bytes */
struct pcl {
- u32 next;
- u32 async_error_next;
- u32 user_data;
- struct pcl_status pcl_status;
- u32 remaining_transfer_count;
- u32 next_data_buffer;
- struct {
- u32 control;
- u32 pointer;
- } buffer[13] __attribute__ ((packed));
-} __attribute__ ((packed));
+ __le32 next;
+ __le32 async_error_next;
+ u32 user_data;
+ __le32 pcl_status;
+ __le32 remaining_transfer_count;
+ __le32 next_data_buffer;
+ struct {
+ __le32 control;
+ __le32 pointer;
+ } buffer[13];
+};
struct packet {
unsigned int length;
@@ -98,7 +84,7 @@ struct pcilynx {
__iomem char *registers;
struct pcl *rcv_start_pcl, *rcv_pcl;
- u32 *rcv_buffer;
+ __le32 *rcv_buffer;
dma_addr_t rcv_start_pcl_bus, rcv_pcl_bus, rcv_buffer_bus;
@@ -426,35 +412,26 @@ static const struct file_operations nosy_ops = {
#define PHY_PACKET_SIZE 12 /* 1 payload, 1 inverse, 1 ack = 3 quadlets */
-struct link_packet {
- unsigned int priority : 4;
- unsigned int tcode : 4;
- unsigned int rt : 2;
- unsigned int tlabel : 6;
- unsigned int destination : 16;
-};
-
static void
packet_irq_handler(struct pcilynx *lynx)
{
struct client *client;
- u32 tcode_mask;
+ u32 tcode_mask, tcode;
size_t length;
- struct link_packet *packet;
struct timeval tv;
/* FIXME: Also report rcv_speed. */
- length = lynx->rcv_pcl->pcl_status.transfer_count;
- packet = (struct link_packet *) &lynx->rcv_buffer[1];
+ length = __le32_to_cpu(lynx->rcv_pcl->pcl_status) & 0x00001fff;
+ tcode = __le32_to_cpu(lynx->rcv_buffer[1]) >> 4 & 0xf;
do_gettimeofday(&tv);
- lynx->rcv_buffer[0] = tv.tv_usec;
+ lynx->rcv_buffer[0] = (__force __le32)tv.tv_usec;
if (length == PHY_PACKET_SIZE)
tcode_mask = 1 << TCODE_PHY_PACKET;
else
- tcode_mask = 1 << packet->tcode;
+ tcode_mask = 1 << tcode;
spin_lock(&lynx->client_list_lock);
@@ -602,21 +579,22 @@ add_card(struct pci_dev *dev, const struct pci_device_id *unused)
ret = -ENOMEM;
goto fail_deallocate;
}
- lynx->rcv_start_pcl->next = lynx->rcv_pcl_bus;
- lynx->rcv_pcl->next = PCL_NEXT_INVALID;
- lynx->rcv_pcl->async_error_next = PCL_NEXT_INVALID;
+ lynx->rcv_start_pcl->next = cpu_to_le32(lynx->rcv_pcl_bus);
+ lynx->rcv_pcl->next = cpu_to_le32(PCL_NEXT_INVALID);
+ lynx->rcv_pcl->async_error_next = cpu_to_le32(PCL_NEXT_INVALID);
lynx->rcv_pcl->buffer[0].control =
- PCL_CMD_RCV | PCL_BIGENDIAN | 2044;
- lynx->rcv_pcl->buffer[0].pointer = lynx->rcv_buffer_bus + 4;
+ cpu_to_le32(PCL_CMD_RCV | PCL_BIGENDIAN | 2044);
+ lynx->rcv_pcl->buffer[0].pointer =
+ cpu_to_le32(lynx->rcv_buffer_bus + 4);
p = lynx->rcv_buffer_bus + 2048;
end = lynx->rcv_buffer_bus + RCV_BUFFER_SIZE;
for (i = 1; p < end; i++, p += 2048) {
lynx->rcv_pcl->buffer[i].control =
- PCL_CMD_RCV | PCL_BIGENDIAN | 2048;
- lynx->rcv_pcl->buffer[i].pointer = p;
+ cpu_to_le32(PCL_CMD_RCV | PCL_BIGENDIAN | 2048);
+ lynx->rcv_pcl->buffer[i].pointer = cpu_to_le32(p);
}
- lynx->rcv_pcl->buffer[i - 1].control |= PCL_LAST_BUFF;
+ lynx->rcv_pcl->buffer[i - 1].control |= cpu_to_le32(PCL_LAST_BUFF);
reg_set_bits(lynx, MISC_CONTROL, MISC_CONTROL_SWRESET);
/* Fix buggy cards with autoboot pin not tied low: */