OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [ieee1394/] [iso.h] - Blame information for rev 65

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * IEEE 1394 for Linux
3
 *
4
 * kernel ISO transmission/reception
5
 *
6
 * Copyright (C) 2002 Maas Digital LLC
7
 *
8
 * This code is licensed under the GPL.  See the file COPYING in the root
9
 * directory of the kernel sources for details.
10
 */
11
 
12
#ifndef IEEE1394_ISO_H
13
#define IEEE1394_ISO_H
14
 
15
#include <linux/spinlock_types.h>
16
#include <asm/atomic.h>
17
#include <asm/types.h>
18
 
19
#include "dma.h"
20
 
21
struct hpsb_host;
22
 
23
/* high-level ISO interface */
24
 
25
/*
26
 * This API sends and receives isochronous packets on a large,
27
 * virtually-contiguous kernel memory buffer. The buffer may be mapped
28
 * into a user-space process for zero-copy transmission and reception.
29
 *
30
 * There are no explicit boundaries between packets in the buffer. A
31
 * packet may be transmitted or received at any location. However,
32
 * low-level drivers may impose certain restrictions on alignment or
33
 * size of packets. (e.g. in OHCI no packet may cross a page boundary,
34
 * and packets should be quadlet-aligned)
35
 */
36
 
37
/* Packet descriptor - the API maintains a ring buffer of these packet
38
 * descriptors in kernel memory (hpsb_iso.infos[]).  */
39
struct hpsb_iso_packet_info {
40
        /* offset of data payload relative to the first byte of the buffer */
41
        __u32 offset;
42
 
43
        /* length of the data payload, in bytes (not including the isochronous
44
         * header) */
45
        __u16 len;
46
 
47
        /* (recv only) the cycle number (mod 8000) on which the packet was
48
         * received */
49
        __u16 cycle;
50
 
51
        /* (recv only) channel on which the packet was received */
52
        __u8 channel;
53
 
54
        /* 2-bit 'tag' and 4-bit 'sy' fields of the isochronous header */
55
        __u8 tag;
56
        __u8 sy;
57
 
58
        /* length in bytes of the packet including header/trailer.
59
         * MUST be at structure end, since the first part of this structure is
60
         * also defined in raw1394.h (i.e. struct raw1394_iso_packet_info), is
61
         * copied to userspace and is accessed there through libraw1394. */
62
        __u16 total_len;
63
};
64
 
65
enum hpsb_iso_type { HPSB_ISO_RECV = 0, HPSB_ISO_XMIT = 1 };
66
 
67
/* The mode of the dma when receiving iso data. Must be supported by chip */
68
enum raw1394_iso_dma_recv_mode {
69
        HPSB_ISO_DMA_DEFAULT = -1,
70
        HPSB_ISO_DMA_OLD_ABI = 0,
71
        HPSB_ISO_DMA_BUFFERFILL = 1,
72
        HPSB_ISO_DMA_PACKET_PER_BUFFER = 2
73
};
74
 
