summary refs log tree commit diff
path: root/drivers/firewire
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firewire')
-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: */