3 * See copyright notice in main.c
5 #include <linux/ieee80211.h>
6 #include <net/cfg80211.h>
13 /* Supported bitrates. Must agree with hw.c */
14 static struct ieee80211_rate orinoco_rates
[] = {
21 static const void * const orinoco_wiphy_privid
= &orinoco_wiphy_privid
;
23 /* Called after orinoco_private is allocated. */
24 void orinoco_wiphy_init(struct wiphy
*wiphy
)
26 struct orinoco_private
*priv
= wiphy_priv(wiphy
);
28 wiphy
->privid
= orinoco_wiphy_privid
;
30 set_wiphy_dev(wiphy
, priv
->dev
);
33 /* Called after firmware is initialised */
34 int orinoco_wiphy_register(struct wiphy
*wiphy
)
36 struct orinoco_private
*priv
= wiphy_priv(wiphy
);
39 if (priv
->firmware_type
== FIRMWARE_TYPE_AGERE
)
40 wiphy
->max_scan_ssids
= 1;
42 wiphy
->max_scan_ssids
= 0;
44 wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
);
46 /* TODO: should we set if we only have demo ad-hoc?
50 wiphy
->interface_modes
|= BIT(NL80211_IFTYPE_ADHOC
);
52 if (!priv
->broken_monitor
|| force_monitor
)
53 wiphy
->interface_modes
|= BIT(NL80211_IFTYPE_MONITOR
);
55 priv
->band
.bitrates
= orinoco_rates
;
56 priv
->band
.n_bitrates
= ARRAY_SIZE(orinoco_rates
);
58 /* Only support channels allowed by the card EEPROM */
59 for (i
= 0; i
< NUM_CHANNELS
; i
++) {
60 if (priv
->channel_mask
& (1 << i
)) {
61 priv
->channels
[i
].center_freq
=
62 ieee80211_dsss_chan_to_freq(i
+1);
66 priv
->band
.channels
= priv
->channels
;
67 priv
->band
.n_channels
= channels
;
69 wiphy
->bands
[IEEE80211_BAND_2GHZ
] = &priv
->band
;
70 wiphy
->signal_type
= CFG80211_SIGNAL_TYPE_MBM
;
74 priv
->cipher_suites
[i
] = WLAN_CIPHER_SUITE_WEP40
;
77 if (priv
->has_big_wep
) {
78 priv
->cipher_suites
[i
] = WLAN_CIPHER_SUITE_WEP104
;
83 priv
->cipher_suites
[i
] = WLAN_CIPHER_SUITE_TKIP
;
86 wiphy
->cipher_suites
= priv
->cipher_suites
;
87 wiphy
->n_cipher_suites
= i
;
89 wiphy
->rts_threshold
= priv
->rts_thresh
;
91 wiphy
->frag_threshold
= priv
->frag_thresh
+ 1;
92 wiphy
->retry_short
= priv
->short_retry_limit
;
93 wiphy
->retry_long
= priv
->long_retry_limit
;
95 return wiphy_register(wiphy
);
98 static int orinoco_change_vif(struct wiphy
*wiphy
, struct net_device
*dev
,
99 enum nl80211_iftype type
, u32
*flags
,
100 struct vif_params
*params
)
102 struct orinoco_private
*priv
= wiphy_priv(wiphy
);
106 if (orinoco_lock(priv
, &lock
) != 0)
110 case NL80211_IFTYPE_ADHOC
:
111 if (!priv
->has_ibss
&& !priv
->has_port3
)
115 case NL80211_IFTYPE_STATION
:
118 case NL80211_IFTYPE_MONITOR
:
119 if (priv
->broken_monitor
&& !force_monitor
) {
121 "Monitor mode support is buggy in this firmware, not enabling\n");
131 priv
->iw_mode
= type
;
133 err
= orinoco_commit(priv
);
136 orinoco_unlock(priv
, &lock
);
141 static int orinoco_scan(struct wiphy
*wiphy
, struct net_device
*dev
,
142 struct cfg80211_scan_request
*request
)
144 struct orinoco_private
*priv
= wiphy_priv(wiphy
);
150 if (priv
->scan_request
&& priv
->scan_request
!= request
)
153 priv
->scan_request
= request
;
155 err
= orinoco_hw_trigger_scan(priv
, request
->ssids
);
160 static int orinoco_set_channel(struct wiphy
*wiphy
,
161 struct net_device
*netdev
,
162 struct ieee80211_channel
*chan
,
163 enum nl80211_channel_type channel_type
)
165 struct orinoco_private
*priv
= wiphy_priv(wiphy
);
173 if (channel_type
!= NL80211_CHAN_NO_HT
)
176 if (chan
->band
!= IEEE80211_BAND_2GHZ
)
179 channel
= ieee80211_freq_to_dsss_chan(chan
->center_freq
);
181 if ((channel
< 1) || (channel
> NUM_CHANNELS
) ||
182 !(priv
->channel_mask
& (1 << (channel
-1))))
185 if (orinoco_lock(priv
, &flags
) != 0)
188 priv
->channel
= channel
;
189 if (priv
->iw_mode
== NL80211_IFTYPE_MONITOR
) {
190 /* Fast channel change - no commit if successful */
191 hermes_t
*hw
= &priv
->hw
;
192 err
= hw
->ops
->cmd_wait(hw
, HERMES_CMD_TEST
|
193 HERMES_TEST_SET_CHANNEL
,
196 orinoco_unlock(priv
, &flags
);
201 static int orinoco_set_wiphy_params(struct wiphy
*wiphy
, u32 changed
)
203 struct orinoco_private
*priv
= wiphy_priv(wiphy
);
208 if (changed
& WIPHY_PARAM_RETRY_SHORT
) {
209 /* Setting short retry not supported */
213 if (changed
& WIPHY_PARAM_RETRY_LONG
) {
214 /* Setting long retry not supported */
218 if (changed
& WIPHY_PARAM_FRAG_THRESHOLD
) {
219 /* Set fragmentation */
221 if (wiphy
->frag_threshold
< 0)
224 printk(KERN_WARNING
"%s: Fixed fragmentation "
225 "is not supported on this firmware. "
226 "Using MWO robust instead.\n",
231 if (wiphy
->frag_threshold
< 0)
233 else if ((wiphy
->frag_threshold
< 257) ||
234 (wiphy
->frag_threshold
> 2347))
237 /* cfg80211 value is 257-2347 (odd only)
238 * orinoco rid has range 256-2346 (even only) */
239 frag_value
= wiphy
->frag_threshold
& ~0x1;
243 if (changed
& WIPHY_PARAM_RTS_THRESHOLD
) {
246 * Prism documentation suggests default of 2432,
247 * and a range of 0-3000.
249 * Current implementation uses 2347 as the default and
253 if (wiphy
->rts_threshold
< 0)
255 else if (wiphy
->rts_threshold
> 2347)
258 rts_value
= wiphy
->rts_threshold
;
264 if (orinoco_lock(priv
, &flags
) != 0)
267 if (frag_value
>= 0) {
269 priv
->mwo_robust
= frag_value
;
271 priv
->frag_thresh
= frag_value
;
274 priv
->rts_thresh
= rts_value
;
276 err
= orinoco_commit(priv
);
278 orinoco_unlock(priv
, &flags
);
284 const struct cfg80211_ops orinoco_cfg_ops
= {
285 .change_virtual_intf
= orinoco_change_vif
,
286 .set_channel
= orinoco_set_channel
,
287 .scan
= orinoco_scan
,
288 .set_wiphy_params
= orinoco_set_wiphy_params
,