Magellan Linux

Contents of /trunk/kernel26-magellan-server/patches-2.6.25-r5/0107-2.6.25.8-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 677 - (show annotations) (download)
Wed Sep 10 21:27:27 2008 UTC (16 years, 1 month ago) by niro
File size: 16462 byte(s)
2.6.25-magellan-r5:
- updated to linux-2.6.25.17

1 diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
2 index c8890b8..39b1b7e 100644
3 --- a/arch/x86/kernel/process_32.c
4 +++ b/arch/x86/kernel/process_32.c
5 @@ -259,12 +259,31 @@ static void mwait_idle(void)
6 mwait_idle_with_hints(0, 0);
7 }
8
9 +/*
10 + * mwait selection logic:
11 + *
12 + * It depends on the CPU. For AMD CPUs that support MWAIT this is
13 + * wrong. Family 0x10 and 0x11 CPUs will enter C1 on HLT. Powersavings
14 + * then depend on a clock divisor and current Pstate of the core. If
15 + * all cores of a processor are in halt state (C1) the processor can
16 + * enter the C1E (C1 enhanced) state. If mwait is used this will never
17 + * happen.
18 + *
19 + * idle=mwait overrides this decision and forces the usage of mwait.
20 + */
21 static int __cpuinit mwait_usable(const struct cpuinfo_x86 *c)
22 {
23 if (force_mwait)
24 return 1;
25 - /* Any C1 states supported? */
26 - return c->cpuid_level >= 5 && ((cpuid_edx(5) >> 4) & 0xf) > 0;
27 +
28 + if (c->x86_vendor == X86_VENDOR_AMD) {
29 + switch(c->x86) {
30 + case 0x10:
31 + case 0x11:
32 + return 0;
33 + }
34 + }
35 + return 1;
36 }
37
38 void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
39 diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
40 index 1316f1c..53b9c4c 100644
41 --- a/arch/x86/kernel/process_64.c
42 +++ b/arch/x86/kernel/process_64.c
43 @@ -254,13 +254,31 @@ static void mwait_idle(void)
44 }
45 }
46
47 -
48 +/*
49 + * mwait selection logic:
50 + *
51 + * It depends on the CPU. For AMD CPUs that support MWAIT this is
52 + * wrong. Family 0x10 and 0x11 CPUs will enter C1 on HLT. Powersavings
53 + * then depend on a clock divisor and current Pstate of the core. If
54 + * all cores of a processor are in halt state (C1) the processor can
55 + * enter the C1E (C1 enhanced) state. If mwait is used this will never
56 + * happen.
57 + *
58 + * idle=mwait overrides this decision and forces the usage of mwait.
59 + */
60 static int __cpuinit mwait_usable(const struct cpuinfo_x86 *c)
61 {
62 if (force_mwait)
63 return 1;
64 - /* Any C1 states supported? */
65 - return c->cpuid_level >= 5 && ((cpuid_edx(5) >> 4) & 0xf) > 0;
66 +
67 + if (c->x86_vendor == X86_VENDOR_AMD) {
68 + switch(c->x86) {
69 + case 0x10:
70 + case 0x11:
71 + return 0;
72 + }
73 + }
74 + return 1;
75 }
76
77 void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
78 diff --git a/arch/x86/lib/copy_user_64.S b/arch/x86/lib/copy_user_64.S
79 index 70bebd3..ee1c3f6 100644
80 --- a/arch/x86/lib/copy_user_64.S
81 +++ b/arch/x86/lib/copy_user_64.S
82 @@ -217,19 +217,19 @@ ENTRY(copy_user_generic_unrolled)
83 /* table sorted by exception address */
84 .section __ex_table,"a"
85 .align 8
86 - .quad .Ls1,.Ls1e
87 - .quad .Ls2,.Ls2e
88 - .quad .Ls3,.Ls3e
89 - .quad .Ls4,.Ls4e
90 - .quad .Ld1,.Ls1e
91 + .quad .Ls1,.Ls1e /* Ls1-Ls4 have copied zero bytes */
92 + .quad .Ls2,.Ls1e
93 + .quad .Ls3,.Ls1e
94 + .quad .Ls4,.Ls1e
95 + .quad .Ld1,.Ls1e /* Ld1-Ld4 have copied 0-24 bytes */
96 .quad .Ld2,.Ls2e
97 .quad .Ld3,.Ls3e
98 .quad .Ld4,.Ls4e
99 - .quad .Ls5,.Ls5e
100 - .quad .Ls6,.Ls6e
101 - .quad .Ls7,.Ls7e
102 - .quad .Ls8,.Ls8e
103 - .quad .Ld5,.Ls5e
104 + .quad .Ls5,.Ls5e /* Ls5-Ls8 have copied 32 bytes */
105 + .quad .Ls6,.Ls5e
106 + .quad .Ls7,.Ls5e
107 + .quad .Ls8,.Ls5e
108 + .quad .Ld5,.Ls5e /* Ld5-Ld8 have copied 32-56 bytes */
109 .quad .Ld6,.Ls6e
110 .quad .Ld7,.Ls7e
111 .quad .Ld8,.Ls8e
112 @@ -244,11 +244,8 @@ ENTRY(copy_user_generic_unrolled)
113 .quad .Le5,.Le_zero
114 .previous
115
116 - /* compute 64-offset for main loop. 8 bytes accuracy with error on the
117 - pessimistic side. this is gross. it would be better to fix the
118 - interface. */
119 /* eax: zero, ebx: 64 */
120 -.Ls1e: addl $8,%eax
121 +.Ls1e: addl $8,%eax /* eax is bytes left uncopied within the loop (Ls1e: 64 .. Ls8e: 8) */
122 .Ls2e: addl $8,%eax
123 .Ls3e: addl $8,%eax
124 .Ls4e: addl $8,%eax
125 diff --git a/arch/x86/lib/copy_user_nocache_64.S b/arch/x86/lib/copy_user_nocache_64.S
126 index 5196762..9d3d1ab 100644
127 --- a/arch/x86/lib/copy_user_nocache_64.S
128 +++ b/arch/x86/lib/copy_user_nocache_64.S
129 @@ -145,19 +145,19 @@ ENTRY(__copy_user_nocache)
130 /* table sorted by exception address */
131 .section __ex_table,"a"
132 .align 8
133 - .quad .Ls1,.Ls1e
134 - .quad .Ls2,.Ls2e
135 - .quad .Ls3,.Ls3e
136 - .quad .Ls4,.Ls4e
137 - .quad .Ld1,.Ls1e
138 + .quad .Ls1,.Ls1e /* .Ls[1-4] - 0 bytes copied */
139 + .quad .Ls2,.Ls1e
140 + .quad .Ls3,.Ls1e
141 + .quad .Ls4,.Ls1e
142 + .quad .Ld1,.Ls1e /* .Ld[1-4] - 0..24 bytes coped */
143 .quad .Ld2,.Ls2e
144 .quad .Ld3,.Ls3e
145 .quad .Ld4,.Ls4e
146 - .quad .Ls5,.Ls5e
147 - .quad .Ls6,.Ls6e
148 - .quad .Ls7,.Ls7e
149 - .quad .Ls8,.Ls8e
150 - .quad .Ld5,.Ls5e
151 + .quad .Ls5,.Ls5e /* .Ls[5-8] - 32 bytes copied */
152 + .quad .Ls6,.Ls5e
153 + .quad .Ls7,.Ls5e
154 + .quad .Ls8,.Ls5e
155 + .quad .Ld5,.Ls5e /* .Ld[5-8] - 32..56 bytes copied */
156 .quad .Ld6,.Ls6e
157 .quad .Ld7,.Ls7e
158 .quad .Ld8,.Ls8e
159 @@ -172,11 +172,8 @@ ENTRY(__copy_user_nocache)
160 .quad .Le5,.Le_zero
161 .previous
162
163 - /* compute 64-offset for main loop. 8 bytes accuracy with error on the
164 - pessimistic side. this is gross. it would be better to fix the
165 - interface. */
166 /* eax: zero, ebx: 64 */
167 -.Ls1e: addl $8,%eax
168 +.Ls1e: addl $8,%eax /* eax: bytes left uncopied: Ls1e: 64 .. Ls8e: 8 */
169 .Ls2e: addl $8,%eax
170 .Ls3e: addl $8,%eax
171 .Ls4e: addl $8,%eax
172 diff --git a/drivers/acpi/tables/tbinstal.c b/drivers/acpi/tables/tbinstal.c
173 index 3bc0c67..225e88c 100644
174 --- a/drivers/acpi/tables/tbinstal.c
175 +++ b/drivers/acpi/tables/tbinstal.c
176 @@ -123,17 +123,13 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc,
177 }
178 }
179
180 - /* The table must be either an SSDT or a PSDT or an OEMx */
181 -
182 - if ((!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_PSDT))
183 - &&
184 - (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT))
185 - && (strncmp(table_desc->pointer->signature, "OEM", 3))) {
186 - ACPI_ERROR((AE_INFO,
187 - "Table has invalid signature [%4.4s], must be SSDT, PSDT or OEMx",
188 - table_desc->pointer->signature));
189 - return_ACPI_STATUS(AE_BAD_SIGNATURE);
190 - }
191 + /*
192 + * Originally, we checked the table signature for "SSDT" or "PSDT" here.
193 + * Next, we added support for OEMx tables, signature "OEM".
194 + * Valid tables were encountered with a null signature, so we've just
195 + * given up on validating the signature, since it seems to be a waste
196 + * of code. The original code was removed (05/2008).
197 + */
198
199 (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
200
201 diff --git a/drivers/ide/pci/opti621.c b/drivers/ide/pci/opti621.c
202 index 46e8748..3eecbd4 100644
203 --- a/drivers/ide/pci/opti621.c
204 +++ b/drivers/ide/pci/opti621.c
205 @@ -103,18 +103,6 @@
206 * address: 50 ns, data: 50 ns, recovery: 100 ns.
207 */
208
209 -/* #define READ_PREFETCH 0 */
210 -/* Uncomment for disable read prefetch.
211 - * There is some readprefetch capatibility in hdparm,
212 - * but when I type hdparm -P 1 /dev/hda, I got errors
213 - * and till reset drive is inaccessible.
214 - * This (hw) read prefetch is safe on my drive.
215 - */
216 -
217 -#ifndef READ_PREFETCH
218 -#define READ_PREFETCH 0x40 /* read prefetch is enabled */
219 -#endif /* else read prefetch is disabled */
220 -
221 #define READ_REG 0 /* index of Read cycle timing register */
222 #define WRITE_REG 1 /* index of Write cycle timing register */
223 #define CNTRL_REG 3 /* index of Control register */
224 @@ -260,7 +248,8 @@ static void opti621_set_pio_mode(ide_drive_t *drive, const u8 pio)
225
226 cycle1 = ((first.data_time-1)<<4) | (first.recovery_time-2);
227 cycle2 = ((second.data_time-1)<<4) | (second.recovery_time-2);
228 - misc = READ_PREFETCH | ((ax-1)<<4) | ((drdy-2)<<1);
229 +
230 + misc = ((ax - 1) << 4) | ((drdy - 2) << 1);
231
232 #ifdef OPTI621_DEBUG
233 printk("%s: master: address: %d, data: %d, "
234 @@ -335,20 +324,16 @@ static const struct ide_port_info opti621_chipsets[] __devinitdata = {
235 .name = "OPTI621",
236 .init_hwif = init_hwif_opti621,
237 .enablebits = {{0x45,0x80,0x00}, {0x40,0x08,0x00}},
238 - .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA |
239 + .host_flags = IDE_HFLAG_NO_DMA |
240 IDE_HFLAG_BOOTABLE,
241 .pio_mask = ATA_PIO3,
242 - .swdma_mask = ATA_SWDMA2,
243 - .mwdma_mask = ATA_MWDMA2,
244 },{ /* 1 */
245 .name = "OPTI621X",
246 .init_hwif = init_hwif_opti621,
247 .enablebits = {{0x45,0x80,0x00}, {0x40,0x08,0x00}},
248 - .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA |
249 + .host_flags = IDE_HFLAG_NO_DMA |
250 IDE_HFLAG_BOOTABLE,
251 .pio_mask = ATA_PIO3,
252 - .swdma_mask = ATA_SWDMA2,
253 - .mwdma_mask = ATA_MWDMA2,
254 }
255 };
256
257 diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
258 index 555b70c..2d31587 100644
259 --- a/drivers/net/virtio_net.c
260 +++ b/drivers/net/virtio_net.c
261 @@ -83,9 +83,7 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb,
262 BUG_ON(len > MAX_PACKET_LEN);
263
264 skb_trim(skb, len);
265 - skb->protocol = eth_type_trans(skb, dev);
266 - pr_debug("Receiving skb proto 0x%04x len %i type %i\n",
267 - ntohs(skb->protocol), skb->len, skb->pkt_type);
268 +
269 dev->stats.rx_bytes += skb->len;
270 dev->stats.rx_packets++;
271
272 @@ -95,6 +93,10 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb,
273 goto frame_err;
274 }
275
276 + skb->protocol = eth_type_trans(skb, dev);
277 + pr_debug("Receiving skb proto 0x%04x len %i type %i\n",
278 + ntohs(skb->protocol), skb->len, skb->pkt_type);
279 +
280 if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) {
281 pr_debug("GSO!\n");
282 switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) {
283 diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
284 index 44ebdea..b14087b 100644
285 --- a/drivers/net/wireless/b43/b43.h
286 +++ b/drivers/net/wireless/b43/b43.h
287 @@ -596,7 +596,6 @@ struct b43_dma {
288
289 /* Context information for a noise calculation (Link Quality). */
290 struct b43_noise_calculation {
291 - u8 channel_at_start;
292 bool calculation_running;
293 u8 nr_samples;
294 s8 samples[8][4];
295 diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c
296 index 4ec1915..f74dba2 100644
297 --- a/drivers/net/wireless/b43/dma.c
298 +++ b/drivers/net/wireless/b43/dma.c
299 @@ -850,6 +850,7 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
300 if (!ring)
301 goto out;
302 ring->type = type;
303 + ring->dev = dev;
304
305 nr_slots = B43_RXRING_SLOTS;
306 if (for_tx)
307 @@ -901,7 +902,6 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
308 DMA_TO_DEVICE);
309 }
310
311 - ring->dev = dev;
312 ring->nr_slots = nr_slots;
313 ring->mmio_base = b43_dmacontroller_base(type, controller_index);
314 ring->index = controller_index;
315 diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
316 index 6966eec..b4a2042 100644
317 --- a/drivers/net/wireless/b43/main.c
318 +++ b/drivers/net/wireless/b43/main.c
319 @@ -1027,7 +1027,6 @@ static void b43_generate_noise_sample(struct b43_wldev *dev)
320 b43_jssi_write(dev, 0x7F7F7F7F);
321 b43_write32(dev, B43_MMIO_MACCMD,
322 b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE);
323 - B43_WARN_ON(dev->noisecalc.channel_at_start != dev->phy.channel);
324 }
325
326 static void b43_calculate_link_quality(struct b43_wldev *dev)
327 @@ -1036,7 +1035,6 @@ static void b43_calculate_link_quality(struct b43_wldev *dev)
328
329 if (dev->noisecalc.calculation_running)
330 return;
331 - dev->noisecalc.channel_at_start = dev->phy.channel;
332 dev->noisecalc.calculation_running = 1;
333 dev->noisecalc.nr_samples = 0;
334
335 @@ -1053,9 +1051,16 @@ static void handle_irq_noise(struct b43_wldev *dev)
336
337 /* Bottom half of Link Quality calculation. */
338
339 + /* Possible race condition: It might be possible that the user
340 + * changed to a different channel in the meantime since we
341 + * started the calculation. We ignore that fact, since it's
342 + * not really that much of a problem. The background noise is
343 + * an estimation only anyway. Slightly wrong results will get damped
344 + * by the averaging of the 8 sample rounds. Additionally the
345 + * value is shortlived. So it will be replaced by the next noise
346 + * calculation round soon. */
347 +
348 B43_WARN_ON(!dev->noisecalc.calculation_running);
349 - if (dev->noisecalc.channel_at_start != phy->channel)
350 - goto drop_calculation;
351 *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev));
352 if (noise[0] == 0x7F || noise[1] == 0x7F ||
353 noise[2] == 0x7F || noise[3] == 0x7F)
354 @@ -1096,11 +1101,10 @@ static void handle_irq_noise(struct b43_wldev *dev)
355 average -= 48;
356
357 dev->stats.link_noise = average;
358 - drop_calculation:
359 dev->noisecalc.calculation_running = 0;
360 return;
361 }
362 - generate_new:
363 +generate_new:
364 b43_generate_noise_sample(dev);
365 }
366
367 diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
368 index ed7e0a1..079c733 100644
369 --- a/drivers/scsi/hosts.c
370 +++ b/drivers/scsi/hosts.c
371 @@ -455,9 +455,10 @@ struct Scsi_Host *scsi_host_lookup(unsigned short hostnum)
372 struct Scsi_Host *shost = ERR_PTR(-ENXIO);
373
374 cdev = class_find_child(&shost_class, &hostnum, __scsi_host_match);
375 - if (cdev)
376 + if (cdev) {
377 shost = scsi_host_get(class_to_shost(cdev));
378 -
379 + class_device_put(cdev);
380 + }
381 return shost;
382 }
383 EXPORT_SYMBOL(scsi_host_lookup);
384 diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
385 index 7ee86d4..c82df8b 100644
386 --- a/drivers/scsi/sr.c
387 +++ b/drivers/scsi/sr.c
388 @@ -178,6 +178,9 @@ int sr_test_unit_ready(struct scsi_device *sdev, struct scsi_sense_hdr *sshdr)
389 the_result = scsi_execute_req(sdev, cmd, DMA_NONE, NULL,
390 0, sshdr, SR_TIMEOUT,
391 retries--);
392 + if (scsi_sense_valid(sshdr) &&
393 + sshdr->sense_key == UNIT_ATTENTION)
394 + sdev->changed = 1;
395
396 } while (retries > 0 &&
397 (!scsi_status_is_good(the_result) ||
398 diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
399 index 77f7a7f..d60705e 100644
400 --- a/drivers/serial/8250.c
401 +++ b/drivers/serial/8250.c
402 @@ -2174,7 +2174,9 @@ serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
403 }
404 serial8250_set_mctrl(&up->port, up->port.mctrl);
405 spin_unlock_irqrestore(&up->port.lock, flags);
406 - tty_termios_encode_baud_rate(termios, baud, baud);
407 + /* Don't rewrite B0 */
408 + if (tty_termios_baud_rate(termios))
409 + tty_termios_encode_baud_rate(termios, baud, baud);
410 }
411
412 static void
413 diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
414 index 4147de6..8785784 100644
415 --- a/net/netfilter/nf_conntrack_core.c
416 +++ b/net/netfilter/nf_conntrack_core.c
417 @@ -199,8 +199,6 @@ destroy_conntrack(struct nf_conntrack *nfct)
418 if (l4proto && l4proto->destroy)
419 l4proto->destroy(ct);
420
421 - nf_ct_ext_destroy(ct);
422 -
423 rcu_read_unlock();
424
425 spin_lock_bh(&nf_conntrack_lock);
426 @@ -523,6 +521,7 @@ static void nf_conntrack_free_rcu(struct rcu_head *head)
427
428 void nf_conntrack_free(struct nf_conn *ct)
429 {
430 + nf_ct_ext_destroy(ct);
431 call_rcu(&ct->rcu, nf_conntrack_free_rcu);
432 }
433 EXPORT_SYMBOL_GPL(nf_conntrack_free);
434 diff --git a/net/netfilter/nf_conntrack_h323_main.c b/net/netfilter/nf_conntrack_h323_main.c
435 index 898f192..7407dd3 100644
436 --- a/net/netfilter/nf_conntrack_h323_main.c
437 +++ b/net/netfilter/nf_conntrack_h323_main.c
438 @@ -617,6 +617,7 @@ static struct nf_conntrack_helper nf_conntrack_helper_h245 __read_mostly = {
439 .me = THIS_MODULE,
440 .max_expected = H323_RTP_CHANNEL_MAX * 4 + 2 /* T.120 */,
441 .timeout = 240,
442 + .tuple.src.l3num = AF_UNSPEC,
443 .tuple.dst.protonum = IPPROTO_UDP,
444 .help = h245_help
445 };
446 @@ -1758,6 +1759,7 @@ static void __exit nf_conntrack_h323_fini(void)
447 nf_conntrack_helper_unregister(&nf_conntrack_helper_ras[0]);
448 nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[1]);
449 nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[0]);
450 + nf_conntrack_helper_unregister(&nf_conntrack_helper_h245);
451 kfree(h323_buffer);
452 pr_debug("nf_ct_h323: fini\n");
453 }
454 @@ -1770,28 +1772,34 @@ static int __init nf_conntrack_h323_init(void)
455 h323_buffer = kmalloc(65536, GFP_KERNEL);
456 if (!h323_buffer)
457 return -ENOMEM;
458 - ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[0]);
459 + ret = nf_conntrack_helper_register(&nf_conntrack_helper_h245);
460 if (ret < 0)
461 goto err1;
462 - ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[1]);
463 + ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[0]);
464 if (ret < 0)
465 goto err2;
466 - ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[0]);
467 + ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[1]);
468 if (ret < 0)
469 goto err3;
470 - ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[1]);
471 + ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[0]);
472 if (ret < 0)
473 goto err4;
474 + ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[1]);
475 + if (ret < 0)
476 + goto err5;
477 pr_debug("nf_ct_h323: init success\n");
478 return 0;
479
480 -err4:
481 +err5:
482 nf_conntrack_helper_unregister(&nf_conntrack_helper_ras[0]);
483 -err3:
484 +err4:
485 nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[1]);
486 -err2:
487 +err3:
488 nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[0]);
489 +err2:
490 + nf_conntrack_helper_unregister(&nf_conntrack_helper_h245);
491 err1:
492 + kfree(h323_buffer);
493 return ret;
494 }
495