Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
cca52de4
Commit
cca52de4
authored
Jan 14, 2004
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge redhat.com:/spare/repo/netdev-2.6/atmel
into redhat.com:/spare/repo/net-drivers-2.5
parents
2ed55743
435417ab
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
389 additions
and
162 deletions
+389
-162
drivers/net/wireless/Kconfig
drivers/net/wireless/Kconfig
+1
-1
drivers/net/wireless/atmel.c
drivers/net/wireless/atmel.c
+374
-147
drivers/net/wireless/atmel_cs.c
drivers/net/wireless/atmel_cs.c
+14
-14
No files found.
drivers/net/wireless/Kconfig
View file @
cca52de4
...
...
@@ -282,7 +282,7 @@ config PCMCIA_ATMEL
one of these, you will need to provide a firmware image
to be loaded into the card by the driver. The Atmel
firmware package can be downloaded from
http://www.thekelleys.org.uk/atmel
/atmel_firmware.tar.gz
http://www.thekelleys.org.uk/atmel
config PCMCIA_WL3501
tristate "Planet WL3501 PCMCIA cards"
...
...
drivers/net/wireless/atmel.c
View file @
cca52de4
...
...
@@ -67,7 +67,7 @@
#include "ieee802_11.h"
#define DRIVER_MAJOR 0
#define DRIVER_MINOR
8
#define DRIVER_MINOR
9
MODULE_AUTHOR
(
"Simon Kelley"
);
MODULE_DESCRIPTION
(
"Support for Atmel at76c50x 802.11 wireless ethernet cards."
);
...
...
@@ -153,12 +153,15 @@ module_param(firmware, charp, 0);
#define C80211_MGMT_ElementID_ChallengeText 16
#define C80211_MGMT_CAPABILITY_ShortPreamble 0x0020
#define MIB_MAX_DATA_BYTES 212
#define MIB_HEADER_SIZE 4
/* first four fields */
struct
get_set_mib
{
u8
type
;
u8
size
;
u8
index
;
u8
reserved
;
u8
data
[
72
];
u8
data
[
MIB_MAX_DATA_BYTES
];
};
struct
rx_desc
{
...
...
@@ -195,32 +198,40 @@ struct rx_desc {
struct
tx_desc
{
u32
NextDescriptor
;
u16
TxStartOfFrame
;
u16
TxLength
;
u8
TxState
;
u8
TxStatus
;
u8
RetryCount
;
u8
TxRate
;
u32
TxTime
;
u8
Reserved
;
u8
PacketType
;
u16
HostTxLength
;
u32
NextDescriptor
;
u16
TxStartOfFrame
;
u16
TxLength
;
u8
TxState
;
u8
TxStatus
;
u8
RetryCount
;
u8
TxRate
;
u8
KeyIndex
;
u8
ChiperType
;
u8
ChipreLength
;
u8
Reserved1
;
u8
Reserved
;
u8
PacketType
;
u16
HostTxLength
;
};
#define TX_DESC_NEXT_OFFSET 0
#define TX_DESC_POS_OFFSET 4
#define TX_DESC_SIZE_OFFSET 6
#define TX_DESC_FLAGS_OFFSET 8
#define TX_DESC_STATUS_OFFSET 9
#define TX_DESC_RETRY_OFFSET 10
#define TX_DESC_RATE_OFFSET 11
#define TX_DESC_PACKET_TYPE_OFFSET 17
#define TX_DESC_HOST_LENGTH_OFFSET 18
#define TX_DESC_NEXT_OFFSET 0
#define TX_DESC_POS_OFFSET 4
#define TX_DESC_SIZE_OFFSET 6
#define TX_DESC_FLAGS_OFFSET 8
#define TX_DESC_STATUS_OFFSET 9
#define TX_DESC_RETRY_OFFSET 10
#define TX_DESC_RATE_OFFSET 11
#define TX_DESC_KEY_INDEX_OFFSET 12
#define TX_DESC_CIPHER_TYPE_OFFSET 13
#define TX_DESC_CIPHER_LENGTH_OFFSET 14
#define TX_DESC_PACKET_TYPE_OFFSET 17
#define TX_DESC_HOST_LENGTH_OFFSET 18
...
...
@@ -324,6 +335,9 @@ struct tx_desc {
#define ACTIVE_MODE 1
#define PS_MODE 2
#define MAX_ENCRYPTION_KEYS 4
#define MAX_ENCRYPTION_KEY_SIZE 40
///////////////////////////////////////////////////////////////////////////
// 802.11 related definitions
///////////////////////////////////////////////////////////////////////////
...
...
@@ -370,6 +384,14 @@ struct tx_desc {
#define IFACE_FUNC_CTRL_OFFSET 28
#define IFACE_MAC_STAT_OFFSET 30
#define IFACE_GENERIC_INT_TYPE_OFFSET 32
#define CIPHER_SUITE_NONE 0
#define CIPHER_SUITE_WEP_64 1
#define CIPHER_SUITE_TKIP 2
#define CIPHER_SUITE_AES 3
#define CIPHER_SUITE_CCX 4
#define CIPHER_SUITE_WEP_128 5
//
// IFACE MACROS & definitions
//
...
...
@@ -432,6 +454,7 @@ struct atmel_private {
void
*
card
;
/* Bus dependent stucture varies for PCcard */
int
(
*
present_callback
)(
void
*
);
/* And callback which uses it */
char
firmware_id
[
32
];
char
firmware_template
[
32
];
unsigned
char
*
firmware
;
int
firmware_length
;
struct
timer_list
management_timer
;
...
...
@@ -457,20 +480,11 @@ struct atmel_private {
u16
frag_seq
,
frag_len
,
frag_no
;
u8
frag_source
[
6
];
int
wep_key_len
[
4
];
/* need to know these and not stored in Mib. */
struct
{
/* NB this is matched to the hardware, don't change. */
u8
wep_is_on
;
u8
default_key
;
/* 0..3 */
u8
reserved
;
u8
exclude_unencrypted
;
u32
WEPICV_error_count
;
u32
WEP_excluded_count
;
u8
wep_keys
[
4
][
13
];
u8
encryption_level
;
/* 0, 1, 2 */
u8
reserved2
[
3
];
}
wep
;
u8
wep_is_on
,
default_key
,
exclude_unencrypted
,
encryption_level
;
u8
group_cipher_suite
,
pairwise_cipher_suite
;
u8
wep_keys
[
MAX_ENCRYPTION_KEYS
][
MAX_ENCRYPTION_KEY_SIZE
];
int
wep_key_len
[
MAX_ENCRYPTION_KEYS
];
int
use_wpa
;
u16
host_info_base
;
struct
host_info_struct
{
...
...
@@ -510,8 +524,6 @@ struct atmel_private {
STATION_STATE_ASSOCIATING
,
STATION_STATE_READY
,
STATION_STATE_REASSOCIATING
,
STATION_STATE_FORCED_JOINNING
,
STATION_STATE_FORCED_JOIN_FAILURE
,
STATION_STATE_DOWN
,
STATION_STATE_NO_CARD
,
STATION_STATE_MGMT_ERROR
...
...
@@ -564,6 +576,7 @@ struct atmel_private {
static
u8
atmel_basic_rates
[
4
]
=
{
0x82
,
0x84
,
0x0b
,
0x16
};
static
void
build_wpa_mib
(
struct
atmel_private
*
priv
);
static
int
atmel_ioctl
(
struct
net_device
*
dev
,
struct
ifreq
*
rq
,
int
cmd
);
static
void
atmel_copy_to_card
(
struct
net_device
*
dev
,
u16
dest
,
unsigned
char
*
src
,
u16
len
);
static
void
atmel_copy_to_host
(
struct
net_device
*
dev
,
unsigned
char
*
dest
,
u16
src
,
u16
len
);
...
...
@@ -717,14 +730,54 @@ static u16 find_tx_buff(struct atmel_private *priv, u16 len)
return
0
;
}
static
void
tx_update_descriptor
(
struct
atmel_private
*
priv
,
u16
len
,
u16
buff
,
u8
type
)
static
void
tx_update_descriptor
(
struct
atmel_private
*
priv
,
int
is_bcast
,
u16
len
,
u16
buff
,
u8
type
)
{
atmel_wmem16
(
priv
,
atmel_tx
(
priv
,
TX_DESC_POS_OFFSET
,
priv
->
tx_desc_tail
),
buff
);
atmel_wmem16
(
priv
,
atmel_tx
(
priv
,
TX_DESC_SIZE_OFFSET
,
priv
->
tx_desc_tail
),
len
);
atmel_wmem16
(
priv
,
atmel_tx
(
priv
,
TX_DESC_HOST_LENGTH_OFFSET
,
priv
->
tx_desc_tail
),
len
);
if
(
!
priv
->
use_wpa
)
atmel_wmem16
(
priv
,
atmel_tx
(
priv
,
TX_DESC_HOST_LENGTH_OFFSET
,
priv
->
tx_desc_tail
),
len
);
atmel_wmem8
(
priv
,
atmel_tx
(
priv
,
TX_DESC_PACKET_TYPE_OFFSET
,
priv
->
tx_desc_tail
),
type
);
atmel_wmem8
(
priv
,
atmel_tx
(
priv
,
TX_DESC_RATE_OFFSET
,
priv
->
tx_desc_tail
),
priv
->
tx_rate
);
atmel_wmem8
(
priv
,
atmel_tx
(
priv
,
TX_DESC_RETRY_OFFSET
,
priv
->
tx_desc_tail
),
0
);
if
(
priv
->
use_wpa
)
{
int
cipher_type
,
cipher_length
;
if
(
is_bcast
)
{
cipher_type
=
priv
->
group_cipher_suite
;
if
(
cipher_type
==
CIPHER_SUITE_WEP_64
||
cipher_type
==
CIPHER_SUITE_WEP_128
)
cipher_length
=
8
;
else
if
(
cipher_type
==
CIPHER_SUITE_TKIP
)
cipher_length
=
12
;
else
if
(
priv
->
pairwise_cipher_suite
==
CIPHER_SUITE_WEP_64
||
priv
->
pairwise_cipher_suite
==
CIPHER_SUITE_WEP_128
)
{
cipher_type
=
priv
->
pairwise_cipher_suite
;
cipher_length
=
8
;
}
else
{
cipher_type
=
CIPHER_SUITE_NONE
;
cipher_length
=
0
;
}
}
else
{
cipher_type
=
priv
->
pairwise_cipher_suite
;
if
(
cipher_type
==
CIPHER_SUITE_WEP_64
||
cipher_type
==
CIPHER_SUITE_WEP_128
)
cipher_length
=
8
;
else
if
(
cipher_type
==
CIPHER_SUITE_TKIP
)
cipher_length
=
12
;
else
if
(
priv
->
group_cipher_suite
==
CIPHER_SUITE_WEP_64
||
priv
->
group_cipher_suite
==
CIPHER_SUITE_WEP_128
)
{
cipher_type
=
priv
->
group_cipher_suite
;
cipher_length
=
8
;
}
else
{
cipher_type
=
CIPHER_SUITE_NONE
;
cipher_length
=
0
;
}
}
atmel_wmem8
(
priv
,
atmel_tx
(
priv
,
TX_DESC_CIPHER_TYPE_OFFSET
,
priv
->
tx_desc_tail
),
cipher_type
);
atmel_wmem8
(
priv
,
atmel_tx
(
priv
,
TX_DESC_CIPHER_LENGTH_OFFSET
,
priv
->
tx_desc_tail
),
cipher_length
);
}
atmel_wmem32
(
priv
,
atmel_tx
(
priv
,
TX_DESC_NEXT_OFFSET
,
priv
->
tx_desc_tail
),
0x80000000L
);
atmel_wmem8
(
priv
,
atmel_tx
(
priv
,
TX_DESC_FLAGS_OFFSET
,
priv
->
tx_desc_tail
),
TX_FIRM_OWN
);
if
(
priv
->
tx_desc_previous
!=
priv
->
tx_desc_tail
)
...
...
@@ -745,16 +798,19 @@ static int start_tx (struct sk_buff *skb, struct net_device *dev)
struct
ieee802_11_hdr
header
;
unsigned
long
flags
;
u16
buff
,
frame_ctl
,
len
=
(
ETH_ZLEN
<
skb
->
len
)
?
skb
->
len
:
ETH_ZLEN
;
if
(
priv
->
station_state
!=
STATION_STATE_READY
)
{
u8
SNAP_RFC1024
[
6
]
=
{
0xaa
,
0xaa
,
0x03
,
0x00
,
0x00
,
0x00
};
if
(
priv
->
station_state
!=
STATION_STATE_READY
)
{
priv
->
stats
.
tx_errors
++
;
goto
done
;
dev_kfree_skb
(
skb
);
return
0
;
}
if
(
priv
->
card
&&
priv
->
present_callback
&&
!
(
*
priv
->
present_callback
)(
priv
->
card
))
{
priv
->
stats
.
tx_errors
++
;
goto
done
;
dev_kfree_skb
(
skb
);
return
0
;
}
/* first ensure the timer func cannot run */
...
...
@@ -778,7 +834,7 @@ static int start_tx (struct sk_buff *skb, struct net_device *dev)
frame_ctl
=
IEEE802_11_FTYPE_DATA
;
header
.
duration_id
=
0
;
header
.
seq_ctl
=
0
;
if
(
priv
->
wep
.
wep
_is_on
)
if
(
priv
->
wep_is_on
)
frame_ctl
|=
IEEE802_11_FCTL_WEP
;
if
(
priv
->
operating_mode
==
IW_MODE_ADHOC
)
{
memcpy
(
&
header
.
addr1
,
skb
->
data
,
6
);
...
...
@@ -791,6 +847,9 @@ static int start_tx (struct sk_buff *skb, struct net_device *dev)
memcpy
(
&
header
.
addr3
,
skb
->
data
,
6
);
}
if
(
priv
->
use_wpa
)
memcpy
(
&
header
.
addr4
,
SNAP_RFC1024
,
6
);
header
.
frame_ctl
=
cpu_to_le16
(
frame_ctl
);
/* Copy the wireless header into the card */
atmel_copy_to_card
(
dev
,
buff
,
(
unsigned
char
*
)
&
header
,
DATA_FRAME_WS_HEADER_SIZE
);
...
...
@@ -798,14 +857,13 @@ static int start_tx (struct sk_buff *skb, struct net_device *dev)
atmel_copy_to_card
(
dev
,
buff
+
DATA_FRAME_WS_HEADER_SIZE
,
skb
->
data
+
12
,
len
-
12
);
priv
->
tx_buff_tail
+=
len
-
12
+
DATA_FRAME_WS_HEADER_SIZE
;
tx_update_descriptor
(
priv
,
len
+
18
,
buff
,
TX_PACKET_TYPE_DATA
);
/* low bit of first byte of destination tells us if broadcast */
tx_update_descriptor
(
priv
,
*
(
skb
->
data
)
&
0x01
,
len
+
18
,
buff
,
TX_PACKET_TYPE_DATA
);
dev
->
trans_start
=
jiffies
;
priv
->
stats
.
tx_bytes
+=
len
;
spin_unlock_irqrestore
(
&
priv
->
irqlock
,
flags
);
spin_unlock_bh
(
&
priv
->
timerlock
);
done:
dev_kfree_skb
(
skb
);
return
0
;
...
...
@@ -824,7 +882,7 @@ static void atmel_transmit_management_frame(struct atmel_private *priv,
atmel_copy_to_card
(
priv
->
dev
,
buff
,
(
u8
*
)
header
,
MGMT_FRAME_BODY_OFFSET
);
atmel_copy_to_card
(
priv
->
dev
,
buff
+
MGMT_FRAME_BODY_OFFSET
,
body
,
body_len
);
priv
->
tx_buff_tail
+=
len
;
tx_update_descriptor
(
priv
,
len
,
buff
,
TX_PACKET_TYPE_MGMT
);
tx_update_descriptor
(
priv
,
header
->
addr1
[
0
]
&
0x01
,
len
,
buff
,
TX_PACKET_TYPE_MGMT
);
}
static
void
fast_rx_path
(
struct
atmel_private
*
priv
,
struct
ieee802_11_hdr
*
header
,
...
...
@@ -1027,7 +1085,7 @@ static void rx_done_irq(struct atmel_private *priv)
/* probe for CRC use here if needed once five packets have arrived with
the same crc status, we assume we know what's happening and stop probing */
if
(
priv
->
probe_crc
)
{
if
(
!
priv
->
wep
.
wep
_is_on
||
!
(
frame_ctl
&
IEEE802_11_FCTL_WEP
))
{
if
(
!
priv
->
wep_is_on
||
!
(
frame_ctl
&
IEEE802_11_FCTL_WEP
))
{
priv
->
do_rx_crc
=
probe_crc
(
priv
,
rx_packet_loc
,
msdu_size
);
}
else
{
priv
->
do_rx_crc
=
probe_crc
(
priv
,
rx_packet_loc
+
24
,
msdu_size
-
24
);
...
...
@@ -1042,7 +1100,7 @@ static void rx_done_irq(struct atmel_private *priv)
}
/* don't CRC header when WEP in use */
if
(
priv
->
do_rx_crc
&&
(
!
priv
->
wep
.
wep
_is_on
||
!
(
frame_ctl
&
IEEE802_11_FCTL_WEP
)))
{
if
(
priv
->
do_rx_crc
&&
(
!
priv
->
wep_is_on
||
!
(
frame_ctl
&
IEEE802_11_FCTL_WEP
)))
{
crc
=
crc32_le
(
0xffffffff
,
(
unsigned
char
*
)
&
header
,
24
);
}
msdu_size
-=
24
;
/* header */
...
...
@@ -1158,6 +1216,9 @@ static irqreturn_t service_interrupt(int irq, void *dev_id, struct pt_regs *regs
reset_irq_status
(
priv
,
ISR_IBSS_MERGE
);
atmel_get_mib
(
priv
,
Mac_Mgmt_Mib_Type
,
MAC_MGMT_MIB_CUR_BSSID_POS
,
priv
->
CurrentBSSID
,
6
);
/* The WPA stuff cares about the current AP address */
if
(
priv
->
use_wpa
)
build_wpa_mib
(
priv
);
}
else
if
(
isr
&
ISR_GENERIC_IRQ
)
{
reset_irq_status
(
priv
,
ISR_GENERIC_IRQ
);
printk
(
KERN_INFO
"%s: Generic_irq recieved.
\n
"
,
dev
->
name
);
...
...
@@ -1237,6 +1298,7 @@ static int atmel_close (struct net_device *dev)
{
struct
atmel_private
*
priv
=
(
struct
atmel_private
*
)
dev
->
priv
;
netif_carrier_off
(
dev
);
if
(
netif_running
(
dev
))
netif_stop_queue
(
dev
);
...
...
@@ -1255,17 +1317,17 @@ static int atmel_proc_output (char *buf, struct atmel_private *priv)
p
+=
sprintf
(
p
,
"Driver version:
\t\t
%d.%d
\n
"
,
DRIVER_MAJOR
,
DRIVER_MINOR
);
if
(
priv
->
station_state
!=
STATION_STATE_DOWN
)
{
p
+=
sprintf
(
p
,
"Firmware version:
\t
%d.%d build %d
"
,
p
+=
sprintf
(
p
,
"Firmware version:
\t
%d.%d build %d
\n
Firmware location:
\t
"
,
priv
->
host_info
.
major_version
,
priv
->
host_info
.
minor_version
,
priv
->
host_info
.
build_version
);
if
(
priv
->
card_type
!=
CARD_TYPE_EEPROM
)
p
+=
sprintf
(
p
,
"
[built-in]
\n
"
);
p
+=
sprintf
(
p
,
"
on card
\n
"
);
else
if
(
priv
->
firmware
)
p
+=
sprintf
(
p
,
"
[%s loaded by host]
\n
"
,
priv
->
firmware_id
);
p
+=
sprintf
(
p
,
"
%s loaded by host
\n
"
,
priv
->
firmware_id
);
else
p
+=
sprintf
(
p
,
"
[%s loaded by hotplug]
\n
"
,
priv
->
firmware_id
);
p
+=
sprintf
(
p
,
"
%s loaded by hotplug
\n
"
,
priv
->
firmware_id
);
switch
(
priv
->
card_type
)
{
case
CARD_TYPE_PARALLEL_FLASH
:
c
=
"Parallel flash"
;
break
;
...
...
@@ -1289,6 +1351,8 @@ static int atmel_proc_output (char *buf, struct atmel_private *priv)
p
+=
sprintf
(
p
,
"Regulatory domain:
\t
%s
\n
"
,
r
);
p
+=
sprintf
(
p
,
"Host CRC checking:
\t
%s
\n
"
,
priv
->
do_rx_crc
?
"On"
:
"Off"
);
p
+=
sprintf
(
p
,
"WPA-capable firmware:
\t
%s
\n
"
,
priv
->
use_wpa
?
"Yes"
:
"No"
);
}
switch
(
priv
->
station_state
)
{
...
...
@@ -1299,8 +1363,6 @@ static int atmel_proc_output (char *buf, struct atmel_private *priv)
case
STATION_STATE_ASSOCIATING
:
s
=
"Associating"
;
break
;
case
STATION_STATE_READY
:
s
=
"Ready"
;
break
;
case
STATION_STATE_REASSOCIATING
:
s
=
"Reassociating"
;
break
;
case
STATION_STATE_FORCED_JOINNING
:
s
=
"Forced joining"
;
break
;
case
STATION_STATE_FORCED_JOIN_FAILURE
:
s
=
"Forced join failure"
;
break
;
case
STATION_STATE_NO_CARD
:
s
=
"No card"
;
break
;
case
STATION_STATE_MGMT_ERROR
:
s
=
"Management error"
;
break
;
case
STATION_STATE_DOWN
:
s
=
"Down"
;
break
;
...
...
@@ -1348,12 +1410,12 @@ struct net_device *init_atmel_card( unsigned short irq, int port, char *firmware
priv
->
present_callback
=
card_present
;
priv
->
card
=
card
;
priv
->
firmware
=
NULL
;
priv
->
firmware_id
[
0
]
=
'\0'
;
priv
->
firmware_template
[
0
]
=
'\0'
;
if
(
firmware
)
/* module parameter */
strcpy
(
priv
->
firmware_id
,
firmware
);
else
if
(
firmware_id
)
/* from PCMCIA card-matching or PCI */
strcpy
(
priv
->
firmware_id
,
firmware_id
);
else
priv
->
firmware_id
[
0
]
=
'\0'
;
strcpy
(
priv
->
firmware_template
,
firmware_id
);
priv
->
bus_type
=
card_present
?
BUS_TYPE_PCCARD
:
BUS_TYPE_PCI
;
priv
->
station_state
=
STATION_STATE_DOWN
;
priv
->
is3com
=
is3com
;
...
...
@@ -1389,9 +1451,16 @@ struct net_device *init_atmel_card( unsigned short irq, int port, char *firmware
priv
->
rts_threshold
=
2347
;
priv
->
short_retry
=
7
;
priv
->
long_retry
=
4
;
priv
->
wep
.
wep_is_on
=
0
;
priv
->
wep
.
default_key
=
0
;
priv
->
wep
.
encryption_level
=
0
;
priv
->
wep_is_on
=
0
;
priv
->
default_key
=
0
;
priv
->
encryption_level
=
0
;
priv
->
exclude_unencrypted
=
0
;
priv
->
group_cipher_suite
=
priv
->
pairwise_cipher_suite
=
CIPHER_SUITE_NONE
;
priv
->
use_wpa
=
0
;
memset
(
priv
->
wep_keys
,
0
,
sizeof
(
priv
->
wep_keys
));
memset
(
priv
->
wep_key_len
,
0
,
sizeof
(
priv
->
wep_key_len
));
priv
->
default_beacon_period
=
priv
->
beacon_period
=
100
;
priv
->
listen_interval
=
1
;
...
...
@@ -1426,8 +1495,12 @@ struct net_device *init_atmel_card( unsigned short irq, int port, char *firmware
if
(
register_netdev
(
dev
))
goto
err_out_res
;
if
(
!
probe_atmel_card
(
dev
))
if
(
!
probe_atmel_card
(
dev
)){
unregister_netdev
(
dev
);
goto
err_out_res
;
}
netif_carrier_off
(
dev
);
create_proc_read_entry
(
"driver/atmel"
,
0
,
0
,
atmel_read_proc
,
priv
);
...
...
@@ -1443,7 +1516,7 @@ struct net_device *init_atmel_card( unsigned short irq, int port, char *firmware
err_out_irq:
free_irq
(
dev
->
irq
,
dev
);
err_out_free:
kfree
(
dev
);
free_netdev
(
dev
);
return
NULL
;
}
...
...
@@ -1582,7 +1655,7 @@ static int atmel_set_encode(struct net_device *dev,
* don't do it. - Jean II */
if
(
dwrq
->
length
>
0
)
{
int
index
=
(
dwrq
->
flags
&
IW_ENCODE_INDEX
)
-
1
;
int
current_index
=
priv
->
wep
.
default_key
;
int
current_index
=
priv
->
default_key
;
/* Check the size of the key */
if
(
dwrq
->
length
>
13
)
{
return
-
EINVAL
;
...
...
@@ -1591,7 +1664,7 @@ static int atmel_set_encode(struct net_device *dev,
if
(
index
<
0
||
index
>=
4
)
index
=
current_index
;
else
priv
->
wep
.
default_key
=
index
;
priv
->
default_key
=
index
;
/* Set the length */
if
(
dwrq
->
length
>
5
)
priv
->
wep_key_len
[
index
]
=
13
;
...
...
@@ -1604,27 +1677,30 @@ static int atmel_set_encode(struct net_device *dev,
/* Check if the key is not marked as invalid */
if
(
!
(
dwrq
->
flags
&
IW_ENCODE_NOKEY
))
{
/* Cleanup */
memset
(
priv
->
wep
.
wep
_keys
[
index
],
0
,
13
);
memset
(
priv
->
wep_keys
[
index
],
0
,
13
);
/* Copy the key in the driver */
memcpy
(
priv
->
wep
.
wep
_keys
[
index
],
extra
,
dwrq
->
length
);
memcpy
(
priv
->
wep_keys
[
index
],
extra
,
dwrq
->
length
);
}
/* WE specify that if a valid key is set, encryption
* should be enabled (user may turn it off later)
* This is also how "iwconfig ethX key on" works */
if
(
index
==
current_index
&&
priv
->
wep_key_len
[
index
]
>
0
)
{
priv
->
wep
.
wep_is_on
=
1
;
priv
->
wep
.
exclude_unencrypted
=
1
;
if
(
priv
->
wep_key_len
[
index
]
>
5
)
priv
->
wep
.
encryption_level
=
2
;
else
priv
->
wep
.
encryption_level
=
1
;
priv
->
wep_is_on
=
1
;
priv
->
exclude_unencrypted
=
1
;
if
(
priv
->
wep_key_len
[
index
]
>
5
)
{
priv
->
pairwise_cipher_suite
=
CIPHER_SUITE_WEP_64
;
priv
->
encryption_level
=
2
;
}
else
{
priv
->
pairwise_cipher_suite
=
CIPHER_SUITE_WEP_128
;
priv
->
encryption_level
=
1
;
}
}
}
else
{
/* Do we want to just set the transmit key index ? */
int
index
=
(
dwrq
->
flags
&
IW_ENCODE_INDEX
)
-
1
;
if
(
index
>=
0
&&
index
<
4
)
{
priv
->
wep
.
default_key
=
index
;
priv
->
default_key
=
index
;
}
else
/* Don't complain if only change the mode */
if
(
!
dwrq
->
flags
&
IW_ENCODE_MODE
)
{
...
...
@@ -1633,19 +1709,23 @@ static int atmel_set_encode(struct net_device *dev,
}
/* Read the flags */
if
(
dwrq
->
flags
&
IW_ENCODE_DISABLED
)
{
priv
->
wep
.
wep_is_on
=
0
;
priv
->
wep
.
encryption_level
=
0
;
priv
->
wep_is_on
=
0
;
priv
->
encryption_level
=
0
;
priv
->
pairwise_cipher_suite
=
CIPHER_SUITE_NONE
;
}
else
{
priv
->
wep
.
wep_is_on
=
1
;
if
(
priv
->
wep_key_len
[
priv
->
wep
.
default_key
]
>
5
)
priv
->
wep
.
encryption_level
=
2
;
else
priv
->
wep
.
encryption_level
=
1
;
priv
->
wep_is_on
=
1
;
if
(
priv
->
wep_key_len
[
priv
->
default_key
]
>
5
)
{
priv
->
pairwise_cipher_suite
=
CIPHER_SUITE_WEP_128
;
priv
->
encryption_level
=
2
;
}
else
{
priv
->
pairwise_cipher_suite
=
CIPHER_SUITE_WEP_64
;
priv
->
encryption_level
=
1
;
}
}
if
(
dwrq
->
flags
&
IW_ENCODE_RESTRICTED
)
priv
->
wep
.
exclude_unencrypted
=
1
;
priv
->
exclude_unencrypted
=
1
;
if
(
dwrq
->
flags
&
IW_ENCODE_OPEN
)
priv
->
wep
.
exclude_unencrypted
=
0
;
priv
->
exclude_unencrypted
=
0
;
return
-
EINPROGRESS
;
/* Call commit handler */
}
...
...
@@ -1659,16 +1739,16 @@ static int atmel_get_encode(struct net_device *dev,
struct
atmel_private
*
priv
=
dev
->
priv
;
int
index
=
(
dwrq
->
flags
&
IW_ENCODE_INDEX
)
-
1
;
if
(
!
priv
->
wep
.
wep
_is_on
)
if
(
!
priv
->
wep_is_on
)
dwrq
->
flags
=
IW_ENCODE_DISABLED
;
else
if
(
priv
->
wep
.
exclude_unencrypted
)
else
if
(
priv
->
exclude_unencrypted
)
dwrq
->
flags
=
IW_ENCODE_RESTRICTED
;
else
dwrq
->
flags
=
IW_ENCODE_OPEN
;
/* Which key do we want ? -1 -> tx index */
if
(
index
<
0
||
index
>=
4
)
index
=
priv
->
wep
.
default_key
;
index
=
priv
->
default_key
;
dwrq
->
flags
|=
index
+
1
;
/* Copy the key to the user buffer */
dwrq
->
length
=
priv
->
wep_key_len
[
index
];
...
...
@@ -1676,7 +1756,7 @@ static int atmel_get_encode(struct net_device *dev,
dwrq
->
length
=
0
;
}
else
{
memset
(
extra
,
0
,
16
);
memcpy
(
extra
,
priv
->
wep
.
wep
_keys
[
index
],
dwrq
->
length
);
memcpy
(
extra
,
priv
->
wep_keys
[
index
],
dwrq
->
length
);
}
return
0
;
...
...
@@ -1711,10 +1791,10 @@ static int atmel_set_rate(struct net_device *dev,
}
else
{
/* Setting by frequency value */
switch
(
vwrq
->
value
)
{
case
(
int
)
1e6
:
priv
->
tx_rate
=
0
;
break
;
case
(
int
)
2e6
:
priv
->
tx_rate
=
1
;
break
;
case
(
int
)
5.5e6
:
priv
->
tx_rate
=
2
;
break
;
case
(
int
)
11e6
:
priv
->
tx_rate
=
3
;
break
;
case
1000000
:
priv
->
tx_rate
=
0
;
break
;
case
2000000
:
priv
->
tx_rate
=
1
;
break
;
case
5500000
:
priv
->
tx_rate
=
2
;
break
;
case
11000000
:
priv
->
tx_rate
=
3
;
break
;
default:
return
-
EINVAL
;
}
}
...
...
@@ -1757,14 +1837,14 @@ static int atmel_get_rate(struct net_device *dev,
if
(
priv
->
auto_tx_rate
)
{
vwrq
->
fixed
=
0
;
vwrq
->
value
=
11
e6
;
vwrq
->
value
=
11
000000
;
}
else
{
vwrq
->
fixed
=
1
;
switch
(
priv
->
tx_rate
)
{
case
0
:
vwrq
->
value
=
1e6
;
break
;
case
1
:
vwrq
->
value
=
2e6
;
break
;
case
2
:
vwrq
->
value
=
5.5e6
;
break
;
case
3
:
vwrq
->
value
=
11
e6
;
break
;
case
0
:
vwrq
->
value
=
1000000
;
break
;
case
1
:
vwrq
->
value
=
2000000
;
break
;
case
2
:
vwrq
->
value
=
5500000
;
break
;
case
3
:
vwrq
->
value
=
11
000000
;
break
;
}
}
return
0
;
...
...
@@ -1982,6 +2062,7 @@ static int atmel_set_scan(struct net_device *dev,
atmel_clear_gcr
(
dev
,
GCR_ENINT
);
/* disable interrupts */
del_timer_sync
(
&
priv
->
management_timer
);
priv
->
fast_scan
=
0
;
atmel_scan
(
priv
,
0
);
atmel_set_gcr
(
dev
,
GCR_ENINT
);
/* enable interrupts */
...
...
@@ -2073,10 +2154,10 @@ static int atmel_get_range(struct net_device *dev,
range
->
max_qual
.
noise
=
0
;
range
->
sensitivity
=
0
;
range
->
bitrate
[
0
]
=
1e6
;
range
->
bitrate
[
1
]
=
2e6
;
range
->
bitrate
[
2
]
=
5.5e6
;
range
->
bitrate
[
3
]
=
11
e6
;
range
->
bitrate
[
0
]
=
1000000
;
range
->
bitrate
[
1
]
=
2000000
;
range
->
bitrate
[
2
]
=
5500000
;
range
->
bitrate
[
3
]
=
11
000000
;
range
->
num_bitrates
=
4
;
range
->
min_rts
=
0
;
...
...
@@ -2129,9 +2210,9 @@ static int atmel_set_wap(struct net_device *dev,
for
(
i
=
0
;
i
<
priv
->
BSS_list_entries
;
i
++
)
{
if
(
memcmp
(
priv
->
BSSinfo
[
i
].
BSSID
,
awrq
->
sa_data
,
6
)
==
0
)
{
if
(
!
priv
->
wep
.
wep
_is_on
&&
priv
->
BSSinfo
[
i
].
UsingWEP
)
{
if
(
!
priv
->
wep_is_on
&&
priv
->
BSSinfo
[
i
].
UsingWEP
)
{
return
-
EINVAL
;
}
else
if
(
priv
->
wep
.
wep
_is_on
&&
!
priv
->
BSSinfo
[
i
].
UsingWEP
)
{
}
else
if
(
priv
->
wep_is_on
&&
!
priv
->
BSSinfo
[
i
].
UsingWEP
)
{
return
-
EINVAL
;
}
else
atmel_join_bss
(
priv
,
i
);
...
...
@@ -2313,10 +2394,13 @@ static void atmel_enter_state(struct atmel_private *priv, int new_state)
if
(
new_state
==
old_state
)
return
;
if
(
new_state
==
STATION_STATE_READY
)
if
(
new_state
==
STATION_STATE_READY
)
{
netif_start_queue
(
priv
->
dev
);
netif_carrier_on
(
priv
->
dev
);
}
if
(
old_state
==
STATION_STATE_READY
)
{
netif_carrier_off
(
priv
->
dev
);
netif_stop_queue
(
priv
->
dev
);
priv
->
last_beacon_timestamp
=
0
;
}
...
...
@@ -2453,7 +2537,7 @@ static void send_authentication_request(struct atmel_private *priv, u8 *challeng
memcpy
(
header
.
addr2
,
priv
->
dev
->
dev_addr
,
6
);
memcpy
(
header
.
addr3
,
priv
->
CurrentBSSID
,
6
);
if
(
priv
->
wep
.
wep
_is_on
)
{
if
(
priv
->
wep_is_on
)
{
auth
.
alg
=
C80211_MGMT_AAN_SHAREDKEY
;
/* no WEP for authentication frames with TrSeqNo 1 */
if
(
priv
->
CurrentAuthentTransactionSeqNum
!=
1
)
...
...
@@ -2504,7 +2588,7 @@ static void send_association_request(struct atmel_private *priv, int is_reassoc)
memcpy
(
header
.
addr3
,
priv
->
CurrentBSSID
,
6
);
body
.
capability
=
cpu_to_le16
(
C80211_MGMT_CAPABILITY_ESS
);
if
(
priv
->
wep
.
wep
_is_on
)
if
(
priv
->
wep_is_on
)
body
.
capability
|=
cpu_to_le16
(
C80211_MGMT_CAPABILITY_Privacy
);
if
(
priv
->
preamble
==
SHORT_PREAMBLE
)
body
.
capability
|=
cpu_to_le16
(
C80211_MGMT_CAPABILITY_ShortPreamble
);
...
...
@@ -2555,8 +2639,8 @@ static int retrieve_bss(struct atmel_private *priv)
priv
->
current_BSS
=
0
;
for
(
i
=
0
;
i
<
priv
->
BSS_list_entries
;
i
++
)
{
if
(
priv
->
operating_mode
==
priv
->
BSSinfo
[
i
].
BSStype
&&
((
!
priv
->
wep
.
wep
_is_on
&&
!
priv
->
BSSinfo
[
i
].
UsingWEP
)
||
(
priv
->
wep
.
wep
_is_on
&&
priv
->
BSSinfo
[
i
].
UsingWEP
))
&&
((
!
priv
->
wep_is_on
&&
!
priv
->
BSSinfo
[
i
].
UsingWEP
)
||
(
priv
->
wep_is_on
&&
priv
->
BSSinfo
[
i
].
UsingWEP
))
&&
!
(
priv
->
BSSinfo
[
i
].
channel
&
0x80
))
{
max_rssi
=
priv
->
BSSinfo
[
i
].
RSSI
;
priv
->
current_BSS
=
max_index
=
i
;
...
...
@@ -2630,7 +2714,7 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
u16
status
=
le16_to_cpu
(
auth
->
status
);
u16
trans_seq_no
=
le16_to_cpu
(
auth
->
trans_seq
);
if
(
status
==
C80211_MGMT_SC_Success
&&
!
priv
->
wep
.
wep
_is_on
)
{
if
(
status
==
C80211_MGMT_SC_Success
&&
!
priv
->
wep_is_on
)
{
/* no WEP */
if
(
priv
->
station_was_associated
)
{
atmel_enter_state
(
priv
,
STATION_STATE_REASSOCIATING
);
...
...
@@ -2643,7 +2727,7 @@ static void authenticate(struct atmel_private *priv, u16 frame_len)
}
}
if
(
status
==
C80211_MGMT_SC_Success
&&
priv
->
wep
.
wep
_is_on
)
{
if
(
status
==
C80211_MGMT_SC_Success
&&
priv
->
wep_is_on
)
{
/* WEP */
if
(
trans_seq_no
!=
priv
->
ExpectedAuthentTransactionSeqNum
)
return
;
...
...
@@ -2765,6 +2849,10 @@ void atmel_join_bss(struct atmel_private *priv, int bss_index)
memcpy
(
priv
->
CurrentBSSID
,
bss
->
BSSID
,
6
);
memcpy
(
priv
->
SSID
,
bss
->
SSID
,
priv
->
SSID_size
=
bss
->
SSIDsize
);
/* The WPA stuff cares about the current AP address */
if
(
priv
->
use_wpa
)
build_wpa_mib
(
priv
);
/* When switching to AdHoc turn OFF Power Save if needed */
...
...
@@ -2786,13 +2874,13 @@ void atmel_join_bss(struct atmel_private *priv, int bss_index)
atmel_set_mib8
(
priv
,
Local_Mib_Type
,
LOCAL_MIB_PREAMBLE_TYPE
,
bss
->
preamble
);
}
if
(
!
priv
->
wep
.
wep
_is_on
&&
bss
->
UsingWEP
)
{
if
(
!
priv
->
wep_is_on
&&
bss
->
UsingWEP
)
{
atmel_enter_state
(
priv
,
STATION_STATE_MGMT_ERROR
);
priv
->
station_is_associated
=
0
;
return
;
}
if
(
priv
->
wep
.
wep
_is_on
&&
!
bss
->
UsingWEP
)
{
if
(
priv
->
wep_is_on
&&
!
bss
->
UsingWEP
)
{
atmel_enter_state
(
priv
,
STATION_STATE_MGMT_ERROR
);
priv
->
station_is_associated
=
0
;
return
;
...
...
@@ -3071,6 +3159,7 @@ static void atmel_command_irq(struct atmel_private *priv)
priv
->
fast_scan
=
!
fast_scan
;
atmel_scan
(
priv
,
1
);
}
priv
->
site_survey_state
=
SITE_SURVEY_COMPLETED
;
}
break
;
...
...
@@ -3104,12 +3193,8 @@ static void atmel_command_irq(struct atmel_private *priv)
return
;
}
if
(
priv
->
station_state
==
STATION_STATE_FORCED_JOINNING
)
{
atmel_enter_state
(
priv
,
STATION_STATE_FORCED_JOIN_FAILURE
);
}
else
{
atmel_scan
(
priv
,
1
);
}
atmel_scan
(
priv
,
1
);
}
}
...
...
@@ -3275,7 +3360,7 @@ static int probe_atmel_card(struct net_device *dev)
printk
(
KERN_ALERT
"%s: *** Invalid MAC address. UPGRADE Firmware ****
\n
"
,
dev
->
name
);
memcpy
(
dev
->
dev_addr
,
default_mac
,
6
);
}
printk
(
KERN_INFO
"%s: MAC address %
x:%x:%x:%x:%x:%
x
\n
"
,
printk
(
KERN_INFO
"%s: MAC address %
.2x:%.2x:%.2x:%.2x:%.2x:%.2
x
\n
"
,
dev
->
name
,
dev
->
dev_addr
[
0
],
dev
->
dev_addr
[
1
],
dev
->
dev_addr
[
2
],
dev
->
dev_addr
[
3
],
dev
->
dev_addr
[
4
],
dev
->
dev_addr
[
5
]
);
...
...
@@ -3285,6 +3370,105 @@ static int probe_atmel_card(struct net_device *dev)
return
rc
;
}
static
void
build_wep_mib
(
struct
atmel_private
*
priv
)
/* Move the encyption information on the MIB structure.
This routine is for the pre-WPA firmware: later firmware has
a different format MIB and a different routine. */
{
struct
{
/* NB this is matched to the hardware, don't change. */
u8
wep_is_on
;
u8
default_key
;
/* 0..3 */
u8
reserved
;
u8
exclude_unencrypted
;
u32
WEPICV_error_count
;
u32
WEP_excluded_count
;
u8
wep_keys
[
MAX_ENCRYPTION_KEYS
][
13
];
u8
encryption_level
;
/* 0, 1, 2 */
u8
reserved2
[
3
];
}
mib
;
int
i
;
mib
.
wep_is_on
=
priv
->
wep_is_on
;
if
(
priv
->
wep_is_on
)
{
if
(
priv
->
wep_key_len
[
priv
->
default_key
]
>
5
)
mib
.
encryption_level
=
2
;
else
mib
.
encryption_level
=
1
;
}
else
{
mib
.
encryption_level
=
0
;
}
mib
.
default_key
=
priv
->
default_key
;
mib
.
exclude_unencrypted
=
priv
->
exclude_unencrypted
;
for
(
i
=
0
;
i
<
MAX_ENCRYPTION_KEYS
;
i
++
)
memcpy
(
mib
.
wep_keys
[
i
],
priv
->
wep_keys
[
i
],
13
);
atmel_set_mib
(
priv
,
Mac_Wep_Mib_Type
,
0
,
(
u8
*
)
&
mib
,
sizeof
(
mib
));
}
static
void
build_wpa_mib
(
struct
atmel_private
*
priv
)
{
/* This is for the later (WPA enabled) firmware. */
struct
{
/* NB this is matched to the hardware, don't change. */
u8
cipher_default_key_value
[
MAX_ENCRYPTION_KEYS
][
MAX_ENCRYPTION_KEY_SIZE
];
u8
receiver_address
[
6
];
u8
wep_is_on
;
u8
default_key
;
/* 0..3 */
u8
group_key
;
u8
exclude_unencrypted
;
u8
encryption_type
;
u8
reserved
;
u32
WEPICV_error_count
;
u32
WEP_excluded_count
;
u8
key_RSC
[
4
][
8
];
}
mib
;
int
i
;
mib
.
wep_is_on
=
priv
->
wep_is_on
;
mib
.
exclude_unencrypted
=
priv
->
exclude_unencrypted
;
memcpy
(
mib
.
receiver_address
,
priv
->
CurrentBSSID
,
6
);
/* zero all the keys before adding in valid ones. */
memset
(
mib
.
cipher_default_key_value
,
0
,
sizeof
(
mib
.
cipher_default_key_value
));
if
(
priv
->
wep_is_on
)
{
/* There's a comment in the Atmel code to the effect that this is only valid
when still using WEP, it may need to be set to something to use WPA */
memset
(
mib
.
key_RSC
,
0
,
sizeof
(
mib
.
key_RSC
));
mib
.
default_key
=
mib
.
group_key
=
255
;
for
(
i
=
0
;
i
<
MAX_ENCRYPTION_KEYS
;
i
++
)
{
if
(
priv
->
wep_key_len
[
i
]
>
0
)
{
memcpy
(
mib
.
cipher_default_key_value
[
i
],
priv
->
wep_keys
[
i
],
MAX_ENCRYPTION_KEY_SIZE
);
if
(
i
==
priv
->
default_key
)
{
mib
.
default_key
=
i
;
mib
.
cipher_default_key_value
[
i
][
MAX_ENCRYPTION_KEY_SIZE
-
1
]
=
7
;
mib
.
cipher_default_key_value
[
i
][
MAX_ENCRYPTION_KEY_SIZE
-
2
]
=
priv
->
pairwise_cipher_suite
;
}
else
{
mib
.
group_key
=
i
;
priv
->
group_cipher_suite
=
priv
->
pairwise_cipher_suite
;
mib
.
cipher_default_key_value
[
i
][
MAX_ENCRYPTION_KEY_SIZE
-
1
]
=
1
;
mib
.
cipher_default_key_value
[
i
][
MAX_ENCRYPTION_KEY_SIZE
-
2
]
=
priv
->
group_cipher_suite
;
}
}
}
if
(
mib
.
default_key
==
255
)
mib
.
default_key
=
mib
.
group_key
!=
255
?
mib
.
group_key
:
0
;
if
(
mib
.
group_key
==
255
)
mib
.
group_key
=
mib
.
default_key
;
}
atmel_set_mib
(
priv
,
Mac_Wep_Mib_Type
,
0
,
(
u8
*
)
&
mib
,
sizeof
(
mib
));
}
int
reset_atmel_card
(
struct
net_device
*
dev
)
{
/* do everything necessary to wake up the hardware, including
...
...
@@ -3305,6 +3489,15 @@ int reset_atmel_card(struct net_device *dev)
struct
atmel_private
*
priv
=
dev
->
priv
;
u8
configuration
;
/* data to add to the firmware names, in priority order
this implemenents firmware versioning */
static
char
*
firmware_modifier
[]
=
{
"-wpa"
,
""
,
NULL
};
if
(
priv
->
station_state
==
STATION_STATE_NO_CARD
||
priv
->
station_state
==
STATION_STATE_DOWN
)
return
0
;
...
...
@@ -3341,21 +3534,41 @@ int reset_atmel_card(struct net_device *dev)
unsigned
char
*
fw
;
int
len
=
priv
->
firmware_length
;
if
(
!
(
fw
=
priv
->
firmware
))
{
if
(
strlen
(
priv
->
firmware_id
)
==
0
)
{
printk
(
KERN_INFO
"%s: card type is unknown: assuming at76c502 firmware is OK.
\n
"
,
dev
->
name
);
printk
(
KERN_INFO
"%s: if not, use the firmware= module parameter.
\n
"
,
dev
->
name
);
strcpy
(
priv
->
firmware_id
,
"atmel_at76c502.bin"
);
}
if
(
request_firmware
(
&
fw_entry
,
priv
->
firmware_id
,
priv
->
sys_dev
)
!=
0
)
{
printk
(
KERN_ALERT
"%s: firmware %s is missing, cannot start.
\n
"
,
dev
->
name
,
priv
->
firmware_id
);
return
0
;
if
(
strlen
(
priv
->
firmware_template
)
==
0
)
{
if
(
strlen
(
priv
->
firmware_id
)
==
0
)
{
printk
(
KERN_INFO
"%s: card type is unknown: assuming at76c502 firmware is OK.
\n
"
,
dev
->
name
);
printk
(
KERN_INFO
"%s: if not, use the firmware= module parameter.
\n
"
,
dev
->
name
);
strcpy
(
priv
->
firmware_id
,
"atmel_at76c502.bin"
);
}
if
(
request_firmware
(
&
fw_entry
,
priv
->
firmware_id
,
priv
->
sys_dev
)
!=
0
)
{
printk
(
KERN_ALERT
"%s: firmware %s is missing, cannot continue.
\n
"
,
dev
->
name
,
priv
->
firmware_id
);
return
0
;
}
}
else
{
int
i
;
for
(
i
=
0
;
firmware_modifier
[
i
];
i
++
)
{
sprintf
(
priv
->
firmware_id
,
priv
->
firmware_template
,
firmware_modifier
[
i
]);
if
(
request_firmware
(
&
fw_entry
,
priv
->
firmware_id
,
priv
->
sys_dev
)
==
0
)
break
;
}
if
(
!
firmware_modifier
[
i
])
{
printk
(
KERN_ALERT
"%s: firmware %s is missing, cannot start.
\n
"
,
dev
->
name
,
priv
->
firmware_id
);
priv
->
firmware_id
[
0
]
=
'\0'
;
return
0
;
}
priv
->
firmware_template
[
0
]
=
'\0'
;
}
fw
=
fw_entry
->
data
;
len
=
fw_entry
->
size
;
}
...
...
@@ -3379,6 +3592,10 @@ int reset_atmel_card(struct net_device *dev)
if
(
!
atmel_wakeup_firmware
(
priv
))
return
0
;
/* Check the version and set the correct flag for wpa stuff,
old and new firmware is incompatible. */
priv
->
use_wpa
=
(
priv
->
host_info
.
major_version
>=
4
);
/* unmask all irq sources */
atmel_wmem8
(
priv
,
atmel_hi
(
priv
,
IFACE_INT_MASK_OFFSET
),
0xff
);
...
...
@@ -3447,9 +3664,12 @@ int reset_atmel_card(struct net_device *dev)
atmel_set_mib16
(
priv
,
Mac_Mgmt_Mib_Type
,
MAC_MGMT_MIB_LISTEN_INTERVAL_POS
,
1
);
atmel_set_mib16
(
priv
,
Mac_Mgmt_Mib_Type
,
MAC_MGMT_MIB_BEACON_PER_POS
,
priv
->
default_beacon_period
);
atmel_set_mib
(
priv
,
Phy_Mib_Type
,
PHY_MIB_RATE_SET_POS
,
atmel_basic_rates
,
4
);
atmel_set_mib8
(
priv
,
Mac_Mgmt_Mib_Type
,
MAC_MGMT_MIB_CUR_PRIVACY_POS
,
priv
->
wep
.
wep_is_on
);
atmel_set_mib
(
priv
,
Mac_Wep_Mib_Type
,
0
,
(
u8
*
)
&
priv
->
wep
,
sizeof
(
priv
->
wep
));
atmel_set_mib8
(
priv
,
Mac_Mgmt_Mib_Type
,
MAC_MGMT_MIB_CUR_PRIVACY_POS
,
priv
->
wep_is_on
);
if
(
priv
->
use_wpa
)
build_wpa_mib
(
priv
);
else
build_wep_mib
(
priv
);
atmel_scan
(
priv
,
1
);
atmel_set_gcr
(
priv
->
dev
,
GCR_ENINT
);
/* enable interrupts */
...
...
@@ -3500,8 +3720,8 @@ static u8 atmel_get_mib8(struct atmel_private *priv, u8 type, u8 index)
m
.
size
=
1
;
m
.
index
=
index
;
atmel_send_command_wait
(
priv
,
CMD_Get_MIB_Vars
,
&
m
,
sizeof
(
m
)
);
return
atmel_rmem8
(
priv
,
atmel_co
(
priv
,
CMD_BLOCK_PARAMETERS_OFFSET
+
4
));
atmel_send_command_wait
(
priv
,
CMD_Get_MIB_Vars
,
&
m
,
MIB_HEADER_SIZE
+
1
);
return
atmel_rmem8
(
priv
,
atmel_co
(
priv
,
CMD_BLOCK_PARAMETERS_OFFSET
+
MIB_HEADER_SIZE
));
}
static
void
atmel_set_mib8
(
struct
atmel_private
*
priv
,
u8
type
,
u8
index
,
u8
data
)
...
...
@@ -3512,7 +3732,7 @@ static void atmel_set_mib8(struct atmel_private *priv, u8 type, u8 index, u8 dat
m
.
index
=
index
;
m
.
data
[
0
]
=
data
;
atmel_send_command_wait
(
priv
,
CMD_Set_MIB_Vars
,
&
m
,
sizeof
(
m
)
);
atmel_send_command_wait
(
priv
,
CMD_Set_MIB_Vars
,
&
m
,
MIB_HEADER_SIZE
+
1
);
}
static
void
atmel_set_mib16
(
struct
atmel_private
*
priv
,
u8
type
,
u8
index
,
u16
data
)
...
...
@@ -3524,7 +3744,7 @@ static void atmel_set_mib16(struct atmel_private *priv, u8 type, u8 index, u16 d
m
.
data
[
0
]
=
data
;
m
.
data
[
1
]
=
data
>>
8
;
atmel_send_command_wait
(
priv
,
CMD_Set_MIB_Vars
,
&
m
,
sizeof
(
m
)
);
atmel_send_command_wait
(
priv
,
CMD_Set_MIB_Vars
,
&
m
,
MIB_HEADER_SIZE
+
2
);
}
static
void
atmel_set_mib
(
struct
atmel_private
*
priv
,
u8
type
,
u8
index
,
u8
*
data
,
int
data_len
)
...
...
@@ -3534,8 +3754,11 @@ static void atmel_set_mib(struct atmel_private *priv, u8 type, u8 index, u8 *dat
m
.
size
=
data_len
;
m
.
index
=
index
;
if
(
data_len
>
MIB_MAX_DATA_BYTES
)
printk
(
KERN_ALERT
"%s: MIB buffer too small.
\n
"
,
priv
->
dev
->
name
);
memcpy
(
m
.
data
,
data
,
data_len
);
atmel_send_command_wait
(
priv
,
CMD_Set_MIB_Vars
,
&
m
,
sizeof
(
m
)
);
atmel_send_command_wait
(
priv
,
CMD_Set_MIB_Vars
,
&
m
,
MIB_HEADER_SIZE
+
data_len
);
}
static
void
atmel_get_mib
(
struct
atmel_private
*
priv
,
u8
type
,
u8
index
,
u8
*
data
,
int
data_len
)
...
...
@@ -3545,10 +3768,14 @@ static void atmel_get_mib(struct atmel_private *priv, u8 type, u8 index, u8 *dat
m
.
size
=
data_len
;
m
.
index
=
index
;
atmel_send_command_wait
(
priv
,
CMD_Get_MIB_Vars
,
&
m
,
sizeof
(
m
));
atmel_copy_to_host
(
priv
->
dev
,
data
,
atmel_co
(
priv
,
CMD_BLOCK_PARAMETERS_OFFSET
+
4
),
data_len
);
}
if
(
data_len
>
MIB_MAX_DATA_BYTES
)
printk
(
KERN_ALERT
"%s: MIB buffer too small.
\n
"
,
priv
->
dev
->
name
);
atmel_send_command_wait
(
priv
,
CMD_Get_MIB_Vars
,
&
m
,
MIB_HEADER_SIZE
+
data_len
);
atmel_copy_to_host
(
priv
->
dev
,
data
,
atmel_co
(
priv
,
CMD_BLOCK_PARAMETERS_OFFSET
+
MIB_HEADER_SIZE
),
data_len
);
}
static
void
atmel_writeAR
(
struct
net_device
*
dev
,
u16
data
)
{
int
i
;
...
...
drivers/net/wireless/atmel_cs.c
View file @
cca52de4
...
...
@@ -330,20 +330,20 @@ static struct {
char
*
firmware
;
char
*
name
;
}
card_table
[]
=
{
{
0
,
0
,
"WLAN/802.11b PC CARD"
,
"atmel_at76c502d.bin"
,
"Actiontec 802CAT1"
},
{
0
,
0
,
"ATMEL/AT76C502AR"
,
"atmel_at76c502.bin"
,
"NoName-RFMD"
},
{
0
,
0
,
"ATMEL/AT76C502AR_D"
,
"atmel_at76c502d.bin"
,
"NoName-revD"
},
{
0
,
0
,
"ATMEL/AT76C502AR_E"
,
"atmel_at76c502e.bin"
,
"NoName-revE"
},
{
0
,
0
,
"ATMEL/AT76C504"
,
"atmel_at76c504.bin"
,
"NoName-504"
},
{
MANFID_3COM
,
0x0620
,
NULL
,
"atmel_at76c502_3com.bin"
,
"3com 3CRWE62092B"
},
{
MANFID_3COM
,
0x0696
,
NULL
,
"atmel_at76c502_3com.bin"
,
"3com 3CRSHPW_96"
},
{
0
,
0
,
"SMC/2632W-V2"
,
"atmel_at76c502.bin"
,
"SMC 2632W-V2"
},
{
0
,
0
,
"SMC/2632W"
,
"atmel_at76c502d.bin"
,
"SMC 2632W-V3"
},
{
0xd601
,
0x0007
,
NULL
,
"atmel_at76c502.bin"
,
"Sitecom WLAN-011"
},
/* suspect - from a usenet posting. */
{
0x01bf
,
0x3302
,
NULL
,
"atmel_at76c502d.bin"
,
"Belkin F5D6060u"
},
/* " " " " " */
{
0
,
0
,
"BT/Voyager 1020 Laptop Adapter"
,
"atmel_at76c502.bin"
,
"BT Voyager 1020"
},
{
0
,
0
,
"IEEE 802.11b/Wireless LAN PC Card"
,
"atmel_at76c502.bin"
,
"Siemens Gigaset PC Card II"
},
{
0
,
0
,
"CNet/CNWLC 11Mbps Wireless PC Card V-5"
,
"atmel_at76c502e.bin"
,
"CNet CNWLC-811ARL"
}
{
0
,
0
,
"WLAN/802.11b PC CARD"
,
"atmel_at76c502d
%s
.bin"
,
"Actiontec 802CAT1"
},
{
0
,
0
,
"ATMEL/AT76C502AR"
,
"atmel_at76c502
%s
.bin"
,
"NoName-RFMD"
},
{
0
,
0
,
"ATMEL/AT76C502AR_D"
,
"atmel_at76c502d
%s
.bin"
,
"NoName-revD"
},
{
0
,
0
,
"ATMEL/AT76C502AR_E"
,
"atmel_at76c502e
%s
.bin"
,
"NoName-revE"
},
{
0
,
0
,
"ATMEL/AT76C504"
,
"atmel_at76c504
%s
.bin"
,
"NoName-504"
},
{
MANFID_3COM
,
0x0620
,
NULL
,
"atmel_at76c502_3com
%s
.bin"
,
"3com 3CRWE62092B"
},
{
MANFID_3COM
,
0x0696
,
NULL
,
"atmel_at76c502_3com
%s
.bin"
,
"3com 3CRSHPW_96"
},
{
0
,
0
,
"SMC/2632W-V2"
,
"atmel_at76c502
%s
.bin"
,
"SMC 2632W-V2"
},
{
0
,
0
,
"SMC/2632W"
,
"atmel_at76c502d
%s
.bin"
,
"SMC 2632W-V3"
},
{
0xd601
,
0x0007
,
NULL
,
"atmel_at76c502
%s
.bin"
,
"Sitecom WLAN-011"
},
/* suspect - from a usenet posting. */
{
0x01bf
,
0x3302
,
NULL
,
"atmel_at76c502d
%s
.bin"
,
"Belkin F5D6060u"
},
/* " " " " " */
{
0
,
0
,
"BT/Voyager 1020 Laptop Adapter"
,
"atmel_at76c502
%s
.bin"
,
"BT Voyager 1020"
},
{
0
,
0
,
"IEEE 802.11b/Wireless LAN PC Card"
,
"atmel_at76c502
%s
.bin"
,
"Siemens Gigaset PC Card II"
},
{
0
,
0
,
"CNet/CNWLC 11Mbps Wireless PC Card V-5"
,
"atmel_at76c502e
%s
.bin"
,
"CNet CNWLC-811ARL"
}
};
/* This is strictly temporary, until PCMCIA devices get integrated into the device model. */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment