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
3b924ea1
Commit
3b924ea1
authored
Sep 09, 2014
by
John W. Linville
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-john' of
git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes
parents
ab09b95c
2cddddc5
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
65 additions
and
39 deletions
+65
-39
drivers/net/wireless/iwlwifi/dvm/power.c
drivers/net/wireless/iwlwifi/dvm/power.c
+1
-1
drivers/net/wireless/iwlwifi/iwl-7000.c
drivers/net/wireless/iwlwifi/iwl-7000.c
+16
-0
drivers/net/wireless/iwlwifi/iwl-config.h
drivers/net/wireless/iwlwifi/iwl-config.h
+3
-0
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
+1
-3
drivers/net/wireless/iwlwifi/mvm/coex.c
drivers/net/wireless/iwlwifi/mvm/coex.c
+3
-6
drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c
drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c
+1
-2
drivers/net/wireless/iwlwifi/mvm/fw-api.h
drivers/net/wireless/iwlwifi/mvm/fw-api.h
+2
-2
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
+5
-5
drivers/net/wireless/iwlwifi/mvm/mac80211.c
drivers/net/wireless/iwlwifi/mvm/mac80211.c
+14
-11
drivers/net/wireless/iwlwifi/mvm/power.c
drivers/net/wireless/iwlwifi/mvm/power.c
+2
-3
drivers/net/wireless/iwlwifi/mvm/rx.c
drivers/net/wireless/iwlwifi/mvm/rx.c
+3
-3
drivers/net/wireless/iwlwifi/mvm/sf.c
drivers/net/wireless/iwlwifi/mvm/sf.c
+1
-1
drivers/net/wireless/iwlwifi/mvm/tx.c
drivers/net/wireless/iwlwifi/mvm/tx.c
+6
-2
drivers/net/wireless/iwlwifi/pcie/drv.c
drivers/net/wireless/iwlwifi/pcie/drv.c
+7
-0
No files found.
drivers/net/wireless/iwlwifi/dvm/power.c
View file @
3b924ea1
...
...
@@ -40,7 +40,7 @@
#include "commands.h"
#include "power.h"
static
bool
force_cam
;
static
bool
force_cam
=
true
;
module_param
(
force_cam
,
bool
,
0644
);
MODULE_PARM_DESC
(
force_cam
,
"force continuously aware mode (no power saving at all)"
);
...
...
drivers/net/wireless/iwlwifi/iwl-7000.c
View file @
3b924ea1
...
...
@@ -83,6 +83,8 @@
#define IWL7260_TX_POWER_VERSION 0xffff
/* meaningless */
#define IWL3160_NVM_VERSION 0x709
#define IWL3160_TX_POWER_VERSION 0xffff
/* meaningless */
#define IWL3165_NVM_VERSION 0x709
#define IWL3165_TX_POWER_VERSION 0xffff
/* meaningless */
#define IWL7265_NVM_VERSION 0x0a1d
#define IWL7265_TX_POWER_VERSION 0xffff
/* meaningless */
...
...
@@ -92,6 +94,9 @@
#define IWL3160_FW_PRE "iwlwifi-3160-"
#define IWL3160_MODULE_FIRMWARE(api) IWL3160_FW_PRE __stringify(api) ".ucode"
#define IWL3165_FW_PRE "iwlwifi-3165-"
#define IWL3165_MODULE_FIRMWARE(api) IWL3165_FW_PRE __stringify(api) ".ucode"
#define IWL7265_FW_PRE "iwlwifi-7265-"
#define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode"
...
...
@@ -213,6 +218,16 @@ static const struct iwl_pwr_tx_backoff iwl7265_pwr_tx_backoffs[] = {
{
0
},
};
const
struct
iwl_cfg
iwl3165_2ac_cfg
=
{
.
name
=
"Intel(R) Dual Band Wireless AC 3165"
,
.
fw_name_pre
=
IWL3165_FW_PRE
,
IWL_DEVICE_7000
,
.
ht_params
=
&
iwl7000_ht_params
,
.
nvm_ver
=
IWL3165_NVM_VERSION
,
.
nvm_calib_ver
=
IWL3165_TX_POWER_VERSION
,
.
pwr_tx_backoffs
=
iwl7265_pwr_tx_backoffs
,
};
const
struct
iwl_cfg
iwl7265_2ac_cfg
=
{
.
name
=
"Intel(R) Dual Band Wireless AC 7265"
,
.
fw_name_pre
=
IWL7265_FW_PRE
,
...
...
@@ -245,4 +260,5 @@ const struct iwl_cfg iwl7265_n_cfg = {
MODULE_FIRMWARE
(
IWL7260_MODULE_FIRMWARE
(
IWL7260_UCODE_API_OK
));
MODULE_FIRMWARE
(
IWL3160_MODULE_FIRMWARE
(
IWL3160_UCODE_API_OK
));
MODULE_FIRMWARE
(
IWL3165_MODULE_FIRMWARE
(
IWL3160_UCODE_API_OK
));
MODULE_FIRMWARE
(
IWL7265_MODULE_FIRMWARE
(
IWL7260_UCODE_API_OK
));
drivers/net/wireless/iwlwifi/iwl-config.h
View file @
3b924ea1
...
...
@@ -120,6 +120,8 @@ enum iwl_led_mode {
#define IWL_LONG_WD_TIMEOUT 10000
#define IWL_MAX_WD_TIMEOUT 120000
#define IWL_DEFAULT_MAX_TX_POWER 22
/* Antenna presence definitions */
#define ANT_NONE 0x0
#define ANT_A BIT(0)
...
...
@@ -335,6 +337,7 @@ extern const struct iwl_cfg iwl7260_n_cfg;
extern
const
struct
iwl_cfg
iwl3160_2ac_cfg
;
extern
const
struct
iwl_cfg
iwl3160_2n_cfg
;
extern
const
struct
iwl_cfg
iwl3160_n_cfg
;
extern
const
struct
iwl_cfg
iwl3165_2ac_cfg
;
extern
const
struct
iwl_cfg
iwl7265_2ac_cfg
;
extern
const
struct
iwl_cfg
iwl7265_2n_cfg
;
extern
const
struct
iwl_cfg
iwl7265_n_cfg
;
...
...
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
View file @
3b924ea1
...
...
@@ -146,8 +146,6 @@ static const u8 iwl_nvm_channels_family_8000[] = {
#define LAST_2GHZ_HT_PLUS 9
#define LAST_5GHZ_HT 161
#define DEFAULT_MAX_TX_POWER 16
/* rate data (static) */
static
struct
ieee80211_rate
iwl_cfg80211_rates
[]
=
{
{
.
bitrate
=
1
*
10
,
.
hw_value
=
0
,
.
hw_value_short
=
0
,
},
...
...
@@ -295,7 +293,7 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
* Default value - highest tx power value. max_power
* is not used in mvm, and is used for backwards compatibility
*/
channel
->
max_power
=
DEFAULT_MAX_TX_POWER
;
channel
->
max_power
=
IWL_
DEFAULT_MAX_TX_POWER
;
is_5ghz
=
channel
->
band
==
IEEE80211_BAND_5GHZ
;
IWL_DEBUG_EEPROM
(
dev
,
"Ch. %d [%sGHz] %s%s%s%s%s%s%s(0x%02x %ddBm): Ad-Hoc %ssupported
\n
"
,
...
...
drivers/net/wireless/iwlwifi/mvm/coex.c
View file @
3b924ea1
...
...
@@ -585,8 +585,6 @@ int iwl_send_bt_init_conf(struct iwl_mvm *mvm)
lockdep_assert_held
(
&
mvm
->
mutex
);
if
(
unlikely
(
mvm
->
bt_force_ant_mode
!=
BT_FORCE_ANT_DIS
))
{
u32
mode
;
switch
(
mvm
->
bt_force_ant_mode
)
{
case
BT_FORCE_ANT_BT
:
mode
=
BT_COEX_BT
;
...
...
@@ -756,7 +754,8 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
struct
iwl_bt_iterator_data
*
data
=
_data
;
struct
iwl_mvm
*
mvm
=
data
->
mvm
;
struct
ieee80211_chanctx_conf
*
chanctx_conf
;
enum
ieee80211_smps_mode
smps_mode
;
/* default smps_mode is AUTOMATIC - only used for client modes */
enum
ieee80211_smps_mode
smps_mode
=
IEEE80211_SMPS_AUTOMATIC
;
u32
bt_activity_grading
;
int
ave_rssi
;
...
...
@@ -764,8 +763,6 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
switch
(
vif
->
type
)
{
case
NL80211_IFTYPE_STATION
:
/* default smps_mode for BSS / P2P client is AUTOMATIC */
smps_mode
=
IEEE80211_SMPS_AUTOMATIC
;
break
;
case
NL80211_IFTYPE_AP
:
if
(
!
mvmvif
->
ap_ibss_active
)
...
...
@@ -797,7 +794,7 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
else
if
(
bt_activity_grading
>=
BT_LOW_TRAFFIC
)
smps_mode
=
IEEE80211_SMPS_DYNAMIC
;
/* relax SMPS contraints for next association */
/* relax SMPS con
s
traints for next association */
if
(
!
vif
->
bss_conf
.
assoc
)
smps_mode
=
IEEE80211_SMPS_AUTOMATIC
;
...
...
drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c
View file @
3b924ea1
...
...
@@ -74,8 +74,7 @@ static void iwl_dbgfs_update_pm(struct iwl_mvm *mvm,
switch
(
param
)
{
case
MVM_DEBUGFS_PM_KEEP_ALIVE
:
{
struct
ieee80211_hw
*
hw
=
mvm
->
hw
;
int
dtimper
=
hw
->
conf
.
ps_dtim_period
?:
1
;
int
dtimper
=
vif
->
bss_conf
.
dtim_period
?:
1
;
int
dtimper_msec
=
dtimper
*
vif
->
bss_conf
.
beacon_int
;
IWL_DEBUG_POWER
(
mvm
,
"debugfs: set keep_alive= %d sec
\n
"
,
val
);
...
...
drivers/net/wireless/iwlwifi/mvm/fw-api.h
View file @
3b924ea1
...
...
@@ -1563,14 +1563,14 @@ enum iwl_sf_scenario {
/**
* Smart Fifo configuration command.
* @state: smart fifo state, types listed in iwl_sf_sate.
* @state: smart fifo state, types listed in
enum %
iwl_sf_sate.
* @watermark: Minimum allowed availabe free space in RXF for transient state.
* @long_delay_timeouts: aging and idle timer values for each scenario
* in long delay state.
* @full_on_timeouts: timer values for each scenario in full on state.
*/
struct
iwl_sf_cfg_cmd
{
enum
iwl_sf_state
state
;
__le32
state
;
__le32
watermark
[
SF_TRANSIENT_STATES_NUMBER
];
__le32
long_delay_timeouts
[
SF_NUM_SCENARIO
][
SF_NUM_TIMEOUT_TYPES
];
__le32
full_on_timeouts
[
SF_NUM_SCENARIO
][
SF_NUM_TIMEOUT_TYPES
];
...
...
drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
View file @
3b924ea1
...
...
@@ -721,11 +721,6 @@ static int iwl_mvm_mac_ctxt_cmd_sta(struct iwl_mvm *mvm,
!
force_assoc_off
)
{
u32
dtim_offs
;
/* Allow beacons to pass through as long as we are not
* associated, or we do not have dtim period information.
*/
cmd
.
filter_flags
|=
cpu_to_le32
(
MAC_FILTER_IN_BEACON
);
/*
* The DTIM count counts down, so when it is N that means N
* more beacon intervals happen until the DTIM TBTT. Therefore
...
...
@@ -759,6 +754,11 @@ static int iwl_mvm_mac_ctxt_cmd_sta(struct iwl_mvm *mvm,
ctxt_sta
->
is_assoc
=
cpu_to_le32
(
1
);
}
else
{
ctxt_sta
->
is_assoc
=
cpu_to_le32
(
0
);
/* Allow beacons to pass through as long as we are not
* associated, or we do not have dtim period information.
*/
cmd
.
filter_flags
|=
cpu_to_le32
(
MAC_FILTER_IN_BEACON
);
}
ctxt_sta
->
bi
=
cpu_to_le32
(
vif
->
bss_conf
.
beacon_int
);
...
...
drivers/net/wireless/iwlwifi/mvm/mac80211.c
View file @
3b924ea1
...
...
@@ -396,12 +396,14 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
else
hw
->
wiphy
->
flags
&=
~
WIPHY_FLAG_PS_ON_BY_DEFAULT
;
/* TODO: enable that only for firmwares that don't crash */
/* hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; */
hw
->
wiphy
->
max_sched_scan_ssids
=
PROBE_OPTION_MAX
;
hw
->
wiphy
->
max_match_sets
=
IWL_SCAN_MAX_PROFILES
;
/* we create the 802.11 header and zero length SSID IE. */
hw
->
wiphy
->
max_sched_scan_ie_len
=
SCAN_OFFLOAD_PROBE_REQ_SIZE
-
24
-
2
;
if
(
IWL_UCODE_API
(
mvm
->
fw
->
ucode_ver
)
>=
10
)
{
hw
->
wiphy
->
flags
|=
WIPHY_FLAG_SUPPORTS_SCHED_SCAN
;
hw
->
wiphy
->
max_sched_scan_ssids
=
PROBE_OPTION_MAX
;
hw
->
wiphy
->
max_match_sets
=
IWL_SCAN_MAX_PROFILES
;
/* we create the 802.11 header and zero length SSID IE. */
hw
->
wiphy
->
max_sched_scan_ie_len
=
SCAN_OFFLOAD_PROBE_REQ_SIZE
-
24
-
2
;
}
hw
->
wiphy
->
features
|=
NL80211_FEATURE_P2P_GO_CTWIN
|
NL80211_FEATURE_LOW_PRIORITY_SCAN
|
...
...
@@ -1524,11 +1526,6 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
*/
iwl_mvm_remove_time_event
(
mvm
,
mvmvif
,
&
mvmvif
->
time_event_data
);
}
else
if
(
changes
&
(
BSS_CHANGED_PS
|
BSS_CHANGED_P2P_PS
|
BSS_CHANGED_QOS
))
{
ret
=
iwl_mvm_power_update_mac
(
mvm
);
if
(
ret
)
IWL_ERR
(
mvm
,
"failed to update power mode
\n
"
);
}
if
(
changes
&
BSS_CHANGED_BEACON_INFO
)
{
...
...
@@ -1536,6 +1533,12 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
WARN_ON
(
iwl_mvm_enable_beacon_filter
(
mvm
,
vif
,
0
));
}
if
(
changes
&
(
BSS_CHANGED_PS
|
BSS_CHANGED_P2P_PS
|
BSS_CHANGED_QOS
))
{
ret
=
iwl_mvm_power_update_mac
(
mvm
);
if
(
ret
)
IWL_ERR
(
mvm
,
"failed to update power mode
\n
"
);
}
if
(
changes
&
BSS_CHANGED_TXPOWER
)
{
IWL_DEBUG_CALIB
(
mvm
,
"Changing TX Power to %d
\n
"
,
bss_conf
->
txpower
);
...
...
drivers/net/wireless/iwlwifi/mvm/power.c
View file @
3b924ea1
...
...
@@ -281,7 +281,6 @@ static void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm,
struct
ieee80211_vif
*
vif
,
struct
iwl_mac_power_cmd
*
cmd
)
{
struct
ieee80211_hw
*
hw
=
mvm
->
hw
;
struct
ieee80211_chanctx_conf
*
chanctx_conf
;
struct
ieee80211_channel
*
chan
;
int
dtimper
,
dtimper_msec
;
...
...
@@ -292,7 +291,7 @@ static void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm,
cmd
->
id_and_color
=
cpu_to_le32
(
FW_CMD_ID_AND_COLOR
(
mvmvif
->
id
,
mvmvif
->
color
));
dtimper
=
hw
->
conf
.
ps_dtim_period
?:
1
;
dtimper
=
vif
->
bss_conf
.
dtim_period
;
/*
* Regardless of power management state the driver must set
...
...
@@ -885,7 +884,7 @@ int iwl_mvm_update_d0i3_power_mode(struct iwl_mvm *mvm,
iwl_mvm_power_build_cmd
(
mvm
,
vif
,
&
cmd
);
if
(
enable
)
{
/* configure skip over dtim up to 300 msec */
int
dtimper
=
mvm
->
hw
->
conf
.
ps_
dtim_period
?:
1
;
int
dtimper
=
vif
->
bss_conf
.
dtim_period
?:
1
;
int
dtimper_msec
=
dtimper
*
vif
->
bss_conf
.
beacon_int
;
if
(
WARN_ON
(
!
dtimper_msec
))
...
...
drivers/net/wireless/iwlwifi/mvm/rx.c
View file @
3b924ea1
...
...
@@ -149,13 +149,13 @@ static void iwl_mvm_get_signal_strength(struct iwl_mvm *mvm,
le32_to_cpu
(
phy_info
->
non_cfg_phy
[
IWL_RX_INFO_ENERGY_ANT_ABC_IDX
]);
energy_a
=
(
val
&
IWL_RX_INFO_ENERGY_ANT_A_MSK
)
>>
IWL_RX_INFO_ENERGY_ANT_A_POS
;
energy_a
=
energy_a
?
-
energy_a
:
-
256
;
energy_a
=
energy_a
?
-
energy_a
:
S8_MIN
;
energy_b
=
(
val
&
IWL_RX_INFO_ENERGY_ANT_B_MSK
)
>>
IWL_RX_INFO_ENERGY_ANT_B_POS
;
energy_b
=
energy_b
?
-
energy_b
:
-
256
;
energy_b
=
energy_b
?
-
energy_b
:
S8_MIN
;
energy_c
=
(
val
&
IWL_RX_INFO_ENERGY_ANT_C_MSK
)
>>
IWL_RX_INFO_ENERGY_ANT_C_POS
;
energy_c
=
energy_c
?
-
energy_c
:
-
256
;
energy_c
=
energy_c
?
-
energy_c
:
S8_MIN
;
max_energy
=
max
(
energy_a
,
energy_b
);
max_energy
=
max
(
max_energy
,
energy_c
);
...
...
drivers/net/wireless/iwlwifi/mvm/sf.c
View file @
3b924ea1
...
...
@@ -172,7 +172,7 @@ static int iwl_mvm_sf_config(struct iwl_mvm *mvm, u8 sta_id,
enum
iwl_sf_state
new_state
)
{
struct
iwl_sf_cfg_cmd
sf_cmd
=
{
.
state
=
new_state
,
.
state
=
cpu_to_le32
(
new_state
)
,
};
struct
ieee80211_sta
*
sta
;
int
ret
=
0
;
...
...
drivers/net/wireless/iwlwifi/mvm/tx.c
View file @
3b924ea1
...
...
@@ -168,10 +168,14 @@ static void iwl_mvm_set_tx_cmd_rate(struct iwl_mvm *mvm,
/*
* for data packets, rate info comes from the table inside the fw. This
* table is controlled by LINK_QUALITY commands
* table is controlled by LINK_QUALITY commands. Exclude ctrl port
* frames like EAPOLs which should be treated as mgmt frames. This
* avoids them being sent initially in high rates which increases the
* chances for completion of the 4-Way handshake.
*/
if
(
ieee80211_is_data
(
fc
)
&&
sta
)
{
if
(
ieee80211_is_data
(
fc
)
&&
sta
&&
!
(
info
->
control
.
flags
&
IEEE80211_TX_CTRL_PORT_CTRL_PROTO
))
{
tx_cmd
->
initial_rate_index
=
0
;
tx_cmd
->
tx_flags
|=
cpu_to_le32
(
TX_CMD_FLG_STA_RATE
);
return
;
...
...
drivers/net/wireless/iwlwifi/pcie/drv.c
View file @
3b924ea1
...
...
@@ -352,11 +352,17 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8060
,
iwl3160_2n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8062
,
iwl3160_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B4
,
0x8270
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B4
,
0x8370
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B4
,
0x8272
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8470
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x8570
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x1070
,
iwl3160_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x08B3
,
0x1170
,
iwl3160_2ac_cfg
)},
/* 3165 Series */
{
IWL_PCI_DEVICE
(
0x3165
,
0x4010
,
iwl3165_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x3165
,
0x4210
,
iwl3165_2ac_cfg
)},
/* 7265 Series */
{
IWL_PCI_DEVICE
(
0x095A
,
0x5010
,
iwl7265_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x095A
,
0x5110
,
iwl7265_2ac_cfg
)},
...
...
@@ -378,6 +384,7 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
{
IWL_PCI_DEVICE
(
0x095B
,
0x5202
,
iwl7265_n_cfg
)},
{
IWL_PCI_DEVICE
(
0x095A
,
0x9010
,
iwl7265_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x095A
,
0x9012
,
iwl7265_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x095A
,
0x900A
,
iwl7265_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x095A
,
0x9110
,
iwl7265_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x095A
,
0x9112
,
iwl7265_2ac_cfg
)},
{
IWL_PCI_DEVICE
(
0x095A
,
0x9210
,
iwl7265_2ac_cfg
)},
...
...
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