diff options
| author | Adrian Bunk <bunk@stusta.de> | 2005-06-02 17:04:00 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-02 18:12:31 -0400 |
| commit | 0fd56f67890acf7904c83e7de6cb71723eb1c962 (patch) | |
| tree | 4de17dcc3cf06c3a8b43b45d1416065e3ad81267 | |
| parent | c4eb2a93319d61923635c84a5f5e68965b14c754 (diff) | |
[PATCH] drivers/net/hamradio/baycom_epp.c: cleanups
The times when tricky goto's produced better codes are long gone.
This patch should express the same in a better way.
(Also fixes the final gcc-4.0 x86 compile error)
Signed-off-by: Adrian Bunk <bunk@stusta.de>
Cc: Jeff Garzik <jgarzik@pobox.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | drivers/net/hamradio/baycom_epp.c | 126 |
1 files changed, 36 insertions, 90 deletions
diff --git a/drivers/net/hamradio/baycom_epp.c b/drivers/net/hamradio/baycom_epp.c index 1c563f905a59..a7f15d9f13e5 100644 --- a/drivers/net/hamradio/baycom_epp.c +++ b/drivers/net/hamradio/baycom_epp.c | |||
| @@ -374,29 +374,6 @@ static inline void do_kiss_params(struct baycom_state *bc, | |||
| 374 | } | 374 | } |
| 375 | 375 | ||
| 376 | /* --------------------------------------------------------------------- */ | 376 | /* --------------------------------------------------------------------- */ |
| 377 | /* | ||
| 378 | * high performance HDLC encoder | ||
| 379 | * yes, it's ugly, but generates pretty good code | ||
| 380 | */ | ||
| 381 | |||
| 382 | #define ENCODEITERA(j) \ | ||
| 383 | ({ \ | ||
| 384 | if (!(notbitstream & (0x1f0 << j))) \ | ||
| 385 | goto stuff##j; \ | ||
| 386 | encodeend##j: ; \ | ||
| 387 | }) | ||
| 388 | |||
| 389 | #define ENCODEITERB(j) \ | ||
| 390 | ({ \ | ||
| 391 | stuff##j: \ | ||
| 392 | bitstream &= ~(0x100 << j); \ | ||
| 393 | bitbuf = (bitbuf & (((2 << j) << numbit) - 1)) | \ | ||
| 394 | ((bitbuf & ~(((2 << j) << numbit) - 1)) << 1); \ | ||
| 395 | numbit++; \ | ||
| 396 | notbitstream = ~bitstream; \ | ||
| 397 | goto encodeend##j; \ | ||
| 398 | }) | ||
| 399 | |||
| 400 | 377 | ||
| 401 | static void encode_hdlc(struct baycom_state *bc) | 378 | static void encode_hdlc(struct baycom_state *bc) |
| 402 | { | 379 | { |
| @@ -405,6 +382,7 @@ static void encode_hdlc(struct baycom_state *bc) | |||
| 405 | int pkt_len; | 382 | int pkt_len; |
| 406 | unsigned bitstream, notbitstream, bitbuf, numbit, crc; | 383 | unsigned bitstream, notbitstream, bitbuf, numbit, crc; |
| 407 | unsigned char crcarr[2]; | 384 | unsigned char crcarr[2]; |
| 385 | int j; | ||
| 408 | 386 | ||
| 409 | if (bc->hdlctx.bufcnt > 0) | 387 | if (bc->hdlctx.bufcnt > 0) |
| 410 | return; | 388 | return; |
| @@ -429,24 +407,14 @@ static void encode_hdlc(struct baycom_state *bc) | |||
| 429 | pkt_len--; | 407 | pkt_len--; |
| 430 | if (!pkt_len) | 408 | if (!pkt_len) |
| 431 | bp = crcarr; | 409 | bp = crcarr; |
| 432 | ENCODEITERA(0); | 410 | for (j = 0; j < 8; j++) |
| 433 | ENCODEITERA(1); | 411 | if (unlikely(!(notbitstream & (0x1f0 << j)))) { |
| 434 | ENCODEITERA(2); | 412 | bitstream &= ~(0x100 << j); |
| 435 | ENCODEITERA(3); | 413 | bitbuf = (bitbuf & (((2 << j) << numbit) - 1)) | |
| 436 | ENCODEITERA(4); | 414 | ((bitbuf & ~(((2 << j) << numbit) - 1)) << 1); |
| 437 | ENCODEITERA(5); | 415 | numbit++; |
| 438 | ENCODEITERA(6); | 416 | notbitstream = ~bitstream; |
| 439 | ENCODEITERA(7); | 417 | } |
| 440 | goto enditer; | ||
| 441 | ENCODEITERB(0); | ||
| 442 | ENCODEITERB(1); | ||
| 443 | ENCODEITERB(2); | ||
| 444 | ENCODEITERB(3); | ||
| 445 | ENCODEITERB(4); | ||
| 446 | ENCODEITERB(5); | ||
| 447 | ENCODEITERB(6); | ||
| 448 | ENCODEITERB(7); | ||
| 449 | enditer: | ||
| 450 | numbit += 8; | 418 | numbit += 8; |
| 451 | while (numbit >= 8) { | 419 | while (numbit >= 8) { |
| 452 | *wp++ = bitbuf; | 420 | *wp++ = bitbuf; |
| @@ -610,37 +578,6 @@ static void do_rxpacket(struct net_device *dev) | |||
| 610 | bc->stats.rx_packets++; | 578 | bc->stats.rx_packets++; |
| 611 | } | 579 | } |
| 612 | 580 | ||
| 613 | #define DECODEITERA(j) \ | ||
| 614 | ({ \ | ||
| 615 | if (!(notbitstream & (0x0fc << j))) /* flag or abort */ \ | ||
| 616 | goto flgabrt##j; \ | ||
| 617 | if ((bitstream & (0x1f8 << j)) == (0xf8 << j)) /* stuffed bit */ \ | ||
| 618 | goto stuff##j; \ | ||
| 619 | enditer##j: ; \ | ||
| 620 | }) | ||
| 621 | |||
| 622 | #define DECODEITERB(j) \ | ||
| 623 | ({ \ | ||
| 624 | flgabrt##j: \ | ||
| 625 | if (!(notbitstream & (0x1fc << j))) { /* abort received */ \ | ||
| 626 | state = 0; \ | ||
| 627 | goto enditer##j; \ | ||
| 628 | } \ | ||
| 629 | if ((bitstream & (0x1fe << j)) != (0x0fc << j)) /* flag received */ \ | ||
| 630 | goto enditer##j; \ | ||
| 631 | if (state) \ | ||
| 632 | do_rxpacket(dev); \ | ||
| 633 | bc->hdlcrx.bufcnt = 0; \ | ||
| 634 | bc->hdlcrx.bufptr = bc->hdlcrx.buf; \ | ||
| 635 | state = 1; \ | ||
| 636 | numbits = 7-j; \ | ||
| 637 | goto enditer##j; \ | ||
| 638 | stuff##j: \ | ||
| 639 | numbits--; \ | ||
| 640 | bitbuf = (bitbuf & ((~0xff) << j)) | ((bitbuf & ~((~0xff) << j)) << 1); \ | ||
| 641 | goto enditer##j; \ | ||
| 642 | }) | ||
| 643 | |||
| 644 | static int receive(struct net_device *dev, int cnt) | 581 | static int receive(struct net_device *dev, int cnt) |
| 645 | { | 582 | { |
| 646 | struct baycom_state *bc = netdev_priv(dev); | 583 | struct baycom_state *bc = netdev_priv(dev); |
| @@ -649,6 +586,7 @@ static int receive(struct net_device *dev, int cnt) | |||
| 649 | unsigned char tmp[128]; | 586 | unsigned char tmp[128]; |
| 650 | unsigned char *cp; | 587 | unsigned char *cp; |
| 651 | int cnt2, ret = 0; | 588 | int cnt2, ret = 0; |
| 589 | int j; | ||
| 652 | 590 | ||
| 653 | numbits = bc->hdlcrx.numbits; | 591 | numbits = bc->hdlcrx.numbits; |
| 654 | state = bc->hdlcrx.state; | 592 | state = bc->hdlcrx.state; |
| @@ -669,24 +607,32 @@ static int receive(struct net_device *dev, int cnt) | |||
| 669 | bitbuf |= (*cp) << 8; | 607 | bitbuf |= (*cp) << 8; |
| 670 | numbits += 8; | 608 | numbits += 8; |
| 671 | notbitstream = ~bitstream; | 609 | notbitstream = ~bitstream; |
| 672 | DECODEITERA(0); | 610 | for (j = 0; j < 8; j++) { |
| 673 | DECODEITERA(1); | 611 | |
| 674 | DECODEITERA(2); | 612 | /* flag or abort */ |
| 675 | DECODEITERA(3); | 613 | if (unlikely(!(notbitstream & (0x0fc << j)))) { |
| 676 | DECODEITERA(4); | 614 | |
| 677 | DECODEITERA(5); | 615 | /* abort received */ |
| 678 | DECODEITERA(6); | 616 | if (!(notbitstream & (0x1fc << j))) |
| 679 | DECODEITERA(7); | 617 | state = 0; |
| 680 | goto enddec; | 618 | |
| 681 | DECODEITERB(0); | 619 | /* not flag received */ |
| 682 | DECODEITERB(1); | 620 | else if (!(bitstream & (0x1fe << j)) != (0x0fc << j)) { |
| 683 | DECODEITERB(2); | 621 | if (state) |
| 684 | DECODEITERB(3); | 622 | do_rxpacket(dev); |
| 685 | DECODEITERB(4); | 623 | bc->hdlcrx.bufcnt = 0; |
| 686 | DECODEITERB(5); | 624 | bc->hdlcrx.bufptr = bc->hdlcrx.buf; |
| 687 | DECODEITERB(6); | 625 | state = 1; |
| 688 | DECODEITERB(7); | 626 | numbits = 7-j; |
| 689 | enddec: | 627 | } |
| 628 | } | ||
| 629 | |||
| 630 | /* stuffed bit */ | ||
| 631 | else if (unlikely((bitstream & (0x1f8 << j)) == (0xf8 << j))) { | ||
| 632 | numbits--; | ||
| 633 | bitbuf = (bitbuf & ((~0xff) << j)) | ((bitbuf & ~((~0xff) << j)) << 1); | ||
| 634 | } | ||
| 635 | } | ||
| 690 | while (state && numbits >= 8) { | 636 | while (state && numbits >= 8) { |
| 691 | if (bc->hdlcrx.bufcnt >= TXBUFFER_SIZE) { | 637 | if (bc->hdlcrx.bufcnt >= TXBUFFER_SIZE) { |
| 692 | state = 0; | 638 | state = 0; |
