net: wireless: rockchip_wlan: add rtl8723bs support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bs / hal / phydm / txbf / haltxbf8821b.c
1 /*============================================================*/\r
2 /*Description:*/\r
3 /*This file is for 8812/8821/8811 TXBF mechanism*/\r
4 /*============================================================*/\r
5 #include "mp_precomp.h"\r
6 #include "../phydm_precomp.h"\r
7 \r
8 #if (BEAMFORMING_SUPPORT == 1)\r
9 #if (RTL8821B_SUPPORT == 1)\r
10 \r
11 VOID\r
12 halTxbf8821B_RfMode(\r
13         IN PVOID                        pDM_VOID,\r
14         IN PRT_BEAMFORMING_INFO pBeamInfo\r
15 )\r
16 {\r
17         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
18         \r
19         if (pDM_Odm->RFType == ODM_1T1R)\r
20                 return;\r
21 \r
22         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] set TxIQGen\n", __func__));\r
23 \r
24         ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000, 0x1);    /*RF Mode table write enable*/\r
25         ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000, 0x1);    /*RF Mode table write enable*/\r
26 \r
27         if (pBeamInfo->beamformee_su_cnt > 0) {\r
28                 /*Path_A*/\r
29                 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000, 0x3);           /*Select RX mode*/\r
30                 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff, 0x3F7FF);      /*Set Table data*/\r
31                 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff, 0xE26BF);      /*Enable TXIQGEN in RX mode*/\r
32                 /*Path_B*/\r
33                 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3);           /*Select RX mode*/\r
34                 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff, 0x3F7FF);      /*Set Table data*/\r
35                 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff, 0xE26BF);      /*Enable TXIQGEN in RX mode*/\r
36         } else {\r
37                 /*Path_A*/\r
38                 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000, 0x3);           /*Select RX mode*/\r
39                 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff, 0x3F7FF);      /*Set Table data*/\r
40                 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff, 0xC26BF);      /*Disable TXIQGEN in RX mode*/\r
41                 /*Path_B*/\r
42                 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3);           /*Select RX mode*/\r
43                 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff, 0x3F7FF);      /*Set Table data*/\r
44                 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff, 0xC26BF);      /*Disable TXIQGEN in RX mode*/\r
45         }\r
46 \r
47         ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000, 0x0);    /*RF Mode table write disable*/\r
48         ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000, 0x0);    /*RF Mode table write disable*/\r
49 \r
50         if (pBeamInfo->beamformee_su_cnt > 0)\r
51                 ODM_SetBBReg(pDM_Odm, rTxPath_Jaguar, bMaskByte1, 0x33);\r
52         else\r
53                 ODM_SetBBReg(pDM_Odm, rTxPath_Jaguar, bMaskByte1, 0x11);\r
54 }\r
55 \r
56 #if 0\r
57 VOID\r
58 halTxbf8821B_DownloadNDPA(\r
59         IN PDM_ODM_T                    pDM_Odm,\r
60         IN      u1Byte                          Idx\r
61 )\r
62 {\r
63         u1Byte                  u1bTmp = 0, tmpReg422 = 0, Head_Page;\r
64         u1Byte                  BcnValidReg = 0, count = 0, DLBcnCount = 0;\r
65         BOOLEAN                 bSendBeacon = FALSE;\r
66         u1Byte                  TxPageBndy = LAST_ENTRY_OF_TX_PKT_BUFFER_8812;  /*default reseved 1 page for the IC type which is undefined.*/\r
67         PRT_BEAMFORMING_INFO    pBeamInfo = &pDM_Odm->BeamformingInfo;\r
68         PRT_BEAMFORMEE_ENTRY    pBeamEntry = pBeamInfo->BeamformeeEntry + Idx;\r
69         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(pDM_Odm->Adapter);\r
70         PADAPTER                Adapter = pDM_Odm->Adapter;\r
71 \r
72         pHalData->bFwDwRsvdPageInProgress = TRUE;\r
73 \r
74         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));\r
75 \r
76         if (Idx == 0)\r
77                 Head_Page = 0xFE;\r
78         else\r
79                 Head_Page = 0xFE;\r
80 \r
81         Adapter->HalFunc.GetHalDefVarHandler(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (pu1Byte)&TxPageBndy);\r
82 \r
83         /*Set REG_CR bit 8. DMA beacon by SW.*/\r
84         u1bTmp = ODM_Read1Byte(pDM_Odm, REG_CR_8821B + 1);\r
85         ODM_Write1Byte(pDM_Odm,  REG_CR_8821B + 1, (u1bTmp | BIT0));\r
86 \r
87 \r
88         /*Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.*/\r
89         tmpReg422 = ODM_Read1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8821B + 2);\r
90         ODM_Write1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8821B + 2,  tmpReg422 & (~BIT6));\r
91 \r
92         if (tmpReg422 & BIT6) {\r
93                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("SetBeamformDownloadNDPA_8812(): There is an Adapter is sending beacon.\n"));\r
94                 bSendBeacon = TRUE;\r
95         }\r
96 \r
97         /*TDECTRL[15:8] 0x209[7:0] = 0xF6       Beacon Head for TXDMA*/\r
98         ODM_Write1Byte(pDM_Odm, REG_TDECTRL_8812A + 1, Head_Page);\r
99 \r
100         do {\r
101                 /*Clear beacon valid check bit.*/\r
102                 BcnValidReg = ODM_Read1Byte(pDM_Odm, REG_TDECTRL_8812A + 2);\r
103                 ODM_Write1Byte(pDM_Odm, REG_TDECTRL_8812A + 2, (BcnValidReg | BIT0));\r
104 \r
105                 /*download NDPA rsvd page.*/\r
106                 if (pBeamEntry->BeamformEntryCap & BEAMFORMER_CAP_VHT_SU)\r
107                         Beamforming_SendVHTNDPAPacket(pDM_Odm, pBeamEntry->MacAddr, pBeamEntry->AID, pBeamEntry->SoundBW, BEACON_QUEUE);\r
108                 else\r
109                         Beamforming_SendHTNDPAPacket(pDM_Odm, pBeamEntry->MacAddr, pBeamEntry->SoundBW, BEACON_QUEUE);\r
110 \r
111                 /*check rsvd page download OK.*/\r
112                 BcnValidReg = ODM_Read1Byte(pDM_Odm, REG_TDECTRL_8812A + 2);\r
113                 count = 0;\r
114                 while (!(BcnValidReg & BIT0) && count < 20) {\r
115                         count++;\r
116                         ODM_delay_ms(10);\r
117                         BcnValidReg = ODM_Read1Byte(pDM_Odm, REG_TDECTRL_8812A + 2);\r
118                 }\r
119                 DLBcnCount++;\r
120         } while (!(BcnValidReg & BIT0) && DLBcnCount < 5);\r
121 \r
122         if (!(BcnValidReg & BIT0))\r
123                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Download RSVD page failed!\n", __func__));\r
124 \r
125         /*TDECTRL[15:8] 0x209[7:0] = 0xF6       Beacon Head for TXDMA*/\r
126         ODM_Write1Byte(pDM_Odm, REG_TDECTRL_8812A + 1, TxPageBndy);\r
127 \r
128         /*To make sure that if there exists an adapter which would like to send beacon.*/\r
129         /*If exists, the origianl value of 0x422[6] will be 1, we should check this to*/\r
130         /*prevent from setting 0x422[6] to 0 after download reserved page, or it will cause*/\r
131         /*the beacon cannot be sent by HW.*/\r
132         /*2010.06.23. Added by tynli.*/\r
133         if (bSendBeacon)\r
134                 ODM_Write1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8821B + 2, tmpReg422);\r
135 \r
136         /*Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli.*/\r
137         /*Clear CR[8] or beacon packet will not be send to TxBuf anymore.*/\r
138         u1bTmp = ODM_Read1Byte(pDM_Odm, REG_CR_8821B + 1);\r
139         ODM_Write1Byte(pDM_Odm, REG_CR_8821B + 1, (u1bTmp & (~BIT0)));\r
140 \r
141         pBeamEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSED;\r
142 \r
143         pHalData->bFwDwRsvdPageInProgress = FALSE;\r
144 }\r
145 \r
146 \r
147 VOID\r
148 halTxbf8821B_FwTxBFCmd(\r
149         IN PDM_ODM_T                    pDM_Odm\r
150 )\r
151 {\r
152         u1Byte  Idx, Period0 = 0, Period1 = 0;\r
153         u1Byte  PageNum0 = 0xFF, PageNum1 = 0xFF;\r
154         u1Byte  u1TxBFParm[3] = {0};\r
155         PRT_BEAMFORMING_INFO    pBeamInfo = &pDM_Odm->BeamformingInfo;\r
156 \r
157         for (Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) {\r
158                 /*Modified by David*/\r
159                 if (pBeamInfo->BeamformeeEntry[Idx].bUsed && pBeamInfo->BeamformeeEntry[Idx].BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\r
160                         if (Idx == 0) {\r
161                                 if (pBeamInfo->BeamformeeEntry[Idx].bSound)\r
162                                         PageNum0 = 0xFE;\r
163                                 else\r
164                                         PageNum0 = 0xFF; /*stop sounding*/\r
165                                 Period0 = (u1Byte)(pBeamInfo->BeamformeeEntry[Idx].SoundPeriod);\r
166                         } else if (Idx == 1) {\r
167                                 if (pBeamInfo->BeamformeeEntry[Idx].bSound)\r
168                                         PageNum1 = 0xFE;\r
169                                 else\r
170                                         PageNum1 = 0xFF; /*stop sounding*/\r
171                                 Period1 = (u1Byte)(pBeamInfo->BeamformeeEntry[Idx].SoundPeriod);\r
172                         }\r
173                 }\r
174         }\r
175 \r
176         u1TxBFParm[0] = PageNum0;\r
177         u1TxBFParm[1] = PageNum1;\r
178         u1TxBFParm[2] = (Period1 << 4) | Period0;\r
179         FillH2CCmd(Adapter, PHYDM_H2C_TXBF, 3, u1TxBFParm);\r
180 \r
181         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, \r
182                 ("[%s] PageNum0 = %d Period0 = %d, PageNum1 = %d Period1 %d\n", __func__, PageNum0, Period0, PageNum1, Period1));\r
183 }\r
184 \r
185 #endif\r
186 VOID\r
187 HalTxbf8821B_Enter(\r
188         IN PVOID                        pDM_VOID,\r
189         IN u1Byte                               BFerBFeeIdx\r
190 )\r
191 {\r
192         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
193         u1Byte                                  i = 0;\r
194         u1Byte                                  BFerIdx = (BFerBFeeIdx & 0xF0) >> 4;\r
195         u1Byte                                  BFeeIdx = (BFerBFeeIdx & 0xF);\r
196         u4Byte                                  CSI_Param;\r
197         PRT_BEAMFORMING_INFO    pBeamformingInfo = &pDM_Odm->BeamformingInfo;\r
198         RT_BEAMFORMEE_ENTRY     BeamformeeEntry;\r
199         RT_BEAMFORMER_ENTRY     BeamformerEntry;\r
200         u2Byte                                  STAid = 0;\r
201 \r
202         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s]Start!\n", __func__));\r
203 \r
204         halTxbf8821B_RfMode(pDM_Odm, pBeamformingInfo);\r
205 \r
206         if (pDM_Odm->RFType == ODM_2T2R)\r
207                 ODM_SetBBReg(pDM_Odm, ODM_REG_CSI_CONTENT_VALUE, bMaskDWord, 0x00000000);       /*Nc =2*/\r
208         else\r
209                 ODM_SetBBReg(pDM_Odm, ODM_REG_CSI_CONTENT_VALUE, bMaskDWord, 0x01081008);       /*Nc =1*/\r
210 \r
211         if ((pBeamformingInfo->beamformer_su_cnt > 0) && (BFerIdx < BEAMFORMER_ENTRY_NUM)) {\r
212                 BeamformerEntry = pBeamformingInfo->BeamformerEntry[BFerIdx];\r
213 \r
214                 /*Sounding protocol control*/\r
215                 ODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8821B, 0xCB);\r
216 \r
217                 /*MAC address/Partial AID of Beamformer*/\r
218                 if (BFerIdx == 0) {\r
219                         for (i = 0; i < 6 ; i++)\r
220                                 ODM_Write1Byte(pDM_Odm, (REG_BFMER0_INFO_8812A + i), BeamformerEntry.MacAddr[i]);\r
221                         /*CSI report use legacy ofdm so don't need to fill P_AID. */\r
222                         /*PlatformEFIOWrite2Byte(Adapter, REG_BFMER0_INFO_8821B+6, BeamformEntry.P_AID); */\r
223                 } else {\r
224                         for (i = 0; i < 6 ; i++)\r
225                                 ODM_Write1Byte(pDM_Odm, (REG_BFMER1_INFO_8812A + i), BeamformerEntry.MacAddr[i]);\r
226                         /*CSI report use legacy ofdm so don't need to fill P_AID.*/\r
227                         /*PlatformEFIOWrite2Byte(Adapter, REG_BFMER1_INFO_8821B+6, BeamformEntry.P_AID);*/\r
228                 }\r
229 \r
230                 /*CSI report parameters of Beamformee*/\r
231                 if (BeamformerEntry.BeamformEntryCap & BEAMFORMEE_CAP_VHT_SU) {\r
232                         if (pDM_Odm->RFType == ODM_2T2R)\r
233                                 CSI_Param = 0x01090109;\r
234                         else\r
235                                 CSI_Param = 0x01080108;\r
236                 } else {\r
237                         if (pDM_Odm->RFType == ODM_2T2R)\r
238                                 CSI_Param = 0x03090309;\r
239                         else\r
240                                 CSI_Param = 0x03080308;\r
241                 }\r
242 \r
243                 ODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8821B, CSI_Param);\r
244                 ODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW40_8821B, CSI_Param);\r
245                 ODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW80_8821B, CSI_Param);\r
246 \r
247                 /*Timeout value for MAC to leave NDP_RX_standby_state (60 us, Test chip) (80 us,  MP chip)*/\r
248                 ODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8821B + 3, 0x50);\r
249         }\r
250 \r
251 \r
252         if ((pBeamformingInfo->beamformee_su_cnt > 0) && (BFeeIdx < BEAMFORMEE_ENTRY_NUM)) {\r
253                 BeamformeeEntry = pBeamformingInfo->BeamformeeEntry[BFeeIdx];\r
254 \r
255                 if (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))\r
256                         STAid = BeamformeeEntry.MacId;\r
257                 else\r
258                         STAid = BeamformeeEntry.P_AID;\r
259 \r
260                 /*P_AID of Beamformee & enable NDPA transmission & enable NDPA interrupt*/\r
261                 if (BFeeIdx == 0) {\r
262                         ODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8821B, STAid);\r
263                         ODM_Write1Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 3, ODM_Read1Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 3) | BIT4 | BIT6 | BIT7);\r
264                 } else\r
265                         ODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 2, STAid | BIT12 | BIT14 | BIT15);\r
266 \r
267                 /*CSI report parameters of Beamformee*/\r
268                 if (BFeeIdx == 0) {\r
269                         /*Get BIT24 & BIT25*/\r
270                         u1Byte  tmp = ODM_Read1Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 3) & 0x3;\r
271 \r
272                         ODM_Write1Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 3, tmp | 0x60);\r
273                         ODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A, STAid | BIT9);\r
274                 } else {\r
275                         /*Set BIT25*/\r
276                         ODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 2, STAid | 0xE200);\r
277                 }\r
278                         phydm_Beamforming_Notify(pDM_Odm);\r
279         }\r
280 }\r
281 \r
282 \r
283 VOID\r
284 HalTxbf8821B_Leave(\r
285         IN PVOID                        pDM_VOID,\r
286         IN u1Byte                               Idx\r
287 )\r
288 {\r
289         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
290         PRT_BEAMFORMING_INFO    pBeamformingInfo = &pDM_Odm->BeamformingInfo;\r
291         RT_BEAMFORMER_ENTRY     BeamformerEntry;\r
292         RT_BEAMFORMEE_ENTRY     BeamformeeEntry;\r
293         \r
294         if (Idx < BEAMFORMER_ENTRY_NUM) {\r
295                 BeamformerEntry = pBeamformingInfo->BeamformerEntry[Idx];\r
296                 BeamformeeEntry = pBeamformingInfo->BeamformeeEntry[Idx];\r
297         } else\r
298                 return;\r
299 \r
300         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s]Start!, IDx = %d\n", __func__, Idx));\r
301 \r
302         /*Clear P_AID of Beamformee*/\r
303         /*Clear MAC address of Beamformer*/\r
304         /*Clear Associated Bfmee Sel*/\r
305         \r
306         if (BeamformerEntry.BeamformEntryCap == BEAMFORMING_CAP_NONE) {\r
307                 ODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8821B, 0xC8);\r
308                 if (Idx == 0) {\r
309                         ODM_Write4Byte(pDM_Odm, REG_BFMER0_INFO_8812A, 0);\r
310                         ODM_Write2Byte(pDM_Odm, REG_BFMER0_INFO_8812A + 4, 0);\r
311                         ODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8821B, 0);\r
312                         ODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW40_8821B, 0);\r
313                         ODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW80_8821B, 0);\r
314                 } else {\r
315                         ODM_Write4Byte(pDM_Odm, REG_BFMER1_INFO_8812A, 0);\r
316                         ODM_Write2Byte(pDM_Odm, REG_BFMER1_INFO_8812A + 4, 0);\r
317                         ODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8821B, 0);\r
318                         ODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW40_8821B, 0);\r
319                         ODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW80_8821B, 0);\r
320                 }\r
321         }\r
322 \r
323         if (BeamformeeEntry.BeamformEntryCap == BEAMFORMING_CAP_NONE) {\r
324                 halTxbf8821B_RfMode(pDM_Odm, pBeamformingInfo);\r
325                 if (Idx == 0) {\r
326                         ODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8821B, 0x0);\r
327                         ODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A, 0);\r
328                 } else {\r
329                         ODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 2, ODM_Read2Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 2) & 0xF000);\r
330                         ODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 2, ODM_Read2Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 2) & 0x60);\r
331                 }\r
332         }\r
333         \r
334 }\r
335 \r
336 \r
337 VOID\r
338 HalTxbf8821B_Status(\r
339         IN PVOID                        pDM_VOID,\r
340         IN u1Byte                               Idx\r
341 )\r
342 {\r
343         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
344         u2Byte                                  BeamCtrlVal;\r
345         u4Byte                                  BeamCtrlReg;\r
346         PRT_BEAMFORMING_INFO    pBeamInfo = &pDM_Odm->BeamformingInfo;\r
347         RT_BEAMFORMEE_ENTRY     BeamformEntry = pBeamInfo->BeamformeeEntry[Idx];\r
348 \r
349         if (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))\r
350                 BeamCtrlVal = BeamformEntry.MacId;\r
351         else\r
352                 BeamCtrlVal = BeamformEntry.P_AID;\r
353 \r
354         if (Idx == 0)\r
355                 BeamCtrlReg = REG_TXBF_CTRL_8821B;\r
356         else {\r
357                 BeamCtrlReg = REG_TXBF_CTRL_8821B + 2;\r
358                 BeamCtrlVal |= BIT12 | BIT14 | BIT15;\r
359         }\r
360 \r
361         if (BeamformEntry.BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\r
362                 if (BeamformEntry.SoundBW == CHANNEL_WIDTH_20)\r
363                         BeamCtrlVal |= BIT9;\r
364                 else if (BeamformEntry.SoundBW == CHANNEL_WIDTH_40)\r
365                         BeamCtrlVal |= BIT10;\r
366                 else if (BeamformEntry.SoundBW == CHANNEL_WIDTH_80)\r
367                         BeamCtrlVal |= BIT11;\r
368         } else\r
369                 BeamCtrlVal &= ~(BIT9 | BIT10 | BIT11);\r
370 \r
371         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] BeamCtrlVal = 0x%x!\n", __func__, BeamCtrlVal));\r
372 \r
373         ODM_Write2Byte(pDM_Odm, BeamCtrlReg, BeamCtrlVal);\r
374 }\r
375 \r
376 \r
377 \r
378 VOID\r
379 HalTxbf8821B_FwTxBF(\r
380         IN PVOID                        pDM_VOID,\r
381         IN      u1Byte                          Idx\r
382 )\r
383 {\r
384         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
385         PRT_BEAMFORMING_INFO    pBeamInfo = &pDM_Odm->BeamformingInfo;\r
386         PRT_BEAMFORMEE_ENTRY    pBeamEntry = pBeamInfo->BeamformeeEntry + Idx;\r
387 \r
388         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));\r
389 #if 0\r
390         if (pBeamEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSING)\r
391                 halTxbf8821B_DownloadNDPA(pDM_Odm, Idx);\r
392 \r
393         halTxbf8821B_FwTxBFCmd(pDM_Odm);\r
394 #endif\r
395 }\r
396 \r
397 #endif\r
398 \r
399 \r
400 #endif\r