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
8877870f
Commit
8877870f
authored
Nov 10, 2010
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
parents
7a1abd08
7379efea
Changes
22
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
117 additions
and
49 deletions
+117
-49
drivers/bluetooth/btusb.c
drivers/bluetooth/btusb.c
+5
-0
drivers/net/wireless/ath/ath9k/ar9002_hw.c
drivers/net/wireless/ath/ath9k/ar9002_hw.c
+3
-0
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/ath/ath9k/ath9k.h
+1
-0
drivers/net/wireless/ath/ath9k/hif_usb.c
drivers/net/wireless/ath/ath9k/hif_usb.c
+15
-16
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/hw.c
+13
-2
drivers/net/wireless/ath/ath9k/hw.h
drivers/net/wireless/ath/ath9k/hw.h
+1
-0
drivers/net/wireless/ath/ath9k/init.c
drivers/net/wireless/ath/ath9k/init.c
+8
-0
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/ath/ath9k/main.c
+21
-8
drivers/net/wireless/ath/ath9k/recv.c
drivers/net/wireless/ath/ath9k/recv.c
+2
-2
drivers/net/wireless/ath/ath9k/reg.h
drivers/net/wireless/ath/ath9k/reg.h
+1
-0
drivers/net/wireless/ath/carl9170/usb.c
drivers/net/wireless/ath/carl9170/usb.c
+3
-1
drivers/net/wireless/ipw2x00/libipw_module.c
drivers/net/wireless/ipw2x00/libipw_module.c
+5
-4
drivers/net/wireless/iwlwifi/iwl3945-base.c
drivers/net/wireless/iwlwifi/iwl3945-base.c
+2
-1
drivers/net/wireless/libertas/cfg.c
drivers/net/wireless/libertas/cfg.c
+3
-2
drivers/net/wireless/libertas/dev.h
drivers/net/wireless/libertas/dev.h
+1
-0
drivers/net/wireless/libertas/main.c
drivers/net/wireless/libertas/main.c
+7
-0
net/bluetooth/hci_event.c
net/bluetooth/hci_event.c
+6
-0
net/bluetooth/hidp/Kconfig
net/bluetooth/hidp/Kconfig
+1
-1
net/bluetooth/l2cap.c
net/bluetooth/l2cap.c
+4
-4
net/bluetooth/rfcomm/core.c
net/bluetooth/rfcomm/core.c
+10
-3
net/mac80211/iface.c
net/mac80211/iface.c
+3
-3
net/wireless/nl80211.c
net/wireless/nl80211.c
+2
-2
No files found.
drivers/bluetooth/btusb.c
View file @
8877870f
...
@@ -68,6 +68,9 @@ static struct usb_device_id btusb_table[] = {
...
@@ -68,6 +68,9 @@ static struct usb_device_id btusb_table[] = {
/* Apple MacBookPro6,2 */
/* Apple MacBookPro6,2 */
{
USB_DEVICE
(
0x05ac
,
0x8218
)
},
{
USB_DEVICE
(
0x05ac
,
0x8218
)
},
/* Apple MacBookAir3,1, MacBookAir3,2 */
{
USB_DEVICE
(
0x05ac
,
0x821b
)
},
/* AVM BlueFRITZ! USB v2.0 */
/* AVM BlueFRITZ! USB v2.0 */
{
USB_DEVICE
(
0x057c
,
0x3800
)
},
{
USB_DEVICE
(
0x057c
,
0x3800
)
},
...
@@ -1029,6 +1032,8 @@ static int btusb_probe(struct usb_interface *intf,
...
@@ -1029,6 +1032,8 @@ static int btusb_probe(struct usb_interface *intf,
usb_set_intfdata
(
intf
,
data
);
usb_set_intfdata
(
intf
,
data
);
usb_enable_autosuspend
(
interface_to_usbdev
(
intf
));
return
0
;
return
0
;
}
}
...
...
drivers/net/wireless/ath/ath9k/ar9002_hw.c
View file @
8877870f
...
@@ -410,6 +410,9 @@ static void ar9002_hw_configpcipowersave(struct ath_hw *ah,
...
@@ -410,6 +410,9 @@ static void ar9002_hw_configpcipowersave(struct ath_hw *ah,
val
&=
~
(
AR_WA_BIT6
|
AR_WA_BIT7
);
val
&=
~
(
AR_WA_BIT6
|
AR_WA_BIT7
);
}
}
if
(
AR_SREV_9280
(
ah
))
val
|=
AR_WA_BIT22
;
if
(
AR_SREV_9285E_20
(
ah
))
if
(
AR_SREV_9285E_20
(
ah
))
val
|=
AR_WA_BIT23
;
val
|=
AR_WA_BIT23
;
...
...
drivers/net/wireless/ath/ath9k/ath9k.h
View file @
8877870f
...
@@ -675,6 +675,7 @@ static inline void ath_read_cachesize(struct ath_common *common, int *csz)
...
@@ -675,6 +675,7 @@ static inline void ath_read_cachesize(struct ath_common *common, int *csz)
}
}
extern
struct
ieee80211_ops
ath9k_ops
;
extern
struct
ieee80211_ops
ath9k_ops
;
extern
struct
pm_qos_request_list
ath9k_pm_qos_req
;
extern
int
modparam_nohwcrypt
;
extern
int
modparam_nohwcrypt
;
extern
int
led_blink
;
extern
int
led_blink
;
...
...
drivers/net/wireless/ath/ath9k/hif_usb.c
View file @
8877870f
...
@@ -35,6 +35,7 @@ static struct usb_device_id ath9k_hif_usb_ids[] = {
...
@@ -35,6 +35,7 @@ static struct usb_device_id ath9k_hif_usb_ids[] = {
{
USB_DEVICE
(
0x07D1
,
0x3A10
)
},
/* Dlink Wireless 150 */
{
USB_DEVICE
(
0x07D1
,
0x3A10
)
},
/* Dlink Wireless 150 */
{
USB_DEVICE
(
0x13D3
,
0x3327
)
},
/* Azurewave */
{
USB_DEVICE
(
0x13D3
,
0x3327
)
},
/* Azurewave */
{
USB_DEVICE
(
0x13D3
,
0x3328
)
},
/* Azurewave */
{
USB_DEVICE
(
0x13D3
,
0x3328
)
},
/* Azurewave */
{
USB_DEVICE
(
0x13D3
,
0x3346
)
},
/* IMC Networks */
{
USB_DEVICE
(
0x04CA
,
0x4605
)
},
/* Liteon */
{
USB_DEVICE
(
0x04CA
,
0x4605
)
},
/* Liteon */
{
USB_DEVICE
(
0x083A
,
0xA704
)
},
/* SMC Networks */
{
USB_DEVICE
(
0x083A
,
0xA704
)
},
/* SMC Networks */
{
},
{
},
...
@@ -540,11 +541,11 @@ static void ath9k_hif_usb_reg_in_cb(struct urb *urb)
...
@@ -540,11 +541,11 @@ static void ath9k_hif_usb_reg_in_cb(struct urb *urb)
return
;
return
;
}
}
usb_fill_
int
_urb
(
urb
,
hif_dev
->
udev
,
usb_fill_
bulk
_urb
(
urb
,
hif_dev
->
udev
,
usb_rcvbulkpipe
(
hif_dev
->
udev
,
usb_rcvbulkpipe
(
hif_dev
->
udev
,
USB_REG_IN_PIPE
),
USB_REG_IN_PIPE
),
nskb
->
data
,
MAX_REG_IN_BUF_SIZE
,
nskb
->
data
,
MAX_REG_IN_BUF_SIZE
,
ath9k_hif_usb_reg_in_cb
,
nskb
,
1
);
ath9k_hif_usb_reg_in_cb
,
nskb
);
ret
=
usb_submit_urb
(
urb
,
GFP_ATOMIC
);
ret
=
usb_submit_urb
(
urb
,
GFP_ATOMIC
);
if
(
ret
)
{
if
(
ret
)
{
...
@@ -720,11 +721,11 @@ static int ath9k_hif_usb_alloc_reg_in_urb(struct hif_device_usb *hif_dev)
...
@@ -720,11 +721,11 @@ static int ath9k_hif_usb_alloc_reg_in_urb(struct hif_device_usb *hif_dev)
if
(
!
skb
)
if
(
!
skb
)
goto
err
;
goto
err
;
usb_fill_
int
_urb
(
hif_dev
->
reg_in_urb
,
hif_dev
->
udev
,
usb_fill_
bulk
_urb
(
hif_dev
->
reg_in_urb
,
hif_dev
->
udev
,
usb_rcvbulkpipe
(
hif_dev
->
udev
,
usb_rcvbulkpipe
(
hif_dev
->
udev
,
USB_REG_IN_PIPE
),
USB_REG_IN_PIPE
),
skb
->
data
,
MAX_REG_IN_BUF_SIZE
,
skb
->
data
,
MAX_REG_IN_BUF_SIZE
,
ath9k_hif_usb_reg_in_cb
,
skb
,
1
);
ath9k_hif_usb_reg_in_cb
,
skb
);
if
(
usb_submit_urb
(
hif_dev
->
reg_in_urb
,
GFP_KERNEL
)
!=
0
)
if
(
usb_submit_urb
(
hif_dev
->
reg_in_urb
,
GFP_KERNEL
)
!=
0
)
goto
err
;
goto
err
;
...
@@ -843,14 +844,6 @@ static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev)
...
@@ -843,14 +844,6 @@ static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev)
goto
err_fw_req
;
goto
err_fw_req
;
}
}
/* Alloc URBs */
ret
=
ath9k_hif_usb_alloc_urbs
(
hif_dev
);
if
(
ret
)
{
dev_err
(
&
hif_dev
->
udev
->
dev
,
"ath9k_htc: Unable to allocate URBs
\n
"
);
goto
err_urb
;
}
/* Download firmware */
/* Download firmware */
ret
=
ath9k_hif_usb_download_fw
(
hif_dev
);
ret
=
ath9k_hif_usb_download_fw
(
hif_dev
);
if
(
ret
)
{
if
(
ret
)
{
...
@@ -866,16 +859,22 @@ static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev)
...
@@ -866,16 +859,22 @@ static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev)
*/
*/
for
(
idx
=
0
;
idx
<
alt
->
desc
.
bNumEndpoints
;
idx
++
)
{
for
(
idx
=
0
;
idx
<
alt
->
desc
.
bNumEndpoints
;
idx
++
)
{
endp
=
&
alt
->
endpoint
[
idx
].
desc
;
endp
=
&
alt
->
endpoint
[
idx
].
desc
;
if
(((
endp
->
bEndpointAddress
&
USB_ENDPOINT_NUMBER_MASK
)
if
((
endp
->
bmAttributes
&
USB_ENDPOINT_XFERTYPE_MASK
)
==
0x04
)
&&
==
USB_ENDPOINT_XFER_INT
)
{
((
endp
->
bmAttributes
&
USB_ENDPOINT_XFERTYPE_MASK
)
==
USB_ENDPOINT_XFER_INT
))
{
endp
->
bmAttributes
&=
~
USB_ENDPOINT_XFERTYPE_MASK
;
endp
->
bmAttributes
&=
~
USB_ENDPOINT_XFERTYPE_MASK
;
endp
->
bmAttributes
|=
USB_ENDPOINT_XFER_BULK
;
endp
->
bmAttributes
|=
USB_ENDPOINT_XFER_BULK
;
endp
->
bInterval
=
0
;
endp
->
bInterval
=
0
;
}
}
}
}
/* Alloc URBs */
ret
=
ath9k_hif_usb_alloc_urbs
(
hif_dev
);
if
(
ret
)
{
dev_err
(
&
hif_dev
->
udev
->
dev
,
"ath9k_htc: Unable to allocate URBs
\n
"
);
goto
err_urb
;
}
return
0
;
return
0
;
err_fw_download:
err_fw_download:
...
...
drivers/net/wireless/ath/ath9k/hw.c
View file @
8877870f
...
@@ -484,6 +484,7 @@ static int ath9k_hw_post_init(struct ath_hw *ah)
...
@@ -484,6 +484,7 @@ static int ath9k_hw_post_init(struct ath_hw *ah)
ath_print
(
ath9k_hw_common
(
ah
),
ATH_DBG_FATAL
,
ath_print
(
ath9k_hw_common
(
ah
),
ATH_DBG_FATAL
,
"Failed allocating banks for "
"Failed allocating banks for "
"external radio
\n
"
);
"external radio
\n
"
);
ath9k_hw_rf_free_ext_banks
(
ah
);
return
ecode
;
return
ecode
;
}
}
...
@@ -952,9 +953,12 @@ static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode)
...
@@ -952,9 +953,12 @@ static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode)
REG_SET_BIT
(
ah
,
AR_CFG
,
AR_CFG_AP_ADHOC_INDICATION
);
REG_SET_BIT
(
ah
,
AR_CFG
,
AR_CFG_AP_ADHOC_INDICATION
);
break
;
break
;
case
NL80211_IFTYPE_STATION
:
case
NL80211_IFTYPE_STATION
:
case
NL80211_IFTYPE_MONITOR
:
REG_WRITE
(
ah
,
AR_STA_ID1
,
val
|
AR_STA_ID1_KSRCH_MODE
);
REG_WRITE
(
ah
,
AR_STA_ID1
,
val
|
AR_STA_ID1_KSRCH_MODE
);
break
;
break
;
default:
if
(
ah
->
is_monitoring
)
REG_WRITE
(
ah
,
AR_STA_ID1
,
val
|
AR_STA_ID1_KSRCH_MODE
);
break
;
}
}
}
}
...
@@ -1634,7 +1638,6 @@ void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period)
...
@@ -1634,7 +1638,6 @@ void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period)
switch
(
ah
->
opmode
)
{
switch
(
ah
->
opmode
)
{
case
NL80211_IFTYPE_STATION
:
case
NL80211_IFTYPE_STATION
:
case
NL80211_IFTYPE_MONITOR
:
REG_WRITE
(
ah
,
AR_NEXT_TBTT_TIMER
,
TU_TO_USEC
(
next_beacon
));
REG_WRITE
(
ah
,
AR_NEXT_TBTT_TIMER
,
TU_TO_USEC
(
next_beacon
));
REG_WRITE
(
ah
,
AR_NEXT_DMA_BEACON_ALERT
,
0xffff
);
REG_WRITE
(
ah
,
AR_NEXT_DMA_BEACON_ALERT
,
0xffff
);
REG_WRITE
(
ah
,
AR_NEXT_SWBA
,
0x7ffff
);
REG_WRITE
(
ah
,
AR_NEXT_SWBA
,
0x7ffff
);
...
@@ -1663,6 +1666,14 @@ void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period)
...
@@ -1663,6 +1666,14 @@ void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period)
AR_TBTT_TIMER_EN
|
AR_DBA_TIMER_EN
|
AR_SWBA_TIMER_EN
;
AR_TBTT_TIMER_EN
|
AR_DBA_TIMER_EN
|
AR_SWBA_TIMER_EN
;
break
;
break
;
default:
default:
if
(
ah
->
is_monitoring
)
{
REG_WRITE
(
ah
,
AR_NEXT_TBTT_TIMER
,
TU_TO_USEC
(
next_beacon
));
REG_WRITE
(
ah
,
AR_NEXT_DMA_BEACON_ALERT
,
0xffff
);
REG_WRITE
(
ah
,
AR_NEXT_SWBA
,
0x7ffff
);
flags
|=
AR_TBTT_TIMER_EN
;
break
;
}
ath_print
(
ath9k_hw_common
(
ah
),
ATH_DBG_BEACON
,
ath_print
(
ath9k_hw_common
(
ah
),
ATH_DBG_BEACON
,
"%s: unsupported opmode: %d
\n
"
,
"%s: unsupported opmode: %d
\n
"
,
__func__
,
ah
->
opmode
);
__func__
,
ah
->
opmode
);
...
...
drivers/net/wireless/ath/ath9k/hw.h
View file @
8877870f
...
@@ -622,6 +622,7 @@ struct ath_hw {
...
@@ -622,6 +622,7 @@ struct ath_hw {
bool
sw_mgmt_crypto
;
bool
sw_mgmt_crypto
;
bool
is_pciexpress
;
bool
is_pciexpress
;
bool
is_monitoring
;
bool
need_an_top2_fixup
;
bool
need_an_top2_fixup
;
u16
tx_trig_level
;
u16
tx_trig_level
;
...
...
drivers/net/wireless/ath/ath9k/init.c
View file @
8877870f
...
@@ -15,6 +15,7 @@
...
@@ -15,6 +15,7 @@
*/
*/
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/pm_qos_params.h>
#include "ath9k.h"
#include "ath9k.h"
...
@@ -179,6 +180,8 @@ static const struct ath_ops ath9k_common_ops = {
...
@@ -179,6 +180,8 @@ static const struct ath_ops ath9k_common_ops = {
.
write
=
ath9k_iowrite32
,
.
write
=
ath9k_iowrite32
,
};
};
struct
pm_qos_request_list
ath9k_pm_qos_req
;
/**************************/
/**************************/
/* Initialization */
/* Initialization */
/**************************/
/**************************/
...
@@ -756,6 +759,9 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid,
...
@@ -756,6 +759,9 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid,
ath_init_leds
(
sc
);
ath_init_leds
(
sc
);
ath_start_rfkill_poll
(
sc
);
ath_start_rfkill_poll
(
sc
);
pm_qos_add_request
(
&
ath9k_pm_qos_req
,
PM_QOS_CPU_DMA_LATENCY
,
PM_QOS_DEFAULT_VALUE
);
return
0
;
return
0
;
error_world:
error_world:
...
@@ -811,6 +817,8 @@ void ath9k_deinit_device(struct ath_softc *sc)
...
@@ -811,6 +817,8 @@ void ath9k_deinit_device(struct ath_softc *sc)
ath9k_ps_wakeup
(
sc
);
ath9k_ps_wakeup
(
sc
);
pm_qos_remove_request
(
&
ath9k_pm_qos_req
);
wiphy_rfkill_stop_polling
(
sc
->
hw
->
wiphy
);
wiphy_rfkill_stop_polling
(
sc
->
hw
->
wiphy
);
ath_deinit_leds
(
sc
);
ath_deinit_leds
(
sc
);
...
...
drivers/net/wireless/ath/ath9k/main.c
View file @
8877870f
...
@@ -15,6 +15,7 @@
...
@@ -15,6 +15,7 @@
*/
*/
#include <linux/nl80211.h>
#include <linux/nl80211.h>
#include <linux/pm_qos_params.h>
#include "ath9k.h"
#include "ath9k.h"
#include "btcoex.h"
#include "btcoex.h"
...
@@ -93,11 +94,13 @@ void ath9k_ps_wakeup(struct ath_softc *sc)
...
@@ -93,11 +94,13 @@ void ath9k_ps_wakeup(struct ath_softc *sc)
{
{
struct
ath_common
*
common
=
ath9k_hw_common
(
sc
->
sc_ah
);
struct
ath_common
*
common
=
ath9k_hw_common
(
sc
->
sc_ah
);
unsigned
long
flags
;
unsigned
long
flags
;
enum
ath9k_power_mode
power_mode
;
spin_lock_irqsave
(
&
sc
->
sc_pm_lock
,
flags
);
spin_lock_irqsave
(
&
sc
->
sc_pm_lock
,
flags
);
if
(
++
sc
->
ps_usecount
!=
1
)
if
(
++
sc
->
ps_usecount
!=
1
)
goto
unlock
;
goto
unlock
;
power_mode
=
sc
->
sc_ah
->
power_mode
;
ath9k_hw_setpower
(
sc
->
sc_ah
,
ATH9K_PM_AWAKE
);
ath9k_hw_setpower
(
sc
->
sc_ah
,
ATH9K_PM_AWAKE
);
/*
/*
...
@@ -105,10 +108,12 @@ void ath9k_ps_wakeup(struct ath_softc *sc)
...
@@ -105,10 +108,12 @@ void ath9k_ps_wakeup(struct ath_softc *sc)
* useful data. Better clear them now so that they don't mess up
* useful data. Better clear them now so that they don't mess up
* survey data results.
* survey data results.
*/
*/
spin_lock
(
&
common
->
cc_lock
);
if
(
power_mode
!=
ATH9K_PM_AWAKE
)
{
ath_hw_cycle_counters_update
(
common
);
spin_lock
(
&
common
->
cc_lock
);
memset
(
&
common
->
cc_survey
,
0
,
sizeof
(
common
->
cc_survey
));
ath_hw_cycle_counters_update
(
common
);
spin_unlock
(
&
common
->
cc_lock
);
memset
(
&
common
->
cc_survey
,
0
,
sizeof
(
common
->
cc_survey
));
spin_unlock
(
&
common
->
cc_lock
);
}
unlock:
unlock:
spin_unlock_irqrestore
(
&
sc
->
sc_pm_lock
,
flags
);
spin_unlock_irqrestore
(
&
sc
->
sc_pm_lock
,
flags
);
...
@@ -1217,6 +1222,7 @@ static int ath9k_start(struct ieee80211_hw *hw)
...
@@ -1217,6 +1222,7 @@ static int ath9k_start(struct ieee80211_hw *hw)
ah
->
imask
|=
ATH9K_INT_CST
;
ah
->
imask
|=
ATH9K_INT_CST
;
sc
->
sc_flags
&=
~
SC_OP_INVALID
;
sc
->
sc_flags
&=
~
SC_OP_INVALID
;
sc
->
sc_ah
->
is_monitoring
=
false
;
/* Disable BMISS interrupt when we're not associated */
/* Disable BMISS interrupt when we're not associated */
ah
->
imask
&=
~
(
ATH9K_INT_SWBA
|
ATH9K_INT_BMISS
);
ah
->
imask
&=
~
(
ATH9K_INT_SWBA
|
ATH9K_INT_BMISS
);
...
@@ -1238,6 +1244,8 @@ static int ath9k_start(struct ieee80211_hw *hw)
...
@@ -1238,6 +1244,8 @@ static int ath9k_start(struct ieee80211_hw *hw)
ath9k_btcoex_timer_resume
(
sc
);
ath9k_btcoex_timer_resume
(
sc
);
}
}
pm_qos_update_request
(
&
ath9k_pm_qos_req
,
55
);
mutex_unlock:
mutex_unlock:
mutex_unlock
(
&
sc
->
mutex
);
mutex_unlock
(
&
sc
->
mutex
);
...
@@ -1415,6 +1423,8 @@ static void ath9k_stop(struct ieee80211_hw *hw)
...
@@ -1415,6 +1423,8 @@ static void ath9k_stop(struct ieee80211_hw *hw)
sc
->
sc_flags
|=
SC_OP_INVALID
;
sc
->
sc_flags
|=
SC_OP_INVALID
;
pm_qos_update_request
(
&
ath9k_pm_qos_req
,
PM_QOS_DEFAULT_VALUE
);
mutex_unlock
(
&
sc
->
mutex
);
mutex_unlock
(
&
sc
->
mutex
);
ath_print
(
common
,
ATH_DBG_CONFIG
,
"Driver halt
\n
"
);
ath_print
(
common
,
ATH_DBG_CONFIG
,
"Driver halt
\n
"
);
...
@@ -1493,8 +1503,7 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
...
@@ -1493,8 +1503,7 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
ath9k_hw_set_interrupts
(
ah
,
ah
->
imask
);
ath9k_hw_set_interrupts
(
ah
,
ah
->
imask
);
if
(
vif
->
type
==
NL80211_IFTYPE_AP
||
if
(
vif
->
type
==
NL80211_IFTYPE_AP
||
vif
->
type
==
NL80211_IFTYPE_ADHOC
||
vif
->
type
==
NL80211_IFTYPE_ADHOC
)
{
vif
->
type
==
NL80211_IFTYPE_MONITOR
)
{
sc
->
sc_flags
|=
SC_OP_ANI_RUN
;
sc
->
sc_flags
|=
SC_OP_ANI_RUN
;
ath_start_ani
(
common
);
ath_start_ani
(
common
);
}
}
...
@@ -1644,8 +1653,12 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
...
@@ -1644,8 +1653,12 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
if
(
changed
&
IEEE80211_CONF_CHANGE_MONITOR
)
{
if
(
changed
&
IEEE80211_CONF_CHANGE_MONITOR
)
{
if
(
conf
->
flags
&
IEEE80211_CONF_MONITOR
)
{
if
(
conf
->
flags
&
IEEE80211_CONF_MONITOR
)
{
ath_print
(
common
,
ATH_DBG_CONFIG
,
ath_print
(
common
,
ATH_DBG_CONFIG
,
"HW opmode set to Monitor mode
\n
"
);
"Monitor mode is enabled
\n
"
);
sc
->
sc_ah
->
opmode
=
NL80211_IFTYPE_MONITOR
;
sc
->
sc_ah
->
is_monitoring
=
true
;
}
else
{
ath_print
(
common
,
ATH_DBG_CONFIG
,
"Monitor mode is disabled
\n
"
);
sc
->
sc_ah
->
is_monitoring
=
false
;
}
}
}
}
...
...
drivers/net/wireless/ath/ath9k/recv.c
View file @
8877870f
...
@@ -441,7 +441,7 @@ u32 ath_calcrxfilter(struct ath_softc *sc)
...
@@ -441,7 +441,7 @@ u32 ath_calcrxfilter(struct ath_softc *sc)
*/
*/
if
(((
sc
->
sc_ah
->
opmode
!=
NL80211_IFTYPE_AP
)
&&
if
(((
sc
->
sc_ah
->
opmode
!=
NL80211_IFTYPE_AP
)
&&
(
sc
->
rx
.
rxfilter
&
FIF_PROMISC_IN_BSS
))
||
(
sc
->
rx
.
rxfilter
&
FIF_PROMISC_IN_BSS
))
||
(
sc
->
sc_ah
->
opmode
==
NL80211_IFTYPE_MONITOR
))
(
sc
->
sc_ah
->
is_monitoring
))
rfilt
|=
ATH9K_RX_FILTER_PROM
;
rfilt
|=
ATH9K_RX_FILTER_PROM
;
if
(
sc
->
rx
.
rxfilter
&
FIF_CONTROL
)
if
(
sc
->
rx
.
rxfilter
&
FIF_CONTROL
)
...
@@ -897,7 +897,7 @@ static bool ath9k_rx_accept(struct ath_common *common,
...
@@ -897,7 +897,7 @@ static bool ath9k_rx_accept(struct ath_common *common,
* decryption and MIC failures. For monitor mode,
* decryption and MIC failures. For monitor mode,
* we also ignore the CRC error.
* we also ignore the CRC error.
*/
*/
if
(
ah
->
opmode
==
NL80211_IFTYPE_MONITOR
)
{
if
(
ah
->
is_monitoring
)
{
if
(
rx_stats
->
rs_status
&
if
(
rx_stats
->
rs_status
&
~
(
ATH9K_RXERR_DECRYPT
|
ATH9K_RXERR_MIC
|
~
(
ATH9K_RXERR_DECRYPT
|
ATH9K_RXERR_MIC
|
ATH9K_RXERR_CRC
))
ATH9K_RXERR_CRC
))
...
...
drivers/net/wireless/ath/ath9k/reg.h
View file @
8877870f
...
@@ -703,6 +703,7 @@
...
@@ -703,6 +703,7 @@
#define AR_WA_RESET_EN (1 << 18)
/* Sw Control to enable PCI-Reset to POR (bit 15) */
#define AR_WA_RESET_EN (1 << 18)
/* Sw Control to enable PCI-Reset to POR (bit 15) */
#define AR_WA_ANALOG_SHIFT (1 << 20)
#define AR_WA_ANALOG_SHIFT (1 << 20)
#define AR_WA_POR_SHORT (1 << 21)
/* PCI-E Phy reset control */
#define AR_WA_POR_SHORT (1 << 21)
/* PCI-E Phy reset control */
#define AR_WA_BIT22 (1 << 22)
#define AR9285_WA_DEFAULT 0x004a050b
#define AR9285_WA_DEFAULT 0x004a050b
#define AR9280_WA_DEFAULT 0x0040073b
#define AR9280_WA_DEFAULT 0x0040073b
#define AR_WA_DEFAULT 0x0000073f
#define AR_WA_DEFAULT 0x0000073f
...
...
drivers/net/wireless/ath/carl9170/usb.c
View file @
8877870f
...
@@ -82,9 +82,11 @@ static struct usb_device_id carl9170_usb_ids[] = {
...
@@ -82,9 +82,11 @@ static struct usb_device_id carl9170_usb_ids[] = {
{
USB_DEVICE
(
0x07d1
,
0x3c10
)
},
{
USB_DEVICE
(
0x07d1
,
0x3c10
)
},
/* D-Link DWA 160 A2 */
/* D-Link DWA 160 A2 */
{
USB_DEVICE
(
0x07d1
,
0x3a09
)
},
{
USB_DEVICE
(
0x07d1
,
0x3a09
)
},
/* D-Link DWA 130 D */
{
USB_DEVICE
(
0x07d1
,
0x3a0f
)
},
/* Netgear WNA1000 */
/* Netgear WNA1000 */
{
USB_DEVICE
(
0x0846
,
0x9040
)
},
{
USB_DEVICE
(
0x0846
,
0x9040
)
},
/* Netgear WNDA3100 */
/* Netgear WNDA3100
(v1)
*/
{
USB_DEVICE
(
0x0846
,
0x9010
)
},
{
USB_DEVICE
(
0x0846
,
0x9010
)
},
/* Netgear WN111 v2 */
/* Netgear WN111 v2 */
{
USB_DEVICE
(
0x0846
,
0x9001
),
.
driver_info
=
CARL9170_ONE_LED
},
{
USB_DEVICE
(
0x0846
,
0x9001
),
.
driver_info
=
CARL9170_ONE_LED
},
...
...
drivers/net/wireless/ipw2x00/libipw_module.c
View file @
8877870f
...
@@ -54,6 +54,7 @@
...
@@ -54,6 +54,7 @@
#define DRV_DESCRIPTION "802.11 data/management/control stack"
#define DRV_DESCRIPTION "802.11 data/management/control stack"
#define DRV_NAME "libipw"
#define DRV_NAME "libipw"
#define DRV_PROCNAME "ieee80211"
#define DRV_VERSION LIBIPW_VERSION
#define DRV_VERSION LIBIPW_VERSION
#define DRV_COPYRIGHT "Copyright (C) 2004-2005 Intel Corporation <jketreno@linux.intel.com>"
#define DRV_COPYRIGHT "Copyright (C) 2004-2005 Intel Corporation <jketreno@linux.intel.com>"
...
@@ -293,16 +294,16 @@ static int __init libipw_init(void)
...
@@ -293,16 +294,16 @@ static int __init libipw_init(void)
struct
proc_dir_entry
*
e
;
struct
proc_dir_entry
*
e
;
libipw_debug_level
=
debug
;
libipw_debug_level
=
debug
;
libipw_proc
=
proc_mkdir
(
"ieee80211"
,
init_net
.
proc_net
);
libipw_proc
=
proc_mkdir
(
DRV_PROCNAME
,
init_net
.
proc_net
);
if
(
libipw_proc
==
NULL
)
{
if
(
libipw_proc
==
NULL
)
{
LIBIPW_ERROR
(
"Unable to create "
DRV_NAME
LIBIPW_ERROR
(
"Unable to create "
DRV_
PROC
NAME
" proc directory
\n
"
);
" proc directory
\n
"
);
return
-
EIO
;
return
-
EIO
;
}
}
e
=
proc_create
(
"debug_level"
,
S_IRUGO
|
S_IWUSR
,
libipw_proc
,
e
=
proc_create
(
"debug_level"
,
S_IRUGO
|
S_IWUSR
,
libipw_proc
,
&
debug_level_proc_fops
);
&
debug_level_proc_fops
);
if
(
!
e
)
{
if
(
!
e
)
{
remove_proc_entry
(
DRV_NAME
,
init_net
.
proc_net
);
remove_proc_entry
(
DRV_
PROC
NAME
,
init_net
.
proc_net
);
libipw_proc
=
NULL
;
libipw_proc
=
NULL
;
return
-
EIO
;
return
-
EIO
;
}
}
...
@@ -319,7 +320,7 @@ static void __exit libipw_exit(void)
...
@@ -319,7 +320,7 @@ static void __exit libipw_exit(void)
#ifdef CONFIG_LIBIPW_DEBUG
#ifdef CONFIG_LIBIPW_DEBUG
if
(
libipw_proc
)
{
if
(
libipw_proc
)
{
remove_proc_entry
(
"debug_level"
,
libipw_proc
);
remove_proc_entry
(
"debug_level"
,
libipw_proc
);
remove_proc_entry
(
DRV_NAME
,
init_net
.
proc_net
);
remove_proc_entry
(
DRV_
PROC
NAME
,
init_net
.
proc_net
);
libipw_proc
=
NULL
;
libipw_proc
=
NULL
;
}
}
#endif
/* CONFIG_LIBIPW_DEBUG */
#endif
/* CONFIG_LIBIPW_DEBUG */
...
...
drivers/net/wireless/iwlwifi/iwl3945-base.c
View file @
8877870f
...
@@ -4000,7 +4000,8 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
...
@@ -4000,7 +4000,8 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
* "the hard way", rather than using device's scan.
* "the hard way", rather than using device's scan.
*/
*/
if
(
iwl3945_mod_params
.
disable_hw_scan
)
{
if
(
iwl3945_mod_params
.
disable_hw_scan
)
{
IWL_ERR
(
priv
,
"sw scan support is deprecated
\n
"
);
dev_printk
(
KERN_DEBUG
,
&
(
pdev
->
dev
),
"sw scan support is deprecated
\n
"
);
iwl3945_hw_ops
.
hw_scan
=
NULL
;
iwl3945_hw_ops
.
hw_scan
=
NULL
;
}
}
...
...
drivers/net/wireless/libertas/cfg.c
View file @
8877870f
...
@@ -700,8 +700,9 @@ static void lbs_scan_worker(struct work_struct *work)
...
@@ -700,8 +700,9 @@ static void lbs_scan_worker(struct work_struct *work)
if
(
priv
->
scan_channel
<
priv
->
scan_req
->
n_channels
)
{
if
(
priv
->
scan_channel
<
priv
->
scan_req
->
n_channels
)
{
cancel_delayed_work
(
&
priv
->
scan_work
);
cancel_delayed_work
(
&
priv
->
scan_work
);
queue_delayed_work
(
priv
->
work_thread
,
&
priv
->
scan_work
,
if
(
!
priv
->
stopping
)
msecs_to_jiffies
(
300
));
queue_delayed_work
(
priv
->
work_thread
,
&
priv
->
scan_work
,
msecs_to_jiffies
(
300
));
}
}
/* This is the final data we are about to send */
/* This is the final data we are about to send */
...
...
drivers/net/wireless/libertas/dev.h
View file @
8877870f
...
@@ -36,6 +36,7 @@ struct lbs_private {
...
@@ -36,6 +36,7 @@ struct lbs_private {
/* CFG80211 */
/* CFG80211 */
struct
wireless_dev
*
wdev
;
struct
wireless_dev
*
wdev
;
bool
wiphy_registered
;
bool
wiphy_registered
;
bool
stopping
;
struct
cfg80211_scan_request
*
scan_req
;
struct
cfg80211_scan_request
*
scan_req
;
u8
assoc_bss
[
ETH_ALEN
];
u8
assoc_bss
[
ETH_ALEN
];
u8
disassoc_reason
;
u8
disassoc_reason
;
...
...
drivers/net/wireless/libertas/main.c
View file @
8877870f
...
@@ -104,6 +104,7 @@ static int lbs_dev_open(struct net_device *dev)
...
@@ -104,6 +104,7 @@ static int lbs_dev_open(struct net_device *dev)
lbs_deb_enter
(
LBS_DEB_NET
);
lbs_deb_enter
(
LBS_DEB_NET
);
spin_lock_irq
(
&
priv
->
driver_lock
);
spin_lock_irq
(
&
priv
->
driver_lock
);
priv
->
stopping
=
false
;
if
(
priv
->
connect_status
==
LBS_CONNECTED
)
if
(
priv
->
connect_status
==
LBS_CONNECTED
)
netif_carrier_on
(
dev
);
netif_carrier_on
(
dev
);
...
@@ -131,10 +132,16 @@ static int lbs_eth_stop(struct net_device *dev)
...
@@ -131,10 +132,16 @@ static int lbs_eth_stop(struct net_device *dev)
lbs_deb_enter
(
LBS_DEB_NET
);
lbs_deb_enter
(
LBS_DEB_NET
);
spin_lock_irq
(
&
priv
->
driver_lock
);
spin_lock_irq
(
&
priv
->
driver_lock
);
priv
->
stopping
=
true
;
netif_stop_queue
(
dev
);
netif_stop_queue
(
dev
);
spin_unlock_irq
(
&
priv
->
driver_lock
);
spin_unlock_irq
(
&
priv
->
driver_lock
);
schedule_work
(
&
priv
->
mcast_work
);
schedule_work
(
&
priv
->
mcast_work
);
cancel_delayed_work_sync
(
&
priv
->
scan_work
);
if
(
priv
->
scan_req
)
{
cfg80211_scan_done
(
priv
->
scan_req
,
false
);
priv
->
scan_req
=
NULL
;
}
lbs_deb_leave
(
LBS_DEB_NET
);
lbs_deb_leave
(
LBS_DEB_NET
);
return
0
;
return
0
;
...
...
net/bluetooth/hci_event.c
View file @
8877870f
...
@@ -1175,6 +1175,12 @@ static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff
...
@@ -1175,6 +1175,12 @@ static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff
hci_send_cmd
(
hdev
,
hci_send_cmd
(
hdev
,
HCI_OP_READ_REMOTE_EXT_FEATURES
,
HCI_OP_READ_REMOTE_EXT_FEATURES
,
sizeof
(
cp
),
&
cp
);
sizeof
(
cp
),
&
cp
);
}
else
if
(
!
ev
->
status
&&
conn
->
out
&&
conn
->
sec_level
==
BT_SECURITY_HIGH
)
{
struct
hci_cp_auth_requested
cp
;
cp
.
handle
=
ev
->
handle
;
hci_send_cmd
(
hdev
,
HCI_OP_AUTH_REQUESTED
,
sizeof
(
cp
),
&
cp
);
}
else
{
}
else
{
conn
->
state
=
BT_CONNECTED
;
conn
->
state
=
BT_CONNECTED
;
hci_proto_connect_cfm
(
conn
,
ev
->
status
);
hci_proto_connect_cfm
(
conn
,
ev
->
status
);
...
...
net/bluetooth/hidp/Kconfig
View file @
8877870f
config BT_HIDP
config BT_HIDP
tristate "HIDP protocol support"
tristate "HIDP protocol support"
depends on BT && BT_L2CAP && INPUT
depends on BT && BT_L2CAP && INPUT
&& HID_SUPPORT
select HID
select HID
help
help
HIDP (Human Interface Device Protocol) is a transport layer
HIDP (Human Interface Device Protocol) is a transport layer
...
...
net/bluetooth/l2cap.c
View file @
8877870f
...
@@ -2421,11 +2421,11 @@ static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen, unsigned
...
@@ -2421,11 +2421,11 @@ static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen, unsigned
break
;
break
;
case
2
:
case
2
:
*
val
=
__le16_to_cpu
(
*
((
__le16
*
)
opt
->
val
)
);
*
val
=
get_unaligned_le16
(
opt
->
val
);
break
;
break
;
case
4
:
case
4
:
*
val
=
__le32_to_cpu
(
*
((
__le32
*
)
opt
->
val
)
);
*
val
=
get_unaligned_le32
(
opt
->
val
);
break
;
break
;
default:
default:
...
@@ -2452,11 +2452,11 @@ static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
...
@@ -2452,11 +2452,11 @@ static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
break
;
break
;
case
2
:
case
2
:
*
((
__le16
*
)
opt
->
val
)
=
cpu_to_le16
(
val
);
put_unaligned_le16
(
val
,
opt
->
val
);
break
;
break
;
case
4
:
case
4
:
*
((
__le32
*
)
opt
->
val
)
=
cpu_to_le32
(
val
);
put_unaligned_le32
(
val
,
opt
->
val
);
break
;
break
;
default:
default:
...
...
net/bluetooth/rfcomm/core.c
View file @
8877870f
...
@@ -79,7 +79,10 @@ static void rfcomm_make_uih(struct sk_buff *skb, u8 addr);
...
@@ -79,7 +79,10 @@ static void rfcomm_make_uih(struct sk_buff *skb, u8 addr);
static
void
rfcomm_process_connect
(
struct
rfcomm_session
*
s
);
static
void
rfcomm_process_connect
(
struct
rfcomm_session
*
s
);
static
struct
rfcomm_session
*
rfcomm_session_create
(
bdaddr_t
*
src
,
bdaddr_t
*
dst
,
int
*
err
);
static
struct
rfcomm_session
*
rfcomm_session_create
(
bdaddr_t
*
src
,
bdaddr_t
*
dst
,
u8
sec_level
,
int
*
err
);
static
struct
rfcomm_session
*
rfcomm_session_get
(
bdaddr_t
*
src
,
bdaddr_t
*
dst
);
static
struct
rfcomm_session
*
rfcomm_session_get
(
bdaddr_t
*
src
,
bdaddr_t
*
dst
);
static
void
rfcomm_session_del
(
struct
rfcomm_session
*
s
);
static
void
rfcomm_session_del
(
struct
rfcomm_session
*
s
);
...
@@ -401,7 +404,7 @@ static int __rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst,
...
@@ -401,7 +404,7 @@ static int __rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst,
s
=
rfcomm_session_get
(
src
,
dst
);
s
=
rfcomm_session_get
(
src
,
dst
);
if
(
!
s
)
{
if
(
!
s
)
{
s
=
rfcomm_session_create
(
src
,
dst
,
&
err
);
s
=
rfcomm_session_create
(
src
,
dst
,
d
->
sec_level
,
&
err
);
if
(
!
s
)
if
(
!
s
)
return
err
;
return
err
;
}
}
...
@@ -679,7 +682,10 @@ static void rfcomm_session_close(struct rfcomm_session *s, int err)
...
@@ -679,7 +682,10 @@ static void rfcomm_session_close(struct rfcomm_session *s, int err)
rfcomm_session_put
(
s
);
rfcomm_session_put
(
s
);
}
}
static
struct
rfcomm_session
*
rfcomm_session_create
(
bdaddr_t
*
src
,
bdaddr_t
*
dst
,
int
*
err
)
static
struct
rfcomm_session
*
rfcomm_session_create
(
bdaddr_t
*
src
,
bdaddr_t
*
dst
,
u8
sec_level
,
int
*
err
)
{
{
struct
rfcomm_session
*
s
=
NULL
;
struct
rfcomm_session
*
s
=
NULL
;
struct
sockaddr_l2
addr
;
struct
sockaddr_l2
addr
;
...
@@ -704,6 +710,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst
...
@@ -704,6 +710,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst
sk
=
sock
->
sk
;
sk
=
sock
->
sk
;
lock_sock
(
sk
);
lock_sock
(
sk
);
l2cap_pi
(
sk
)
->
imtu
=
l2cap_mtu
;
l2cap_pi
(
sk
)
->
imtu
=
l2cap_mtu
;
l2cap_pi
(
sk
)
->
sec_level
=
sec_level
;
if
(
l2cap_ertm
)
if
(
l2cap_ertm
)
l2cap_pi
(
sk
)
->
mode
=
L2CAP_MODE_ERTM
;
l2cap_pi
(
sk
)
->
mode
=
L2CAP_MODE_ERTM
;
release_sock
(
sk
);
release_sock
(
sk
);
...
...
net/mac80211/iface.c
View file @
8877870f
...
@@ -391,6 +391,9 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
...
@@ -391,6 +391,9 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
u32
hw_reconf_flags
=
0
;
u32
hw_reconf_flags
=
0
;
int
i
;
int
i
;
if
(
local
->
scan_sdata
==
sdata
)
ieee80211_scan_cancel
(
local
);
clear_bit
(
SDATA_STATE_RUNNING
,
&
sdata
->
state
);
clear_bit
(
SDATA_STATE_RUNNING
,
&
sdata
->
state
);
/*
/*
...
@@ -523,9 +526,6 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
...
@@ -523,9 +526,6 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
synchronize_rcu
();
synchronize_rcu
();
skb_queue_purge
(
&
sdata
->
skb_queue
);
skb_queue_purge
(
&
sdata
->
skb_queue
);
if
(
local
->
scan_sdata
==
sdata
)
ieee80211_scan_cancel
(
local
);
/*
/*
* Disable beaconing here for mesh only, AP and IBSS
* Disable beaconing here for mesh only, AP and IBSS
* are already taken care of.
* are already taken care of.
...
...
net/wireless/nl80211.c
View file @
8877870f
...
@@ -224,8 +224,8 @@ static int nl80211_prepare_netdev_dump(struct sk_buff *skb,
...
@@ -224,8 +224,8 @@ static int nl80211_prepare_netdev_dump(struct sk_buff *skb,
}
}
*
rdev
=
cfg80211_get_dev_from_ifindex
(
sock_net
(
skb
->
sk
),
ifidx
);
*
rdev
=
cfg80211_get_dev_from_ifindex
(
sock_net
(
skb
->
sk
),
ifidx
);
if
(
IS_ERR
(
dev
))
{
if
(
IS_ERR
(
*
r
dev
))
{
err
=
PTR_ERR
(
dev
);
err
=
PTR_ERR
(
*
r
dev
);
goto
out_rtnl
;
goto
out_rtnl
;
}
}
...
...
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