Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

firewire: core: add common inline functions to serialize/deserialize self ID packet

Within FireWire subsystem, the serializations and deserializations of phy
packet are implemented in several parts. They includes some redundancies.

This commit adds a series of helper functions for the serializations and
deserializations of self ID packet with a Kunit test suite.

Link: https://lore.kernel.org/r/20240605235155.116468-8-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>

+381
+255
drivers/firewire/packet-serdes-test.c
··· 10 10 #include <linux/firewire-constants.h> 11 11 12 12 #include "packet-header-definitions.h" 13 + #include "phy-packet-definitions.h" 13 14 14 15 static void serialize_async_header_common(u32 header[ASYNC_HEADER_QUADLET_COUNT], 15 16 unsigned int dst_id, unsigned int tlabel, ··· 186 185 *channel = isoc_header_get_channel(header); 187 186 *tcode = isoc_header_get_tcode(header); 188 187 *sy = isoc_header_get_sy(header); 188 + } 189 + 190 + static void serialize_phy_packet_self_id_zero(u32 *quadlet, unsigned int packet_identifier, 191 + unsigned int phy_id, bool extended, 192 + bool link_is_active, unsigned int gap_count, 193 + unsigned int scode, bool is_contender, 194 + unsigned int power_class, bool is_initiated_reset, 195 + bool has_more_packets) 196 + { 197 + phy_packet_set_packet_identifier(quadlet, packet_identifier); 198 + phy_packet_self_id_set_phy_id(quadlet, phy_id); 199 + phy_packet_self_id_set_extended(quadlet, extended); 200 + phy_packet_self_id_zero_set_link_active(quadlet, link_is_active); 201 + phy_packet_self_id_zero_set_gap_count(quadlet, gap_count); 202 + phy_packet_self_id_zero_set_scode(quadlet, scode); 203 + phy_packet_self_id_zero_set_contender(quadlet, is_contender); 204 + phy_packet_self_id_zero_set_power_class(quadlet, power_class); 205 + phy_packet_self_id_zero_set_initiated_reset(quadlet, is_initiated_reset); 206 + phy_packet_self_id_set_more_packets(quadlet, has_more_packets); 207 + } 208 + 209 + static void deserialize_phy_packet_self_id_zero(u32 quadlet, unsigned int *packet_identifier, 210 + unsigned int *phy_id, bool *extended, 211 + bool *link_is_active, unsigned int *gap_count, 212 + unsigned int *scode, bool *is_contender, 213 + unsigned int *power_class, 214 + bool *is_initiated_reset, bool *has_more_packets) 215 + { 216 + *packet_identifier = phy_packet_get_packet_identifier(quadlet); 217 + *phy_id = phy_packet_self_id_get_phy_id(quadlet); 218 + *extended = phy_packet_self_id_get_extended(quadlet); 219 + *link_is_active = phy_packet_self_id_zero_get_link_active(quadlet); 220 + *gap_count = phy_packet_self_id_zero_get_gap_count(quadlet); 221 + *scode = phy_packet_self_id_zero_get_scode(quadlet); 222 + *is_contender = phy_packet_self_id_zero_get_contender(quadlet); 223 + *power_class = phy_packet_self_id_zero_get_power_class(quadlet); 224 + *is_initiated_reset = phy_packet_self_id_zero_get_initiated_reset(quadlet); 225 + *has_more_packets = phy_packet_self_id_get_more_packets(quadlet); 226 + } 227 + 228 + static void serialize_phy_packet_self_id_extended(u32 *quadlet, unsigned int packet_identifier, 229 + unsigned int phy_id, bool extended, 230 + unsigned int sequence, bool has_more_packets) 231 + { 232 + phy_packet_set_packet_identifier(quadlet, packet_identifier); 233 + phy_packet_self_id_set_phy_id(quadlet, phy_id); 234 + phy_packet_self_id_set_extended(quadlet, extended); 235 + phy_packet_self_id_extended_set_sequence(quadlet, sequence); 236 + phy_packet_self_id_set_more_packets(quadlet, has_more_packets); 237 + } 238 + 239 + static void deserialize_phy_packet_self_id_extended(u32 quadlet, unsigned int *packet_identifier, 240 + unsigned int *phy_id, bool *extended, 241 + unsigned int *sequence, bool *has_more_packets) 242 + { 243 + *packet_identifier = phy_packet_get_packet_identifier(quadlet); 244 + *phy_id = phy_packet_self_id_get_phy_id(quadlet); 245 + *extended = phy_packet_self_id_get_extended(quadlet); 246 + *sequence = phy_packet_self_id_extended_get_sequence(quadlet); 247 + *has_more_packets = phy_packet_self_id_get_more_packets(quadlet); 189 248 } 190 249 191 250 static void test_async_header_write_quadlet_request(struct kunit *test) ··· 620 559 KUNIT_EXPECT_EQ(test, header, expected); 621 560 } 622 561 562 + static void test_phy_packet_self_id_zero_case0(struct kunit *test) 563 + { 564 + // TSB41AB1/2 with 1 port. 565 + const u32 expected[] = {0x80458c80}; 566 + u32 quadlets[] = {0}; 567 + 568 + unsigned int packet_identifier; 569 + unsigned int phy_id; 570 + bool extended; 571 + bool link_is_active; 572 + unsigned int gap_count; 573 + unsigned int scode; 574 + bool is_contender; 575 + unsigned int power_class; 576 + enum phy_packet_self_id_port_status port_status[3]; 577 + bool is_initiated_reset; 578 + bool has_more_packets; 579 + unsigned int port_index; 580 + 581 + deserialize_phy_packet_self_id_zero(expected[0], &packet_identifier, &phy_id, &extended, 582 + &link_is_active, &gap_count, &scode, &is_contender, 583 + &power_class, &is_initiated_reset, &has_more_packets); 584 + 585 + KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier); 586 + KUNIT_EXPECT_EQ(test, 0, phy_id); 587 + KUNIT_EXPECT_FALSE(test, extended); 588 + KUNIT_EXPECT_TRUE(test, link_is_active); 589 + KUNIT_EXPECT_EQ(test, 0x05, gap_count); 590 + KUNIT_EXPECT_EQ(test, SCODE_400, scode); 591 + KUNIT_EXPECT_TRUE(test, is_contender); 592 + KUNIT_EXPECT_EQ(test, 0x4, power_class); 593 + KUNIT_EXPECT_FALSE(test, is_initiated_reset); 594 + KUNIT_EXPECT_FALSE(test, has_more_packets); 595 + 596 + serialize_phy_packet_self_id_zero(quadlets, packet_identifier, phy_id, extended, 597 + link_is_active, gap_count, scode, is_contender, 598 + power_class, is_initiated_reset, has_more_packets); 599 + 600 + for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) { 601 + port_status[port_index] = 602 + self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index); 603 + } 604 + 605 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[0]); 606 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[1]); 607 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[2]); 608 + 609 + for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) { 610 + self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index, 611 + port_status[port_index]); 612 + } 613 + 614 + KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected)); 615 + } 616 + 617 + static void test_phy_packet_self_id_zero_case1(struct kunit *test) 618 + { 619 + // XIO2213 and TSB81BA3E with 3 ports. 620 + const u32 expected[] = {0x817fcc5e}; 621 + u32 quadlets[] = {0}; 622 + 623 + unsigned int packet_identifier; 624 + unsigned int phy_id; 625 + bool extended; 626 + bool link_is_active; 627 + unsigned int gap_count; 628 + unsigned int scode; 629 + bool is_contender; 630 + unsigned int power_class; 631 + enum phy_packet_self_id_port_status port_status[3]; 632 + bool is_initiated_reset; 633 + bool has_more_packets; 634 + unsigned int port_index; 635 + 636 + deserialize_phy_packet_self_id_zero(expected[0], &packet_identifier, &phy_id, &extended, 637 + &link_is_active, &gap_count, &scode, &is_contender, 638 + &power_class, &is_initiated_reset, &has_more_packets); 639 + 640 + KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier); 641 + KUNIT_EXPECT_EQ(test, 1, phy_id); 642 + KUNIT_EXPECT_FALSE(test, extended); 643 + KUNIT_EXPECT_TRUE(test, link_is_active); 644 + KUNIT_EXPECT_EQ(test, 0x3f, gap_count); 645 + KUNIT_EXPECT_EQ(test, SCODE_800, scode); 646 + KUNIT_EXPECT_TRUE(test, is_contender); 647 + KUNIT_EXPECT_EQ(test, 0x4, power_class); 648 + KUNIT_EXPECT_TRUE(test, is_initiated_reset); 649 + KUNIT_EXPECT_FALSE(test, has_more_packets); 650 + 651 + serialize_phy_packet_self_id_zero(quadlets, packet_identifier, phy_id, extended, 652 + link_is_active, gap_count, scode, is_contender, 653 + power_class, is_initiated_reset, has_more_packets); 654 + 655 + for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) { 656 + port_status[port_index] = 657 + self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index); 658 + } 659 + 660 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[0]); 661 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[1]); 662 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[2]); 663 + 664 + for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) { 665 + self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index, 666 + port_status[port_index]); 667 + } 668 + 669 + KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected)); 670 + } 671 + 672 + static void test_phy_packet_self_id_zero_and_one(struct kunit *test) 673 + { 674 + // TSB41LV06A with 6 ports. 675 + const u32 expected[] = { 676 + 0x803f8459, 677 + 0x80815000, 678 + }; 679 + u32 quadlets[] = {0, 0}; 680 + 681 + unsigned int packet_identifier; 682 + unsigned int phy_id; 683 + bool extended; 684 + bool link_is_active; 685 + unsigned int gap_count; 686 + unsigned int scode; 687 + bool is_contender; 688 + unsigned int power_class; 689 + enum phy_packet_self_id_port_status port_status[11]; 690 + bool is_initiated_reset; 691 + bool has_more_packets; 692 + 693 + unsigned int sequence; 694 + unsigned int port_index; 695 + 696 + deserialize_phy_packet_self_id_zero(expected[0], &packet_identifier, &phy_id, &extended, 697 + &link_is_active, &gap_count, &scode, &is_contender, 698 + &power_class, &is_initiated_reset, &has_more_packets); 699 + 700 + KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier); 701 + KUNIT_EXPECT_EQ(test, 0, phy_id); 702 + KUNIT_EXPECT_FALSE(test, extended); 703 + KUNIT_EXPECT_FALSE(test, link_is_active); 704 + KUNIT_EXPECT_EQ(test, 0x3f, gap_count); 705 + KUNIT_EXPECT_EQ(test, SCODE_400, scode); 706 + KUNIT_EXPECT_FALSE(test, is_contender); 707 + KUNIT_EXPECT_EQ(test, 0x4, power_class); 708 + KUNIT_EXPECT_FALSE(test, is_initiated_reset); 709 + KUNIT_EXPECT_TRUE(test, has_more_packets); 710 + 711 + serialize_phy_packet_self_id_zero(quadlets, packet_identifier, phy_id, extended, 712 + link_is_active, gap_count, scode, is_contender, 713 + power_class, is_initiated_reset, has_more_packets); 714 + 715 + deserialize_phy_packet_self_id_extended(expected[1], &packet_identifier, &phy_id, &extended, 716 + &sequence, &has_more_packets); 717 + 718 + KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier); 719 + KUNIT_EXPECT_EQ(test, 0, phy_id); 720 + KUNIT_EXPECT_TRUE(test, extended); 721 + KUNIT_EXPECT_EQ(test, 0, sequence); 722 + KUNIT_EXPECT_FALSE(test, has_more_packets); 723 + 724 + serialize_phy_packet_self_id_extended(&quadlets[1], packet_identifier, phy_id, extended, 725 + sequence, has_more_packets); 726 + 727 + 728 + for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) { 729 + port_status[port_index] = 730 + self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index); 731 + } 732 + 733 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[0]); 734 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[1]); 735 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[2]); 736 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[3]); 737 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[4]); 738 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[5]); 739 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[6]); 740 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[7]); 741 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[8]); 742 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[9]); 743 + KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[10]); 744 + 745 + for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) { 746 + self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index, 747 + port_status[port_index]); 748 + } 749 + 750 + KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected)); 751 + } 752 + 623 753 static struct kunit_case packet_serdes_test_cases[] = { 624 754 KUNIT_CASE(test_async_header_write_quadlet_request), 625 755 KUNIT_CASE(test_async_header_write_block_request), ··· 822 570 KUNIT_CASE(test_async_header_lock_request), 823 571 KUNIT_CASE(test_async_header_lock_response), 824 572 KUNIT_CASE(test_isoc_header), 573 + KUNIT_CASE(test_phy_packet_self_id_zero_case0), 574 + KUNIT_CASE(test_phy_packet_self_id_zero_case1), 575 + KUNIT_CASE(test_phy_packet_self_id_zero_and_one), 825 576 {} 826 577 }; 827 578
+126
drivers/firewire/phy-packet-definitions.h
··· 7 7 #ifndef _FIREWIRE_PHY_PACKET_DEFINITIONS_H 8 8 #define _FIREWIRE_PHY_PACKET_DEFINITIONS_H 9 9 10 + #define PACKET_IDENTIFIER_MASK 0xc0000000 11 + #define PACKET_IDENTIFIER_SHIFT 30 12 + 13 + static inline unsigned int phy_packet_get_packet_identifier(u32 quadlet) 14 + { 15 + return (quadlet & PACKET_IDENTIFIER_MASK) >> PACKET_IDENTIFIER_SHIFT; 16 + } 17 + 18 + static inline void phy_packet_set_packet_identifier(u32 *quadlet, unsigned int packet_identifier) 19 + { 20 + *quadlet &= ~PACKET_IDENTIFIER_MASK; 21 + *quadlet |= (packet_identifier << PACKET_IDENTIFIER_SHIFT) & PACKET_IDENTIFIER_MASK; 22 + } 23 + 24 + #define PHY_PACKET_PACKET_IDENTIFIER_SELF_ID 2 25 + 26 + #define SELF_ID_PHY_ID_MASK 0x3f000000 27 + #define SELF_ID_PHY_ID_SHIFT 24 10 28 #define SELF_ID_EXTENDED_MASK 0x00800000 11 29 #define SELF_ID_EXTENDED_SHIFT 23 12 30 #define SELF_ID_MORE_PACKETS_MASK 0x00000001 13 31 #define SELF_ID_MORE_PACKETS_SHIFT 0 32 + 33 + #define SELF_ID_ZERO_LINK_ACTIVE_MASK 0x00400000 34 + #define SELF_ID_ZERO_LINK_ACTIVE_SHIFT 22 35 + #define SELF_ID_ZERO_GAP_COUNT_MASK 0x003f0000 36 + #define SELF_ID_ZERO_GAP_COUNT_SHIFT 16 37 + #define SELF_ID_ZERO_SCODE_MASK 0x0000c000 38 + #define SELF_ID_ZERO_SCODE_SHIFT 14 39 + #define SELF_ID_ZERO_CONTENDER_MASK 0x00000800 40 + #define SELF_ID_ZERO_CONTENDER_SHIFT 11 41 + #define SELF_ID_ZERO_POWER_CLASS_MASK 0x00000700 42 + #define SELF_ID_ZERO_POWER_CLASS_SHIFT 8 43 + #define SELF_ID_ZERO_INITIATED_RESET_MASK 0x00000002 44 + #define SELF_ID_ZERO_INITIATED_RESET_SHIFT 1 14 45 15 46 #define SELF_ID_EXTENDED_SEQUENCE_MASK 0x00700000 16 47 #define SELF_ID_EXTENDED_SEQUENCE_SHIFT 20 ··· 50 19 51 20 #define SELF_ID_SEQUENCE_MAXIMUM_QUADLET_COUNT 4 52 21 22 + static inline unsigned int phy_packet_self_id_get_phy_id(u32 quadlet) 23 + { 24 + return (quadlet & SELF_ID_PHY_ID_MASK) >> SELF_ID_PHY_ID_SHIFT; 25 + } 26 + 27 + static inline void phy_packet_self_id_set_phy_id(u32 *quadlet, unsigned int phy_id) 28 + { 29 + *quadlet &= ~SELF_ID_PHY_ID_MASK; 30 + *quadlet |= (phy_id << SELF_ID_PHY_ID_SHIFT) & SELF_ID_PHY_ID_MASK; 31 + } 32 + 53 33 static inline bool phy_packet_self_id_get_extended(u32 quadlet) 54 34 { 55 35 return (quadlet & SELF_ID_EXTENDED_MASK) >> SELF_ID_EXTENDED_SHIFT; 36 + } 37 + 38 + static inline void phy_packet_self_id_set_extended(u32 *quadlet, bool extended) 39 + { 40 + *quadlet &= ~SELF_ID_EXTENDED_MASK; 41 + *quadlet |= (extended << SELF_ID_EXTENDED_SHIFT) & SELF_ID_EXTENDED_MASK; 42 + } 43 + 44 + static inline bool phy_packet_self_id_zero_get_link_active(u32 quadlet) 45 + { 46 + return (quadlet & SELF_ID_ZERO_LINK_ACTIVE_MASK) >> SELF_ID_ZERO_LINK_ACTIVE_SHIFT; 47 + } 48 + 49 + static inline void phy_packet_self_id_zero_set_link_active(u32 *quadlet, bool is_active) 50 + { 51 + *quadlet &= ~SELF_ID_ZERO_LINK_ACTIVE_MASK; 52 + *quadlet |= (is_active << SELF_ID_ZERO_LINK_ACTIVE_SHIFT) & SELF_ID_ZERO_LINK_ACTIVE_MASK; 53 + } 54 + 55 + static inline unsigned int phy_packet_self_id_zero_get_gap_count(u32 quadlet) 56 + { 57 + return (quadlet & SELF_ID_ZERO_GAP_COUNT_MASK) >> SELF_ID_ZERO_GAP_COUNT_SHIFT; 58 + } 59 + 60 + static inline void phy_packet_self_id_zero_set_gap_count(u32 *quadlet, unsigned int gap_count) 61 + { 62 + *quadlet &= ~SELF_ID_ZERO_GAP_COUNT_MASK; 63 + *quadlet |= (gap_count << SELF_ID_ZERO_GAP_COUNT_SHIFT) & SELF_ID_ZERO_GAP_COUNT_MASK; 64 + } 65 + 66 + static inline unsigned int phy_packet_self_id_zero_get_scode(u32 quadlet) 67 + { 68 + return (quadlet & SELF_ID_ZERO_SCODE_MASK) >> SELF_ID_ZERO_SCODE_SHIFT; 69 + } 70 + 71 + static inline void phy_packet_self_id_zero_set_scode(u32 *quadlet, unsigned int speed) 72 + { 73 + *quadlet &= ~SELF_ID_ZERO_SCODE_MASK; 74 + *quadlet |= (speed << SELF_ID_ZERO_SCODE_SHIFT) & SELF_ID_ZERO_SCODE_MASK; 75 + } 76 + 77 + static inline bool phy_packet_self_id_zero_get_contender(u32 quadlet) 78 + { 79 + return (quadlet & SELF_ID_ZERO_CONTENDER_MASK) >> SELF_ID_ZERO_CONTENDER_SHIFT; 80 + } 81 + 82 + static inline void phy_packet_self_id_zero_set_contender(u32 *quadlet, bool is_contender) 83 + { 84 + *quadlet &= ~SELF_ID_ZERO_CONTENDER_MASK; 85 + *quadlet |= (is_contender << SELF_ID_ZERO_CONTENDER_SHIFT) & SELF_ID_ZERO_CONTENDER_MASK; 86 + } 87 + 88 + static inline unsigned int phy_packet_self_id_zero_get_power_class(u32 quadlet) 89 + { 90 + return (quadlet & SELF_ID_ZERO_POWER_CLASS_MASK) >> SELF_ID_ZERO_POWER_CLASS_SHIFT; 91 + } 92 + 93 + static inline void phy_packet_self_id_zero_set_power_class(u32 *quadlet, unsigned int power_class) 94 + { 95 + *quadlet &= ~SELF_ID_ZERO_POWER_CLASS_MASK; 96 + *quadlet |= (power_class << SELF_ID_ZERO_POWER_CLASS_SHIFT) & SELF_ID_ZERO_POWER_CLASS_MASK; 97 + } 98 + 99 + static inline bool phy_packet_self_id_zero_get_initiated_reset(u32 quadlet) 100 + { 101 + return (quadlet & SELF_ID_ZERO_INITIATED_RESET_MASK) >> SELF_ID_ZERO_INITIATED_RESET_SHIFT; 102 + } 103 + 104 + static inline void phy_packet_self_id_zero_set_initiated_reset(u32 *quadlet, bool is_initiated_reset) 105 + { 106 + *quadlet &= ~SELF_ID_ZERO_INITIATED_RESET_MASK; 107 + *quadlet |= (is_initiated_reset << SELF_ID_ZERO_INITIATED_RESET_SHIFT) & SELF_ID_ZERO_INITIATED_RESET_MASK; 56 108 } 57 109 58 110 static inline bool phy_packet_self_id_get_more_packets(u32 quadlet) ··· 143 29 return (quadlet & SELF_ID_MORE_PACKETS_MASK) >> SELF_ID_MORE_PACKETS_SHIFT; 144 30 } 145 31 32 + static inline void phy_packet_self_id_set_more_packets(u32 *quadlet, bool is_more_packets) 33 + { 34 + *quadlet &= ~SELF_ID_MORE_PACKETS_MASK; 35 + *quadlet |= (is_more_packets << SELF_ID_MORE_PACKETS_SHIFT) & SELF_ID_MORE_PACKETS_MASK; 36 + } 37 + 146 38 static inline unsigned int phy_packet_self_id_extended_get_sequence(u32 quadlet) 147 39 { 148 40 return (quadlet & SELF_ID_EXTENDED_SEQUENCE_MASK) >> SELF_ID_EXTENDED_SEQUENCE_SHIFT; 41 + } 42 + 43 + static inline void phy_packet_self_id_extended_set_sequence(u32 *quadlet, unsigned int sequence) 44 + { 45 + *quadlet &= ~SELF_ID_EXTENDED_SEQUENCE_MASK; 46 + *quadlet |= (sequence << SELF_ID_EXTENDED_SHIFT) & SELF_ID_EXTENDED_SEQUENCE_MASK; 149 47 } 150 48 151 49 struct self_id_sequence_enumerator {