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
net
wireless
zd1211rw
zd_rf.c
Go to the documentation of this file.
1
/* ZD1211 USB-WLAN driver for Linux
2
*
3
* Copyright (C) 2005-2007 Ulrich Kunitz <
[email protected]
>
4
* Copyright (C) 2006-2007 Daniel Drake <
[email protected]
>
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
*/
20
21
#include <linux/errno.h>
22
#include <linux/string.h>
23
24
#include "
zd_def.h
"
25
#include "
zd_rf.h
"
26
#include "
zd_mac.h
"
27
#include "
zd_chip.h
"
28
29
static
const
char
*
const
rfs[] = {
30
[0] =
"unknown RF0"
,
31
[1] =
"unknown RF1"
,
32
[
UW2451_RF
] =
"UW2451_RF"
,
33
[
UCHIP_RF
] =
"UCHIP_RF"
,
34
[
AL2230_RF
] =
"AL2230_RF"
,
35
[
AL7230B_RF
] =
"AL7230B_RF"
,
36
[
THETA_RF
] =
"THETA_RF"
,
37
[
AL2210_RF
] =
"AL2210_RF"
,
38
[
MAXIM_NEW_RF
] =
"MAXIM_NEW_RF"
,
39
[
UW2453_RF
] =
"UW2453_RF"
,
40
[
AL2230S_RF
] =
"AL2230S_RF"
,
41
[
RALINK_RF
] =
"RALINK_RF"
,
42
[
INTERSIL_RF
] =
"INTERSIL_RF"
,
43
[
RF2959_RF
] =
"RF2959_RF"
,
44
[
MAXIM_NEW2_RF
] =
"MAXIM_NEW2_RF"
,
45
[
PHILIPS_RF
] =
"PHILIPS_RF"
,
46
};
47
48
const
char
*
zd_rf_name
(
u8
type
)
49
{
50
if
(type & 0xf0)
51
type = 0;
52
return
rfs[
type
];
53
}
54
55
void
zd_rf_init
(
struct
zd_rf
*rf)
56
{
57
memset
(rf, 0,
sizeof
(*rf));
58
59
/* default to update channel integration, as almost all RF's do want
60
* this */
61
rf->
update_channel_int
= 1;
62
}
63
64
void
zd_rf_clear
(
struct
zd_rf
*rf)
65
{
66
if
(rf->
clear
)
67
rf->
clear
(rf);
68
ZD_MEMCLEAR
(rf,
sizeof
(*rf));
69
}
70
71
int
zd_rf_init_hw
(
struct
zd_rf
*rf,
u8
type
)
72
{
73
int
r
= 0;
74
int
t
;
75
struct
zd_chip
*
chip
= zd_rf_to_chip(rf);
76
77
ZD_ASSERT
(mutex_is_locked(&chip->
mutex
));
78
switch
(type) {
79
case
RF2959_RF
:
80
r =
zd_rf_init_rf2959
(rf);
81
break
;
82
case
AL2230_RF
:
83
case
AL2230S_RF
:
84
r =
zd_rf_init_al2230
(rf);
85
break
;
86
case
AL7230B_RF
:
87
r =
zd_rf_init_al7230b
(rf);
88
break
;
89
case
MAXIM_NEW_RF
:
90
case
UW2453_RF
:
91
r =
zd_rf_init_uw2453
(rf);
92
break
;
93
default
:
94
dev_err
(
zd_chip_dev
(chip),
95
"RF %s %#x is not supported\n"
,
zd_rf_name
(type), type);
96
rf->
type
= 0;
97
return
-
ENODEV
;
98
}
99
100
if
(r)
101
return
r
;
102
103
rf->
type
=
type
;
104
105
r =
zd_chip_lock_phy_regs
(chip);
106
if
(r)
107
return
r
;
108
t = rf->
init_hw
(rf);
109
r =
zd_chip_unlock_phy_regs
(chip);
110
if
(t)
111
r =
t
;
112
return
r
;
113
}
114
115
int
zd_rf_scnprint_id
(
struct
zd_rf
*
rf
,
char
*
buffer
,
size_t
size
)
116
{
117
return
scnprintf
(buffer, size,
"%s"
,
zd_rf_name
(rf->
type
));
118
}
119
120
int
zd_rf_set_channel
(
struct
zd_rf
*
rf
,
u8
channel
)
121
{
122
int
r
;
123
124
ZD_ASSERT
(mutex_is_locked(&zd_rf_to_chip(rf)->
mutex
));
125
if
(channel <
MIN_CHANNEL24
)
126
return
-
EINVAL
;
127
if
(channel >
MAX_CHANNEL24
)
128
return
-
EINVAL
;
129
dev_dbg_f
(
zd_chip_dev
(zd_rf_to_chip(rf)),
"channel: %d\n"
, channel);
130
131
r = rf->
set_channel
(rf, channel);
132
if
(r >= 0)
133
rf->
channel
=
channel
;
134
return
r
;
135
}
136
137
int
zd_switch_radio_on
(
struct
zd_rf
*
rf
)
138
{
139
int
r
,
t
;
140
struct
zd_chip
*
chip
= zd_rf_to_chip(rf);
141
142
ZD_ASSERT
(mutex_is_locked(&chip->
mutex
));
143
r =
zd_chip_lock_phy_regs
(chip);
144
if
(r)
145
return
r
;
146
t = rf->
switch_radio_on
(rf);
147
r =
zd_chip_unlock_phy_regs
(chip);
148
if
(t)
149
r =
t
;
150
return
r
;
151
}
152
153
int
zd_switch_radio_off
(
struct
zd_rf
*
rf
)
154
{
155
int
r
,
t
;
156
struct
zd_chip
*
chip
= zd_rf_to_chip(rf);
157
158
/* TODO: move phy regs handling to zd_chip */
159
ZD_ASSERT
(mutex_is_locked(&chip->
mutex
));
160
r =
zd_chip_lock_phy_regs
(chip);
161
if
(r)
162
return
r
;
163
t = rf->
switch_radio_off
(rf);
164
r =
zd_chip_unlock_phy_regs
(chip);
165
if
(t)
166
r =
t
;
167
return
r
;
168
}
169
170
int
zd_rf_patch_6m_band_edge
(
struct
zd_rf
*
rf
,
u8
channel
)
171
{
172
if
(!rf->
patch_6m_band_edge
)
173
return
0;
174
175
return
rf->
patch_6m_band_edge
(rf, channel);
176
}
177
178
int
zd_rf_generic_patch_6m
(
struct
zd_rf
*
rf
,
u8
channel
)
179
{
180
return
zd_chip_generic_patch_6m_band
(zd_rf_to_chip(rf), channel);
181
}
182
Generated on Thu Jan 10 2013 14:13:22 for Linux Kernel by
1.8.2