Merge tag 'dm-3.8-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-dm
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / vt6655 / device_main.c
1 /*
2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3 * All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * File: device_main.c
20 *
21 * Purpose: driver entry for initial, open, close, tx and rx.
22 *
23 * Author: Lyndon Chen
24 *
25 * Date: Jan 8, 2003
26 *
27 * Functions:
28 *
29 * vt6655_probe - module initial (insmod) driver entry
30 * vt6655_remove - module remove entry
31 * vt6655_init_info - device structure resource allocation function
32 * device_free_info - device structure resource free function
33 * device_get_pci_info - get allocated pci io/mem resource
34 * device_print_info - print out resource
35 * device_open - allocate dma/descripter resource & initial mac/bbp function
36 * device_xmit - asynchrous data tx function
37 * device_intr - interrupt handle function
38 * device_set_multi - set mac filter
39 * device_ioctl - ioctl entry
40 * device_close - shutdown mac/bbp & free dma/descripter resource
41 * device_rx_srv - rx service function
42 * device_receive_frame - rx data function
43 * device_alloc_rx_buf - rx buffer pre-allocated function
44 * device_alloc_frag_buf - rx fragement pre-allocated function
45 * device_free_tx_buf - free tx buffer function
46 * device_free_frag_buf- free de-fragement buffer
47 * device_dma0_tx_80211- tx 802.11 frame via dma0
48 * device_dma0_xmit- tx PS bufferred frame via dma0
49 * device_init_rd0_ring- initial rd dma0 ring
50 * device_init_rd1_ring- initial rd dma1 ring
51 * device_init_td0_ring- initial tx dma0 ring buffer
52 * device_init_td1_ring- initial tx dma1 ring buffer
53 * device_init_registers- initial MAC & BBP & RF internal registers.
54 * device_init_rings- initial tx/rx ring buffer
55 * device_init_defrag_cb- initial & allocate de-fragement buffer.
56 * device_free_rings- free all allocated ring buffer
57 * device_tx_srv- tx interrupt service function
58 *
59 * Revision History:
60 */
61 #undef __NO_VERSION__
62
63 #include "device.h"
64 #include "card.h"
65 #include "channel.h"
66 #include "baseband.h"
67 #include "mac.h"
68 #include "tether.h"
69 #include "wmgr.h"
70 #include "wctl.h"
71 #include "power.h"
72 #include "wcmd.h"
73 #include "iocmd.h"
74 #include "tcrc.h"
75 #include "rxtx.h"
76 #include "wroute.h"
77 #include "bssdb.h"
78 #include "hostap.h"
79 #include "wpactl.h"
80 #include "ioctl.h"
81 #include "iwctl.h"
82 #include "dpc.h"
83 #include "datarate.h"
84 #include "rf.h"
85 #include "iowpa.h"
86 #include <linux/delay.h>
87 #include <linux/kthread.h>
88 #include <linux/slab.h>
89
90 /*--------------------- Static Definitions -------------------------*/
91 //static int msglevel =MSG_LEVEL_DEBUG;
92 static int msglevel = MSG_LEVEL_INFO;
93
94 //
95 // Define module options
96 //
97 MODULE_AUTHOR("VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>");
98 MODULE_LICENSE("GPL");
99 MODULE_DESCRIPTION("VIA Networking Solomon-A/B/G Wireless LAN Adapter Driver");
100
101 static int mlme_kill;
102 //static struct task_struct * mlme_task;
103
104 #define DEVICE_PARAM(N,D)
105 /*
106 static const int N[MAX_UINTS]=OPTION_DEFAULT;\
107 MODULE_PARM(N, "1-" __MODULE_STRING(MAX_UINTS) "i");\
108 MODULE_PARM_DESC(N, D);
109 */
110
111 #define RX_DESC_MIN0 16
112 #define RX_DESC_MAX0 128
113 #define RX_DESC_DEF0 32
114 DEVICE_PARAM(RxDescriptors0,"Number of receive descriptors0");
115
116 #define RX_DESC_MIN1 16
117 #define RX_DESC_MAX1 128
118 #define RX_DESC_DEF1 32
119 DEVICE_PARAM(RxDescriptors1,"Number of receive descriptors1");
120
121 #define TX_DESC_MIN0 16
122 #define TX_DESC_MAX0 128
123 #define TX_DESC_DEF0 32
124 DEVICE_PARAM(TxDescriptors0,"Number of transmit descriptors0");
125
126 #define TX_DESC_MIN1 16
127 #define TX_DESC_MAX1 128
128 #define TX_DESC_DEF1 64
129 DEVICE_PARAM(TxDescriptors1,"Number of transmit descriptors1");
130
131
132 #define IP_ALIG_DEF 0
133 /* IP_byte_align[] is used for IP header unsigned long byte aligned
134 0: indicate the IP header won't be unsigned long byte aligned.(Default) .
135 1: indicate the IP header will be unsigned long byte aligned.
136 In some environment, the IP header should be unsigned long byte aligned,
137 or the packet will be droped when we receive it. (eg: IPVS)
138 */
139 DEVICE_PARAM(IP_byte_align,"Enable IP header dword aligned");
140
141
142 #define INT_WORKS_DEF 20
143 #define INT_WORKS_MIN 10
144 #define INT_WORKS_MAX 64
145
146 DEVICE_PARAM(int_works,"Number of packets per interrupt services");
147
148 #define CHANNEL_MIN 1
149 #define CHANNEL_MAX 14
150 #define CHANNEL_DEF 6
151
152 DEVICE_PARAM(Channel, "Channel number");
153
154
155 /* PreambleType[] is the preamble length used for transmit.
156 0: indicate allows long preamble type
157 1: indicate allows short preamble type
158 */
159
160 #define PREAMBLE_TYPE_DEF 1
161
162 DEVICE_PARAM(PreambleType, "Preamble Type");
163
164
165 #define RTS_THRESH_MIN 512
166 #define RTS_THRESH_MAX 2347
167 #define RTS_THRESH_DEF 2347
168
169 DEVICE_PARAM(RTSThreshold, "RTS threshold");
170
171
172 #define FRAG_THRESH_MIN 256
173 #define FRAG_THRESH_MAX 2346
174 #define FRAG_THRESH_DEF 2346
175
176 DEVICE_PARAM(FragThreshold, "Fragmentation threshold");
177
178
179 #define DATA_RATE_MIN 0
180 #define DATA_RATE_MAX 13
181 #define DATA_RATE_DEF 13
182 /* datarate[] index
183 0: indicate 1 Mbps 0x02
184 1: indicate 2 Mbps 0x04
185 2: indicate 5.5 Mbps 0x0B
186 3: indicate 11 Mbps 0x16
187 4: indicate 6 Mbps 0x0c
188 5: indicate 9 Mbps 0x12
189 6: indicate 12 Mbps 0x18
190 7: indicate 18 Mbps 0x24
191 8: indicate 24 Mbps 0x30
192 9: indicate 36 Mbps 0x48
193 10: indicate 48 Mbps 0x60
194 11: indicate 54 Mbps 0x6c
195 12: indicate 72 Mbps 0x90
196 13: indicate auto rate
197 */
198
199 DEVICE_PARAM(ConnectionRate, "Connection data rate");
200
201 #define OP_MODE_DEF 0
202
203 DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");
204
205 /* OpMode[] is used for transmit.
206 0: indicate infrastruct mode used
207 1: indicate adhoc mode used
208 2: indicate AP mode used
209 */
210
211
212 /* PSMode[]
213 0: indicate disable power saving mode
214 1: indicate enable power saving mode
215 */
216
217 #define PS_MODE_DEF 0
218
219 DEVICE_PARAM(PSMode, "Power saving mode");
220
221
222 #define SHORT_RETRY_MIN 0
223 #define SHORT_RETRY_MAX 31
224 #define SHORT_RETRY_DEF 8
225
226
227 DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
228
229 #define LONG_RETRY_MIN 0
230 #define LONG_RETRY_MAX 15
231 #define LONG_RETRY_DEF 4
232
233
234 DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
235
236
237 /* BasebandType[] baseband type selected
238 0: indicate 802.11a type
239 1: indicate 802.11b type
240 2: indicate 802.11g type
241 */
242 #define BBP_TYPE_MIN 0
243 #define BBP_TYPE_MAX 2
244 #define BBP_TYPE_DEF 2
245
246 DEVICE_PARAM(BasebandType, "baseband type");
247
248
249
250 /* 80211hEnable[]
251 0: indicate disable 802.11h
252 1: indicate enable 802.11h
253 */
254
255 #define X80211h_MODE_DEF 0
256
257 DEVICE_PARAM(b80211hEnable, "802.11h mode");
258
259 /* 80211hEnable[]
260 0: indicate disable 802.11h
261 1: indicate enable 802.11h
262 */
263
264 #define DIVERSITY_ANT_DEF 0
265
266 DEVICE_PARAM(bDiversityANTEnable, "ANT diversity mode");
267
268
269 //
270 // Static vars definitions
271 //
272
273
274 static int device_nics =0;
275 static PSDevice pDevice_Infos =NULL;
276 static struct net_device *root_device_dev = NULL;
277
278 static CHIP_INFO chip_info_table[]= {
279 { VT3253, "VIA Networking Solomon-A/B/G Wireless LAN Adapter ",
280 256, 1, DEVICE_FLAGS_IP_ALIGN|DEVICE_FLAGS_TX_ALIGN },
281 {0,NULL}
282 };
283
284 DEFINE_PCI_DEVICE_TABLE(vt6655_pci_id_table) = {
285 { PCI_VDEVICE(VIA, 0x3253), (kernel_ulong_t)chip_info_table},
286 { 0, }
287 };
288
289 /*--------------------- Static Functions --------------------------*/
290
291
292 static int vt6655_probe(struct pci_dev *pcid, const struct pci_device_id *ent);
293 static void vt6655_init_info(struct pci_dev* pcid, PSDevice* ppDevice, PCHIP_INFO);
294 static void device_free_info(PSDevice pDevice);
295 static bool device_get_pci_info(PSDevice, struct pci_dev* pcid);
296 static void device_print_info(PSDevice pDevice);
297 static struct net_device_stats *device_get_stats(struct net_device *dev);
298 static void device_init_diversity_timer(PSDevice pDevice);
299 static int device_open(struct net_device *dev);
300 static int device_xmit(struct sk_buff *skb, struct net_device *dev);
301 static irqreturn_t device_intr(int irq, void*dev_instance);
302 static void device_set_multi(struct net_device *dev);
303 static int device_close(struct net_device *dev);
304 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
305
306 #ifdef CONFIG_PM
307 static int device_notify_reboot(struct notifier_block *, unsigned long event, void *ptr);
308 static int viawget_suspend(struct pci_dev *pcid, pm_message_t state);
309 static int viawget_resume(struct pci_dev *pcid);
310 struct notifier_block device_notifier = {
311 .notifier_call = device_notify_reboot,
312 .next = NULL,
313 .priority = 0,
314 };
315 #endif
316
317
318 static void device_init_rd0_ring(PSDevice pDevice);
319 static void device_init_rd1_ring(PSDevice pDevice);
320 static void device_init_defrag_cb(PSDevice pDevice);
321 static void device_init_td0_ring(PSDevice pDevice);
322 static void device_init_td1_ring(PSDevice pDevice);
323
324 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
325 //2008-0714<Add>by Mike Liu
326 static bool device_release_WPADEV(PSDevice pDevice);
327
328 static int ethtool_ioctl(struct net_device *dev, void *useraddr);
329 static int device_rx_srv(PSDevice pDevice, unsigned int uIdx);
330 static int device_tx_srv(PSDevice pDevice, unsigned int uIdx);
331 static bool device_alloc_rx_buf(PSDevice pDevice, PSRxDesc pDesc);
332 static void device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType);
333 static void device_free_tx_buf(PSDevice pDevice, PSTxDesc pDesc);
334 static void device_free_td0_ring(PSDevice pDevice);
335 static void device_free_td1_ring(PSDevice pDevice);
336 static void device_free_rd0_ring(PSDevice pDevice);
337 static void device_free_rd1_ring(PSDevice pDevice);
338 static void device_free_rings(PSDevice pDevice);
339 static void device_free_frag_buf(PSDevice pDevice);
340 static int Config_FileGetParameter(unsigned char *string,
341 unsigned char *dest, unsigned char *source);
342
343
344 /*--------------------- Export Variables --------------------------*/
345
346 /*--------------------- Export Functions --------------------------*/
347
348
349
350 static char* get_chip_name(int chip_id)
351 {
352 int i;
353 for (i = 0; chip_info_table[i].name != NULL; i++)
354 if (chip_info_table[i].chip_id == chip_id)
355 break;
356 return chip_info_table[i].name;
357 }
358
359 static void vt6655_remove(struct pci_dev *pcid)
360 {
361 PSDevice pDevice = pci_get_drvdata(pcid);
362
363 if (pDevice == NULL)
364 return;
365 device_free_info(pDevice);
366
367 }
368
369 /*
370 static void
371 device_set_int_opt(int *opt, int val, int min, int max, int def,char* name,char* devname) {
372 if (val==-1)
373 *opt=def;
374 else if (val<min || val>max) {
375 DBG_PRT(MSG_LEVEL_INFO, KERN_NOTICE "%s: the value of parameter %s is invalid, the valid range is (%d-%d)\n" ,
376 devname,name, min,max);
377 *opt=def;
378 } else {
379 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: set value of parameter %s to %d\n",
380 devname, name, val);
381 *opt=val;
382 }
383 }
384
385 static void
386 device_set_bool_opt(unsigned int *opt, int val,bool def,u32 flag, char* name,char* devname) {
387 (*opt)&=(~flag);
388 if (val==-1)
389 *opt|=(def ? flag : 0);
390 else if (val<0 || val>1) {
391 DBG_PRT(MSG_LEVEL_INFO, KERN_NOTICE
392 "%s: the value of parameter %s is invalid, the valid range is (0-1)\n",devname,name);
393 *opt|=(def ? flag : 0);
394 } else {
395 DBG_PRT(MSG_LEVEL_INFO, KERN_NOTICE "%s: set parameter %s to %s\n",
396 devname,name , val ? "true" : "false");
397 *opt|=(val ? flag : 0);
398 }
399 }
400 */
401 static void device_get_options(PSDevice pDevice, int index, char* devname)
402 {
403 POPTIONS pOpts = &(pDevice->sOpts);
404
405 pOpts->nRxDescs0 = RX_DESC_DEF0;
406 pOpts->nRxDescs1 = RX_DESC_DEF1;
407 pOpts->nTxDescs[0] = TX_DESC_DEF0;
408 pOpts->nTxDescs[1] = TX_DESC_DEF1;
409 pOpts->flags |= DEVICE_FLAGS_IP_ALIGN;
410 pOpts->int_works = INT_WORKS_DEF;
411 pOpts->rts_thresh = RTS_THRESH_DEF;
412 pOpts->frag_thresh = FRAG_THRESH_DEF;
413 pOpts->data_rate = DATA_RATE_DEF;
414 pOpts->channel_num = CHANNEL_DEF;
415
416 pOpts->flags |= DEVICE_FLAGS_PREAMBLE_TYPE;
417 pOpts->flags |= DEVICE_FLAGS_OP_MODE;
418 //pOpts->flags|=DEVICE_FLAGS_PS_MODE;
419 pOpts->short_retry = SHORT_RETRY_DEF;
420 pOpts->long_retry = LONG_RETRY_DEF;
421 pOpts->bbp_type = BBP_TYPE_DEF;
422 pOpts->flags |= DEVICE_FLAGS_80211h_MODE;
423 pOpts->flags |= DEVICE_FLAGS_DiversityANT;
424 }
425
426 static void
427 device_set_options(PSDevice pDevice) {
428
429 unsigned char abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
430 unsigned char abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
431 unsigned char abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
432
433
434 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
435 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
436 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN);
437
438 pDevice->uChannel = pDevice->sOpts.channel_num;
439 pDevice->wRTSThreshold = pDevice->sOpts.rts_thresh;
440 pDevice->wFragmentationThreshold = pDevice->sOpts.frag_thresh;
441 pDevice->byShortRetryLimit = pDevice->sOpts.short_retry;
442 pDevice->byLongRetryLimit = pDevice->sOpts.long_retry;
443 pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
444 pDevice->byShortPreamble = (pDevice->sOpts.flags & DEVICE_FLAGS_PREAMBLE_TYPE) ? 1 : 0;
445 pDevice->byOpMode = (pDevice->sOpts.flags & DEVICE_FLAGS_OP_MODE) ? 1 : 0;
446 pDevice->ePSMode = (pDevice->sOpts.flags & DEVICE_FLAGS_PS_MODE) ? 1 : 0;
447 pDevice->b11hEnable = (pDevice->sOpts.flags & DEVICE_FLAGS_80211h_MODE) ? 1 : 0;
448 pDevice->bDiversityRegCtlON = (pDevice->sOpts.flags & DEVICE_FLAGS_DiversityANT) ? 1 : 0;
449 pDevice->uConnectionRate = pDevice->sOpts.data_rate;
450 if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = true;
451 pDevice->byBBType = pDevice->sOpts.bbp_type;
452 pDevice->byPacketType = pDevice->byBBType;
453
454 //PLICE_DEBUG->
455 pDevice->byAutoFBCtrl = AUTO_FB_0;
456 //pDevice->byAutoFBCtrl = AUTO_FB_1;
457 //PLICE_DEBUG<-
458 pDevice->bUpdateBBVGA = true;
459 pDevice->byFOETuning = 0;
460 pDevice->wCTSDuration = 0;
461 pDevice->byPreambleType = 0;
462
463
464 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" uChannel= %d\n",(int)pDevice->uChannel);
465 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byOpMode= %d\n",(int)pDevice->byOpMode);
466 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" ePSMode= %d\n",(int)pDevice->ePSMode);
467 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" wRTSThreshold= %d\n",(int)pDevice->wRTSThreshold);
468 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byShortRetryLimit= %d\n",(int)pDevice->byShortRetryLimit);
469 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byLongRetryLimit= %d\n",(int)pDevice->byLongRetryLimit);
470 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byPreambleType= %d\n",(int)pDevice->byPreambleType);
471 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byShortPreamble= %d\n",(int)pDevice->byShortPreamble);
472 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" uConnectionRate= %d\n",(int)pDevice->uConnectionRate);
473 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byBBType= %d\n",(int)pDevice->byBBType);
474 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" pDevice->b11hEnable= %d\n",(int)pDevice->b11hEnable);
475 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" pDevice->bDiversityRegCtlON= %d\n",(int)pDevice->bDiversityRegCtlON);
476 }
477
478 static void s_vCompleteCurrentMeasure (PSDevice pDevice, unsigned char byResult)
479 {
480 unsigned int ii;
481 unsigned long dwDuration = 0;
482 unsigned char byRPI0 = 0;
483
484 for(ii=1;ii<8;ii++) {
485 pDevice->dwRPIs[ii] *= 255;
486 dwDuration |= *((unsigned short *) (pDevice->pCurrMeasureEID->sReq.abyDuration));
487 dwDuration <<= 10;
488 pDevice->dwRPIs[ii] /= dwDuration;
489 pDevice->abyRPIs[ii] = (unsigned char) pDevice->dwRPIs[ii];
490 byRPI0 += pDevice->abyRPIs[ii];
491 }
492 pDevice->abyRPIs[0] = (0xFF - byRPI0);
493
494 if (pDevice->uNumOfMeasureEIDs == 0) {
495 VNTWIFIbMeasureReport( pDevice->pMgmt,
496 true,
497 pDevice->pCurrMeasureEID,
498 byResult,
499 pDevice->byBasicMap,
500 pDevice->byCCAFraction,
501 pDevice->abyRPIs
502 );
503 } else {
504 VNTWIFIbMeasureReport( pDevice->pMgmt,
505 false,
506 pDevice->pCurrMeasureEID,
507 byResult,
508 pDevice->byBasicMap,
509 pDevice->byCCAFraction,
510 pDevice->abyRPIs
511 );
512 CARDbStartMeasure (pDevice, pDevice->pCurrMeasureEID++, pDevice->uNumOfMeasureEIDs);
513 }
514
515 }
516
517
518
519 //
520 // Initialisation of MAC & BBP registers
521 //
522
523 static void device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType)
524 {
525 unsigned int ii;
526 unsigned char byValue;
527 unsigned char byValue1;
528 unsigned char byCCKPwrdBm = 0;
529 unsigned char byOFDMPwrdBm = 0;
530 int zonetype=0;
531 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
532 MACbShutdown(pDevice->PortOffset);
533 BBvSoftwareReset(pDevice->PortOffset);
534
535 if ((InitType == DEVICE_INIT_COLD) ||
536 (InitType == DEVICE_INIT_DXPL)) {
537 // Do MACbSoftwareReset in MACvInitialize
538 MACbSoftwareReset(pDevice->PortOffset);
539 // force CCK
540 pDevice->bCCK = true;
541 pDevice->bAES = false;
542 pDevice->bProtectMode = false; //Only used in 11g type, sync with ERP IE
543 pDevice->bNonERPPresent = false;
544 pDevice->bBarkerPreambleMd = false;
545 pDevice->wCurrentRate = RATE_1M;
546 pDevice->byTopOFDMBasicRate = RATE_24M;
547 pDevice->byTopCCKBasicRate = RATE_1M;
548
549 pDevice->byRevId = 0; //Target to IF pin while programming to RF chip.
550
551 // init MAC
552 MACvInitialize(pDevice->PortOffset);
553
554 // Get Local ID
555 VNSvInPortB(pDevice->PortOffset + MAC_REG_LOCALID, &(pDevice->byLocalID));
556
557 spin_lock_irq(&pDevice->lock);
558 SROMvReadAllContents(pDevice->PortOffset,pDevice->abyEEPROM);
559
560 spin_unlock_irq(&pDevice->lock);
561
562 // Get Channel range
563
564 pDevice->byMinChannel = 1;
565 pDevice->byMaxChannel = CB_MAX_CHANNEL;
566
567 // Get Antena
568 byValue = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ANTENNA);
569 if (byValue & EEP_ANTINV)
570 pDevice->bTxRxAntInv = true;
571 else
572 pDevice->bTxRxAntInv = false;
573 #ifdef PLICE_DEBUG
574 //printk("init_register:TxRxAntInv is %d,byValue is %d\n",pDevice->bTxRxAntInv,byValue);
575 #endif
576
577 byValue &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
578 if (byValue == 0) // if not set default is All
579 byValue = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
580 #ifdef PLICE_DEBUG
581 //printk("init_register:byValue is %d\n",byValue);
582 #endif
583 pDevice->ulDiversityNValue = 100*260;//100*SROMbyReadEmbedded(pDevice->PortOffset, 0x51);
584 pDevice->ulDiversityMValue = 100*16;//SROMbyReadEmbedded(pDevice->PortOffset, 0x52);
585 pDevice->byTMax = 1;//SROMbyReadEmbedded(pDevice->PortOffset, 0x53);
586 pDevice->byTMax2 = 4;//SROMbyReadEmbedded(pDevice->PortOffset, 0x54);
587 pDevice->ulSQ3TH = 0;//(unsigned long) SROMbyReadEmbedded(pDevice->PortOffset, 0x55);
588 pDevice->byTMax3 = 64;//SROMbyReadEmbedded(pDevice->PortOffset, 0x56);
589
590 if (byValue == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
591 pDevice->byAntennaCount = 2;
592 pDevice->byTxAntennaMode = ANT_B;
593 pDevice->dwTxAntennaSel = 1;
594 pDevice->dwRxAntennaSel = 1;
595 if (pDevice->bTxRxAntInv == true)
596 pDevice->byRxAntennaMode = ANT_A;
597 else
598 pDevice->byRxAntennaMode = ANT_B;
599 // chester for antenna
600 byValue1 = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ANTENNA);
601 // if (pDevice->bDiversityRegCtlON)
602 if((byValue1&0x08)==0)
603 pDevice->bDiversityEnable = false;//SROMbyReadEmbedded(pDevice->PortOffset, 0x50);
604 else
605 pDevice->bDiversityEnable = true;
606 #ifdef PLICE_DEBUG
607 //printk("aux |main antenna: RxAntennaMode is %d\n",pDevice->byRxAntennaMode);
608 #endif
609 } else {
610 pDevice->bDiversityEnable = false;
611 pDevice->byAntennaCount = 1;
612 pDevice->dwTxAntennaSel = 0;
613 pDevice->dwRxAntennaSel = 0;
614 if (byValue & EEP_ANTENNA_AUX) {
615 pDevice->byTxAntennaMode = ANT_A;
616 if (pDevice->bTxRxAntInv == true)
617 pDevice->byRxAntennaMode = ANT_B;
618 else
619 pDevice->byRxAntennaMode = ANT_A;
620 } else {
621 pDevice->byTxAntennaMode = ANT_B;
622 if (pDevice->bTxRxAntInv == true)
623 pDevice->byRxAntennaMode = ANT_A;
624 else
625 pDevice->byRxAntennaMode = ANT_B;
626 }
627 }
628 #ifdef PLICE_DEBUG
629 //printk("init registers: TxAntennaMode is %d\n",pDevice->byTxAntennaMode);
630 #endif
631 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "bDiversityEnable=[%d],NValue=[%d],MValue=[%d],TMax=[%d],TMax2=[%d]\n",
632 pDevice->bDiversityEnable,(int)pDevice->ulDiversityNValue,(int)pDevice->ulDiversityMValue,pDevice->byTMax,pDevice->byTMax2);
633
634 //#ifdef ZoneType_DefaultSetting
635 //2008-8-4 <add> by chester
636 //zonetype initial
637 pDevice->byOriginalZonetype = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
638 zonetype = Config_FileOperation(pDevice,false,NULL);
639 if (zonetype >= 0) { //read zonetype file ok!
640 if ((zonetype == 0)&&
641 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] !=0x00)){ //for USA
642 pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0;
643 pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0B;
644 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Init Zone Type :USA\n");
645 }
646 else if((zonetype == 1)&&
647 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE]!=0x01)){ //for Japan
648 pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0x01;
649 pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
650 }
651 else if((zonetype == 2)&&
652 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE]!=0x02)){ //for Europe
653 pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0x02;
654 pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
655 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Init Zone Type :Europe\n");
656 }
657
658 else
659 {
660 if(zonetype!=pDevice->abyEEPROM[EEP_OFS_ZONETYPE])
661 printk("zonetype in file[%02x] mismatch with in EEPROM[%02x]\n",zonetype,pDevice->abyEEPROM[EEP_OFS_ZONETYPE]);
662 else
663 printk("Read Zonetype file success,use default zonetype setting[%02x]\n",zonetype);
664 }
665 }
666 else
667 printk("Read Zonetype file fail,use default zonetype setting[%02x]\n",SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ZONETYPE));
668
669 // Get RFType
670 pDevice->byRFType = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RFTYPE);
671
672 if ((pDevice->byRFType & RF_EMU) != 0) {
673 // force change RevID for VT3253 emu
674 pDevice->byRevId = 0x80;
675 }
676
677 pDevice->byRFType &= RF_MASK;
678 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRFType = %x\n", pDevice->byRFType);
679
680 if (pDevice->bZoneRegExist == false) {
681 pDevice->byZoneType = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
682 }
683 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byZoneType = %x\n", pDevice->byZoneType);
684
685 //Init RF module
686 RFbInit(pDevice);
687
688 //Get Desire Power Value
689 pDevice->byCurPwr = 0xFF;
690 pDevice->byCCKPwr = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_CCK);
691 pDevice->byOFDMPwrG = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_OFDMG);
692 //byCCKPwrdBm = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_CCK_PWR_dBm);
693
694 //byOFDMPwrdBm = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_OFDM_PWR_dBm);
695 //printk("CCKPwrdBm is 0x%x,byOFDMPwrdBm is 0x%x\n",byCCKPwrdBm,byOFDMPwrdBm);
696 // Load power Table
697
698
699 for (ii=0;ii<CB_MAX_CHANNEL_24G;ii++) {
700 pDevice->abyCCKPwrTbl[ii+1] = SROMbyReadEmbedded(pDevice->PortOffset, (unsigned char)(ii + EEP_OFS_CCK_PWR_TBL));
701 if (pDevice->abyCCKPwrTbl[ii+1] == 0) {
702 pDevice->abyCCKPwrTbl[ii+1] = pDevice->byCCKPwr;
703 }
704 pDevice->abyOFDMPwrTbl[ii+1] = SROMbyReadEmbedded(pDevice->PortOffset, (unsigned char)(ii + EEP_OFS_OFDM_PWR_TBL));
705 if (pDevice->abyOFDMPwrTbl[ii+1] == 0) {
706 pDevice->abyOFDMPwrTbl[ii+1] = pDevice->byOFDMPwrG;
707 }
708 pDevice->abyCCKDefaultPwr[ii+1] = byCCKPwrdBm;
709 pDevice->abyOFDMDefaultPwr[ii+1] = byOFDMPwrdBm;
710 }
711 //2008-8-4 <add> by chester
712 //recover 12,13 ,14channel for EUROPE by 11 channel
713 if(((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
714 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe))&&
715 (pDevice->byOriginalZonetype == ZoneType_USA)) {
716 for(ii=11;ii<14;ii++) {
717 pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
718 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
719
720 }
721 }
722
723
724 // Load OFDM A Power Table
725 for (ii=0;ii<CB_MAX_CHANNEL_5G;ii++) { //RobertYu:20041224, bug using CB_MAX_CHANNEL
726 pDevice->abyOFDMPwrTbl[ii+CB_MAX_CHANNEL_24G+1] = SROMbyReadEmbedded(pDevice->PortOffset, (unsigned char)(ii + EEP_OFS_OFDMA_PWR_TBL));
727 pDevice->abyOFDMDefaultPwr[ii+CB_MAX_CHANNEL_24G+1] = SROMbyReadEmbedded(pDevice->PortOffset, (unsigned char)(ii + EEP_OFS_OFDMA_PWR_dBm));
728 }
729 init_channel_table((void *)pDevice);
730
731
732 if (pDevice->byLocalID > REV_ID_VT3253_B1) {
733 MACvSelectPage1(pDevice->PortOffset);
734 VNSvOutPortB(pDevice->PortOffset + MAC_REG_MSRCTL + 1, (MSRCTL1_TXPWR | MSRCTL1_CSAPAREN));
735 MACvSelectPage0(pDevice->PortOffset);
736 }
737
738
739 // use relative tx timeout and 802.11i D4
740 MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_CFG, (CFG_TKIPOPT | CFG_NOTXTIMEOUT));
741
742 // set performance parameter by registry
743 MACvSetShortRetryLimit(pDevice->PortOffset, pDevice->byShortRetryLimit);
744 MACvSetLongRetryLimit(pDevice->PortOffset, pDevice->byLongRetryLimit);
745
746 // reset TSF counter
747 VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
748 // enable TSF counter
749 VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
750
751 // initialize BBP registers
752 BBbVT3253Init(pDevice);
753
754 if (pDevice->bUpdateBBVGA) {
755 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
756 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
757 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
758 }
759 #ifdef PLICE_DEBUG
760 //printk("init registers:RxAntennaMode is %x,TxAntennaMode is %x\n",pDevice->byRxAntennaMode,pDevice->byTxAntennaMode);
761 #endif
762 BBvSetRxAntennaMode(pDevice->PortOffset, pDevice->byRxAntennaMode);
763 BBvSetTxAntennaMode(pDevice->PortOffset, pDevice->byTxAntennaMode);
764
765 pDevice->byCurrentCh = 0;
766
767 //pDevice->NetworkType = Ndis802_11Automode;
768 // Set BB and packet type at the same time.
769 // Set Short Slot Time, xIFS, and RSPINF.
770 if (pDevice->uConnectionRate == RATE_AUTO) {
771 pDevice->wCurrentRate = RATE_54M;
772 } else {
773 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
774 }
775
776 // default G Mode
777 VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_11G);
778 VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_AUTO);
779
780 pDevice->bRadioOff = false;
781
782 pDevice->byRadioCtl = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RADIOCTL);
783 pDevice->bHWRadioOff = false;
784
785 if (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) {
786 // Get GPIO
787 MACvGPIOIn(pDevice->PortOffset, &pDevice->byGPIO);
788 //2008-4-14 <add> by chester for led issue
789 #ifdef FOR_LED_ON_NOTEBOOK
790 if (pDevice->byGPIO & GPIO0_DATA){pDevice->bHWRadioOff = true;}
791 if ( !(pDevice->byGPIO & GPIO0_DATA)){pDevice->bHWRadioOff = false;}
792
793 }
794 if ( (pDevice->bRadioControlOff == true)) {
795 CARDbRadioPowerOff(pDevice);
796 }
797 else CARDbRadioPowerOn(pDevice);
798 #else
799 if (((pDevice->byGPIO & GPIO0_DATA) && !(pDevice->byRadioCtl & EEP_RADIOCTL_INV)) ||
800 ( !(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV))) {
801 pDevice->bHWRadioOff = true;
802 }
803 }
804 if ((pDevice->bHWRadioOff == true) || (pDevice->bRadioControlOff == true)) {
805 CARDbRadioPowerOff(pDevice);
806 }
807
808 #endif
809 }
810 pMgmt->eScanType = WMAC_SCAN_PASSIVE;
811 // get Permanent network address
812 SROMvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
813 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %pM\n",
814 pDevice->abyCurrentNetAddr);
815
816 // reset Tx pointer
817 CARDvSafeResetRx(pDevice);
818 // reset Rx pointer
819 CARDvSafeResetTx(pDevice);
820
821 if (pDevice->byLocalID <= REV_ID_VT3253_A1) {
822 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_RCR, RCR_WPAERR);
823 }
824
825 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
826
827 // Turn On Rx DMA
828 MACvReceive0(pDevice->PortOffset);
829 MACvReceive1(pDevice->PortOffset);
830
831 // start the adapter
832 MACvStart(pDevice->PortOffset);
833
834 netif_stop_queue(pDevice->dev);
835
836
837 }
838
839
840
841 static void device_init_diversity_timer(PSDevice pDevice) {
842
843 init_timer(&pDevice->TimerSQ3Tmax1);
844 pDevice->TimerSQ3Tmax1.data = (unsigned long) pDevice;
845 pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
846 pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);
847
848 init_timer(&pDevice->TimerSQ3Tmax2);
849 pDevice->TimerSQ3Tmax2.data = (unsigned long) pDevice;
850 pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
851 pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);
852
853 init_timer(&pDevice->TimerSQ3Tmax3);
854 pDevice->TimerSQ3Tmax3.data = (unsigned long) pDevice;
855 pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerState1CallBack;
856 pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);
857
858 return;
859 }
860
861
862 static bool device_release_WPADEV(PSDevice pDevice)
863 {
864 viawget_wpa_header *wpahdr;
865 int ii=0;
866 // wait_queue_head_t Set_wait;
867 //send device close to wpa_supplicnat layer
868 if (pDevice->bWPADEVUp==true) {
869 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
870 wpahdr->type = VIAWGET_DEVICECLOSE_MSG;
871 wpahdr->resp_ie_len = 0;
872 wpahdr->req_ie_len = 0;
873 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
874 pDevice->skb->dev = pDevice->wpadev;
875 skb_reset_mac_header(pDevice->skb);
876 pDevice->skb->pkt_type = PACKET_HOST;
877 pDevice->skb->protocol = htons(ETH_P_802_2);
878 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
879 netif_rx(pDevice->skb);
880 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
881
882 //wait release WPADEV
883 // init_waitqueue_head(&Set_wait);
884 // wait_event_timeout(Set_wait, ((pDevice->wpadev==NULL)&&(pDevice->skb == NULL)),5*HZ); //1s wait
885 while((pDevice->bWPADEVUp==true)) {
886 set_current_state(TASK_UNINTERRUPTIBLE);
887 schedule_timeout (HZ/20); //wait 50ms
888 ii++;
889 if(ii>20)
890 break;
891 }
892 }
893 return true;
894 }
895
896 static const struct net_device_ops device_netdev_ops = {
897 .ndo_open = device_open,
898 .ndo_stop = device_close,
899 .ndo_do_ioctl = device_ioctl,
900 .ndo_get_stats = device_get_stats,
901 .ndo_start_xmit = device_xmit,
902 .ndo_set_rx_mode = device_set_multi,
903 };
904
905 static int
906 vt6655_probe(struct pci_dev *pcid, const struct pci_device_id *ent)
907 {
908 static bool bFirst = true;
909 struct net_device* dev = NULL;
910 PCHIP_INFO pChip_info = (PCHIP_INFO)ent->driver_data;
911 PSDevice pDevice;
912 int rc;
913 if (device_nics ++>= MAX_UINTS) {
914 printk(KERN_NOTICE DEVICE_NAME ": already found %d NICs\n", device_nics);
915 return -ENODEV;
916 }
917
918
919 dev = alloc_etherdev(sizeof(DEVICE_INFO));
920
921 pDevice = (PSDevice) netdev_priv(dev);
922
923 if (dev == NULL) {
924 printk(KERN_ERR DEVICE_NAME ": allocate net device failed \n");
925 return -ENOMEM;
926 }
927
928 // Chain it all together
929 // SET_MODULE_OWNER(dev);
930 SET_NETDEV_DEV(dev, &pcid->dev);
931
932 if (bFirst) {
933 printk(KERN_NOTICE "%s Ver. %s\n",DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
934 printk(KERN_NOTICE "Copyright (c) 2003 VIA Networking Technologies, Inc.\n");
935 bFirst=false;
936 }
937
938 vt6655_init_info(pcid, &pDevice, pChip_info);
939 pDevice->dev = dev;
940 pDevice->next_module = root_device_dev;
941 root_device_dev = dev;
942
943 if (pci_enable_device(pcid)) {
944 device_free_info(pDevice);
945 return -ENODEV;
946 }
947 dev->irq = pcid->irq;
948
949 #ifdef DEBUG
950 printk("Before get pci_info memaddr is %x\n",pDevice->memaddr);
951 #endif
952 if (device_get_pci_info(pDevice,pcid) == false) {
953 printk(KERN_ERR DEVICE_NAME ": Failed to find PCI device.\n");
954 device_free_info(pDevice);
955 return -ENODEV;
956 }
957
958 #if 1
959
960 #ifdef DEBUG
961
962 //pci_read_config_byte(pcid, PCI_BASE_ADDRESS_0, &pDevice->byRevId);
963 printk("after get pci_info memaddr is %x, io addr is %x,io_size is %d\n",pDevice->memaddr,pDevice->ioaddr,pDevice->io_size);
964 {
965 int i;
966 u32 bar,len;
967 u32 address[] = {
968 PCI_BASE_ADDRESS_0,
969 PCI_BASE_ADDRESS_1,
970 PCI_BASE_ADDRESS_2,
971 PCI_BASE_ADDRESS_3,
972 PCI_BASE_ADDRESS_4,
973 PCI_BASE_ADDRESS_5,
974 0};
975 for (i=0;address[i];i++)
976 {
977 //pci_write_config_dword(pcid,address[i], 0xFFFFFFFF);
978 pci_read_config_dword(pcid, address[i], &bar);
979 printk("bar %d is %x\n",i,bar);
980 if (!bar)
981 {
982 printk("bar %d not implemented\n",i);
983 continue;
984 }
985 if (bar & PCI_BASE_ADDRESS_SPACE_IO) {
986 /* This is IO */
987
988 len = bar & (PCI_BASE_ADDRESS_IO_MASK & 0xFFFF);
989 len = len & ~(len - 1);
990
991 printk("IO space: len in IO %x, BAR %d\n", len, i);
992 }
993 else
994 {
995 len = bar & 0xFFFFFFF0;
996 len = ~len + 1;
997
998 printk("len in MEM %x, BAR %d\n", len, i);
999 }
1000 }
1001 }
1002 #endif
1003
1004
1005 #endif
1006
1007 #ifdef DEBUG
1008 //return 0 ;
1009 #endif
1010 pDevice->PortOffset = (unsigned long)ioremap(pDevice->memaddr & PCI_BASE_ADDRESS_MEM_MASK, pDevice->io_size);
1011 //pDevice->PortOffset = (unsigned long)ioremap(pDevice->ioaddr & PCI_BASE_ADDRESS_IO_MASK, pDevice->io_size);
1012
1013 if(pDevice->PortOffset == 0) {
1014 printk(KERN_ERR DEVICE_NAME ": Failed to IO remapping ..\n");
1015 device_free_info(pDevice);
1016 return -ENODEV;
1017 }
1018
1019
1020
1021
1022 rc = pci_request_regions(pcid, DEVICE_NAME);
1023 if (rc) {
1024 printk(KERN_ERR DEVICE_NAME ": Failed to find PCI device\n");
1025 device_free_info(pDevice);
1026 return -ENODEV;
1027 }
1028
1029 dev->base_addr = pDevice->ioaddr;
1030 #ifdef PLICE_DEBUG
1031 unsigned char value;
1032
1033 VNSvInPortB(pDevice->PortOffset+0x4F, &value);
1034 printk("Before write: value is %x\n",value);
1035 //VNSvInPortB(pDevice->PortOffset+0x3F, 0x00);
1036 VNSvOutPortB(pDevice->PortOffset,value);
1037 VNSvInPortB(pDevice->PortOffset+0x4F, &value);
1038 printk("After write: value is %x\n",value);
1039 #endif
1040
1041
1042
1043 #ifdef IO_MAP
1044 pDevice->PortOffset = pDevice->ioaddr;
1045 #endif
1046 // do reset
1047 if (!MACbSoftwareReset(pDevice->PortOffset)) {
1048 printk(KERN_ERR DEVICE_NAME ": Failed to access MAC hardware..\n");
1049 device_free_info(pDevice);
1050 return -ENODEV;
1051 }
1052 // initial to reload eeprom
1053 MACvInitialize(pDevice->PortOffset);
1054 MACvReadEtherAddress(pDevice->PortOffset, dev->dev_addr);
1055
1056 device_get_options(pDevice, device_nics-1, dev->name);
1057 device_set_options(pDevice);
1058 //Mask out the options cannot be set to the chip
1059 pDevice->sOpts.flags &= pChip_info->flags;
1060
1061 //Enable the chip specified capabilities
1062 pDevice->flags = pDevice->sOpts.flags | (pChip_info->flags & 0xFF000000UL);
1063 pDevice->tx_80211 = device_dma0_tx_80211;
1064 pDevice->sMgmtObj.pAdapter = (void *)pDevice;
1065 pDevice->pMgmt = &(pDevice->sMgmtObj);
1066
1067 dev->irq = pcid->irq;
1068 dev->netdev_ops = &device_netdev_ops;
1069
1070 dev->wireless_handlers = (struct iw_handler_def *)&iwctl_handler_def;
1071
1072 rc = register_netdev(dev);
1073 if (rc)
1074 {
1075 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
1076 device_free_info(pDevice);
1077 return -ENODEV;
1078 }
1079 device_print_info(pDevice);
1080 pci_set_drvdata(pcid, pDevice);
1081 return 0;
1082
1083 }
1084
1085 static void device_print_info(PSDevice pDevice)
1086 {
1087 struct net_device* dev=pDevice->dev;
1088
1089 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: %s\n",dev->name, get_chip_name(pDevice->chip_id));
1090 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: MAC=%pM", dev->name, dev->dev_addr);
1091 #ifdef IO_MAP
1092 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO" IO=0x%lx ",(unsigned long) pDevice->ioaddr);
1093 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO" IRQ=%d \n", pDevice->dev->irq);
1094 #else
1095 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO" IO=0x%lx Mem=0x%lx ",
1096 (unsigned long) pDevice->ioaddr,(unsigned long) pDevice->PortOffset);
1097 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO" IRQ=%d \n", pDevice->dev->irq);
1098 #endif
1099
1100 }
1101
1102 static void vt6655_init_info(struct pci_dev* pcid, PSDevice* ppDevice,
1103 PCHIP_INFO pChip_info) {
1104
1105 PSDevice p;
1106
1107 memset(*ppDevice,0,sizeof(DEVICE_INFO));
1108
1109 if (pDevice_Infos == NULL) {
1110 pDevice_Infos =*ppDevice;
1111 }
1112 else {
1113 for (p=pDevice_Infos;p->next!=NULL;p=p->next)
1114 do {} while (0);
1115 p->next = *ppDevice;
1116 (*ppDevice)->prev = p;
1117 }
1118
1119 (*ppDevice)->pcid = pcid;
1120 (*ppDevice)->chip_id = pChip_info->chip_id;
1121 (*ppDevice)->io_size = pChip_info->io_size;
1122 (*ppDevice)->nTxQueues = pChip_info->nTxQueue;
1123 (*ppDevice)->multicast_limit =32;
1124
1125 spin_lock_init(&((*ppDevice)->lock));
1126 }
1127
1128 static bool device_get_pci_info(PSDevice pDevice, struct pci_dev* pcid) {
1129
1130 u16 pci_cmd;
1131 u8 b;
1132 unsigned int cis_addr;
1133 #ifdef PLICE_DEBUG
1134 unsigned char pci_config[256];
1135 unsigned char value =0x00;
1136 int ii,j;
1137 u16 max_lat=0x0000;
1138 memset(pci_config,0x00,256);
1139 #endif
1140
1141 pci_read_config_byte(pcid, PCI_REVISION_ID, &pDevice->byRevId);
1142 pci_read_config_word(pcid, PCI_SUBSYSTEM_ID,&pDevice->SubSystemID);
1143 pci_read_config_word(pcid, PCI_SUBSYSTEM_VENDOR_ID, &pDevice->SubVendorID);
1144 pci_read_config_word(pcid, PCI_COMMAND, (u16 *) & (pci_cmd));
1145
1146 pci_set_master(pcid);
1147
1148 pDevice->memaddr = pci_resource_start(pcid,0);
1149 pDevice->ioaddr = pci_resource_start(pcid,1);
1150
1151 #ifdef DEBUG
1152 // pDevice->ioaddr = pci_resource_start(pcid, 0);
1153 // pDevice->memaddr = pci_resource_start(pcid,1);
1154 #endif
1155
1156 cis_addr = pci_resource_start(pcid,2);
1157
1158 pDevice->pcid = pcid;
1159
1160 pci_read_config_byte(pcid, PCI_COMMAND, &b);
1161 pci_write_config_byte(pcid, PCI_COMMAND, (b|PCI_COMMAND_MASTER));
1162
1163 #ifdef PLICE_DEBUG
1164 //pci_read_config_word(pcid,PCI_MAX_LAT,&max_lat);
1165 //printk("max lat is %x,SubSystemID is %x\n",max_lat,pDevice->SubSystemID);
1166 //for (ii=0;ii<0xFF;ii++)
1167 //pci_read_config_word(pcid,PCI_MAX_LAT,&max_lat);
1168 //max_lat = 0x20;
1169 //pci_write_config_word(pcid,PCI_MAX_LAT,max_lat);
1170 //pci_read_config_word(pcid,PCI_MAX_LAT,&max_lat);
1171 //printk("max lat is %x\n",max_lat);
1172
1173 for (ii=0;ii<0xFF;ii++)
1174 {
1175 pci_read_config_byte(pcid,ii,&value);
1176 pci_config[ii] = value;
1177 }
1178 for (ii=0,j=1;ii<0x100;ii++,j++)
1179 {
1180 if (j %16 == 0)
1181 {
1182 printk("%x:",pci_config[ii]);
1183 printk("\n");
1184 }
1185 else
1186 {
1187 printk("%x:",pci_config[ii]);
1188 }
1189 }
1190 #endif
1191 return true;
1192 }
1193
1194 static void device_free_info(PSDevice pDevice) {
1195 PSDevice ptr;
1196 struct net_device* dev=pDevice->dev;
1197
1198 ASSERT(pDevice);
1199 //2008-0714-01<Add>by chester
1200 device_release_WPADEV(pDevice);
1201
1202 //2008-07-21-01<Add>by MikeLiu
1203 //unregister wpadev
1204 if(wpa_set_wpadev(pDevice, 0)!=0)
1205 printk("unregister wpadev fail?\n");
1206
1207 if (pDevice_Infos==NULL)
1208 return;
1209
1210 for (ptr=pDevice_Infos;ptr && (ptr!=pDevice);ptr=ptr->next)
1211 do {} while (0);
1212
1213 if (ptr==pDevice) {
1214 if (ptr==pDevice_Infos)
1215 pDevice_Infos=ptr->next;
1216 else
1217 ptr->prev->next=ptr->next;
1218 }
1219 else {
1220 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR "info struct not found\n");
1221 return;
1222 }
1223 #ifdef HOSTAP
1224 if (dev)
1225 vt6655_hostap_set_hostapd(pDevice, 0, 0);
1226 #endif
1227 if (dev)
1228 unregister_netdev(dev);
1229
1230 if (pDevice->PortOffset)
1231 iounmap((void *)pDevice->PortOffset);
1232
1233 if (pDevice->pcid)
1234 pci_release_regions(pDevice->pcid);
1235 if (dev)
1236 free_netdev(dev);
1237
1238 if (pDevice->pcid) {
1239 pci_set_drvdata(pDevice->pcid,NULL);
1240 }
1241 }
1242
1243 static bool device_init_rings(PSDevice pDevice) {
1244 void* vir_pool;
1245
1246
1247 /*allocate all RD/TD rings a single pool*/
1248 vir_pool = pci_alloc_consistent(pDevice->pcid,
1249 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1250 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1251 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1252 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
1253 &pDevice->pool_dma);
1254
1255 if (vir_pool == NULL) {
1256 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate desc dma memory failed\n", pDevice->dev->name);
1257 return false;
1258 }
1259
1260 memset(vir_pool, 0,
1261 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1262 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1263 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1264 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc)
1265 );
1266
1267 pDevice->aRD0Ring = vir_pool;
1268 pDevice->aRD1Ring = vir_pool +
1269 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
1270
1271
1272 pDevice->rd0_pool_dma = pDevice->pool_dma;
1273 pDevice->rd1_pool_dma = pDevice->rd0_pool_dma +
1274 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
1275
1276 pDevice->tx0_bufs = pci_alloc_consistent(pDevice->pcid,
1277 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1278 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1279 CB_BEACON_BUF_SIZE +
1280 CB_MAX_BUF_SIZE,
1281 &pDevice->tx_bufs_dma0);
1282
1283 if (pDevice->tx0_bufs == NULL) {
1284 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: allocate buf dma memory failed\n", pDevice->dev->name);
1285 pci_free_consistent(pDevice->pcid,
1286 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1287 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1288 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1289 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
1290 vir_pool, pDevice->pool_dma
1291 );
1292 return false;
1293 }
1294
1295 memset(pDevice->tx0_bufs, 0,
1296 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1297 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1298 CB_BEACON_BUF_SIZE +
1299 CB_MAX_BUF_SIZE
1300 );
1301
1302 pDevice->td0_pool_dma = pDevice->rd1_pool_dma +
1303 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
1304
1305 pDevice->td1_pool_dma = pDevice->td0_pool_dma +
1306 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
1307
1308
1309 // vir_pool: pvoid type
1310 pDevice->apTD0Rings = vir_pool
1311 + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
1312 + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
1313
1314 pDevice->apTD1Rings = vir_pool
1315 + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
1316 + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc)
1317 + pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
1318
1319
1320 pDevice->tx1_bufs = pDevice->tx0_bufs +
1321 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
1322
1323
1324 pDevice->tx_beacon_bufs = pDevice->tx1_bufs +
1325 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
1326
1327 pDevice->pbyTmpBuff = pDevice->tx_beacon_bufs +
1328 CB_BEACON_BUF_SIZE;
1329
1330 pDevice->tx_bufs_dma1 = pDevice->tx_bufs_dma0 +
1331 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
1332
1333
1334 pDevice->tx_beacon_dma = pDevice->tx_bufs_dma1 +
1335 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
1336
1337
1338 return true;
1339 }
1340
1341 static void device_free_rings(PSDevice pDevice) {
1342
1343 pci_free_consistent(pDevice->pcid,
1344 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1345 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1346 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1347 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc)
1348 ,
1349 pDevice->aRD0Ring, pDevice->pool_dma
1350 );
1351
1352 if (pDevice->tx0_bufs)
1353 pci_free_consistent(pDevice->pcid,
1354 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1355 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1356 CB_BEACON_BUF_SIZE +
1357 CB_MAX_BUF_SIZE,
1358 pDevice->tx0_bufs, pDevice->tx_bufs_dma0
1359 );
1360 }
1361
1362 static void device_init_rd0_ring(PSDevice pDevice) {
1363 int i;
1364 dma_addr_t curr = pDevice->rd0_pool_dma;
1365 PSRxDesc pDesc;
1366
1367 /* Init the RD0 ring entries */
1368 for (i = 0; i < pDevice->sOpts.nRxDescs0; i ++, curr += sizeof(SRxDesc)) {
1369 pDesc = &(pDevice->aRD0Ring[i]);
1370 pDesc->pRDInfo = alloc_rd_info();
1371 ASSERT(pDesc->pRDInfo);
1372 if (!device_alloc_rx_buf(pDevice, pDesc)) {
1373 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc rx bufs\n",
1374 pDevice->dev->name);
1375 }
1376 pDesc->next = &(pDevice->aRD0Ring[(i+1) % pDevice->sOpts.nRxDescs0]);
1377 pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
1378 pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
1379 }
1380
1381 if (i > 0)
1382 pDevice->aRD0Ring[i-1].next_desc = cpu_to_le32(pDevice->rd0_pool_dma);
1383 pDevice->pCurrRD[0] = &(pDevice->aRD0Ring[0]);
1384 }
1385
1386
1387 static void device_init_rd1_ring(PSDevice pDevice) {
1388 int i;
1389 dma_addr_t curr = pDevice->rd1_pool_dma;
1390 PSRxDesc pDesc;
1391
1392 /* Init the RD1 ring entries */
1393 for (i = 0; i < pDevice->sOpts.nRxDescs1; i ++, curr += sizeof(SRxDesc)) {
1394 pDesc = &(pDevice->aRD1Ring[i]);
1395 pDesc->pRDInfo = alloc_rd_info();
1396 ASSERT(pDesc->pRDInfo);
1397 if (!device_alloc_rx_buf(pDevice, pDesc)) {
1398 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc rx bufs\n",
1399 pDevice->dev->name);
1400 }
1401 pDesc->next = &(pDevice->aRD1Ring[(i+1) % pDevice->sOpts.nRxDescs1]);
1402 pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
1403 pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
1404 }
1405
1406 if (i > 0)
1407 pDevice->aRD1Ring[i-1].next_desc = cpu_to_le32(pDevice->rd1_pool_dma);
1408 pDevice->pCurrRD[1] = &(pDevice->aRD1Ring[0]);
1409 }
1410
1411
1412 static void device_init_defrag_cb(PSDevice pDevice) {
1413 int i;
1414 PSDeFragControlBlock pDeF;
1415
1416 /* Init the fragment ctl entries */
1417 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1418 pDeF = &(pDevice->sRxDFCB[i]);
1419 if (!device_alloc_frag_buf(pDevice, pDeF)) {
1420 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
1421 pDevice->dev->name);
1422 }
1423 }
1424 pDevice->cbDFCB = CB_MAX_RX_FRAG;
1425 pDevice->cbFreeDFCB = pDevice->cbDFCB;
1426 }
1427
1428
1429
1430
1431 static void device_free_rd0_ring(PSDevice pDevice) {
1432 int i;
1433
1434 for (i = 0; i < pDevice->sOpts.nRxDescs0; i++) {
1435 PSRxDesc pDesc =&(pDevice->aRD0Ring[i]);
1436 PDEVICE_RD_INFO pRDInfo =pDesc->pRDInfo;
1437
1438 pci_unmap_single(pDevice->pcid,pRDInfo->skb_dma,
1439 pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1440
1441 dev_kfree_skb(pRDInfo->skb);
1442
1443 kfree((void *)pDesc->pRDInfo);
1444 }
1445
1446 }
1447
1448 static void device_free_rd1_ring(PSDevice pDevice) {
1449 int i;
1450
1451
1452 for (i = 0; i < pDevice->sOpts.nRxDescs1; i++) {
1453 PSRxDesc pDesc=&(pDevice->aRD1Ring[i]);
1454 PDEVICE_RD_INFO pRDInfo=pDesc->pRDInfo;
1455
1456 pci_unmap_single(pDevice->pcid,pRDInfo->skb_dma,
1457 pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1458
1459 dev_kfree_skb(pRDInfo->skb);
1460
1461 kfree((void *)pDesc->pRDInfo);
1462 }
1463
1464 }
1465
1466 static void device_free_frag_buf(PSDevice pDevice) {
1467 PSDeFragControlBlock pDeF;
1468 int i;
1469
1470 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1471
1472 pDeF = &(pDevice->sRxDFCB[i]);
1473
1474 if (pDeF->skb)
1475 dev_kfree_skb(pDeF->skb);
1476
1477 }
1478
1479 }
1480
1481 static void device_init_td0_ring(PSDevice pDevice) {
1482 int i;
1483 dma_addr_t curr;
1484 PSTxDesc pDesc;
1485
1486 curr = pDevice->td0_pool_dma;
1487 for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++, curr += sizeof(STxDesc)) {
1488 pDesc = &(pDevice->apTD0Rings[i]);
1489 pDesc->pTDInfo = alloc_td_info();
1490 ASSERT(pDesc->pTDInfo);
1491 if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
1492 pDesc->pTDInfo->buf = pDevice->tx0_bufs + (i)*PKT_BUF_SZ;
1493 pDesc->pTDInfo->buf_dma = pDevice->tx_bufs_dma0 + (i)*PKT_BUF_SZ;
1494 }
1495 pDesc->next =&(pDevice->apTD0Rings[(i+1) % pDevice->sOpts.nTxDescs[0]]);
1496 pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
1497 pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
1498 }
1499
1500 if (i > 0)
1501 pDevice->apTD0Rings[i-1].next_desc = cpu_to_le32(pDevice->td0_pool_dma);
1502 pDevice->apTailTD[0] = pDevice->apCurrTD[0] =&(pDevice->apTD0Rings[0]);
1503
1504 }
1505
1506 static void device_init_td1_ring(PSDevice pDevice) {
1507 int i;
1508 dma_addr_t curr;
1509 PSTxDesc pDesc;
1510
1511 /* Init the TD ring entries */
1512 curr=pDevice->td1_pool_dma;
1513 for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++, curr+=sizeof(STxDesc)) {
1514 pDesc=&(pDevice->apTD1Rings[i]);
1515 pDesc->pTDInfo = alloc_td_info();
1516 ASSERT(pDesc->pTDInfo);
1517 if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
1518 pDesc->pTDInfo->buf=pDevice->tx1_bufs+(i)*PKT_BUF_SZ;
1519 pDesc->pTDInfo->buf_dma=pDevice->tx_bufs_dma1+(i)*PKT_BUF_SZ;
1520 }
1521 pDesc->next=&(pDevice->apTD1Rings[(i+1) % pDevice->sOpts.nTxDescs[1]]);
1522 pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
1523 pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
1524 }
1525
1526 if (i > 0)
1527 pDevice->apTD1Rings[i-1].next_desc = cpu_to_le32(pDevice->td1_pool_dma);
1528 pDevice->apTailTD[1] = pDevice->apCurrTD[1] = &(pDevice->apTD1Rings[0]);
1529 }
1530
1531
1532
1533 static void device_free_td0_ring(PSDevice pDevice) {
1534 int i;
1535 for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++) {
1536 PSTxDesc pDesc=&(pDevice->apTD0Rings[i]);
1537 PDEVICE_TD_INFO pTDInfo=pDesc->pTDInfo;
1538
1539 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
1540 pci_unmap_single(pDevice->pcid,pTDInfo->skb_dma,
1541 pTDInfo->skb->len, PCI_DMA_TODEVICE);
1542
1543 if (pTDInfo->skb)
1544 dev_kfree_skb(pTDInfo->skb);
1545
1546 kfree((void *)pDesc->pTDInfo);
1547 }
1548 }
1549
1550 static void device_free_td1_ring(PSDevice pDevice) {
1551 int i;
1552
1553 for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++) {
1554 PSTxDesc pDesc=&(pDevice->apTD1Rings[i]);
1555 PDEVICE_TD_INFO pTDInfo=pDesc->pTDInfo;
1556
1557 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
1558 pci_unmap_single(pDevice->pcid, pTDInfo->skb_dma,
1559 pTDInfo->skb->len, PCI_DMA_TODEVICE);
1560
1561 if (pTDInfo->skb)
1562 dev_kfree_skb(pTDInfo->skb);
1563
1564 kfree((void *)pDesc->pTDInfo);
1565 }
1566
1567 }
1568
1569
1570
1571 /*-----------------------------------------------------------------*/
1572
1573 static int device_rx_srv(PSDevice pDevice, unsigned int uIdx) {
1574 PSRxDesc pRD;
1575 int works = 0;
1576
1577
1578 for (pRD = pDevice->pCurrRD[uIdx];
1579 pRD->m_rd0RD0.f1Owner == OWNED_BY_HOST;
1580 pRD = pRD->next) {
1581 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->pCurrRD = %x, works = %d\n", pRD, works);
1582 if (works++>15)
1583 break;
1584 if (device_receive_frame(pDevice, pRD)) {
1585 if (!device_alloc_rx_buf(pDevice,pRD)) {
1586 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR
1587 "%s: can not allocate rx buf\n", pDevice->dev->name);
1588 break;
1589 }
1590 }
1591 pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
1592 pDevice->dev->last_rx = jiffies;
1593 }
1594
1595 pDevice->pCurrRD[uIdx]=pRD;
1596
1597 return works;
1598 }
1599
1600
1601 static bool device_alloc_rx_buf(PSDevice pDevice, PSRxDesc pRD) {
1602
1603 PDEVICE_RD_INFO pRDInfo=pRD->pRDInfo;
1604
1605
1606 pRDInfo->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1607 #ifdef PLICE_DEBUG
1608 //printk("device_alloc_rx_buf:skb is %x\n",pRDInfo->skb);
1609 #endif
1610 if (pRDInfo->skb==NULL)
1611 return false;
1612 ASSERT(pRDInfo->skb);
1613 pRDInfo->skb->dev = pDevice->dev;
1614 pRDInfo->skb_dma = pci_map_single(pDevice->pcid, skb_tail_pointer(pRDInfo->skb),
1615 pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1616 *((unsigned int *) &(pRD->m_rd0RD0)) = 0; /* FIX cast */
1617
1618 pRD->m_rd0RD0.wResCount = cpu_to_le16(pDevice->rx_buf_sz);
1619 pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
1620 pRD->m_rd1RD1.wReqCount = cpu_to_le16(pDevice->rx_buf_sz);
1621 pRD->buff_addr = cpu_to_le32(pRDInfo->skb_dma);
1622
1623 return true;
1624 }
1625
1626
1627
1628 bool device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
1629
1630 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1631 if (pDeF->skb == NULL)
1632 return false;
1633 ASSERT(pDeF->skb);
1634 pDeF->skb->dev = pDevice->dev;
1635
1636 return true;
1637 }
1638
1639
1640
1641 static int device_tx_srv(PSDevice pDevice, unsigned int uIdx) {
1642 PSTxDesc pTD;
1643 bool bFull=false;
1644 int works = 0;
1645 unsigned char byTsr0;
1646 unsigned char byTsr1;
1647 unsigned int uFrameSize, uFIFOHeaderSize;
1648 PSTxBufHead pTxBufHead;
1649 struct net_device_stats* pStats = &pDevice->stats;
1650 struct sk_buff* skb;
1651 unsigned int uNodeIndex;
1652 PSMgmtObject pMgmt = pDevice->pMgmt;
1653
1654
1655 for (pTD = pDevice->apTailTD[uIdx]; pDevice->iTDUsed[uIdx] >0; pTD = pTD->next) {
1656
1657 if (pTD->m_td0TD0.f1Owner == OWNED_BY_NIC)
1658 break;
1659 if (works++>15)
1660 break;
1661
1662 byTsr0 = pTD->m_td0TD0.byTSR0;
1663 byTsr1 = pTD->m_td0TD0.byTSR1;
1664
1665 //Only the status of first TD in the chain is correct
1666 if (pTD->m_td1TD1.byTCR & TCR_STP) {
1667
1668 if ((pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0) {
1669 uFIFOHeaderSize = pTD->pTDInfo->dwHeaderLength;
1670 uFrameSize = pTD->pTDInfo->dwReqCount - uFIFOHeaderSize;
1671 pTxBufHead = (PSTxBufHead) (pTD->pTDInfo->buf);
1672 // Update the statistics based on the Transmit status
1673 // now, we DONT check TSR0_CDH
1674
1675 STAvUpdateTDStatCounter(&pDevice->scStatistic,
1676 byTsr0, byTsr1,
1677 (unsigned char *)(pTD->pTDInfo->buf + uFIFOHeaderSize),
1678 uFrameSize, uIdx);
1679
1680
1681 BSSvUpdateNodeTxCounter(pDevice,
1682 byTsr0, byTsr1,
1683 (unsigned char *)(pTD->pTDInfo->buf),
1684 uFIFOHeaderSize
1685 );
1686
1687 if ( !(byTsr1 & TSR1_TERR)) {
1688 if (byTsr0 != 0) {
1689 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X].\n",
1690 (int)uIdx, byTsr1, byTsr0);
1691 }
1692 if ((pTxBufHead->wFragCtl & FRAGCTL_ENDFRAG) != FRAGCTL_NONFRAG) {
1693 pDevice->s802_11Counter.TransmittedFragmentCount ++;
1694 }
1695 pStats->tx_packets++;
1696 pStats->tx_bytes += pTD->pTDInfo->skb->len;
1697 }
1698 else {
1699 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] dropped & tsr1[%02X] tsr0[%02X].\n",
1700 (int)uIdx, byTsr1, byTsr0);
1701 pStats->tx_errors++;
1702 pStats->tx_dropped++;
1703 }
1704 }
1705
1706 if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
1707 if (pDevice->bEnableHostapd) {
1708 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "tx call back netif.. \n");
1709 skb = pTD->pTDInfo->skb;
1710 skb->dev = pDevice->apdev;
1711 skb_reset_mac_header(skb);
1712 skb->pkt_type = PACKET_OTHERHOST;
1713 //skb->protocol = htons(ETH_P_802_2);
1714 memset(skb->cb, 0, sizeof(skb->cb));
1715 netif_rx(skb);
1716 }
1717 }
1718
1719 if (byTsr1 & TSR1_TERR) {
1720 if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
1721 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X].\n",
1722 (int)uIdx, byTsr1, byTsr0);
1723 }
1724
1725 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X].\n",
1726 // (int)uIdx, byTsr1, byTsr0);
1727
1728 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
1729 (pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB)) {
1730 unsigned short wAID;
1731 unsigned char byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
1732
1733 skb = pTD->pTDInfo->skb;
1734 if (BSSDBbIsSTAInNodeDB(pMgmt, (unsigned char *)(skb->data), &uNodeIndex)) {
1735 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
1736 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
1737 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
1738 // set tx map
1739 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
1740 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
1741 pTD->pTDInfo->byFlags &= ~(TD_FLAGS_NETIF_SKB);
1742 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "tx_srv:tx fail re-queue sta index= %d, QueCnt= %d\n"
1743 ,(int)uNodeIndex, pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt);
1744 pStats->tx_errors--;
1745 pStats->tx_dropped--;
1746 }
1747 }
1748 }
1749 }
1750 device_free_tx_buf(pDevice,pTD);
1751 pDevice->iTDUsed[uIdx]--;
1752 }
1753 }
1754
1755
1756 if (uIdx == TYPE_AC0DMA) {
1757 // RESERV_AC0DMA reserved for relay
1758
1759 if (AVAIL_TD(pDevice, uIdx) < RESERV_AC0DMA) {
1760 bFull = true;
1761 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " AC0DMA is Full = %d\n", pDevice->iTDUsed[uIdx]);
1762 }
1763 if (netif_queue_stopped(pDevice->dev) && (bFull==false)){
1764 netif_wake_queue(pDevice->dev);
1765 }
1766 }
1767
1768
1769 pDevice->apTailTD[uIdx] = pTD;
1770
1771 return works;
1772 }
1773
1774
1775 static void device_error(PSDevice pDevice, unsigned short status) {
1776
1777 if (status & ISR_FETALERR) {
1778 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR
1779 "%s: Hardware fatal error.\n",
1780 pDevice->dev->name);
1781 netif_stop_queue(pDevice->dev);
1782 del_timer(&pDevice->sTimerCommand);
1783 del_timer(&(pDevice->pMgmt->sTimerSecondCallback));
1784 pDevice->bCmdRunning = false;
1785 MACbShutdown(pDevice->PortOffset);
1786 return;
1787 }
1788
1789 }
1790
1791 static void device_free_tx_buf(PSDevice pDevice, PSTxDesc pDesc) {
1792 PDEVICE_TD_INFO pTDInfo=pDesc->pTDInfo;
1793 struct sk_buff* skb=pTDInfo->skb;
1794
1795 // pre-allocated buf_dma can't be unmapped.
1796 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma)) {
1797 pci_unmap_single(pDevice->pcid,pTDInfo->skb_dma,skb->len,
1798 PCI_DMA_TODEVICE);
1799 }
1800
1801 if ((pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0)
1802 dev_kfree_skb_irq(skb);
1803
1804 pTDInfo->skb_dma = 0;
1805 pTDInfo->skb = 0;
1806 pTDInfo->byFlags = 0;
1807 }
1808
1809
1810
1811 //PLICE_DEBUG ->
1812 void InitRxManagementQueue(PSDevice pDevice)
1813 {
1814 pDevice->rxManeQueue.packet_num = 0;
1815 pDevice->rxManeQueue.head = pDevice->rxManeQueue.tail = 0;
1816 }
1817 //PLICE_DEBUG<-
1818
1819
1820
1821
1822
1823 //PLICE_DEBUG ->
1824 int MlmeThread(
1825 void * Context)
1826 {
1827 PSDevice pDevice = (PSDevice) Context;
1828 PSRxMgmtPacket pRxMgmtPacket;
1829 // int i ;
1830 //complete(&pDevice->notify);
1831 //printk("Enter MngWorkItem,Queue packet num is %d\n",pDevice->rxManeQueue.packet_num);
1832
1833 //printk("Enter MlmeThread,packet _num is %d\n",pDevice->rxManeQueue.packet_num);
1834 //i = 0;
1835 #if 1
1836 while (1)
1837 {
1838
1839 //printk("DDDD\n");
1840 //down(&pDevice->mlme_semaphore);
1841 // pRxMgmtPacket = DeQueue(pDevice);
1842 #if 1
1843 spin_lock_irq(&pDevice->lock);
1844 while(pDevice->rxManeQueue.packet_num != 0)
1845 {
1846 pRxMgmtPacket = DeQueue(pDevice);
1847 //pDevice;
1848 //DequeueManageObject(pDevice->FirstRecvMngList, pDevice->LastRecvMngList);
1849 vMgrRxManagePacket(pDevice, pDevice->pMgmt, pRxMgmtPacket);
1850 //printk("packet_num is %d\n",pDevice->rxManeQueue.packet_num);
1851
1852 }
1853 spin_unlock_irq(&pDevice->lock);
1854 if (mlme_kill == 0)
1855 break;
1856 //udelay(200);
1857 #endif
1858 //printk("Before schedule thread jiffies is %x\n",jiffies);
1859 schedule();
1860 //printk("after schedule thread jiffies is %x\n",jiffies);
1861 if (mlme_kill == 0)
1862 break;
1863 //printk("i is %d\n",i);
1864 }
1865
1866 #endif
1867 return 0;
1868
1869 }
1870
1871
1872
1873 static int device_open(struct net_device *dev) {
1874 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1875 int i;
1876 #ifdef WPA_SM_Transtatus
1877 extern SWPAResult wpa_Result;
1878 #endif
1879
1880 pDevice->rx_buf_sz = PKT_BUF_SZ;
1881 if (!device_init_rings(pDevice)) {
1882 return -ENOMEM;
1883 }
1884 //2008-5-13 <add> by chester
1885 i=request_irq(pDevice->pcid->irq, &device_intr, IRQF_SHARED, dev->name, dev);
1886 if (i)
1887 return i;
1888 //printk("DEBUG1\n");
1889 #ifdef WPA_SM_Transtatus
1890 memset(wpa_Result.ifname,0,sizeof(wpa_Result.ifname));
1891 wpa_Result.proto = 0;
1892 wpa_Result.key_mgmt = 0;
1893 wpa_Result.eap_type = 0;
1894 wpa_Result.authenticated = false;
1895 pDevice->fWPA_Authened = false;
1896 #endif
1897 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call device init rd0 ring\n");
1898 device_init_rd0_ring(pDevice);
1899 device_init_rd1_ring(pDevice);
1900 device_init_defrag_cb(pDevice);
1901 device_init_td0_ring(pDevice);
1902 device_init_td1_ring(pDevice);
1903 // VNTWIFIvSet11h(pDevice->pMgmt, pDevice->b11hEnable);
1904
1905
1906 if (pDevice->bDiversityRegCtlON) {
1907 device_init_diversity_timer(pDevice);
1908 }
1909 vMgrObjectInit(pDevice);
1910 vMgrTimerInit(pDevice);
1911
1912 //PLICE_DEBUG->
1913 #ifdef TASK_LET
1914 tasklet_init (&pDevice->RxMngWorkItem,(void *)MngWorkItem,(unsigned long )pDevice);
1915 #endif
1916 #ifdef THREAD
1917 InitRxManagementQueue(pDevice);
1918 mlme_kill = 0;
1919 mlme_task = kthread_run(MlmeThread,(void *) pDevice, "MLME");
1920 if (IS_ERR(mlme_task)) {
1921 printk("thread create fail\n");
1922 return -1;
1923 }
1924
1925 mlme_kill = 1;
1926 #endif
1927
1928
1929
1930 //printk("thread id is %d\n",pDevice->MLMEThr_pid);
1931 //printk("Create thread time is %x\n",jiffies);
1932 //wait_for_completion(&pDevice->notify);
1933
1934
1935
1936
1937 // if (( SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RADIOCTL)&0x06)==0x04)
1938 // return -ENOMEM;
1939 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call device_init_registers\n");
1940 device_init_registers(pDevice, DEVICE_INIT_COLD);
1941 MACvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
1942 memcpy(pDevice->pMgmt->abyMACAddr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1943 device_set_multi(pDevice->dev);
1944
1945 // Init for Key Management
1946 KeyvInitTable(&pDevice->sKey, pDevice->PortOffset);
1947 add_timer(&(pDevice->pMgmt->sTimerSecondCallback));
1948
1949 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1950 /*
1951 pDevice->bwextstep0 = false;
1952 pDevice->bwextstep1 = false;
1953 pDevice->bwextstep2 = false;
1954 pDevice->bwextstep3 = false;
1955 */
1956 pDevice->bwextcount=0;
1957 pDevice->bWPASuppWextEnabled = false;
1958 #endif
1959 pDevice->byReAssocCount = 0;
1960 pDevice->bWPADEVUp = false;
1961 // Patch: if WEP key already set by iwconfig but device not yet open
1962 if ((pDevice->bEncryptionEnable == true) && (pDevice->bTransmitKey == true)) {
1963 KeybSetDefaultKey(&(pDevice->sKey),
1964 (unsigned long)(pDevice->byKeyIndex | (1 << 31)),
1965 pDevice->uKeyLength,
1966 NULL,
1967 pDevice->abyKey,
1968 KEY_CTL_WEP,
1969 pDevice->PortOffset,
1970 pDevice->byLocalID
1971 );
1972 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1973 }
1974
1975 //printk("DEBUG2\n");
1976
1977
1978 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call MACvIntEnable\n");
1979 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
1980
1981 if (pDevice->pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1982 bScheduleCommand((void *)pDevice, WLAN_CMD_RUN_AP, NULL);
1983 }
1984 else {
1985 bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1986 bScheduleCommand((void *)pDevice, WLAN_CMD_SSID, NULL);
1987 }
1988 pDevice->flags |=DEVICE_FLAGS_OPENED;
1989
1990 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
1991 return 0;
1992 }
1993
1994
1995 static int device_close(struct net_device *dev) {
1996 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1997 PSMgmtObject pMgmt = pDevice->pMgmt;
1998 //PLICE_DEBUG->
1999 #ifdef THREAD
2000 mlme_kill = 0;
2001 #endif
2002 //PLICE_DEBUG<-
2003 //2007-1121-02<Add>by EinsnLiu
2004 if (pDevice->bLinkPass) {
2005 bScheduleCommand((void *)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
2006 mdelay(30);
2007 }
2008 #ifdef TxInSleep
2009 del_timer(&pDevice->sTimerTxData);
2010 #endif
2011 del_timer(&pDevice->sTimerCommand);
2012 del_timer(&pMgmt->sTimerSecondCallback);
2013 if (pDevice->bDiversityRegCtlON) {
2014 del_timer(&pDevice->TimerSQ3Tmax1);
2015 del_timer(&pDevice->TimerSQ3Tmax2);
2016 del_timer(&pDevice->TimerSQ3Tmax3);
2017 }
2018
2019 #ifdef TASK_LET
2020 tasklet_kill(&pDevice->RxMngWorkItem);
2021 #endif
2022 netif_stop_queue(dev);
2023 pDevice->bCmdRunning = false;
2024 MACbShutdown(pDevice->PortOffset);
2025 MACbSoftwareReset(pDevice->PortOffset);
2026 CARDbRadioPowerOff(pDevice);
2027
2028 pDevice->bLinkPass = false;
2029 memset(pMgmt->abyCurrBSSID, 0, 6);
2030 pMgmt->eCurrState = WMAC_STATE_IDLE;
2031 device_free_td0_ring(pDevice);
2032 device_free_td1_ring(pDevice);
2033 device_free_rd0_ring(pDevice);
2034 device_free_rd1_ring(pDevice);
2035 device_free_frag_buf(pDevice);
2036 device_free_rings(pDevice);
2037 BSSvClearNodeDBTable(pDevice, 0);
2038 free_irq(dev->irq, dev);
2039 pDevice->flags &=(~DEVICE_FLAGS_OPENED);
2040 //2008-0714-01<Add>by chester
2041 device_release_WPADEV(pDevice);
2042 //PLICE_DEBUG->
2043 //tasklet_kill(&pDevice->RxMngWorkItem);
2044 //PLICE_DEBUG<-
2045 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close.. \n");
2046 return 0;
2047 }
2048
2049
2050
2051 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev) {
2052 PSDevice pDevice=netdev_priv(dev);
2053 unsigned char *pbMPDU;
2054 unsigned int cbMPDULen = 0;
2055
2056
2057 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211\n");
2058 spin_lock_irq(&pDevice->lock);
2059
2060 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
2061 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211, td0 <=0\n");
2062 dev_kfree_skb_irq(skb);
2063 spin_unlock_irq(&pDevice->lock);
2064 return 0;
2065 }
2066
2067 if (pDevice->bStopTx0Pkt == true) {
2068 dev_kfree_skb_irq(skb);
2069 spin_unlock_irq(&pDevice->lock);
2070 return 0;
2071 }
2072
2073 cbMPDULen = skb->len;
2074 pbMPDU = skb->data;
2075
2076 vDMA0_tx_80211(pDevice, skb, pbMPDU, cbMPDULen);
2077
2078 spin_unlock_irq(&pDevice->lock);
2079
2080 return 0;
2081
2082 }
2083
2084
2085
2086 bool device_dma0_xmit(PSDevice pDevice, struct sk_buff *skb, unsigned int uNodeIndex) {
2087 PSMgmtObject pMgmt = pDevice->pMgmt;
2088 PSTxDesc pHeadTD, pLastTD;
2089 unsigned int cbFrameBodySize;
2090 unsigned int uMACfragNum;
2091 unsigned char byPktType;
2092 bool bNeedEncryption = false;
2093 PSKeyItem pTransmitKey = NULL;
2094 unsigned int cbHeaderSize;
2095 unsigned int ii;
2096 SKeyItem STempKey;
2097 // unsigned char byKeyIndex = 0;
2098
2099
2100 if (pDevice->bStopTx0Pkt == true) {
2101 dev_kfree_skb_irq(skb);
2102 return false;
2103 }
2104
2105 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
2106 dev_kfree_skb_irq(skb);
2107 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_xmit, td0 <=0\n");
2108 return false;
2109 }
2110
2111 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2112 if (pDevice->uAssocCount == 0) {
2113 dev_kfree_skb_irq(skb);
2114 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_xmit, assocCount = 0\n");
2115 return false;
2116 }
2117 }
2118
2119 pHeadTD = pDevice->apCurrTD[TYPE_TXDMA0];
2120
2121 pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);
2122
2123 memcpy(pDevice->sTxEthHeader.abyDstAddr, (unsigned char *)(skb->data), ETH_HLEN);
2124 cbFrameBodySize = skb->len - ETH_HLEN;
2125
2126 // 802.1H
2127 if (ntohs(pDevice->sTxEthHeader.wType) > ETH_DATA_LEN) {
2128 cbFrameBodySize += 8;
2129 }
2130 uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);
2131
2132 if ( uMACfragNum > AVAIL_TD(pDevice, TYPE_TXDMA0)) {
2133 dev_kfree_skb_irq(skb);
2134 return false;
2135 }
2136 byPktType = (unsigned char)pDevice->byPacketType;
2137
2138
2139 if (pDevice->bFixRate) {
2140 if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
2141 if (pDevice->uConnectionRate >= RATE_11M) {
2142 pDevice->wCurrentRate = RATE_11M;
2143 } else {
2144 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2145 }
2146 } else {
2147 if (pDevice->uConnectionRate >= RATE_54M)
2148 pDevice->wCurrentRate = RATE_54M;
2149 else
2150 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2151 }
2152 }
2153 else {
2154 pDevice->wCurrentRate = pDevice->pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2155 }
2156
2157 //preamble type
2158 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2159 pDevice->byPreambleType = pDevice->byShortPreamble;
2160 }
2161 else {
2162 pDevice->byPreambleType = PREAMBLE_LONG;
2163 }
2164
2165 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dma0: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);
2166
2167
2168 if (pDevice->wCurrentRate <= RATE_11M) {
2169 byPktType = PK_TYPE_11B;
2170 } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2171 byPktType = PK_TYPE_11A;
2172 } else {
2173 if (pDevice->bProtectMode == true) {
2174 byPktType = PK_TYPE_11GB;
2175 } else {
2176 byPktType = PK_TYPE_11GA;
2177 }
2178 }
2179
2180 if (pDevice->bEncryptionEnable == true)
2181 bNeedEncryption = true;
2182
2183 if (pDevice->bEnableHostWEP) {
2184 pTransmitKey = &STempKey;
2185 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2186 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2187 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2188 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2189 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2190 memcpy(pTransmitKey->abyKey,
2191 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2192 pTransmitKey->uKeyLength
2193 );
2194 }
2195 vGenerateFIFOHeader(pDevice, byPktType, pDevice->pbyTmpBuff, bNeedEncryption,
2196 cbFrameBodySize, TYPE_TXDMA0, pHeadTD,
2197 &pDevice->sTxEthHeader, (unsigned char *)skb->data, pTransmitKey, uNodeIndex,
2198 &uMACfragNum,
2199 &cbHeaderSize
2200 );
2201
2202 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2203 // Disable PS
2204 MACbPSWakeup(pDevice->PortOffset);
2205 }
2206
2207 pDevice->bPWBitOn = false;
2208
2209 pLastTD = pHeadTD;
2210 for (ii = 0; ii < uMACfragNum; ii++) {
2211 // Poll Transmit the adapter
2212 wmb();
2213 pHeadTD->m_td0TD0.f1Owner=OWNED_BY_NIC;
2214 wmb();
2215 if (ii == (uMACfragNum - 1))
2216 pLastTD = pHeadTD;
2217 pHeadTD = pHeadTD->next;
2218 }
2219
2220 // Save the information needed by the tx interrupt handler
2221 // to complete the Send request
2222 pLastTD->pTDInfo->skb = skb;
2223 pLastTD->pTDInfo->byFlags = 0;
2224 pLastTD->pTDInfo->byFlags |= TD_FLAGS_NETIF_SKB;
2225
2226 pDevice->apCurrTD[TYPE_TXDMA0] = pHeadTD;
2227
2228 MACvTransmit0(pDevice->PortOffset);
2229
2230
2231 return true;
2232 }
2233
2234 //TYPE_AC0DMA data tx
2235 static int device_xmit(struct sk_buff *skb, struct net_device *dev) {
2236 PSDevice pDevice=netdev_priv(dev);
2237
2238 PSMgmtObject pMgmt = pDevice->pMgmt;
2239 PSTxDesc pHeadTD, pLastTD;
2240 unsigned int uNodeIndex = 0;
2241 unsigned char byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
2242 unsigned short wAID;
2243 unsigned int uMACfragNum = 1;
2244 unsigned int cbFrameBodySize;
2245 unsigned char byPktType;
2246 unsigned int cbHeaderSize;
2247 bool bNeedEncryption = false;
2248 PSKeyItem pTransmitKey = NULL;
2249 SKeyItem STempKey;
2250 unsigned int ii;
2251 bool bTKIP_UseGTK = false;
2252 bool bNeedDeAuth = false;
2253 unsigned char *pbyBSSID;
2254 bool bNodeExist = false;
2255
2256
2257
2258 spin_lock_irq(&pDevice->lock);
2259 if (pDevice->bLinkPass == false) {
2260 dev_kfree_skb_irq(skb);
2261 spin_unlock_irq(&pDevice->lock);
2262 return 0;
2263 }
2264
2265 if (pDevice->bStopDataPkt) {
2266 dev_kfree_skb_irq(skb);
2267 spin_unlock_irq(&pDevice->lock);
2268 return 0;
2269 }
2270
2271
2272 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2273 if (pDevice->uAssocCount == 0) {
2274 dev_kfree_skb_irq(skb);
2275 spin_unlock_irq(&pDevice->lock);
2276 return 0;
2277 }
2278 if (is_multicast_ether_addr((unsigned char *)(skb->data))) {
2279 uNodeIndex = 0;
2280 bNodeExist = true;
2281 if (pMgmt->sNodeDBTable[0].bPSEnable) {
2282 skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
2283 pMgmt->sNodeDBTable[0].wEnQueueCnt++;
2284 // set tx map
2285 pMgmt->abyPSTxMap[0] |= byMask[0];
2286 spin_unlock_irq(&pDevice->lock);
2287 return 0;
2288 }
2289 }else {
2290 if (BSSDBbIsSTAInNodeDB(pMgmt, (unsigned char *)(skb->data), &uNodeIndex)) {
2291 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
2292 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
2293 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
2294 // set tx map
2295 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
2296 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
2297 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set:pMgmt->abyPSTxMap[%d]= %d\n",
2298 (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]);
2299 spin_unlock_irq(&pDevice->lock);
2300 return 0;
2301 }
2302
2303 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2304 pDevice->byPreambleType = pDevice->byShortPreamble;
2305
2306 }else {
2307 pDevice->byPreambleType = PREAMBLE_LONG;
2308 }
2309 bNodeExist = true;
2310
2311 }
2312 }
2313
2314 if (bNodeExist == false) {
2315 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Unknown STA not found in node DB \n");
2316 dev_kfree_skb_irq(skb);
2317 spin_unlock_irq(&pDevice->lock);
2318 return 0;
2319 }
2320 }
2321
2322 pHeadTD = pDevice->apCurrTD[TYPE_AC0DMA];
2323
2324 pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);
2325
2326
2327 memcpy(pDevice->sTxEthHeader.abyDstAddr, (unsigned char *)(skb->data), ETH_HLEN);
2328 cbFrameBodySize = skb->len - ETH_HLEN;
2329 // 802.1H
2330 if (ntohs(pDevice->sTxEthHeader.wType) > ETH_DATA_LEN) {
2331 cbFrameBodySize += 8;
2332 }
2333
2334
2335 if (pDevice->bEncryptionEnable == true) {
2336 bNeedEncryption = true;
2337 // get Transmit key
2338 do {
2339 if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
2340 (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2341 pbyBSSID = pDevice->abyBSSID;
2342 // get pairwise key
2343 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
2344 // get group key
2345 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
2346 bTKIP_UseGTK = true;
2347 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2348 break;
2349 }
2350 } else {
2351 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n");
2352 break;
2353 }
2354 }else if (pDevice->pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2355
2356 pbyBSSID = pDevice->sTxEthHeader.abyDstAddr; //TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1
2357 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS Serach Key: \n");
2358 for (ii = 0; ii< 6; ii++)
2359 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"%x \n", *(pbyBSSID+ii));
2360 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"\n");
2361
2362 // get pairwise key
2363 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == true)
2364 break;
2365 }
2366 // get group key
2367 pbyBSSID = pDevice->abyBroadcastAddr;
2368 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
2369 pTransmitKey = NULL;
2370 if (pDevice->pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2371 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS and KEY is NULL. [%d]\n", pDevice->pMgmt->eCurrMode);
2372 }
2373 else
2374 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pDevice->pMgmt->eCurrMode);
2375 } else {
2376 bTKIP_UseGTK = true;
2377 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2378 }
2379 } while(false);
2380 }
2381
2382 if (pDevice->bEnableHostWEP) {
2383 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"acdma0: STA index %d\n", uNodeIndex);
2384 if (pDevice->bEncryptionEnable == true) {
2385 pTransmitKey = &STempKey;
2386 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2387 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2388 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2389 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2390 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2391 memcpy(pTransmitKey->abyKey,
2392 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2393 pTransmitKey->uKeyLength
2394 );
2395 }
2396 }
2397
2398 uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);
2399
2400 if (uMACfragNum > AVAIL_TD(pDevice, TYPE_AC0DMA)) {
2401 DBG_PRT(MSG_LEVEL_ERR, KERN_DEBUG "uMACfragNum > AVAIL_TD(TYPE_AC0DMA) = %d\n", uMACfragNum);
2402 dev_kfree_skb_irq(skb);
2403 spin_unlock_irq(&pDevice->lock);
2404 return 0;
2405 }
2406
2407 if (pTransmitKey != NULL) {
2408 if ((pTransmitKey->byCipherSuite == KEY_CTL_WEP) &&
2409 (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN)) {
2410 uMACfragNum = 1; //WEP256 doesn't support fragment
2411 }
2412 }
2413
2414 byPktType = (unsigned char)pDevice->byPacketType;
2415
2416 if (pDevice->bFixRate) {
2417 #ifdef PLICE_DEBUG
2418 printk("Fix Rate: PhyType is %d,ConnectionRate is %d\n",pDevice->eCurrentPHYType,pDevice->uConnectionRate);
2419 #endif
2420
2421 if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
2422 if (pDevice->uConnectionRate >= RATE_11M) {
2423 pDevice->wCurrentRate = RATE_11M;
2424 } else {
2425 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2426 }
2427 } else {
2428 if ((pDevice->eCurrentPHYType == PHY_TYPE_11A) &&
2429 (pDevice->uConnectionRate <= RATE_6M)) {
2430 pDevice->wCurrentRate = RATE_6M;
2431 } else {
2432 if (pDevice->uConnectionRate >= RATE_54M)
2433 pDevice->wCurrentRate = RATE_54M;
2434 else
2435 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2436
2437 }
2438 }
2439 pDevice->byACKRate = (unsigned char) pDevice->wCurrentRate;
2440 pDevice->byTopCCKBasicRate = RATE_1M;
2441 pDevice->byTopOFDMBasicRate = RATE_6M;
2442 }
2443 else {
2444 //auto rate
2445 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2446 if (pDevice->eCurrentPHYType != PHY_TYPE_11A) {
2447 pDevice->wCurrentRate = RATE_1M;
2448 pDevice->byACKRate = RATE_1M;
2449 pDevice->byTopCCKBasicRate = RATE_1M;
2450 pDevice->byTopOFDMBasicRate = RATE_6M;
2451 } else {
2452 pDevice->wCurrentRate = RATE_6M;
2453 pDevice->byACKRate = RATE_6M;
2454 pDevice->byTopCCKBasicRate = RATE_1M;
2455 pDevice->byTopOFDMBasicRate = RATE_6M;
2456 }
2457 }
2458 else {
2459 VNTWIFIvGetTxRate( pDevice->pMgmt,
2460 pDevice->sTxEthHeader.abyDstAddr,
2461 &(pDevice->wCurrentRate),
2462 &(pDevice->byACKRate),
2463 &(pDevice->byTopCCKBasicRate),
2464 &(pDevice->byTopOFDMBasicRate));
2465
2466
2467 }
2468 }
2469
2470 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "acdma0: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);
2471
2472 if (pDevice->wCurrentRate <= RATE_11M) {
2473 byPktType = PK_TYPE_11B;
2474 } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2475 byPktType = PK_TYPE_11A;
2476 } else {
2477 if (pDevice->bProtectMode == true) {
2478 byPktType = PK_TYPE_11GB;
2479 } else {
2480 byPktType = PK_TYPE_11GA;
2481 }
2482 }
2483
2484 //#ifdef PLICE_DEBUG
2485 // printk("FIX RATE:CurrentRate is %d");
2486 //#endif
2487
2488 if (bNeedEncryption == true) {
2489 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType));
2490 if ((pDevice->sTxEthHeader.wType) == TYPE_PKT_802_1x) {
2491 bNeedEncryption = false;
2492 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType));
2493 if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2494 if (pTransmitKey == NULL) {
2495 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Don't Find TX KEY\n");
2496 }
2497 else {
2498 if (bTKIP_UseGTK == true) {
2499 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n");
2500 }
2501 else {
2502 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
2503 bNeedEncryption = true;
2504 }
2505 }
2506 }
2507
2508 if (pDevice->byCntMeasure == 2) {
2509 bNeedDeAuth = true;
2510 pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++;
2511 }
2512
2513 if (pDevice->bEnableHostWEP) {
2514 if ((uNodeIndex != 0) &&
2515 (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) {
2516 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
2517 bNeedEncryption = true;
2518 }
2519 }
2520 }
2521 else {
2522 if (pTransmitKey == NULL) {
2523 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
2524 dev_kfree_skb_irq(skb);
2525 spin_unlock_irq(&pDevice->lock);
2526 return 0;
2527 }
2528 }
2529 }
2530
2531
2532 #ifdef PLICE_DEBUG
2533 //if (skb->len == 98)
2534 //{
2535 // printk("ping:len is %d\n");
2536 //}
2537 #endif
2538 vGenerateFIFOHeader(pDevice, byPktType, pDevice->pbyTmpBuff, bNeedEncryption,
2539 cbFrameBodySize, TYPE_AC0DMA, pHeadTD,
2540 &pDevice->sTxEthHeader, (unsigned char *)skb->data, pTransmitKey, uNodeIndex,
2541 &uMACfragNum,
2542 &cbHeaderSize
2543 );
2544
2545 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2546 // Disable PS
2547 MACbPSWakeup(pDevice->PortOffset);
2548 }
2549 pDevice->bPWBitOn = false;
2550
2551 pLastTD = pHeadTD;
2552 for (ii = 0; ii < uMACfragNum; ii++) {
2553 // Poll Transmit the adapter
2554 wmb();
2555 pHeadTD->m_td0TD0.f1Owner=OWNED_BY_NIC;
2556 wmb();
2557 if (ii == uMACfragNum - 1)
2558 pLastTD = pHeadTD;
2559 pHeadTD = pHeadTD->next;
2560 }
2561
2562 // Save the information needed by the tx interrupt handler
2563 // to complete the Send request
2564 pLastTD->pTDInfo->skb = skb;
2565 pLastTD->pTDInfo->byFlags = 0;
2566 pLastTD->pTDInfo->byFlags |= TD_FLAGS_NETIF_SKB;
2567 #ifdef TxInSleep
2568 pDevice->nTxDataTimeCout=0; //2008-8-21 chester <add> for send null packet
2569 #endif
2570 if (AVAIL_TD(pDevice, TYPE_AC0DMA) <= 1) {
2571 netif_stop_queue(dev);
2572 }
2573
2574 pDevice->apCurrTD[TYPE_AC0DMA] = pHeadTD;
2575 //#ifdef PLICE_DEBUG
2576 if (pDevice->bFixRate)
2577 {
2578 printk("FixRate:Rate is %d,TxPower is %d\n",pDevice->wCurrentRate,pDevice->byCurPwr);
2579 }
2580 else
2581 {
2582 //printk("Auto Rate:Rate is %d,TxPower is %d\n",pDevice->wCurrentRate,pDevice->byCurPwr);
2583 }
2584 //#endif
2585
2586 {
2587 unsigned char Protocol_Version; //802.1x Authentication
2588 unsigned char Packet_Type; //802.1x Authentication
2589 unsigned char Descriptor_type;
2590 unsigned short Key_info;
2591 bool bTxeapol_key = false;
2592 Protocol_Version = skb->data[ETH_HLEN];
2593 Packet_Type = skb->data[ETH_HLEN+1];
2594 Descriptor_type = skb->data[ETH_HLEN+1+1+2];
2595 Key_info = (skb->data[ETH_HLEN+1+1+2+1] << 8)|(skb->data[ETH_HLEN+1+1+2+2]);
2596 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2597 if(((Protocol_Version==1) ||(Protocol_Version==2)) &&
2598 (Packet_Type==3)) { //802.1x OR eapol-key challenge frame transfer
2599 bTxeapol_key = true;
2600 if((Descriptor_type==254)||(Descriptor_type==2)) { //WPA or RSN
2601 if(!(Key_info & BIT3) && //group-key challenge
2602 (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key
2603 pDevice->fWPA_Authened = true;
2604 if(Descriptor_type==254)
2605 printk("WPA ");
2606 else
2607 printk("WPA2 ");
2608 printk("Authentication completed!!\n");
2609 }
2610 }
2611 }
2612 }
2613 }
2614
2615 MACvTransmitAC0(pDevice->PortOffset);
2616 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "acdma0:pDevice->apCurrTD= %p\n", pHeadTD);
2617
2618 dev->trans_start = jiffies;
2619
2620 spin_unlock_irq(&pDevice->lock);
2621 return 0;
2622
2623 }
2624
2625 static irqreturn_t device_intr(int irq, void *dev_instance) {
2626 struct net_device* dev=dev_instance;
2627 PSDevice pDevice=(PSDevice) netdev_priv(dev);
2628
2629 int max_count=0;
2630 unsigned long dwMIBCounter=0;
2631 PSMgmtObject pMgmt = pDevice->pMgmt;
2632 unsigned char byOrgPageSel=0;
2633 int handled = 0;
2634 unsigned char byData = 0;
2635 int ii= 0;
2636 // unsigned char byRSSI;
2637
2638
2639 MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
2640
2641 if (pDevice->dwIsr == 0)
2642 return IRQ_RETVAL(handled);
2643
2644 if (pDevice->dwIsr == 0xffffffff) {
2645 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dwIsr = 0xffff\n");
2646 return IRQ_RETVAL(handled);
2647 }
2648 /*
2649 // 2008-05-21 <mark> by Richardtai, we can't read RSSI here, because no packet bound with RSSI
2650
2651 if ((pDevice->dwIsr & ISR_RXDMA0) &&
2652 (pDevice->byLocalID != REV_ID_VT3253_B0) &&
2653 (pDevice->bBSSIDFilter == true)) {
2654 // update RSSI
2655 //BBbReadEmbedded(pDevice->PortOffset, 0x3E, &byRSSI);
2656 //pDevice->uCurrRSSI = byRSSI;
2657 }
2658 */
2659
2660 handled = 1;
2661 MACvIntDisable(pDevice->PortOffset);
2662 spin_lock_irq(&pDevice->lock);
2663
2664 //Make sure current page is 0
2665 VNSvInPortB(pDevice->PortOffset + MAC_REG_PAGE1SEL, &byOrgPageSel);
2666 if (byOrgPageSel == 1) {
2667 MACvSelectPage0(pDevice->PortOffset);
2668 }
2669 else
2670 byOrgPageSel = 0;
2671
2672 MACvReadMIBCounter(pDevice->PortOffset, &dwMIBCounter);
2673 // TBD....
2674 // Must do this after doing rx/tx, cause ISR bit is slow
2675 // than RD/TD write back
2676 // update ISR counter
2677 STAvUpdate802_11Counter(&pDevice->s802_11Counter, &pDevice->scStatistic , dwMIBCounter);
2678 while (pDevice->dwIsr != 0) {
2679
2680 STAvUpdateIsrStatCounter(&pDevice->scStatistic, pDevice->dwIsr);
2681 MACvWriteISR(pDevice->PortOffset, pDevice->dwIsr);
2682
2683 if (pDevice->dwIsr & ISR_FETALERR){
2684 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " ISR_FETALERR \n");
2685 VNSvOutPortB(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, 0);
2686 VNSvOutPortW(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPECTI);
2687 device_error(pDevice, pDevice->dwIsr);
2688 }
2689
2690 if (pDevice->byLocalID > REV_ID_VT3253_B1) {
2691
2692 if (pDevice->dwIsr & ISR_MEASURESTART) {
2693 // 802.11h measure start
2694 pDevice->byOrgChannel = pDevice->byCurrentCh;
2695 VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byOrgRCR));
2696 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, (RCR_RXALLTYPE | RCR_UNICAST | RCR_BROADCAST | RCR_MULTICAST | RCR_WPAERR));
2697 MACvSelectPage1(pDevice->PortOffset);
2698 VNSvInPortD(pDevice->PortOffset + MAC_REG_MAR0, &(pDevice->dwOrgMAR0));
2699 VNSvInPortD(pDevice->PortOffset + MAC_REG_MAR4, &(pDevice->dwOrgMAR4));
2700 MACvSelectPage0(pDevice->PortOffset);
2701 //xxxx
2702 // WCMDbFlushCommandQueue(pDevice->pMgmt, true);
2703 if (set_channel(pDevice, pDevice->pCurrMeasureEID->sReq.byChannel) == true) {
2704 pDevice->bMeasureInProgress = true;
2705 MACvSelectPage1(pDevice->PortOffset);
2706 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_READY);
2707 MACvSelectPage0(pDevice->PortOffset);
2708 pDevice->byBasicMap = 0;
2709 pDevice->byCCAFraction = 0;
2710 for(ii=0;ii<8;ii++) {
2711 pDevice->dwRPIs[ii] = 0;
2712 }
2713 } else {
2714 // can not measure because set channel fail
2715 // WCMDbResetCommandQueue(pDevice->pMgmt);
2716 // clear measure control
2717 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
2718 s_vCompleteCurrentMeasure(pDevice, MEASURE_MODE_INCAPABLE);
2719 MACvSelectPage1(pDevice->PortOffset);
2720 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2721 MACvSelectPage0(pDevice->PortOffset);
2722 }
2723 }
2724 if (pDevice->dwIsr & ISR_MEASUREEND) {
2725 // 802.11h measure end
2726 pDevice->bMeasureInProgress = false;
2727 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byOrgRCR);
2728 MACvSelectPage1(pDevice->PortOffset);
2729 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, pDevice->dwOrgMAR0);
2730 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR4, pDevice->dwOrgMAR4);
2731 VNSvInPortB(pDevice->PortOffset + MAC_REG_MSRBBSTS, &byData);
2732 pDevice->byBasicMap |= (byData >> 4);
2733 VNSvInPortB(pDevice->PortOffset + MAC_REG_CCAFRACTION, &pDevice->byCCAFraction);
2734 VNSvInPortB(pDevice->PortOffset + MAC_REG_MSRCTL, &byData);
2735 // clear measure control
2736 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
2737 MACvSelectPage0(pDevice->PortOffset);
2738 set_channel(pDevice, pDevice->byOrgChannel);
2739 // WCMDbResetCommandQueue(pDevice->pMgmt);
2740 MACvSelectPage1(pDevice->PortOffset);
2741 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2742 MACvSelectPage0(pDevice->PortOffset);
2743 if (byData & MSRCTL_FINISH) {
2744 // measure success
2745 s_vCompleteCurrentMeasure(pDevice, 0);
2746 } else {
2747 // can not measure because not ready before end of measure time
2748 s_vCompleteCurrentMeasure(pDevice, MEASURE_MODE_LATE);
2749 }
2750 }
2751 if (pDevice->dwIsr & ISR_QUIETSTART) {
2752 do {
2753 ;
2754 } while (CARDbStartQuiet(pDevice) == false);
2755 }
2756 }
2757
2758 if (pDevice->dwIsr & ISR_TBTT) {
2759 if (pDevice->bEnableFirstQuiet == true) {
2760 pDevice->byQuietStartCount--;
2761 if (pDevice->byQuietStartCount == 0) {
2762 pDevice->bEnableFirstQuiet = false;
2763 MACvSelectPage1(pDevice->PortOffset);
2764 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN));
2765 MACvSelectPage0(pDevice->PortOffset);
2766 }
2767 }
2768 if ((pDevice->bChannelSwitch == true) &&
2769 (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE)) {
2770 pDevice->byChannelSwitchCount--;
2771 if (pDevice->byChannelSwitchCount == 0) {
2772 pDevice->bChannelSwitch = false;
2773 set_channel(pDevice, pDevice->byNewChannel);
2774 VNTWIFIbChannelSwitch(pDevice->pMgmt, pDevice->byNewChannel);
2775 MACvSelectPage1(pDevice->PortOffset);
2776 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2777 MACvSelectPage0(pDevice->PortOffset);
2778 CARDbStartTxPacket(pDevice, PKT_TYPE_802_11_ALL);
2779
2780 }
2781 }
2782 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2783 //pDevice->bBeaconSent = false;
2784 } else {
2785 if ((pDevice->bUpdateBBVGA) && (pDevice->bLinkPass == true) && (pDevice->uCurrRSSI != 0)) {
2786 long ldBm;
2787
2788 RFvRSSITodBm(pDevice, (unsigned char) pDevice->uCurrRSSI, &ldBm);
2789 for (ii=0;ii<BB_VGA_LEVEL;ii++) {
2790 if (ldBm < pDevice->ldBmThreshold[ii]) {
2791 pDevice->byBBVGANew = pDevice->abyBBVGA[ii];
2792 break;
2793 }
2794 }
2795 if (pDevice->byBBVGANew != pDevice->byBBVGACurrent) {
2796 pDevice->uBBVGADiffCount++;
2797 if (pDevice->uBBVGADiffCount == 1) {
2798 // first VGA diff gain
2799 BBvSetVGAGainOffset(pDevice, pDevice->byBBVGANew);
2800 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"First RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
2801 (int)ldBm, pDevice->byBBVGANew, pDevice->byBBVGACurrent, (int)pDevice->uBBVGADiffCount);
2802 }
2803 if (pDevice->uBBVGADiffCount >= BB_VGA_CHANGE_THRESHOLD) {
2804 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
2805 (int)ldBm, pDevice->byBBVGANew, pDevice->byBBVGACurrent, (int)pDevice->uBBVGADiffCount);
2806 BBvSetVGAGainOffset(pDevice, pDevice->byBBVGANew);
2807 }
2808 } else {
2809 pDevice->uBBVGADiffCount = 1;
2810 }
2811 }
2812 }
2813
2814 pDevice->bBeaconSent = false;
2815 if (pDevice->bEnablePSMode) {
2816 PSbIsNextTBTTWakeUp((void *)pDevice);
2817 }
2818
2819 if ((pDevice->eOPMode == OP_MODE_AP) ||
2820 (pDevice->eOPMode == OP_MODE_ADHOC)) {
2821
2822 MACvOneShotTimer1MicroSec(pDevice->PortOffset,
2823 (pMgmt->wIBSSBeaconPeriod - MAKE_BEACON_RESERVED) << 10);
2824 }
2825
2826 if (pDevice->eOPMode == OP_MODE_ADHOC && pDevice->pMgmt->wCurrATIMWindow > 0) {
2827 // todo adhoc PS mode
2828 }
2829
2830 }
2831
2832 if (pDevice->dwIsr & ISR_BNTX) {
2833
2834 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2835 pDevice->bIsBeaconBufReadySet = false;
2836 pDevice->cbBeaconBufReadySetCnt = 0;
2837 }
2838
2839 if (pDevice->eOPMode == OP_MODE_AP) {
2840 if(pMgmt->byDTIMCount > 0) {
2841 pMgmt->byDTIMCount --;
2842 pMgmt->sNodeDBTable[0].bRxPSPoll = false;
2843 }
2844 else {
2845 if(pMgmt->byDTIMCount == 0) {
2846 // check if mutltcast tx bufferring
2847 pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1;
2848 pMgmt->sNodeDBTable[0].bRxPSPoll = true;
2849 bScheduleCommand((void *)pDevice, WLAN_CMD_RX_PSPOLL, NULL);
2850 }
2851 }
2852 }
2853 pDevice->bBeaconSent = true;
2854
2855 if (pDevice->bChannelSwitch == true) {
2856 pDevice->byChannelSwitchCount--;
2857 if (pDevice->byChannelSwitchCount == 0) {
2858 pDevice->bChannelSwitch = false;
2859 set_channel(pDevice, pDevice->byNewChannel);
2860 VNTWIFIbChannelSwitch(pDevice->pMgmt, pDevice->byNewChannel);
2861 MACvSelectPage1(pDevice->PortOffset);
2862 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2863 MACvSelectPage0(pDevice->PortOffset);
2864 //VNTWIFIbSendBeacon(pDevice->pMgmt);
2865 CARDbStartTxPacket(pDevice, PKT_TYPE_802_11_ALL);
2866 }
2867 }
2868
2869 }
2870
2871 if (pDevice->dwIsr & ISR_RXDMA0) {
2872 max_count += device_rx_srv(pDevice, TYPE_RXDMA0);
2873 }
2874 if (pDevice->dwIsr & ISR_RXDMA1) {
2875 max_count += device_rx_srv(pDevice, TYPE_RXDMA1);
2876 }
2877 if (pDevice->dwIsr & ISR_TXDMA0){
2878 max_count += device_tx_srv(pDevice, TYPE_TXDMA0);
2879 }
2880 if (pDevice->dwIsr & ISR_AC0DMA){
2881 max_count += device_tx_srv(pDevice, TYPE_AC0DMA);
2882 }
2883 if (pDevice->dwIsr & ISR_SOFTTIMER) {
2884
2885 }
2886 if (pDevice->dwIsr & ISR_SOFTTIMER1) {
2887 if (pDevice->eOPMode == OP_MODE_AP) {
2888 if (pDevice->bShortSlotTime)
2889 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1);
2890 else
2891 pMgmt->wCurrCapInfo &= ~(WLAN_SET_CAP_INFO_SHORTSLOTTIME(1));
2892 }
2893 bMgrPrepareBeaconToSend(pDevice, pMgmt);
2894 pDevice->byCntMeasure = 0;
2895 }
2896
2897 MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
2898
2899 MACvReceive0(pDevice->PortOffset);
2900 MACvReceive1(pDevice->PortOffset);
2901
2902 if (max_count>pDevice->sOpts.int_works)
2903 break;
2904 }
2905
2906 if (byOrgPageSel == 1) {
2907 MACvSelectPage1(pDevice->PortOffset);
2908 }
2909
2910 spin_unlock_irq(&pDevice->lock);
2911 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
2912
2913 return IRQ_RETVAL(handled);
2914 }
2915
2916
2917 static unsigned const ethernet_polynomial = 0x04c11db7U;
2918 static inline u32 ether_crc(int length, unsigned char *data)
2919 {
2920 int crc = -1;
2921
2922 while(--length >= 0) {
2923 unsigned char current_octet = *data++;
2924 int bit;
2925 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
2926 crc = (crc << 1) ^
2927 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
2928 }
2929 }
2930 return crc;
2931 }
2932
2933 //2008-8-4 <add> by chester
2934 static int Config_FileGetParameter(unsigned char *string,
2935 unsigned char *dest, unsigned char *source)
2936 {
2937 unsigned char buf1[100];
2938 int source_len = strlen(source);
2939
2940 memset(buf1,0,100);
2941 strcat(buf1, string);
2942 strcat(buf1, "=");
2943 source+=strlen(buf1);
2944
2945 memcpy(dest,source,source_len-strlen(buf1));
2946 return true;
2947 }
2948
2949 int Config_FileOperation(PSDevice pDevice,bool fwrite,unsigned char *Parameter) {
2950 unsigned char *config_path = CONFIG_PATH;
2951 unsigned char *buffer = NULL;
2952 unsigned char tmpbuffer[20];
2953 struct file *filp=NULL;
2954 mm_segment_t old_fs = get_fs();
2955 //int oldfsuid=0,oldfsgid=0;
2956 int result=0;
2957
2958 set_fs (KERNEL_DS);
2959
2960 /* Can't do this anymore, so we rely on correct filesystem permissions:
2961 //Make sure a caller can read or write power as root
2962 oldfsuid=current->cred->fsuid;
2963 oldfsgid=current->cred->fsgid;
2964 current->cred->fsuid = 0;
2965 current->cred->fsgid = 0;
2966 */
2967
2968 //open file
2969 filp = filp_open(config_path, O_RDWR, 0);
2970 if (IS_ERR(filp)) {
2971 printk("Config_FileOperation:open file fail?\n");
2972 result=-1;
2973 goto error2;
2974 }
2975
2976 if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
2977 printk("file %s cann't readable or writable?\n",config_path);
2978 result = -1;
2979 goto error1;
2980 }
2981
2982 buffer = kmalloc(1024, GFP_KERNEL);
2983 if(buffer==NULL) {
2984 printk("allocate mem for file fail?\n");
2985 result = -1;
2986 goto error1;
2987 }
2988
2989 if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
2990 printk("read file error?\n");
2991 result = -1;
2992 goto error1;
2993 }
2994
2995 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer)!=true) {
2996 printk("get parameter error?\n");
2997 result = -1;
2998 goto error1;
2999 }
3000
3001 if(memcmp(tmpbuffer,"USA",3)==0) {
3002 result=ZoneType_USA;
3003 }
3004 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
3005 result=ZoneType_Japan;
3006 }
3007 else if(memcmp(tmpbuffer,"EUROPE",5)==0) {
3008 result=ZoneType_Europe;
3009 }
3010 else {
3011 result = -1;
3012 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
3013 }
3014
3015 error1:
3016 kfree(buffer);
3017
3018 if(filp_close(filp,NULL))
3019 printk("Config_FileOperation:close file fail\n");
3020
3021 error2:
3022 set_fs (old_fs);
3023
3024 /*
3025 current->cred->fsuid=oldfsuid;
3026 current->cred->fsgid=oldfsgid;
3027 */
3028
3029 return result;
3030 }
3031
3032
3033
3034 static void device_set_multi(struct net_device *dev) {
3035 PSDevice pDevice = (PSDevice) netdev_priv(dev);
3036
3037 PSMgmtObject pMgmt = pDevice->pMgmt;
3038 u32 mc_filter[2];
3039 struct netdev_hw_addr *ha;
3040
3041
3042 VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byRxMode));
3043
3044 if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
3045 DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
3046 /* Unconditionally log net taps. */
3047 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
3048 }
3049 else if ((netdev_mc_count(dev) > pDevice->multicast_limit)
3050 || (dev->flags & IFF_ALLMULTI)) {
3051 MACvSelectPage1(pDevice->PortOffset);
3052 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, 0xffffffff);
3053 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, 0xffffffff);
3054 MACvSelectPage0(pDevice->PortOffset);
3055 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
3056 }
3057 else {
3058 memset(mc_filter, 0, sizeof(mc_filter));
3059 netdev_for_each_mc_addr(ha, dev) {
3060 int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
3061 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
3062 }
3063 MACvSelectPage1(pDevice->PortOffset);
3064 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, mc_filter[0]);
3065 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, mc_filter[1]);
3066 MACvSelectPage0(pDevice->PortOffset);
3067 pDevice->byRxMode &= ~(RCR_UNICAST);
3068 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
3069 }
3070
3071 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
3072 // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
3073 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
3074 pDevice->byRxMode &= ~(RCR_UNICAST);
3075 }
3076
3077 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byRxMode);
3078 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode = %x\n", pDevice->byRxMode );
3079 }
3080
3081
3082 static struct net_device_stats *device_get_stats(struct net_device *dev) {
3083 PSDevice pDevice=(PSDevice) netdev_priv(dev);
3084
3085 return &pDevice->stats;
3086 }
3087
3088
3089
3090 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
3091 PSDevice pDevice = (PSDevice)netdev_priv(dev);
3092
3093 struct iwreq *wrq = (struct iwreq *) rq;
3094 int rc =0;
3095 PSMgmtObject pMgmt = pDevice->pMgmt;
3096 PSCmdRequest pReq;
3097
3098
3099 if (pMgmt == NULL) {
3100 rc = -EFAULT;
3101 return rc;
3102 }
3103
3104 switch(cmd) {
3105
3106 case SIOCGIWNAME:
3107 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
3108 break;
3109
3110 case SIOCGIWNWID: //0x8b03 support
3111 rc = -EOPNOTSUPP;
3112 break;
3113
3114 // Set frequency/channel
3115 case SIOCSIWFREQ:
3116 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
3117 break;
3118
3119 // Get frequency/channel
3120 case SIOCGIWFREQ:
3121 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
3122 break;
3123
3124 // Set desired network name (ESSID)
3125 case SIOCSIWESSID:
3126
3127 {
3128 char essid[IW_ESSID_MAX_SIZE+1];
3129 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
3130 rc = -E2BIG;
3131 break;
3132 }
3133 if (copy_from_user(essid, wrq->u.essid.pointer,
3134 wrq->u.essid.length)) {
3135 rc = -EFAULT;
3136 break;
3137 }
3138 rc = iwctl_siwessid(dev, NULL,
3139 &(wrq->u.essid), essid);
3140 }
3141 break;
3142
3143
3144 // Get current network name (ESSID)
3145 case SIOCGIWESSID:
3146
3147 {
3148 char essid[IW_ESSID_MAX_SIZE+1];
3149 if (wrq->u.essid.pointer)
3150 rc = iwctl_giwessid(dev, NULL,
3151 &(wrq->u.essid), essid);
3152 if (copy_to_user(wrq->u.essid.pointer,
3153 essid,
3154 wrq->u.essid.length) )
3155 rc = -EFAULT;
3156 }
3157 break;
3158
3159 case SIOCSIWAP:
3160
3161 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
3162 break;
3163
3164
3165 // Get current Access Point (BSSID)
3166 case SIOCGIWAP:
3167 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
3168 break;
3169
3170
3171 // Set desired station name
3172 case SIOCSIWNICKN:
3173 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
3174 rc = -EOPNOTSUPP;
3175 break;
3176
3177 // Get current station name
3178 case SIOCGIWNICKN:
3179 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
3180 rc = -EOPNOTSUPP;
3181 break;
3182
3183 // Set the desired bit-rate
3184 case SIOCSIWRATE:
3185 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
3186 break;
3187
3188 // Get the current bit-rate
3189 case SIOCGIWRATE:
3190
3191 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
3192 break;
3193
3194 // Set the desired RTS threshold
3195 case SIOCSIWRTS:
3196
3197 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
3198 break;
3199
3200 // Get the current RTS threshold
3201 case SIOCGIWRTS:
3202
3203 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
3204 break;
3205
3206 // Set the desired fragmentation threshold
3207 case SIOCSIWFRAG:
3208
3209 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
3210 break;
3211
3212 // Get the current fragmentation threshold
3213 case SIOCGIWFRAG:
3214
3215 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
3216 break;
3217
3218 // Set mode of operation
3219 case SIOCSIWMODE:
3220 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
3221 break;
3222
3223 // Get mode of operation
3224 case SIOCGIWMODE:
3225 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
3226 break;
3227
3228 // Set WEP keys and mode
3229 case SIOCSIWENCODE:
3230 {
3231 char abyKey[WLAN_WEP232_KEYLEN];
3232
3233 if (wrq->u.encoding.pointer) {
3234
3235
3236 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
3237 rc = -E2BIG;
3238 break;
3239 }
3240 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
3241 if (copy_from_user(abyKey,
3242 wrq->u.encoding.pointer,
3243 wrq->u.encoding.length)) {
3244 rc = -EFAULT;
3245 break;
3246 }
3247 } else if (wrq->u.encoding.length != 0) {
3248 rc = -EINVAL;
3249 break;
3250 }
3251 rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
3252 }
3253 break;
3254
3255 // Get the WEP keys and mode
3256 case SIOCGIWENCODE:
3257
3258 if (!capable(CAP_NET_ADMIN)) {
3259 rc = -EPERM;
3260 break;
3261 }
3262 {
3263 char abyKey[WLAN_WEP232_KEYLEN];
3264
3265 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
3266 if (rc != 0) break;
3267 if (wrq->u.encoding.pointer) {
3268 if (copy_to_user(wrq->u.encoding.pointer,
3269 abyKey,
3270 wrq->u.encoding.length))
3271 rc = -EFAULT;
3272 }
3273 }
3274 break;
3275
3276 // Get the current Tx-Power
3277 case SIOCGIWTXPOW:
3278 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
3279 rc = -EOPNOTSUPP;
3280 break;
3281
3282 case SIOCSIWTXPOW:
3283 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWTXPOW \n");
3284 rc = -EOPNOTSUPP;
3285 break;
3286
3287 case SIOCSIWRETRY:
3288
3289 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
3290 break;
3291
3292 case SIOCGIWRETRY:
3293
3294 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
3295 break;
3296
3297 // Get range of parameters
3298 case SIOCGIWRANGE:
3299
3300 {
3301 struct iw_range range;
3302
3303 rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
3304 if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
3305 rc = -EFAULT;
3306 }
3307
3308 break;
3309
3310 case SIOCGIWPOWER:
3311
3312 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
3313 break;
3314
3315
3316 case SIOCSIWPOWER:
3317
3318 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
3319 break;
3320
3321
3322 case SIOCGIWSENS:
3323
3324 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
3325 break;
3326
3327 case SIOCSIWSENS:
3328 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
3329 rc = -EOPNOTSUPP;
3330 break;
3331
3332 case SIOCGIWAPLIST:
3333 {
3334 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
3335
3336 if (wrq->u.data.pointer) {
3337 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
3338 if (rc == 0) {
3339 if (copy_to_user(wrq->u.data.pointer,
3340 buffer,
3341 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
3342 ))
3343 rc = -EFAULT;
3344 }
3345 }
3346 }
3347 break;
3348
3349
3350 #ifdef WIRELESS_SPY
3351 // Set the spy list
3352 case SIOCSIWSPY:
3353
3354 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
3355 rc = -EOPNOTSUPP;
3356 break;
3357
3358 // Get the spy list
3359 case SIOCGIWSPY:
3360
3361 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWSPY \n");
3362 rc = -EOPNOTSUPP;
3363 break;
3364
3365 #endif // WIRELESS_SPY
3366
3367 case SIOCGIWPRIV:
3368 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
3369 rc = -EOPNOTSUPP;
3370 /*
3371 if(wrq->u.data.pointer) {
3372 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
3373
3374 if(copy_to_user(wrq->u.data.pointer,
3375 (u_char *) iwctl_private_args,
3376 sizeof(iwctl_private_args)))
3377 rc = -EFAULT;
3378 }
3379 */
3380 break;
3381
3382
3383 //2008-0409-07, <Add> by Einsn Liu
3384 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3385 case SIOCSIWAUTH:
3386 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
3387 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
3388 break;
3389
3390 case SIOCGIWAUTH:
3391 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
3392 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
3393 break;
3394
3395 case SIOCSIWGENIE:
3396 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
3397 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3398 break;
3399
3400 case SIOCGIWGENIE:
3401 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
3402 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3403 break;
3404
3405 case SIOCSIWENCODEEXT:
3406 {
3407 char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
3408 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
3409 if(wrq->u.encoding.pointer){
3410 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
3411 if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
3412 rc = -E2BIG;
3413 break;
3414 }
3415 if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
3416 rc = -EFAULT;
3417 break;
3418 }
3419 }else if(wrq->u.encoding.length != 0){
3420 rc = -EINVAL;
3421 break;
3422 }
3423 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
3424 }
3425 break;
3426
3427 case SIOCGIWENCODEEXT:
3428 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
3429 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
3430 break;
3431
3432 case SIOCSIWMLME:
3433 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
3434 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3435 break;
3436
3437 #endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3438 //End Add -- //2008-0409-07, <Add> by Einsn Liu
3439
3440 case IOCTL_CMD_TEST:
3441
3442 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
3443 rc = -EFAULT;
3444 break;
3445 } else {
3446 rc = 0;
3447 }
3448 pReq = (PSCmdRequest)rq;
3449 pReq->wResult = MAGIC_CODE;
3450 break;
3451
3452 case IOCTL_CMD_SET:
3453
3454 #ifdef SndEvt_ToAPI
3455 if((((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_EVT) &&
3456 !(pDevice->flags & DEVICE_FLAGS_OPENED))
3457 #else
3458 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
3459 (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
3460 #endif
3461 {
3462 rc = -EFAULT;
3463 break;
3464 } else {
3465 rc = 0;
3466 }
3467
3468 if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
3469 return -EBUSY;
3470 }
3471 rc = private_ioctl(pDevice, rq);
3472 clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
3473 break;
3474
3475 case IOCTL_CMD_HOSTAPD:
3476
3477
3478 rc = vt6655_hostap_ioctl(pDevice, &wrq->u.data);
3479 break;
3480
3481 case IOCTL_CMD_WPA:
3482
3483 rc = wpa_ioctl(pDevice, &wrq->u.data);
3484 break;
3485
3486 case SIOCETHTOOL:
3487 return ethtool_ioctl(dev, (void *) rq->ifr_data);
3488 // All other calls are currently unsupported
3489
3490 default:
3491 rc = -EOPNOTSUPP;
3492 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
3493
3494
3495 }
3496
3497 if (pDevice->bCommit) {
3498 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
3499 netif_stop_queue(pDevice->dev);
3500 spin_lock_irq(&pDevice->lock);
3501 bScheduleCommand((void *)pDevice, WLAN_CMD_RUN_AP, NULL);
3502 spin_unlock_irq(&pDevice->lock);
3503 }
3504 else {
3505 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
3506 spin_lock_irq(&pDevice->lock);
3507 pDevice->bLinkPass = false;
3508 memset(pMgmt->abyCurrBSSID, 0, 6);
3509 pMgmt->eCurrState = WMAC_STATE_IDLE;
3510 netif_stop_queue(pDevice->dev);
3511 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3512 pMgmt->eScanType = WMAC_SCAN_ACTIVE;
3513 if(pDevice->bWPASuppWextEnabled !=true)
3514 #endif
3515 bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
3516 bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL);
3517 spin_unlock_irq(&pDevice->lock);
3518 }
3519 pDevice->bCommit = false;
3520 }
3521
3522 return rc;
3523 }
3524
3525
3526 static int ethtool_ioctl(struct net_device *dev, void *useraddr)
3527 {
3528 u32 ethcmd;
3529
3530 if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
3531 return -EFAULT;
3532
3533 switch (ethcmd) {
3534 case ETHTOOL_GDRVINFO: {
3535 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
3536 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
3537 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
3538 if (copy_to_user(useraddr, &info, sizeof(info)))
3539 return -EFAULT;
3540 return 0;
3541 }
3542
3543 }
3544
3545 return -EOPNOTSUPP;
3546 }
3547
3548 /*------------------------------------------------------------------*/
3549
3550 MODULE_DEVICE_TABLE(pci, vt6655_pci_id_table);
3551
3552 static struct pci_driver device_driver = {
3553 .name = DEVICE_NAME,
3554 .id_table = vt6655_pci_id_table,
3555 .probe = vt6655_probe,
3556 .remove = vt6655_remove,
3557 #ifdef CONFIG_PM
3558 .suspend = viawget_suspend,
3559 .resume = viawget_resume,
3560 #endif
3561 };
3562
3563 static int __init vt6655_init_module(void)
3564 {
3565 int ret;
3566
3567
3568 // ret=pci_module_init(&device_driver);
3569 //ret = pcie_port_service_register(&device_driver);
3570 ret = pci_register_driver(&device_driver);
3571 #ifdef CONFIG_PM
3572 if(ret >= 0)
3573 register_reboot_notifier(&device_notifier);
3574 #endif
3575
3576 return ret;
3577 }
3578
3579 static void __exit vt6655_cleanup_module(void)
3580 {
3581
3582
3583 #ifdef CONFIG_PM
3584 unregister_reboot_notifier(&device_notifier);
3585 #endif
3586 pci_unregister_driver(&device_driver);
3587
3588 }
3589
3590 module_init(vt6655_init_module);
3591 module_exit(vt6655_cleanup_module);
3592
3593
3594 #ifdef CONFIG_PM
3595 static int
3596 device_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
3597 {
3598 struct pci_dev *pdev = NULL;
3599 switch(event) {
3600 case SYS_DOWN:
3601 case SYS_HALT:
3602 case SYS_POWER_OFF:
3603 for_each_pci_dev(pdev) {
3604 if(pci_dev_driver(pdev) == &device_driver) {
3605 if (pci_get_drvdata(pdev))
3606 viawget_suspend(pdev, PMSG_HIBERNATE);
3607 }
3608 }
3609 }
3610 return NOTIFY_DONE;
3611 }
3612
3613 static int
3614 viawget_suspend(struct pci_dev *pcid, pm_message_t state)
3615 {
3616 int power_status; // to silence the compiler
3617
3618 PSDevice pDevice=pci_get_drvdata(pcid);
3619 PSMgmtObject pMgmt = pDevice->pMgmt;
3620
3621 netif_stop_queue(pDevice->dev);
3622 spin_lock_irq(&pDevice->lock);
3623 pci_save_state(pcid);
3624 del_timer(&pDevice->sTimerCommand);
3625 del_timer(&pMgmt->sTimerSecondCallback);
3626 pDevice->cbFreeCmdQueue = CMD_Q_SIZE;
3627 pDevice->uCmdDequeueIdx = 0;
3628 pDevice->uCmdEnqueueIdx = 0;
3629 pDevice->bCmdRunning = false;
3630 MACbShutdown(pDevice->PortOffset);
3631 MACvSaveContext(pDevice->PortOffset, pDevice->abyMacContext);
3632 pDevice->bLinkPass = false;
3633 memset(pMgmt->abyCurrBSSID, 0, 6);
3634 pMgmt->eCurrState = WMAC_STATE_IDLE;
3635 pci_disable_device(pcid);
3636 power_status = pci_set_power_state(pcid, pci_choose_state(pcid, state));
3637 spin_unlock_irq(&pDevice->lock);
3638 return 0;
3639 }
3640
3641 static int
3642 viawget_resume(struct pci_dev *pcid)
3643 {
3644 PSDevice pDevice=pci_get_drvdata(pcid);
3645 PSMgmtObject pMgmt = pDevice->pMgmt;
3646 int power_status; // to silence the compiler
3647
3648
3649 power_status = pci_set_power_state(pcid, 0);
3650 power_status = pci_enable_wake(pcid, 0, 0);
3651 pci_restore_state(pcid);
3652 if (netif_running(pDevice->dev)) {
3653 spin_lock_irq(&pDevice->lock);
3654 MACvRestoreContext(pDevice->PortOffset, pDevice->abyMacContext);
3655 device_init_registers(pDevice, DEVICE_INIT_DXPL);
3656 if (pMgmt->sNodeDBTable[0].bActive == true) { // Assoc with BSS
3657 pMgmt->sNodeDBTable[0].bActive = false;
3658 pDevice->bLinkPass = false;
3659 if(pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
3660 // In Adhoc, BSS state set back to started.
3661 pMgmt->eCurrState = WMAC_STATE_STARTED;
3662 }
3663 else {
3664 pMgmt->eCurrMode = WMAC_MODE_STANDBY;
3665 pMgmt->eCurrState = WMAC_STATE_IDLE;
3666 }
3667 }
3668 init_timer(&pMgmt->sTimerSecondCallback);
3669 init_timer(&pDevice->sTimerCommand);
3670 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
3671 BSSvClearBSSList((void *)pDevice, pDevice->bLinkPass);
3672 bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
3673 bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL);
3674 spin_unlock_irq(&pDevice->lock);
3675 }
3676 return 0;
3677 }
3678
3679 #endif
3680
3681
3682
3683