@@ -712,6 +712,134 @@ static void b43_nphy_stop_playback(struct b43_wldev *dev)
712712 b43_nphy_stay_in_carrier_search (dev , 0 );
713713}
714714
715+ /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/WorkaroundsGainCtrl */
716+ static void b43_nphy_gain_crtl_workarounds (struct b43_wldev * dev )
717+ {
718+ struct b43_phy_n * nphy = dev -> phy .n ;
719+ u8 i , j ;
720+ u8 code ;
721+
722+ /* TODO: for PHY >= 3
723+ s8 *lna1_gain, *lna2_gain;
724+ u8 *gain_db, *gain_bits;
725+ u16 *rfseq_init;
726+ u8 lpf_gain[6] = { 0x00, 0x06, 0x0C, 0x12, 0x12, 0x12 };
727+ u8 lpf_bits[6] = { 0, 1, 2, 3, 3, 3 };
728+ */
729+
730+ u8 rfseq_events [3 ] = { 6 , 8 , 7 };
731+ u8 rfseq_delays [3 ] = { 10 , 30 , 1 };
732+
733+ if (dev -> phy .rev >= 3 ) {
734+ /* TODO */
735+ } else {
736+ /* Set Clip 2 detect */
737+ b43_phy_set (dev , B43_NPHY_C1_CGAINI ,
738+ B43_NPHY_C1_CGAINI_CL2DETECT );
739+ b43_phy_set (dev , B43_NPHY_C2_CGAINI ,
740+ B43_NPHY_C2_CGAINI_CL2DETECT );
741+
742+ /* Set narrowband clip threshold */
743+ b43_phy_set (dev , B43_NPHY_C1_NBCLIPTHRES , 0x84 );
744+ b43_phy_set (dev , B43_NPHY_C2_NBCLIPTHRES , 0x84 );
745+
746+ if (!dev -> phy .is_40mhz ) {
747+ /* Set dwell lengths */
748+ b43_phy_set (dev , B43_NPHY_CLIP1_NBDWELL_LEN , 0x002B );
749+ b43_phy_set (dev , B43_NPHY_CLIP2_NBDWELL_LEN , 0x002B );
750+ b43_phy_set (dev , B43_NPHY_W1CLIP1_DWELL_LEN , 0x0009 );
751+ b43_phy_set (dev , B43_NPHY_W1CLIP2_DWELL_LEN , 0x0009 );
752+ }
753+
754+ /* Set wideband clip 2 threshold */
755+ b43_phy_maskset (dev , B43_NPHY_C1_CLIPWBTHRES ,
756+ ~B43_NPHY_C1_CLIPWBTHRES_CLIP2 ,
757+ 21 );
758+ b43_phy_maskset (dev , B43_NPHY_C2_CLIPWBTHRES ,
759+ ~B43_NPHY_C2_CLIPWBTHRES_CLIP2 ,
760+ 21 );
761+
762+ if (!dev -> phy .is_40mhz ) {
763+ b43_phy_maskset (dev , B43_NPHY_C1_CGAINI ,
764+ ~B43_NPHY_C1_CGAINI_GAINBKOFF , 0x1 );
765+ b43_phy_maskset (dev , B43_NPHY_C2_CGAINI ,
766+ ~B43_NPHY_C2_CGAINI_GAINBKOFF , 0x1 );
767+ b43_phy_maskset (dev , B43_NPHY_C1_CCK_CGAINI ,
768+ ~B43_NPHY_C1_CCK_CGAINI_GAINBKOFF , 0x1 );
769+ b43_phy_maskset (dev , B43_NPHY_C2_CCK_CGAINI ,
770+ ~B43_NPHY_C2_CCK_CGAINI_GAINBKOFF , 0x1 );
771+ }
772+
773+ b43_phy_set (dev , B43_NPHY_CCK_SHIFTB_REF , 0x809C );
774+
775+ if (nphy -> gain_boost ) {
776+ if (b43_current_band (dev -> wl ) == IEEE80211_BAND_2GHZ &&
777+ dev -> phy .is_40mhz )
778+ code = 4 ;
779+ else
780+ code = 5 ;
781+ } else {
782+ code = dev -> phy .is_40mhz ? 6 : 7 ;
783+ }
784+
785+ /* Set HPVGA2 index */
786+ b43_phy_maskset (dev , B43_NPHY_C1_INITGAIN ,
787+ ~B43_NPHY_C1_INITGAIN_HPVGA2 ,
788+ code << B43_NPHY_C1_INITGAIN_HPVGA2_SHIFT );
789+ b43_phy_maskset (dev , B43_NPHY_C2_INITGAIN ,
790+ ~B43_NPHY_C2_INITGAIN_HPVGA2 ,
791+ code << B43_NPHY_C2_INITGAIN_HPVGA2_SHIFT );
792+
793+ b43_phy_write (dev , B43_NPHY_TABLE_ADDR , 0x1D06 );
794+ b43_phy_write (dev , B43_NPHY_TABLE_DATALO ,
795+ (code << 8 | 0x7C ));
796+ b43_phy_write (dev , B43_NPHY_TABLE_DATALO ,
797+ (code << 8 | 0x7C ));
798+
799+ /* TODO: b43_nphy_adjust_lna_gain_table(dev); */
800+
801+ if (nphy -> elna_gain_config ) {
802+ b43_phy_write (dev , B43_NPHY_TABLE_ADDR , 0x0808 );
803+ b43_phy_write (dev , B43_NPHY_TABLE_DATALO , 0x0 );
804+ b43_phy_write (dev , B43_NPHY_TABLE_DATALO , 0x1 );
805+ b43_phy_write (dev , B43_NPHY_TABLE_DATALO , 0x1 );
806+ b43_phy_write (dev , B43_NPHY_TABLE_DATALO , 0x1 );
807+
808+ b43_phy_write (dev , B43_NPHY_TABLE_ADDR , 0x0C08 );
809+ b43_phy_write (dev , B43_NPHY_TABLE_DATALO , 0x0 );
810+ b43_phy_write (dev , B43_NPHY_TABLE_DATALO , 0x1 );
811+ b43_phy_write (dev , B43_NPHY_TABLE_DATALO , 0x1 );
812+ b43_phy_write (dev , B43_NPHY_TABLE_DATALO , 0x1 );
813+
814+ b43_phy_write (dev , B43_NPHY_TABLE_ADDR , 0x1D06 );
815+ b43_phy_write (dev , B43_NPHY_TABLE_DATALO ,
816+ (code << 8 | 0x74 ));
817+ b43_phy_write (dev , B43_NPHY_TABLE_DATALO ,
818+ (code << 8 | 0x74 ));
819+ }
820+
821+ if (dev -> phy .rev == 2 ) {
822+ for (i = 0 ; i < 4 ; i ++ ) {
823+ b43_phy_write (dev , B43_NPHY_TABLE_ADDR ,
824+ (0x0400 * i ) + 0x0020 );
825+ for (j = 0 ; j < 21 ; j ++ )
826+ b43_phy_write (dev ,
827+ B43_NPHY_TABLE_DATALO , 3 * j );
828+ }
829+
830+ /* TODO: b43_nphy_set_rf_sequence(dev, 5,
831+ rfseq_events, rfseq_delays, 3);*/
832+ b43_phy_maskset (dev , B43_NPHY_OVER_DGAIN1 ,
833+ (u16 )~B43_NPHY_OVER_DGAIN_CCKDGECV ,
834+ 0x5A << B43_NPHY_OVER_DGAIN_CCKDGECV_SHIFT );
835+
836+ if (b43_current_band (dev -> wl ) == IEEE80211_BAND_2GHZ )
837+ b43_phy_maskset (dev , B43_PHY_N (0xC5D ),
838+ 0xFF80 , 4 );
839+ }
840+ }
841+ }
842+
715843/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/Workarounds */
716844static void b43_nphy_workarounds (struct b43_wldev * dev )
717845{
@@ -786,7 +914,7 @@ static void b43_nphy_workarounds(struct b43_wldev *dev)
786914 /*TODO:b43_nphy_set_rf_sequence(dev, 0, events1, delays1, 7);*/
787915 /*TODO:b43_nphy_set_rf_sequence(dev, 1, events2, delays2, 7);*/
788916
789- /*TODO: b43_nphy_gain_crtl_workarounds(dev);*/
917+ b43_nphy_gain_crtl_workarounds (dev );
790918
791919 if (dev -> phy .rev < 2 ) {
792920 if (b43_phy_read (dev , B43_NPHY_RXCTL ) & 0x2 )
0 commit comments