Staging: w35und: inline hal_set_phy_type() to wb35_hw_init()
[pandora-kernel.git] / drivers / staging / winbond / wbhal.c
1 #include "sysdef.h"
2 #include "wbhal_f.h"
3 #include "wblinux_f.h"
4
5 void hal_set_ethernet_address( struct hw_data * pHwData, u8 *current_address )
6 {
7         u32 ltmp[2];
8
9         if( pHwData->SurpriseRemove ) return;
10
11         memcpy( pHwData->CurrentMacAddress, current_address, ETH_ALEN );
12
13         ltmp[0]= cpu_to_le32( *(u32 *)pHwData->CurrentMacAddress );
14         ltmp[1]= cpu_to_le32( *(u32 *)(pHwData->CurrentMacAddress + 4) ) & 0xffff;
15
16         Wb35Reg_BurstWrite( pHwData, 0x03e8, ltmp, 2, AUTO_INCREMENT );
17 }
18
19 void hal_get_permanent_address( struct hw_data * pHwData, u8 *pethernet_address )
20 {
21         if( pHwData->SurpriseRemove ) return;
22
23         memcpy( pethernet_address, pHwData->PermanentMacAddress, 6 );
24 }
25
26 //---------------------------------------------------------------------------------------------------
27 void hal_set_beacon_period(  struct hw_data * pHwData,  u16 beacon_period )
28 {
29         u32     tmp;
30
31         if( pHwData->SurpriseRemove ) return;
32
33         pHwData->BeaconPeriod = beacon_period;
34         tmp = pHwData->BeaconPeriod << 16;
35         tmp |= pHwData->ProbeDelay;
36         Wb35Reg_Write( pHwData, 0x0848, tmp );
37 }
38
39
40 static void hal_set_current_channel_ex(  struct hw_data * pHwData,  ChanInfo channel )
41 {
42         struct wb35_reg *reg = &pHwData->reg;
43
44         if( pHwData->SurpriseRemove )
45                 return;
46
47         printk("Going to channel: %d/%d\n", channel.band, channel.ChanNo);
48
49         RFSynthesizer_SwitchingChannel( pHwData, channel );// Switch channel
50         pHwData->Channel = channel.ChanNo;
51         pHwData->band = channel.band;
52         #ifdef _PE_STATE_DUMP_
53         printk("Set channel is %d, band =%d\n", pHwData->Channel, pHwData->band);
54         #endif
55         reg->M28_MacControl &= ~0xff; // Clean channel information field
56         reg->M28_MacControl |= channel.ChanNo;
57         Wb35Reg_WriteWithCallbackValue( pHwData, 0x0828, reg->M28_MacControl,
58                                         (s8 *)&channel, sizeof(ChanInfo));
59 }
60 //---------------------------------------------------------------------------------------------------
61 void hal_set_current_channel(  struct hw_data * pHwData,  ChanInfo channel )
62 {
63         hal_set_current_channel_ex( pHwData, channel );
64 }
65 //---------------------------------------------------------------------------------------------------
66 void hal_set_accept_broadcast(  struct hw_data * pHwData,  u8 enable )
67 {
68         struct wb35_reg *reg = &pHwData->reg;
69
70         if( pHwData->SurpriseRemove ) return;
71
72         reg->M00_MacControl &= ~0x02000000;//The HW value
73
74         if (enable)
75                 reg->M00_MacControl |= 0x02000000;//The HW value
76
77         Wb35Reg_Write( pHwData, 0x0800, reg->M00_MacControl );
78 }
79
80 //for wep key error detection, we need to accept broadcast packets to be received temporary.
81 void hal_set_accept_promiscuous( struct hw_data * pHwData,  u8 enable)
82 {
83         struct wb35_reg *reg = &pHwData->reg;
84
85         if (pHwData->SurpriseRemove) return;
86         if (enable) {
87                 reg->M00_MacControl |= 0x00400000;
88                 Wb35Reg_Write( pHwData, 0x0800, reg->M00_MacControl );
89         } else {
90                 reg->M00_MacControl&=~0x00400000;
91                 Wb35Reg_Write( pHwData, 0x0800, reg->M00_MacControl );
92         }
93 }
94
95 void hal_set_accept_multicast(  struct hw_data * pHwData,  u8 enable )
96 {
97         struct wb35_reg *reg = &pHwData->reg;
98
99         if( pHwData->SurpriseRemove ) return;
100
101         reg->M00_MacControl &= ~0x01000000;//The HW value
102         if (enable)  reg->M00_MacControl |= 0x01000000;//The HW value
103         Wb35Reg_Write( pHwData, 0x0800, reg->M00_MacControl );
104 }
105
106 void hal_set_accept_beacon(  struct hw_data * pHwData,  u8 enable )
107 {
108         struct wb35_reg *reg = &pHwData->reg;
109
110         if( pHwData->SurpriseRemove ) return;
111
112         // 20040108 debug
113         if( !enable )//Due to SME and MLME are not suitable for 35
114                 return;
115
116         reg->M00_MacControl &= ~0x04000000;//The HW value
117         if( enable )
118                 reg->M00_MacControl |= 0x04000000;//The HW value
119
120         Wb35Reg_Write( pHwData, 0x0800, reg->M00_MacControl );
121 }
122 //---------------------------------------------------------------------------------------------------
123
124 void hal_stop(  struct hw_data * pHwData )
125 {
126         struct wb35_reg *reg = &pHwData->reg;
127
128         pHwData->Wb35Rx.rx_halt = 1;
129         Wb35Rx_stop( pHwData );
130
131         pHwData->Wb35Tx.tx_halt = 1;
132         Wb35Tx_stop( pHwData );
133
134         reg->D00_DmaControl &= ~0xc0000000;//Tx Off, Rx Off
135         Wb35Reg_Write( pHwData, 0x0400, reg->D00_DmaControl );
136 }
137
138 unsigned char hal_idle(struct hw_data * pHwData)
139 {
140         struct wb35_reg *reg = &pHwData->reg;
141         struct wb_usb *pWbUsb = &pHwData->WbUsb;
142
143         if( !pHwData->SurpriseRemove && ( pWbUsb->DetectCount || reg->EP0vm_state!=VM_STOP ) )
144                 return false;
145
146         return true;
147 }
148
149 void hal_set_radio_mode( struct hw_data * pHwData,  unsigned char radio_off)
150 {
151         struct wb35_reg *reg = &pHwData->reg;
152
153         if( pHwData->SurpriseRemove ) return;
154
155         if (radio_off)  //disable Baseband receive off
156         {
157                 pHwData->CurrentRadioSw = 1; // off
158                 reg->M24_MacControl &= 0xffffffbf;
159         }
160         else
161         {
162                 pHwData->CurrentRadioSw = 0; // on
163                 reg->M24_MacControl |= 0x00000040;
164         }
165         Wb35Reg_Write( pHwData, 0x0824, reg->M24_MacControl );
166 }
167
168 u8 hal_get_antenna_number(  struct hw_data * pHwData )
169 {
170         struct wb35_reg *reg = &pHwData->reg;
171
172         if ((reg->BB2C & BIT(11)) == 0)
173                 return 0;
174         else
175                 return 1;
176 }
177
178 //----------------------------------------------------------------------------------------------------
179 //0 : radio on; 1: radio off
180 u8 hal_get_hw_radio_off(  struct hw_data * pHwData )
181 {
182         struct wb35_reg *reg = &pHwData->reg;
183
184         if( pHwData->SurpriseRemove ) return 1;
185
186         //read the bit16 of register U1B0
187         Wb35Reg_Read( pHwData, 0x3b0, &reg->U1B0 );
188         if ((reg->U1B0 & 0x00010000)) {
189                 pHwData->CurrentRadioHw = 1;
190                 return 1;
191         } else {
192                 pHwData->CurrentRadioHw = 0;
193                 return 0;
194         }
195 }
196
197 unsigned char hal_get_dxx_reg(  struct hw_data * pHwData,  u16 number,  u32 * pValue )
198 {
199         if( number < 0x1000 )
200                 number += 0x1000;
201         return Wb35Reg_ReadSync( pHwData, number, pValue );
202 }
203
204 unsigned char hal_set_dxx_reg(  struct hw_data * pHwData,  u16 number,  u32 value )
205 {
206         unsigned char   ret;
207
208         if( number < 0x1000 )
209                 number += 0x1000;
210         ret = Wb35Reg_WriteSync( pHwData, number, value );
211         return ret;
212 }
213
214 void hal_set_rf_power(struct hw_data * pHwData, u8 PowerIndex)
215 {
216         RFSynthesizer_SetPowerIndex( pHwData, PowerIndex );
217 }