75
struct hpsb_iso {
76
        enum hpsb_iso_type type;
77
 
78
        /* pointer to low-level driver and its private data */
79
        struct hpsb_host *host;
80
        void *hostdata;
81
 
82
        /* a function to be called (from interrupt context) after
83
         * outgoing packets have been sent, or incoming packets have
84
         * arrived */
85
        void (*callback)(struct hpsb_iso*);
86
 
87
        /* wait for buffer space */
88
        wait_queue_head_t waitq;
89
 
90
        int speed; /* IEEE1394_SPEED_100, 200, or 400 */
91
        int channel; /* -1 if multichannel */
92
        int dma_mode; /* dma receive mode */
93
 
94
 
95
        /* greatest # of packets between interrupts - controls
96
         * the maximum latency of the buffer */
97
        int irq_interval;
98
 
99
        /* the buffer for packet data payloads */
100
        struct dma_region data_buf;
101
 
102
        /* size of data_buf, in bytes (always a multiple of PAGE_SIZE) */
103
        unsigned int buf_size;
104
 
105
        /* # of packets in the ringbuffer */
106
        unsigned int buf_packets;
107
 
108
        /* protects packet cursors */
109
        spinlock_t lock;
110
 
111
        /* the index of the next packet that will be produced
112
           or consumed by the user */
113
        int first_packet;
114
 
115
        /* the index of the next packet that will be transmitted
116
           or received by the 1394 hardware */
117
        int pkt_dma;
118
 
119
        /* how many packets, starting at first_packet:
120
         * (transmit) are ready to be filled with data
121
         * (receive)  contain received data */
122
        int n_ready_packets;
123
 
124
        /* how many times the buffer has overflowed or underflowed */
125
        atomic_t overflows;
126
 
127
        /* Current number of bytes lost in discarded packets */
128
        int bytes_discarded;
129
 
130
        /* private flags to track initialization progress */
131
#define HPSB_ISO_DRIVER_INIT     (1<<0)
132
#define HPSB_ISO_DRIVER_STARTED  (1<<1)
133
        unsigned int flags;
134
 
135
        /* # of packets left to prebuffer (xmit only) */
136
        int prebuffer;
137
 
138
        /* starting cycle for DMA (xmit only) */
139
        int start_cycle;
140
 
141
        /* cycle at which next packet will be transmitted,
142
         * -1 if not known */
143
        int xmit_cycle;
144
 
145
        /* ringbuffer of packet descriptors in regular kernel memory
146
         * XXX Keep this last, since we use over-allocated memory from
147
         * this entry to fill this field. */
148
        struct hpsb_iso_packet_info *infos;
149
};
150
 
151
/* functions available to high-level drivers (e.g. raw1394) */
152
 
153
struct hpsb_iso* hpsb_iso_xmit_init(struct hpsb_host *host,
154
                                    unsigned int data_buf_size,
155
                                    unsigned int buf_packets,
156
                                    int channel,
157
                                    int speed,
158
                                    int irq_interval,
159
                                    void (*callback)(struct hpsb_iso*));
160
struct hpsb_iso* hpsb_iso_recv_init(struct hpsb_host *host,
161
                                    unsigned int data_buf_size,
162
                                    unsigned int buf_packets,
163
                                    int channel,
164
                                    int dma_mode,
165
                                    int irq_interval,
166
                                    void (*callback)(struct hpsb_iso*));
167
int hpsb_iso_recv_listen_channel(struct hpsb_iso *iso, unsigned char channel);
168
int hpsb_iso_recv_unlisten_channel(struct hpsb_iso *iso, unsigned char channel);
169
int hpsb_iso_recv_set_channel_mask(struct hpsb_iso *iso, u64 mask);
170
int hpsb_iso_xmit_start(struct hpsb_iso *iso, int start_on_cycle,
171
                        int prebuffer);
172
int hpsb_iso_recv_start(struct hpsb_iso *iso, int start_on_cycle,
173
                        int tag_mask, int sync);
174
void hpsb_iso_stop(struct hpsb_iso *iso);
175
void hpsb_iso_shutdown(struct hpsb_iso *iso);
176
int hpsb_iso_xmit_queue_packet(struct hpsb_iso *iso, u32 offset, u16 len,
177
                               u8 tag, u8 sy);
178
int hpsb_iso_xmit_sync(struct hpsb_iso *iso);
179
int hpsb_iso_recv_release_packets(struct hpsb_iso *recv,
180
                                  unsigned int n_packets);
181
int hpsb_iso_recv_flush(struct hpsb_iso *iso);
182
int hpsb_iso_n_ready(struct hpsb_iso *iso);
183
 
184
/* the following are callbacks available to low-level drivers */
185
 
186
void hpsb_iso_packet_sent(struct hpsb_iso *iso, int cycle, int error);
187
void hpsb_iso_packet_received(struct hpsb_iso *iso, u32 offset, u16 len,
188
                              u16 total_len, u16 cycle, u8 channel, u8 tag,
189
                              u8 sy);
190
void hpsb_iso_wake(struct hpsb_iso *iso);
191
 
192
#endif /* IEEE1394_ISO_H */

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.