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
usb
wusbcore
reservation.c
Go to the documentation of this file.
1
/*
2
* WUSB cluster reservation management
3
*
4
* Copyright (C) 2007 Cambridge Silicon Radio Ltd.
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License version
8
* 2 as published by the Free Software Foundation.
9
*
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
14
*
15
* You should have received a copy of the GNU General Public License
16
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17
*/
18
#include <linux/kernel.h>
19
#include <
linux/uwb.h
>
20
21
#include "
wusbhc.h
"
22
23
/*
24
* WUSB cluster reservations are multicast reservations with the
25
* broadcast cluster ID (BCID) as the target DevAddr.
26
*
27
* FIXME: consider adjusting the reservation depending on what devices
28
* are attached.
29
*/
30
31
static
int
wusbhc_bwa_set(
struct
wusbhc
*
wusbhc
,
u8
stream,
32
const
struct
uwb_mas_bm
*mas)
33
{
34
if
(mas ==
NULL
)
35
mas = &uwb_mas_bm_zero;
36
return
wusbhc->
bwa_set
(wusbhc, stream, mas);
37
}
38
47
static
void
wusbhc_rsv_complete_cb(
struct
uwb_rsv
*
rsv
)
48
{
49
struct
wusbhc *wusbhc = rsv->
pal_priv
;
50
struct
device
*
dev
= wusbhc->
dev
;
51
struct
uwb_mas_bm
mas;
52
char
buf
[72];
53
54
switch
(rsv->
state
) {
55
case
UWB_RSV_STATE_O_ESTABLISHED
:
56
uwb_rsv_get_usable_mas
(rsv, &mas);
57
bitmap_scnprintf
(buf,
sizeof
(buf), mas.bm,
UWB_NUM_MAS
);
58
dev_dbg
(dev,
"established reservation: %s\n"
, buf);
59
wusbhc_bwa_set(wusbhc, rsv->
stream
, &mas);
60
break
;
61
case
UWB_RSV_STATE_NONE
:
62
dev_dbg
(dev,
"removed reservation\n"
);
63
wusbhc_bwa_set(wusbhc, 0,
NULL
);
64
break
;
65
default
:
66
dev_dbg
(dev,
"unexpected reservation state: %d\n"
, rsv->
state
);
67
break
;
68
}
69
}
70
71
76
int
wusbhc_rsv_establish
(
struct
wusbhc *wusbhc)
77
{
78
struct
uwb_rc
*
rc
= wusbhc->
uwb_rc
;
79
struct
uwb_rsv
*
rsv
;
80
struct
uwb_dev_addr
bcid;
81
int
ret
;
82
83
rsv =
uwb_rsv_create
(rc, wusbhc_rsv_complete_cb, wusbhc);
84
if
(rsv ==
NULL
)
85
return
-
ENOMEM
;
86
87
bcid.
data
[0] = wusbhc->
cluster_id
;
88
bcid.
data
[1] = 0;
89
90
rsv->
target
.type =
UWB_RSV_TARGET_DEVADDR
;
91
rsv->
target
.devaddr = bcid;
92
rsv->
type
=
UWB_DRP_TYPE_PRIVATE
;
93
rsv->
max_mas
= 256;
/* try to get as much as possible */
94
rsv->
min_mas
= 15;
/* one MAS per zone */
95
rsv->
max_interval
= 1;
/* max latency is one zone */
96
rsv->
is_multicast
=
true
;
97
98
ret =
uwb_rsv_establish
(rsv);
99
if
(ret == 0)
100
wusbhc->
rsv
=
rsv
;
101
else
102
uwb_rsv_destroy
(rsv);
103
return
ret
;
104
}
105
106
111
void
wusbhc_rsv_terminate
(
struct
wusbhc *wusbhc)
112
{
113
if
(wusbhc->
rsv
) {
114
uwb_rsv_terminate
(wusbhc->
rsv
);
115
uwb_rsv_destroy
(wusbhc->
rsv
);
116
wusbhc->
rsv
=
NULL
;
117
}
118
}
Generated on Thu Jan 10 2013 14:38:52 for Linux Kernel by
1.8.2