Merge master.kernel.org:/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog
[pandora-kernel.git] / drivers / ieee1394 / iso.c
index 615541b..08bd15d 100644 (file)
@@ -9,8 +9,11 @@
  * directory of the kernel sources for details.
  */
 
-#include <linux/slab.h>
+#include <linux/pci.h>
 #include <linux/sched.h>
+#include <linux/slab.h>
+
+#include "hosts.h"
 #include "iso.h"
 
 void hpsb_iso_stop(struct hpsb_iso *iso)
@@ -36,20 +39,22 @@ void hpsb_iso_shutdown(struct hpsb_iso *iso)
        kfree(iso);
 }
 
-static struct hpsb_iso* hpsb_iso_common_init(struct hpsb_host *host, enum hpsb_iso_type type,
+static struct hpsb_iso *hpsb_iso_common_init(struct hpsb_host *host,
+                                            enum hpsb_iso_type type,
                                             unsigned int data_buf_size,
                                             unsigned int buf_packets,
-                                            int channel,
-                                            int dma_mode,
+                                            int channel, int dma_mode,
                                             int irq_interval,
-                                            void (*callback)(struct hpsb_iso*))
+                                            void (*callback) (struct hpsb_iso
+                                                              *))
 {
        struct hpsb_iso *iso;
        int dma_direction;
 
        /* make sure driver supports the ISO API */
        if (!host->driver->isoctl) {
-               printk(KERN_INFO "ieee1394: host driver '%s' does not support the rawiso API\n",
+               printk(KERN_INFO
+                      "ieee1394: host driver '%s' does not support the rawiso API\n",
                       host->driver->name);
                return NULL;
        }
@@ -59,12 +64,13 @@ static struct hpsb_iso* hpsb_iso_common_init(struct hpsb_host *host, enum hpsb_i
        if (buf_packets < 2)
                buf_packets = 2;
 
-       if ((dma_mode < HPSB_ISO_DMA_DEFAULT) || (dma_mode > HPSB_ISO_DMA_PACKET_PER_BUFFER))
-               dma_mode=HPSB_ISO_DMA_DEFAULT;
+       if ((dma_mode < HPSB_ISO_DMA_DEFAULT)
+           || (dma_mode > HPSB_ISO_DMA_PACKET_PER_BUFFER))
+               dma_mode = HPSB_ISO_DMA_DEFAULT;
 
        if ((irq_interval < 0) || (irq_interval > buf_packets / 4))
-               irq_interval = buf_packets / 4;
-       if (irq_interval == 0)     /* really interrupt for each packet*/
+               irq_interval = buf_packets / 4;
+       if (irq_interval == 0)  /* really interrupt for each packet */
                irq_interval = 1;
 
        if (channel < -1 || channel >= 64)
@@ -76,7 +82,10 @@ static struct hpsb_iso* hpsb_iso_common_init(struct hpsb_host *host, enum hpsb_i
 
        /* allocate and write the struct hpsb_iso */
 
-       iso = kmalloc(sizeof(*iso) + buf_packets * sizeof(struct hpsb_iso_packet_info), GFP_KERNEL);
+       iso =
+           kmalloc(sizeof(*iso) +
+                   buf_packets * sizeof(struct hpsb_iso_packet_info),
+                   GFP_KERNEL);
        if (!iso)
                return NULL;
 
@@ -111,17 +120,18 @@ static struct hpsb_iso* hpsb_iso_common_init(struct hpsb_host *host, enum hpsb_i
        iso->prebuffer = 0;
 
        /* allocate the packet buffer */
-       if (dma_region_alloc(&iso->data_buf, iso->buf_size, host->pdev, dma_direction))
+       if (dma_region_alloc
+           (&iso->data_buf, iso->buf_size, host->pdev, dma_direction))
                goto err;
 
        return iso;
 
-err:
+      err:
        hpsb_iso_shutdown(iso);
        return NULL;
 }
 
-int hpsb_iso_n_ready(struct hpsb_isoiso)
+int hpsb_iso_n_ready(struct hpsb_iso *iso)
 {
        unsigned long flags;
        int val;
@@ -133,18 +143,19 @@ int hpsb_iso_n_ready(struct hpsb_iso* iso)
        return val;
 }
 
-
-struct hpsb_iso* hpsb_iso_xmit_init(struct hpsb_host *host,
+struct hpsb_iso *hpsb_iso_xmit_init(struct hpsb_host *host,
                                    unsigned int data_buf_size,
                                    unsigned int buf_packets,
                                    int channel,
                                    int speed,
                                    int irq_interval,
-                                   void (*callback)(struct hpsb_iso*))
+                                   void (*callback) (struct hpsb_iso *))
 {
        struct hpsb_iso *iso = hpsb_iso_common_init(host, HPSB_ISO_XMIT,
                                                    data_buf_size, buf_packets,
-                                                   channel, HPSB_ISO_DMA_DEFAULT, irq_interval, callback);
+                                                   channel,
+                                                   HPSB_ISO_DMA_DEFAULT,
+                                                   irq_interval, callback);
        if (!iso)
                return NULL;
 
@@ -157,22 +168,23 @@ struct hpsb_iso* hpsb_iso_xmit_init(struct hpsb_host *host,
        iso->flags |= HPSB_ISO_DRIVER_INIT;
        return iso;
 
-err:
+      err:
        hpsb_iso_shutdown(iso);
        return NULL;
 }
 
-struct hpsb_isohpsb_iso_recv_init(struct hpsb_host *host,
+struct hpsb_iso *hpsb_iso_recv_init(struct hpsb_host *host,
                                    unsigned int data_buf_size,
                                    unsigned int buf_packets,
                                    int channel,
                                    int dma_mode,
                                    int irq_interval,
-                                   void (*callback)(struct hpsb_iso*))
+                                   void (*callback) (struct hpsb_iso *))
 {
        struct hpsb_iso *iso = hpsb_iso_common_init(host, HPSB_ISO_RECV,
                                                    data_buf_size, buf_packets,
-                                                   channel, dma_mode, irq_interval, callback);
+                                                   channel, dma_mode,
+                                                   irq_interval, callback);
        if (!iso)
                return NULL;
 
@@ -183,7 +195,7 @@ struct hpsb_iso* hpsb_iso_recv_init(struct hpsb_host *host,
        iso->flags |= HPSB_ISO_DRIVER_INIT;
        return iso;
 
-err:
+      err:
        hpsb_iso_shutdown(iso);
        return NULL;
 }
@@ -197,16 +209,17 @@ int hpsb_iso_recv_listen_channel(struct hpsb_iso *iso, unsigned char channel)
 
 int hpsb_iso_recv_unlisten_channel(struct hpsb_iso *iso, unsigned char channel)
 {
-       if (iso->type != HPSB_ISO_RECV || iso->channel != -1 || channel >= 64)
-               return -EINVAL;
-       return iso->host->driver->isoctl(iso, RECV_UNLISTEN_CHANNEL, channel);
+       if (iso->type != HPSB_ISO_RECV || iso->channel != -1 || channel >= 64)
+               return -EINVAL;
+       return iso->host->driver->isoctl(iso, RECV_UNLISTEN_CHANNEL, channel);
 }
 
 int hpsb_iso_recv_set_channel_mask(struct hpsb_iso *iso, u64 mask)
 {
        if (iso->type != HPSB_ISO_RECV || iso->channel != -1)
                return -EINVAL;
-       return iso->host->driver->isoctl(iso, RECV_SET_CHANNEL_MASK, (unsigned long) &mask);
+       return iso->host->driver->isoctl(iso, RECV_SET_CHANNEL_MASK,
+                                        (unsigned long)&mask);
 }
 
 int hpsb_iso_recv_flush(struct hpsb_iso *iso)
@@ -283,7 +296,9 @@ int hpsb_iso_recv_start(struct hpsb_iso *iso, int cycle, int tag_mask, int sync)
 
        isoctl_args[2] = sync;
 
-       retval = iso->host->driver->isoctl(iso, RECV_START, (unsigned long) &isoctl_args[0]);
+       retval =
+           iso->host->driver->isoctl(iso, RECV_START,
+                                     (unsigned long)&isoctl_args[0]);
        if (retval)
                return retval;
 
@@ -296,7 +311,8 @@ int hpsb_iso_recv_start(struct hpsb_iso *iso, int cycle, int tag_mask, int sync)
 
 static int hpsb_iso_check_offset_len(struct hpsb_iso *iso,
                                     unsigned int offset, unsigned short len,
-                                    unsigned int *out_offset, unsigned short *out_len)
+                                    unsigned int *out_offset,
+                                    unsigned short *out_len)
 {
        if (offset >= iso->buf_size)
                return -EFAULT;
@@ -316,8 +332,8 @@ static int hpsb_iso_check_offset_len(struct hpsb_iso *iso,
        return 0;
 }
 
-
-int hpsb_iso_xmit_queue_packet(struct hpsb_iso *iso, u32 offset, u16 len, u8 tag, u8 sy)
+int hpsb_iso_xmit_queue_packet(struct hpsb_iso *iso, u32 offset, u16 len,
+                              u8 tag, u8 sy)
 {
        struct hpsb_iso_packet_info *info;
        unsigned long flags;
@@ -334,7 +350,8 @@ int hpsb_iso_xmit_queue_packet(struct hpsb_iso *iso, u32 offset, u16 len, u8 tag
        info = &iso->infos[iso->first_packet];
 
        /* check for bogus offset/length */
-       if (hpsb_iso_check_offset_len(iso, offset, len, &info->offset, &info->len))
+       if (hpsb_iso_check_offset_len
+           (iso, offset, len, &info->offset, &info->len))
                return -EFAULT;
 
        info->tag = tag;
@@ -342,13 +359,13 @@ int hpsb_iso_xmit_queue_packet(struct hpsb_iso *iso, u32 offset, u16 len, u8 tag
 
        spin_lock_irqsave(&iso->lock, flags);
 
-       rv = iso->host->driver->isoctl(iso, XMIT_QUEUE, (unsigned long) info);
+       rv = iso->host->driver->isoctl(iso, XMIT_QUEUE, (unsigned long)info);
        if (rv)
                goto out;
 
        /* increment cursors */
-       iso->first_packet = (iso->first_packet+1) % iso->buf_packets;
-       iso->xmit_cycle = (iso->xmit_cycle+1) % 8000;
+       iso->first_packet = (iso->first_packet + 1) % iso->buf_packets;
+       iso->xmit_cycle = (iso->xmit_cycle + 1) % 8000;
        iso->n_ready_packets--;
 
        if (iso->prebuffer != 0) {
@@ -359,7 +376,7 @@ int hpsb_iso_xmit_queue_packet(struct hpsb_iso *iso, u32 offset, u16 len, u8 tag
                }
        }
 
-out:
+      out:
        spin_unlock_irqrestore(&iso->lock, flags);
        return rv;
 }
@@ -369,7 +386,9 @@ int hpsb_iso_xmit_sync(struct hpsb_iso *iso)
        if (iso->type != HPSB_ISO_XMIT)
                return -EINVAL;
 
-       return wait_event_interruptible(iso->waitq, hpsb_iso_n_ready(iso) == iso->buf_packets);
+       return wait_event_interruptible(iso->waitq,
+                                       hpsb_iso_n_ready(iso) ==
+                                       iso->buf_packets);
 }
 
 void hpsb_iso_packet_sent(struct hpsb_iso *iso, int cycle, int error)
@@ -396,7 +415,8 @@ void hpsb_iso_packet_sent(struct hpsb_iso *iso, int cycle, int error)
 }
 
 void hpsb_iso_packet_received(struct hpsb_iso *iso, u32 offset, u16 len,
-                             u16 total_len, u16 cycle, u8 channel, u8 tag, u8 sy)
+                             u16 total_len, u16 cycle, u8 channel, u8 tag,
+                             u8 sy)
 {
        unsigned long flags;
        spin_lock_irqsave(&iso->lock, flags);
@@ -416,7 +436,7 @@ void hpsb_iso_packet_received(struct hpsb_iso *iso, u32 offset, u16 len,
                info->tag = tag;
                info->sy = sy;
 
-               iso->pkt_dma = (iso->pkt_dma+1) % iso->buf_packets;
+               iso->pkt_dma = (iso->pkt_dma + 1) % iso->buf_packets;
                iso->n_ready_packets++;
        }
 
@@ -435,20 +455,21 @@ int hpsb_iso_recv_release_packets(struct hpsb_iso *iso, unsigned int n_packets)
        spin_lock_irqsave(&iso->lock, flags);
        for (i = 0; i < n_packets; i++) {
                rv = iso->host->driver->isoctl(iso, RECV_RELEASE,
-                                              (unsigned long) &iso->infos[iso->first_packet]);
+                                              (unsigned long)&iso->infos[iso->
+                                                                         first_packet]);
                if (rv)
                        break;
 
-               iso->first_packet = (iso->first_packet+1) % iso->buf_packets;
+               iso->first_packet = (iso->first_packet + 1) % iso->buf_packets;
                iso->n_ready_packets--;
 
                /* release memory from packets discarded when queue was full  */
-               if (iso->n_ready_packets == 0) { /* Release only after all prior packets handled */
+               if (iso->n_ready_packets == 0) {        /* Release only after all prior packets handled */
                        if (iso->bytes_discarded != 0) {
                                struct hpsb_iso_packet_info inf;
                                inf.total_len = iso->bytes_discarded;
                                iso->host->driver->isoctl(iso, RECV_RELEASE,
-                                                       (unsigned long) &inf);
+                                                         (unsigned long)&inf);
                                iso->bytes_discarded = 0;
                        }
                }