?? bcm43xx_phy.c
字號:
int i; bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_CTRL, 0x1400); for (i = 0; i < 12; i++) { if (phy->rev == 2) bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_DATA1, 0x6767); else bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_DATA1, 0x2323); } if (phy->rev == 2) bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_DATA1, 0x6700); else bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_DATA1, 0x2300); for (i = 0; i < 11; i++) { if (phy->rev == 2) bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_DATA1, 0x6767); else bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_DATA1, 0x2323); } if (phy->rev == 2) bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_DATA1, 0x0067); else bcm43xx_phy_write(bcm, BCM43xx_PHY_ILT_A_DATA1, 0x0023);}static void bcm43xx_phy_setupa(struct bcm43xx_private *bcm){ struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); u16 i; assert(phy->type == BCM43xx_PHYTYPE_A); switch (phy->rev) { case 2: bcm43xx_phy_write(bcm, 0x008E, 0x3800); bcm43xx_phy_write(bcm, 0x0035, 0x03FF); bcm43xx_phy_write(bcm, 0x0036, 0x0400); bcm43xx_ilt_write(bcm, 0x3807, 0x0051); bcm43xx_phy_write(bcm, 0x001C, 0x0FF9); bcm43xx_phy_write(bcm, 0x0020, bcm43xx_phy_read(bcm, 0x0020) & 0xFF0F); bcm43xx_ilt_write(bcm, 0x3C0C, 0x07BF); bcm43xx_radio_write16(bcm, 0x0002, 0x07BF); bcm43xx_phy_write(bcm, 0x0024, 0x4680); bcm43xx_phy_write(bcm, 0x0020, 0x0003); bcm43xx_phy_write(bcm, 0x001D, 0x0F40); bcm43xx_phy_write(bcm, 0x001F, 0x1C00); bcm43xx_phy_write(bcm, 0x002A, (bcm43xx_phy_read(bcm, 0x002A) & 0x00FF) | 0x0400); bcm43xx_phy_write(bcm, 0x002B, bcm43xx_phy_read(bcm, 0x002B) & 0xFBFF); bcm43xx_phy_write(bcm, 0x008E, 0x58C1); bcm43xx_ilt_write(bcm, 0x0803, 0x000F); bcm43xx_ilt_write(bcm, 0x0804, 0x001F); bcm43xx_ilt_write(bcm, 0x0805, 0x002A); bcm43xx_ilt_write(bcm, 0x0805, 0x0030); bcm43xx_ilt_write(bcm, 0x0807, 0x003A); bcm43xx_ilt_write(bcm, 0x0000, 0x0013); bcm43xx_ilt_write(bcm, 0x0001, 0x0013); bcm43xx_ilt_write(bcm, 0x0002, 0x0013); bcm43xx_ilt_write(bcm, 0x0003, 0x0013); bcm43xx_ilt_write(bcm, 0x0004, 0x0015); bcm43xx_ilt_write(bcm, 0x0005, 0x0015); bcm43xx_ilt_write(bcm, 0x0006, 0x0019); bcm43xx_ilt_write(bcm, 0x0404, 0x0003); bcm43xx_ilt_write(bcm, 0x0405, 0x0003); bcm43xx_ilt_write(bcm, 0x0406, 0x0007); for (i = 0; i < 16; i++) bcm43xx_ilt_write(bcm, 0x4000 + i, (0x8 + i) & 0x000F); bcm43xx_ilt_write(bcm, 0x3003, 0x1044); bcm43xx_ilt_write(bcm, 0x3004, 0x7201); bcm43xx_ilt_write(bcm, 0x3006, 0x0040); bcm43xx_ilt_write(bcm, 0x3001, (bcm43xx_ilt_read(bcm, 0x3001) & 0x0010) | 0x0008); for (i = 0; i < BCM43xx_ILT_FINEFREQA_SIZE; i++) bcm43xx_ilt_write(bcm, 0x5800 + i, bcm43xx_ilt_finefreqa[i]); for (i = 0; i < BCM43xx_ILT_NOISEA2_SIZE; i++) bcm43xx_ilt_write(bcm, 0x1800 + i, bcm43xx_ilt_noisea2[i]); for (i = 0; i < BCM43xx_ILT_ROTOR_SIZE; i++) bcm43xx_ilt_write32(bcm, 0x2000 + i, bcm43xx_ilt_rotor[i]); bcm43xx_phy_init_noisescaletbl(bcm); for (i = 0; i < BCM43xx_ILT_RETARD_SIZE; i++) bcm43xx_ilt_write32(bcm, 0x2400 + i, bcm43xx_ilt_retard[i]); break; case 3: for (i = 0; i < 64; i++) bcm43xx_ilt_write(bcm, 0x4000 + i, i); bcm43xx_ilt_write(bcm, 0x3807, 0x0051); bcm43xx_phy_write(bcm, 0x001C, 0x0FF9); bcm43xx_phy_write(bcm, 0x0020, bcm43xx_phy_read(bcm, 0x0020) & 0xFF0F); bcm43xx_radio_write16(bcm, 0x0002, 0x07BF); bcm43xx_phy_write(bcm, 0x0024, 0x4680); bcm43xx_phy_write(bcm, 0x0020, 0x0003); bcm43xx_phy_write(bcm, 0x001D, 0x0F40); bcm43xx_phy_write(bcm, 0x001F, 0x1C00); bcm43xx_phy_write(bcm, 0x002A, (bcm43xx_phy_read(bcm, 0x002A) & 0x00FF) | 0x0400); bcm43xx_ilt_write(bcm, 0x3001, (bcm43xx_ilt_read(bcm, 0x3001) & 0x0010) | 0x0008); for (i = 0; i < BCM43xx_ILT_NOISEA3_SIZE; i++) bcm43xx_ilt_write(bcm, 0x1800 + i, bcm43xx_ilt_noisea3[i]); bcm43xx_phy_init_noisescaletbl(bcm); for (i = 0; i < BCM43xx_ILT_SIGMASQR_SIZE; i++) bcm43xx_ilt_write(bcm, 0x5000 + i, bcm43xx_ilt_sigmasqr1[i]); bcm43xx_phy_write(bcm, 0x0003, 0x1808); bcm43xx_ilt_write(bcm, 0x0803, 0x000F); bcm43xx_ilt_write(bcm, 0x0804, 0x001F); bcm43xx_ilt_write(bcm, 0x0805, 0x002A); bcm43xx_ilt_write(bcm, 0x0805, 0x0030); bcm43xx_ilt_write(bcm, 0x0807, 0x003A); bcm43xx_ilt_write(bcm, 0x0000, 0x0013); bcm43xx_ilt_write(bcm, 0x0001, 0x0013); bcm43xx_ilt_write(bcm, 0x0002, 0x0013); bcm43xx_ilt_write(bcm, 0x0003, 0x0013); bcm43xx_ilt_write(bcm, 0x0004, 0x0015); bcm43xx_ilt_write(bcm, 0x0005, 0x0015); bcm43xx_ilt_write(bcm, 0x0006, 0x0019); bcm43xx_ilt_write(bcm, 0x0404, 0x0003); bcm43xx_ilt_write(bcm, 0x0405, 0x0003); bcm43xx_ilt_write(bcm, 0x0406, 0x0007); bcm43xx_ilt_write(bcm, 0x3C02, 0x000F); bcm43xx_ilt_write(bcm, 0x3C03, 0x0014); break; default: assert(0); }}/* Initialize APHY. This is also called for the GPHY in some cases. */static void bcm43xx_phy_inita(struct bcm43xx_private *bcm){ struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm); u16 tval; if (phy->type == BCM43xx_PHYTYPE_A) { bcm43xx_phy_setupa(bcm); } else { bcm43xx_phy_setupg(bcm); if (bcm->sprom.boardflags & BCM43xx_BFL_PACTRL) bcm43xx_phy_write(bcm, 0x046E, 0x03CF); return; } bcm43xx_phy_write(bcm, BCM43xx_PHY_A_CRS, (bcm43xx_phy_read(bcm, BCM43xx_PHY_A_CRS) & 0xF83C) | 0x0340); bcm43xx_phy_write(bcm, 0x0034, 0x0001); TODO();//TODO: RSSI AGC bcm43xx_phy_write(bcm, BCM43xx_PHY_A_CRS, bcm43xx_phy_read(bcm, BCM43xx_PHY_A_CRS) | (1 << 14)); bcm43xx_radio_init2060(bcm); if ((bcm->board_vendor == PCI_VENDOR_ID_BROADCOM) && ((bcm->board_type == 0x0416) || (bcm->board_type == 0x040A))) { if (radio->lofcal == 0xFFFF) { TODO();//TODO: LOF Cal bcm43xx_radio_set_tx_iq(bcm); } else bcm43xx_radio_write16(bcm, 0x001E, radio->lofcal); } bcm43xx_phy_write(bcm, 0x007A, 0xF111); if (phy->savedpctlreg == 0xFFFF) { bcm43xx_radio_write16(bcm, 0x0019, 0x0000); bcm43xx_radio_write16(bcm, 0x0017, 0x0020); tval = bcm43xx_ilt_read(bcm, 0x3001); if (phy->rev == 1) { bcm43xx_ilt_write(bcm, 0x3001, (bcm43xx_ilt_read(bcm, 0x3001) & 0xFF87) | 0x0058); } else { bcm43xx_ilt_write(bcm, 0x3001, (bcm43xx_ilt_read(bcm, 0x3001) & 0xFFC3) | 0x002C); } bcm43xx_dummy_transmission(bcm); phy->savedpctlreg = bcm43xx_phy_read(bcm, BCM43xx_PHY_A_PCTL); bcm43xx_ilt_write(bcm, 0x3001, tval); bcm43xx_radio_set_txpower_a(bcm, 0x0018); } bcm43xx_radio_clear_tssi(bcm);}static void bcm43xx_phy_initb2(struct bcm43xx_private *bcm){ struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm); u16 offset, val; bcm43xx_write16(bcm, 0x03EC, 0x3F22); bcm43xx_phy_write(bcm, 0x0020, 0x301C); bcm43xx_phy_write(bcm, 0x0026, 0x0000); bcm43xx_phy_write(bcm, 0x0030, 0x00C6); bcm43xx_phy_write(bcm, 0x0088, 0x3E00); val = 0x3C3D; for (offset = 0x0089; offset < 0x00A7; offset++) { bcm43xx_phy_write(bcm, offset, val); val -= 0x0202; } bcm43xx_phy_write(bcm, 0x03E4, 0x3000); if (radio->channel == 0xFF) bcm43xx_radio_selectchannel(bcm, BCM43xx_RADIO_DEFAULT_CHANNEL_BG, 0); else bcm43xx_radio_selectchannel(bcm, radio->channel, 0); if (radio->version != 0x2050) { bcm43xx_radio_write16(bcm, 0x0075, 0x0080); bcm43xx_radio_write16(bcm, 0x0079, 0x0081); } bcm43xx_radio_write16(bcm, 0x0050, 0x0020); bcm43xx_radio_write16(bcm, 0x0050, 0x0023); if (radio->version == 0x2050) { bcm43xx_radio_write16(bcm, 0x0050, 0x0020); bcm43xx_radio_write16(bcm, 0x005A, 0x0070); bcm43xx_radio_write16(bcm, 0x005B, 0x007B); bcm43xx_radio_write16(bcm, 0x005C, 0x00B0); bcm43xx_radio_write16(bcm, 0x007A, 0x000F); bcm43xx_phy_write(bcm, 0x0038, 0x0677); bcm43xx_radio_init2050(bcm); } bcm43xx_phy_write(bcm, 0x0014, 0x0080); bcm43xx_phy_write(bcm, 0x0032, 0x00CA); bcm43xx_phy_write(bcm, 0x0032, 0x00CC); bcm43xx_phy_write(bcm, 0x0035, 0x07C2); bcm43xx_phy_lo_b_measure(bcm); bcm43xx_phy_write(bcm, 0x0026, 0xCC00); if (radio->version != 0x2050) bcm43xx_phy_write(bcm, 0x0026, 0xCE00); bcm43xx_write16(bcm, BCM43xx_MMIO_CHANNEL_EXT, 0x1000); bcm43xx_phy_write(bcm, 0x002A, 0x88A3); if (radio->version != 0x2050) bcm43xx_phy_write(bcm, 0x002A, 0x88C2); bcm43xx_radio_set_txpower_bg(bcm, 0xFFFF, 0xFFFF, 0xFFFF); bcm43xx_phy_init_pctl(bcm);}static void bcm43xx_phy_initb4(struct bcm43xx_private *bcm){ struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm); u16 offset, val; bcm43xx_write16(bcm, 0x03EC, 0x3F22); bcm43xx_phy_write(bcm, 0x0020, 0x301C); bcm43xx_phy_write(bcm, 0x0026, 0x0000); bcm43xx_phy_write(bcm, 0x0030, 0x00C6); bcm43xx_phy_write(bcm, 0x0088, 0x3E00); val = 0x3C3D; for (offset = 0x0089; offset < 0x00A7; offset++) { bcm43xx_phy_write(bcm, offset, val); val -= 0x0202; } bcm43xx_phy_write(bcm, 0x03E4, 0x3000); if (radio->channel == 0xFF) bcm43xx_radio_selectchannel(bcm, BCM43xx_RADIO_DEFAULT_CHANNEL_BG, 0); else bcm43xx_radio_selectchannel(bcm, radio->channel, 0); if (radio->version != 0x2050) { bcm43xx_radio_write16(bcm, 0x0075, 0x0080); bcm43xx_radio_write16(bcm, 0x0079, 0x0081); } bcm43xx_radio_write16(bcm, 0x0050, 0x0020); bcm43xx_radio_write16(bcm, 0x0050, 0x0023); if (radio->version == 0x2050) { bcm43xx_radio_write16(bcm, 0x0050, 0x0020); bcm43xx_radio_write16(bcm, 0x005A, 0x0070); bcm43xx_radio_write16(bcm, 0x005B, 0x007B); bcm43xx_radio_write16(bcm, 0x005C, 0x00B0); bcm43xx_radio_write16(bcm, 0x007A, 0x000F); bcm43xx_phy_write(bcm, 0x0038, 0x0677); bcm43xx_radio_init2050(bcm); } bcm43xx_phy_write(bcm, 0x0014, 0x0080); bcm43xx_phy_write(bcm, 0x0032, 0x00CA); if (radio->version == 0x2050) bcm43xx_phy_write(bcm, 0x0032, 0x00E0); bcm43xx_phy_write(bcm, 0x0035, 0x07C2); bcm43xx_phy_lo_b_measure(bcm); bcm43xx_phy_write(bcm, 0x0026, 0xCC00); if (radio->version == 0x2050) bcm43xx_phy_write(bcm, 0x0026, 0xCE00); bcm43xx_write16(bcm, BCM43xx_MMIO_CHANNEL_EXT, 0x1100); bcm43xx_phy_write(bcm, 0x002A, 0x88A3); if (radio->version == 0x2050) bcm43xx_phy_write(bcm, 0x002A, 0x88C2); bcm43xx_radio_set_txpower_bg(bcm, 0xFFFF, 0xFFFF, 0xFFFF); if (bcm->sprom.boardflags & BCM43xx_BFL_RSSI) { bcm43xx_calc_nrssi_slope(bcm); bcm43xx_calc_nrssi_threshold(bcm); } bcm43xx_phy_init_pctl(bcm);}static void bcm43xx_phy_initb5(struct bcm43xx_private *bcm){ struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm); u16 offset; u16 value; u8 old_channel; if (phy->analog == 1) bcm43xx_radio_write16(bcm, 0x007A, bcm43xx_radio_read16(bcm, 0x007A) | 0x0050); if ((bcm->board_vendor != PCI_VENDOR_ID_BROADCOM) && (bcm->board_type != 0x0416)) { value = 0x2120; for (offset = 0x00A8 ; offset < 0x00C7; offset++) { bcm43xx_phy_write(bcm, offset, value); value += 0x0202; } } bcm43xx_phy_write(bcm, 0x0035, (bcm43xx_phy_read(bcm, 0x0035) & 0xF0FF) | 0x0700); if (radio->version == 0x2050) bcm43xx_phy_write(bcm, 0x0038, 0x0667); if (phy->connected) { if (radio->version == 0x2050) { bcm43xx_radio_write16(bcm, 0x007A, bcm43xx_radio_read16(bcm, 0x007A) | 0x0020); bcm43xx_radio_write16(bcm, 0x0051, bcm43xx_radio_read16(bcm, 0x0051) | 0x0004); } bcm43xx_write16(bcm, BCM43xx_MMIO_PHY_RADIO, 0x0000); bcm43xx_phy_write(bcm, 0x0802, bcm43xx_phy_read(bcm, 0x0802) | 0x0100); bcm43xx_phy_write(bcm, 0x042B, bcm43xx_phy_read(bcm, 0x042B) | 0x2000); bcm43xx_phy_write(bcm, 0x001C, 0x186A); bcm43xx_phy_write(bcm, 0x0013, (bcm43xx_phy_read(bcm, 0x0013) & 0x00FF) | 0x1900); bcm43xx_phy_write(bcm, 0x0035, (bcm43xx_phy_read(bcm, 0x0035) & 0xFFC0) | 0x0064); bcm43xx_phy_write(bcm, 0x005D, (bcm43xx_phy_read(bcm, 0x005D) & 0xFF80) | 0x000A); } if (bcm->bad_frames_preempt) { bcm43xx_phy_write(bcm, BCM43xx_PHY_RADIO_BITFIELD, bcm43xx_phy_read(bcm, BCM43xx_PHY_RADIO_BITFIELD) | (1 << 11)); } if (phy->analog == 1) { bcm43xx_phy_write(bcm, 0x0026, 0xCE00); bcm43xx_phy_write(bcm, 0x0021, 0x3763); bcm43xx_phy_write(bcm, 0x0022, 0x1BC3); bcm43xx_phy_write(bcm, 0x0023, 0x06F9); bcm43xx_phy_write(bcm, 0x0024, 0x037E); } else bcm43xx_phy_write(bcm, 0x0026, 0xCC00); bcm43xx_phy_write(bcm, 0x0030, 0x00C6); bcm43xx_write16(bcm, 0x03EC, 0x3F22); if (phy->analog == 1) bcm43xx_phy_write(bcm, 0x0020, 0x3E1C); else bcm43xx_phy_write(bcm, 0x0020, 0x301C); if (phy->analog == 0) bcm43xx_write16(bcm, 0x03E4, 0x3000); old_channel = radio->channel; /* Force to channel 7, even if not supported. */ bcm43xx_radio_selectchannel(bcm, 7, 0); if (radio->version != 0x2050) { bcm43xx_radio_write16(bcm, 0x0075, 0x0080); bcm43xx_radio_write16(bcm, 0x0079, 0x0081); } bcm43xx_radio_write16(bcm, 0x0050, 0x0020); bcm43xx_radio_write16(bcm, 0x0050, 0x0023); if (radio->version == 0x2050) { bcm43xx_radio_write16(bcm, 0x0050, 0x0020); bcm43xx_radio_write16(bcm, 0x005A, 0x0070); } bcm43xx_radio_write16(bcm, 0x005B, 0x007B); bcm43xx_radio_write16(bcm, 0x005C, 0x00B0); bcm43xx_radio_write16(bcm, 0x007A, bcm43xx_radio_read16(bcm, 0x007A) | 0x0007); bcm43xx_radio_selectchannel(bcm, old_channel, 0); bcm43xx_phy_write(bcm, 0x0014, 0x0080); bcm43xx_phy_write(bcm, 0x0032, 0x00CA); bcm43xx_phy_write(bcm, 0x002A, 0x88A3); bcm43xx_radio_set_txpower_bg(bcm, 0xFFFF, 0xFFFF, 0xFFFF); if (radio->version == 0x2050) bcm43xx_radio_write16(bcm, 0x005D, 0x000D); bcm43xx_write16(bcm, 0x03E4, (bcm43xx_read16(bcm, 0x03E4) & 0xFFC0) | 0x0004);}static void bcm43xx_phy_initb6(struct bcm43xx_private *bcm){ struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm); u16 offset, val; u8 old_channel; bcm43xx_phy_write(bcm, 0x003E, 0x817A); bcm43xx_radio_write16(bcm, 0x007A, (bcm43xx_radio_read16(bcm, 0x007A) | 0x0058));
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -