2 @file HandleControlPacket.c
3 This file contains the routines to deal with
4 sending and receiving of control packets.
9 When a control packet is received, analyze the
10 "status" and call appropriate response function.
11 Enqueue the control packet for Application.
14 VOID handle_rx_control_packet(PMINI_ADAPTER Adapter, /**<Pointer to the Adapter structure*/
15 struct sk_buff *skb) /**<Pointer to the socket buffer*/
17 PPER_TARANG_DATA pTarang = NULL;
18 BOOLEAN HighPriorityMessage = FALSE;
19 struct sk_buff * newPacket = NULL;
20 CHAR cntrl_msg_mask_bit = 0;
21 BOOLEAN drop_pkt_flag = TRUE ;
22 USHORT usStatus = *(PUSHORT)(skb->data);
23 BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "=====>");
24 /* Get the Leader field */
28 case CM_RESPONSES: // 0xA0
29 BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "MAC Version Seems to be Non Multi-Classifier, rejected by Driver");
30 HighPriorityMessage = TRUE ;
32 case CM_CONTROL_NEWDSX_MULTICLASSIFIER_RESP:
33 HighPriorityMessage = TRUE ;
34 if(Adapter->LinkStatus==LINKUP_DONE)
36 CmControlResponseMessage(Adapter,(skb->data +sizeof(USHORT)));
39 case LINK_CONTROL_RESP: //0xA2
40 case STATUS_RSP: //0xA1
41 BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL,"LINK_CONTROL_RESP");
42 HighPriorityMessage = TRUE ;
43 LinkControlResponseMessage(Adapter,(skb->data + sizeof(USHORT)));
45 case STATS_POINTER_RESP: //0xA6
46 HighPriorityMessage = TRUE ;
47 StatisticsResponse(Adapter, (skb->data + sizeof(USHORT)));
49 case IDLE_MODE_STATUS: //0xA3
50 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL,"IDLE_MODE_STATUS Type Message Got from F/W");
51 InterfaceIdleModeRespond(Adapter, (PUINT)(skb->data +
53 HighPriorityMessage = TRUE ;
56 case AUTH_SS_HOST_MSG:
57 HighPriorityMessage = TRUE ;
61 BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL,"Got Default Response");
62 /* Let the Application Deal with This Packet */
66 //Queue The Control Packet to The Application Queues
67 down(&Adapter->RxAppControlQueuelock);
69 for (pTarang = Adapter->pTarangs; pTarang; pTarang = pTarang->next)
71 if(Adapter->device_removed)
76 drop_pkt_flag = TRUE ;
78 There are cntrl msg from A0 to AC. It has been mapped to 0 to C bit in the cntrl mask.
79 Also, by default AD to BF has been masked to the rest of the bits... which wil be ON by default.
80 if mask bit is enable to particular pkt status, send it out to app else stop it.
82 cntrl_msg_mask_bit = (usStatus & 0x1F);
83 //printk("\ninew msg mask bit which is disable in mask:%X", cntrl_msg_mask_bit);
84 if(pTarang->RxCntrlMsgBitMask & (1<<cntrl_msg_mask_bit))
85 drop_pkt_flag = FALSE;
87 if ((drop_pkt_flag == TRUE) || (pTarang->AppCtrlQueueLen > MAX_APP_QUEUE_LEN) ||
88 ((pTarang->AppCtrlQueueLen > MAX_APP_QUEUE_LEN/2) && (HighPriorityMessage == FALSE)))
92 1. every tarang manages it own dropped pkt statitistics
93 2. Total packet dropped per tarang will be equal to the sum of all types of dropped
94 pkt by that tarang only.
97 switch(*(PUSHORT)skb->data)
100 pTarang->stDroppedAppCntrlMsgs.cm_responses++;
102 case CM_CONTROL_NEWDSX_MULTICLASSIFIER_RESP:
103 pTarang->stDroppedAppCntrlMsgs.cm_control_newdsx_multiclassifier_resp++;
105 case LINK_CONTROL_RESP:
106 pTarang->stDroppedAppCntrlMsgs.link_control_resp++;
109 pTarang->stDroppedAppCntrlMsgs.status_rsp++;
111 case STATS_POINTER_RESP:
112 pTarang->stDroppedAppCntrlMsgs.stats_pointer_resp++;
114 case IDLE_MODE_STATUS:
115 pTarang->stDroppedAppCntrlMsgs.idle_mode_status++ ;
117 case AUTH_SS_HOST_MSG:
118 pTarang->stDroppedAppCntrlMsgs.auth_ss_host_msg++ ;
121 pTarang->stDroppedAppCntrlMsgs.low_priority_message++ ;
128 newPacket = skb_clone(skb, GFP_KERNEL);
131 ENQUEUEPACKET(pTarang->RxAppControlHead,pTarang->RxAppControlTail,
133 pTarang->AppCtrlQueueLen++;
135 up(&Adapter->RxAppControlQueuelock);
136 wake_up(&Adapter->process_read_wait_queue);
138 BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "After wake_up_interruptible");
142 @ingroup ctrl_pkt_functions
143 Thread to handle control pkt reception
145 int control_packet_handler (PMINI_ADAPTER Adapter /**< pointer to adapter object*/
148 struct sk_buff *ctrl_packet= NULL;
149 unsigned long flags = 0;
150 //struct timeval tv ;
151 //int *puiBuffer = NULL ;
152 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "Entering to make thread wait on control packet event!");
155 wait_event_interruptible(Adapter->process_rx_cntrlpkt,
156 atomic_read(&Adapter->cntrlpktCnt) ||
157 Adapter->bWakeUpDevice ||
158 kthread_should_stop()
162 if(kthread_should_stop())
164 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "Exiting \n");
167 if(TRUE == Adapter->bWakeUpDevice)
169 Adapter->bWakeUpDevice = FALSE;
170 if((FALSE == Adapter->bTriedToWakeUpFromlowPowerMode) &&
171 ((TRUE == Adapter->IdleMode)|| (TRUE == Adapter->bShutStatus)))
173 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "Calling InterfaceAbortIdlemode\n");
174 // Adapter->bTriedToWakeUpFromlowPowerMode = TRUE;
175 InterfaceIdleModeWakeup (Adapter);
180 while(atomic_read(&Adapter->cntrlpktCnt))
182 spin_lock_irqsave(&Adapter->control_queue_lock, flags);
183 ctrl_packet = Adapter->RxControlHead;
186 DEQUEUEPACKET(Adapter->RxControlHead,Adapter->RxControlTail);
187 // Adapter->RxControlHead=ctrl_packet->next;
190 spin_unlock_irqrestore (&Adapter->control_queue_lock, flags);
191 handle_rx_control_packet(Adapter, ctrl_packet);
192 atomic_dec(&Adapter->cntrlpktCnt);
195 SetUpTargetDsxBuffers(Adapter);
197 return STATUS_SUCCESS;
200 INT flushAllAppQ(void)
202 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
203 PPER_TARANG_DATA pTarang = NULL;
204 struct sk_buff *PacketToDrop = NULL;
205 for(pTarang = Adapter->pTarangs; pTarang; pTarang = pTarang->next)
207 while(pTarang->RxAppControlHead != NULL)
209 PacketToDrop=pTarang->RxAppControlHead;
210 DEQUEUEPACKET(pTarang->RxAppControlHead,pTarang->RxAppControlTail);
211 dev_kfree_skb(PacketToDrop);
213 pTarang->AppCtrlQueueLen = 0;
214 //dropped contrl packet statistics also should be reset.
215 memset((PVOID)&pTarang->stDroppedAppCntrlMsgs, 0, sizeof(S_MIBS_DROPPED_APP_CNTRL_MESSAGES));
218 return STATUS_SUCCESS ;