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 int bcm_char_read(struct file *filp, PCHAR 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 INT bcm_char_ioctl(struct inode *inode, struct file *filp,
159 PPER_TARANG_DATA pTarang = (PPER_TARANG_DATA)filp->private_data;
160 PMINI_ADAPTER Adapter = pTarang->Adapter;
161 INT Status = STATUS_FAILURE;
162 IOCTL_BUFFER IoBuffer={0};
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, (PVOID)arg, _IOC_SIZE(cmd));
174 else if (_IOC_DIR(cmd) & _IOC_WRITE)
175 Status = !access_ok(VERIFY_READ, (PVOID)arg, _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, (PCHAR)arg,
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((PCHAR)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((PCHAR)&IoBuffer, (PCHAR)arg,
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((PCHAR)&IoBuffer, (PCHAR)arg,
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((PCHAR)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, (PCHAR)arg,
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((PCHAR)&IoBuffer, (PCHAR)arg, 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((PCHAR)&IoBuffer, (PCHAR)arg, 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, (PCHAR)arg, 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, ( PCHAR)arg, 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( (PCHAR)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( (PCHAR)&IoBuffer, ( PCHAR)arg, 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( (PCHAR)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((PCHAR)&IoBuffer, (PCHAR)arg,
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((PCHAR)&IoBuffer, (PCHAR)arg,
869 sizeof(IOCTL_BUFFER)))
871 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copy_from_user 1 failed\n");
875 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Length for FW DLD is : %lx\n",
876 IoBuffer.InputLength);
877 psFwInfo=kmalloc(sizeof(*psFwInfo), GFP_KERNEL);
880 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Failed to allocate buffer!!!!\n");
884 if(copy_from_user(psFwInfo, IoBuffer.InputBuffer,
885 IoBuffer.InputLength))
887 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy_from_user 2 failed\n");
892 if(!psFwInfo->pvMappedFirmwareAddress ||
893 (psFwInfo->u32FirmwareLength == 0))
895 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Something else is wrong %lu\n",
896 psFwInfo->u32FirmwareLength);
900 Status = bcm_ioctl_fw_download(Adapter, psFwInfo);
901 if(Status != STATUS_SUCCESS)
903 if(psFwInfo->u32StartingAddress==CONFIG_BEGIN_ADDR)
905 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "IOCTL: Configuration File Upload Failed\n");
909 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "IOCTL: Firmware File Upload Failed\n");
911 //up(&Adapter->fw_download_sema);
913 if(Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY)
915 Adapter->DriverState = DRIVER_INIT;
916 Adapter->LEDInfo.bLedInitDone = FALSE;
917 wake_up(&Adapter->LEDInfo.notify_led_event);
923 if(Status != STATUS_SUCCESS)
924 up(&Adapter->fw_download_sema);
925 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, OSAL_DBG, DBG_LVL_ALL, "IOCTL: Firmware File Uploaded\n");
929 case IOCTL_BCM_BUFFER_DOWNLOAD_STOP:
931 INT NVMAccess = down_trylock(&Adapter->NVMRdmWrmLock);
934 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, " FW download blocked as EEPROM Read/Write is in progress\n");
935 up(&Adapter->fw_download_sema);
938 if(down_trylock(&Adapter->fw_download_sema))
940 Adapter->bBinDownloaded=TRUE;
941 Adapter->bCfgDownloaded=TRUE;
942 atomic_set(&Adapter->CurrNumFreeTxDesc, 0);
943 atomic_set(&Adapter->RxRollOverCount, 0);
944 Adapter->CurrNumRecvDescs=0;
945 Adapter->downloadDDR = 0;
947 //setting the Mips to Run
948 Status = run_card_proc(Adapter);
951 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Firm Download Failed\n");
952 up(&Adapter->fw_download_sema);
953 up(&Adapter->NVMRdmWrmLock);
957 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Firm Download Over...\n");
959 /* Wait for MailBox Interrupt */
960 if(StartInterruptUrb((PS_INTERFACE_ADAPTER)Adapter->pvInterfaceAdapter))
962 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Unable to send interrupt...\n");
965 Adapter->waiting_to_fw_download_done = FALSE;
966 wait_event_timeout(Adapter->ioctl_fw_dnld_wait_queue,
967 Adapter->waiting_to_fw_download_done, timeout);
968 Adapter->fw_download_process_pid=INVALID_PID;
969 Adapter->fw_download_done=TRUE;
970 atomic_set(&Adapter->CurrNumFreeTxDesc, 0);
971 Adapter->CurrNumRecvDescs = 0;
972 Adapter->PrevNumRecvDescs = 0;
973 atomic_set(&Adapter->cntrlpktCnt,0);
974 Adapter->LinkUpStatus = 0;
975 Adapter->LinkStatus = 0;
977 if(Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY)
979 Adapter->DriverState = FW_DOWNLOAD_DONE;
980 wake_up(&Adapter->LEDInfo.notify_led_event);
992 up(&Adapter->fw_download_sema);
993 up(&Adapter->NVMRdmWrmLock);
997 case IOCTL_BE_BUCKET_SIZE:
998 Adapter->BEBucketSize = *(PULONG)arg;
999 Status = STATUS_SUCCESS;
1002 case IOCTL_RTPS_BUCKET_SIZE:
1003 Adapter->rtPSBucketSize = *(PULONG)arg;
1004 Status = STATUS_SUCCESS;
1006 case IOCTL_CHIP_RESET:
1008 INT NVMAccess = down_trylock(&Adapter->NVMRdmWrmLock);
1011 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, " IOCTL_BCM_CHIP_RESET not allowed as EEPROM Read/Write is in progress\n");
1014 down(&Adapter->RxAppControlQueuelock);
1015 Status = reset_card_proc(Adapter);
1017 up(&Adapter->RxAppControlQueuelock);
1018 up(&Adapter->NVMRdmWrmLock);
1019 ResetCounters(Adapter);
1022 case IOCTL_QOS_THRESHOLD:
1025 for(uiLoopIndex = 0 ; uiLoopIndex < NO_OF_QUEUES ; uiLoopIndex++)
1027 Adapter->PackInfo[uiLoopIndex].uiThreshold = *(PULONG)arg;
1029 Status = STATUS_SUCCESS;
1033 case IOCTL_DUMP_PACKET_INFO:
1035 DumpPackInfo(Adapter);
1036 DumpPhsRules(&Adapter->stBCMPhsContext);
1037 Status = STATUS_SUCCESS;
1040 case IOCTL_GET_PACK_INFO:
1041 if(copy_to_user((PCHAR)arg, &Adapter->PackInfo,
1042 sizeof(PacketInfo)*NO_OF_QUEUES))
1047 Status = STATUS_SUCCESS;
1049 case IOCTL_BCM_SWITCH_TRANSFER_MODE:
1052 if(copy_from_user(&uiData, (PUINT)arg, sizeof(UINT)))
1057 if(uiData) /* Allow All Packets */
1059 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_SWITCH_TRANSFER_MODE: ETH_PACKET_TUNNELING_MODE\n");
1060 Adapter->TransferMode = ETH_PACKET_TUNNELING_MODE;
1062 else /* Allow IP only Packets */
1064 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_SWITCH_TRANSFER_MODE: IP_PACKET_ONLY_MODE\n");
1065 Adapter->TransferMode = IP_PACKET_ONLY_MODE;
1067 Status = STATUS_SUCCESS;
1071 case IOCTL_BCM_GET_DRIVER_VERSION:
1073 /* Copy Ioctl Buffer structure */
1074 if(copy_from_user((PCHAR)&IoBuffer,
1075 (PCHAR)arg, sizeof(IOCTL_BUFFER)))
1080 if(copy_to_user((PUCHAR)IoBuffer.OutputBuffer,
1081 VER_FILEVERSION_STR, (UINT)IoBuffer.OutputLength))
1086 Status = STATUS_SUCCESS;
1089 case IOCTL_BCM_GET_CURRENT_STATUS:
1091 LINK_STATE *plink_state = NULL;
1092 /* Copy Ioctl Buffer structure */
1093 if(copy_from_user((PCHAR)&IoBuffer,
1094 (PCHAR)arg, sizeof(IOCTL_BUFFER)))
1096 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copy_from_user failed..\n");
1100 plink_state = (LINK_STATE*)arg;
1101 plink_state->bIdleMode = (UCHAR)Adapter->IdleMode;
1102 plink_state->bShutdownMode = Adapter->bShutStatus;
1103 plink_state->ucLinkStatus = (UCHAR)Adapter->LinkStatus;
1104 if(copy_to_user((PUCHAR)IoBuffer.OutputBuffer,
1105 (PUCHAR)plink_state, (UINT)IoBuffer.OutputLength))
1107 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy_to_user Failed..\n");
1111 Status = STATUS_SUCCESS;
1114 case IOCTL_BCM_SET_MAC_TRACING:
1117 /* copy ioctl Buffer structure */
1118 if(copy_from_user((PCHAR)&IoBuffer,
1119 (PCHAR)arg, sizeof(IOCTL_BUFFER)))
1124 if(copy_from_user((PCHAR)&tracing_flag,
1125 (PCHAR)IoBuffer.InputBuffer,sizeof(UINT)))
1131 Adapter->pTarangs->MacTracingEnabled = TRUE;
1133 Adapter->pTarangs->MacTracingEnabled = FALSE;
1136 case IOCTL_BCM_GET_DSX_INDICATION:
1139 if(copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg,
1140 sizeof(IOCTL_BUFFER)))
1142 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Invalid IO buffer!!!" );
1146 if(IoBuffer.OutputLength < sizeof(stLocalSFAddIndicationAlt))
1148 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Mismatch req: %lx needed is =0x%zx!!!",
1149 IoBuffer.OutputLength, sizeof(stLocalSFAddIndicationAlt));
1152 if(copy_from_user((PCHAR)&ulSFId, (PCHAR)IoBuffer.InputBuffer,
1155 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Invalid SFID!!! %lu", ulSFId );
1159 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Get DSX Data SF ID is =%lx\n", ulSFId );
1160 get_dsx_sf_data_to_application(Adapter, ulSFId,
1161 IoBuffer.OutputBuffer);
1162 Status=STATUS_SUCCESS;
1165 case IOCTL_BCM_GET_HOST_MIBS:
1169 if(copy_from_user((PCHAR)&IoBuffer,
1170 (PCHAR)arg, sizeof(IOCTL_BUFFER)))
1172 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy_from user for IoBuff failed\n");
1177 if(IoBuffer.OutputLength != sizeof(S_MIBS_HOST_STATS_MIBS))
1179 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Length Check failed %lu %zd\n", IoBuffer.OutputLength,
1180 sizeof(S_MIBS_HOST_STATS_MIBS));
1184 temp_buff = (PCHAR)kmalloc(IoBuffer.OutputLength, GFP_KERNEL);
1188 return STATUS_FAILURE;
1191 Status = ProcessGetHostMibs(Adapter,
1192 (PUCHAR)temp_buff, IoBuffer.OutputLength);
1194 Status = GetDroppedAppCntrlPktMibs((PVOID)temp_buff,
1195 (PPER_TARANG_DATA)filp->private_data);
1197 if(copy_to_user((PCHAR)IoBuffer.OutputBuffer,(PCHAR)temp_buff,
1198 sizeof(S_MIBS_HOST_STATS_MIBS)))
1200 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy to user failed\n");
1201 bcm_kfree(temp_buff);
1205 bcm_kfree(temp_buff);
1209 case IOCTL_BCM_WAKE_UP_DEVICE_FROM_IDLE:
1210 if((FALSE == Adapter->bTriedToWakeUpFromlowPowerMode) && (TRUE==Adapter->IdleMode))
1212 Adapter->usIdleModePattern = ABORT_IDLE_MODE;
1213 Adapter->bWakeUpDevice = TRUE;
1214 wake_up(&Adapter->process_rx_cntrlpkt);
1216 Adapter->bTriedToWakeUpFromlowPowerMode = TRUE;
1217 InterfaceAbortIdlemode (Adapter, Adapter->usIdleModePattern);
1220 Status = STATUS_SUCCESS;
1223 case IOCTL_BCM_BULK_WRM:
1225 PBULKWRM_BUFFER pBulkBuffer;
1227 PCHAR pvBuffer = NULL;
1229 if((Adapter->IdleMode == TRUE) ||
1230 (Adapter->bShutStatus ==TRUE) ||
1231 (Adapter->bPreparingForLowPowerMode ==TRUE))
1233 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "Device in Idle/Shutdown Mode, Blocking Wrms\n");
1237 /* Copy Ioctl Buffer structure */
1238 if(copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER)))
1244 pvBuffer=kmalloc(IoBuffer.InputLength, GFP_KERNEL);
1251 /* Get WrmBuffer structure */
1252 if(copy_from_user(pvBuffer, IoBuffer.InputBuffer, IoBuffer.InputLength))
1254 bcm_kfree(pvBuffer);
1259 pBulkBuffer = (PBULKWRM_BUFFER)pvBuffer;
1261 if(((ULONG)pBulkBuffer->Register & 0x0F000000) != 0x0F000000 ||
1262 ((ULONG)pBulkBuffer->Register & 0x3))
1264 bcm_kfree(pvBuffer);
1265 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0,"WRM Done On invalid Address : %x Access Denied.\n",(int)pBulkBuffer->Register);
1271 uiTempVar = pBulkBuffer->Register & EEPROM_REJECT_MASK;
1272 if(!((Adapter->pstargetparams->m_u32Customize)&VSG_MODE)
1273 && ((uiTempVar == EEPROM_REJECT_REG_1)||
1274 (uiTempVar == EEPROM_REJECT_REG_2) ||
1275 (uiTempVar == EEPROM_REJECT_REG_3) ||
1276 (uiTempVar == EEPROM_REJECT_REG_4)) &&
1277 (cmd == IOCTL_BCM_REGISTER_WRITE))
1279 bcm_kfree(pvBuffer);
1280 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0,"EEPROM Access Denied, not in VSG Mode\n");
1285 if(pBulkBuffer->SwapEndian == FALSE)
1286 Status = wrmWithLock(Adapter, (UINT)pBulkBuffer->Register, (PCHAR)pBulkBuffer->Values, IoBuffer.InputLength - 2*sizeof(ULONG));
1288 Status = wrmaltWithLock(Adapter, (UINT)pBulkBuffer->Register, (PUINT)pBulkBuffer->Values, IoBuffer.InputLength - 2*sizeof(ULONG));
1290 if(Status != STATUS_SUCCESS)
1292 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "WRM Failed\n");
1295 bcm_kfree(pvBuffer);
1299 case IOCTL_BCM_GET_NVM_SIZE:
1302 if(copy_from_user((unsigned char *)&IoBuffer,
1303 (unsigned char *)arg, sizeof(IOCTL_BUFFER)))
1305 //IOLog("failed NVM first");
1309 if(Adapter->eNVMType == NVM_EEPROM || Adapter->eNVMType == NVM_FLASH ) {
1310 if(copy_to_user(IoBuffer.OutputBuffer,
1311 (unsigned char *)&Adapter->uiNVMDSDSize, (UINT)sizeof(UINT)))
1318 Status = STATUS_SUCCESS ;
1322 case IOCTL_BCM_CAL_INIT :
1325 UINT uiSectorSize = 0 ;
1326 if(Adapter->eNVMType == NVM_FLASH)
1328 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
1331 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Copy From User space failed. status :%d", Status);
1334 uiSectorSize = *((PUINT)(IoBuffer.InputBuffer));
1335 if((uiSectorSize < MIN_SECTOR_SIZE) || (uiSectorSize > MAX_SECTOR_SIZE))
1338 Status = copy_to_user(IoBuffer.OutputBuffer,
1339 (unsigned char *)&Adapter->uiSectorSize ,
1340 (UINT)sizeof(UINT));
1343 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Coping the sector size to use space failed. status:%d",Status);
1349 if(IsFlash2x(Adapter))
1351 Status = copy_to_user(IoBuffer.OutputBuffer,
1352 (unsigned char *)&Adapter->uiSectorSize ,
1353 (UINT)sizeof(UINT));
1356 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Coping the sector size to use space failed. status:%d",Status);
1363 if((TRUE == Adapter->bShutStatus) ||
1364 (TRUE == Adapter->IdleMode))
1366 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Device is in Idle/Shutdown Mode\n");
1370 Adapter->uiSectorSize = uiSectorSize ;
1371 BcmUpdateSectorSize(Adapter,Adapter->uiSectorSize);
1374 Status = STATUS_SUCCESS ;
1378 Status = STATUS_FAILURE;
1382 case IOCTL_BCM_SET_DEBUG :
1384 USER_BCM_DBG_STATE sUserDebugState;
1386 // BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "Entered the ioctl %x \n", IOCTL_BCM_SET_DEBUG );
1388 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "In SET_DEBUG ioctl\n");
1389 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
1392 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy from user failed\n");
1395 Status = copy_from_user(&sUserDebugState,(USER_BCM_DBG_STATE *)IoBuffer.InputBuffer, sizeof(USER_BCM_DBG_STATE));
1398 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy of IoBuffer.InputBuffer failed");
1402 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "IOCTL_BCM_SET_DEBUG: OnOff=%d Type = 0x%x ",
1403 sUserDebugState.OnOff, sUserDebugState.Type);
1404 //sUserDebugState.Subtype <<= 1;
1405 sUserDebugState.Subtype = 1 << sUserDebugState.Subtype;
1406 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "actual Subtype=0x%x\n", sUserDebugState.Subtype);
1408 // Update new 'DebugState' in the Adapter
1409 Adapter->stDebugState.type |= sUserDebugState.Type;
1410 /* Subtype: A bitmap of 32 bits for Subtype per Type.
1411 * Valid indexes in 'subtype' array: 1,2,4,8
1412 * corresponding to valid Type values. Hence we can use the 'Type' field
1413 * as the index value, ignoring the array entries 0,3,5,6,7 !
1415 if (sUserDebugState.OnOff)
1416 Adapter->stDebugState.subtype[sUserDebugState.Type] |= sUserDebugState.Subtype;
1418 Adapter->stDebugState.subtype[sUserDebugState.Type] &= ~sUserDebugState.Subtype;
1420 BCM_SHOW_DEBUG_BITMAP(Adapter);
1424 case IOCTL_BCM_NVM_READ:
1425 case IOCTL_BCM_NVM_WRITE:
1428 NVM_READWRITE stNVMReadWrite = {0};
1429 PUCHAR pReadData = NULL;
1430 PUCHAR pBuffertobeCopied = NULL;
1431 ULONG ulDSDMagicNumInUsrBuff = 0 ;
1432 struct timeval tv0, tv1;
1433 memset(&tv0,0,sizeof(struct timeval));
1434 memset(&tv1,0,sizeof(struct timeval));
1435 if((Adapter->eNVMType == NVM_FLASH) && (Adapter->uiFlashLayoutMajorVersion == 0))
1437 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0,"The Flash Control Section is Corrupted. Hence Rejection on NVM Read/Write\n");
1442 if(IsFlash2x(Adapter))
1444 if((Adapter->eActiveDSD != DSD0) &&
1445 (Adapter->eActiveDSD != DSD1) &&
1446 (Adapter->eActiveDSD != DSD2))
1448 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"No DSD is active..hence NVM Command is blocked");
1449 return STATUS_FAILURE ;
1453 /* Copy Ioctl Buffer structure */
1455 if(copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER)))
1457 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"copy_from_user failed\n");
1461 if(IOCTL_BCM_NVM_READ == cmd)
1462 pBuffertobeCopied = IoBuffer.OutputBuffer;
1464 pBuffertobeCopied = IoBuffer.InputBuffer;
1466 if(copy_from_user(&stNVMReadWrite, pBuffertobeCopied,sizeof(NVM_READWRITE)))
1473 // Deny the access if the offset crosses the cal area limit.
1475 if((stNVMReadWrite.uiOffset + stNVMReadWrite.uiNumBytes) > Adapter->uiNVMDSDSize)
1477 //BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Can't allow access beyond NVM Size: 0x%x 0x%x\n", stNVMReadWrite.uiOffset ,
1478 // stNVMReadWrite.uiNumBytes);
1479 Status = STATUS_FAILURE;
1483 pReadData =(PCHAR)kmalloc(stNVMReadWrite.uiNumBytes, GFP_KERNEL);
1488 memset(pReadData,0,stNVMReadWrite.uiNumBytes);
1490 if(copy_from_user(pReadData, stNVMReadWrite.pBuffer,
1491 stNVMReadWrite.uiNumBytes))
1494 bcm_kfree(pReadData);
1498 do_gettimeofday(&tv0);
1499 if(IOCTL_BCM_NVM_READ == cmd)
1501 down(&Adapter->NVMRdmWrmLock);
1503 if((Adapter->IdleMode == TRUE) ||
1504 (Adapter->bShutStatus ==TRUE) ||
1505 (Adapter->bPreparingForLowPowerMode ==TRUE))
1507 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1508 up(&Adapter->NVMRdmWrmLock);
1509 bcm_kfree(pReadData);
1513 Status = BeceemNVMRead(Adapter, (PUINT)pReadData,
1514 stNVMReadWrite.uiOffset, stNVMReadWrite.uiNumBytes);
1516 up(&Adapter->NVMRdmWrmLock);
1518 if(Status != STATUS_SUCCESS)
1520 bcm_kfree(pReadData);
1523 if(copy_to_user((PCHAR)stNVMReadWrite.pBuffer,
1524 (PCHAR)pReadData, (UINT)stNVMReadWrite.uiNumBytes))
1526 bcm_kfree(pReadData);
1533 down(&Adapter->NVMRdmWrmLock);
1535 if((Adapter->IdleMode == TRUE) ||
1536 (Adapter->bShutStatus ==TRUE) ||
1537 (Adapter->bPreparingForLowPowerMode ==TRUE))
1539 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1540 up(&Adapter->NVMRdmWrmLock);
1541 bcm_kfree(pReadData);
1545 Adapter->bHeaderChangeAllowed = TRUE ;
1546 if(IsFlash2x(Adapter))
1550 DSD section updation will be allowed in two case:-
1551 1. if DSD sig is present in DSD header means dongle is ok and updation is fruitfull
1552 2. if point 1 failes then user buff should have DSD sig. this point ensures that if dongle is
1553 corrupted then user space program first modify the DSD header with valid DSD sig so
1554 that this as well as further write may be worthwhile.
1556 This restriction has been put assuming that if DSD sig is corrupted, DSD
1557 data won't be considered valid.
1561 Status = BcmFlash2xCorruptSig(Adapter,Adapter->eActiveDSD);
1562 if(Status != STATUS_SUCCESS)
1564 if(( (stNVMReadWrite.uiOffset + stNVMReadWrite.uiNumBytes) != Adapter->uiNVMDSDSize ) ||
1565 (stNVMReadWrite.uiNumBytes < SIGNATURE_SIZE))
1567 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"DSD Sig is present neither in Flash nor User provided Input..");
1568 up(&Adapter->NVMRdmWrmLock);
1569 bcm_kfree(pReadData);
1573 ulDSDMagicNumInUsrBuff = ntohl(*(PUINT)(pReadData + stNVMReadWrite.uiNumBytes - SIGNATURE_SIZE));
1574 if(ulDSDMagicNumInUsrBuff != DSD_IMAGE_MAGIC_NUMBER)
1576 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"DSD Sig is present neither in Flash nor User provided Input..");
1577 up(&Adapter->NVMRdmWrmLock);
1578 bcm_kfree(pReadData);
1583 Status = BeceemNVMWrite(Adapter, (PUINT )pReadData,
1584 stNVMReadWrite.uiOffset, stNVMReadWrite.uiNumBytes, stNVMReadWrite.bVerify);
1585 if(IsFlash2x(Adapter))
1586 BcmFlash2xWriteSig(Adapter,Adapter->eActiveDSD);
1588 Adapter->bHeaderChangeAllowed = FALSE ;
1590 up(&Adapter->NVMRdmWrmLock);
1593 if(Status != STATUS_SUCCESS)
1595 bcm_kfree(pReadData);
1599 do_gettimeofday(&tv1);
1600 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);
1603 bcm_kfree(pReadData);
1604 Status = STATUS_SUCCESS;
1607 case IOCTL_BCM_FLASH2X_SECTION_READ :
1610 FLASH2X_READWRITE sFlash2xRead = {0};
1611 PUCHAR pReadBuff = NULL ;
1615 UINT ReadOffset = 0;
1616 PUCHAR OutPutBuff = NULL;
1618 if(IsFlash2x(Adapter) != TRUE)
1620 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
1624 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_FLASH2X_SECTION_READ Called");
1625 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
1628 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
1632 //Reading FLASH 2.x READ structure
1633 Status = copy_from_user((PUCHAR)&sFlash2xRead, (PUCHAR)IoBuffer.InputBuffer,sizeof(FLASH2X_READWRITE));
1636 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of Input Buffer failed");
1641 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.Section :%x" ,sFlash2xRead.Section);
1642 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.offset :%x" ,sFlash2xRead.offset);
1643 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.numOfBytes :%x" ,sFlash2xRead.numOfBytes);
1644 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.bVerify :%x\n" ,sFlash2xRead.bVerify);
1646 //This was internal to driver for raw read. now it has ben exposed to user space app.
1647 if(validateFlash2xReadWrite(Adapter,&sFlash2xRead) == FALSE)
1648 return STATUS_FAILURE ;
1650 NOB = sFlash2xRead.numOfBytes;
1651 if(NOB > Adapter->uiSectorSize )
1652 BuffSize = Adapter->uiSectorSize;
1656 ReadOffset = sFlash2xRead.offset ;
1657 OutPutBuff = (PUCHAR)(IoBuffer.OutputBuffer) ;
1660 pReadBuff = (PCHAR)kzalloc(BuffSize , GFP_KERNEL);
1661 if(pReadBuff == NULL)
1663 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Memory allocation failed for Flash 2.x Read Structure");
1666 down(&Adapter->NVMRdmWrmLock);
1668 if((Adapter->IdleMode == TRUE) ||
1669 (Adapter->bShutStatus ==TRUE) ||
1670 (Adapter->bPreparingForLowPowerMode ==TRUE))
1672 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1673 up(&Adapter->NVMRdmWrmLock);
1674 bcm_kfree(pReadBuff);
1681 if(NOB > Adapter->uiSectorSize )
1682 ReadBytes = Adapter->uiSectorSize;
1687 //Reading the data from Flash 2.x
1689 Status = BcmFlash2xBulkRead(Adapter,(PUINT)pReadBuff,sFlash2xRead.Section,ReadOffset,ReadBytes);
1692 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Flash 2x read err with Status :%d", Status);
1696 BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,pReadBuff, ReadBytes);
1698 Status = copy_to_user(OutPutBuff, pReadBuff,ReadBytes);
1701 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Copy to use failed with status :%d", Status);
1704 NOB = NOB - ReadBytes;
1707 ReadOffset = ReadOffset + ReadBytes ;
1708 OutPutBuff = OutPutBuff + ReadBytes ;
1712 up(&Adapter->NVMRdmWrmLock);
1713 bcm_kfree(pReadBuff);
1717 case IOCTL_BCM_FLASH2X_SECTION_WRITE :
1719 FLASH2X_READWRITE sFlash2xWrite = {0};
1720 PUCHAR pWriteBuff = NULL;
1721 PUCHAR InputAddr = NULL;
1724 UINT WriteOffset = 0;
1725 UINT WriteBytes = 0;
1727 if(IsFlash2x(Adapter) != TRUE)
1729 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
1733 //First make this False so that we can enable the Sector Permission Check in BeceemFlashBulkWrite
1734 Adapter->bAllDSDWriteAllow = FALSE;
1737 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, " IOCTL_BCM_FLASH2X_SECTION_WRITE Called");
1738 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
1741 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
1745 //Reading FLASH 2.x READ structure
1746 Status = copy_from_user((PCHAR)&sFlash2xWrite, (PCHAR)IoBuffer.InputBuffer, sizeof(FLASH2X_READWRITE));
1749 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Reading of output Buffer from IOCTL buffer fails");
1753 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.Section :%x" ,sFlash2xWrite.Section);
1754 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.offset :%d" ,sFlash2xWrite.offset);
1755 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.numOfBytes :%x" ,sFlash2xWrite.numOfBytes);
1756 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\nsFlash2xRead.bVerify :%x\n" ,sFlash2xWrite.bVerify);
1758 if((sFlash2xWrite.Section == ISO_IMAGE1) ||(sFlash2xWrite.Section == ISO_IMAGE2) ||
1759 (sFlash2xWrite.Section == DSD0) || (sFlash2xWrite.Section == DSD1) || (sFlash2xWrite.Section == DSD2))
1761 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"ISO/DSD Image write is not allowed.... ");
1762 return STATUS_FAILURE ;
1765 if((sFlash2xWrite.Section != VSA0) && (sFlash2xWrite.Section != VSA1) &&
1766 (sFlash2xWrite.Section != VSA2) )
1768 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Only VSA write is allowed");
1772 if(validateFlash2xReadWrite(Adapter,&sFlash2xWrite) == FALSE)
1773 return STATUS_FAILURE ;
1775 InputAddr = (PCHAR)(sFlash2xWrite.pDataBuff) ;
1776 WriteOffset = sFlash2xWrite.offset ;
1777 NOB = sFlash2xWrite.numOfBytes;
1779 if(NOB > Adapter->uiSectorSize )
1780 BuffSize = Adapter->uiSectorSize;
1784 pWriteBuff = (PCHAR)kmalloc(BuffSize, GFP_KERNEL);
1785 if(pWriteBuff == NULL)
1787 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Memory allocation failed for Flash 2.x Read Structure");
1791 //extracting the remainder of the given offset.
1792 WriteBytes = Adapter->uiSectorSize ;
1793 if(WriteOffset % Adapter->uiSectorSize)
1794 WriteBytes =Adapter->uiSectorSize - (WriteOffset % Adapter->uiSectorSize);
1795 if(NOB < WriteBytes)
1798 down(&Adapter->NVMRdmWrmLock);
1800 if((Adapter->IdleMode == TRUE) ||
1801 (Adapter->bShutStatus ==TRUE) ||
1802 (Adapter->bPreparingForLowPowerMode ==TRUE))
1804 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1805 up(&Adapter->NVMRdmWrmLock);
1806 bcm_kfree(pWriteBuff);
1810 BcmFlash2xCorruptSig(Adapter,sFlash2xWrite.Section);
1813 Status = copy_from_user(pWriteBuff,InputAddr,WriteBytes);
1816 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Copy to user failed with status :%d", Status);
1819 BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,pWriteBuff,WriteBytes);
1820 //Writing the data from Flash 2.x
1821 Status = BcmFlash2xBulkWrite(Adapter,(PUINT)pWriteBuff,sFlash2xWrite.Section,WriteOffset,WriteBytes,sFlash2xWrite.bVerify);
1825 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash 2x read err with Status :%d", Status);
1829 NOB = NOB - WriteBytes;
1832 WriteOffset = WriteOffset + WriteBytes ;
1833 InputAddr = InputAddr + WriteBytes ;
1834 if(NOB > Adapter->uiSectorSize )
1835 WriteBytes = Adapter->uiSectorSize;
1842 BcmFlash2xWriteSig(Adapter,sFlash2xWrite.Section);
1843 up(&Adapter->NVMRdmWrmLock);
1844 bcm_kfree(pWriteBuff);
1847 case IOCTL_BCM_GET_FLASH2X_SECTION_BITMAP :
1850 PFLASH2X_BITMAP psFlash2xBitMap = NULL ;
1851 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_GET_FLASH2X_SECTION_BITMAP Called");
1853 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
1856 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
1859 if(IoBuffer.OutputLength != sizeof(FLASH2X_BITMAP))
1861 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Structure size mismatch Lib :0x%lx Driver :0x%zx ",IoBuffer.OutputLength, sizeof(FLASH2X_BITMAP));
1865 psFlash2xBitMap = (PFLASH2X_BITMAP)kzalloc(sizeof(FLASH2X_BITMAP), GFP_KERNEL);
1866 if(psFlash2xBitMap == NULL)
1868 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Memory is not available");
1871 //Reading the Flash Sectio Bit map
1872 down(&Adapter->NVMRdmWrmLock);
1874 if((Adapter->IdleMode == TRUE) ||
1875 (Adapter->bShutStatus ==TRUE) ||
1876 (Adapter->bPreparingForLowPowerMode ==TRUE))
1878 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1879 up(&Adapter->NVMRdmWrmLock);
1880 bcm_kfree(psFlash2xBitMap);
1884 BcmGetFlash2xSectionalBitMap(Adapter, psFlash2xBitMap);
1885 up(&Adapter->NVMRdmWrmLock);
1886 Status = copy_to_user((PCHAR)IoBuffer.OutputBuffer, (PCHAR)psFlash2xBitMap, sizeof(FLASH2X_BITMAP));
1889 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copying Flash2x bitMap failed");
1890 bcm_kfree(psFlash2xBitMap);
1893 bcm_kfree(psFlash2xBitMap);
1896 case IOCTL_BCM_SET_ACTIVE_SECTION :
1898 FLASH2X_SECTION_VAL eFlash2xSectionVal = 0;
1899 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_SET_ACTIVE_SECTION Called");
1901 if(IsFlash2x(Adapter) != TRUE)
1903 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
1907 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
1910 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
1914 Status = copy_from_user((PCHAR)&eFlash2xSectionVal,(PCHAR)IoBuffer.InputBuffer, sizeof(INT));
1917 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of flash section val failed");
1921 down(&Adapter->NVMRdmWrmLock);
1923 if((Adapter->IdleMode == TRUE) ||
1924 (Adapter->bShutStatus ==TRUE) ||
1925 (Adapter->bPreparingForLowPowerMode ==TRUE))
1927 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
1928 up(&Adapter->NVMRdmWrmLock);
1932 Status = BcmSetActiveSection(Adapter,eFlash2xSectionVal);
1935 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Failed to make it's priority Highest. Status %d", Status);
1937 up(&Adapter->NVMRdmWrmLock);
1940 case IOCTL_BCM_IDENTIFY_ACTIVE_SECTION :
1942 //Right Now we are taking care of only DSD
1943 Adapter->bAllDSDWriteAllow = FALSE ;
1944 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"IOCTL_BCM_IDENTIFY_ACTIVE_SECTION called");
1947 SECTION_TYPE section = 0 ;
1950 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_IDENTIFY_ACTIVE_SECTION Called");
1951 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
1954 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Copy of IOCTL BUFFER failed");
1957 Status = copy_from_user((PCHAR)section,(PCHAR)&IoBuffer, sizeof(INT));
1960 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Copy of section type failed failed");
1963 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Read Section :%d", section);
1965 Adapter->ulFlashCalStart = Adapter->uiActiveDSDOffsetAtFwDld ;
1967 Status = STATUS_FAILURE ;
1969 Status = STATUS_SUCCESS ;
1972 case IOCTL_BCM_COPY_SECTION :
1974 FLASH2X_COPY_SECTION sCopySectStrut = {0};
1975 Status = STATUS_SUCCESS;
1976 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_COPY_SECTION Called");
1978 Adapter->bAllDSDWriteAllow = FALSE ;
1979 if(IsFlash2x(Adapter) != TRUE)
1981 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
1985 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
1988 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed Status :%d", Status);
1992 Status = copy_from_user((PCHAR)&sCopySectStrut,(PCHAR)IoBuffer.InputBuffer, sizeof(FLASH2X_COPY_SECTION));
1995 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of Copy_Section_Struct failed with Status :%d", Status);
1998 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Source SEction :%x", sCopySectStrut.SrcSection);
1999 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Destination SEction :%x", sCopySectStrut.DstSection);
2000 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "offset :%x", sCopySectStrut.offset);
2001 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "NOB :%x", sCopySectStrut.numOfBytes);
2004 if(IsSectionExistInFlash(Adapter,sCopySectStrut.SrcSection) == FALSE)
2006 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Source Section<%x> does not exixt in Flash ", sCopySectStrut.SrcSection);
2010 if(IsSectionExistInFlash(Adapter,sCopySectStrut.DstSection) == FALSE)
2012 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Destinatio Section<%x> does not exixt in Flash ", sCopySectStrut.DstSection);
2016 if(sCopySectStrut.SrcSection == sCopySectStrut.DstSection)
2018 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Source and Destination section should be different");
2022 down(&Adapter->NVMRdmWrmLock);
2024 if((Adapter->IdleMode == TRUE) ||
2025 (Adapter->bShutStatus ==TRUE) ||
2026 (Adapter->bPreparingForLowPowerMode ==TRUE))
2028 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
2029 up(&Adapter->NVMRdmWrmLock);
2033 if(sCopySectStrut.SrcSection == ISO_IMAGE1 || sCopySectStrut.SrcSection == ISO_IMAGE2)
2035 if(IsNonCDLessDevice(Adapter))
2037 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Device is Non-CDLess hence won't have ISO !!");
2040 else if(sCopySectStrut.numOfBytes == 0)
2042 Status = BcmCopyISO(Adapter,sCopySectStrut);
2046 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Partial Copy of ISO section is not Allowed..");
2047 Status = STATUS_FAILURE ;
2049 up(&Adapter->NVMRdmWrmLock);
2053 Status = BcmCopySection(Adapter, sCopySectStrut.SrcSection,
2054 sCopySectStrut.DstSection,sCopySectStrut.offset,sCopySectStrut.numOfBytes);
2055 up(&Adapter->NVMRdmWrmLock);
2058 case IOCTL_BCM_GET_FLASH_CS_INFO :
2060 Status = STATUS_SUCCESS;
2061 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, " IOCTL_BCM_GET_FLASH_CS_INFO Called");
2063 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
2066 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
2069 if(Adapter->eNVMType != NVM_FLASH)
2071 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Connected device does not have flash");
2075 if(IsFlash2x(Adapter) == TRUE)
2078 if(IoBuffer.OutputLength < sizeof(FLASH2X_CS_INFO))
2080 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));
2085 Status = copy_to_user((PCHAR)IoBuffer.OutputBuffer, (PCHAR)Adapter->psFlash2xCSInfo, sizeof(FLASH2X_CS_INFO));
2088 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copying Flash2x cs info failed");
2094 if(IoBuffer.OutputLength < sizeof(FLASH_CS_INFO))
2096 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));
2100 Status = copy_to_user((PCHAR)IoBuffer.OutputBuffer, (PCHAR)Adapter->psFlashCSInfo, sizeof(FLASH_CS_INFO));
2103 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copying Flash CS info failed");
2110 case IOCTL_BCM_SELECT_DSD :
2113 FLASH2X_SECTION_VAL eFlash2xSectionVal;
2114 eFlash2xSectionVal = NO_SECTION_VAL ;
2115 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, " IOCTL_BCM_SELECT_DSD Called");
2117 if(IsFlash2x(Adapter) != TRUE)
2119 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash Does not have 2.x map");
2123 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
2126 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
2129 Status = copy_from_user((PCHAR)&eFlash2xSectionVal,(PCHAR)IoBuffer.InputBuffer, sizeof(INT));
2132 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of flash section val failed");
2136 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Read Section :%d", eFlash2xSectionVal);
2137 if((eFlash2xSectionVal != DSD0) &&
2138 (eFlash2xSectionVal != DSD1) &&
2139 (eFlash2xSectionVal != DSD2) )
2141 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Passed section<%x> is not DSD section", eFlash2xSectionVal);
2142 return STATUS_FAILURE ;
2145 SectOfset= BcmGetSectionValStartOffset(Adapter,eFlash2xSectionVal);
2146 if(SectOfset == INVALID_OFFSET)
2148 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Provided Section val <%d> does not exixt in Flash 2.x", eFlash2xSectionVal);
2152 Adapter->bAllDSDWriteAllow = TRUE ;
2154 Adapter->ulFlashCalStart = SectOfset ;
2155 Adapter->eActiveDSD = eFlash2xSectionVal;
2157 Status = STATUS_SUCCESS ;
2160 case IOCTL_BCM_NVM_RAW_READ :
2163 NVM_READWRITE stNVMRead = {0};
2167 UINT ReadBytes = 0 ;
2168 PUCHAR pReadBuff = NULL ;
2169 PUCHAR OutPutBuff = NULL ;
2171 if(Adapter->eNVMType != NVM_FLASH)
2173 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"NVM TYPE is not Flash ");
2177 /* Copy Ioctl Buffer structure */
2178 if(copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER)))
2180 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copy_from_user 1 failed\n");
2185 if(copy_from_user(&stNVMRead, (PUCHAR)IoBuffer.OutputBuffer,sizeof(NVM_READWRITE)))
2191 NOB = stNVMRead.uiNumBytes;
2192 //In Raw-Read max Buff size : 64MB
2194 if(NOB > DEFAULT_BUFF_SIZE)
2195 BuffSize = DEFAULT_BUFF_SIZE;
2199 ReadOffset = stNVMRead.uiOffset ;
2200 OutPutBuff = (PUCHAR)(stNVMRead.pBuffer) ;
2203 pReadBuff = (PCHAR)kzalloc(BuffSize , GFP_KERNEL);
2204 if(pReadBuff == NULL)
2206 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Memory allocation failed for Flash 2.x Read Structure");
2210 down(&Adapter->NVMRdmWrmLock);
2212 if((Adapter->IdleMode == TRUE) ||
2213 (Adapter->bShutStatus ==TRUE) ||
2214 (Adapter->bPreparingForLowPowerMode ==TRUE))
2216 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Device is in Idle/Shutdown Mode\n");
2217 bcm_kfree(pReadBuff);
2218 up(&Adapter->NVMRdmWrmLock);
2222 Adapter->bFlashRawRead = TRUE ;
2225 if(NOB > DEFAULT_BUFF_SIZE )
2226 ReadBytes = DEFAULT_BUFF_SIZE;
2230 //Reading the data from Flash 2.x
2231 Status = BeceemNVMRead(Adapter,(PUINT)pReadBuff,ReadOffset,ReadBytes);
2234 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Flash 2x read err with Status :%d", Status);
2238 BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,pReadBuff, ReadBytes);
2240 Status = copy_to_user(OutPutBuff, pReadBuff,ReadBytes);
2243 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Copy to use failed with status :%d", Status);
2246 NOB = NOB - ReadBytes;
2249 ReadOffset = ReadOffset + ReadBytes ;
2250 OutPutBuff = OutPutBuff + ReadBytes ;
2254 Adapter->bFlashRawRead = FALSE ;
2255 up(&Adapter->NVMRdmWrmLock);
2256 bcm_kfree(pReadBuff);
2260 case IOCTL_BCM_CNTRLMSG_MASK:
2262 ULONG RxCntrlMsgBitMask = 0 ;
2264 /* Copy Ioctl Buffer structure */
2265 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
2268 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"copy of Ioctl buffer is failed from user space");
2272 Status = copy_from_user(&RxCntrlMsgBitMask, IoBuffer.InputBuffer, IoBuffer.InputLength);
2275 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"copy of control bit mask failed from user space");
2278 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"\n Got user defined cntrl msg bit mask :%lx", RxCntrlMsgBitMask);
2279 pTarang->RxCntrlMsgBitMask = RxCntrlMsgBitMask ;
2282 case IOCTL_BCM_GET_DEVICE_DRIVER_INFO:
2284 DEVICE_DRIVER_INFO DevInfo;
2286 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"Called IOCTL_BCM_GET_DEVICE_DRIVER_INFO\n");
2288 DevInfo.MaxRDMBufferSize = BUFFER_4K;
2289 DevInfo.u32DSDStartOffset = EEPROM_CALPARAM_START;
2290 DevInfo.u32RxAlignmentCorrection = 0;
2291 DevInfo.u32NVMType = Adapter->eNVMType;
2292 DevInfo.u32InterfaceType = BCM_USB;
2294 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
2297 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
2300 if(IoBuffer.OutputLength < sizeof(DevInfo))
2302 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"User Passed buffer length is less than actural buffer size");
2303 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"user passed buffer size :0x%lX, expected size :0x%zx",IoBuffer.OutputLength, sizeof(DevInfo));
2307 Status = copy_to_user((PCHAR)IoBuffer.OutputBuffer, (PCHAR)&DevInfo, sizeof(DevInfo));
2310 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"copying Dev info structure to user space buffer failed");
2316 case IOCTL_BCM_TIME_SINCE_NET_ENTRY:
2318 ST_TIME_ELAPSED stTimeElapsedSinceNetEntry = {0};
2319 struct timeval tv = {0} ;
2321 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,"IOCTL_BCM_TIME_SINCE_NET_ENTRY called");
2323 Status = copy_from_user((PCHAR)&IoBuffer, (PCHAR)arg, sizeof(IOCTL_BUFFER));
2326 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed");
2329 if(IoBuffer.OutputLength < sizeof(ST_TIME_ELAPSED))
2331 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));
2336 //stTimeElapsedSinceNetEntry.ul64TimeElapsedSinceNetEntry = Adapter->liTimeSinceLastNetEntry;
2337 do_gettimeofday(&tv);
2338 stTimeElapsedSinceNetEntry.ul64TimeElapsedSinceNetEntry = tv.tv_sec - Adapter->liTimeSinceLastNetEntry;
2340 Status = copy_to_user((PCHAR)IoBuffer.OutputBuffer, (PCHAR)&stTimeElapsedSinceNetEntry, sizeof(ST_TIME_ELAPSED));
2343 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"copying ST_TIME_ELAPSED structure to user space buffer failed");
2351 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "wrong input %x",cmd);
2352 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "In default ioctl %d\n", cmd);
2353 Status = STATUS_FAILURE;
2361 static struct file_operations bcm_fops = {
2362 .owner = THIS_MODULE,
2363 .open = bcm_char_open,
2364 .release = bcm_char_release,
2365 .read = bcm_char_read,
2366 .unlocked_ioctl = bcm_char_ioctl,
2367 .llseek = no_llseek,
2371 int register_control_device_interface(PMINI_ADAPTER Adapter)
2373 if(Adapter->major>0)
2374 return Adapter->major;
2375 Adapter->major = register_chrdev(0, "tarang", &bcm_fops);
2376 if(Adapter->major < 0)
2378 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "register_chrdev:Failed to registering WiMax control char device!");
2379 return Adapter->major;
2383 bcm_class = class_create (THIS_MODULE, "tarang");
2384 if(IS_ERR (bcm_class))
2386 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Unable to create class\n");
2387 unregister_chrdev(Adapter->major, "tarang");
2391 Adapter->pstCreatedClassDevice = device_create (bcm_class, NULL,
2392 MKDEV(Adapter->major, 0),
2393 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,26)
2398 if(IS_ERR(Adapter->pstCreatedClassDevice))
2400 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "class device did not get created : %ld", PTR_ERR(Adapter->pstCreatedClassDevice) );
2402 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Got Major No: %d", Adapter->major);
2406 void unregister_control_device_interface(PMINI_ADAPTER Adapter)
2408 if(Adapter->major > 0)
2410 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "destroying class device");
2411 device_destroy (bcm_class, MKDEV(Adapter->major, 0));
2413 if(!IS_ERR(bcm_class))
2415 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "destroying created class ");
2416 class_destroy (bcm_class);
2419 if(Adapter->major > 0)
2421 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL,"unregistering character interface");
2422 unregister_chrdev(Adapter->major, "tarang");