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

b43: support new TX header, noticed to be used by 598.314+ fw

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Rafał Miłecki and committed by
John W. Linville
5d852905 efe0249b

+46 -2
+2 -1
drivers/net/wireless/b43/b43.h
··· 695 695 }; 696 696 697 697 enum b43_firmware_hdr_format { 698 + B43_FW_HDR_598, 698 699 B43_FW_HDR_410, 699 700 B43_FW_HDR_351, 700 701 }; ··· 884 883 struct b43_leds leds; 885 884 886 885 /* Kmalloc'ed scratch space for PIO TX/RX. Protected by wl->mutex. */ 887 - u8 pio_scratchspace[110] __attribute__((__aligned__(8))); 886 + u8 pio_scratchspace[118] __attribute__((__aligned__(8))); 888 887 u8 pio_tailspace[4] __attribute__((__aligned__(8))); 889 888 }; 890 889
+3 -1
drivers/net/wireless/b43/main.c
··· 2514 2514 } 2515 2515 dev->fw.rev = fwrev; 2516 2516 dev->fw.patch = fwpatch; 2517 - if (dev->fw.rev >= 410) 2517 + if (dev->fw.rev >= 598) 2518 + dev->fw.hdr_format = B43_FW_HDR_598; 2519 + else if (dev->fw.rev >= 410) 2518 2520 dev->fw.hdr_format = B43_FW_HDR_410; 2519 2521 else 2520 2522 dev->fw.hdr_format = B43_FW_HDR_351;
+22
drivers/net/wireless/b43/xmit.c
··· 338 338 } 339 339 } 340 340 switch (dev->fw.hdr_format) { 341 + case B43_FW_HDR_598: 342 + b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->format_598.plcp), 343 + plcp_fragment_len, rate); 344 + break; 341 345 case B43_FW_HDR_351: 342 346 b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->format_351.plcp), 343 347 plcp_fragment_len, rate); ··· 439 435 struct ieee80211_cts *uninitialized_var(cts); 440 436 441 437 switch (dev->fw.hdr_format) { 438 + case B43_FW_HDR_598: 439 + cts = (struct ieee80211_cts *) 440 + (txhdr->format_598.rts_frame); 441 + break; 442 442 case B43_FW_HDR_351: 443 443 cts = (struct ieee80211_cts *) 444 444 (txhdr->format_351.rts_frame); ··· 461 453 struct ieee80211_rts *uninitialized_var(rts); 462 454 463 455 switch (dev->fw.hdr_format) { 456 + case B43_FW_HDR_598: 457 + rts = (struct ieee80211_rts *) 458 + (txhdr->format_598.rts_frame); 459 + break; 464 460 case B43_FW_HDR_351: 465 461 rts = (struct ieee80211_rts *) 466 462 (txhdr->format_351.rts_frame); ··· 484 472 485 473 /* Generate the PLCP headers for the RTS/CTS frame */ 486 474 switch (dev->fw.hdr_format) { 475 + case B43_FW_HDR_598: 476 + plcp = &txhdr->format_598.rts_plcp; 477 + break; 487 478 case B43_FW_HDR_351: 488 479 plcp = &txhdr->format_351.rts_plcp; 489 480 break; ··· 501 486 len, rts_rate_fb); 502 487 503 488 switch (dev->fw.hdr_format) { 489 + case B43_FW_HDR_598: 490 + hdr = (struct ieee80211_hdr *) 491 + (&txhdr->format_598.rts_frame); 492 + break; 504 493 case B43_FW_HDR_351: 505 494 hdr = (struct ieee80211_hdr *) 506 495 (&txhdr->format_351.rts_frame); ··· 541 522 542 523 /* Magic cookie */ 543 524 switch (dev->fw.hdr_format) { 525 + case B43_FW_HDR_598: 526 + txhdr->format_598.cookie = cpu_to_le16(cookie); 527 + break; 544 528 case B43_FW_HDR_351: 545 529 txhdr->format_351.cookie = cpu_to_le16(cookie); 546 530 break;
+19
drivers/net/wireless/b43/xmit.h
··· 46 46 __le32 timeout; /* Timeout */ 47 47 48 48 union { 49 + /* Tested with 598.314, 644.1001 and 666.2 */ 50 + struct { 51 + __le16 mimo_antenna; /* MIMO antenna select */ 52 + __le16 preload_size; /* Preload size */ 53 + PAD_BYTES(2); 54 + __le16 cookie; /* TX frame cookie */ 55 + __le16 tx_status; /* TX status */ 56 + __le16 max_n_mpdus; 57 + __le16 max_a_bytes_mrt; 58 + __le16 max_a_bytes_fbr; 59 + __le16 min_m_bytes; 60 + struct b43_plcp_hdr6 rts_plcp; /* RTS PLCP header */ 61 + __u8 rts_frame[16]; /* The RTS frame (if used) */ 62 + PAD_BYTES(2); 63 + struct b43_plcp_hdr6 plcp; /* Main PLCP header */ 64 + } format_598 __packed; 65 + 49 66 /* Tested with 410.2160, 478.104 and 508.* */ 50 67 struct { 51 68 __le16 mimo_antenna; /* MIMO antenna select */ ··· 187 170 size_t b43_txhdr_size(struct b43_wldev *dev) 188 171 { 189 172 switch (dev->fw.hdr_format) { 173 + case B43_FW_HDR_598: 174 + return 112 + sizeof(struct b43_plcp_hdr6); 190 175 case B43_FW_HDR_410: 191 176 return 104 + sizeof(struct b43_plcp_hdr6); 192 177 case B43_FW_HDR_351: