Merge branch 'packaging' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek...
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / staging / bcm / Bcmchar.c
1 #include <linux/fs.h>
2
3 #include "headers.h"
4 /***************************************************************
5 * Function        - bcm_char_open()
6 *
7 * Description - This is the "open" entry point for the character
8 *                               driver.
9 *
10 * Parameters  - inode: Pointer to the Inode structure of char device
11 *                               filp : File pointer of the char device
12 *
13 * Returns         - Zero(Success)
14 ****************************************************************/
15
16 static int bcm_char_open(struct inode *inode, struct file * filp)
17 {
18         PMINI_ADAPTER       Adapter = NULL;
19         PPER_TARANG_DATA    pTarang = NULL;
20
21         Adapter = GET_BCM_ADAPTER(gblpnetdev);
22         pTarang = kzalloc(sizeof(PER_TARANG_DATA), GFP_KERNEL);
23         if (!pTarang)
24                 return -ENOMEM;
25
26         pTarang->Adapter = Adapter;
27         pTarang->RxCntrlMsgBitMask = 0xFFFFFFFF & ~(1 << 0xB);
28
29         down(&Adapter->RxAppControlQueuelock);
30         pTarang->next = Adapter->pTarangs;
31         Adapter->pTarangs = pTarang;
32         up(&Adapter->RxAppControlQueuelock);
33
34         /* Store the Adapter structure */
35         filp->private_data = pTarang;
36
37         /*Start Queuing the control response Packets*/
38         atomic_inc(&Adapter->ApplicationRunning);
39
40         nonseekable_open(inode, filp);
41         return 0;
42 }
43
44 static int bcm_char_release(struct inode *inode, struct file *filp)
45 {
46         PPER_TARANG_DATA pTarang, tmp, ptmp;
47         PMINI_ADAPTER Adapter = NULL;
48         struct sk_buff *pkt, *npkt;
49
50         pTarang = (PPER_TARANG_DATA)filp->private_data;
51
52         if (pTarang == NULL) {
53                 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0,
54                                 "ptarang is null\n");
55                 return 0;
56         }
57
58         Adapter = pTarang->Adapter;
59
60         down(&Adapter->RxAppControlQueuelock);
61
62         tmp = Adapter->pTarangs;
63         for (ptmp = NULL; tmp; ptmp = tmp, tmp = tmp->next) {
64                 if (tmp == pTarang)
65                         break;
66         }
67
68         if (tmp) {
69                 if (!ptmp)
70                         Adapter->pTarangs = tmp->next;
71                 else
72                         ptmp->next = tmp->next;
73         } else {
74                 up(&Adapter->RxAppControlQueuelock);
75                 return 0;
76         }
77
78         pkt = pTarang->RxAppControlHead;
79         while (pkt) {
80                 npkt = pkt->next;
81                 kfree_skb(pkt);
82                 pkt = npkt;
83         }
84
85         up(&Adapter->RxAppControlQueuelock);
86
87         /*Stop Queuing the control response Packets*/
88         atomic_dec(&Adapter->ApplicationRunning);
89
90         kfree(pTarang);
91
92         /* remove this filp from the asynchronously notified filp's */
93         filp->private_data = NULL;
94         return 0;
95 }
96
97 static ssize_t bcm_char_read(struct file *filp, char __user *buf, size_t size,
98                              loff_t *f_pos)
99 {
100         PPER_TARANG_DATA pTarang = filp->private_data;
101         PMINI_ADAPTER   Adapter = pTarang->Adapter;
102         struct sk_buff *Packet = NULL;
103         ssize_t         PktLen = 0;
104         int             wait_ret_val = 0;
105         unsigned long ret = 0;
106
107         wait_ret_val = wait_event_interruptible(Adapter->process_read_wait_queue,
108                                                 (pTarang->RxAppControlHead ||
109                                                  Adapter->device_removed));
110         if ((wait_ret_val == -ERESTARTSYS)) {
111                 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,
112                                 "Exiting as i've been asked to exit!!!\n");
113                 return wait_ret_val;
114         }
115
116         if (Adapter->device_removed) {
117                 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,
118                                 "Device Removed... Killing the Apps...\n");
119                 return -ENODEV;
120         }
121
122         if (FALSE == Adapter->fw_download_done)
123                 return -EACCES;
124
125         down(&Adapter->RxAppControlQueuelock);
126
127         if (pTarang->RxAppControlHead) {
128                 Packet = pTarang->RxAppControlHead;
129                 DEQUEUEPACKET(pTarang->RxAppControlHead,
130                               pTarang->RxAppControlTail);
131                 pTarang->AppCtrlQueueLen--;
132         }
133
134         up(&Adapter->RxAppControlQueuelock);
135
136         if (Packet) {
137                 PktLen = Packet->len;
138                 ret = copy_to_user(buf, Packet->data,
139                                    min_t(size_t, PktLen, size));
140                 if (ret) {
141                         dev_kfree_skb(Packet);
142                         BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0,
143                                         "Returning from copy to user failure\n");
144                         return -EFAULT;
145                 }
146                 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,
147                                 "Read %zd Bytes From Adapter packet = %p by process %d!\n",
148                                 PktLen, Packet, current->pid);
149                 dev_kfree_skb(Packet);
150         }
151
152         BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "<\n");
153         return PktLen;
154 }
155
156 static long bcm_char_ioctl(struct file *filp, UINT cmd, ULONG arg)
157 {
158         PPER_TARANG_DATA  pTarang = filp->private_data;
159         void __user *argp = (void __user *)arg;
160         PMINI_ADAPTER   Adapter = pTarang->Adapter;
161         INT                     Status = STATUS_FAILURE;
162         int timeout = 0;
163         IOCTL_BUFFER    IoBuffer;
164
165         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Parameters Passed to control IOCTL cmd=0x%X arg=0x%lX", cmd, arg);
166
167         if(_IOC_TYPE(cmd) != BCM_IOCTL)
168                 return -EFAULT;
169         if(_IOC_DIR(cmd) & _IOC_READ)
170                 Status = !access_ok(VERIFY_WRITE, argp, _IOC_SIZE(cmd));
171         else if (_IOC_DIR(cmd) & _IOC_WRITE)
172             Status = !access_ok(VERIFY_READ, argp, _IOC_SIZE(cmd));
173         else if (_IOC_NONE == (_IOC_DIR(cmd) & _IOC_NONE))
174             Status = STATUS_SUCCESS;
175
176         if(Status)
177                 return -EFAULT;
178
179         if(Adapter->device_removed)
180         {
181                 return -EFAULT;
182         }
183
184         if(FALSE == Adapter->fw_download_done)
185         {
186                 switch (cmd)
187                 {
188                         case IOCTL_MAC_ADDR_REQ:
189                         case IOCTL_LINK_REQ:
190                         case IOCTL_CM_REQUEST:
191                         case IOCTL_SS_INFO_REQ:
192                         case IOCTL_SEND_CONTROL_MESSAGE:
193                         case IOCTL_IDLE_REQ:
194                         case IOCTL_BCM_GPIO_SET_REQUEST:
195                         case IOCTL_BCM_GPIO_STATUS_REQUEST:
196                                 return -EACCES;
197                         default:
198                                 break;
199                 }
200         }
201
202         Status = vendorextnIoctl(Adapter, cmd, arg);
203         if(Status != CONTINUE_COMMON_PATH )
204                  return Status;
205
206         switch(cmd){
207                 // Rdms for Swin Idle...
208                 case IOCTL_BCM_REGISTER_READ_PRIVATE:
209                 {
210                         RDM_BUFFER  sRdmBuffer = {0};
211                         PCHAR temp_buff;
212                         UINT Bufflen;
213
214                         /* Copy Ioctl Buffer structure */
215                         if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
216                                 return -EFAULT;
217
218                         if (IoBuffer.InputLength > sizeof(sRdmBuffer))
219                                 return -EINVAL;
220
221                         if(copy_from_user(&sRdmBuffer, IoBuffer.InputBuffer, IoBuffer.InputLength))
222                                 return -EFAULT;
223
224                         /* FIXME: need to restrict BuffLen */
225                         Bufflen = IoBuffer.OutputLength + (4 - IoBuffer.OutputLength%4)%4;
226                         temp_buff = kmalloc(Bufflen, GFP_KERNEL);
227                         if(!temp_buff)
228                                 return -ENOMEM;
229
230                         Status = rdmalt(Adapter, (UINT)sRdmBuffer.Register,
231                                         (PUINT)temp_buff, Bufflen);
232                         if(Status == STATUS_SUCCESS)
233                         {
234                                 if(copy_to_user(IoBuffer.OutputBuffer, temp_buff, IoBuffer.OutputLength))
235                                         Status = -EFAULT;
236                         }
237
238                         kfree(temp_buff);
239                         break;
240                 }
241                 case IOCTL_BCM_REGISTER_WRITE_PRIVATE:
242                 {
243                         WRM_BUFFER  sWrmBuffer = {0};
244                         UINT uiTempVar=0;
245                         /* Copy Ioctl Buffer structure */
246
247                         if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
248                                 return -EFAULT;
249
250                         if (IoBuffer.InputLength > sizeof(sWrmBuffer))
251                                 return -EINVAL;
252
253                         /* Get WrmBuffer structure */
254                         if(copy_from_user(&sWrmBuffer, IoBuffer.InputBuffer, IoBuffer.InputLength))
255                                 return -EFAULT;
256
257                         uiTempVar = sWrmBuffer.Register & EEPROM_REJECT_MASK;
258                         if(!((Adapter->pstargetparams->m_u32Customize) & VSG_MODE) &&
259                                 ((uiTempVar == EEPROM_REJECT_REG_1)||
260                                 (uiTempVar == EEPROM_REJECT_REG_2) ||
261                                 (uiTempVar == EEPROM_REJECT_REG_3) ||
262                                 (uiTempVar == EEPROM_REJECT_REG_4)))
263                         {
264                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "EEPROM Access Denied, not in VSG Mode\n");
265                                 return -EFAULT;
266                         }
267                         Status = wrmalt(Adapter, (UINT)sWrmBuffer.Register,
268                                                 (PUINT)sWrmBuffer.Data, sizeof(ULONG));
269                         if(Status == STATUS_SUCCESS)
270                         {
271                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"WRM Done\n");
272                         }
273                         else
274                         {
275                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "WRM Failed\n");
276                                 Status = -EFAULT;
277                         }
278                         break;
279                 }
280
281                 case IOCTL_BCM_REGISTER_READ:
282                 case IOCTL_BCM_EEPROM_REGISTER_READ:
283                 {
284                         RDM_BUFFER  sRdmBuffer = {0};
285                         PCHAR temp_buff = NULL;
286                         UINT uiTempVar = 0;
287                         if((Adapter->IdleMode == TRUE) ||
288                                 (Adapter->bShutStatus ==TRUE) ||
289                                 (Adapter->bPreparingForLowPowerMode ==TRUE))
290                         {
291                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Device in Idle Mode, Blocking Rdms\n");
292                                 return -EACCES;
293                         }
294                         /* Copy Ioctl Buffer structure */
295                         if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
296                                 return -EFAULT;
297
298                         if (IoBuffer.InputLength > sizeof(sRdmBuffer))
299                                 return -EINVAL;
300
301                         if(copy_from_user(&sRdmBuffer, IoBuffer.InputBuffer, IoBuffer.InputLength))
302                                 return -EFAULT;
303
304                         /* FIXME: don't trust user supplied length */
305                         temp_buff = kmalloc(IoBuffer.OutputLength, GFP_KERNEL);
306                         if(!temp_buff)
307                                 return STATUS_FAILURE;
308
309                         if((((ULONG)sRdmBuffer.Register & 0x0F000000) != 0x0F000000) ||
310                            ((ULONG)sRdmBuffer.Register & 0x3))
311                         {
312                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "RDM Done On invalid Address : %x Access Denied.\n",
313                                         (int)sRdmBuffer.Register);
314                                 return -EINVAL;
315                         }
316
317                         uiTempVar = sRdmBuffer.Register & EEPROM_REJECT_MASK;
318                         Status = rdmaltWithLock(Adapter, (UINT)sRdmBuffer.Register,
319                                                 (PUINT)temp_buff, IoBuffer.OutputLength);
320                         if(Status == STATUS_SUCCESS)
321                                 if(copy_to_user(IoBuffer.OutputBuffer, temp_buff, IoBuffer.OutputLength))
322                                         Status = -EFAULT;
323
324                         kfree(temp_buff);
325                         break;
326                 }
327                 case IOCTL_BCM_REGISTER_WRITE:
328                 case IOCTL_BCM_EEPROM_REGISTER_WRITE:
329                 {
330                         WRM_BUFFER  sWrmBuffer = {0};
331                         UINT uiTempVar=0;
332                         if((Adapter->IdleMode == TRUE) ||
333                                 (Adapter->bShutStatus ==TRUE) ||
334                                 (Adapter->bPreparingForLowPowerMode ==TRUE))
335                         {
336                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Device in Idle Mode, Blocking Wrms\n");
337                                 return -EACCES;
338                         }
339
340                         /* Copy Ioctl Buffer structure */
341                         if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
342                                 return -EFAULT;
343
344                         if (IoBuffer.InputLength > sizeof(sWrmBuffer))
345                                 return -EINVAL;
346
347                         /* Get WrmBuffer structure */
348                         if(copy_from_user(&sWrmBuffer, IoBuffer.InputBuffer, IoBuffer.InputLength))
349                                 return -EFAULT;
350
351                         if( (((ULONG)sWrmBuffer.Register & 0x0F000000) != 0x0F000000) ||
352                                         ((ULONG)sWrmBuffer.Register & 0x3) )
353                         {
354                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "WRM Done On invalid Address : %x Access Denied.\n",
355                                                 (int)sWrmBuffer.Register);
356                                 return -EINVAL;
357                         }
358
359                         uiTempVar = sWrmBuffer.Register & EEPROM_REJECT_MASK;
360                         if(!((Adapter->pstargetparams->m_u32Customize) & VSG_MODE) &&
361                                 ((uiTempVar == EEPROM_REJECT_REG_1)||
362                                 (uiTempVar == EEPROM_REJECT_REG_2) ||
363                                 (uiTempVar == EEPROM_REJECT_REG_3) ||
364                                 (uiTempVar == EEPROM_REJECT_REG_4)) &&
365                                 (cmd == IOCTL_BCM_REGISTER_WRITE))
366                         {
367                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "EEPROM Access Denied, not in VSG Mode\n");
368                                 return -EFAULT;
369                         }
370
371                         Status = wrmaltWithLock(Adapter, (UINT)sWrmBuffer.Register,
372                                                         (PUINT)sWrmBuffer.Data, sWrmBuffer.Length);
373                         if(Status == STATUS_SUCCESS)
374                         {
375                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, OSAL_DBG, DBG_LVL_ALL, "WRM Done\n");
376                         }
377                         else
378                         {
379                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "WRM Failed\n");
380                                 Status = -EFAULT;
381                         }
382                         break;
383                 }
384                 case IOCTL_BCM_GPIO_SET_REQUEST:
385                 {
386                         UCHAR ucResetValue[4];
387                         UINT value =0;
388                         UINT uiBit = 0;
389                 UINT uiOperation = 0;
390
391                         GPIO_INFO   gpio_info = {0};
392                         if((Adapter->IdleMode == TRUE) ||
393                                 (Adapter->bShutStatus ==TRUE) ||
394                                 (Adapter->bPreparingForLowPowerMode ==TRUE))
395                         {
396                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"GPIO Can't be set/clear in Low power Mode");
397                                 return -EACCES;
398                         }
399                         if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
400                                 return -EFAULT;
401                         if (IoBuffer.InputLength > sizeof(gpio_info))
402                                 return -EINVAL;
403                         if(copy_from_user(&gpio_info, IoBuffer.InputBuffer, IoBuffer.InputLength))
404                                 return -EFAULT;
405                         uiBit  = gpio_info.uiGpioNumber;
406                         uiOperation = gpio_info.uiGpioValue;
407
408                         value= (1<<uiBit);
409
410                         if(IsReqGpioIsLedInNVM(Adapter,value) ==FALSE)
411                         {
412                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Sorry, Requested GPIO<0x%X> is not correspond to LED !!!",value);
413                                 Status = -EINVAL;
414                                 break;
415                         }
416
417
418                         if(uiOperation)//Set - setting 1
419                         {
420                                 //Set the gpio output register
421                                 Status = wrmaltWithLock(Adapter,BCM_GPIO_OUTPUT_SET_REG ,
422                                                 (PUINT)(&value), sizeof(UINT));
423                                 if(Status == STATUS_SUCCESS)
424                                 {
425                     BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Set the GPIO bit\n");
426                                 }
427                     else
428                         {
429                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Failed to set the %dth GPIO \n",uiBit);
430                         break;
431                 }
432                         }
433                         else//Unset - setting 0
434                         {
435                                 //Set the gpio output register
436                                 Status = wrmaltWithLock(Adapter,BCM_GPIO_OUTPUT_CLR_REG ,
437                                                 (PUINT)(&value), sizeof(UINT));
438                                 if(Status == STATUS_SUCCESS)
439                                 {
440                     BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Set the GPIO bit\n");
441                                 }
442                     else
443                         {
444                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Failed to clear the %dth GPIO \n",uiBit);
445                         break;
446                 }
447                         }
448
449                         Status = rdmaltWithLock(Adapter, (UINT)GPIO_MODE_REGISTER,
450                                         (PUINT)ucResetValue, sizeof(UINT));
451                         if (STATUS_SUCCESS != Status)
452             {
453                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"GPIO_MODE_REGISTER read failed");
454                                 break;
455                         }
456                         //Set the gpio mode register to output
457                         *(UINT*)ucResetValue |= (1<<uiBit);
458                         Status = wrmaltWithLock(Adapter,GPIO_MODE_REGISTER ,
459                                         (PUINT)ucResetValue, sizeof(UINT));
460                         if(Status == STATUS_SUCCESS)
461                         {
462                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Set the GPIO to output Mode\n");
463                         }
464             else
465             {
466                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Failed to put GPIO in Output Mode\n");
467                 break;
468             }
469                 }
470                 break;
471                 case BCM_LED_THREAD_STATE_CHANGE_REQ:
472                 {
473                         USER_THREAD_REQ threadReq = { 0 };
474                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"User made LED thread InActive");
475
476                         if((Adapter->IdleMode == TRUE) ||
477                                 (Adapter->bShutStatus ==TRUE) ||
478                                 (Adapter->bPreparingForLowPowerMode ==TRUE))
479                         {
480                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"GPIO Can't be set/clear in Low power Mode");
481                                 Status = -EACCES;
482                                 break;
483                         }
484
485                         if (copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
486                                 return -EFAULT;
487
488                         if (IoBuffer.InputLength > sizeof(threadReq))
489                                 return -EINVAL;
490
491                         if (copy_from_user(&threadReq, IoBuffer.InputBuffer, IoBuffer.InputLength))
492                                 return -EFAULT;
493
494                         //if LED thread is running(Actively or Inactively) set it state to make inactive
495                         if(Adapter->LEDInfo.led_thread_running)
496                         {
497                                 if(threadReq.ThreadState == LED_THREAD_ACTIVATION_REQ)
498                                 {
499                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Activating thread req");
500                                         Adapter->DriverState = LED_THREAD_ACTIVE;
501                                 }
502                                 else
503                                 {
504                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"DeActivating Thread req.....");
505                                         Adapter->DriverState = LED_THREAD_INACTIVE;
506                                 }
507
508                                 //signal thread.
509                                 wake_up(&Adapter->LEDInfo.notify_led_event);
510
511                         }
512                 }
513                 break;
514                 case IOCTL_BCM_GPIO_STATUS_REQUEST:
515                 {
516                         ULONG uiBit = 0;
517                         UCHAR ucRead[4];
518                         GPIO_INFO   gpio_info = {0};
519                         if((Adapter->IdleMode == TRUE) ||
520                                 (Adapter->bShutStatus ==TRUE) ||
521                                 (Adapter->bPreparingForLowPowerMode ==TRUE))
522                                 return -EACCES;
523                         if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
524                                 return -EFAULT;
525                         if (IoBuffer.InputLength > sizeof(gpio_info))
526                                 return -EINVAL;
527                         if(copy_from_user(&gpio_info, IoBuffer.InputBuffer, IoBuffer.InputLength))
528                                 return -EFAULT;
529                 uiBit  = gpio_info.uiGpioNumber;
530                                   //Set the gpio output register
531                                 Status = rdmaltWithLock(Adapter, (UINT)GPIO_PIN_STATE_REGISTER,
532                         (PUINT)ucRead, sizeof(UINT));
533                 if(Status != STATUS_SUCCESS)
534                 {
535                     BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "RDM Failed\n");
536                                         return Status;
537                 }
538
539                         }
540                         break;
541                         case IOCTL_BCM_GPIO_MULTI_REQUEST:
542                         {
543                                 UCHAR ucResetValue[4];
544                                 GPIO_MULTI_INFO gpio_multi_info[MAX_IDX];
545                                 PGPIO_MULTI_INFO pgpio_multi_info = (PGPIO_MULTI_INFO)gpio_multi_info;
546
547                                 memset( pgpio_multi_info, 0, MAX_IDX * sizeof( GPIO_MULTI_INFO));
548
549                                 if((Adapter->IdleMode == TRUE) ||
550                                 (Adapter->bShutStatus ==TRUE) ||
551                                 (Adapter->bPreparingForLowPowerMode ==TRUE))
552                                         return -EINVAL;
553                                 if (copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
554                                         return -EFAULT;
555                                 if (IoBuffer.InputLength > sizeof(gpio_multi_info))
556                                         return -EINVAL;
557                                 if (copy_from_user(&gpio_multi_info, IoBuffer.InputBuffer, IoBuffer.InputLength))
558                                         return -EFAULT;
559
560                                 if(IsReqGpioIsLedInNVM(Adapter,pgpio_multi_info[WIMAX_IDX].uiGPIOMask)== FALSE)
561                                 {
562                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Sorry, Requested GPIO<0x%X> is not correspond to NVM LED bit map<0x%X>!!!",pgpio_multi_info[WIMAX_IDX].uiGPIOMask,Adapter->gpioBitMap);
563                                         Status = -EINVAL;
564                                         break;
565                                 }
566
567                                 /* Set the gpio output register */
568
569                                 if( ( pgpio_multi_info[WIMAX_IDX].uiGPIOMask) &
570                                         ( pgpio_multi_info[WIMAX_IDX].uiGPIOCommand))
571                                 {
572                                         /* Set 1's in GPIO OUTPUT REGISTER */
573                                         *(UINT*) ucResetValue =  pgpio_multi_info[WIMAX_IDX].uiGPIOMask &
574                                                                                  pgpio_multi_info[WIMAX_IDX].uiGPIOCommand &
575                                                                                          pgpio_multi_info[WIMAX_IDX].uiGPIOValue;
576
577                                         if( *(UINT*) ucResetValue)
578                                                 Status = wrmaltWithLock( Adapter, BCM_GPIO_OUTPUT_SET_REG , (PUINT) ucResetValue, sizeof(ULONG));
579
580                                         if( Status != STATUS_SUCCESS)
581                                         {
582                                                 BCM_DEBUG_PRINT( Adapter,DBG_TYPE_PRINTK, 0, 0,"WRM to BCM_GPIO_OUTPUT_SET_REG Failed.");
583                                                 return Status;
584                                         }
585
586                                         /* Clear to 0's in GPIO OUTPUT REGISTER */
587                                         *(UINT*) ucResetValue = (pgpio_multi_info[WIMAX_IDX].uiGPIOMask &
588                                                         pgpio_multi_info[WIMAX_IDX].uiGPIOCommand &
589                                                         ( ~( pgpio_multi_info[WIMAX_IDX].uiGPIOValue)));
590
591                                         if( *(UINT*) ucResetValue)
592                                                 Status = wrmaltWithLock( Adapter, BCM_GPIO_OUTPUT_CLR_REG , (PUINT) ucResetValue, sizeof(ULONG));
593
594                                         if( Status != STATUS_SUCCESS)
595                                         {
596                                                 BCM_DEBUG_PRINT( Adapter,DBG_TYPE_PRINTK, 0, 0,"WRM to BCM_GPIO_OUTPUT_CLR_REG Failed." );
597                                                 return Status;
598                                         }
599                                 }
600
601                                 if( pgpio_multi_info[WIMAX_IDX].uiGPIOMask)
602                                 {
603                                         Status = rdmaltWithLock(Adapter, (UINT)GPIO_PIN_STATE_REGISTER, (PUINT)ucResetValue, sizeof(UINT));
604
605                                         if(Status != STATUS_SUCCESS)
606                                         {
607                                                 BCM_DEBUG_PRINT( Adapter,DBG_TYPE_PRINTK, 0, 0,"RDM to GPIO_PIN_STATE_REGISTER Failed.");
608                                                 return Status;
609                                         }
610
611                                         pgpio_multi_info[WIMAX_IDX].uiGPIOValue = ( *(UINT*)ucResetValue &
612                                                                                         pgpio_multi_info[WIMAX_IDX].uiGPIOMask);
613                                 }
614
615                                 Status = copy_to_user(IoBuffer.OutputBuffer, &gpio_multi_info, IoBuffer.OutputLength);
616                                 if(Status)
617                                 {
618                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Failed while copying Content to IOBufer for user space err:%d",Status);
619                                         break;
620                                 }
621                         }
622                         break;
623                 case IOCTL_BCM_GPIO_MODE_REQUEST:
624                 {
625                         UCHAR ucResetValue[4];
626                         GPIO_MULTI_MODE gpio_multi_mode[MAX_IDX];
627                         PGPIO_MULTI_MODE pgpio_multi_mode = ( PGPIO_MULTI_MODE) gpio_multi_mode;
628
629                         if((Adapter->IdleMode == TRUE) ||
630                                 (Adapter->bShutStatus ==TRUE) ||
631                                 (Adapter->bPreparingForLowPowerMode ==TRUE))
632                                         return -EINVAL;
633
634                         if (copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
635                                 return -EFAULT;
636                         if (IoBuffer.InputLength > sizeof(gpio_multi_mode))
637                                 return -EINVAL;
638                         if (copy_from_user(&gpio_multi_mode, IoBuffer.InputBuffer, IoBuffer.InputLength))
639                                 return -EFAULT;
640
641                         Status = rdmaltWithLock( Adapter, ( UINT) GPIO_MODE_REGISTER, ( PUINT) ucResetValue, sizeof( UINT));
642                         if( STATUS_SUCCESS != Status)
643                         {
644                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Read of GPIO_MODE_REGISTER failed");
645                                 return Status;
646                         }
647
648                         //Validating the request
649                         if(IsReqGpioIsLedInNVM(Adapter,pgpio_multi_mode[WIMAX_IDX].uiGPIOMask)== FALSE)
650                         {
651                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Sorry, Requested GPIO<0x%X> is not correspond to NVM LED bit map<0x%X>!!!",pgpio_multi_mode[WIMAX_IDX].uiGPIOMask,Adapter->gpioBitMap);
652                                 Status = -EINVAL;
653                                 break;
654                         }
655
656                         if( pgpio_multi_mode[WIMAX_IDX].uiGPIOMask)
657                         {
658                                 /* write all OUT's (1's) */
659                                 *( UINT*) ucResetValue |= ( pgpio_multi_mode[WIMAX_IDX].uiGPIOMode &
660                                                                 pgpio_multi_mode[WIMAX_IDX].uiGPIOMask);
661                                 /* write all IN's (0's) */
662                                 *( UINT*) ucResetValue &= ~( ( ~pgpio_multi_mode[WIMAX_IDX].uiGPIOMode) &
663                                                                 pgpio_multi_mode[WIMAX_IDX].uiGPIOMask);
664
665                                 /* Currently implemented return the modes of all GPIO's
666                                  * else needs to bit AND with  mask
667                                  * */
668                                 pgpio_multi_mode[WIMAX_IDX].uiGPIOMode = *(UINT*)ucResetValue;
669
670                                 Status = wrmaltWithLock( Adapter, GPIO_MODE_REGISTER , ( PUINT) ucResetValue, sizeof( ULONG));
671                                 if( Status == STATUS_SUCCESS)
672                                 {
673                                         BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "WRM to GPIO_MODE_REGISTER Done");
674                                 }
675                                 else
676                                 {
677                                         BCM_DEBUG_PRINT( Adapter,DBG_TYPE_PRINTK, 0, 0,"WRM to GPIO_MODE_REGISTER Failed");
678                                         Status = -EFAULT;
679                                         break;
680                                 }
681                         }
682                         else /* if uiGPIOMask is 0 then return mode register configuration */
683                         {
684                                 pgpio_multi_mode[WIMAX_IDX].uiGPIOMode = *( UINT*) ucResetValue;
685                         }
686                         Status = copy_to_user(IoBuffer.OutputBuffer, &gpio_multi_mode, IoBuffer.OutputLength);
687                         if(Status)
688                         {
689                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Failed while copying Content to IOBufer for user space err:%d",Status);
690                                 break;
691                         }
692                 }
693                 break;
694
695                 case IOCTL_MAC_ADDR_REQ:
696                 case IOCTL_LINK_REQ:
697                 case IOCTL_CM_REQUEST:
698                 case IOCTL_SS_INFO_REQ:
699                 case IOCTL_SEND_CONTROL_MESSAGE:
700                 case IOCTL_IDLE_REQ:
701                 {
702                         PVOID pvBuffer=NULL;
703
704                         /* Copy Ioctl Buffer structure */
705                         if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
706                                 return -EFAULT;
707
708                         /* FIXME: don't accept any length from user */
709                         pvBuffer = kmalloc(IoBuffer.InputLength, GFP_KERNEL);
710                         if(!pvBuffer)
711                                 return -ENOMEM;
712
713                         if(copy_from_user(pvBuffer, IoBuffer.InputBuffer, IoBuffer.InputLength))
714                         {
715                                 Status = -EFAULT;
716                                 kfree(pvBuffer);
717                                 break;
718                         }
719
720                         down(&Adapter->LowPowerModeSync);
721                         Status = wait_event_interruptible_timeout(Adapter->lowpower_mode_wait_queue,
722                                                                                                         !Adapter->bPreparingForLowPowerMode,
723                                                                                                         (1 * HZ));
724                         if(Status == -ERESTARTSYS)
725                                         goto cntrlEnd;
726
727                         if(Adapter->bPreparingForLowPowerMode)
728                         {
729                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Preparing Idle Mode is still True - Hence Rejecting control message\n");
730                                 Status = STATUS_FAILURE ;
731                                 goto cntrlEnd ;
732                         }
733                         Status = CopyBufferToControlPacket(Adapter, (PVOID)pvBuffer);
734                 cntrlEnd:
735                         up(&Adapter->LowPowerModeSync);
736                         kfree(pvBuffer);
737                         break;
738                 }
739                 case IOCTL_BCM_BUFFER_DOWNLOAD_START:
740                 {
741                         INT NVMAccess = down_trylock(&Adapter->NVMRdmWrmLock) ;
742                         if(NVMAccess)
743                         {
744                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, " IOCTL_BCM_CHIP_RESET not allowed as EEPROM Read/Write is in progress\n");
745                                 return -EACCES;
746                         }
747                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Starting the firmware download PID =0x%x!!!!\n", current->pid);
748                     if(!down_trylock(&Adapter->fw_download_sema))
749                         {
750                                 Adapter->bBinDownloaded=FALSE;
751                                 Adapter->fw_download_process_pid=current->pid;
752                                 Adapter->bCfgDownloaded=FALSE;
753                                 Adapter->fw_download_done=FALSE;
754                                 netif_carrier_off(Adapter->dev);
755                                 netif_stop_queue(Adapter->dev);
756                                 Status = reset_card_proc(Adapter);
757                                 if(Status)
758                                 {
759                                         pr_err(PFX "%s: reset_card_proc Failed!\n", Adapter->dev->name);
760                                         up(&Adapter->fw_download_sema);
761                                         up(&Adapter->NVMRdmWrmLock);
762                                         break;
763                                 }
764                                 mdelay(10);
765                         }
766                         else
767                         {
768
769                                 Status = -EBUSY;
770
771                         }
772                         up(&Adapter->NVMRdmWrmLock);
773                         break;
774                 }
775                 case IOCTL_BCM_BUFFER_DOWNLOAD:
776                         {
777                                 FIRMWARE_INFO   *psFwInfo = NULL;
778                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Starting the firmware download PID =0x%x!!!!\n", current->pid);
779                         do{
780                                 if(!down_trylock(&Adapter->fw_download_sema))
781                                 {
782                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Invalid way to download buffer. Use Start and then call this!!!\n");
783                                         Status=-EINVAL;
784                                         break;
785                                 }
786
787                                 /* Copy Ioctl Buffer structure */
788                                 if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
789                                         return -EFAULT;
790
791                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Length for FW DLD is : %lx\n",
792                                                                                 IoBuffer.InputLength);
793
794                                 if (IoBuffer.InputLength > sizeof(FIRMWARE_INFO))
795                                         return -EINVAL;
796
797                                 psFwInfo = kmalloc(sizeof(*psFwInfo), GFP_KERNEL);
798                                 if(!psFwInfo)
799                                         return -ENOMEM;
800
801                                 if(copy_from_user(psFwInfo, IoBuffer.InputBuffer, IoBuffer.InputLength))
802                                         return -EFAULT;
803
804                                 if(!psFwInfo->pvMappedFirmwareAddress ||
805                                                 (psFwInfo->u32FirmwareLength == 0))
806                                 {
807                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Something else is wrong %lu\n",
808                                         psFwInfo->u32FirmwareLength);
809                                         Status = -EINVAL;
810                                         break;
811                                 }
812                                 Status = bcm_ioctl_fw_download(Adapter, psFwInfo);
813                                 if(Status != STATUS_SUCCESS)
814                                 {
815                                         if(psFwInfo->u32StartingAddress==CONFIG_BEGIN_ADDR)
816                                         {
817                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "IOCTL: Configuration File Upload Failed\n");
818                                         }
819                                         else
820                                         {
821                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "IOCTL: Firmware File Upload Failed\n");
822                                         }
823                                         //up(&Adapter->fw_download_sema);
824
825                                         if(Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY)
826                                         {
827                                                 Adapter->DriverState = DRIVER_INIT;
828                                                 Adapter->LEDInfo.bLedInitDone = FALSE;
829                                                 wake_up(&Adapter->LEDInfo.notify_led_event);
830                                         }
831                                 }
832                                 break ;
833                           }while(0);
834
835                           if(Status != STATUS_SUCCESS)
836                                         up(&Adapter->fw_download_sema);
837                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, OSAL_DBG, DBG_LVL_ALL, "IOCTL: Firmware File Uploaded\n");
838                                 kfree(psFwInfo);
839                                 break;
840                         }
841                 case IOCTL_BCM_BUFFER_DOWNLOAD_STOP:
842                 {
843                         INT NVMAccess = down_trylock(&Adapter->NVMRdmWrmLock);
844                         if(NVMAccess)
845                         {
846                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, " FW download blocked as EEPROM Read/Write is in progress\n");
847                                 up(&Adapter->fw_download_sema);
848                                 return -EACCES;
849                         }
850                         if(down_trylock(&Adapter->fw_download_sema))
851                         {
852                                 Adapter->bBinDownloaded=TRUE;
853                                 Adapter->bCfgDownloaded=TRUE;
854                                 atomic_set(&Adapter->CurrNumFreeTxDesc, 0);
855
856                                 Adapter->CurrNumRecvDescs=0;
857                                 Adapter->downloadDDR = 0;
858
859                                 //setting the Mips to Run
860                                 Status = run_card_proc(Adapter);
861                                 if(Status)
862                                 {
863                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Firm Download Failed\n");
864                                         up(&Adapter->fw_download_sema);
865                                         up(&Adapter->NVMRdmWrmLock);
866                                         break;
867                                 }
868                                 else
869                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Firm Download Over...\n");
870                                 mdelay(10);
871                                 /* Wait for MailBox Interrupt */
872                                 if(StartInterruptUrb((PS_INTERFACE_ADAPTER)Adapter->pvInterfaceAdapter))
873                                 {
874                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Unable to send interrupt...\n");
875                                 }
876                                 timeout = 5*HZ;
877                                 Adapter->waiting_to_fw_download_done = FALSE;
878                                 wait_event_timeout(Adapter->ioctl_fw_dnld_wait_queue,
879                                         Adapter->waiting_to_fw_download_done, timeout);
880                                 Adapter->fw_download_process_pid=INVALID_PID;
881                                 Adapter->fw_download_done=TRUE;
882                                 atomic_set(&Adapter->CurrNumFreeTxDesc, 0);
883                                 Adapter->CurrNumRecvDescs = 0;
884                                 Adapter->PrevNumRecvDescs = 0;
885                                 atomic_set(&Adapter->cntrlpktCnt,0);
886                 Adapter->LinkUpStatus = 0;
887                 Adapter->LinkStatus = 0;
888
889                                 if(Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY)
890                                 {
891                                         Adapter->DriverState = FW_DOWNLOAD_DONE;
892                                         wake_up(&Adapter->LEDInfo.notify_led_event);
893                                 }
894
895                                 if(!timeout)
896                                 {
897                                         Status = -ENODEV;
898                                 }
899                         }
900                         else
901                         {
902                                 Status = -EINVAL;
903                         }
904                         up(&Adapter->fw_download_sema);
905                         up(&Adapter->NVMRdmWrmLock);
906                         break;
907                 }
908                 case IOCTL_BE_BUCKET_SIZE:
909                         Status = 0;
910                         if (get_user(Adapter->BEBucketSize, (unsigned long __user *)arg))
911                                 Status = -EFAULT;
912                         break;
913
914                 case IOCTL_RTPS_BUCKET_SIZE:
915                         Status = 0;
916                         if (get_user(Adapter->rtPSBucketSize, (unsigned long __user *)arg))
917                                 Status = -EFAULT;
918                         break;
919                 case IOCTL_CHIP_RESET:
920             {
921                         INT NVMAccess = down_trylock(&Adapter->NVMRdmWrmLock);
922                         if(NVMAccess)
923                         {
924                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, " IOCTL_BCM_CHIP_RESET not allowed as EEPROM Read/Write is in progress\n");
925                                 return -EACCES;
926                         }
927                         down(&Adapter->RxAppControlQueuelock);
928                         Status = reset_card_proc(Adapter);
929                         flushAllAppQ();
930                         up(&Adapter->RxAppControlQueuelock);
931                         up(&Adapter->NVMRdmWrmLock);
932                         ResetCounters(Adapter);
933                         break;
934                 }
935                 case IOCTL_QOS_THRESHOLD:
936                 {
937                         USHORT uiLoopIndex;
938
939                         Status = 0;
940                         for (uiLoopIndex = 0; uiLoopIndex < NO_OF_QUEUES; uiLoopIndex++) {
941                                 if (get_user(Adapter->PackInfo[uiLoopIndex].uiThreshold,
942                                                 (unsigned long __user *)arg)) {
943                                         Status = -EFAULT;
944                                         break;
945                                 }
946                         }
947                         break;
948                 }
949
950                 case IOCTL_DUMP_PACKET_INFO:
951
952                         DumpPackInfo(Adapter);
953                 DumpPhsRules(&Adapter->stBCMPhsContext);
954                         Status = STATUS_SUCCESS;
955                         break;
956
957                 case IOCTL_GET_PACK_INFO:
958                         if(copy_to_user(argp, &Adapter->PackInfo, sizeof(PacketInfo)*NO_OF_QUEUES))
959                                 return -EFAULT;
960                         Status = STATUS_SUCCESS;
961                         break;
962                 case IOCTL_BCM_SWITCH_TRANSFER_MODE:
963                 {
964                         UINT uiData = 0;
965                         if(copy_from_user(&uiData, argp, sizeof(UINT)))
966                                 return -EFAULT;
967
968                         if(uiData)      /* Allow All Packets */
969                         {
970                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_SWITCH_TRANSFER_MODE: ETH_PACKET_TUNNELING_MODE\n");
971                                 Adapter->TransferMode = ETH_PACKET_TUNNELING_MODE;
972                         }
973                         else    /* Allow IP only Packets */
974                         {
975                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_SWITCH_TRANSFER_MODE: IP_PACKET_ONLY_MODE\n");
976                                 Adapter->TransferMode = IP_PACKET_ONLY_MODE;
977                         }
978                         Status = STATUS_SUCCESS;
979                         break;
980                 }
981
982                 case IOCTL_BCM_GET_DRIVER_VERSION:
983                 {
984                         /* Copy Ioctl Buffer structure */
985                         if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
986                                 return -EFAULT;
987
988                         if(copy_to_user(IoBuffer.OutputBuffer, VER_FILEVERSION_STR, IoBuffer.OutputLength))
989                                 return -EFAULT;
990                         Status = STATUS_SUCCESS;
991                         break;
992                 }
993                 case IOCTL_BCM_GET_CURRENT_STATUS:
994                 {
995                         LINK_STATE link_state;
996
997                         /* Copy Ioctl Buffer structure */
998                         if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
999                         {
1000                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copy_from_user failed..\n");
1001                                 Status = -EFAULT;
1002                                 break;
1003                         }
1004                         if (IoBuffer.OutputLength != sizeof(link_state)) {
1005                                 Status = -EINVAL;
1006                                 break;
1007                         }
1008
1009                         memset(&link_state, 0, sizeof(link_state));
1010                         link_state.bIdleMode = Adapter->IdleMode;
1011                         link_state.bShutdownMode = Adapter->bShutStatus;
1012                         link_state.ucLinkStatus = Adapter->LinkStatus;
1013
1014                         if (copy_to_user(IoBuffer.OutputBuffer, &link_state,
1015                                          min_t(size_t, sizeof(link_state), IoBuffer.OutputLength)))
1016                         {
1017                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy_to_user Failed..\n");
1018                                 Status = -EFAULT;
1019                                 break;
1020                         }
1021                         Status = STATUS_SUCCESS;
1022                         break;
1023                 }
1024         case IOCTL_BCM_SET_MAC_TRACING:
1025         {
1026             UINT  tracing_flag;
1027
1028             /* copy ioctl Buffer structure */
1029             if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1030                     return -EFAULT;
1031
1032             if(copy_from_user(&tracing_flag,IoBuffer.InputBuffer,sizeof(UINT)))
1033                     return -EFAULT;
1034
1035             if (tracing_flag)
1036                 Adapter->pTarangs->MacTracingEnabled = TRUE;
1037             else
1038                 Adapter->pTarangs->MacTracingEnabled = FALSE;
1039             break;
1040         }
1041                 case IOCTL_BCM_GET_DSX_INDICATION:
1042                 {
1043                         ULONG ulSFId=0;
1044                         if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1045                                 return -EFAULT;
1046
1047                         if(IoBuffer.OutputLength < sizeof(stLocalSFAddIndicationAlt))
1048                         {
1049                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,
1050                                                 "Mismatch req: %lx needed is =0x%zx!!!",
1051                                                 IoBuffer.OutputLength, sizeof(stLocalSFAddIndicationAlt));
1052                                 return -EINVAL;
1053                         }
1054
1055                         if(copy_from_user(&ulSFId, IoBuffer.InputBuffer, sizeof(ulSFId)))
1056                                 return -EFAULT;
1057
1058                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Get DSX Data SF ID is =%lx\n", ulSFId );
1059                         get_dsx_sf_data_to_application(Adapter, ulSFId, IoBuffer.OutputBuffer);
1060                         Status=STATUS_SUCCESS;
1061                 }
1062                 break;
1063                 case IOCTL_BCM_GET_HOST_MIBS:
1064                 {
1065                         PVOID temp_buff;
1066
1067                         if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1068                                 return -EFAULT;
1069
1070                         if(IoBuffer.OutputLength != sizeof(S_MIBS_HOST_STATS_MIBS))
1071                         {
1072                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,
1073                                                 "Length Check failed %lu %zd\n",
1074                                                 IoBuffer.OutputLength, sizeof(S_MIBS_HOST_STATS_MIBS));
1075                                 return -EINVAL;
1076                         }
1077
1078                         /* FIXME: HOST_STATS are too big for kmalloc (122048)! */
1079                         temp_buff = kzalloc(sizeof(S_MIBS_HOST_STATS_MIBS), GFP_KERNEL);
1080                         if(!temp_buff)
1081                                 return STATUS_FAILURE;
1082
1083                         Status = ProcessGetHostMibs(Adapter, temp_buff);
1084                         GetDroppedAppCntrlPktMibs(temp_buff, pTarang);
1085
1086                         if (Status != STATUS_FAILURE)
1087                                 if(copy_to_user(IoBuffer.OutputBuffer, temp_buff, sizeof(S_MIBS_HOST_STATS_MIBS)))
1088                                         Status = -EFAULT;
1089
1090                         kfree(temp_buff);
1091                         break;
1092                 }
1093
1094                 case IOCTL_BCM_WAKE_UP_DEVICE_FROM_IDLE:
1095                         if((FALSE == Adapter->bTriedToWakeUpFromlowPowerMode) && (TRUE==Adapter->IdleMode))
1096                         {
1097                                 Adapter->usIdleModePattern = ABORT_IDLE_MODE;
1098                                 Adapter->bWakeUpDevice = TRUE;
1099                                 wake_up(&Adapter->process_rx_cntrlpkt);
1100                         }
1101                         Status = STATUS_SUCCESS;
1102                         break;
1103
1104                 case IOCTL_BCM_BULK_WRM:
1105                         {
1106                                 PBULKWRM_BUFFER pBulkBuffer;
1107                                 UINT uiTempVar=0;
1108                                 PCHAR pvBuffer = NULL;
1109
1110                                 if((Adapter->IdleMode == TRUE) ||
1111                                         (Adapter->bShutStatus ==TRUE) ||
1112                                         (Adapter->bPreparingForLowPowerMode ==TRUE))
1113                                 {
1114                     BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "Device in Idle/Shutdown Mode, Blocking Wrms\n");
1115                                         Status = -EACCES;
1116                                         break;
1117                                 }
1118
1119                                 /* Copy Ioctl Buffer structure */
1120                                 if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1121                                         return -EFAULT;
1122
1123                                 /* FIXME: restrict length */
1124                                 pvBuffer = kmalloc(IoBuffer.InputLength, GFP_KERNEL);
1125                                 if(!pvBuffer)
1126                                         return -ENOMEM;
1127
1128                                 /* Get WrmBuffer structure */
1129                                 if(copy_from_user(pvBuffer, IoBuffer.InputBuffer, IoBuffer.InputLength))
1130                                 {
1131                                         kfree(pvBuffer);
1132                                         Status = -EFAULT;
1133                                         break;
1134                                 }
1135
1136                                 pBulkBuffer = (PBULKWRM_BUFFER)pvBuffer;
1137
1138                                 if(((ULONG)pBulkBuffer->Register & 0x0F000000) != 0x0F000000 ||
1139                                         ((ULONG)pBulkBuffer->Register & 0x3))
1140                                 {
1141                                         kfree(pvBuffer);
1142                     BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0,"WRM Done On invalid Address : %x Access Denied.\n",(int)pBulkBuffer->Register);
1143                                         Status = -EINVAL;
1144                                         break;
1145                                 }
1146
1147
1148                                 uiTempVar = pBulkBuffer->Register & EEPROM_REJECT_MASK;
1149                                 if(!((Adapter->pstargetparams->m_u32Customize)&VSG_MODE)
1150                                 &&      ((uiTempVar == EEPROM_REJECT_REG_1)||
1151                                                 (uiTempVar == EEPROM_REJECT_REG_2) ||
1152                                         (uiTempVar == EEPROM_REJECT_REG_3) ||
1153                                         (uiTempVar == EEPROM_REJECT_REG_4)) &&
1154                                         (cmd == IOCTL_BCM_REGISTER_WRITE))
1155                                 {
1156                                         kfree(pvBuffer);
1157                     BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0,"EEPROM Access Denied, not in VSG Mode\n");
1158                                         Status = -EFAULT;
1159                                         break;
1160                                 }
1161
1162                                 if(pBulkBuffer->SwapEndian == FALSE)
1163                                         Status = wrmWithLock(Adapter, (UINT)pBulkBuffer->Register, (PCHAR)pBulkBuffer->Values, IoBuffer.InputLength - 2*sizeof(ULONG));
1164                                 else
1165                                         Status = wrmaltWithLock(Adapter, (UINT)pBulkBuffer->Register, (PUINT)pBulkBuffer->Values, IoBuffer.InputLength - 2*sizeof(ULONG));
1166
1167                                 if(Status != STATUS_SUCCESS)
1168                                 {
1169                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "WRM Failed\n");
1170                                 }
1171
1172                                 kfree(pvBuffer);
1173                                 break;
1174                         }
1175
1176                 case IOCTL_BCM_GET_NVM_SIZE:
1177                         if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1178                                 return -EFAULT;
1179
1180                         if(Adapter->eNVMType == NVM_EEPROM || Adapter->eNVMType == NVM_FLASH ) {
1181                                 if(copy_to_user(IoBuffer.OutputBuffer, &Adapter->uiNVMDSDSize, sizeof(UINT)))
1182                                         return -EFAULT;
1183                         }
1184                         Status = STATUS_SUCCESS ;
1185                         break;
1186
1187                 case IOCTL_BCM_CAL_INIT :
1188
1189                         {
1190                                 UINT uiSectorSize = 0 ;
1191                                 if(Adapter->eNVMType == NVM_FLASH)
1192                                 {
1193                                         if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1194                                                 return -EFAULT;
1195
1196                                         if (copy_from_user(&uiSectorSize, IoBuffer.InputBuffer, sizeof(UINT)))
1197                                                 return -EFAULT;
1198
1199                                         if((uiSectorSize < MIN_SECTOR_SIZE) || (uiSectorSize > MAX_SECTOR_SIZE))
1200                                         {
1201                                                 if (copy_to_user(IoBuffer.OutputBuffer, &Adapter->uiSectorSize,
1202                                                                  sizeof(UINT)))
1203                                                         return -EFAULT;
1204                                         }
1205                                         else
1206                                         {
1207                                                 if(IsFlash2x(Adapter))
1208                                                 {
1209                                                         if (copy_to_user(IoBuffer.OutputBuffer,
1210                                                                          &Adapter->uiSectorSize ,
1211                                                                          sizeof(UINT)))
1212                                                             return -EFAULT;
1213                                                 }
1214                                                 else
1215                                                 {
1216                                                         if((TRUE == Adapter->bShutStatus) ||
1217                                                            (TRUE == Adapter->IdleMode))
1218                                                         {
1219                                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Device is in Idle/Shutdown Mode\n");
1220                                                                 return -EACCES;
1221                                                         }
1222
1223                                                         Adapter->uiSectorSize = uiSectorSize ;
1224                                                         BcmUpdateSectorSize(Adapter,Adapter->uiSectorSize);
1225                                                 }
1226                                         }
1227                                         Status = STATUS_SUCCESS ;
1228                                 }
1229                                 else
1230                                 {
1231                                         Status = STATUS_FAILURE;
1232                                 }
1233                         }
1234                         break;
1235         case IOCTL_BCM_SET_DEBUG :
1236 #ifdef DEBUG
1237             {
1238                 USER_BCM_DBG_STATE sUserDebugState;
1239
1240 //                              BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "Entered the ioctl %x \n", IOCTL_BCM_SET_DEBUG );
1241
1242                                 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "In SET_DEBUG ioctl\n");
1243                                 if (copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1244                                         return -EFAULT;
1245
1246                                 if (copy_from_user(&sUserDebugState, IoBuffer.InputBuffer, sizeof(USER_BCM_DBG_STATE)))
1247                                         return -EFAULT;
1248
1249
1250                                 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "IOCTL_BCM_SET_DEBUG: OnOff=%d Type = 0x%x ",
1251                                 sUserDebugState.OnOff, sUserDebugState.Type);
1252                                 //sUserDebugState.Subtype <<= 1;
1253                                 sUserDebugState.Subtype = 1 << sUserDebugState.Subtype;
1254                                 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "actual Subtype=0x%x\n", sUserDebugState.Subtype);
1255
1256                                 // Update new 'DebugState' in the Adapter
1257                                 Adapter->stDebugState.type |= sUserDebugState.Type;
1258                                 /* Subtype: A bitmap of 32 bits for Subtype per Type.
1259                                  * Valid indexes in 'subtype' array: 1,2,4,8
1260                                  * corresponding to valid Type values. Hence we can use the 'Type' field
1261                                  * as the index value, ignoring the array entries 0,3,5,6,7 !
1262                                  */
1263                                 if (sUserDebugState.OnOff)
1264                                         Adapter->stDebugState.subtype[sUserDebugState.Type] |= sUserDebugState.Subtype;
1265                                 else
1266                                         Adapter->stDebugState.subtype[sUserDebugState.Type] &= ~sUserDebugState.Subtype;
1267
1268                 BCM_SHOW_DEBUG_BITMAP(Adapter);
1269
1270                         }
1271 #endif
1272                         break;
1273                 case IOCTL_BCM_NVM_READ:
1274                 case IOCTL_BCM_NVM_WRITE:
1275                         {
1276                                 NVM_READWRITE  stNVMReadWrite;
1277                                 PUCHAR pReadData = NULL;
1278                                 ULONG ulDSDMagicNumInUsrBuff = 0;
1279                                 struct timeval tv0, tv1;
1280                                 memset(&tv0,0,sizeof(struct timeval));
1281                                 memset(&tv1,0,sizeof(struct timeval));
1282                                 if((Adapter->eNVMType == NVM_FLASH) && (Adapter->uiFlashLayoutMajorVersion == 0))
1283                                 {
1284                                         BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0,"The Flash Control Section is Corrupted. Hence Rejection on NVM Read/Write\n");
1285                                         Status = -EFAULT;
1286                                         break;
1287                                 }
1288
1289                                 if(IsFlash2x(Adapter))
1290                                 {
1291                                         if((Adapter->eActiveDSD != DSD0) &&
1292                                                 (Adapter->eActiveDSD != DSD1) &&
1293                                                 (Adapter->eActiveDSD != DSD2))
1294                                         {
1295                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"No DSD is active..hence NVM Command is blocked");
1296                                                 return STATUS_FAILURE ;
1297                                         }
1298                                 }
1299
1300                         /* Copy Ioctl Buffer structure */
1301
1302                                 if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1303                                         return -EFAULT;
1304
1305                                 if(copy_from_user(&stNVMReadWrite,
1306                                                   (IOCTL_BCM_NVM_READ == cmd) ? IoBuffer.OutputBuffer : IoBuffer.InputBuffer,
1307                                                   sizeof(NVM_READWRITE)))
1308                                         return -EFAULT;
1309
1310                                 //
1311                                 // Deny the access if the offset crosses the cal area limit.
1312                                 //
1313                                 if((stNVMReadWrite.uiOffset + stNVMReadWrite.uiNumBytes) > Adapter->uiNVMDSDSize)
1314                                 {
1315                                 //BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Can't allow access beyond NVM Size: 0x%x 0x%x\n", stNVMReadWrite.uiOffset ,
1316 //                                                      stNVMReadWrite.uiNumBytes);
1317                                         Status = STATUS_FAILURE;
1318                                         break;
1319                                 }
1320
1321                                 pReadData = kzalloc(stNVMReadWrite.uiNumBytes, GFP_KERNEL);
1322                                 if(!pReadData)
1323                                         return -ENOMEM;
1324
1325                                 if(copy_from_user(pReadData, stNVMReadWrite.pBuffer,
1326                                                         stNVMReadWrite.uiNumBytes))
1327                                 {
1328                                         Status = -EFAULT;
1329                                         kfree(pReadData);
1330                                         break;
1331                                 }
1332
1333                                 do_gettimeofday(&tv0);
1334                                 if(IOCTL_BCM_NVM_READ == cmd)
1335                                 {
1336                                         down(&Adapter->NVMRdmWrmLock);
1337
1338                                         if((Adapter->IdleMode == TRUE) ||
1339                                                 (Adapter->bShutStatus ==TRUE) ||
1340                                                 (Adapter->bPreparingForLowPowerMode ==TRUE))
1341                                         {
1342                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1343                                                 up(&Adapter->NVMRdmWrmLock);
1344                                                 kfree(pReadData);
1345                                                 return -EACCES;
1346                                         }
1347
1348                                         Status = BeceemNVMRead(Adapter, (PUINT)pReadData,
1349                                                 stNVMReadWrite.uiOffset, stNVMReadWrite.uiNumBytes);
1350
1351                                         up(&Adapter->NVMRdmWrmLock);
1352
1353                                         if(Status != STATUS_SUCCESS)
1354                                                 {
1355                                                         kfree(pReadData);
1356                                                         return Status;
1357                                                 }
1358                                         if(copy_to_user(stNVMReadWrite.pBuffer,pReadData, stNVMReadWrite.uiNumBytes))
1359                                                 {
1360                                                         kfree(pReadData);
1361                                                         Status = -EFAULT;
1362                                                 }
1363                                 }
1364                                 else
1365                                 {
1366
1367                                         down(&Adapter->NVMRdmWrmLock);
1368
1369                                         if((Adapter->IdleMode == TRUE) ||
1370                                                 (Adapter->bShutStatus ==TRUE) ||
1371                                                 (Adapter->bPreparingForLowPowerMode ==TRUE))
1372                                         {
1373                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1374                                                 up(&Adapter->NVMRdmWrmLock);
1375                                                 kfree(pReadData);
1376                                                 return -EACCES;
1377                                         }
1378
1379                                         Adapter->bHeaderChangeAllowed = TRUE ;
1380                                         if(IsFlash2x(Adapter))
1381                                         {
1382                                                 /*
1383                                                         New Requirement:-
1384                                                         DSD section updation will be allowed in two case:-
1385                                                         1.  if DSD sig is present in DSD header means dongle is ok and updation is fruitfull
1386                                                         2.  if point 1 failes then user buff should have DSD sig. this point ensures that if dongle is
1387                                                               corrupted then user space program first modify the DSD header with valid DSD sig so
1388                                                               that this as well as further write may be worthwhile.
1389
1390                                                          This restriction has been put assuming that if DSD sig is corrupted, DSD
1391                                                          data won't be considered valid.
1392
1393
1394                                                 */
1395                                                 Status = BcmFlash2xCorruptSig(Adapter,Adapter->eActiveDSD);
1396                                                 if(Status != STATUS_SUCCESS)
1397                                                 {
1398                                                         if(( (stNVMReadWrite.uiOffset + stNVMReadWrite.uiNumBytes) != Adapter->uiNVMDSDSize ) ||
1399                                                                 (stNVMReadWrite.uiNumBytes < SIGNATURE_SIZE))
1400                                                         {
1401                                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"DSD Sig is present neither in Flash nor User provided Input..");
1402                                                                 up(&Adapter->NVMRdmWrmLock);
1403                                                                 kfree(pReadData);
1404                                                                 return Status;
1405                                                         }
1406
1407                                                         ulDSDMagicNumInUsrBuff = ntohl(*(PUINT)(pReadData + stNVMReadWrite.uiNumBytes - SIGNATURE_SIZE));
1408                                                         if(ulDSDMagicNumInUsrBuff != DSD_IMAGE_MAGIC_NUMBER)
1409                                                         {
1410                                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"DSD Sig is present neither in Flash nor User provided Input..");
1411                                                                 up(&Adapter->NVMRdmWrmLock);
1412                                                                 kfree(pReadData);
1413                                                                 return Status;
1414                                                         }
1415                                                 }
1416                                         }
1417                                         Status = BeceemNVMWrite(Adapter, (PUINT )pReadData,
1418                                                                         stNVMReadWrite.uiOffset, stNVMReadWrite.uiNumBytes, stNVMReadWrite.bVerify);
1419                                         if(IsFlash2x(Adapter))
1420                                                 BcmFlash2xWriteSig(Adapter,Adapter->eActiveDSD);
1421
1422                                         Adapter->bHeaderChangeAllowed = FALSE ;
1423
1424                                         up(&Adapter->NVMRdmWrmLock);
1425
1426
1427                                         if(Status != STATUS_SUCCESS)
1428                                         {
1429                                                 kfree(pReadData);
1430                                                 return Status;
1431                                         }
1432                                 }
1433                                 do_gettimeofday(&tv1);
1434                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, " timetaken by Write/read :%ld msec\n",(tv1.tv_sec - tv0.tv_sec)*1000 +(tv1.tv_usec - tv0.tv_usec)/1000);
1435
1436
1437                                 kfree(pReadData);
1438                                 Status = STATUS_SUCCESS;
1439                         }
1440                         break;
1441                 case IOCTL_BCM_FLASH2X_SECTION_READ :
1442                          {
1443
1444                                 FLASH2X_READWRITE sFlash2xRead = {0};
1445                                 PUCHAR pReadBuff = NULL ;
1446                                 UINT NOB = 0;
1447                                 UINT BuffSize = 0;
1448                                 UINT ReadBytes = 0;
1449                                 UINT ReadOffset = 0;
1450                                 void __user *OutPutBuff;
1451
1452                                 if(IsFlash2x(Adapter) != TRUE)
1453                                 {
1454                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
1455                                         return -EINVAL;
1456                                 }
1457
1458                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_FLASH2X_SECTION_READ Called");
1459                                 if (copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1460                                         return -EFAULT;
1461
1462                                 //Reading FLASH 2.x READ structure
1463                                 if (copy_from_user(&sFlash2xRead, IoBuffer.InputBuffer,sizeof(FLASH2X_READWRITE)))
1464                                         return -EFAULT;
1465
1466
1467                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.Section :%x" ,sFlash2xRead.Section);
1468                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.offset :%x" ,sFlash2xRead.offset);
1469                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.numOfBytes :%x" ,sFlash2xRead.numOfBytes);
1470                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.bVerify :%x\n" ,sFlash2xRead.bVerify);
1471
1472                                 //This was internal to driver for raw read. now it has ben exposed to user space app.
1473                                 if(validateFlash2xReadWrite(Adapter,&sFlash2xRead) == FALSE)
1474                                         return STATUS_FAILURE ;
1475
1476                                 NOB = sFlash2xRead.numOfBytes;
1477                                 if(NOB > Adapter->uiSectorSize )
1478                                         BuffSize = Adapter->uiSectorSize;
1479                                 else
1480                                         BuffSize = NOB ;
1481
1482                                 ReadOffset = sFlash2xRead.offset ;
1483                                 OutPutBuff = IoBuffer.OutputBuffer;
1484
1485
1486                                 pReadBuff = (PCHAR)kzalloc(BuffSize , GFP_KERNEL);
1487                                 if(pReadBuff == NULL)
1488                                 {
1489                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Memory allocation failed for Flash 2.x Read Structure");
1490                                         return -ENOMEM;
1491                                 }
1492                                 down(&Adapter->NVMRdmWrmLock);
1493
1494                                 if((Adapter->IdleMode == TRUE) ||
1495                                         (Adapter->bShutStatus ==TRUE) ||
1496                                         (Adapter->bPreparingForLowPowerMode ==TRUE))
1497                                 {
1498                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1499                                         up(&Adapter->NVMRdmWrmLock);
1500                                         kfree(pReadBuff);
1501                                         return -EACCES;
1502                                 }
1503
1504                                 while(NOB)
1505                                 {
1506
1507                                         if(NOB > Adapter->uiSectorSize )
1508                                                 ReadBytes = Adapter->uiSectorSize;
1509                                         else
1510                                                 ReadBytes = NOB;
1511
1512
1513                                         //Reading the data from Flash 2.x
1514
1515                                         Status = BcmFlash2xBulkRead(Adapter,(PUINT)pReadBuff,sFlash2xRead.Section,ReadOffset,ReadBytes);
1516                                         if(Status)
1517                                         {
1518                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Flash 2x read err with Status :%d", Status);
1519                                                 break ;
1520                                         }
1521
1522                                         BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,pReadBuff, ReadBytes);
1523
1524                                         Status = copy_to_user(OutPutBuff, pReadBuff,ReadBytes);
1525                                         if(Status)
1526                                         {
1527                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Copy to use failed with status :%d", Status);
1528                                                 break;
1529                                         }
1530                                         NOB = NOB - ReadBytes;
1531                                         if(NOB)
1532                                         {
1533                                                 ReadOffset = ReadOffset + ReadBytes ;
1534                                                 OutPutBuff = OutPutBuff + ReadBytes ;
1535                                         }
1536
1537                                 }
1538                                 up(&Adapter->NVMRdmWrmLock);
1539                                 kfree(pReadBuff);
1540
1541                          }
1542                          break ;
1543                 case IOCTL_BCM_FLASH2X_SECTION_WRITE :
1544                          {
1545                                 FLASH2X_READWRITE sFlash2xWrite = {0};
1546                                 PUCHAR pWriteBuff;
1547                                 void __user *InputAddr;
1548                                 UINT NOB = 0;
1549                                 UINT BuffSize = 0;
1550                                 UINT WriteOffset = 0;
1551                                 UINT WriteBytes = 0;
1552
1553                                 if(IsFlash2x(Adapter) != TRUE)
1554                                 {
1555                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
1556                                         return -EINVAL;
1557                                 }
1558
1559                                 //First make this False so that we can enable the Sector Permission Check in BeceemFlashBulkWrite
1560                                 Adapter->bAllDSDWriteAllow = FALSE;
1561
1562
1563                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, " IOCTL_BCM_FLASH2X_SECTION_WRITE Called");
1564                                 if (copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1565                                         return -EFAULT;
1566
1567                                 //Reading FLASH 2.x READ structure
1568                                 if (copy_from_user(&sFlash2xWrite, IoBuffer.InputBuffer, sizeof(FLASH2X_READWRITE)))
1569                                         return -EFAULT;
1570
1571                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.Section :%x" ,sFlash2xWrite.Section);
1572                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.offset :%d" ,sFlash2xWrite.offset);
1573                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.numOfBytes :%x" ,sFlash2xWrite.numOfBytes);
1574                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.bVerify :%x\n" ,sFlash2xWrite.bVerify);
1575                                 if((sFlash2xWrite.Section != VSA0) && (sFlash2xWrite.Section != VSA1) &&
1576                                         (sFlash2xWrite.Section != VSA2) )
1577                                 {
1578                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Only VSA write is allowed");
1579                                         return -EINVAL;
1580                                 }
1581
1582                                 if(validateFlash2xReadWrite(Adapter,&sFlash2xWrite) == FALSE)
1583                                         return STATUS_FAILURE ;
1584
1585                                 InputAddr = sFlash2xWrite.pDataBuff;
1586                                 WriteOffset = sFlash2xWrite.offset ;
1587                                 NOB = sFlash2xWrite.numOfBytes;
1588
1589                                 if(NOB > Adapter->uiSectorSize )
1590                                         BuffSize = Adapter->uiSectorSize;
1591                                 else
1592                                         BuffSize = NOB ;
1593
1594                                 pWriteBuff = kmalloc(BuffSize, GFP_KERNEL);
1595                                 if(pWriteBuff == NULL)
1596                                         return -ENOMEM;
1597
1598
1599                                 //extracting the remainder of the given offset.
1600                                 WriteBytes = Adapter->uiSectorSize ;
1601                                 if(WriteOffset % Adapter->uiSectorSize)
1602                                         WriteBytes =Adapter->uiSectorSize - (WriteOffset % Adapter->uiSectorSize);
1603                                 if(NOB < WriteBytes)
1604                                         WriteBytes = NOB;
1605
1606                                 down(&Adapter->NVMRdmWrmLock);
1607
1608                                 if((Adapter->IdleMode == TRUE) ||
1609                                         (Adapter->bShutStatus ==TRUE) ||
1610                                         (Adapter->bPreparingForLowPowerMode ==TRUE))
1611                                 {
1612                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1613                                         up(&Adapter->NVMRdmWrmLock);
1614                                         kfree(pWriteBuff);
1615                                         return -EACCES;
1616                                 }
1617
1618                                 BcmFlash2xCorruptSig(Adapter,sFlash2xWrite.Section);
1619                                 do
1620                                 {
1621                                         Status = copy_from_user(pWriteBuff,InputAddr,WriteBytes);
1622                                         if(Status)
1623                                         {
1624                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Copy to user failed with status :%d", Status);
1625                                                 break ;
1626                                         }
1627                                         BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,pWriteBuff,WriteBytes);
1628                                         //Writing the data from Flash 2.x
1629                                         Status = BcmFlash2xBulkWrite(Adapter,(PUINT)pWriteBuff,sFlash2xWrite.Section,WriteOffset,WriteBytes,sFlash2xWrite.bVerify);
1630
1631                                         if(Status)
1632                                         {
1633                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash 2x read err with Status :%d", Status);
1634                                                 break ;
1635                                         }
1636
1637                                         NOB = NOB - WriteBytes;
1638                                         if(NOB)
1639                                         {
1640                                                 WriteOffset = WriteOffset + WriteBytes ;
1641                                                 InputAddr = InputAddr + WriteBytes ;
1642                                                 if(NOB > Adapter->uiSectorSize )
1643                                                         WriteBytes = Adapter->uiSectorSize;
1644                                                 else
1645                                                         WriteBytes = NOB;
1646                                         }
1647
1648
1649                                 }       while(NOB > 0);
1650                                 BcmFlash2xWriteSig(Adapter,sFlash2xWrite.Section);
1651                                 up(&Adapter->NVMRdmWrmLock);
1652                                 kfree(pWriteBuff);
1653                          }
1654                          break ;
1655                 case IOCTL_BCM_GET_FLASH2X_SECTION_BITMAP :
1656                          {
1657
1658                                  PFLASH2X_BITMAP psFlash2xBitMap;
1659                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_GET_FLASH2X_SECTION_BITMAP Called");
1660
1661                                 if (copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1662                                         return -EFAULT;
1663
1664                                 if(IoBuffer.OutputLength != sizeof(FLASH2X_BITMAP))
1665                                         return -EINVAL;
1666
1667                                 psFlash2xBitMap = kzalloc(sizeof(FLASH2X_BITMAP), GFP_KERNEL);
1668                                 if(psFlash2xBitMap == NULL)
1669                                 {
1670                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Memory is not available");
1671                                         return -ENOMEM ;
1672                                 }
1673                                 //Reading the Flash Sectio Bit map
1674                                 down(&Adapter->NVMRdmWrmLock);
1675
1676                                 if((Adapter->IdleMode == TRUE) ||
1677                                         (Adapter->bShutStatus ==TRUE) ||
1678                                         (Adapter->bPreparingForLowPowerMode ==TRUE))
1679                                 {
1680                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1681                                         up(&Adapter->NVMRdmWrmLock);
1682                                         kfree(psFlash2xBitMap);
1683                                         return -EACCES;
1684                                 }
1685
1686                                 BcmGetFlash2xSectionalBitMap(Adapter, psFlash2xBitMap);
1687                                 up(&Adapter->NVMRdmWrmLock);
1688                                 if (copy_to_user(IoBuffer.OutputBuffer, psFlash2xBitMap, sizeof(FLASH2X_BITMAP)))
1689                                         Status = -EFAULT;
1690
1691                                 kfree(psFlash2xBitMap);
1692                          }
1693                          break ;
1694                 case IOCTL_BCM_SET_ACTIVE_SECTION :
1695                          {
1696                                 FLASH2X_SECTION_VAL eFlash2xSectionVal = 0;
1697                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_SET_ACTIVE_SECTION Called");
1698
1699                                 if(IsFlash2x(Adapter) != TRUE)
1700                                 {
1701                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
1702                                         return -EINVAL;
1703                                 }
1704
1705                                 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
1706                                 if(Status)
1707                                 {
1708                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
1709                                         return Status;
1710                                 }
1711
1712                                 Status = copy_from_user(&eFlash2xSectionVal,IoBuffer.InputBuffer, sizeof(INT));
1713                                 if(Status)
1714                                 {
1715                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of flash section val failed");
1716                                         return Status;
1717                                 }
1718
1719                                 down(&Adapter->NVMRdmWrmLock);
1720
1721                                 if((Adapter->IdleMode == TRUE) ||
1722                                         (Adapter->bShutStatus ==TRUE) ||
1723                                         (Adapter->bPreparingForLowPowerMode ==TRUE))
1724                                 {
1725                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1726                                         up(&Adapter->NVMRdmWrmLock);
1727                                         return -EACCES;
1728                                 }
1729
1730                                 Status = BcmSetActiveSection(Adapter,eFlash2xSectionVal);
1731                                 if(Status)
1732                                 {
1733                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Failed to make it's priority Highest. Status %d", Status);
1734                                 }
1735                                 up(&Adapter->NVMRdmWrmLock);
1736                         }
1737                         break ;
1738                 case IOCTL_BCM_IDENTIFY_ACTIVE_SECTION :
1739                          {
1740                                 //Right Now we are taking care of only DSD
1741                                 Adapter->bAllDSDWriteAllow = FALSE ;
1742                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"IOCTL_BCM_IDENTIFY_ACTIVE_SECTION called");
1743
1744                                 Status = STATUS_SUCCESS ;
1745                          }
1746                          break ;
1747                 case IOCTL_BCM_COPY_SECTION :
1748                          {
1749                                 FLASH2X_COPY_SECTION sCopySectStrut = {0};
1750                                 Status = STATUS_SUCCESS;
1751                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_COPY_SECTION  Called");
1752
1753                                 Adapter->bAllDSDWriteAllow = FALSE ;
1754                                 if(IsFlash2x(Adapter) != TRUE)
1755                                 {
1756                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
1757                                         return -EINVAL;
1758                                 }
1759
1760                                 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
1761                                 if(Status)
1762                                 {
1763                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed Status :%d", Status);
1764                                         return Status;
1765                                 }
1766
1767                                 Status = copy_from_user(&sCopySectStrut, IoBuffer.InputBuffer, sizeof(FLASH2X_COPY_SECTION));
1768                                 if(Status)
1769                                 {
1770                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of Copy_Section_Struct failed with Status :%d", Status);
1771                                         return Status;
1772                                 }
1773                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Source SEction :%x", sCopySectStrut.SrcSection);
1774                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Destination SEction :%x", sCopySectStrut.DstSection);
1775                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "offset :%x", sCopySectStrut.offset);
1776                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "NOB :%x", sCopySectStrut.numOfBytes);
1777
1778
1779                                 if(IsSectionExistInFlash(Adapter,sCopySectStrut.SrcSection) == FALSE)
1780                                 {
1781                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Source Section<%x> does not exixt in Flash ", sCopySectStrut.SrcSection);
1782                                         return -EINVAL;
1783                                 }
1784
1785                                 if(IsSectionExistInFlash(Adapter,sCopySectStrut.DstSection) == FALSE)
1786                                 {
1787                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Destinatio Section<%x> does not exixt in Flash ", sCopySectStrut.DstSection);
1788                                         return -EINVAL;
1789                                 }
1790
1791                                 if(sCopySectStrut.SrcSection == sCopySectStrut.DstSection)
1792                                 {
1793                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Source and Destination section should be different");
1794                                         return -EINVAL;
1795                                 }
1796
1797                                 down(&Adapter->NVMRdmWrmLock);
1798
1799                                 if((Adapter->IdleMode == TRUE) ||
1800                                         (Adapter->bShutStatus ==TRUE) ||
1801                                         (Adapter->bPreparingForLowPowerMode ==TRUE))
1802                                 {
1803                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1804                                         up(&Adapter->NVMRdmWrmLock);
1805                                         return -EACCES;
1806                                 }
1807
1808                                 if(sCopySectStrut.SrcSection == ISO_IMAGE1 || sCopySectStrut.SrcSection == ISO_IMAGE2)
1809                                 {
1810                                         if(IsNonCDLessDevice(Adapter))
1811                                         {
1812                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Device is Non-CDLess hence won't have ISO !!");
1813                                                 Status = -EINVAL ;
1814                                         }
1815                                         else if(sCopySectStrut.numOfBytes == 0)
1816                                         {
1817                                                 Status = BcmCopyISO(Adapter,sCopySectStrut);
1818                                         }
1819                                         else
1820                                         {
1821                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Partial Copy of ISO section is not Allowed..");
1822                                                 Status = STATUS_FAILURE ;
1823                                         }
1824                                         up(&Adapter->NVMRdmWrmLock);
1825                                         return Status;
1826                                 }
1827
1828                                 Status = BcmCopySection(Adapter, sCopySectStrut.SrcSection,
1829                                                         sCopySectStrut.DstSection,sCopySectStrut.offset,sCopySectStrut.numOfBytes);
1830                                 up(&Adapter->NVMRdmWrmLock);
1831                          }
1832                          break ;
1833                 case IOCTL_BCM_GET_FLASH_CS_INFO :
1834                          {
1835                                 Status = STATUS_SUCCESS;
1836                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, " IOCTL_BCM_GET_FLASH_CS_INFO Called");
1837
1838                                 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
1839                                 if(Status)
1840                                 {
1841                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
1842                                         break;
1843                                 }
1844                                 if(Adapter->eNVMType != NVM_FLASH)
1845                                 {
1846                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Connected device does not have flash");
1847                                         Status = -EINVAL;
1848                                         break;
1849                                 }
1850                                 if(IsFlash2x(Adapter) == TRUE)
1851                                 {
1852
1853                                         if(IoBuffer.OutputLength < sizeof(FLASH2X_CS_INFO))
1854                                                 return -EINVAL;
1855
1856                                         if (copy_to_user(IoBuffer.OutputBuffer, Adapter->psFlash2xCSInfo, sizeof(FLASH2X_CS_INFO)))
1857                                                 return -EFAULT;
1858                                 }
1859                                 else
1860                                 {
1861                                         if(IoBuffer.OutputLength < sizeof(FLASH_CS_INFO))
1862                                                 return -EINVAL;
1863
1864                                         if (copy_to_user(IoBuffer.OutputBuffer, Adapter->psFlashCSInfo, sizeof(FLASH_CS_INFO)))
1865                                                 return -EFAULT;
1866
1867                                  }
1868                           }
1869                           break ;
1870                 case IOCTL_BCM_SELECT_DSD :
1871                          {
1872                                 UINT SectOfset = 0;
1873                                 FLASH2X_SECTION_VAL eFlash2xSectionVal;
1874                                 eFlash2xSectionVal = NO_SECTION_VAL ;
1875                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, " IOCTL_BCM_SELECT_DSD Called");
1876
1877                                 if(IsFlash2x(Adapter) != TRUE)
1878                                 {
1879                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
1880                                         return -EINVAL;
1881                                 }
1882
1883                                 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
1884                                 if(Status)
1885                                 {
1886                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
1887                                         return Status;
1888                                 }
1889                                 Status = copy_from_user(&eFlash2xSectionVal, IoBuffer.InputBuffer, sizeof(INT));
1890                                 if(Status)
1891                                 {
1892                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of flash section val failed");
1893                                         return Status;
1894                                 }
1895
1896                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Read Section :%d", eFlash2xSectionVal);
1897                                 if((eFlash2xSectionVal != DSD0) &&
1898                                         (eFlash2xSectionVal != DSD1) &&
1899                                         (eFlash2xSectionVal != DSD2) )
1900                                 {
1901                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Passed section<%x> is not DSD section", eFlash2xSectionVal);
1902                                         return STATUS_FAILURE ;
1903                                 }
1904
1905                                 SectOfset= BcmGetSectionValStartOffset(Adapter,eFlash2xSectionVal);
1906                                 if(SectOfset == INVALID_OFFSET)
1907                                 {
1908                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Provided Section val <%d> does not exixt in Flash 2.x", eFlash2xSectionVal);
1909                                         return -EINVAL;
1910                                 }
1911
1912                                 Adapter->bAllDSDWriteAllow = TRUE ;
1913
1914                                 Adapter->ulFlashCalStart = SectOfset ;
1915                                 Adapter->eActiveDSD = eFlash2xSectionVal;
1916                          }
1917                          Status = STATUS_SUCCESS ;
1918                          break;
1919
1920                 case IOCTL_BCM_NVM_RAW_READ :
1921                          {
1922
1923                                  NVM_READWRITE stNVMRead;
1924                                 INT NOB ;
1925                                 INT BuffSize ;
1926                                 INT ReadOffset = 0;
1927                                 UINT ReadBytes = 0 ;
1928                                 PUCHAR pReadBuff;
1929                                 void __user *OutPutBuff;
1930
1931                                 if(Adapter->eNVMType != NVM_FLASH)
1932                                 {
1933                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"NVM TYPE is not Flash ");
1934                                         return -EINVAL ;
1935                                 }
1936
1937                                 /* Copy Ioctl Buffer structure */
1938                                 if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1939                                 {
1940                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copy_from_user 1 failed\n");
1941                                         Status = -EFAULT;
1942                                         break;
1943                                 }
1944
1945                                 if(copy_from_user(&stNVMRead, IoBuffer.OutputBuffer,sizeof(NVM_READWRITE)))
1946                                         return -EFAULT;
1947
1948                                 NOB = stNVMRead.uiNumBytes;
1949                                 //In Raw-Read max Buff size : 64MB
1950
1951                                 if(NOB > DEFAULT_BUFF_SIZE)
1952                                         BuffSize = DEFAULT_BUFF_SIZE;
1953                                 else
1954                                         BuffSize = NOB ;
1955
1956                                 ReadOffset = stNVMRead.uiOffset;
1957                                 OutPutBuff = stNVMRead.pBuffer;
1958
1959                                 pReadBuff = kzalloc(BuffSize , GFP_KERNEL);
1960                                 if(pReadBuff == NULL)
1961                                 {
1962                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Memory allocation failed for Flash 2.x Read Structure");
1963                                         Status = -ENOMEM;
1964                                         break;
1965                                 }
1966                                 down(&Adapter->NVMRdmWrmLock);
1967
1968                                 if((Adapter->IdleMode == TRUE) ||
1969                                         (Adapter->bShutStatus ==TRUE) ||
1970                                         (Adapter->bPreparingForLowPowerMode ==TRUE))
1971                                 {
1972                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1973                                         kfree(pReadBuff);
1974                                         up(&Adapter->NVMRdmWrmLock);
1975                                         return -EACCES;
1976                                 }
1977
1978                                 Adapter->bFlashRawRead = TRUE ;
1979                                 while(NOB)
1980                                 {
1981                                         if(NOB > DEFAULT_BUFF_SIZE )
1982                                                 ReadBytes = DEFAULT_BUFF_SIZE;
1983                                         else
1984                                                 ReadBytes = NOB;
1985
1986                                         //Reading the data from Flash 2.x
1987                                         Status = BeceemNVMRead(Adapter,(PUINT)pReadBuff,ReadOffset,ReadBytes);
1988                                         if(Status)
1989                                         {
1990                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash 2x read err with Status :%d", Status);
1991                                                 break;
1992                                         }
1993
1994                                         BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,pReadBuff,ReadBytes);
1995
1996                                         Status = copy_to_user(OutPutBuff, pReadBuff,ReadBytes);
1997                                         if(Status)
1998                                         {
1999                                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Copy to use failed with status :%d", Status);
2000                                                 break;
2001                                         }
2002                                         NOB = NOB - ReadBytes;
2003                                         if(NOB)
2004                                         {
2005                                                 ReadOffset = ReadOffset + ReadBytes ;
2006                                                 OutPutBuff = OutPutBuff + ReadBytes ;
2007                                         }
2008
2009                                 }
2010                                 Adapter->bFlashRawRead = FALSE ;
2011                                 up(&Adapter->NVMRdmWrmLock);
2012                                 kfree(pReadBuff);
2013                                 break ;
2014                          }
2015
2016                 case IOCTL_BCM_CNTRLMSG_MASK:
2017                          {
2018                                 ULONG RxCntrlMsgBitMask = 0 ;
2019
2020                                 /* Copy Ioctl Buffer structure */
2021                                 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
2022                                 if(Status)
2023                                 {
2024                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"copy of Ioctl buffer is failed from user space");
2025                                         Status = -EFAULT;
2026                                         break;
2027                                 }
2028
2029                                 if (IoBuffer.InputLength != sizeof(unsigned long)) {
2030                                         Status = -EINVAL;
2031                                         break;
2032                                 }
2033
2034                                 Status = copy_from_user(&RxCntrlMsgBitMask, IoBuffer.InputBuffer, IoBuffer.InputLength);
2035                                 if(Status)
2036                                 {
2037                                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"copy of control bit mask failed from user space");
2038                                         Status = -EFAULT;
2039                                         break;
2040                                 }
2041                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\n Got user defined cntrl msg bit mask :%lx", RxCntrlMsgBitMask);
2042                                 pTarang->RxCntrlMsgBitMask = RxCntrlMsgBitMask ;
2043                          }
2044                          break;
2045                         case IOCTL_BCM_GET_DEVICE_DRIVER_INFO:
2046                         {
2047                                 DEVICE_DRIVER_INFO DevInfo;
2048
2049                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Called IOCTL_BCM_GET_DEVICE_DRIVER_INFO\n");
2050
2051                                 DevInfo.MaxRDMBufferSize = BUFFER_4K;
2052                                 DevInfo.u32DSDStartOffset = EEPROM_CALPARAM_START;
2053                                 DevInfo.u32RxAlignmentCorrection = 0;
2054                                 DevInfo.u32NVMType = Adapter->eNVMType;
2055                                 DevInfo.u32InterfaceType = BCM_USB;
2056
2057                                 if (copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
2058                                         return -EFAULT;
2059
2060                                 if(IoBuffer.OutputLength < sizeof(DevInfo))
2061                                         return -EINVAL;
2062
2063                                 if (copy_to_user(IoBuffer.OutputBuffer, &DevInfo, sizeof(DevInfo)))
2064                                         return -EFAULT;
2065                         }
2066                         break ;
2067
2068                         case IOCTL_BCM_TIME_SINCE_NET_ENTRY:
2069                         {
2070                                 ST_TIME_ELAPSED stTimeElapsedSinceNetEntry = {0};
2071
2072                                 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"IOCTL_BCM_TIME_SINCE_NET_ENTRY called");
2073
2074                                 if (copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
2075                                         return -EFAULT;
2076
2077                                 if(IoBuffer.OutputLength < sizeof(ST_TIME_ELAPSED))
2078                                         return -EINVAL;
2079
2080                                 stTimeElapsedSinceNetEntry.ul64TimeElapsedSinceNetEntry = get_seconds() - Adapter->liTimeSinceLastNetEntry;
2081
2082                                 if (copy_to_user(IoBuffer.OutputBuffer, &stTimeElapsedSinceNetEntry, sizeof(ST_TIME_ELAPSED)))
2083                                         return -EFAULT;
2084
2085                         }
2086                         break;
2087
2088                 case IOCTL_CLOSE_NOTIFICATION:
2089                         BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"IOCTL_CLOSE_NOTIFICATION");
2090                         break;
2091
2092                 default:
2093                         pr_info(DRV_NAME ": unknown ioctl cmd=%#x\n", cmd);
2094                         Status = STATUS_FAILURE;
2095                         break;
2096         }
2097         return Status;
2098 }
2099
2100
2101 static const struct file_operations bcm_fops = {
2102         .owner    = THIS_MODULE,
2103         .open     = bcm_char_open,
2104         .release  = bcm_char_release,
2105         .read     = bcm_char_read,
2106         .unlocked_ioctl    = bcm_char_ioctl,
2107         .llseek = no_llseek,
2108 };
2109
2110 extern struct class *bcm_class;
2111
2112 int register_control_device_interface(PMINI_ADAPTER Adapter)
2113 {
2114
2115         if (Adapter->major > 0)
2116                 return Adapter->major;
2117
2118         Adapter->major = register_chrdev(0, DEV_NAME, &bcm_fops);
2119         if (Adapter->major < 0) {
2120                 pr_err(DRV_NAME ": could not created character device\n");
2121                 return Adapter->major;
2122         }
2123
2124         Adapter->pstCreatedClassDevice = device_create(bcm_class, NULL,
2125                                                        MKDEV(Adapter->major, 0),
2126                                                        Adapter, DEV_NAME);
2127
2128         if (IS_ERR(Adapter->pstCreatedClassDevice)) {
2129                 pr_err(DRV_NAME ": class device create failed\n");
2130                 unregister_chrdev(Adapter->major, DEV_NAME);
2131                 return PTR_ERR(Adapter->pstCreatedClassDevice);
2132         }
2133
2134         return 0;
2135 }
2136
2137 void unregister_control_device_interface(PMINI_ADAPTER Adapter)
2138 {
2139         if (Adapter->major > 0) {
2140                 device_destroy(bcm_class, MKDEV(Adapter->major, 0));
2141                 unregister_chrdev(Adapter->major, DEV_NAME);
2142         }
2143 }