Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
staging
bcm
InterfaceIsr.c
Go to the documentation of this file.
1
#include "
headers.h
"
2
3
4
static
void
read_int_callback(
struct
urb
*
urb
/*, struct pt_regs *regs*/
)
5
{
6
int
status
= urb->status;
7
PS_INTERFACE_ADAPTER
psIntfAdapter = (
PS_INTERFACE_ADAPTER
)urb->context;
8
struct
bcm_mini_adapter
*
Adapter
= psIntfAdapter->
psAdapter
;
9
10
if
(
netif_msg_intr
(
Adapter
))
11
pr_info
(
PFX
"%s: interrupt status %d\n"
,
12
Adapter
->dev->
name
, status);
13
14
if
(
Adapter
->device_removed ==
TRUE
)
15
{
16
BCM_DEBUG_PRINT
(
Adapter
,
DBG_TYPE_OTHERS
,
INTF_INIT
,
DBG_LVL_ALL
,
"Device has Got Removed."
);
17
return
;
18
}
19
20
if
(((
Adapter
->bPreparingForLowPowerMode ==
TRUE
) && (
Adapter
->bDoSuspend ==
TRUE
)) ||
21
psIntfAdapter->
bSuspended
||
22
psIntfAdapter->
bPreparingForBusSuspend
)
23
{
24
BCM_DEBUG_PRINT
(
Adapter
,
DBG_TYPE_OTHERS
,
INTF_INIT
,
DBG_LVL_ALL
,
"Interrupt call back is called while suspending the device"
);
25
return
;
26
}
27
28
//BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, "interrupt urb status %d", status);
29
switch
(status) {
30
/* success */
31
case
STATUS_SUCCESS
:
32
if
( urb->actual_length )
33
{
34
35
if
(psIntfAdapter->
ulInterruptData
[1] & 0xFF)
36
{
37
BCM_DEBUG_PRINT
(
Adapter
,
DBG_TYPE_OTHERS
,
INTF_INIT
,
DBG_LVL_ALL
,
"Got USIM interrupt"
);
38
}
39
40
if
(psIntfAdapter->
ulInterruptData
[1] & 0xFF00)
41
{
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));
47
}
48
if
(psIntfAdapter->
ulInterruptData
[1] >> 16)
49
{
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);
55
}
56
if
(
Adapter
->fw_download_done &&
57
!
Adapter
->downloadDDR &&
58
atomic_read
(&
Adapter
->CurrNumFreeTxDesc))
59
{
60
psIntfAdapter->
psAdapter
->downloadDDR +=1;
61
wake_up
(&
Adapter
->tx_packet_wait_queue);
62
}
63
if
(
FALSE
==
Adapter
->waiting_to_fw_download_done)
64
{
65
Adapter
->waiting_to_fw_download_done =
TRUE
;
66
wake_up
(&
Adapter
->ioctl_fw_dnld_wait_queue);
67
}
68
if
(!
atomic_read
(&
Adapter
->TxPktAvail))
69
{
70
atomic_set
(&
Adapter
->TxPktAvail, 1);
71
wake_up
(&
Adapter
->tx_packet_wait_queue);
72
}
73
BCM_DEBUG_PRINT
(
Adapter
,
DBG_TYPE_OTHERS
,
INTF_INIT
,
DBG_LVL_ALL
,
"Firing interrupt in URB"
);
74
}
75
break
;
76
case
-
ENOENT
:
77
{
78
BCM_DEBUG_PRINT
(
Adapter
,
DBG_TYPE_OTHERS
,
INTF_INIT
,
DBG_LVL_ALL
,
"URB has got disconnected ...."
);
79
return
;
80
}
81
case
-
EINPROGRESS
:
82
{
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"
);
85
break ;
86
//return;
87
}
88
case
-
EPIPE
:
89
{
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
;
94
return
;
95
}
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
;
104
break ;
105
//return;
106
default
:
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);
109
break
;
110
}
111
112
StartInterruptUrb
(psIntfAdapter);
113
114
115
}
116
117
int
CreateInterruptUrb
(
PS_INTERFACE_ADAPTER
psIntfAdapter)
118
{
119
psIntfAdapter->
psInterruptUrb
=
usb_alloc_urb
(0,
GFP_KERNEL
);
120
if
(!psIntfAdapter->
psInterruptUrb
)
121
{
122
BCM_DEBUG_PRINT
(psIntfAdapter->
psAdapter
,
DBG_TYPE_OTHERS
,
INTF_INIT
,
DBG_LVL_ALL
,
"Cannot allocate interrupt urb"
);
123
return
-
ENOMEM
;
124
}
125
psIntfAdapter->
psInterruptUrb
->transfer_buffer =
126
psIntfAdapter->
ulInterruptData
;
127
psIntfAdapter->
psInterruptUrb
->transfer_buffer_length =
128
sizeof
(psIntfAdapter->
ulInterruptData
);
129
130
psIntfAdapter->
sIntrIn
.
int_in_pipe
= usb_rcvintpipe(psIntfAdapter->
udev
,
131
psIntfAdapter->
sIntrIn
.
int_in_endpointAddr
);
132
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
);
139
140
BCM_DEBUG_PRINT
(psIntfAdapter->
psAdapter
,
DBG_TYPE_OTHERS
,
INTF_INIT
,
DBG_LVL_ALL
,
"Interrupt Interval: %d\n"
,
141
psIntfAdapter->
sIntrIn
.
int_in_interval
);
142
return
0;
143
}
144
145
146
INT
StartInterruptUrb
(
PS_INTERFACE_ADAPTER
psIntfAdapter)
147
{
148
INT
status = 0;
149
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)
155
{
156
status =
usb_submit_urb
(psIntfAdapter->
psInterruptUrb
,
GFP_ATOMIC
);
157
if
(status)
158
{
159
BCM_DEBUG_PRINT
(psIntfAdapter->
psAdapter
,
DBG_TYPE_OTHERS
,
INTF_INIT
,
DBG_LVL_ALL
,
"Cannot send int urb %d\n"
, status);
160
if
(status == -
EPIPE
)
161
{
162
psIntfAdapter->
psAdapter
->bEndPointHalted =
TRUE
;
163
wake_up
(&psIntfAdapter->
psAdapter
->tx_packet_wait_queue);
164
}
165
}
166
}
167
return
status
;
168
}
169
Generated on Thu Jan 10 2013 14:25:58 for Linux Kernel by
1.8.2