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

ipwireless: Remove endian-dependent bitfields

ipwireless: Remove endian-dependent bitfields

Remove endian-dependent bitfields and use bitmasks to transform
packet header bitfields from/to machine order.

Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

David Sterba and committed by
Linus Torvalds
d54c2752 622e713e

+38 -13
+38 -13
drivers/char/pcmcia/ipwireless/hardware.c
··· 132 132 #define NL_FOLLOWING_PACKET_HEADER_SIZE 1 133 133 134 134 struct nl_first_packet_header { 135 - #if defined(__BIG_ENDIAN_BITFIELD) 136 - unsigned char packet_rank:2; 137 - unsigned char address:3; 138 - unsigned char protocol:3; 139 - #else 140 135 unsigned char protocol:3; 141 136 unsigned char address:3; 142 137 unsigned char packet_rank:2; 143 - #endif 144 138 unsigned char length_lsb; 145 139 unsigned char length_msb; 146 140 }; 147 141 148 142 struct nl_packet_header { 149 - #if defined(__BIG_ENDIAN_BITFIELD) 150 - unsigned char packet_rank:2; 151 - unsigned char address:3; 152 - unsigned char protocol:3; 153 - #else 154 143 unsigned char protocol:3; 155 144 unsigned char address:3; 156 145 unsigned char packet_rank:2; 157 - #endif 158 146 }; 159 147 160 148 /* Value of 'packet_rank' above */ ··· 370 382 length < DUMP_MAX_BYTES ? length : DUMP_MAX_BYTES); 371 383 } 372 384 373 - static int do_send_fragment(struct ipw_hardware *hw, const unsigned char *data, 385 + static void swap_packet_bitfield_to_le(unsigned char *data) 386 + { 387 + #ifdef __BIG_ENDIAN_BITFIELD 388 + unsigned char tmp = *data, ret = 0; 389 + 390 + /* 391 + * transform bits from aa.bbb.ccc to ccc.bbb.aa 392 + */ 393 + ret |= tmp & 0xc0 >> 6; 394 + ret |= tmp & 0x38 >> 1; 395 + ret |= tmp & 0x07 << 5; 396 + *data = ret & 0xff; 397 + #endif 398 + } 399 + 400 + static void swap_packet_bitfield_from_le(unsigned char *data) 401 + { 402 + #ifdef __BIG_ENDIAN_BITFIELD 403 + unsigned char tmp = *data, ret = 0; 404 + 405 + /* 406 + * transform bits from ccc.bbb.aa to aa.bbb.ccc 407 + */ 408 + ret |= tmp & 0xe0 >> 5; 409 + ret |= tmp & 0x1c << 1; 410 + ret |= tmp & 0x03 << 6; 411 + *data = ret & 0xff; 412 + #endif 413 + } 414 + 415 + static int do_send_fragment(struct ipw_hardware *hw, unsigned char *data, 374 416 unsigned length) 375 417 { 376 418 unsigned i; ··· 420 402 spin_lock_irqsave(&hw->lock, flags); 421 403 422 404 hw->tx_ready = 0; 405 + swap_packet_bitfield_to_le(data); 423 406 424 407 if (hw->hw_version == HW_VERSION_1) { 425 408 outw((unsigned short) length, hw->base_port + IODWR); ··· 477 458 if (data_left < fragment_data_len) 478 459 fragment_data_len = data_left; 479 460 461 + /* 462 + * hdr_first is now in machine bitfield order, which will be swapped 463 + * to le just before it goes to hw 464 + */ 480 465 pkt.hdr_first.protocol = packet->protocol; 481 466 pkt.hdr_first.address = packet->dest_addr; 482 467 pkt.hdr_first.packet_rank = 0; ··· 905 882 } 906 883 907 884 acknowledge_data_read(hw); 885 + 886 + swap_packet_bitfield_from_le(pkt); 908 887 909 888 if (ipwireless_debug) 910 889 dump_data_bytes("recv", pkt, len);