Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 206785
b: refs/heads/master
c: fd8c8d4
h: refs/heads/master
i:
  206783: 0226ca6
v: v3
  • Loading branch information
Stefan Richter committed Jul 27, 2010
1 parent ca3a47a commit add966c
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 52 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c89db7b8bc88d8288dcfbe7a885b950d2560d564
refs/heads/master: fd8c8d46ca9402c15383d2cf0bc3ee7740de3b62
6 changes: 3 additions & 3 deletions trunk/drivers/firewire/nosy-user.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
74 changes: 26 additions & 48 deletions trunk/drivers/firewire/nosy.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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: */
Expand Down

0 comments on commit add966c

Please sign in to comment.