Rev 3725 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3725 | Rev 5201 | ||
---|---|---|---|
Line 10... | Line 10... | ||
10 | ;; GNU GENERAL PUBLIC LICENSE ;; |
10 | ;; GNU GENERAL PUBLIC LICENSE ;; |
11 | ;; Version 2, June 1991 ;; |
11 | ;; Version 2, June 1991 ;; |
12 | ;; ;; |
12 | ;; ;; |
13 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
13 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 14... | Line 14... | ||
14 | 14 | ||
Line 15... | Line 15... | ||
15 | $Revision: 3725 $ |
15 | $Revision: 5201 $ |
16 | 16 | ||
17 | ; The Queues implemented by these macros form a ring-buffer. |
17 | ; The Queues implemented by these macros form a ring-buffer. |
18 | ; The data to these queue's always looks like this: |
18 | ; The data to these queue's always looks like this: |
Line 26... | Line 26... | ||
26 | struct queue |
26 | struct queue |
Line 27... | Line 27... | ||
27 | 27 | ||
28 | size dd ? ; number of queued packets in this queue |
28 | size dd ? ; number of queued packets in this queue |
29 | w_ptr dd ? ; current writing pointer in queue |
29 | w_ptr dd ? ; current writing pointer in queue |
30 | r_ptr dd ? ; current reading pointer |
- | |
Line 31... | Line 30... | ||
31 | mutex MUTEX |
30 | r_ptr dd ? ; current reading pointer |
Line 32... | Line 31... | ||
32 | 31 | ||
Line 45... | Line 44... | ||
45 | 44 | ||
Line 46... | Line 45... | ||
46 | macro add_to_queue ptr, size, entry_size, failaddr { |
45 | macro add_to_queue ptr, size, entry_size, failaddr { |
Line 47... | Line -... | ||
47 | - | ||
48 | local .ok, .no_wrap |
- | |
49 | 46 | ||
50 | pusha |
- | |
Line 51... | Line 47... | ||
51 | lea ecx, [ptr + queue.mutex] |
47 | local .ok, .no_wrap |
52 | call mutex_lock |
48 | |
Line 53... | Line -... | ||
53 | popa |
- | |
54 | - | ||
55 | cmp [ptr + queue.size], size ; Check if queue isnt full |
49 | spin_lock_irqsave |
56 | jb .ok |
- | |
57 | 50 | ||
Line 58... | Line 51... | ||
58 | pusha |
51 | cmp [ptr + queue.size], size ; Check if queue isnt full |
59 | lea ecx, [ptr + queue.mutex] |
52 | jb .ok |
Line 74... | Line 67... | ||
74 | 67 | ||
75 | sub edi, size*entry_size |
68 | sub edi, size*entry_size |
76 | .no_wrap: |
69 | .no_wrap: |
Line 77... | Line -... | ||
77 | mov [ptr + queue.w_ptr], edi |
- | |
78 | - | ||
79 | pusha |
70 | mov [ptr + queue.w_ptr], edi |
80 | lea ecx, [ptr + queue.mutex] |
- | |
Line 81... | Line 71... | ||
81 | call mutex_unlock |
71 | |
Line 82... | Line 72... | ||
82 | popa |
72 | spin_unlock_irqrestore |
Line 83... | Line 73... | ||
83 | 73 | ||
Line 84... | Line -... | ||
84 | } |
- | |
85 | - | ||
86 | 74 | } |
|
87 | - | ||
Line 88... | Line 75... | ||
88 | macro get_from_queue ptr, size, entry_size, failaddr { |
75 | |
89 | 76 | ||
Line 90... | Line -... | ||
90 | local .ok, .no_wrap |
- | |
91 | - | ||
92 | pusha |
77 | |
93 | lea ecx, [ptr + queue.mutex] |
- | |
94 | call mutex_lock |
78 | macro get_from_queue ptr, size, entry_size, failaddr { |
Line 95... | Line 79... | ||
95 | popa |
79 | |
96 | 80 | local .ok, .no_wrap |
|
Line 120... | Line 104... | ||
120 | .no_wrap: |
104 | .no_wrap: |
121 | mov dword [ptr + queue.r_ptr], esi |
105 | mov dword [ptr + queue.r_ptr], esi |
Line 122... | Line 106... | ||
122 | 106 | ||
Line 123... | Line -... | ||
123 | pop esi |
- | |
124 | - | ||
125 | pusha |
107 | pop esi |
126 | lea ecx, [ptr + queue.mutex] |
- | |
Line 127... | Line 108... | ||
127 | call mutex_unlock |
108 | |
Line 128... | Line 109... | ||
128 | popa |
109 | spin_unlock_irqrestore |
Line 129... | Line 110... | ||
129 | 110 | ||
130 | } |
111 | } |
131 | 112 | ||
132 | macro init_queue ptr { |
113 | macro init_queue ptr { |
Line 133... | Line -... | ||
133 | - | ||
134 | mov [ptr + queue.size] , 0 |
- | |
135 | lea edi, [ptr + sizeof.queue] |
114 | |
136 | mov [ptr + queue.w_ptr], edi |
115 | mov [ptr + queue.size] , 0 |