4 /***************************************************************
5 * Function - bcm_char_open()
7 * Description - This is the "open" entry point for the character
10 * Parameters - inode: Pointer to the Inode structure of char device
11 * filp : File pointer of the char device
13 * Returns - Zero(Success)
14 ****************************************************************/
15 static struct class *bcm_class = NULL;
16 static int bcm_char_open(struct inode *inode, struct file * filp)
18 PMINI_ADAPTER Adapter = NULL;
19 PPER_TARANG_DATA pTarang = NULL;
21 Adapter = GET_BCM_ADAPTER(gblpnetdev);
22 pTarang = (PPER_TARANG_DATA)kmalloc(sizeof(PER_TARANG_DATA), GFP_KERNEL);
26 memset (pTarang, 0, sizeof(PER_TARANG_DATA));
27 pTarang->Adapter = Adapter;
28 pTarang->RxCntrlMsgBitMask = 0xFFFFFFFF & ~(1 << 0xB) ;
30 down(&Adapter->RxAppControlQueuelock);
31 pTarang->next = Adapter->pTarangs;
32 Adapter->pTarangs = pTarang;
33 up(&Adapter->RxAppControlQueuelock);
35 /* Store the Adapter structure */
36 filp->private_data = pTarang;
38 /*Start Queuing the control response Packets*/
39 atomic_inc(&Adapter->ApplicationRunning);
41 nonseekable_open(inode, filp);
44 static int bcm_char_release(struct inode *inode, struct file *filp)
46 PPER_TARANG_DATA pTarang, tmp, ptmp;
47 PMINI_ADAPTER Adapter=NULL;
48 struct sk_buff * pkt, * npkt;
50 pTarang = (PPER_TARANG_DATA)filp->private_data;
54 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "ptarang is null\n");
58 Adapter = pTarang->Adapter;
60 down( &Adapter->RxAppControlQueuelock);
62 tmp = Adapter->pTarangs;
63 for ( ptmp = NULL; tmp; ptmp = tmp, tmp = tmp->next )
72 Adapter->pTarangs = tmp->next;
74 ptmp->next = tmp->next;
79 up( &Adapter->RxAppControlQueuelock);
83 pkt = pTarang->RxAppControlHead;
91 up( &Adapter->RxAppControlQueuelock);
93 /*Stop Queuing the control response Packets*/
94 atomic_dec(&Adapter->ApplicationRunning);
98 /* remove this filp from the asynchronously notified filp's */
99 filp->private_data = NULL;
103 static ssize_t bcm_char_read(struct file *filp, char __user *buf, size_t size, loff_t *f_pos)
105 PPER_TARANG_DATA pTarang = (PPER_TARANG_DATA)filp->private_data;
106 PMINI_ADAPTER Adapter = pTarang->Adapter;
107 struct sk_buff* Packet = NULL;
111 wait_ret_val = wait_event_interruptible(Adapter->process_read_wait_queue,
112 (pTarang->RxAppControlHead || Adapter->device_removed));
113 if((wait_ret_val == -ERESTARTSYS))
115 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Exiting as i've been asked to exit!!!\n");
119 if(Adapter->device_removed)
121 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Device Removed... Killing the Apps...\n");
125 if(FALSE == Adapter->fw_download_done)
128 down( &Adapter->RxAppControlQueuelock);
130 if(pTarang->RxAppControlHead)
132 Packet = pTarang->RxAppControlHead;
133 DEQUEUEPACKET(pTarang->RxAppControlHead,pTarang->RxAppControlTail);
134 pTarang->AppCtrlQueueLen--;
137 up(&Adapter->RxAppControlQueuelock);
141 PktLen = Packet->len;
142 if(copy_to_user(buf, Packet->data, PktLen))
144 bcm_kfree_skb(Packet);
145 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "\nReturning from copy to user failure \n");
148 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Read %d Bytes From Adapter packet = 0x%p by process %d!\n", PktLen, Packet, current->pid);
149 bcm_kfree_skb(Packet);
152 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "<====\n");
156 static long bcm_char_ioctl(struct file *filp, UINT cmd, ULONG arg)
158 PPER_TARANG_DATA pTarang = (PPER_TARANG_DATA)filp->private_data;
159 void __user *argp = (void __user *)argp;
160 PMINI_ADAPTER Adapter = pTarang->Adapter;
161 INT Status = STATUS_FAILURE;
162 IOCTL_BUFFER IoBuffer={};
163 #ifndef BCM_SHM_INTERFACE
168 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);
170 if(_IOC_TYPE(cmd) != BCM_IOCTL)
172 if(_IOC_DIR(cmd) & _IOC_READ)
173 Status = !access_ok(VERIFY_WRITE, argp, _IOC_SIZE(cmd));
174 else if (_IOC_DIR(cmd) & _IOC_WRITE)
175 Status = !access_ok(VERIFY_READ, argp, _IOC_SIZE(cmd));
176 else if (_IOC_NONE == (_IOC_DIR(cmd) & _IOC_NONE))
177 Status = STATUS_SUCCESS;
182 if(Adapter->device_removed)
187 if(FALSE == Adapter->fw_download_done)
191 case IOCTL_MAC_ADDR_REQ:
193 case IOCTL_CM_REQUEST:
194 case IOCTL_SS_INFO_REQ:
195 case IOCTL_SEND_CONTROL_MESSAGE:
197 case IOCTL_BCM_GPIO_SET_REQUEST:
198 case IOCTL_BCM_GPIO_STATUS_REQUEST:
205 Status = vendorextnIoctl(Adapter, cmd, arg);
206 if(Status != CONTINUE_COMMON_PATH )
212 // Rdms for Swin Idle...
213 case IOCTL_BCM_REGISTER_READ_PRIVATE:
215 RDM_BUFFER sRdmBuffer = {0};
216 PCHAR temp_buff = NULL;
218 /* Copy Ioctl Buffer structure */
219 if(copy_from_user((PCHAR)&IoBuffer, argp,
220 sizeof(IOCTL_BUFFER)))
226 Bufflen = IoBuffer.OutputLength + (4 - IoBuffer.OutputLength%4)%4;
227 temp_buff = (PCHAR)kmalloc(Bufflen, GFP_KERNEL);
230 return STATUS_FAILURE;
232 if(copy_from_user(&sRdmBuffer, IoBuffer.InputBuffer,
233 IoBuffer.InputLength))
238 Status = rdmalt(Adapter, (UINT)sRdmBuffer.Register,
239 (PUINT)temp_buff, Bufflen);
240 if(Status != STATUS_SUCCESS)
242 bcm_kfree(temp_buff);
245 if(copy_to_user(IoBuffer.OutputBuffer,
246 (PCHAR)temp_buff, (UINT)IoBuffer.OutputLength))
250 bcm_kfree(temp_buff);
253 case IOCTL_BCM_REGISTER_WRITE_PRIVATE:
255 WRM_BUFFER sWrmBuffer = {0};
257 /* Copy Ioctl Buffer structure */
259 if(copy_from_user(&IoBuffer, argp,
260 sizeof(IOCTL_BUFFER)))
265 /* Get WrmBuffer structure */
266 if(copy_from_user(&sWrmBuffer, IoBuffer.InputBuffer,
267 IoBuffer.InputLength))
272 uiTempVar = sWrmBuffer.Register & EEPROM_REJECT_MASK;
273 if(!((Adapter->pstargetparams->m_u32Customize) & VSG_MODE) &&
274 ((uiTempVar == EEPROM_REJECT_REG_1)||
275 (uiTempVar == EEPROM_REJECT_REG_2) ||
276 (uiTempVar == EEPROM_REJECT_REG_3) ||
277 (uiTempVar == EEPROM_REJECT_REG_4)))
279 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "EEPROM Access Denied, not in VSG Mode\n");
283 Status = wrmalt(Adapter, (UINT)sWrmBuffer.Register,
284 (PUINT)sWrmBuffer.Data, sizeof(ULONG));
285 if(Status == STATUS_SUCCESS)
287 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"WRM Done\n");
291 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "WRM Failed\n");
297 case IOCTL_BCM_REGISTER_READ:
298 case IOCTL_BCM_EEPROM_REGISTER_READ:
300 RDM_BUFFER sRdmBuffer = {0};
301 PCHAR temp_buff = NULL;
303 if((Adapter->IdleMode == TRUE) ||
304 (Adapter->bShutStatus ==TRUE) ||
305 (Adapter->bPreparingForLowPowerMode ==TRUE))
307 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Device in Idle Mode, Blocking Rdms\n");
311 /* Copy Ioctl Buffer structure */
312 if(copy_from_user(&IoBuffer, argp,
313 sizeof(IOCTL_BUFFER)))
319 temp_buff = (PCHAR)kmalloc(IoBuffer.OutputLength, GFP_KERNEL);
322 return STATUS_FAILURE;
324 if(copy_from_user(&sRdmBuffer, IoBuffer.InputBuffer,
325 IoBuffer.InputLength))
332 #if !defined(BCM_SHM_INTERFACE)
333 (((ULONG)sRdmBuffer.Register & 0x0F000000) != 0x0F000000) ||
335 ((ULONG)sRdmBuffer.Register & 0x3)
338 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "RDM Done On invalid Address : %x Access Denied.\n",
339 (int)sRdmBuffer.Register);
344 uiTempVar = sRdmBuffer.Register & EEPROM_REJECT_MASK;
345 Status = rdmaltWithLock(Adapter, (UINT)sRdmBuffer.Register,
346 (PUINT)temp_buff, IoBuffer.OutputLength);
347 if(Status != STATUS_SUCCESS)
349 bcm_kfree(temp_buff);
352 if(copy_to_user(IoBuffer.OutputBuffer,
353 (PCHAR)temp_buff, (UINT)IoBuffer.OutputLength))
357 bcm_kfree(temp_buff);
360 case IOCTL_BCM_REGISTER_WRITE:
361 case IOCTL_BCM_EEPROM_REGISTER_WRITE:
363 WRM_BUFFER sWrmBuffer = {0};
365 if((Adapter->IdleMode == TRUE) ||
366 (Adapter->bShutStatus ==TRUE) ||
367 (Adapter->bPreparingForLowPowerMode ==TRUE))
369 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Device in Idle Mode, Blocking Wrms\n");
373 /* Copy Ioctl Buffer structure */
374 if(copy_from_user((PCHAR)&IoBuffer, argp,
375 sizeof(IOCTL_BUFFER)))
380 /* Get WrmBuffer structure */
381 if(copy_from_user(&sWrmBuffer, IoBuffer.InputBuffer,
382 IoBuffer.InputLength))
388 #if !defined(BCM_SHM_INTERFACE)
390 (((ULONG)sWrmBuffer.Register & 0x0F000000) != 0x0F000000) ||
392 ((ULONG)sWrmBuffer.Register & 0x3)
395 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "WRM Done On invalid Address : %x Access Denied.\n",
396 (int)sWrmBuffer.Register);
400 uiTempVar = sWrmBuffer.Register & EEPROM_REJECT_MASK;
401 if(!((Adapter->pstargetparams->m_u32Customize) & VSG_MODE) &&
402 ((uiTempVar == EEPROM_REJECT_REG_1)||
403 (uiTempVar == EEPROM_REJECT_REG_2) ||
404 (uiTempVar == EEPROM_REJECT_REG_3) ||
405 (uiTempVar == EEPROM_REJECT_REG_4)) &&
406 (cmd == IOCTL_BCM_REGISTER_WRITE))
408 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "EEPROM Access Denied, not in VSG Mode\n");
413 Status = wrmaltWithLock(Adapter, (UINT)sWrmBuffer.Register,
414 (PUINT)sWrmBuffer.Data, sWrmBuffer.Length);
415 if(Status == STATUS_SUCCESS)
417 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, OSAL_DBG, DBG_LVL_ALL, "WRM Done\n");
421 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "WRM Failed\n");
426 case IOCTL_BCM_GPIO_SET_REQUEST:
428 UCHAR ucResetValue[4];
431 UINT uiOperation = 0;
433 GPIO_INFO gpio_info = {0};
434 if((Adapter->IdleMode == TRUE) ||
435 (Adapter->bShutStatus ==TRUE) ||
436 (Adapter->bPreparingForLowPowerMode ==TRUE))
438 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"GPIO Can't be set/clear in Low power Mode");
442 if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
447 if(copy_from_user(&gpio_info, IoBuffer.InputBuffer, IoBuffer.InputLength))
452 uiBit = gpio_info.uiGpioNumber;
453 uiOperation = gpio_info.uiGpioValue;
457 if(IsReqGpioIsLedInNVM(Adapter,value) ==FALSE)
459 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Sorry, Requested GPIO<0x%X> is not correspond to LED !!!",value);
465 if(uiOperation)//Set - setting 1
467 //Set the gpio output register
468 Status = wrmaltWithLock(Adapter,BCM_GPIO_OUTPUT_SET_REG ,
469 (PUINT)(&value), sizeof(UINT));
470 if(Status == STATUS_SUCCESS)
472 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Set the GPIO bit\n");
476 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Failed to set the %dth GPIO \n",uiBit);
480 else//Unset - setting 0
482 //Set the gpio output register
483 Status = wrmaltWithLock(Adapter,BCM_GPIO_OUTPUT_CLR_REG ,
484 (PUINT)(&value), sizeof(UINT));
485 if(Status == STATUS_SUCCESS)
487 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Set the GPIO bit\n");
491 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Failed to clear the %dth GPIO \n",uiBit);
496 Status = rdmaltWithLock(Adapter, (UINT)GPIO_MODE_REGISTER,
497 (PUINT)ucResetValue, sizeof(UINT));
498 if (STATUS_SUCCESS != Status)
500 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"GPIO_MODE_REGISTER read failed");
503 //Set the gpio mode register to output
504 *(UINT*)ucResetValue |= (1<<uiBit);
505 Status = wrmaltWithLock(Adapter,GPIO_MODE_REGISTER ,
506 (PUINT)ucResetValue, sizeof(UINT));
507 if(Status == STATUS_SUCCESS)
509 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Set the GPIO to output Mode\n");
513 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Failed to put GPIO in Output Mode\n");
518 case BCM_LED_THREAD_STATE_CHANGE_REQ:
521 USER_THREAD_REQ threadReq = {0};
522 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"User made LED thread InActive");
524 if((Adapter->IdleMode == TRUE) ||
525 (Adapter->bShutStatus ==TRUE) ||
526 (Adapter->bPreparingForLowPowerMode ==TRUE))
528 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"GPIO Can't be set/clear in Low power Mode");
532 Status =copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
535 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Failed while copying the IOBufer from user space err:%d",Status);
539 Status= copy_from_user(&threadReq, IoBuffer.InputBuffer, IoBuffer.InputLength);
542 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Failed while copying the InputBuffer from user space err:%d",Status);
545 //if LED thread is running(Actively or Inactively) set it state to make inactive
546 if(Adapter->LEDInfo.led_thread_running)
548 if(threadReq.ThreadState == LED_THREAD_ACTIVATION_REQ)
550 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Activating thread req");
551 Adapter->DriverState = LED_THREAD_ACTIVE;
555 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"DeActivating Thread req.....");
556 Adapter->DriverState = LED_THREAD_INACTIVE;
560 wake_up(&Adapter->LEDInfo.notify_led_event);
565 case IOCTL_BCM_GPIO_STATUS_REQUEST:
569 GPIO_INFO gpio_info = {0};
570 if((Adapter->IdleMode == TRUE) ||
571 (Adapter->bShutStatus ==TRUE) ||
572 (Adapter->bPreparingForLowPowerMode ==TRUE))
577 if(copy_from_user((PCHAR)&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
582 if(copy_from_user(&gpio_info, IoBuffer.InputBuffer, IoBuffer.InputLength))
587 uiBit = gpio_info.uiGpioNumber;
588 //Set the gpio output register
589 Status = rdmaltWithLock(Adapter, (UINT)GPIO_PIN_STATE_REGISTER,
590 (PUINT)ucRead, sizeof(UINT));
591 if(Status != STATUS_SUCCESS)
593 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "RDM Failed\n");
599 case IOCTL_BCM_GPIO_MULTI_REQUEST:
601 UCHAR ucResetValue[4];
602 GPIO_MULTI_INFO gpio_multi_info[MAX_IDX];
603 PGPIO_MULTI_INFO pgpio_multi_info = (PGPIO_MULTI_INFO)gpio_multi_info;
605 memset( pgpio_multi_info, 0, MAX_IDX * sizeof( GPIO_MULTI_INFO));
607 if((Adapter->IdleMode == TRUE) ||
608 (Adapter->bShutStatus ==TRUE) ||
609 (Adapter->bPreparingForLowPowerMode ==TRUE))
614 Status = copy_from_user( (PCHAR)&IoBuffer, argp, sizeof( IOCTL_BUFFER));
617 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Failed while copying the IOBufer from user space err:%d",Status);
621 Status = copy_from_user( &gpio_multi_info, IoBuffer.InputBuffer, IoBuffer.InputLength);
624 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Failed while copying the IOBufer Contents from user space err:%d",Status);
627 if(IsReqGpioIsLedInNVM(Adapter,pgpio_multi_info[WIMAX_IDX].uiGPIOMask)== FALSE)
629 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);
634 /* Set the gpio output register */
636 if( ( pgpio_multi_info[WIMAX_IDX].uiGPIOMask) &
637 ( pgpio_multi_info[WIMAX_IDX].uiGPIOCommand))
639 /* Set 1's in GPIO OUTPUT REGISTER */
640 *(UINT*) ucResetValue = pgpio_multi_info[WIMAX_IDX].uiGPIOMask &
641 pgpio_multi_info[WIMAX_IDX].uiGPIOCommand &
642 pgpio_multi_info[WIMAX_IDX].uiGPIOValue;
644 if( *(UINT*) ucResetValue)
645 Status = wrmaltWithLock( Adapter, BCM_GPIO_OUTPUT_SET_REG , (PUINT) ucResetValue, sizeof(ULONG));
647 if( Status != STATUS_SUCCESS)
649 BCM_DEBUG_PRINT( Adapter,DBG_TYPE_PRINTK, 0, 0,"WRM to BCM_GPIO_OUTPUT_SET_REG Failed.");
653 /* Clear to 0's in GPIO OUTPUT REGISTER */
654 *(UINT*) ucResetValue = (pgpio_multi_info[WIMAX_IDX].uiGPIOMask &
655 pgpio_multi_info[WIMAX_IDX].uiGPIOCommand &
656 ( ~( pgpio_multi_info[WIMAX_IDX].uiGPIOValue)));
658 if( *(UINT*) ucResetValue)
659 Status = wrmaltWithLock( Adapter, BCM_GPIO_OUTPUT_CLR_REG , (PUINT) ucResetValue, sizeof(ULONG));
661 if( Status != STATUS_SUCCESS)
663 BCM_DEBUG_PRINT( Adapter,DBG_TYPE_PRINTK, 0, 0,"WRM to BCM_GPIO_OUTPUT_CLR_REG Failed." );
668 if( pgpio_multi_info[WIMAX_IDX].uiGPIOMask)
670 Status = rdmaltWithLock(Adapter, (UINT)GPIO_PIN_STATE_REGISTER, (PUINT)ucResetValue, sizeof(UINT));
672 if(Status != STATUS_SUCCESS)
674 BCM_DEBUG_PRINT( Adapter,DBG_TYPE_PRINTK, 0, 0,"RDM to GPIO_PIN_STATE_REGISTER Failed.");
678 pgpio_multi_info[WIMAX_IDX].uiGPIOValue = ( *(UINT*)ucResetValue &
679 pgpio_multi_info[WIMAX_IDX].uiGPIOMask);
682 Status = copy_to_user(IoBuffer.OutputBuffer, &gpio_multi_info, IoBuffer.OutputLength);
685 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Failed while copying Content to IOBufer for user space err:%d",Status);
690 case IOCTL_BCM_GPIO_MODE_REQUEST:
692 UCHAR ucResetValue[4];
693 GPIO_MULTI_MODE gpio_multi_mode[MAX_IDX];
694 PGPIO_MULTI_MODE pgpio_multi_mode = ( PGPIO_MULTI_MODE) gpio_multi_mode;
696 if((Adapter->IdleMode == TRUE) ||
697 (Adapter->bShutStatus ==TRUE) ||
698 (Adapter->bPreparingForLowPowerMode ==TRUE))
703 Status = copy_from_user(&IoBuffer, argp, sizeof( IOCTL_BUFFER));
706 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Failed while copying the IOBufer from user space err:%d",Status);
710 Status = copy_from_user( &gpio_multi_mode, IoBuffer.InputBuffer, IoBuffer.InputLength);
713 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Failed while copying the IOBufer Contents from user space err:%d",Status);
717 Status = rdmaltWithLock( Adapter, ( UINT) GPIO_MODE_REGISTER, ( PUINT) ucResetValue, sizeof( UINT));
718 if( STATUS_SUCCESS != Status)
720 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Read of GPIO_MODE_REGISTER failed");
724 //Validating the request
725 if(IsReqGpioIsLedInNVM(Adapter,pgpio_multi_mode[WIMAX_IDX].uiGPIOMask)== FALSE)
727 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);
732 if( pgpio_multi_mode[WIMAX_IDX].uiGPIOMask)
734 /* write all OUT's (1's) */
735 *( UINT*) ucResetValue |= ( pgpio_multi_mode[WIMAX_IDX].uiGPIOMode &
736 pgpio_multi_mode[WIMAX_IDX].uiGPIOMask);
737 /* write all IN's (0's) */
738 *( UINT*) ucResetValue &= ~( ( ~pgpio_multi_mode[WIMAX_IDX].uiGPIOMode) &
739 pgpio_multi_mode[WIMAX_IDX].uiGPIOMask);
741 /* Currently implemented return the modes of all GPIO's
742 * else needs to bit AND with mask
744 pgpio_multi_mode[WIMAX_IDX].uiGPIOMode = *(UINT*)ucResetValue;
746 Status = wrmaltWithLock( Adapter, GPIO_MODE_REGISTER , ( PUINT) ucResetValue, sizeof( ULONG));
747 if( Status == STATUS_SUCCESS)
749 BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "WRM to GPIO_MODE_REGISTER Done");
753 BCM_DEBUG_PRINT( Adapter,DBG_TYPE_PRINTK, 0, 0,"WRM to GPIO_MODE_REGISTER Failed");
758 else /* if uiGPIOMask is 0 then return mode register configuration */
760 pgpio_multi_mode[WIMAX_IDX].uiGPIOMode = *( UINT*) ucResetValue;
762 Status = copy_to_user(IoBuffer.OutputBuffer, &gpio_multi_mode, IoBuffer.OutputLength);
765 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Failed while copying Content to IOBufer for user space err:%d",Status);
771 case IOCTL_MAC_ADDR_REQ:
773 case IOCTL_CM_REQUEST:
774 case IOCTL_SS_INFO_REQ:
775 case IOCTL_SEND_CONTROL_MESSAGE:
779 /* Copy Ioctl Buffer structure */
780 if(copy_from_user(&IoBuffer, argp,
781 sizeof(IOCTL_BUFFER)))
786 pvBuffer=kmalloc(IoBuffer.InputLength, GFP_KERNEL);
792 if(copy_from_user(pvBuffer, IoBuffer.InputBuffer,
793 IoBuffer.InputLength))
800 down(&Adapter->LowPowerModeSync);
801 Status = wait_event_interruptible_timeout(Adapter->lowpower_mode_wait_queue,
802 !Adapter->bPreparingForLowPowerMode,
804 if(Status == -ERESTARTSYS)
807 if(Adapter->bPreparingForLowPowerMode)
809 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Preparing Idle Mode is still True - Hence Rejecting control message\n");
810 Status = STATUS_FAILURE ;
813 Status = CopyBufferToControlPacket(Adapter, (PVOID)pvBuffer);
815 up(&Adapter->LowPowerModeSync);
819 #ifndef BCM_SHM_INTERFACE
820 case IOCTL_BCM_BUFFER_DOWNLOAD_START:
822 INT NVMAccess = down_trylock(&Adapter->NVMRdmWrmLock) ;
825 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");
828 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Starting the firmware download PID =0x%x!!!!\n", current->pid);
829 if(!down_trylock(&Adapter->fw_download_sema))
831 Adapter->bBinDownloaded=FALSE;
832 Adapter->fw_download_process_pid=current->pid;
833 Adapter->bCfgDownloaded=FALSE;
834 Adapter->fw_download_done=FALSE;
835 netif_carrier_off(Adapter->dev);
836 netif_stop_queue(Adapter->dev);
837 Status = reset_card_proc(Adapter);
840 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "reset_card_proc Failed!\n");
841 up(&Adapter->fw_download_sema);
842 up(&Adapter->NVMRdmWrmLock);
853 up(&Adapter->NVMRdmWrmLock);
856 case IOCTL_BCM_BUFFER_DOWNLOAD:
858 FIRMWARE_INFO *psFwInfo=NULL;
859 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Starting the firmware download PID =0x%x!!!!\n", current->pid);
861 if(!down_trylock(&Adapter->fw_download_sema))
863 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Invalid way to download buffer. Use Start and then call this!!!\n");
867 /* Copy Ioctl Buffer structure */
868 if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
870 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copy_from_user 1 failed\n");
874 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Length for FW DLD is : %lx\n",
875 IoBuffer.InputLength);
876 psFwInfo=kmalloc(sizeof(*psFwInfo), GFP_KERNEL);
879 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Failed to allocate buffer!!!!\n");
883 if(copy_from_user(psFwInfo, IoBuffer.InputBuffer,
884 IoBuffer.InputLength))
886 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy_from_user 2 failed\n");
891 if(!psFwInfo->pvMappedFirmwareAddress ||
892 (psFwInfo->u32FirmwareLength == 0))
894 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Something else is wrong %lu\n",
895 psFwInfo->u32FirmwareLength);
899 Status = bcm_ioctl_fw_download(Adapter, psFwInfo);
900 if(Status != STATUS_SUCCESS)
902 if(psFwInfo->u32StartingAddress==CONFIG_BEGIN_ADDR)
904 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "IOCTL: Configuration File Upload Failed\n");
908 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "IOCTL: Firmware File Upload Failed\n");
910 //up(&Adapter->fw_download_sema);
912 if(Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY)
914 Adapter->DriverState = DRIVER_INIT;
915 Adapter->LEDInfo.bLedInitDone = FALSE;
916 wake_up(&Adapter->LEDInfo.notify_led_event);
922 if(Status != STATUS_SUCCESS)
923 up(&Adapter->fw_download_sema);
924 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, OSAL_DBG, DBG_LVL_ALL, "IOCTL: Firmware File Uploaded\n");
928 case IOCTL_BCM_BUFFER_DOWNLOAD_STOP:
930 INT NVMAccess = down_trylock(&Adapter->NVMRdmWrmLock);
933 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, " FW download blocked as EEPROM Read/Write is in progress\n");
934 up(&Adapter->fw_download_sema);
937 if(down_trylock(&Adapter->fw_download_sema))
939 Adapter->bBinDownloaded=TRUE;
940 Adapter->bCfgDownloaded=TRUE;
941 atomic_set(&Adapter->CurrNumFreeTxDesc, 0);
942 atomic_set(&Adapter->RxRollOverCount, 0);
943 Adapter->CurrNumRecvDescs=0;
944 Adapter->downloadDDR = 0;
946 //setting the Mips to Run
947 Status = run_card_proc(Adapter);
950 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Firm Download Failed\n");
951 up(&Adapter->fw_download_sema);
952 up(&Adapter->NVMRdmWrmLock);
956 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Firm Download Over...\n");
958 /* Wait for MailBox Interrupt */
959 if(StartInterruptUrb((PS_INTERFACE_ADAPTER)Adapter->pvInterfaceAdapter))
961 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Unable to send interrupt...\n");
964 Adapter->waiting_to_fw_download_done = FALSE;
965 wait_event_timeout(Adapter->ioctl_fw_dnld_wait_queue,
966 Adapter->waiting_to_fw_download_done, timeout);
967 Adapter->fw_download_process_pid=INVALID_PID;
968 Adapter->fw_download_done=TRUE;
969 atomic_set(&Adapter->CurrNumFreeTxDesc, 0);
970 Adapter->CurrNumRecvDescs = 0;
971 Adapter->PrevNumRecvDescs = 0;
972 atomic_set(&Adapter->cntrlpktCnt,0);
973 Adapter->LinkUpStatus = 0;
974 Adapter->LinkStatus = 0;
976 if(Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY)
978 Adapter->DriverState = FW_DOWNLOAD_DONE;
979 wake_up(&Adapter->LEDInfo.notify_led_event);
991 up(&Adapter->fw_download_sema);
992 up(&Adapter->NVMRdmWrmLock);
996 case IOCTL_BE_BUCKET_SIZE:
997 Adapter->BEBucketSize = *(PULONG)arg;
998 Status = STATUS_SUCCESS;
1001 case IOCTL_RTPS_BUCKET_SIZE:
1002 Adapter->rtPSBucketSize = *(PULONG)arg;
1003 Status = STATUS_SUCCESS;
1005 case IOCTL_CHIP_RESET:
1007 INT NVMAccess = down_trylock(&Adapter->NVMRdmWrmLock);
1010 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, " IOCTL_BCM_CHIP_RESET not allowed as EEPROM Read/Write is in progress\n");
1013 down(&Adapter->RxAppControlQueuelock);
1014 Status = reset_card_proc(Adapter);
1016 up(&Adapter->RxAppControlQueuelock);
1017 up(&Adapter->NVMRdmWrmLock);
1018 ResetCounters(Adapter);
1021 case IOCTL_QOS_THRESHOLD:
1024 for(uiLoopIndex = 0 ; uiLoopIndex < NO_OF_QUEUES ; uiLoopIndex++)
1026 Adapter->PackInfo[uiLoopIndex].uiThreshold = *(PULONG)arg;
1028 Status = STATUS_SUCCESS;
1032 case IOCTL_DUMP_PACKET_INFO:
1034 DumpPackInfo(Adapter);
1035 DumpPhsRules(&Adapter->stBCMPhsContext);
1036 Status = STATUS_SUCCESS;
1039 case IOCTL_GET_PACK_INFO:
1040 if(copy_to_user(argp, &Adapter->PackInfo,
1041 sizeof(PacketInfo)*NO_OF_QUEUES))
1046 Status = STATUS_SUCCESS;
1048 case IOCTL_BCM_SWITCH_TRANSFER_MODE:
1051 if(copy_from_user(&uiData, argp, sizeof(UINT)))
1056 if(uiData) /* Allow All Packets */
1058 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_SWITCH_TRANSFER_MODE: ETH_PACKET_TUNNELING_MODE\n");
1059 Adapter->TransferMode = ETH_PACKET_TUNNELING_MODE;
1061 else /* Allow IP only Packets */
1063 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_SWITCH_TRANSFER_MODE: IP_PACKET_ONLY_MODE\n");
1064 Adapter->TransferMode = IP_PACKET_ONLY_MODE;
1066 Status = STATUS_SUCCESS;
1070 case IOCTL_BCM_GET_DRIVER_VERSION:
1072 /* Copy Ioctl Buffer structure */
1073 if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1078 if(copy_to_user(IoBuffer.OutputBuffer,
1079 VER_FILEVERSION_STR, (UINT)IoBuffer.OutputLength))
1084 Status = STATUS_SUCCESS;
1087 case IOCTL_BCM_GET_CURRENT_STATUS:
1089 LINK_STATE *plink_state = NULL;
1090 /* Copy Ioctl Buffer structure */
1091 if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1093 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copy_from_user failed..\n");
1097 plink_state = (LINK_STATE*)arg;
1098 plink_state->bIdleMode = (UCHAR)Adapter->IdleMode;
1099 plink_state->bShutdownMode = Adapter->bShutStatus;
1100 plink_state->ucLinkStatus = (UCHAR)Adapter->LinkStatus;
1101 if(copy_to_user(IoBuffer.OutputBuffer,
1102 (PUCHAR)plink_state, (UINT)IoBuffer.OutputLength))
1104 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy_to_user Failed..\n");
1108 Status = STATUS_SUCCESS;
1111 case IOCTL_BCM_SET_MAC_TRACING:
1114 /* copy ioctl Buffer structure */
1115 if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1120 if(copy_from_user(&tracing_flag, IoBuffer.InputBuffer,sizeof(UINT)))
1126 Adapter->pTarangs->MacTracingEnabled = TRUE;
1128 Adapter->pTarangs->MacTracingEnabled = FALSE;
1131 case IOCTL_BCM_GET_DSX_INDICATION:
1134 if(copy_from_user((PCHAR)&IoBuffer, argp,
1135 sizeof(IOCTL_BUFFER)))
1137 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Invalid IO buffer!!!" );
1141 if(IoBuffer.OutputLength < sizeof(stLocalSFAddIndicationAlt))
1143 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Mismatch req: %lx needed is =0x%zx!!!",
1144 IoBuffer.OutputLength, sizeof(stLocalSFAddIndicationAlt));
1147 if(copy_from_user(&ulSFId, IoBuffer.InputBuffer,
1150 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Invalid SFID!!! %lu", ulSFId );
1154 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Get DSX Data SF ID is =%lx\n", ulSFId );
1155 get_dsx_sf_data_to_application(Adapter, ulSFId,
1156 IoBuffer.OutputBuffer);
1157 Status=STATUS_SUCCESS;
1160 case IOCTL_BCM_GET_HOST_MIBS:
1164 if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1166 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy_from user for IoBuff failed\n");
1171 if(IoBuffer.OutputLength != sizeof(S_MIBS_HOST_STATS_MIBS))
1173 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Length Check failed %lu %zd\n", IoBuffer.OutputLength,
1174 sizeof(S_MIBS_HOST_STATS_MIBS));
1178 temp_buff = (PCHAR)kmalloc(IoBuffer.OutputLength, GFP_KERNEL);
1182 return STATUS_FAILURE;
1185 Status = ProcessGetHostMibs(Adapter,
1186 (PUCHAR)temp_buff, IoBuffer.OutputLength);
1188 Status = GetDroppedAppCntrlPktMibs((PVOID)temp_buff,
1189 (PPER_TARANG_DATA)filp->private_data);
1191 if(copy_to_user(IoBuffer.OutputBuffer,(PCHAR)temp_buff,
1192 sizeof(S_MIBS_HOST_STATS_MIBS)))
1194 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy to user failed\n");
1195 bcm_kfree(temp_buff);
1199 bcm_kfree(temp_buff);
1203 case IOCTL_BCM_WAKE_UP_DEVICE_FROM_IDLE:
1204 if((FALSE == Adapter->bTriedToWakeUpFromlowPowerMode) && (TRUE==Adapter->IdleMode))
1206 Adapter->usIdleModePattern = ABORT_IDLE_MODE;
1207 Adapter->bWakeUpDevice = TRUE;
1208 wake_up(&Adapter->process_rx_cntrlpkt);
1210 Adapter->bTriedToWakeUpFromlowPowerMode = TRUE;
1211 InterfaceAbortIdlemode (Adapter, Adapter->usIdleModePattern);
1214 Status = STATUS_SUCCESS;
1217 case IOCTL_BCM_BULK_WRM:
1219 PBULKWRM_BUFFER pBulkBuffer;
1221 PCHAR pvBuffer = NULL;
1223 if((Adapter->IdleMode == TRUE) ||
1224 (Adapter->bShutStatus ==TRUE) ||
1225 (Adapter->bPreparingForLowPowerMode ==TRUE))
1227 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "Device in Idle/Shutdown Mode, Blocking Wrms\n");
1231 /* Copy Ioctl Buffer structure */
1232 if(copy_from_user((PCHAR)&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1238 pvBuffer=kmalloc(IoBuffer.InputLength, GFP_KERNEL);
1245 /* Get WrmBuffer structure */
1246 if(copy_from_user(pvBuffer, IoBuffer.InputBuffer, IoBuffer.InputLength))
1248 bcm_kfree(pvBuffer);
1253 pBulkBuffer = (PBULKWRM_BUFFER)pvBuffer;
1255 if(((ULONG)pBulkBuffer->Register & 0x0F000000) != 0x0F000000 ||
1256 ((ULONG)pBulkBuffer->Register & 0x3))
1258 bcm_kfree(pvBuffer);
1259 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0,"WRM Done On invalid Address : %x Access Denied.\n",(int)pBulkBuffer->Register);
1265 uiTempVar = pBulkBuffer->Register & EEPROM_REJECT_MASK;
1266 if(!((Adapter->pstargetparams->m_u32Customize)&VSG_MODE)
1267 && ((uiTempVar == EEPROM_REJECT_REG_1)||
1268 (uiTempVar == EEPROM_REJECT_REG_2) ||
1269 (uiTempVar == EEPROM_REJECT_REG_3) ||
1270 (uiTempVar == EEPROM_REJECT_REG_4)) &&
1271 (cmd == IOCTL_BCM_REGISTER_WRITE))
1273 bcm_kfree(pvBuffer);
1274 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0,"EEPROM Access Denied, not in VSG Mode\n");
1279 if(pBulkBuffer->SwapEndian == FALSE)
1280 Status = wrmWithLock(Adapter, (UINT)pBulkBuffer->Register, (PCHAR)pBulkBuffer->Values, IoBuffer.InputLength - 2*sizeof(ULONG));
1282 Status = wrmaltWithLock(Adapter, (UINT)pBulkBuffer->Register, (PUINT)pBulkBuffer->Values, IoBuffer.InputLength - 2*sizeof(ULONG));
1284 if(Status != STATUS_SUCCESS)
1286 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "WRM Failed\n");
1289 bcm_kfree(pvBuffer);
1293 case IOCTL_BCM_GET_NVM_SIZE:
1296 if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1298 //IOLog("failed NVM first");
1302 if(Adapter->eNVMType == NVM_EEPROM || Adapter->eNVMType == NVM_FLASH ) {
1303 if(copy_to_user(IoBuffer.OutputBuffer,
1304 (unsigned char *)&Adapter->uiNVMDSDSize, (UINT)sizeof(UINT)))
1311 Status = STATUS_SUCCESS ;
1315 case IOCTL_BCM_CAL_INIT :
1318 UINT uiSectorSize = 0 ;
1319 if(Adapter->eNVMType == NVM_FLASH)
1321 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
1324 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Copy From User space failed. status :%d", Status);
1327 uiSectorSize = *((PUINT)(IoBuffer.InputBuffer)); /* FIXME: unchecked __user access */
1328 if((uiSectorSize < MIN_SECTOR_SIZE) || (uiSectorSize > MAX_SECTOR_SIZE))
1331 Status = copy_to_user(IoBuffer.OutputBuffer,
1332 (unsigned char *)&Adapter->uiSectorSize ,
1333 (UINT)sizeof(UINT));
1336 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Coping the sector size to use space failed. status:%d",Status);
1342 if(IsFlash2x(Adapter))
1344 Status = copy_to_user(IoBuffer.OutputBuffer,
1345 (unsigned char *)&Adapter->uiSectorSize ,
1346 (UINT)sizeof(UINT));
1349 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Coping the sector size to use space failed. status:%d",Status);
1356 if((TRUE == Adapter->bShutStatus) ||
1357 (TRUE == Adapter->IdleMode))
1359 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Device is in Idle/Shutdown Mode\n");
1363 Adapter->uiSectorSize = uiSectorSize ;
1364 BcmUpdateSectorSize(Adapter,Adapter->uiSectorSize);
1367 Status = STATUS_SUCCESS ;
1371 Status = STATUS_FAILURE;
1375 case IOCTL_BCM_SET_DEBUG :
1377 USER_BCM_DBG_STATE sUserDebugState;
1379 // BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "Entered the ioctl %x \n", IOCTL_BCM_SET_DEBUG );
1381 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "In SET_DEBUG ioctl\n");
1382 Status = copy_from_user((PCHAR)&IoBuffer, argp, sizeof(IOCTL_BUFFER));
1385 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy from user failed\n");
1388 Status = copy_from_user(&sUserDebugState,IoBuffer.InputBuffer, sizeof(USER_BCM_DBG_STATE));
1391 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy of IoBuffer.InputBuffer failed");
1395 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "IOCTL_BCM_SET_DEBUG: OnOff=%d Type = 0x%x ",
1396 sUserDebugState.OnOff, sUserDebugState.Type);
1397 //sUserDebugState.Subtype <<= 1;
1398 sUserDebugState.Subtype = 1 << sUserDebugState.Subtype;
1399 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "actual Subtype=0x%x\n", sUserDebugState.Subtype);
1401 // Update new 'DebugState' in the Adapter
1402 Adapter->stDebugState.type |= sUserDebugState.Type;
1403 /* Subtype: A bitmap of 32 bits for Subtype per Type.
1404 * Valid indexes in 'subtype' array: 1,2,4,8
1405 * corresponding to valid Type values. Hence we can use the 'Type' field
1406 * as the index value, ignoring the array entries 0,3,5,6,7 !
1408 if (sUserDebugState.OnOff)
1409 Adapter->stDebugState.subtype[sUserDebugState.Type] |= sUserDebugState.Subtype;
1411 Adapter->stDebugState.subtype[sUserDebugState.Type] &= ~sUserDebugState.Subtype;
1413 BCM_SHOW_DEBUG_BITMAP(Adapter);
1417 case IOCTL_BCM_NVM_READ:
1418 case IOCTL_BCM_NVM_WRITE:
1421 NVM_READWRITE stNVMReadWrite = {};
1422 PUCHAR pReadData = NULL;
1423 void __user * pBuffertobeCopied = NULL;
1424 ULONG ulDSDMagicNumInUsrBuff = 0 ;
1425 struct timeval tv0, tv1;
1426 memset(&tv0,0,sizeof(struct timeval));
1427 memset(&tv1,0,sizeof(struct timeval));
1428 if((Adapter->eNVMType == NVM_FLASH) && (Adapter->uiFlashLayoutMajorVersion == 0))
1430 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0,"The Flash Control Section is Corrupted. Hence Rejection on NVM Read/Write\n");
1435 if(IsFlash2x(Adapter))
1437 if((Adapter->eActiveDSD != DSD0) &&
1438 (Adapter->eActiveDSD != DSD1) &&
1439 (Adapter->eActiveDSD != DSD2))
1441 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"No DSD is active..hence NVM Command is blocked");
1442 return STATUS_FAILURE ;
1446 /* Copy Ioctl Buffer structure */
1448 if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
1450 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"copy_from_user failed\n");
1454 if(IOCTL_BCM_NVM_READ == cmd)
1455 pBuffertobeCopied = IoBuffer.OutputBuffer;
1457 pBuffertobeCopied = IoBuffer.InputBuffer;
1459 if(copy_from_user(&stNVMReadWrite, pBuffertobeCopied,sizeof(NVM_READWRITE)))
1466 // Deny the access if the offset crosses the cal area limit.
1468 if((stNVMReadWrite.uiOffset + stNVMReadWrite.uiNumBytes) > Adapter->uiNVMDSDSize)
1470 //BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Can't allow access beyond NVM Size: 0x%x 0x%x\n", stNVMReadWrite.uiOffset ,
1471 // stNVMReadWrite.uiNumBytes);
1472 Status = STATUS_FAILURE;
1476 pReadData =(PCHAR)kmalloc(stNVMReadWrite.uiNumBytes, GFP_KERNEL);
1481 memset(pReadData,0,stNVMReadWrite.uiNumBytes);
1483 if(copy_from_user(pReadData, stNVMReadWrite.pBuffer,
1484 stNVMReadWrite.uiNumBytes))
1487 bcm_kfree(pReadData);
1491 do_gettimeofday(&tv0);
1492 if(IOCTL_BCM_NVM_READ == cmd)
1494 down(&Adapter->NVMRdmWrmLock);
1496 if((Adapter->IdleMode == TRUE) ||
1497 (Adapter->bShutStatus ==TRUE) ||
1498 (Adapter->bPreparingForLowPowerMode ==TRUE))
1500 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1501 up(&Adapter->NVMRdmWrmLock);
1502 bcm_kfree(pReadData);
1506 Status = BeceemNVMRead(Adapter, (PUINT)pReadData,
1507 stNVMReadWrite.uiOffset, stNVMReadWrite.uiNumBytes);
1509 up(&Adapter->NVMRdmWrmLock);
1511 if(Status != STATUS_SUCCESS)
1513 bcm_kfree(pReadData);
1516 if(copy_to_user(stNVMReadWrite.pBuffer,
1517 pReadData, (UINT)stNVMReadWrite.uiNumBytes))
1519 bcm_kfree(pReadData);
1526 down(&Adapter->NVMRdmWrmLock);
1528 if((Adapter->IdleMode == TRUE) ||
1529 (Adapter->bShutStatus ==TRUE) ||
1530 (Adapter->bPreparingForLowPowerMode ==TRUE))
1532 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1533 up(&Adapter->NVMRdmWrmLock);
1534 bcm_kfree(pReadData);
1538 Adapter->bHeaderChangeAllowed = TRUE ;
1539 if(IsFlash2x(Adapter))
1543 DSD section updation will be allowed in two case:-
1544 1. if DSD sig is present in DSD header means dongle is ok and updation is fruitfull
1545 2. if point 1 failes then user buff should have DSD sig. this point ensures that if dongle is
1546 corrupted then user space program first modify the DSD header with valid DSD sig so
1547 that this as well as further write may be worthwhile.
1549 This restriction has been put assuming that if DSD sig is corrupted, DSD
1550 data won't be considered valid.
1554 Status = BcmFlash2xCorruptSig(Adapter,Adapter->eActiveDSD);
1555 if(Status != STATUS_SUCCESS)
1557 if(( (stNVMReadWrite.uiOffset + stNVMReadWrite.uiNumBytes) != Adapter->uiNVMDSDSize ) ||
1558 (stNVMReadWrite.uiNumBytes < SIGNATURE_SIZE))
1560 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"DSD Sig is present neither in Flash nor User provided Input..");
1561 up(&Adapter->NVMRdmWrmLock);
1562 bcm_kfree(pReadData);
1566 ulDSDMagicNumInUsrBuff = ntohl(*(PUINT)(pReadData + stNVMReadWrite.uiNumBytes - SIGNATURE_SIZE));
1567 if(ulDSDMagicNumInUsrBuff != DSD_IMAGE_MAGIC_NUMBER)
1569 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"DSD Sig is present neither in Flash nor User provided Input..");
1570 up(&Adapter->NVMRdmWrmLock);
1571 bcm_kfree(pReadData);
1576 Status = BeceemNVMWrite(Adapter, (PUINT )pReadData,
1577 stNVMReadWrite.uiOffset, stNVMReadWrite.uiNumBytes, stNVMReadWrite.bVerify);
1578 if(IsFlash2x(Adapter))
1579 BcmFlash2xWriteSig(Adapter,Adapter->eActiveDSD);
1581 Adapter->bHeaderChangeAllowed = FALSE ;
1583 up(&Adapter->NVMRdmWrmLock);
1586 if(Status != STATUS_SUCCESS)
1588 bcm_kfree(pReadData);
1592 do_gettimeofday(&tv1);
1593 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);
1596 bcm_kfree(pReadData);
1597 Status = STATUS_SUCCESS;
1600 case IOCTL_BCM_FLASH2X_SECTION_READ :
1603 FLASH2X_READWRITE sFlash2xRead = {0};
1604 PUCHAR pReadBuff = NULL ;
1608 UINT ReadOffset = 0;
1609 char __user *OutPutBuff = NULL;
1611 if(IsFlash2x(Adapter) != TRUE)
1613 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
1617 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_FLASH2X_SECTION_READ Called");
1618 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
1621 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
1625 //Reading FLASH 2.x READ structure
1626 Status = copy_from_user(&sFlash2xRead, IoBuffer.InputBuffer,sizeof(FLASH2X_READWRITE));
1629 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of Input Buffer failed");
1634 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.Section :%x" ,sFlash2xRead.Section);
1635 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.offset :%x" ,sFlash2xRead.offset);
1636 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.numOfBytes :%x" ,sFlash2xRead.numOfBytes);
1637 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.bVerify :%x\n" ,sFlash2xRead.bVerify);
1639 //This was internal to driver for raw read. now it has ben exposed to user space app.
1640 if(validateFlash2xReadWrite(Adapter,&sFlash2xRead) == FALSE)
1641 return STATUS_FAILURE ;
1643 NOB = sFlash2xRead.numOfBytes;
1644 if(NOB > Adapter->uiSectorSize )
1645 BuffSize = Adapter->uiSectorSize;
1649 ReadOffset = sFlash2xRead.offset ;
1650 OutPutBuff = IoBuffer.OutputBuffer;
1653 pReadBuff = (PCHAR)kzalloc(BuffSize , GFP_KERNEL);
1654 if(pReadBuff == NULL)
1656 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Memory allocation failed for Flash 2.x Read Structure");
1659 down(&Adapter->NVMRdmWrmLock);
1661 if((Adapter->IdleMode == TRUE) ||
1662 (Adapter->bShutStatus ==TRUE) ||
1663 (Adapter->bPreparingForLowPowerMode ==TRUE))
1665 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1666 up(&Adapter->NVMRdmWrmLock);
1667 bcm_kfree(pReadBuff);
1674 if(NOB > Adapter->uiSectorSize )
1675 ReadBytes = Adapter->uiSectorSize;
1680 //Reading the data from Flash 2.x
1682 Status = BcmFlash2xBulkRead(Adapter,(PUINT)pReadBuff,sFlash2xRead.Section,ReadOffset,ReadBytes);
1685 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Flash 2x read err with Status :%d", Status);
1689 BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,pReadBuff, ReadBytes);
1691 Status = copy_to_user(OutPutBuff, pReadBuff,ReadBytes);
1694 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Copy to use failed with status :%d", Status);
1697 NOB = NOB - ReadBytes;
1700 ReadOffset = ReadOffset + ReadBytes ;
1701 OutPutBuff = OutPutBuff + ReadBytes ;
1705 up(&Adapter->NVMRdmWrmLock);
1706 bcm_kfree(pReadBuff);
1710 case IOCTL_BCM_FLASH2X_SECTION_WRITE :
1712 FLASH2X_READWRITE sFlash2xWrite = {0};
1713 PUCHAR pWriteBuff = NULL;
1714 void __user *InputAddr = NULL;
1717 UINT WriteOffset = 0;
1718 UINT WriteBytes = 0;
1720 if(IsFlash2x(Adapter) != TRUE)
1722 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
1726 //First make this False so that we can enable the Sector Permission Check in BeceemFlashBulkWrite
1727 Adapter->bAllDSDWriteAllow = FALSE;
1730 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, " IOCTL_BCM_FLASH2X_SECTION_WRITE Called");
1731 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
1734 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
1738 //Reading FLASH 2.x READ structure
1739 Status = copy_from_user(&sFlash2xWrite, IoBuffer.InputBuffer, sizeof(FLASH2X_READWRITE));
1742 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Reading of output Buffer from IOCTL buffer fails");
1746 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.Section :%x" ,sFlash2xWrite.Section);
1747 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.offset :%d" ,sFlash2xWrite.offset);
1748 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.numOfBytes :%x" ,sFlash2xWrite.numOfBytes);
1749 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.bVerify :%x\n" ,sFlash2xWrite.bVerify);
1751 if((sFlash2xWrite.Section == ISO_IMAGE1) ||(sFlash2xWrite.Section == ISO_IMAGE2) ||
1752 (sFlash2xWrite.Section == DSD0) || (sFlash2xWrite.Section == DSD1) || (sFlash2xWrite.Section == DSD2))
1754 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"ISO/DSD Image write is not allowed.... ");
1755 return STATUS_FAILURE ;
1758 if((sFlash2xWrite.Section != VSA0) && (sFlash2xWrite.Section != VSA1) &&
1759 (sFlash2xWrite.Section != VSA2) )
1761 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Only VSA write is allowed");
1765 if(validateFlash2xReadWrite(Adapter,&sFlash2xWrite) == FALSE)
1766 return STATUS_FAILURE ;
1768 InputAddr = sFlash2xWrite.pDataBuff;
1769 WriteOffset = sFlash2xWrite.offset ;
1770 NOB = sFlash2xWrite.numOfBytes;
1772 if(NOB > Adapter->uiSectorSize )
1773 BuffSize = Adapter->uiSectorSize;
1777 pWriteBuff = (PCHAR)kmalloc(BuffSize, GFP_KERNEL);
1778 if(pWriteBuff == NULL)
1780 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Memory allocation failed for Flash 2.x Read Structure");
1784 //extracting the remainder of the given offset.
1785 WriteBytes = Adapter->uiSectorSize ;
1786 if(WriteOffset % Adapter->uiSectorSize)
1787 WriteBytes =Adapter->uiSectorSize - (WriteOffset % Adapter->uiSectorSize);
1788 if(NOB < WriteBytes)
1791 down(&Adapter->NVMRdmWrmLock);
1793 if((Adapter->IdleMode == TRUE) ||
1794 (Adapter->bShutStatus ==TRUE) ||
1795 (Adapter->bPreparingForLowPowerMode ==TRUE))
1797 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1798 up(&Adapter->NVMRdmWrmLock);
1799 bcm_kfree(pWriteBuff);
1803 BcmFlash2xCorruptSig(Adapter,sFlash2xWrite.Section);
1806 Status = copy_from_user(pWriteBuff,InputAddr,WriteBytes);
1809 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Copy to user failed with status :%d", Status);
1812 BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,pWriteBuff,WriteBytes);
1813 //Writing the data from Flash 2.x
1814 Status = BcmFlash2xBulkWrite(Adapter,(PUINT)pWriteBuff,sFlash2xWrite.Section,WriteOffset,WriteBytes,sFlash2xWrite.bVerify);
1818 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash 2x read err with Status :%d", Status);
1822 NOB = NOB - WriteBytes;
1825 WriteOffset = WriteOffset + WriteBytes ;
1826 InputAddr = InputAddr + WriteBytes ;
1827 if(NOB > Adapter->uiSectorSize )
1828 WriteBytes = Adapter->uiSectorSize;
1835 BcmFlash2xWriteSig(Adapter,sFlash2xWrite.Section);
1836 up(&Adapter->NVMRdmWrmLock);
1837 bcm_kfree(pWriteBuff);
1840 case IOCTL_BCM_GET_FLASH2X_SECTION_BITMAP :
1843 PFLASH2X_BITMAP psFlash2xBitMap = NULL ;
1844 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_GET_FLASH2X_SECTION_BITMAP Called");
1846 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
1849 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
1852 if(IoBuffer.OutputLength != sizeof(FLASH2X_BITMAP))
1854 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Structure size mismatch Lib :0x%lx Driver :0x%zx ",IoBuffer.OutputLength, sizeof(FLASH2X_BITMAP));
1858 psFlash2xBitMap = (PFLASH2X_BITMAP)kzalloc(sizeof(FLASH2X_BITMAP), GFP_KERNEL);
1859 if(psFlash2xBitMap == NULL)
1861 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Memory is not available");
1864 //Reading the Flash Sectio Bit map
1865 down(&Adapter->NVMRdmWrmLock);
1867 if((Adapter->IdleMode == TRUE) ||
1868 (Adapter->bShutStatus ==TRUE) ||
1869 (Adapter->bPreparingForLowPowerMode ==TRUE))
1871 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1872 up(&Adapter->NVMRdmWrmLock);
1873 bcm_kfree(psFlash2xBitMap);
1877 BcmGetFlash2xSectionalBitMap(Adapter, psFlash2xBitMap);
1878 up(&Adapter->NVMRdmWrmLock);
1879 Status = copy_to_user(IoBuffer.OutputBuffer, psFlash2xBitMap, sizeof(FLASH2X_BITMAP));
1882 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copying Flash2x bitMap failed");
1883 bcm_kfree(psFlash2xBitMap);
1886 bcm_kfree(psFlash2xBitMap);
1889 case IOCTL_BCM_SET_ACTIVE_SECTION :
1891 FLASH2X_SECTION_VAL eFlash2xSectionVal = 0;
1892 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_SET_ACTIVE_SECTION Called");
1894 if(IsFlash2x(Adapter) != TRUE)
1896 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
1900 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
1903 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
1907 Status = copy_from_user(&eFlash2xSectionVal,IoBuffer.InputBuffer, sizeof(INT));
1910 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of flash section val failed");
1914 down(&Adapter->NVMRdmWrmLock);
1916 if((Adapter->IdleMode == TRUE) ||
1917 (Adapter->bShutStatus ==TRUE) ||
1918 (Adapter->bPreparingForLowPowerMode ==TRUE))
1920 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1921 up(&Adapter->NVMRdmWrmLock);
1925 Status = BcmSetActiveSection(Adapter,eFlash2xSectionVal);
1928 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Failed to make it's priority Highest. Status %d", Status);
1930 up(&Adapter->NVMRdmWrmLock);
1933 case IOCTL_BCM_IDENTIFY_ACTIVE_SECTION :
1935 //Right Now we are taking care of only DSD
1936 Adapter->bAllDSDWriteAllow = FALSE ;
1937 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"IOCTL_BCM_IDENTIFY_ACTIVE_SECTION called");
1940 SECTION_TYPE section = 0 ;
1943 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_IDENTIFY_ACTIVE_SECTION Called");
1944 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
1947 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Copy of IOCTL BUFFER failed");
1950 Status = copy_from_user((PCHAR)section,(PCHAR)&IoBuffer, sizeof(INT));
1953 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Copy of section type failed failed");
1956 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Read Section :%d", section);
1958 Adapter->ulFlashCalStart = Adapter->uiActiveDSDOffsetAtFwDld ;
1960 Status = STATUS_FAILURE ;
1962 Status = STATUS_SUCCESS ;
1965 case IOCTL_BCM_COPY_SECTION :
1967 FLASH2X_COPY_SECTION sCopySectStrut = {0};
1968 Status = STATUS_SUCCESS;
1969 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_COPY_SECTION Called");
1971 Adapter->bAllDSDWriteAllow = FALSE ;
1972 if(IsFlash2x(Adapter) != TRUE)
1974 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
1978 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
1981 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed Status :%d", Status);
1985 Status = copy_from_user(&sCopySectStrut,IoBuffer.InputBuffer, sizeof(FLASH2X_COPY_SECTION));
1988 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of Copy_Section_Struct failed with Status :%d", Status);
1991 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Source SEction :%x", sCopySectStrut.SrcSection);
1992 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Destination SEction :%x", sCopySectStrut.DstSection);
1993 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "offset :%x", sCopySectStrut.offset);
1994 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "NOB :%x", sCopySectStrut.numOfBytes);
1997 if(IsSectionExistInFlash(Adapter,sCopySectStrut.SrcSection) == FALSE)
1999 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Source Section<%x> does not exixt in Flash ", sCopySectStrut.SrcSection);
2003 if(IsSectionExistInFlash(Adapter,sCopySectStrut.DstSection) == FALSE)
2005 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Destinatio Section<%x> does not exixt in Flash ", sCopySectStrut.DstSection);
2009 if(sCopySectStrut.SrcSection == sCopySectStrut.DstSection)
2011 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Source and Destination section should be different");
2015 down(&Adapter->NVMRdmWrmLock);
2017 if((Adapter->IdleMode == TRUE) ||
2018 (Adapter->bShutStatus ==TRUE) ||
2019 (Adapter->bPreparingForLowPowerMode ==TRUE))
2021 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
2022 up(&Adapter->NVMRdmWrmLock);
2026 if(sCopySectStrut.SrcSection == ISO_IMAGE1 || sCopySectStrut.SrcSection == ISO_IMAGE2)
2028 if(IsNonCDLessDevice(Adapter))
2030 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Device is Non-CDLess hence won't have ISO !!");
2033 else if(sCopySectStrut.numOfBytes == 0)
2035 Status = BcmCopyISO(Adapter,sCopySectStrut);
2039 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Partial Copy of ISO section is not Allowed..");
2040 Status = STATUS_FAILURE ;
2042 up(&Adapter->NVMRdmWrmLock);
2046 Status = BcmCopySection(Adapter, sCopySectStrut.SrcSection,
2047 sCopySectStrut.DstSection,sCopySectStrut.offset,sCopySectStrut.numOfBytes);
2048 up(&Adapter->NVMRdmWrmLock);
2051 case IOCTL_BCM_GET_FLASH_CS_INFO :
2053 Status = STATUS_SUCCESS;
2054 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, " IOCTL_BCM_GET_FLASH_CS_INFO Called");
2056 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
2059 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
2062 if(Adapter->eNVMType != NVM_FLASH)
2064 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Connected device does not have flash");
2068 if(IsFlash2x(Adapter) == TRUE)
2071 if(IoBuffer.OutputLength < sizeof(FLASH2X_CS_INFO))
2073 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0," Passed buffer size:0x%lX is insufficient for the CS structure.. \nRequired size :0x%zx ",IoBuffer.OutputLength, sizeof(FLASH2X_CS_INFO));
2078 Status = copy_to_user(IoBuffer.OutputBuffer, Adapter->psFlash2xCSInfo, sizeof(FLASH2X_CS_INFO));
2081 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copying Flash2x cs info failed");
2087 if(IoBuffer.OutputLength < sizeof(FLASH_CS_INFO))
2089 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0," Passed buffer size:0x%lX is insufficient for the CS structure.. Required size :0x%zx ",IoBuffer.OutputLength, sizeof(FLASH_CS_INFO));
2093 Status = copy_to_user(IoBuffer.OutputBuffer, Adapter->psFlashCSInfo, sizeof(FLASH_CS_INFO));
2096 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copying Flash CS info failed");
2103 case IOCTL_BCM_SELECT_DSD :
2106 FLASH2X_SECTION_VAL eFlash2xSectionVal;
2107 eFlash2xSectionVal = NO_SECTION_VAL ;
2108 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, " IOCTL_BCM_SELECT_DSD Called");
2110 if(IsFlash2x(Adapter) != TRUE)
2112 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
2116 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
2119 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
2122 Status = copy_from_user(&eFlash2xSectionVal,IoBuffer.InputBuffer, sizeof(INT));
2125 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of flash section val failed");
2129 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Read Section :%d", eFlash2xSectionVal);
2130 if((eFlash2xSectionVal != DSD0) &&
2131 (eFlash2xSectionVal != DSD1) &&
2132 (eFlash2xSectionVal != DSD2) )
2134 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Passed section<%x> is not DSD section", eFlash2xSectionVal);
2135 return STATUS_FAILURE ;
2138 SectOfset= BcmGetSectionValStartOffset(Adapter,eFlash2xSectionVal);
2139 if(SectOfset == INVALID_OFFSET)
2141 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Provided Section val <%d> does not exixt in Flash 2.x", eFlash2xSectionVal);
2145 Adapter->bAllDSDWriteAllow = TRUE ;
2147 Adapter->ulFlashCalStart = SectOfset ;
2148 Adapter->eActiveDSD = eFlash2xSectionVal;
2150 Status = STATUS_SUCCESS ;
2153 case IOCTL_BCM_NVM_RAW_READ :
2156 NVM_READWRITE stNVMRead = {};
2160 UINT ReadBytes = 0 ;
2161 PUCHAR pReadBuff = NULL ;
2162 char __user *OutPutBuff = NULL ;
2164 if(Adapter->eNVMType != NVM_FLASH)
2166 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"NVM TYPE is not Flash ");
2170 /* Copy Ioctl Buffer structure */
2171 if(copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER)))
2173 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copy_from_user 1 failed\n");
2178 if(copy_from_user(&stNVMRead, IoBuffer.OutputBuffer,sizeof(NVM_READWRITE)))
2184 NOB = stNVMRead.uiNumBytes;
2185 //In Raw-Read max Buff size : 64MB
2187 if(NOB > DEFAULT_BUFF_SIZE)
2188 BuffSize = DEFAULT_BUFF_SIZE;
2192 ReadOffset = stNVMRead.uiOffset ;
2193 OutPutBuff = stNVMRead.pBuffer;
2196 pReadBuff = (PCHAR)kzalloc(BuffSize , GFP_KERNEL);
2197 if(pReadBuff == NULL)
2199 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Memory allocation failed for Flash 2.x Read Structure");
2203 down(&Adapter->NVMRdmWrmLock);
2205 if((Adapter->IdleMode == TRUE) ||
2206 (Adapter->bShutStatus ==TRUE) ||
2207 (Adapter->bPreparingForLowPowerMode ==TRUE))
2209 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
2210 bcm_kfree(pReadBuff);
2211 up(&Adapter->NVMRdmWrmLock);
2215 Adapter->bFlashRawRead = TRUE ;
2218 if(NOB > DEFAULT_BUFF_SIZE )
2219 ReadBytes = DEFAULT_BUFF_SIZE;
2223 //Reading the data from Flash 2.x
2224 Status = BeceemNVMRead(Adapter,(PUINT)pReadBuff,ReadOffset,ReadBytes);
2227 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash 2x read err with Status :%d", Status);
2231 BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,pReadBuff, ReadBytes);
2233 Status = copy_to_user(OutPutBuff, pReadBuff,ReadBytes);
2236 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Copy to use failed with status :%d", Status);
2239 NOB = NOB - ReadBytes;
2242 ReadOffset = ReadOffset + ReadBytes ;
2243 OutPutBuff = OutPutBuff + ReadBytes ;
2247 Adapter->bFlashRawRead = FALSE ;
2248 up(&Adapter->NVMRdmWrmLock);
2249 bcm_kfree(pReadBuff);
2253 case IOCTL_BCM_CNTRLMSG_MASK:
2255 ULONG RxCntrlMsgBitMask = 0 ;
2257 /* Copy Ioctl Buffer structure */
2258 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
2261 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"copy of Ioctl buffer is failed from user space");
2265 Status = copy_from_user(&RxCntrlMsgBitMask, IoBuffer.InputBuffer, IoBuffer.InputLength);
2268 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"copy of control bit mask failed from user space");
2271 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\n Got user defined cntrl msg bit mask :%lx", RxCntrlMsgBitMask);
2272 pTarang->RxCntrlMsgBitMask = RxCntrlMsgBitMask ;
2275 case IOCTL_BCM_GET_DEVICE_DRIVER_INFO:
2277 DEVICE_DRIVER_INFO DevInfo;
2279 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Called IOCTL_BCM_GET_DEVICE_DRIVER_INFO\n");
2281 DevInfo.MaxRDMBufferSize = BUFFER_4K;
2282 DevInfo.u32DSDStartOffset = EEPROM_CALPARAM_START;
2283 DevInfo.u32RxAlignmentCorrection = 0;
2284 DevInfo.u32NVMType = Adapter->eNVMType;
2285 DevInfo.u32InterfaceType = BCM_USB;
2287 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
2290 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
2293 if(IoBuffer.OutputLength < sizeof(DevInfo))
2295 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"User Passed buffer length is less than actural buffer size");
2296 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"user passed buffer size :0x%lX, expected size :0x%zx",IoBuffer.OutputLength, sizeof(DevInfo));
2300 Status = copy_to_user(IoBuffer.OutputBuffer, &DevInfo, sizeof(DevInfo));
2303 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"copying Dev info structure to user space buffer failed");
2309 case IOCTL_BCM_TIME_SINCE_NET_ENTRY:
2311 ST_TIME_ELAPSED stTimeElapsedSinceNetEntry = {0};
2312 struct timeval tv = {0} ;
2314 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"IOCTL_BCM_TIME_SINCE_NET_ENTRY called");
2316 Status = copy_from_user(&IoBuffer, argp, sizeof(IOCTL_BUFFER));
2319 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
2322 if(IoBuffer.OutputLength < sizeof(ST_TIME_ELAPSED))
2324 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"User Passed buffer length:0x%lx is less than expected buff size :0x%zX",IoBuffer.OutputLength,sizeof(ST_TIME_ELAPSED));
2329 //stTimeElapsedSinceNetEntry.ul64TimeElapsedSinceNetEntry = Adapter->liTimeSinceLastNetEntry;
2330 do_gettimeofday(&tv);
2331 stTimeElapsedSinceNetEntry.ul64TimeElapsedSinceNetEntry = tv.tv_sec - Adapter->liTimeSinceLastNetEntry;
2333 Status = copy_to_user(IoBuffer.OutputBuffer, &stTimeElapsedSinceNetEntry, sizeof(ST_TIME_ELAPSED));
2336 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"copying ST_TIME_ELAPSED structure to user space buffer failed");
2344 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "wrong input %x",cmd);
2345 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "In default ioctl %d\n", cmd);
2346 Status = STATUS_FAILURE;
2354 static struct file_operations bcm_fops = {
2355 .owner = THIS_MODULE,
2356 .open = bcm_char_open,
2357 .release = bcm_char_release,
2358 .read = bcm_char_read,
2359 .unlocked_ioctl = bcm_char_ioctl,
2360 .llseek = no_llseek,
2364 int register_control_device_interface(PMINI_ADAPTER Adapter)
2366 if(Adapter->major>0)
2367 return Adapter->major;
2368 Adapter->major = register_chrdev(0, "tarang", &bcm_fops);
2369 if(Adapter->major < 0)
2371 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "register_chrdev:Failed to registering WiMax control char device!");
2372 return Adapter->major;
2376 bcm_class = class_create (THIS_MODULE, "tarang");
2377 if(IS_ERR (bcm_class))
2379 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Unable to create class\n");
2380 unregister_chrdev(Adapter->major, "tarang");
2384 Adapter->pstCreatedClassDevice = device_create (bcm_class, NULL,
2385 MKDEV(Adapter->major, 0),
2386 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,26)
2391 if(IS_ERR(Adapter->pstCreatedClassDevice))
2393 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "class device did not get created : %ld", PTR_ERR(Adapter->pstCreatedClassDevice) );
2395 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Got Major No: %d", Adapter->major);
2399 void unregister_control_device_interface(PMINI_ADAPTER Adapter)
2401 if(Adapter->major > 0)
2403 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "destroying class device");
2404 device_destroy (bcm_class, MKDEV(Adapter->major, 0));
2406 if(!IS_ERR(bcm_class))
2408 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "destroying created class ");
2409 class_destroy (bcm_class);
2412 if(Adapter->major > 0)
2414 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL,"unregistering character interface");
2415 unregister_chrdev(Adapter->major, "tarang");