]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/staging/winbond/wblinux.c
87b9970883d8cc7657b780880020aa06bd45cf14
[karo-tx-linux.git] / drivers / staging / winbond / wblinux.c
1 //============================================================================
2 //  Copyright (c) 1996-2005 Winbond Electronic Corporation
3 //
4 //  Module Name:
5 //    wblinux.c
6 //
7 //  Abstract:
8 //    Linux releated routines
9 //
10 //============================================================================
11 #include "os_common.h"
12
13 unsigned char
14 WBLINUX_Initial(struct wb35_adapter * adapter)
15 {
16         spin_lock_init( &adapter->SpinLock );
17         return true;
18 }
19
20 void
21 WBLinux_ReceivePacket(struct wb35_adapter * adapter, PRXLAYER1 pRxLayer1)
22 {
23         BUG();
24 }
25
26
27 void
28 WBLINUX_GetNextPacket(struct wb35_adapter * adapter,  PDESCRIPTOR pDes)
29 {
30         BUG();
31 }
32
33 void
34 WBLINUX_GetNextPacketCompleted(struct wb35_adapter * adapter, PDESCRIPTOR pDes)
35 {
36         BUG();
37 }
38
39 void
40 WBLINUX_Destroy(struct wb35_adapter * adapter)
41 {
42         WBLINUX_stop( adapter );
43 #ifdef _PE_USB_INI_DUMP_
44         WBDEBUG(("[w35und] unregister_netdev!\n"));
45 #endif
46 }
47
48 void
49 WBLINUX_stop(  struct wb35_adapter * adapter )
50 {
51         struct sk_buff *pSkb;
52
53         if (atomic_inc_return(&adapter->ThreadCount) == 1) {
54                 // Shutdown module immediately
55                 adapter->shutdown = 1;
56
57                 while (adapter->skb_array[ adapter->skb_GetIndex ]) {
58                         // Trying to free the un-sending packet
59                         pSkb = adapter->skb_array[ adapter->skb_GetIndex ];
60                         adapter->skb_array[ adapter->skb_GetIndex ] = NULL;
61                         if( in_irq() )
62                                 dev_kfree_skb_irq( pSkb );
63                         else
64                                 dev_kfree_skb( pSkb );
65
66                         adapter->skb_GetIndex++;
67                         adapter->skb_GetIndex %= WBLINUX_PACKET_ARRAY_SIZE;
68                 }
69
70 #ifdef _PE_STATE_DUMP_
71                 WBDEBUG(( "[w35und] SKB_RELEASE OK\n" ));
72 #endif
73         }
74
75         atomic_dec(&adapter->ThreadCount);
76 }
77
78 void
79 WbWlanHalt(struct wb35_adapter *adapter)
80 {
81         //---------------------
82         adapter->sLocalPara.ShutDowned = true;
83
84         Mds_Destroy(adapter);
85
86         // Turn off Rx and Tx hardware ability
87         hal_stop(&adapter->sHwData);
88 #ifdef _PE_USB_INI_DUMP_
89         WBDEBUG(("[w35und] Hal_stop O.K.\n"));
90 #endif
91         msleep(100);// Waiting Irp completed
92
93         // Destroy the NDIS module
94         WBLINUX_Destroy(adapter);
95
96         // Halt the HAL
97         hal_halt(&adapter->sHwData, NULL);
98 }
99
100 unsigned char
101 WbWLanInitialize(struct wb35_adapter *adapter)
102 {
103         phw_data_t      pHwData;
104         u8              *pMacAddr;
105         u8              *pMacAddr2;
106         u32             InitStep = 0;
107         u8              EEPROM_region;
108         u8              HwRadioOff;
109
110         //
111         // Setting default value for Linux
112         //
113         adapter->sLocalPara.region_INF = REGION_AUTO;
114         adapter->sLocalPara.TxRateMode = RATE_AUTO;
115         psLOCAL->bMacOperationMode = MODE_802_11_BG;    // B/G mode
116         adapter->Mds.TxRTSThreshold = DEFAULT_RTSThreshold;
117         adapter->Mds.TxFragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD;
118         hal_set_phy_type( &adapter->sHwData, RF_WB_242_1 );
119         adapter->sLocalPara.MTUsize = MAX_ETHERNET_PACKET_SIZE;
120         psLOCAL->bPreambleMode = AUTO_MODE;
121         adapter->sLocalPara.RadioOffStatus.boSwRadioOff = false;
122         pHwData = &adapter->sHwData;
123         hal_set_phy_type( pHwData, RF_DECIDE_BY_INF );
124
125         //
126         // Initial each module and variable
127         //
128         if (!WBLINUX_Initial(adapter)) {
129 #ifdef _PE_USB_INI_DUMP_
130                 WBDEBUG(("[w35und]WBNDIS initialization failed\n"));
131 #endif
132                 goto error;
133         }
134
135         // Initial Software variable
136         adapter->sLocalPara.ShutDowned = false;
137
138         //added by ws for wep key error detection
139         adapter->sLocalPara.bWepKeyError= false;
140         adapter->sLocalPara.bToSelfPacketReceived = false;
141         adapter->sLocalPara.WepKeyDetectTimerCount= 2 * 100; /// 2 seconds
142
143         // Initial USB hal
144         InitStep = 1;
145         pHwData = &adapter->sHwData;
146         if (!hal_init_hardware(pHwData, adapter))
147                 goto error;
148
149         EEPROM_region = hal_get_region_from_EEPROM( pHwData );
150         if (EEPROM_region != REGION_AUTO)
151                 psLOCAL->region = EEPROM_region;
152         else {
153                 if (psLOCAL->region_INF != REGION_AUTO)
154                         psLOCAL->region = psLOCAL->region_INF;
155                 else
156                         psLOCAL->region = REGION_USA;   //default setting
157         }
158
159         // Get Software setting flag from hal
160         adapter->sLocalPara.boAntennaDiversity = false;
161         if (hal_software_set(pHwData) & 0x00000001)
162                 adapter->sLocalPara.boAntennaDiversity = true;
163
164         //
165         // For TS module
166         //
167         InitStep = 2;
168
169         // For MDS module
170         InitStep = 3;
171         Mds_initial(adapter);
172
173         //=======================================
174         // Initialize the SME, SCAN, MLME, ROAM
175         //=======================================
176         InitStep = 4;
177         InitStep = 5;
178         InitStep = 6;
179
180         // If no user-defined address in the registry, use the addresss "burned" on the NIC instead.
181         pMacAddr = adapter->sLocalPara.ThisMacAddress;
182         pMacAddr2 = adapter->sLocalPara.PermanentAddress;
183         hal_get_permanent_address( pHwData, adapter->sLocalPara.PermanentAddress );// Reading ethernet address from EEPROM
184         if (OS_MEMORY_COMPARE(pMacAddr, "\x00\x00\x00\x00\x00\x00", MAC_ADDR_LENGTH )) // Is equal
185         {
186                 memcpy( pMacAddr, pMacAddr2, MAC_ADDR_LENGTH );
187         } else {
188                 // Set the user define MAC address
189                 hal_set_ethernet_address( pHwData, adapter->sLocalPara.ThisMacAddress );
190         }
191
192         //get current antenna
193         psLOCAL->bAntennaNo = hal_get_antenna_number(pHwData);
194 #ifdef _PE_STATE_DUMP_
195         WBDEBUG(("Driver init, antenna no = %d\n", psLOCAL->bAntennaNo));
196 #endif
197         hal_get_hw_radio_off( pHwData );
198
199         // Waiting for HAL setting OK
200         while (!hal_idle(pHwData))
201                 msleep(10);
202
203         MTO_Init(adapter);
204
205         HwRadioOff = hal_get_hw_radio_off( pHwData );
206         psLOCAL->RadioOffStatus.boHwRadioOff = !!HwRadioOff;
207
208         hal_set_radio_mode( pHwData, (unsigned char)(psLOCAL->RadioOffStatus.boSwRadioOff || psLOCAL->RadioOffStatus.boHwRadioOff) );
209
210         hal_driver_init_OK(pHwData) = 1; // Notify hal that the driver is ready now.
211         //set a tx power for reference.....
212 //      sme_set_tx_power_level(adapter, 12);    FIXME?
213         return true;
214
215 error:
216         switch (InitStep) {
217         case 5:
218         case 4:
219         case 3: Mds_Destroy( adapter );
220         case 2:
221         case 1: WBLINUX_Destroy( adapter );
222                 hal_halt( pHwData, NULL );
223         case 0: break;
224         }
225
226         return false;
227 }
228
229 void WBLINUX_ConnectStatus(struct wb35_adapter * adapter, u32 flag)
230 {
231         adapter->LinkStatus = flag; // OS_DISCONNECTED  or  OS_CONNECTED
232 }
233