4 static void read_int_callback(struct urb
*urb
/*, struct pt_regs *regs*/)
6 int status
= urb
->status
;
7 struct bcm_interface_adapter
*psIntfAdapter
= (struct bcm_interface_adapter
*)urb
->context
;
8 struct bcm_mini_adapter
*Adapter
= psIntfAdapter
->psAdapter
;
10 if (netif_msg_intr(Adapter
))
11 pr_info(PFX
"%s: interrupt status %d\n",
12 Adapter
->dev
->name
, status
);
14 if(Adapter
->device_removed
== TRUE
)
16 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_OTHERS
, INTF_INIT
, DBG_LVL_ALL
,"Device has Got Removed.");
20 if(((Adapter
->bPreparingForLowPowerMode
== TRUE
) && (Adapter
->bDoSuspend
== TRUE
)) ||
21 psIntfAdapter
->bSuspended
||
22 psIntfAdapter
->bPreparingForBusSuspend
)
24 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_OTHERS
, INTF_INIT
, DBG_LVL_ALL
,"Interrupt call back is called while suspending the device");
28 //BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, "interrupt urb status %d", status);
32 if ( urb
->actual_length
)
35 if(psIntfAdapter
->ulInterruptData
[1] & 0xFF)
37 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_OTHERS
, INTF_INIT
, DBG_LVL_ALL
, "Got USIM interrupt");
40 if(psIntfAdapter
->ulInterruptData
[1] & 0xFF00)
42 atomic_set(&Adapter
->CurrNumFreeTxDesc
,
43 (psIntfAdapter
->ulInterruptData
[1] & 0xFF00) >> 8);
44 atomic_set (&Adapter
->uiMBupdate
, TRUE
);
45 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_OTHERS
, INTF_INIT
, DBG_LVL_ALL
, "TX mailbox contains %d",
46 atomic_read(&Adapter
->CurrNumFreeTxDesc
));
48 if(psIntfAdapter
->ulInterruptData
[1] >> 16)
50 Adapter
->CurrNumRecvDescs
=
51 (psIntfAdapter
->ulInterruptData
[1] >> 16);
52 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_OTHERS
, INTF_INIT
, DBG_LVL_ALL
,"RX mailbox contains %d",
53 Adapter
->CurrNumRecvDescs
);
54 InterfaceRx(psIntfAdapter
);
56 if(Adapter
->fw_download_done
&&
57 !Adapter
->downloadDDR
&&
58 atomic_read(&Adapter
->CurrNumFreeTxDesc
))
60 psIntfAdapter
->psAdapter
->downloadDDR
+=1;
61 wake_up(&Adapter
->tx_packet_wait_queue
);
63 if(false == Adapter
->waiting_to_fw_download_done
)
65 Adapter
->waiting_to_fw_download_done
= TRUE
;
66 wake_up(&Adapter
->ioctl_fw_dnld_wait_queue
);
68 if(!atomic_read(&Adapter
->TxPktAvail
))
70 atomic_set(&Adapter
->TxPktAvail
, 1);
71 wake_up(&Adapter
->tx_packet_wait_queue
);
73 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_OTHERS
, INTF_INIT
, DBG_LVL_ALL
,"Firing interrupt in URB");
78 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_OTHERS
, INTF_INIT
, DBG_LVL_ALL
,"URB has got disconnected ....");
83 //This situation may happened when URBunlink is used. for detail check usb_unlink_urb documentation.
84 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_OTHERS
, INTF_INIT
, DBG_LVL_ALL
,"Impossibe condition has occurred... something very bad is going on");
90 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_OTHERS
, INTF_INIT
, DBG_LVL_ALL
,"Interrupt IN endPoint has got halted/stalled...need to clear this");
91 Adapter
->bEndPointHalted
= TRUE
;
92 wake_up(&Adapter
->tx_packet_wait_queue
);
93 urb
->status
= STATUS_SUCCESS
;
96 /* software-driven interface shutdown */
97 case -ECONNRESET
: //URB got unlinked.
98 case -ESHUTDOWN
: // hardware gone. this is the serious problem.
99 //Occurs only when something happens with the host controller device
100 case -ENODEV
: //Device got removed
101 case -EINVAL
: //Some thing very bad happened with the URB. No description is available.
102 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_OTHERS
, INTF_INIT
, DBG_LVL_ALL
,"interrupt urb error %d", status
);
103 urb
->status
= STATUS_SUCCESS
;
107 //This is required to check what is the defaults conditions when it occurs..
108 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_TX
, NEXT_SEND
, DBG_LVL_ALL
,"GOT DEFAULT INTERRUPT URB STATUS :%d..Please Analyze it...", status
);
112 StartInterruptUrb(psIntfAdapter
);
117 int CreateInterruptUrb(struct bcm_interface_adapter
*psIntfAdapter
)
119 psIntfAdapter
->psInterruptUrb
= usb_alloc_urb(0, GFP_KERNEL
);
120 if (!psIntfAdapter
->psInterruptUrb
)
122 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
,DBG_TYPE_OTHERS
, INTF_INIT
, DBG_LVL_ALL
,"Cannot allocate interrupt urb");
125 psIntfAdapter
->psInterruptUrb
->transfer_buffer
=
126 psIntfAdapter
->ulInterruptData
;
127 psIntfAdapter
->psInterruptUrb
->transfer_buffer_length
=
128 sizeof(psIntfAdapter
->ulInterruptData
);
130 psIntfAdapter
->sIntrIn
.int_in_pipe
= usb_rcvintpipe(psIntfAdapter
->udev
,
131 psIntfAdapter
->sIntrIn
.int_in_endpointAddr
);
133 usb_fill_int_urb(psIntfAdapter
->psInterruptUrb
, psIntfAdapter
->udev
,
134 psIntfAdapter
->sIntrIn
.int_in_pipe
,
135 psIntfAdapter
->psInterruptUrb
->transfer_buffer
,
136 psIntfAdapter
->psInterruptUrb
->transfer_buffer_length
,
137 read_int_callback
, psIntfAdapter
,
138 psIntfAdapter
->sIntrIn
.int_in_interval
);
140 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
,DBG_TYPE_OTHERS
, INTF_INIT
, DBG_LVL_ALL
,"Interrupt Interval: %d\n",
141 psIntfAdapter
->sIntrIn
.int_in_interval
);
146 INT
StartInterruptUrb(struct bcm_interface_adapter
*psIntfAdapter
)
150 if( false == psIntfAdapter
->psAdapter
->device_removed
&&
151 false == psIntfAdapter
->psAdapter
->bEndPointHalted
&&
152 false == psIntfAdapter
->bSuspended
&&
153 false == psIntfAdapter
->bPreparingForBusSuspend
&&
154 false == psIntfAdapter
->psAdapter
->StopAllXaction
)
156 status
= usb_submit_urb(psIntfAdapter
->psInterruptUrb
, GFP_ATOMIC
);
159 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
,DBG_TYPE_OTHERS
, INTF_INIT
, DBG_LVL_ALL
,"Cannot send int urb %d\n", status
);
162 psIntfAdapter
->psAdapter
->bEndPointHalted
= TRUE
;
163 wake_up(&psIntfAdapter
->psAdapter
->tx_packet_wait_queue
);