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
Kirill Smelkov
linux
Commits
4b743325
Commit
4b743325
authored
Oct 21, 2004
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge pobox.com:/garz/repo/netdev-2.6/prism54
into pobox.com:/garz/repo/net-drivers-2.6
parents
1fc12ca8
991ae550
Changes
13
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
728 additions
and
136 deletions
+728
-136
drivers/net/wireless/prism54/isl_38xx.c
drivers/net/wireless/prism54/isl_38xx.c
+5
-10
drivers/net/wireless/prism54/isl_38xx.h
drivers/net/wireless/prism54/isl_38xx.h
+4
-0
drivers/net/wireless/prism54/isl_ioctl.c
drivers/net/wireless/prism54/isl_ioctl.c
+554
-85
drivers/net/wireless/prism54/isl_ioctl.h
drivers/net/wireless/prism54/isl_ioctl.h
+2
-0
drivers/net/wireless/prism54/isl_oid.h
drivers/net/wireless/prism54/isl_oid.h
+9
-0
drivers/net/wireless/prism54/islpci_dev.c
drivers/net/wireless/prism54/islpci_dev.c
+32
-17
drivers/net/wireless/prism54/islpci_dev.h
drivers/net/wireless/prism54/islpci_dev.h
+4
-0
drivers/net/wireless/prism54/islpci_eth.c
drivers/net/wireless/prism54/islpci_eth.c
+3
-2
drivers/net/wireless/prism54/islpci_hotplug.c
drivers/net/wireless/prism54/islpci_hotplug.c
+0
-3
drivers/net/wireless/prism54/islpci_mgt.c
drivers/net/wireless/prism54/islpci_mgt.c
+1
-0
drivers/net/wireless/prism54/islpci_mgt.h
drivers/net/wireless/prism54/islpci_mgt.h
+0
-2
drivers/net/wireless/prism54/oid_mgt.c
drivers/net/wireless/prism54/oid_mgt.c
+110
-16
drivers/net/wireless/prism54/oid_mgt.h
drivers/net/wireless/prism54/oid_mgt.h
+4
-1
No files found.
drivers/net/wireless/prism54/isl_38xx.c
View file @
4b743325
...
...
@@ -133,8 +133,8 @@ isl38xx_trigger_device(int asleep, void __iomem *device_base)
readl
(
device_base
+
ISL38XX_CTRL_STAT_REG
));
udelay
(
ISL38XX_WRITEIO_DELAY
);
if
(
reg
=
readl
(
device_base
+
ISL38XX_INT_IDENT_REG
),
reg
==
0xabadface
)
{
reg
=
readl
(
device_base
+
ISL38XX_INT_IDENT_REG
);
if
(
reg
==
0xabadface
)
{
#if VERBOSE > SHOW_ERROR_MESSAGES
do_gettimeofday
(
&
current_time
);
DEBUG
(
SHOW_TRACING
,
...
...
@@ -192,10 +192,8 @@ isl38xx_trigger_device(int asleep, void __iomem *device_base)
void
isl38xx_interface_reset
(
void
__iomem
*
device_base
,
dma_addr_t
host_address
)
{
u32
reg
;
#if VERBOSE > SHOW_ERROR_MESSAGES
DEBUG
(
SHOW_FUNCTION_CALLS
,
"isl38xx_interface_reset
\n
"
);
DEBUG
(
SHOW_FUNCTION_CALLS
,
"isl38xx_interface_reset
\n
"
);
#endif
/* load the address of the control block in the device */
...
...
@@ -203,8 +201,7 @@ isl38xx_interface_reset(void __iomem *device_base, dma_addr_t host_address)
udelay
(
ISL38XX_WRITEIO_DELAY
);
/* set the reset bit in the Device Interrupt Register */
isl38xx_w32_flush
(
device_base
,
ISL38XX_DEV_INT_RESET
,
ISL38XX_DEV_INT_REG
);
isl38xx_w32_flush
(
device_base
,
ISL38XX_DEV_INT_RESET
,
ISL38XX_DEV_INT_REG
);
udelay
(
ISL38XX_WRITEIO_DELAY
);
/* enable the interrupt for detecting initialization */
...
...
@@ -212,9 +209,7 @@ isl38xx_interface_reset(void __iomem *device_base, dma_addr_t host_address)
/* Note: Do not enable other interrupts here. We want the
* device to have come up first 100% before allowing any other
* interrupts. */
reg
=
ISL38XX_INT_IDENT_INIT
;
isl38xx_w32_flush
(
device_base
,
reg
,
ISL38XX_INT_EN_REG
);
isl38xx_w32_flush
(
device_base
,
ISL38XX_INT_IDENT_INIT
,
ISL38XX_INT_EN_REG
);
udelay
(
ISL38XX_WRITEIO_DELAY
);
/* allow complete full reset */
}
...
...
drivers/net/wireless/prism54/isl_38xx.h
View file @
4b743325
...
...
@@ -95,6 +95,10 @@ isl38xx_w32_flush(void __iomem *base, u32 val, unsigned long offset)
#define ISL38XX_INT_SOURCES 0x001E
/* Control/Status register bits */
/* Looks like there are other meaningful bits
0x20004400 seen in normal operation,
0x200044db at 'timeout waiting for mgmt response'
*/
#define ISL38XX_CTRL_STAT_SLEEPMODE 0x00000200
#define ISL38XX_CTRL_STAT_CLKRUN 0x00800000
#define ISL38XX_CTRL_STAT_RESET 0x10000000
...
...
drivers/net/wireless/prism54/isl_ioctl.c
View file @
4b743325
...
...
@@ -36,38 +36,6 @@
#include <net/iw_handler.h>
/* New driver API */
static
int
init_mode
=
CARD_DEFAULT_IW_MODE
;
static
int
init_channel
=
CARD_DEFAULT_CHANNEL
;
static
int
init_wep
=
CARD_DEFAULT_WEP
;
static
int
init_filter
=
CARD_DEFAULT_FILTER
;
static
int
init_authen
=
CARD_DEFAULT_AUTHEN
;
static
int
init_dot1x
=
CARD_DEFAULT_DOT1X
;
static
int
init_conformance
=
CARD_DEFAULT_CONFORMANCE
;
static
int
init_mlme
=
CARD_DEFAULT_MLME_MODE
;
module_param
(
init_mode
,
int
,
0
);
MODULE_PARM_DESC
(
init_mode
,
"Set card mode:
\n
0: Auto
\n
1: Ad-Hoc
\n
2: Managed Client (Default)
\n
3: Master / Access Point
\n
4: Repeater (Not supported yet)
\n
5: Secondary (Not supported yet)
\n
6: Monitor"
);
module_param
(
init_channel
,
int
,
0
);
MODULE_PARM_DESC
(
init_channel
,
"Check `iwpriv ethx channel` for available channels"
);
module_param
(
init_wep
,
int
,
0
);
module_param
(
init_filter
,
int
,
0
);
module_param
(
init_authen
,
int
,
0
);
MODULE_PARM_DESC
(
init_authen
,
"Authentication method. Can be of seven types:
\n
0 0x0000: None
\n
1 0x0001: DOT11_AUTH_OS (Default)
\n
2 0x0002: DOT11_AUTH_SK
\n
3 0x0003: DOT11_AUTH_BOTH"
);
module_param
(
init_dot1x
,
int
,
0
);
MODULE_PARM_DESC
(
init_dot1x
,
"
\n
0: None/not set (Default)
\n
1: DOT11_DOT1X_AUTHENABLED
\n
2: DOT11_DOT1X_KEYTXENABLED"
);
module_param
(
init_mlme
,
int
,
0
);
MODULE_PARM_DESC
(
init_mlme
,
"Sets the MAC layer management entity (MLME) mode of operation,
\n
0: DOT11_MLME_AUTO (Default)
\n
1: DOT11_MLME_INTERMEDIATE
\n
2: DOT11_MLME_EXTENDED"
);
/**
* prism54_mib_mode_helper - MIB change mode helper function
* @mib: the &struct islpci_mib object to modify
...
...
@@ -141,36 +109,34 @@ prism54_mib_mode_helper(islpci_private *priv, u32 iw_mode)
void
prism54_mib_init
(
islpci_private
*
priv
)
{
u32
t
;
u32
channel
,
authen
,
wep
,
filter
,
dot1x
,
mlme
,
conformance
,
power
,
mode
;
struct
obj_buffer
psm_buffer
=
{
.
size
=
PSM_BUFFER_SIZE
,
.
addr
=
priv
->
device_psm_buffer
};
mgt_set
(
priv
,
DOT11_OID_CHANNEL
,
&
init_channel
);
mgt_set
(
priv
,
DOT11_OID_AUTHENABLE
,
&
init_authen
);
mgt_set
(
priv
,
DOT11_OID_PRIVACYINVOKED
,
&
init_wep
);
channel
=
CARD_DEFAULT_CHANNEL
;
authen
=
CARD_DEFAULT_AUTHEN
;
wep
=
CARD_DEFAULT_WEP
;
filter
=
CARD_DEFAULT_FILTER
;
/* (0) Do not filter un-encrypted data */
dot1x
=
CARD_DEFAULT_DOT1X
;
mlme
=
CARD_DEFAULT_MLME_MODE
;
conformance
=
CARD_DEFAULT_CONFORMANCE
;
power
=
127
;
mode
=
CARD_DEFAULT_IW_MODE
;
mgt_set
(
priv
,
DOT11_OID_CHANNEL
,
&
channel
);
mgt_set
(
priv
,
DOT11_OID_AUTHENABLE
,
&
authen
);
mgt_set
(
priv
,
DOT11_OID_PRIVACYINVOKED
,
&
wep
);
mgt_set
(
priv
,
DOT11_OID_PSMBUFFER
,
&
psm_buffer
);
mgt_set
(
priv
,
DOT11_OID_EXUNENCRYPTED
,
&
init_filter
);
mgt_set
(
priv
,
DOT11_OID_DOT1XENABLE
,
&
init_dot1x
);
mgt_set
(
priv
,
DOT11_OID_MLMEAUTOLEVEL
,
&
init_mlme
);
mgt_set
(
priv
,
OID_INL_DOT11D_CONFORMANCE
,
&
init_conformance
);
t
=
127
;
mgt_set
(
priv
,
OID_INL_OUTPUTPOWER
,
&
t
);
/* Important: we are setting a default wireless mode and we are
* forcing a valid one, so prism54_mib_mode_helper should just set
* mib values depending on what the wireless mode given is. No need
* for it save old values */
if
(
init_mode
>
IW_MODE_MONITOR
||
init_mode
<
IW_MODE_AUTO
)
{
printk
(
KERN_DEBUG
"%s(): You passed a non-valid init_mode. "
"Using default mode
\n
"
,
__FUNCTION__
);
init_mode
=
CARD_DEFAULT_IW_MODE
;
}
mgt_set
(
priv
,
DOT11_OID_EXUNENCRYPTED
,
&
filter
);
mgt_set
(
priv
,
DOT11_OID_DOT1XENABLE
,
&
dot1x
);
mgt_set
(
priv
,
DOT11_OID_MLMEAUTOLEVEL
,
&
mlme
);
mgt_set
(
priv
,
OID_INL_DOT11D_CONFORMANCE
,
&
conformance
);
mgt_set
(
priv
,
OID_INL_OUTPUTPOWER
,
&
power
);
/* This sets all of the mode-dependent values */
prism54_mib_mode_helper
(
priv
,
init_
mode
);
prism54_mib_mode_helper
(
priv
,
mode
);
}
/* this will be executed outside of atomic context thanks to
...
...
@@ -374,7 +340,10 @@ prism54_set_mode(struct net_device *ndev, struct iw_request_info *info,
mgt_set
(
priv
,
DOT11_OID_MLMEAUTOLEVEL
,
&
mlmeautolevel
);
mgt_commit
(
priv
);
if
(
mgt_commit
(
priv
))
{
up_write
(
&
priv
->
mib_sem
);
return
-
EIO
;
}
priv
->
ndev
->
type
=
(
priv
->
iw_mode
==
IW_MODE_MONITOR
)
?
priv
->
monitor_type
:
ARPHRD_ETHER
;
up_write
(
&
priv
->
mib_sem
);
...
...
@@ -485,6 +454,15 @@ prism54_get_range(struct net_device *ndev, struct iw_request_info *info,
/* txpower is supported in dBm's */
range
->
txpower_capa
=
IW_TXPOW_DBM
;
#if WIRELESS_EXT > 16
/* Event capability (kernel + driver) */
range
->
event_capa
[
0
]
=
(
IW_EVENT_CAPA_K_0
|
IW_EVENT_CAPA_MASK
(
SIOCGIWTHRSPY
)
|
IW_EVENT_CAPA_MASK
(
SIOCGIWAP
));
range
->
event_capa
[
1
]
=
IW_EVENT_CAPA_K_1
;
range
->
event_capa
[
4
]
=
IW_EVENT_CAPA_MASK
(
IWEVCUSTOM
);
#endif
/* WIRELESS_EXT > 16 */
if
(
islpci_get_state
(
priv
)
<
PRV_STATE_INIT
)
return
0
;
...
...
@@ -629,8 +607,8 @@ prism54_translate_bss(struct net_device *ndev, char *current_ev,
current_ev
=
iwe_stream_add_point
(
current_ev
,
end_buf
,
&
iwe
,
NULL
);
/* Add frequency. (short) bss->channel is the frequency in MHz */
iwe
.
u
.
freq
.
m
=
channel_of_freq
(
bss
->
channel
)
;
iwe
.
u
.
freq
.
e
=
0
;
iwe
.
u
.
freq
.
m
=
bss
->
channel
;
iwe
.
u
.
freq
.
e
=
6
;
iwe
.
cmd
=
SIOCGIWFREQ
;
current_ev
=
iwe_stream_add_event
(
current_ev
,
end_buf
,
&
iwe
,
IW_EV_FREQ_LEN
);
...
...
@@ -690,19 +668,33 @@ prism54_get_scan(struct net_device *ndev, struct iw_request_info *info,
rvalue
=
mgt_get_request
(
priv
,
DOT11_OID_NOISEFLOOR
,
0
,
NULL
,
&
r
);
noise
=
r
.
u
;
/* Ask the device for a list of known bss. We can report at most
* IW_MAX_AP=64 to the range struct. But the device won't repport anything
* if you change the value of IWMAX_BSS=24.
*/
/* Ask the device for a list of known bss.
* The old API, using SIOCGIWAPLIST, had a hard limit of IW_MAX_AP=64.
* The new API, using SIOCGIWSCAN, is only limited by the buffer size.
* WE-14->WE-16, the buffer is limited to IW_SCAN_MAX_DATA bytes.
* Starting with WE-17, the buffer can be as big as needed.
* But the device won't repport anything if you change the value
* of IWMAX_BSS=24. */
rvalue
|=
mgt_get_request
(
priv
,
DOT11_OID_BSSLIST
,
0
,
NULL
,
&
r
);
bsslist
=
r
.
ptr
;
/* ok now, scan the list and translate its info */
for
(
i
=
0
;
i
<
min
(
IW_MAX_AP
,
(
int
)
bsslist
->
nr
);
i
++
)
for
(
i
=
0
;
i
<
(
int
)
bsslist
->
nr
;
i
++
)
{
current_ev
=
prism54_translate_bss
(
ndev
,
current_ev
,
extra
+
IW_SCAN_MAX_DATA
,
extra
+
dwrq
->
length
,
&
(
bsslist
->
bsslist
[
i
]),
noise
);
#if WIRELESS_EXT > 16
/* Check if there is space for one more entry */
if
((
extra
+
dwrq
->
length
-
current_ev
)
<=
IW_EV_ADDR_LEN
)
{
/* Ask user space to try again with a bigger buffer */
rvalue
=
-
E2BIG
;
break
;
}
#endif
/* WIRELESS_EXT > 16 */
}
kfree
(
bsslist
);
dwrq
->
length
=
(
current_ev
-
extra
);
dwrq
->
flags
=
0
;
/* todo */
...
...
@@ -1412,7 +1404,10 @@ prism54_set_policy(struct net_device *ndev, struct iw_request_info *info,
mlmeautolevel
=
DOT11_MLME_EXTENDED
;
mgt_set
(
priv
,
DOT11_OID_MLMEAUTOLEVEL
,
&
mlmeautolevel
);
/* restart the card with our new policy */
mgt_commit
(
priv
);
if
(
mgt_commit
(
priv
))
{
up_write
(
&
priv
->
mib_sem
);
return
-
EIO
;
}
up_write
(
&
priv
->
mib_sem
);
return
0
;
...
...
@@ -1746,11 +1741,13 @@ prism54_process_trap_helper(islpci_private *priv, enum oid_num_t oid,
char
*
data
)
{
struct
obj_mlme
*
mlme
=
(
struct
obj_mlme
*
)
data
;
size_t
len
;
u8
*
payload
,
*
pos
=
(
u8
*
)
(
mlme
+
1
);
len
=
pos
[
0
]
|
(
pos
[
1
]
<<
8
);
/* little endian data length */
payload
=
pos
+
2
;
struct
obj_mlmeex
*
mlmeex
=
(
struct
obj_mlmeex
*
)
data
;
struct
obj_mlmeex
*
confirm
;
u8
wpa_ie
[
MAX_WPA_IE_LEN
];
int
wpa_ie_len
;
size_t
len
=
0
;
/* u16, better? */
u8
*
payload
=
0
,
*
pos
=
0
;
int
ret
;
/* I think all trapable objects are listed here.
* Some oids have a EX version. The difference is that they are emitted
...
...
@@ -1760,9 +1757,14 @@ prism54_process_trap_helper(islpci_private *priv, enum oid_num_t oid,
* suited. We use the more flexible custom event facility.
*/
if
(
oid
>=
DOT11_OID_BEACON
)
{
len
=
mlmeex
->
size
;
payload
=
pos
=
mlmeex
->
data
;
}
/* I fear prism54_process_bss_data won't work with big endian data */
if
((
oid
==
DOT11_OID_BEACON
)
||
(
oid
==
DOT11_OID_PROBE
))
prism54_process_bss_data
(
priv
,
oid
,
mlme
->
address
,
prism54_process_bss_data
(
priv
,
oid
,
mlme
ex
->
address
,
payload
,
len
);
mgt_le_to_cpu
(
isl_oid
[
oid
].
flags
&
OID_FLAG_TYPE
,
(
void
*
)
mlme
);
...
...
@@ -1822,21 +1824,134 @@ prism54_process_trap_helper(islpci_private *priv, enum oid_num_t oid,
case
DOT11_OID_AUTHENTICATEEX
:
handle_request
(
priv
,
mlme
,
oid
);
send_formatted_event
(
priv
,
"Authenticate request"
,
mlme
,
1
);
send_formatted_event
(
priv
,
"Authenticate request (ex)"
,
mlme
,
1
);
if
(
priv
->
iw_mode
!=
IW_MODE_MASTER
&&
mlmeex
->
state
!=
DOT11_STATE_AUTHING
)
break
;
confirm
=
kmalloc
(
sizeof
(
struct
obj_mlmeex
)
+
6
,
GFP_ATOMIC
);
if
(
!
confirm
)
break
;
memcpy
(
&
confirm
->
address
,
mlmeex
->
address
,
ETH_ALEN
);
printk
(
KERN_DEBUG
"Authenticate from: address:
\t
%02x:%02x:%02x:%02x:%02x:%02x
\n
"
,
mlmeex
->
address
[
0
],
mlmeex
->
address
[
1
],
mlmeex
->
address
[
2
],
mlmeex
->
address
[
3
],
mlmeex
->
address
[
4
],
mlmeex
->
address
[
5
]
);
confirm
->
id
=
-
1
;
/* or mlmeex->id ? */
confirm
->
state
=
0
;
/* not used */
confirm
->
code
=
0
;
confirm
->
size
=
6
;
confirm
->
data
[
0
]
=
0x00
;
confirm
->
data
[
1
]
=
0x00
;
confirm
->
data
[
2
]
=
0x02
;
confirm
->
data
[
3
]
=
0x00
;
confirm
->
data
[
4
]
=
0x00
;
confirm
->
data
[
5
]
=
0x00
;
ret
=
mgt_set_varlen
(
priv
,
DOT11_OID_ASSOCIATEEX
,
confirm
,
6
);
kfree
(
confirm
);
if
(
ret
)
return
ret
;
break
;
case
DOT11_OID_DISASSOCIATEEX
:
send_formatted_event
(
priv
,
"Disassociate request"
,
mlme
,
0
);
send_formatted_event
(
priv
,
"Disassociate request
(ex)
"
,
mlme
,
0
);
break
;
case
DOT11_OID_ASSOCIATEEX
:
handle_request
(
priv
,
mlme
,
oid
);
send_formatted_event
(
priv
,
"Associate request"
,
mlme
,
1
);
send_formatted_event
(
priv
,
"Associate request (ex)"
,
mlme
,
1
);
if
(
priv
->
iw_mode
!=
IW_MODE_MASTER
&&
mlmeex
->
state
!=
DOT11_STATE_AUTHING
)
break
;
confirm
=
kmalloc
(
sizeof
(
struct
obj_mlmeex
),
GFP_ATOMIC
);
if
(
!
confirm
)
break
;
memcpy
(
&
confirm
->
address
,
mlmeex
->
address
,
ETH_ALEN
);
confirm
->
id
=
((
struct
obj_mlmeex
*
)
mlme
)
->
id
;
confirm
->
state
=
0
;
/* not used */
confirm
->
code
=
0
;
wpa_ie_len
=
prism54_wpa_ie_get
(
priv
,
mlmeex
->
address
,
wpa_ie
);
if
(
!
wpa_ie_len
)
{
printk
(
KERN_DEBUG
"No WPA IE found from "
"address:
\t
%02x:%02x:%02x:%02x:%02x:%02x
\n
"
,
mlmeex
->
address
[
0
],
mlmeex
->
address
[
1
],
mlmeex
->
address
[
2
],
mlmeex
->
address
[
3
],
mlmeex
->
address
[
4
],
mlmeex
->
address
[
5
]
);
kfree
(
confirm
);
break
;
}
confirm
->
size
=
wpa_ie_len
;
memcpy
(
&
confirm
->
data
,
wpa_ie
,
wpa_ie_len
);
mgt_set_varlen
(
priv
,
oid
,
confirm
,
wpa_ie_len
);
kfree
(
confirm
);
break
;
case
DOT11_OID_REASSOCIATEEX
:
handle_request
(
priv
,
mlme
,
oid
);
send_formatted_event
(
priv
,
"Reassociate request"
,
mlme
,
1
);
send_formatted_event
(
priv
,
"Reassociate request (ex)"
,
mlme
,
1
);
if
(
priv
->
iw_mode
!=
IW_MODE_MASTER
&&
mlmeex
->
state
!=
DOT11_STATE_ASSOCING
)
break
;
confirm
=
kmalloc
(
sizeof
(
struct
obj_mlmeex
),
GFP_ATOMIC
);
if
(
!
confirm
)
break
;
memcpy
(
&
confirm
->
address
,
mlmeex
->
address
,
ETH_ALEN
);
confirm
->
id
=
mlmeex
->
id
;
confirm
->
state
=
0
;
/* not used */
confirm
->
code
=
0
;
wpa_ie_len
=
prism54_wpa_ie_get
(
priv
,
mlmeex
->
address
,
wpa_ie
);
if
(
!
wpa_ie_len
)
{
printk
(
KERN_DEBUG
"No WPA IE found from "
"address:
\t
%02x:%02x:%02x:%02x:%02x:%02x
\n
"
,
mlmeex
->
address
[
0
],
mlmeex
->
address
[
1
],
mlmeex
->
address
[
2
],
mlmeex
->
address
[
3
],
mlmeex
->
address
[
4
],
mlmeex
->
address
[
5
]
);
kfree
(
confirm
);
break
;
}
confirm
->
size
=
wpa_ie_len
;
memcpy
(
&
confirm
->
data
,
wpa_ie
,
wpa_ie_len
);
mgt_set_varlen
(
priv
,
oid
,
confirm
,
wpa_ie_len
);
kfree
(
confirm
);
break
;
default:
...
...
@@ -1879,23 +1994,367 @@ prism54_set_mac_address(struct net_device *ndev, void *addr)
return
ret
;
}
/* Note: currently, use hostapd ioctl from the Host AP driver for WPA
* support. This is to be replaced with Linux wireless extensions once they
* get WPA support. */
/* Note II: please leave all this together as it will be easier to remove later,
* once wireless extensions add WPA support -mcgrof */
/* PRISM54_HOSTAPD ioctl() cmd: */
enum
{
PRISM2_SET_ENCRYPTION
=
6
,
PRISM2_HOSTAPD_SET_GENERIC_ELEMENT
=
12
,
PRISM2_HOSTAPD_MLME
=
13
,
PRISM2_HOSTAPD_SCAN_REQ
=
14
,
};
#define PRISM54_SET_WPA SIOCIWFIRSTPRIV+12
#define PRISM54_HOSTAPD SIOCIWFIRSTPRIV+25
#define PRISM54_DROP_UNENCRYPTED SIOCIWFIRSTPRIV+26
#define PRISM2_HOSTAPD_MAX_BUF_SIZE 1024
#define PRISM2_HOSTAPD_GENERIC_ELEMENT_HDR_LEN \
((int) (&((struct prism2_hostapd_param *) 0)->u.generic_elem.data))
/* Maximum length for algorithm names (-1 for nul termination)
* used in ioctl() */
#define HOSTAP_CRYPT_ALG_NAME_LEN 16
struct
prism2_hostapd_param
{
u32
cmd
;
u8
sta_addr
[
ETH_ALEN
];
union
{
struct
{
u8
alg
[
HOSTAP_CRYPT_ALG_NAME_LEN
];
u32
flags
;
u32
err
;
u8
idx
;
u8
seq
[
8
];
/* sequence counter (set: RX, get: TX) */
u16
key_len
;
u8
key
[
0
];
}
crypt
;
struct
{
u8
len
;
u8
data
[
0
];
}
generic_elem
;
struct
{
#define MLME_STA_DEAUTH 0
#define MLME_STA_DISASSOC 1
u16
cmd
;
u16
reason_code
;
}
mlme
;
struct
{
u8
ssid_len
;
u8
ssid
[
32
];
}
scan_req
;
}
u
;
};
static
int
prism2_ioctl_set_encryption
(
struct
net_device
*
dev
,
struct
prism2_hostapd_param
*
param
,
int
param_len
)
{
islpci_private
*
priv
=
netdev_priv
(
dev
);
int
rvalue
=
0
,
force
=
0
;
int
authen
=
DOT11_AUTH_OS
,
invoke
=
0
,
exunencrypt
=
0
;
union
oid_res_t
r
;
/* with the new API, it's impossible to get a NULL pointer.
* New version of iwconfig set the IW_ENCODE_NOKEY flag
* when no key is given, but older versions don't. */
if
(
param
->
u
.
crypt
.
key_len
>
0
)
{
/* we have a key to set */
int
index
=
param
->
u
.
crypt
.
idx
;
int
current_index
;
struct
obj_key
key
=
{
DOT11_PRIV_TKIP
,
0
,
""
};
/* get the current key index */
rvalue
=
mgt_get_request
(
priv
,
DOT11_OID_DEFKEYID
,
0
,
NULL
,
&
r
);
current_index
=
r
.
u
;
/* Verify that the key is not marked as invalid */
if
(
!
(
param
->
u
.
crypt
.
flags
&
IW_ENCODE_NOKEY
))
{
key
.
length
=
param
->
u
.
crypt
.
key_len
>
sizeof
(
param
->
u
.
crypt
.
key
)
?
sizeof
(
param
->
u
.
crypt
.
key
)
:
param
->
u
.
crypt
.
key_len
;
memcpy
(
key
.
key
,
param
->
u
.
crypt
.
key
,
key
.
length
);
if
(
key
.
length
==
32
)
/* we want WPA-PSK */
key
.
type
=
DOT11_PRIV_TKIP
;
if
((
index
<
0
)
||
(
index
>
3
))
/* no index provided use the current one */
index
=
current_index
;
/* now send the key to the card */
rvalue
|=
mgt_set_request
(
priv
,
DOT11_OID_DEFKEYX
,
index
,
&
key
);
}
/*
* 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
)
&&
(
key
.
length
>
0
))
force
=
1
;
}
else
{
int
index
=
(
param
->
u
.
crypt
.
flags
&
IW_ENCODE_INDEX
)
-
1
;
if
((
index
>=
0
)
&&
(
index
<=
3
))
{
/* we want to set the key index */
rvalue
|=
mgt_set_request
(
priv
,
DOT11_OID_DEFKEYID
,
0
,
&
index
);
}
else
{
if
(
!
param
->
u
.
crypt
.
flags
&
IW_ENCODE_MODE
)
{
/* we cannot do anything. Complain. */
return
-
EINVAL
;
}
}
}
/* now read the flags */
if
(
param
->
u
.
crypt
.
flags
&
IW_ENCODE_DISABLED
)
{
/* Encoding disabled,
* authen = DOT11_AUTH_OS;
* invoke = 0;
* exunencrypt = 0; */
}
if
(
param
->
u
.
crypt
.
flags
&
IW_ENCODE_OPEN
)
/* Encode but accept non-encoded packets. No auth */
invoke
=
1
;
if
((
param
->
u
.
crypt
.
flags
&
IW_ENCODE_RESTRICTED
)
||
force
)
{
/* Refuse non-encoded packets. Auth */
authen
=
DOT11_AUTH_BOTH
;
invoke
=
1
;
exunencrypt
=
1
;
}
/* do the change if requested */
if
((
param
->
u
.
crypt
.
flags
&
IW_ENCODE_MODE
)
||
force
)
{
rvalue
|=
mgt_set_request
(
priv
,
DOT11_OID_AUTHENABLE
,
0
,
&
authen
);
rvalue
|=
mgt_set_request
(
priv
,
DOT11_OID_PRIVACYINVOKED
,
0
,
&
invoke
);
rvalue
|=
mgt_set_request
(
priv
,
DOT11_OID_EXUNENCRYPTED
,
0
,
&
exunencrypt
);
}
return
rvalue
;
}
static
int
prism2_ioctl_set_generic_element
(
struct
net_device
*
ndev
,
struct
prism2_hostapd_param
*
param
,
int
param_len
)
{
islpci_private
*
priv
=
netdev_priv
(
ndev
);
int
max_len
,
len
,
alen
,
ret
=
0
;
struct
obj_attachment
*
attach
;
len
=
param
->
u
.
generic_elem
.
len
;
max_len
=
param_len
-
PRISM2_HOSTAPD_GENERIC_ELEMENT_HDR_LEN
;
if
(
max_len
<
0
||
max_len
<
len
)
return
-
EINVAL
;
alen
=
sizeof
(
*
attach
)
+
len
;
attach
=
kmalloc
(
alen
,
GFP_KERNEL
);
if
(
attach
==
NULL
)
return
-
ENOMEM
;
memset
(
attach
,
0
,
alen
);
#define WLAN_FC_TYPE_MGMT 0
#define WLAN_FC_STYPE_ASSOC_REQ 0
#define WLAN_FC_STYPE_REASSOC_REQ 2
/* Note: endianness is covered by mgt_set_varlen */
attach
->
type
=
(
WLAN_FC_TYPE_MGMT
<<
2
)
|
(
WLAN_FC_STYPE_ASSOC_REQ
<<
4
);
attach
->
id
=
-
1
;
attach
->
size
=
len
;
memcpy
(
attach
->
data
,
param
->
u
.
generic_elem
.
data
,
len
);
ret
=
mgt_set_varlen
(
priv
,
DOT11_OID_ATTACHMENT
,
attach
,
len
);
if
(
ret
==
0
)
{
attach
->
type
=
(
WLAN_FC_TYPE_MGMT
<<
2
)
|
(
WLAN_FC_STYPE_REASSOC_REQ
<<
4
);
ret
=
mgt_set_varlen
(
priv
,
DOT11_OID_ATTACHMENT
,
attach
,
len
);
if
(
ret
==
0
)
printk
(
KERN_DEBUG
"%s: WPA IE Attachment was set
\n
"
,
ndev
->
name
);
}
kfree
(
attach
);
return
ret
;
}
static
int
prism2_ioctl_mlme
(
struct
net_device
*
dev
,
struct
prism2_hostapd_param
*
param
)
{
return
-
EOPNOTSUPP
;
}
static
int
prism2_ioctl_scan_req
(
struct
net_device
*
ndev
,
struct
prism2_hostapd_param
*
param
)
{
islpci_private
*
priv
=
netdev_priv
(
ndev
);
int
i
,
rvalue
;
struct
obj_bsslist
*
bsslist
;
u32
noise
=
0
;
char
*
extra
=
""
;
char
*
current_ev
=
"foo"
;
union
oid_res_t
r
;
if
(
islpci_get_state
(
priv
)
<
PRV_STATE_INIT
)
{
/* device is not ready, fail gently */
return
0
;
}
/* first get the noise value. We will use it to report the link quality */
rvalue
=
mgt_get_request
(
priv
,
DOT11_OID_NOISEFLOOR
,
0
,
NULL
,
&
r
);
noise
=
r
.
u
;
/* Ask the device for a list of known bss. We can report at most
* IW_MAX_AP=64 to the range struct. But the device won't repport anything
* if you change the value of IWMAX_BSS=24.
*/
rvalue
|=
mgt_get_request
(
priv
,
DOT11_OID_BSSLIST
,
0
,
NULL
,
&
r
);
bsslist
=
r
.
ptr
;
/* ok now, scan the list and translate its info */
for
(
i
=
0
;
i
<
min
(
IW_MAX_AP
,
(
int
)
bsslist
->
nr
);
i
++
)
current_ev
=
prism54_translate_bss
(
ndev
,
current_ev
,
extra
+
IW_SCAN_MAX_DATA
,
&
(
bsslist
->
bsslist
[
i
]),
noise
);
kfree
(
bsslist
);
return
rvalue
;
}
static
int
prism54_hostapd
(
struct
net_device
*
ndev
,
struct
iw_point
*
p
)
{
struct
prism2_hostapd_param
*
param
;
int
ret
=
0
;
u32
uwrq
;
printk
(
KERN_DEBUG
"prism54_hostapd - len=%d
\n
"
,
p
->
length
);
if
(
p
->
length
<
sizeof
(
struct
prism2_hostapd_param
)
||
p
->
length
>
PRISM2_HOSTAPD_MAX_BUF_SIZE
||
!
p
->
pointer
)
return
-
EINVAL
;
param
=
(
struct
prism2_hostapd_param
*
)
kmalloc
(
p
->
length
,
GFP_KERNEL
);
if
(
param
==
NULL
)
return
-
ENOMEM
;
if
(
copy_from_user
(
param
,
p
->
pointer
,
p
->
length
))
{
kfree
(
param
);
return
-
EFAULT
;
}
switch
(
param
->
cmd
)
{
case
PRISM2_SET_ENCRYPTION
:
printk
(
KERN_DEBUG
"%s: Caught WPA supplicant set encryption request
\n
"
,
ndev
->
name
);
ret
=
prism2_ioctl_set_encryption
(
ndev
,
param
,
p
->
length
);
break
;
case
PRISM2_HOSTAPD_SET_GENERIC_ELEMENT
:
printk
(
KERN_DEBUG
"%s: Caught WPA supplicant set WPA IE request
\n
"
,
ndev
->
name
);
ret
=
prism2_ioctl_set_generic_element
(
ndev
,
param
,
p
->
length
);
break
;
case
PRISM2_HOSTAPD_MLME
:
printk
(
KERN_DEBUG
"%s: Caught WPA supplicant MLME request
\n
"
,
ndev
->
name
);
ret
=
prism2_ioctl_mlme
(
ndev
,
param
);
break
;
case
PRISM2_HOSTAPD_SCAN_REQ
:
printk
(
KERN_DEBUG
"%s: Caught WPA supplicant scan request
\n
"
,
ndev
->
name
);
ret
=
prism2_ioctl_scan_req
(
ndev
,
param
);
break
;
case
PRISM54_SET_WPA
:
printk
(
KERN_DEBUG
"%s: Caught WPA supplicant wpa init request
\n
"
,
ndev
->
name
);
uwrq
=
1
;
ret
=
prism54_set_wpa
(
ndev
,
NULL
,
&
uwrq
,
NULL
);
break
;
case
PRISM54_DROP_UNENCRYPTED
:
printk
(
KERN_DEBUG
"%s: Caught WPA drop unencrypted request
\n
"
,
ndev
->
name
);
#if 0
uwrq = 0x01;
mgt_set(priv, DOT11_OID_EXUNENCRYPTED, &uwrq);
down_write(&priv->mib_sem);
mgt_commit(priv);
up_write(&priv->mib_sem);
#endif
/* Not necessary, as set_wpa does it, should we just do it here though? */
ret
=
0
;
break
;
default:
printk
(
KERN_DEBUG
"%s: Caught a WPA supplicant request that is not supported
\n
"
,
ndev
->
name
);
ret
=
-
EOPNOTSUPP
;
break
;
}
if
(
ret
==
0
&&
copy_to_user
(
p
->
pointer
,
param
,
p
->
length
))
ret
=
-
EFAULT
;
kfree
(
param
);
return
ret
;
}
int
prism54_set_wpa
(
struct
net_device
*
ndev
,
struct
iw_request_info
*
info
,
__u32
*
uwrq
,
char
*
extra
)
{
islpci_private
*
priv
=
netdev_priv
(
ndev
);
u32
mlme
,
authen
,
dot1x
,
filter
,
wep
;
down_write
(
&
priv
->
mib_sem
);
if
(
islpci_get_state
(
priv
)
<
PRV_STATE_INIT
)
return
0
;
wep
=
1
;
/* For privacy invoked */
filter
=
1
;
/* Filter out all unencrypted frames */
dot1x
=
0x01
;
/* To enable eap filter */
mlme
=
DOT11_MLME_EXTENDED
;
authen
=
DOT11_AUTH_OS
;
/* Only WEP uses _SK and _BOTH */
down_write
(
&
priv
->
mib_sem
);
priv
->
wpa
=
*
uwrq
;
if
(
priv
->
wpa
)
{
u32
l
=
DOT11_MLME_EXTENDED
;
mgt_set
(
priv
,
DOT11_OID_MLMEAUTOLEVEL
,
&
l
);
switch
(
priv
->
wpa
)
{
default:
case
0
:
/* Clears/disables WPA and friends */
wep
=
0
;
filter
=
0
;
/* Do not filter un-encrypted data */
dot1x
=
0
;
mlme
=
DOT11_MLME_AUTO
;
printk
(
"%s: Disabling WPA
\n
"
,
ndev
->
name
);
break
;
case
2
:
case
1
:
/* WPA */
printk
(
"%s: Enabling WPA
\n
"
,
ndev
->
name
);
break
;
}
/* restart the card with new level. Needed ? */
mgt_commit
(
priv
);
up_write
(
&
priv
->
mib_sem
);
mgt_set_request
(
priv
,
DOT11_OID_AUTHENABLE
,
0
,
&
authen
);
mgt_set_request
(
priv
,
DOT11_OID_PRIVACYINVOKED
,
0
,
&
wep
);
mgt_set_request
(
priv
,
DOT11_OID_EXUNENCRYPTED
,
0
,
&
filter
);
mgt_set_request
(
priv
,
DOT11_OID_DOT1XENABLE
,
0
,
&
dot1x
);
mgt_set_request
(
priv
,
DOT11_OID_MLMEAUTOLEVEL
,
0
,
&
mlme
);
return
0
;
}
...
...
@@ -1947,7 +2406,7 @@ prism54_debug_get_oid(struct net_device *ndev, struct iw_request_info *info,
struct
iw_point
*
data
,
char
*
extra
)
{
islpci_private
*
priv
=
netdev_priv
(
ndev
);
struct
islpci_mgmtframe
*
response
=
NULL
;
struct
islpci_mgmtframe
*
response
;
int
ret
=
-
EIO
;
printk
(
"%s: get_oid 0x%08X
\n
"
,
ndev
->
name
,
priv
->
priv_oid
);
...
...
@@ -1983,7 +2442,7 @@ prism54_debug_set_oid(struct net_device *ndev, struct iw_request_info *info,
struct
iw_point
*
data
,
char
*
extra
)
{
islpci_private
*
priv
=
netdev_priv
(
ndev
);
struct
islpci_mgmtframe
*
response
=
NULL
;
struct
islpci_mgmtframe
*
response
;
int
ret
=
0
,
response_op
=
PIMFOR_OP_ERROR
;
printk
(
"%s: set_oid 0x%08X
\t
len: %d
\n
"
,
ndev
->
name
,
priv
->
priv_oid
,
...
...
@@ -2256,14 +2715,24 @@ const struct iw_handler_def prism54_handler_def = {
.
standard
=
(
iw_handler
*
)
prism54_handler
,
.
private
=
(
iw_handler
*
)
prism54_private_handler
,
.
private_args
=
(
struct
iw_priv_args
*
)
prism54_private_args
,
#if WIRELESS_EXT == 16
.
spy_offset
=
offsetof
(
islpci_private
,
spy_data
),
#endif
/* WIRELESS_EXT == 16 */
};
/* For
ioctls that don't work with the new API
*/
/* For
wpa_supplicant
*/
int
prism54_ioctl
(
struct
net_device
*
ndev
,
struct
ifreq
*
rq
,
int
cmd
)
{
struct
iwreq
*
wrq
=
(
struct
iwreq
*
)
rq
;
int
ret
=
-
1
;
switch
(
cmd
)
{
case
PRISM54_HOSTAPD
:
if
(
!
capable
(
CAP_NET_ADMIN
))
return
-
EPERM
;
ret
=
prism54_hostapd
(
ndev
,
&
wrq
->
u
.
data
);
return
ret
;
}
return
-
EOPNOTSUPP
;
}
drivers/net/wireless/prism54/isl_ioctl.h
View file @
4b743325
...
...
@@ -48,6 +48,8 @@ size_t prism54_wpa_ie_get(islpci_private *priv, u8 *bssid, u8 *wpa_ie);
int
prism54_set_mac_address
(
struct
net_device
*
,
void
*
);
int
prism54_ioctl
(
struct
net_device
*
,
struct
ifreq
*
,
int
);
int
prism54_set_wpa
(
struct
net_device
*
,
struct
iw_request_info
*
,
__u32
*
,
char
*
);
extern
const
struct
iw_handler_def
prism54_handler_def
;
...
...
drivers/net/wireless/prism54/isl_oid.h
View file @
4b743325
...
...
@@ -91,6 +91,14 @@ struct obj_frequencies {
u16
mhz
[
0
];
}
__attribute__
((
packed
));
struct
obj_attachment
{
char
type
;
char
reserved
;
short
id
;
short
size
;
char
data
[
0
];
}
__attribute__
((
packed
));
/*
* in case everything's ok, the inlined function below will be
* optimized away by the compiler...
...
...
@@ -472,6 +480,7 @@ enum oid_num_t {
#define OID_TYPE_MLMEEX 0x09
#define OID_TYPE_ADDR 0x0A
#define OID_TYPE_RAW 0x0B
#define OID_TYPE_ATTACH 0x0C
/* OID_TYPE_MLMEEX is special because of a variable size field when sending.
* Not yet implemented (not used in driver anyway).
...
...
drivers/net/wireless/prism54/islpci_dev.c
View file @
4b743325
...
...
@@ -105,7 +105,7 @@ isl_upload_firmware(islpci_private *priv)
"%s: firmware '%s' size is not multiple of 32bit, aborting!
\n
"
,
"prism54"
,
priv
->
firmware
);
release_firmware
(
fw_entry
);
return
EILSEQ
;
/* Illegal byte sequence */
;
return
-
EILSEQ
;
/* Illegal byte sequence */
;
}
while
(
fw_len
>
0
)
{
...
...
@@ -142,6 +142,10 @@ isl_upload_firmware(islpci_private *priv)
BUG_ON
(
fw_len
!=
0
);
/* Firmware version is at offset 40 (also for "newmac") */
printk
(
KERN_DEBUG
"%s: firmware version: %.8s
\n
"
,
priv
->
ndev
->
name
,
fw_entry
->
data
+
40
);
release_firmware
(
fw_entry
);
}
...
...
@@ -375,8 +379,6 @@ islpci_open(struct net_device *ndev)
u32
rc
;
islpci_private
*
priv
=
netdev_priv
(
ndev
);
printk
(
KERN_DEBUG
"%s: islpci_open()
\n
"
,
ndev
->
name
);
/* reset data structures, upload firmware and reset device */
rc
=
islpci_reset
(
priv
,
1
);
if
(
rc
)
{
...
...
@@ -462,8 +464,7 @@ islpci_upload_fw(islpci_private *priv)
return
rc
;
}
printk
(
KERN_DEBUG
"%s: firmware uploaded done, now triggering reset...
\n
"
,
printk
(
KERN_DEBUG
"%s: firmware upload complete
\n
"
,
priv
->
ndev
->
name
);
islpci_set_state
(
priv
,
PRV_STATE_POSTBOOT
);
...
...
@@ -489,6 +490,7 @@ islpci_reset_if(islpci_private *priv)
/* The software reset acknowledge needs about 220 msec here.
* Be conservative and wait for up to one second. */
set_current_state
(
TASK_UNINTERRUPTIBLE
);
remaining
=
schedule_timeout
(
HZ
);
if
(
remaining
>
0
)
{
...
...
@@ -499,15 +501,16 @@ islpci_reset_if(islpci_private *priv)
/* If we're here it's because our IRQ hasn't yet gone through.
* Retry a bit more...
*/
printk
(
KERN_ERR
"%s: device soft reset timed out
\n
"
,
printk
(
KERN_ERR
"%s: no 'reset complete' IRQ seen - retrying
\n
"
,
priv
->
ndev
->
name
);
}
finish_wait
(
&
priv
->
reset_done
,
&
wait
);
if
(
result
)
if
(
result
)
{
printk
(
KERN_ERR
"%s: interface reset failure
\n
"
,
priv
->
ndev
->
name
);
return
result
;
}
islpci_set_state
(
priv
,
PRV_STATE_INIT
);
...
...
@@ -519,11 +522,17 @@ islpci_reset_if(islpci_private *priv)
isl38xx_enable_common_interrupts
(
priv
->
device_base
);
down_write
(
&
priv
->
mib_sem
);
mgt_commit
(
priv
);
result
=
mgt_commit
(
priv
);
if
(
result
)
{
printk
(
KERN_ERR
"%s: interface reset failure
\n
"
,
priv
->
ndev
->
name
);
up_write
(
&
priv
->
mib_sem
);
return
result
;
}
up_write
(
&
priv
->
mib_sem
);
islpci_set_state
(
priv
,
PRV_STATE_READY
);
printk
(
KERN_DEBUG
"%s: interface reset complete
\n
"
,
priv
->
ndev
->
name
);
return
0
;
}
...
...
@@ -584,18 +593,18 @@ islpci_reset(islpci_private *priv, int reload_firmware)
/* now that the data structures are cleaned up, upload
* firmware and reset interface */
rc
=
islpci_upload_fw
(
priv
);
if
(
rc
)
if
(
rc
)
{
printk
(
KERN_ERR
"%s: islpci_reset: failure
\n
"
,
priv
->
ndev
->
name
);
return
rc
;
}
}
/* finally reset interface */
rc
=
islpci_reset_if
(
priv
);
if
(
!
rc
)
/* If successful */
return
rc
;
printk
(
KERN_DEBUG
"prism54: Your card/socket may be faulty, or IRQ line too busy :(
\n
"
);
if
(
rc
)
printk
(
KERN_ERR
"prism54: Your card/socket may be faulty, or IRQ line too busy :(
\n
"
);
return
rc
;
}
struct
net_device_stats
*
...
...
@@ -604,7 +613,7 @@ islpci_statistics(struct net_device *ndev)
islpci_private
*
priv
=
netdev_priv
(
ndev
);
#if VERBOSE > SHOW_ERROR_MESSAGES
DEBUG
(
SHOW_FUNCTION_CALLS
,
"islpci_statistics
\n
"
);
DEBUG
(
SHOW_FUNCTION_CALLS
,
"islpci_statistics
\n
"
);
#endif
return
&
priv
->
statistics
;
...
...
@@ -830,6 +839,12 @@ islpci_setup(struct pci_dev *pdev)
priv
->
ndev
->
type
=
(
priv
->
iw_mode
==
IW_MODE_MONITOR
)
?
priv
->
monitor_type
:
ARPHRD_ETHER
;
#if WIRELESS_EXT > 16
/* Add pointers to enable iwspy support. */
priv
->
wireless_data
.
spy_data
=
&
priv
->
spy_data
;
ndev
->
wireless_data
=
&
priv
->
wireless_data
;
#endif
/* WIRELESS_EXT > 16 */
/* save the start and end address of the PCI memory area */
ndev
->
mem_start
=
(
unsigned
long
)
priv
->
device_base
;
ndev
->
mem_end
=
ndev
->
mem_start
+
ISL38XX_PCI_MEM_SIZE
;
...
...
drivers/net/wireless/prism54/islpci_dev.h
View file @
4b743325
...
...
@@ -100,6 +100,10 @@ typedef struct {
struct
iw_spy_data
spy_data
;
/* iwspy support */
#if WIRELESS_EXT > 16
struct
iw_public_data
wireless_data
;
#endif
/* WIRELESS_EXT > 16 */
int
monitor_type
;
/* ARPHRD_IEEE80211 or ARPHRD_IEEE80211_PRISM */
struct
islpci_acl
acl
;
...
...
drivers/net/wireless/prism54/islpci_eth.c
View file @
4b743325
...
...
@@ -508,11 +508,12 @@ islpci_eth_tx_timeout(struct net_device *ndev)
/* increment the transmit error counter */
statistics
->
tx_errors
++
;
printk
(
KERN_WARNING
"%s: tx_timeout"
,
ndev
->
name
);
if
(
!
priv
->
reset_task_pending
)
{
priv
->
reset_task_pending
=
1
;
printk
(
", scheduling a reset"
);
netif_stop_queue
(
ndev
);
schedule_work
(
&
priv
->
reset_task
);
}
return
;
printk
(
"
\n
"
);
}
drivers/net/wireless/prism54/islpci_hotplug.c
View file @
4b743325
...
...
@@ -107,9 +107,6 @@ prism54_probe(struct pci_dev *pdev, const struct pci_device_id *id)
islpci_private
*
priv
;
int
rvalue
;
/* TRACE(DRV_NAME); */
/* Enable the pci device */
if
(
pci_enable_device
(
pdev
))
{
printk
(
KERN_ERR
"%s: pci_enable_device() failed.
\n
"
,
DRV_NAME
);
...
...
drivers/net/wireless/prism54/islpci_mgt.c
View file @
4b743325
...
...
@@ -473,6 +473,7 @@ islpci_mgt_transaction(struct net_device *ndev,
int
timeleft
;
struct
islpci_mgmtframe
*
frame
;
set_current_state
(
TASK_UNINTERRUPTIBLE
);
timeleft
=
schedule_timeout
(
wait_cycle_jiffies
);
frame
=
xchg
(
&
priv
->
mgmt_received
,
NULL
);
if
(
frame
)
{
...
...
drivers/net/wireless/prism54/islpci_mgt.h
View file @
4b743325
...
...
@@ -31,8 +31,6 @@
#define K_DEBUG(f, m, args...) do { if(f & m) printk(KERN_DEBUG args); } while(0)
#define DEBUG(f, args...) K_DEBUG(f, pc_debug, args)
#define TRACE(devname) K_DEBUG(SHOW_TRACING, VERBOSE, "%s: -> " __FUNCTION__ "()\n", devname)
extern
int
pc_debug
;
#define init_wds 0
/* help compiler optimize away dead code */
...
...
drivers/net/wireless/prism54/oid_mgt.c
View file @
4b743325
...
...
@@ -201,7 +201,8 @@ struct oid_t isl_oid[] = {
OID_U32
(
DOT11_OID_STATIMEOUT
,
0x19000000
),
OID_U32_C
(
DOT11_OID_MLMEAUTOLEVEL
,
0x19000001
),
OID_U32
(
DOT11_OID_BSSTIMEOUT
,
0x19000002
),
OID_UNKNOWN
(
DOT11_OID_ATTACHMENT
,
0x19000003
),
[
DOT11_OID_ATTACHMENT
]
=
{
0x19000003
,
0
,
sizeof
(
struct
obj_attachment
),
OID_TYPE_ATTACH
},
OID_STRUCT_C
(
DOT11_OID_PSMBUFFER
,
0x19000004
,
struct
obj_buffer
,
OID_TYPE_BUFFER
),
...
...
@@ -329,6 +330,12 @@ mgt_le_to_cpu(int type, void *data)
mlme
->
size
=
le16_to_cpu
(
mlme
->
size
);
break
;
}
case
OID_TYPE_ATTACH
:{
struct
obj_attachment
*
attach
=
data
;
attach
->
id
=
le16_to_cpu
(
attach
->
id
);
attach
->
size
=
le16_to_cpu
(
attach
->
size
);;
break
;
}
case
OID_TYPE_SSID
:
case
OID_TYPE_KEY
:
case
OID_TYPE_ADDR
:
...
...
@@ -392,6 +399,12 @@ mgt_cpu_to_le(int type, void *data)
mlme
->
size
=
cpu_to_le16
(
mlme
->
size
);
break
;
}
case
OID_TYPE_ATTACH
:{
struct
obj_attachment
*
attach
=
data
;
attach
->
id
=
cpu_to_le16
(
attach
->
id
);
attach
->
size
=
cpu_to_le16
(
attach
->
size
);;
break
;
}
case
OID_TYPE_SSID
:
case
OID_TYPE_KEY
:
case
OID_TYPE_ADDR
:
...
...
@@ -465,6 +478,42 @@ mgt_set_request(islpci_private *priv, enum oid_num_t n, int extra, void *data)
return
ret
;
}
/* None of these are cached */
int
mgt_set_varlen
(
islpci_private
*
priv
,
enum
oid_num_t
n
,
void
*
data
,
int
extra_len
)
{
int
ret
=
0
;
struct
islpci_mgmtframe
*
response
;
int
response_op
=
PIMFOR_OP_ERROR
;
int
dlen
;
u32
oid
;
BUG_ON
(
OID_NUM_LAST
<=
n
);
dlen
=
isl_oid
[
n
].
size
;
oid
=
isl_oid
[
n
].
oid
;
mgt_cpu_to_le
(
isl_oid
[
n
].
flags
&
OID_FLAG_TYPE
,
data
);
if
(
islpci_get_state
(
priv
)
>=
PRV_STATE_READY
)
{
ret
=
islpci_mgt_transaction
(
priv
->
ndev
,
PIMFOR_OP_SET
,
oid
,
data
,
dlen
+
extra_len
,
&
response
);
if
(
!
ret
)
{
response_op
=
response
->
header
->
operation
;
islpci_mgt_release
(
response
);
}
if
(
ret
||
response_op
==
PIMFOR_OP_ERROR
)
ret
=
-
EIO
;
}
else
ret
=
-
EIO
;
/* re-set given data to what it was */
if
(
data
)
mgt_le_to_cpu
(
isl_oid
[
n
].
flags
&
OID_FLAG_TYPE
,
data
);
return
ret
;
}
int
mgt_get_request
(
islpci_private
*
priv
,
enum
oid_num_t
n
,
int
extra
,
void
*
data
,
union
oid_res_t
*
res
)
...
...
@@ -555,15 +604,18 @@ mgt_commit_list(islpci_private *priv, enum oid_num_t *l, int n)
u32
oid
=
t
->
oid
;
BUG_ON
(
data
==
NULL
);
while
(
j
<=
t
->
range
)
{
response
=
NULL
;
ret
|=
islpci_mgt_transaction
(
priv
->
ndev
,
PIMFOR_OP_SET
,
int
r
=
islpci_mgt_transaction
(
priv
->
ndev
,
PIMFOR_OP_SET
,
oid
,
data
,
t
->
size
,
&
response
);
if
(
response
)
{
ret
|=
(
response
->
header
->
operation
==
PIMFOR_OP_ERROR
);
r
|=
(
response
->
header
->
operation
==
PIMFOR_OP_ERROR
);
islpci_mgt_release
(
response
);
}
if
(
r
)
printk
(
KERN_ERR
"%s: mgt_commit_list: failure. "
"oid=%08x err=%d
\n
"
,
priv
->
ndev
->
name
,
oid
,
r
);
ret
|=
r
;
j
++
;
oid
++
;
data
+=
t
->
size
;
...
...
@@ -624,7 +676,7 @@ static enum oid_num_t commit_part2[] = {
static
int
mgt_update_addr
(
islpci_private
*
priv
)
{
struct
islpci_mgmtframe
*
res
=
NULL
;
struct
islpci_mgmtframe
*
res
;
int
ret
;
ret
=
islpci_mgt_transaction
(
priv
->
ndev
,
PIMFOR_OP_GET
,
...
...
@@ -638,26 +690,26 @@ mgt_update_addr(islpci_private *priv)
if
(
res
)
islpci_mgt_release
(
res
);
if
(
ret
)
printk
(
KERN_ERR
"%s: mgt_update_addr: failure
\n
"
,
priv
->
ndev
->
name
);
return
ret
;
}
void
#define VEC_SIZE(a) (sizeof(a)/sizeof(a[0]))
int
mgt_commit
(
islpci_private
*
priv
)
{
int
rvalue
;
u32
u
;
if
(
islpci_get_state
(
priv
)
<
PRV_STATE_INIT
)
return
;
return
0
;
rvalue
=
mgt_commit_list
(
priv
,
commit_part1
,
sizeof
(
commit_part1
)
/
sizeof
(
commit_part1
[
0
]));
rvalue
=
mgt_commit_list
(
priv
,
commit_part1
,
VEC_SIZE
(
commit_part1
));
if
(
priv
->
iw_mode
!=
IW_MODE_MONITOR
)
rvalue
|=
mgt_commit_list
(
priv
,
commit_part2
,
sizeof
(
commit_part2
)
/
sizeof
(
commit_part2
[
0
]));
rvalue
|=
mgt_commit_list
(
priv
,
commit_part2
,
VEC_SIZE
(
commit_part2
));
u
=
OID_INL_MODE
;
rvalue
|=
mgt_commit_list
(
priv
,
&
u
,
1
);
...
...
@@ -666,9 +718,43 @@ mgt_commit(islpci_private *priv)
if
(
rvalue
)
{
/* some request have failed. The device might be in an
incoherent state. We should reset it ! */
printk
(
KERN_DEBUG
"%s: mgt_commit has failed. Restart the "
"device
\n
"
,
priv
->
ndev
->
name
);
printk
(
KERN_DEBUG
"%s: mgt_commit: failure
\n
"
,
priv
->
ndev
->
name
);
}
return
rvalue
;
}
/* The following OIDs need to be "unlatched":
*
* MEDIUMLIMIT,BEACONPERIOD,DTIMPERIOD,ATIMWINDOW,LISTENINTERVAL
* FREQUENCY,EXTENDEDRATES.
*
* The way to do this is to set ESSID. Note though that they may get
* unlatch before though by setting another OID. */
void
mgt_unlatch_all
(
islpci_private
*
priv
)
{
u32
u
;
int
rvalue
=
0
;
if
(
islpci_get_state
(
priv
)
<
PRV_STATE_INIT
)
return
;
u
=
DOT11_OID_SSID
;
rvalue
=
mgt_commit_list
(
priv
,
&
u
,
1
);
/* Necessary if in MANUAL RUN mode? */
#if 0
u = OID_INL_MODE;
rvalue |= mgt_commit_list(priv, &u, 1);
u = DOT11_OID_MLMEAUTOLEVEL;
rvalue |= mgt_commit_list(priv, &u, 1);
u = OID_INL_MODE;
rvalue |= mgt_commit_list(priv, &u, 1);
#endif
if
(
rvalue
)
printk
(
KERN_DEBUG
"%s: Unlatching OIDs failed
\n
"
,
priv
->
ndev
->
name
);
}
/* This will tell you if you are allowed to answer a mlme(ex) request .*/
...
...
@@ -771,6 +857,14 @@ mgt_response_to_str(enum oid_num_t n, union oid_res_t *r, char *str)
mlme
->
state
,
mlme
->
code
,
mlme
->
size
);
}
break
;
case
OID_TYPE_ATTACH
:{
struct
obj_attachment
*
attach
=
r
->
ptr
;
return
snprintf
(
str
,
PRIV_STR_SIZE
,
"id=%d
\n
size=%d
\n
"
,
attach
->
id
,
attach
->
size
);
}
break
;
case
OID_TYPE_SSID
:{
struct
obj_ssid
*
ssid
=
r
->
ptr
;
return
snprintf
(
str
,
PRIV_STR_SIZE
,
...
...
drivers/net/wireless/prism54/oid_mgt.h
View file @
4b743325
...
...
@@ -36,6 +36,8 @@ int channel_of_freq(int);
void
mgt_le_to_cpu
(
int
,
void
*
);
int
mgt_set_request
(
islpci_private
*
,
enum
oid_num_t
,
int
,
void
*
);
int
mgt_set_varlen
(
islpci_private
*
,
enum
oid_num_t
,
void
*
,
int
);
int
mgt_get_request
(
islpci_private
*
,
enum
oid_num_t
,
int
,
void
*
,
union
oid_res_t
*
);
...
...
@@ -46,7 +48,8 @@ void mgt_set(islpci_private *, enum oid_num_t, void *);
void
mgt_get
(
islpci_private
*
,
enum
oid_num_t
,
void
*
);
void
mgt_commit
(
islpci_private
*
);
int
mgt_commit
(
islpci_private
*
);
void
mgt_unlatch_all
(
islpci_private
*
);
int
mgt_mlme_answer
(
islpci_private
*
);
...
...
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