Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
ecbbec2e
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
ecbbec2e
编写于
12年前
作者:
J
John W. Linville
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-john' of
git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next
上级
36b07d15
25a17265
变更
28
隐藏空白更改
内联
并排
Showing
28 changed file
with
358 addition
and
263 deletion
+358
-263
drivers/net/wireless/iwlwifi/dvm/calib.c
drivers/net/wireless/iwlwifi/dvm/calib.c
+7
-7
drivers/net/wireless/iwlwifi/dvm/debugfs.c
drivers/net/wireless/iwlwifi/dvm/debugfs.c
+6
-6
drivers/net/wireless/iwlwifi/dvm/dev.h
drivers/net/wireless/iwlwifi/dvm/dev.h
+1
-1
drivers/net/wireless/iwlwifi/dvm/devices.c
drivers/net/wireless/iwlwifi/dvm/devices.c
+4
-4
drivers/net/wireless/iwlwifi/dvm/lib.c
drivers/net/wireless/iwlwifi/dvm/lib.c
+4
-4
drivers/net/wireless/iwlwifi/dvm/mac80211.c
drivers/net/wireless/iwlwifi/dvm/mac80211.c
+6
-6
drivers/net/wireless/iwlwifi/dvm/main.c
drivers/net/wireless/iwlwifi/dvm/main.c
+32
-25
drivers/net/wireless/iwlwifi/dvm/rs.c
drivers/net/wireless/iwlwifi/dvm/rs.c
+22
-22
drivers/net/wireless/iwlwifi/dvm/rxon.c
drivers/net/wireless/iwlwifi/dvm/rxon.c
+2
-2
drivers/net/wireless/iwlwifi/dvm/scan.c
drivers/net/wireless/iwlwifi/dvm/scan.c
+7
-6
drivers/net/wireless/iwlwifi/dvm/sta.c
drivers/net/wireless/iwlwifi/dvm/sta.c
+6
-6
drivers/net/wireless/iwlwifi/dvm/tx.c
drivers/net/wireless/iwlwifi/dvm/tx.c
+27
-40
drivers/net/wireless/iwlwifi/dvm/ucode.c
drivers/net/wireless/iwlwifi/dvm/ucode.c
+6
-6
drivers/net/wireless/iwlwifi/iwl-config.h
drivers/net/wireless/iwlwifi/iwl-config.h
+4
-4
drivers/net/wireless/iwlwifi/iwl-devtrace.h
drivers/net/wireless/iwlwifi/iwl-devtrace.h
+34
-0
drivers/net/wireless/iwlwifi/iwl-drv.c
drivers/net/wireless/iwlwifi/iwl-drv.c
+3
-3
drivers/net/wireless/iwlwifi/iwl-eeprom-parse.c
drivers/net/wireless/iwlwifi/iwl-eeprom-parse.c
+56
-28
drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h
drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h
+19
-26
drivers/net/wireless/iwlwifi/iwl-io.c
drivers/net/wireless/iwlwifi/iwl-io.c
+20
-20
drivers/net/wireless/iwlwifi/iwl-io.h
drivers/net/wireless/iwlwifi/iwl-io.h
+5
-5
drivers/net/wireless/iwlwifi/iwl-trans.h
drivers/net/wireless/iwlwifi/iwl-trans.h
+18
-4
drivers/net/wireless/iwlwifi/pcie/1000.c
drivers/net/wireless/iwlwifi/pcie/1000.c
+4
-4
drivers/net/wireless/iwlwifi/pcie/2000.c
drivers/net/wireless/iwlwifi/pcie/2000.c
+8
-8
drivers/net/wireless/iwlwifi/pcie/5000.c
drivers/net/wireless/iwlwifi/pcie/5000.c
+6
-6
drivers/net/wireless/iwlwifi/pcie/6000.c
drivers/net/wireless/iwlwifi/pcie/6000.c
+14
-14
drivers/net/wireless/iwlwifi/pcie/drv.c
drivers/net/wireless/iwlwifi/pcie/drv.c
+8
-3
drivers/net/wireless/iwlwifi/pcie/rx.c
drivers/net/wireless/iwlwifi/pcie/rx.c
+11
-3
drivers/net/wireless/iwlwifi/pcie/trans.c
drivers/net/wireless/iwlwifi/pcie/trans.c
+18
-0
未找到文件。
drivers/net/wireless/iwlwifi/dvm/calib.c
浏览文件 @
ecbbec2e
...
...
@@ -833,14 +833,14 @@ static void iwl_find_disconn_antenna(struct iwl_priv *priv, u32* average_sig,
* To be safe, simply mask out any chains that we know
* are not on the device.
*/
active_chains
&=
priv
->
eepro
m_data
->
valid_rx_ant
;
active_chains
&=
priv
->
nv
m_data
->
valid_rx_ant
;
num_tx_chains
=
0
;
for
(
i
=
0
;
i
<
NUM_RX_CHAINS
;
i
++
)
{
/* loops on all the bits of
* priv->hw_setting.valid_tx_ant */
u8
ant_msk
=
(
1
<<
i
);
if
(
!
(
priv
->
eepro
m_data
->
valid_tx_ant
&
ant_msk
))
if
(
!
(
priv
->
nv
m_data
->
valid_tx_ant
&
ant_msk
))
continue
;
num_tx_chains
++
;
...
...
@@ -854,7 +854,7 @@ static void iwl_find_disconn_antenna(struct iwl_priv *priv, u32* average_sig,
* connect the first valid tx chain
*/
first_chain
=
find_first_chain
(
priv
->
eepro
m_data
->
valid_tx_ant
);
find_first_chain
(
priv
->
nv
m_data
->
valid_tx_ant
);
data
->
disconn_array
[
first_chain
]
=
0
;
active_chains
|=
BIT
(
first_chain
);
IWL_DEBUG_CALIB
(
priv
,
...
...
@@ -864,13 +864,13 @@ static void iwl_find_disconn_antenna(struct iwl_priv *priv, u32* average_sig,
}
}
if
(
active_chains
!=
priv
->
eepro
m_data
->
valid_rx_ant
&&
if
(
active_chains
!=
priv
->
nv
m_data
->
valid_rx_ant
&&
active_chains
!=
priv
->
chain_noise_data
.
active_chains
)
IWL_DEBUG_CALIB
(
priv
,
"Detected that not all antennas are connected! "
"Connected: %#x, valid: %#x.
\n
"
,
active_chains
,
priv
->
eepro
m_data
->
valid_rx_ant
);
priv
->
nv
m_data
->
valid_rx_ant
);
/* Save for use within RXON, TX, SCAN commands, etc. */
data
->
active_chains
=
active_chains
;
...
...
@@ -1055,7 +1055,7 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv)
priv
->
cfg
->
bt_params
->
advanced_bt_coexist
)
{
/* Disable disconnected antenna algorithm for advanced
bt coex, assuming valid antennas are connected */
data
->
active_chains
=
priv
->
eepro
m_data
->
valid_rx_ant
;
data
->
active_chains
=
priv
->
nv
m_data
->
valid_rx_ant
;
for
(
i
=
0
;
i
<
NUM_RX_CHAINS
;
i
++
)
if
(
!
(
data
->
active_chains
&
(
1
<<
i
)))
data
->
disconn_array
[
i
]
=
1
;
...
...
@@ -1086,7 +1086,7 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv)
iwlagn_gain_computation
(
priv
,
average_noise
,
find_first_chain
(
priv
->
eepro
m_data
->
valid_rx_ant
));
find_first_chain
(
priv
->
nv
m_data
->
valid_rx_ant
));
/* Some power changes may have been made during the calibration.
* Update and commit the RXON
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/dvm/debugfs.c
浏览文件 @
ecbbec2e
...
...
@@ -305,7 +305,7 @@ static ssize_t iwl_dbgfs_nvm_read(struct file *file,
int
pos
=
0
,
ofs
=
0
,
buf_size
=
0
;
const
u8
*
ptr
;
char
*
buf
;
u16
eepro
m_ver
;
u16
nv
m_ver
;
size_t
eeprom_len
=
priv
->
eeprom_blob_size
;
buf_size
=
4
*
eeprom_len
+
256
;
...
...
@@ -321,9 +321,9 @@ static ssize_t iwl_dbgfs_nvm_read(struct file *file,
if
(
!
buf
)
return
-
ENOMEM
;
eeprom_ver
=
priv
->
eeprom_data
->
eepro
m_version
;
nvm_ver
=
priv
->
nvm_data
->
nv
m_version
;
pos
+=
scnprintf
(
buf
+
pos
,
buf_size
-
pos
,
"NVM version: 0x%x
\n
"
,
eepro
m_ver
);
"NVM version: 0x%x
\n
"
,
nv
m_ver
);
for
(
ofs
=
0
;
ofs
<
eeprom_len
;
ofs
+=
16
)
{
pos
+=
scnprintf
(
buf
+
pos
,
buf_size
-
pos
,
"0x%.4x "
,
ofs
);
hex_dump_to_buffer
(
ptr
+
ofs
,
16
,
16
,
2
,
buf
+
pos
,
...
...
@@ -1333,17 +1333,17 @@ static ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file,
if
(
tx
->
tx_power
.
ant_a
||
tx
->
tx_power
.
ant_b
||
tx
->
tx_power
.
ant_c
)
{
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
"tx power: (1/2 dB step)
\n
"
);
if
((
priv
->
eepro
m_data
->
valid_tx_ant
&
ANT_A
)
&&
if
((
priv
->
nv
m_data
->
valid_tx_ant
&
ANT_A
)
&&
tx
->
tx_power
.
ant_a
)
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
fmt_hex
,
"antenna A:"
,
tx
->
tx_power
.
ant_a
);
if
((
priv
->
eepro
m_data
->
valid_tx_ant
&
ANT_B
)
&&
if
((
priv
->
nv
m_data
->
valid_tx_ant
&
ANT_B
)
&&
tx
->
tx_power
.
ant_b
)
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
fmt_hex
,
"antenna B:"
,
tx
->
tx_power
.
ant_b
);
if
((
priv
->
eepro
m_data
->
valid_tx_ant
&
ANT_C
)
&&
if
((
priv
->
nv
m_data
->
valid_tx_ant
&
ANT_C
)
&&
tx
->
tx_power
.
ant_c
)
pos
+=
scnprintf
(
buf
+
pos
,
bufsz
-
pos
,
fmt_hex
,
"antenna C:"
,
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/dvm/dev.h
浏览文件 @
ecbbec2e
...
...
@@ -843,7 +843,7 @@ struct iwl_priv {
void
*
wowlan_sram
;
#endif
/* CONFIG_IWLWIFI_DEBUGFS */
struct
iwl_
eeprom_data
*
eepro
m_data
;
struct
iwl_
nvm_data
*
nv
m_data
;
/* eeprom blob for debugfs/testmode */
u8
*
eeprom_blob
;
size_t
eeprom_blob_size
;
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/dvm/devices.c
浏览文件 @
ecbbec2e
...
...
@@ -305,8 +305,8 @@ static s32 iwl_temp_calib_to_offset(struct iwl_priv *priv)
{
u16
temperature
,
voltage
;
temperature
=
le16_to_cpu
(
priv
->
eepro
m_data
->
kelvin_temperature
);
voltage
=
le16_to_cpu
(
priv
->
eepro
m_data
->
kelvin_voltage
);
temperature
=
le16_to_cpu
(
priv
->
nv
m_data
->
kelvin_temperature
);
voltage
=
le16_to_cpu
(
priv
->
nv
m_data
->
kelvin_voltage
);
/* offset = temp - volt / coeff */
return
(
s32
)(
temperature
-
...
...
@@ -460,13 +460,13 @@ static void iwl6000_nic_config(struct iwl_priv *priv)
break
;
case
IWL_DEVICE_FAMILY_6050
:
/* Indicate calibration version to uCode. */
if
(
priv
->
eepro
m_data
->
calib_version
>=
6
)
if
(
priv
->
nv
m_data
->
calib_version
>=
6
)
iwl_set_bit
(
priv
->
trans
,
CSR_GP_DRIVER_REG
,
CSR_GP_DRIVER_REG_BIT_CALIB_VERSION6
);
break
;
case
IWL_DEVICE_FAMILY_6150
:
/* Indicate calibration version to uCode. */
if
(
priv
->
eepro
m_data
->
calib_version
>=
6
)
if
(
priv
->
nv
m_data
->
calib_version
>=
6
)
iwl_set_bit
(
priv
->
trans
,
CSR_GP_DRIVER_REG
,
CSR_GP_DRIVER_REG_BIT_CALIB_VERSION6
);
iwl_set_bit
(
priv
->
trans
,
CSR_GP_DRIVER_REG
,
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/dvm/lib.c
浏览文件 @
ecbbec2e
...
...
@@ -59,7 +59,7 @@ int iwlagn_send_tx_power(struct iwl_priv *priv)
/* half dBm need to multiply */
tx_power_cmd
.
global_lmt
=
(
s8
)(
2
*
priv
->
tx_power_user_lmt
);
if
(
tx_power_cmd
.
global_lmt
>
priv
->
eepro
m_data
->
max_tx_pwr_half_dbm
)
{
if
(
tx_power_cmd
.
global_lmt
>
priv
->
nv
m_data
->
max_tx_pwr_half_dbm
)
{
/*
* For the newer devices which using enhanced/extend tx power
* table in EEPROM, the format is in half dBm. driver need to
...
...
@@ -72,7 +72,7 @@ int iwlagn_send_tx_power(struct iwl_priv *priv)
* half-dBm format), lower the tx power based on EEPROM
*/
tx_power_cmd
.
global_lmt
=
priv
->
eepro
m_data
->
max_tx_pwr_half_dbm
;
priv
->
nv
m_data
->
max_tx_pwr_half_dbm
;
}
tx_power_cmd
.
flags
=
IWLAGN_TX_POWER_NO_CLOSED
;
tx_power_cmd
.
srv_chan_lmt
=
IWLAGN_TX_POWER_AUTO
;
...
...
@@ -159,7 +159,7 @@ int iwlagn_txfifo_flush(struct iwl_priv *priv)
IWL_PAN_SCD_MGMT_MSK
|
IWL_PAN_SCD_MULTICAST_MSK
;
if
(
priv
->
eeprom_data
->
sku
&
EEPROM_SKU_CAP_11N_ENABLE
)
if
(
priv
->
nvm_data
->
sku_cap_11n_enable
)
flush_cmd
.
queue_control
|=
IWL_AGG_TX_QUEUE_MSK
;
IWL_DEBUG_INFO
(
priv
,
"queue control: 0x%x
\n
"
,
...
...
@@ -825,7 +825,7 @@ void iwlagn_set_rxon_chain(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
if
(
priv
->
chain_noise_data
.
active_chains
)
active_chains
=
priv
->
chain_noise_data
.
active_chains
;
else
active_chains
=
priv
->
eepro
m_data
->
valid_rx_ant
;
active_chains
=
priv
->
nv
m_data
->
valid_rx_ant
;
if
(
priv
->
cfg
->
bt_params
&&
priv
->
cfg
->
bt_params
->
advanced_bt_coexist
&&
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/dvm/mac80211.c
浏览文件 @
ecbbec2e
...
...
@@ -164,7 +164,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
hw->max_tx_aggregation_subframes = LINK_QUAL_AGG_FRAME_LIMIT_DEF;
*/
if
(
priv
->
eeprom_data
->
sku
&
EEPROM_SKU_CAP_11N_ENABLE
)
if
(
priv
->
nvm_data
->
sku_cap_11n_enable
)
hw
->
flags
|=
IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS
|
IEEE80211_HW_SUPPORTS_STATIC_SMPS
;
...
...
@@ -242,12 +242,12 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
hw
->
max_listen_interval
=
IWL_CONN_MAX_LISTEN_INTERVAL
;
if
(
priv
->
eepro
m_data
->
bands
[
IEEE80211_BAND_2GHZ
].
n_channels
)
if
(
priv
->
nv
m_data
->
bands
[
IEEE80211_BAND_2GHZ
].
n_channels
)
priv
->
hw
->
wiphy
->
bands
[
IEEE80211_BAND_2GHZ
]
=
&
priv
->
eepro
m_data
->
bands
[
IEEE80211_BAND_2GHZ
];
if
(
priv
->
eepro
m_data
->
bands
[
IEEE80211_BAND_5GHZ
].
n_channels
)
&
priv
->
nv
m_data
->
bands
[
IEEE80211_BAND_2GHZ
];
if
(
priv
->
nv
m_data
->
bands
[
IEEE80211_BAND_5GHZ
].
n_channels
)
priv
->
hw
->
wiphy
->
bands
[
IEEE80211_BAND_5GHZ
]
=
&
priv
->
eepro
m_data
->
bands
[
IEEE80211_BAND_5GHZ
];
&
priv
->
nv
m_data
->
bands
[
IEEE80211_BAND_5GHZ
];
hw
->
wiphy
->
hw_version
=
priv
->
trans
->
hw_id
;
...
...
@@ -654,7 +654,7 @@ static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
IWL_DEBUG_HT
(
priv
,
"A-MPDU action on addr %pM tid %d
\n
"
,
sta
->
addr
,
tid
);
if
(
!
(
priv
->
eeprom_data
->
sku
&
EEPROM_SKU_CAP_11N_ENABLE
))
if
(
!
(
priv
->
nvm_data
->
sku_cap_11n_enable
))
return
-
EACCES
;
IWL_DEBUG_MAC80211
(
priv
,
"enter
\n
"
);
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/dvm/main.c
浏览文件 @
ecbbec2e
...
...
@@ -185,7 +185,7 @@ int iwlagn_send_beacon_cmd(struct iwl_priv *priv)
rate
=
info
->
control
.
rates
[
0
].
idx
;
priv
->
mgmt_tx_ant
=
iwl_toggle_tx_ant
(
priv
,
priv
->
mgmt_tx_ant
,
priv
->
eepro
m_data
->
valid_tx_ant
);
priv
->
nv
m_data
->
valid_tx_ant
);
rate_flags
=
iwl_ant_idx_to_flags
(
priv
->
mgmt_tx_ant
);
/* In mac80211, rates for 5 GHz start at 0 */
...
...
@@ -776,7 +776,7 @@ int iwl_alive_start(struct iwl_priv *priv)
ieee80211_wake_queues
(
priv
->
hw
);
/* Configure Tx antenna selection based on H/W config */
iwlagn_send_tx_ant_config
(
priv
,
priv
->
eepro
m_data
->
valid_tx_ant
);
iwlagn_send_tx_ant_config
(
priv
,
priv
->
nv
m_data
->
valid_tx_ant
);
if
(
iwl_is_associated_ctx
(
ctx
)
&&
!
priv
->
wowlan
)
{
struct
iwl_rxon_cmd
*
active_rxon
=
...
...
@@ -1191,30 +1191,38 @@ static void iwl_option_config(struct iwl_priv *priv)
static
int
iwl_eeprom_init_hw_params
(
struct
iwl_priv
*
priv
)
{
if
(
priv
->
eeprom_data
->
sku
&
EEPROM_SKU_CAP_11N_ENABLE
&&
struct
iwl_nvm_data
*
data
=
priv
->
nvm_data
;
char
*
debug_msg
;
if
(
data
->
sku_cap_11n_enable
&&
!
priv
->
cfg
->
ht_params
)
{
IWL_ERR
(
priv
,
"Invalid 11n configuration
\n
"
);
return
-
EINVAL
;
}
if
(
!
priv
->
eeprom_data
->
sku
)
{
if
(
!
data
->
sku_cap_11n_enable
&&
!
data
->
sku_cap_band_24GHz_enable
&&
!
data
->
sku_cap_band_52GHz_enable
)
{
IWL_ERR
(
priv
,
"Invalid device sku
\n
"
);
return
-
EINVAL
;
}
IWL_DEBUG_INFO
(
priv
,
"Device SKU: 0x%X
\n
"
,
priv
->
eeprom_data
->
sku
);
debug_msg
=
"Device SKU: 24GHz %s %s, 52GHz %s %s, 11.n %s %s
\n
"
;
IWL_DEBUG_INFO
(
priv
,
debug_msg
,
data
->
sku_cap_band_24GHz_enable
?
""
:
"NOT"
,
"enabled"
,
data
->
sku_cap_band_52GHz_enable
?
""
:
"NOT"
,
"enabled"
,
data
->
sku_cap_11n_enable
?
""
:
"NOT"
,
"enabled"
);
priv
->
hw_params
.
tx_chains_num
=
num_of_ant
(
priv
->
eeprom_
data
->
valid_tx_ant
);
num_of_ant
(
data
->
valid_tx_ant
);
if
(
priv
->
cfg
->
rx_with_siso_diversity
)
priv
->
hw_params
.
rx_chains_num
=
1
;
else
priv
->
hw_params
.
rx_chains_num
=
num_of_ant
(
priv
->
eeprom_
data
->
valid_rx_ant
);
num_of_ant
(
data
->
valid_rx_ant
);
IWL_DEBUG_INFO
(
priv
,
"Valid Tx ant: 0x%X, Valid Rx ant: 0x%X
\n
"
,
priv
->
eeprom_
data
->
valid_tx_ant
,
priv
->
eeprom_
data
->
valid_rx_ant
);
data
->
valid_tx_ant
,
data
->
valid_rx_ant
);
return
0
;
}
...
...
@@ -1374,24 +1382,24 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
/* Reset chip to save power until we load uCode during "up". */
iwl_trans_stop_hw
(
priv
->
trans
,
false
);
priv
->
eepro
m_data
=
iwl_parse_eeprom_data
(
priv
->
trans
->
dev
,
priv
->
cfg
,
priv
->
nv
m_data
=
iwl_parse_eeprom_data
(
priv
->
trans
->
dev
,
priv
->
cfg
,
priv
->
eeprom_blob
,
priv
->
eeprom_blob_size
);
if
(
!
priv
->
eepro
m_data
)
if
(
!
priv
->
nv
m_data
)
goto
out_free_eeprom_blob
;
if
(
iwl_
eeprom_check_version
(
priv
->
eepro
m_data
,
priv
->
trans
))
if
(
iwl_
nvm_check_version
(
priv
->
nv
m_data
,
priv
->
trans
))
goto
out_free_eeprom
;
if
(
iwl_eeprom_init_hw_params
(
priv
))
goto
out_free_eeprom
;
/* extract MAC Address */
memcpy
(
priv
->
addresses
[
0
].
addr
,
priv
->
eepro
m_data
->
hw_addr
,
ETH_ALEN
);
memcpy
(
priv
->
addresses
[
0
].
addr
,
priv
->
nv
m_data
->
hw_addr
,
ETH_ALEN
);
IWL_DEBUG_INFO
(
priv
,
"MAC address: %pM
\n
"
,
priv
->
addresses
[
0
].
addr
);
priv
->
hw
->
wiphy
->
addresses
=
priv
->
addresses
;
priv
->
hw
->
wiphy
->
n_addresses
=
1
;
num_mac
=
priv
->
eepro
m_data
->
n_hw_addrs
;
num_mac
=
priv
->
nv
m_data
->
n_hw_addrs
;
if
(
num_mac
>
1
)
{
memcpy
(
priv
->
addresses
[
1
].
addr
,
priv
->
addresses
[
0
].
addr
,
ETH_ALEN
);
...
...
@@ -1404,7 +1412,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
************************/
iwl_set_hw_params
(
priv
);
if
(
!
(
priv
->
eeprom_data
->
sku
&
EEPROM_SKU_CAP_IPAN_ENABLE
))
{
if
(
!
(
priv
->
nvm_data
->
sku_cap_ipan_enable
))
{
IWL_DEBUG_INFO
(
priv
,
"Your EEPROM disabled PAN"
);
ucode_flags
&=
~
IWL_UCODE_TLV_FLAGS_PAN
;
/*
...
...
@@ -1486,7 +1494,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
out_free_eeprom_blob:
kfree
(
priv
->
eeprom_blob
);
out_free_eeprom:
iwl_free_
eeprom_data
(
priv
->
eepro
m_data
);
iwl_free_
nvm_data
(
priv
->
nv
m_data
);
out_free_hw:
ieee80211_free_hw
(
priv
->
hw
);
out:
...
...
@@ -1506,7 +1514,7 @@ static void iwl_op_mode_dvm_stop(struct iwl_op_mode *op_mode)
iwl_tt_exit
(
priv
);
kfree
(
priv
->
eeprom_blob
);
iwl_free_
eeprom_data
(
priv
->
eepro
m_data
);
iwl_free_
nvm_data
(
priv
->
nv
m_data
);
/*netif_stop_queue(dev); */
flush_workqueue
(
priv
->
workqueue
);
...
...
@@ -1980,7 +1988,6 @@ static void iwl_cmd_queue_full(struct iwl_op_mode *op_mode)
static
void
iwl_nic_config
(
struct
iwl_op_mode
*
op_mode
)
{
struct
iwl_priv
*
priv
=
IWL_OP_MODE_GET_DVM
(
op_mode
);
u16
radio_cfg
=
priv
->
eeprom_data
->
radio_cfg
;
/* SKU Control */
iwl_set_bits_mask
(
priv
->
trans
,
CSR_HW_IF_CONFIG_REG
,
...
...
@@ -1992,13 +1999,13 @@ static void iwl_nic_config(struct iwl_op_mode *op_mode)
CSR_HW_IF_CONFIG_REG_POS_MAC_DASH
));
/* write radio config values to register */
if
(
EEPROM_RF_CFG_TYPE_MSK
(
radio_cfg
)
<=
EEPROM_RF_CONFIG_TYPE_MAX
)
{
if
(
priv
->
nvm_data
->
radio_cfg_type
<=
EEPROM_RF_CONFIG_TYPE_MAX
)
{
u32
reg_val
=
EEPROM_RF_CFG_TYPE_MSK
(
radio_cfg
)
<<
priv
->
nvm_data
->
radio_cfg_type
<<
CSR_HW_IF_CONFIG_REG_POS_PHY_TYPE
|
EEPROM_RF_CFG_STEP_MSK
(
radio_cfg
)
<<
priv
->
nvm_data
->
radio_cfg_step
<<
CSR_HW_IF_CONFIG_REG_POS_PHY_STEP
|
EEPROM_RF_CFG_DASH_MSK
(
radio_cfg
)
<<
priv
->
nvm_data
->
radio_cfg_dash
<<
CSR_HW_IF_CONFIG_REG_POS_PHY_DASH
;
iwl_set_bits_mask
(
priv
->
trans
,
CSR_HW_IF_CONFIG_REG
,
...
...
@@ -2007,9 +2014,9 @@ static void iwl_nic_config(struct iwl_op_mode *op_mode)
CSR_HW_IF_CONFIG_REG_MSK_PHY_DASH
,
reg_val
);
IWL_INFO
(
priv
,
"Radio type=0x%x-0x%x-0x%x
\n
"
,
EEPROM_RF_CFG_TYPE_MSK
(
radio_cfg
)
,
EEPROM_RF_CFG_STEP_MSK
(
radio_cfg
)
,
EEPROM_RF_CFG_DASH_MSK
(
radio_cfg
)
);
priv
->
nvm_data
->
radio_cfg_type
,
priv
->
nvm_data
->
radio_cfg_step
,
priv
->
nvm_data
->
radio_cfg_dash
);
}
else
{
WARN_ON
(
1
);
}
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/dvm/rs.c
浏览文件 @
ecbbec2e
...
...
@@ -820,7 +820,7 @@ static u32 rs_get_lower_rate(struct iwl_lq_sta *lq_sta,
if
(
num_of_ant
(
tbl
->
ant_type
)
>
1
)
tbl
->
ant_type
=
first_antenna
(
priv
->
eepro
m_data
->
valid_tx_ant
);
first_antenna
(
priv
->
nv
m_data
->
valid_tx_ant
);
tbl
->
is_ht40
=
0
;
tbl
->
is_SGI
=
0
;
...
...
@@ -1448,7 +1448,7 @@ static int rs_move_legacy_other(struct iwl_priv *priv,
u32
sz
=
(
sizeof
(
struct
iwl_scale_tbl_info
)
-
(
sizeof
(
struct
iwl_rate_scale_data
)
*
IWL_RATE_COUNT
));
u8
start_action
;
u8
valid_tx_ant
=
priv
->
eepro
m_data
->
valid_tx_ant
;
u8
valid_tx_ant
=
priv
->
nv
m_data
->
valid_tx_ant
;
u8
tx_chains_num
=
priv
->
hw_params
.
tx_chains_num
;
int
ret
=
0
;
u8
update_search_tbl_counter
=
0
;
...
...
@@ -1466,7 +1466,7 @@ static int rs_move_legacy_other(struct iwl_priv *priv,
case
IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS
:
/* avoid antenna B and MIMO */
valid_tx_ant
=
first_antenna
(
priv
->
eepro
m_data
->
valid_tx_ant
);
first_antenna
(
priv
->
nv
m_data
->
valid_tx_ant
);
if
(
tbl
->
action
>=
IWL_LEGACY_SWITCH_ANTENNA2
&&
tbl
->
action
!=
IWL_LEGACY_SWITCH_SISO
)
tbl
->
action
=
IWL_LEGACY_SWITCH_SISO
;
...
...
@@ -1490,7 +1490,7 @@ static int rs_move_legacy_other(struct iwl_priv *priv,
else
if
(
tbl
->
action
>=
IWL_LEGACY_SWITCH_ANTENNA2
)
tbl
->
action
=
IWL_LEGACY_SWITCH_SISO
;
valid_tx_ant
=
first_antenna
(
priv
->
eepro
m_data
->
valid_tx_ant
);
first_antenna
(
priv
->
nv
m_data
->
valid_tx_ant
);
}
start_action
=
tbl
->
action
;
...
...
@@ -1624,7 +1624,7 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
u32
sz
=
(
sizeof
(
struct
iwl_scale_tbl_info
)
-
(
sizeof
(
struct
iwl_rate_scale_data
)
*
IWL_RATE_COUNT
));
u8
start_action
;
u8
valid_tx_ant
=
priv
->
eepro
m_data
->
valid_tx_ant
;
u8
valid_tx_ant
=
priv
->
nv
m_data
->
valid_tx_ant
;
u8
tx_chains_num
=
priv
->
hw_params
.
tx_chains_num
;
u8
update_search_tbl_counter
=
0
;
int
ret
;
...
...
@@ -1642,7 +1642,7 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
case
IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS
:
/* avoid antenna B and MIMO */
valid_tx_ant
=
first_antenna
(
priv
->
eepro
m_data
->
valid_tx_ant
);
first_antenna
(
priv
->
nv
m_data
->
valid_tx_ant
);
if
(
tbl
->
action
!=
IWL_SISO_SWITCH_ANTENNA1
)
tbl
->
action
=
IWL_SISO_SWITCH_ANTENNA1
;
break
;
...
...
@@ -1660,7 +1660,7 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
/* configure as 1x1 if bt full concurrency */
if
(
priv
->
bt_full_concurrent
)
{
valid_tx_ant
=
first_antenna
(
priv
->
eepro
m_data
->
valid_tx_ant
);
first_antenna
(
priv
->
nv
m_data
->
valid_tx_ant
);
if
(
tbl
->
action
>=
IWL_LEGACY_SWITCH_ANTENNA2
)
tbl
->
action
=
IWL_SISO_SWITCH_ANTENNA1
;
}
...
...
@@ -1796,7 +1796,7 @@ static int rs_move_mimo2_to_other(struct iwl_priv *priv,
u32
sz
=
(
sizeof
(
struct
iwl_scale_tbl_info
)
-
(
sizeof
(
struct
iwl_rate_scale_data
)
*
IWL_RATE_COUNT
));
u8
start_action
;
u8
valid_tx_ant
=
priv
->
eepro
m_data
->
valid_tx_ant
;
u8
valid_tx_ant
=
priv
->
nv
m_data
->
valid_tx_ant
;
u8
tx_chains_num
=
priv
->
hw_params
.
tx_chains_num
;
u8
update_search_tbl_counter
=
0
;
int
ret
;
...
...
@@ -1966,7 +1966,7 @@ static int rs_move_mimo3_to_other(struct iwl_priv *priv,
u32
sz
=
(
sizeof
(
struct
iwl_scale_tbl_info
)
-
(
sizeof
(
struct
iwl_rate_scale_data
)
*
IWL_RATE_COUNT
));
u8
start_action
;
u8
valid_tx_ant
=
priv
->
eepro
m_data
->
valid_tx_ant
;
u8
valid_tx_ant
=
priv
->
nv
m_data
->
valid_tx_ant
;
u8
tx_chains_num
=
priv
->
hw_params
.
tx_chains_num
;
int
ret
;
u8
update_search_tbl_counter
=
0
;
...
...
@@ -2700,7 +2700,7 @@ static void rs_initialize_lq(struct iwl_priv *priv,
i
=
lq_sta
->
last_txrate_idx
;
valid_tx_ant
=
priv
->
eepro
m_data
->
valid_tx_ant
;
valid_tx_ant
=
priv
->
nv
m_data
->
valid_tx_ant
;
if
(
!
lq_sta
->
search_better_tbl
)
active_tbl
=
lq_sta
->
active_tbl
;
...
...
@@ -2894,15 +2894,15 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i
/* These values will be overridden later */
lq_sta
->
lq
.
general_params
.
single_stream_ant_msk
=
first_antenna
(
priv
->
eepro
m_data
->
valid_tx_ant
);
first_antenna
(
priv
->
nv
m_data
->
valid_tx_ant
);
lq_sta
->
lq
.
general_params
.
dual_stream_ant_msk
=
priv
->
eepro
m_data
->
valid_tx_ant
&
~
first_antenna
(
priv
->
eepro
m_data
->
valid_tx_ant
);
priv
->
nv
m_data
->
valid_tx_ant
&
~
first_antenna
(
priv
->
nv
m_data
->
valid_tx_ant
);
if
(
!
lq_sta
->
lq
.
general_params
.
dual_stream_ant_msk
)
{
lq_sta
->
lq
.
general_params
.
dual_stream_ant_msk
=
ANT_AB
;
}
else
if
(
num_of_ant
(
priv
->
eepro
m_data
->
valid_tx_ant
)
==
2
)
{
}
else
if
(
num_of_ant
(
priv
->
nv
m_data
->
valid_tx_ant
)
==
2
)
{
lq_sta
->
lq
.
general_params
.
dual_stream_ant_msk
=
priv
->
eepro
m_data
->
valid_tx_ant
;
priv
->
nv
m_data
->
valid_tx_ant
;
}
/* as default allow aggregation for all tids */
...
...
@@ -2948,7 +2948,7 @@ static void rs_fill_link_cmd(struct iwl_priv *priv,
if
(
priv
&&
priv
->
bt_full_concurrent
)
{
/* 1x1 only */
tbl_type
.
ant_type
=
first_antenna
(
priv
->
eepro
m_data
->
valid_tx_ant
);
first_antenna
(
priv
->
nv
m_data
->
valid_tx_ant
);
}
/* How many times should we repeat the initial rate? */
...
...
@@ -2980,7 +2980,7 @@ static void rs_fill_link_cmd(struct iwl_priv *priv,
if
(
priv
->
bt_full_concurrent
)
valid_tx_ant
=
ANT_A
;
else
valid_tx_ant
=
priv
->
eepro
m_data
->
valid_tx_ant
;
valid_tx_ant
=
priv
->
nv
m_data
->
valid_tx_ant
;
}
/* Fill rest of rate table */
...
...
@@ -3014,7 +3014,7 @@ static void rs_fill_link_cmd(struct iwl_priv *priv,
if
(
priv
&&
priv
->
bt_full_concurrent
)
{
/* 1x1 only */
tbl_type
.
ant_type
=
first_antenna
(
priv
->
eepro
m_data
->
valid_tx_ant
);
first_antenna
(
priv
->
nv
m_data
->
valid_tx_ant
);
}
/* Indicate to uCode which entries might be MIMO.
...
...
@@ -3101,7 +3101,7 @@ static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta,
u8
ant_sel_tx
;
priv
=
lq_sta
->
drv
;
valid_tx_ant
=
priv
->
eepro
m_data
->
valid_tx_ant
;
valid_tx_ant
=
priv
->
nv
m_data
->
valid_tx_ant
;
if
(
lq_sta
->
dbg_fixed_rate
)
{
ant_sel_tx
=
((
lq_sta
->
dbg_fixed_rate
&
RATE_MCS_ANT_ABC_MSK
)
...
...
@@ -3172,9 +3172,9 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file,
desc
+=
sprintf
(
buff
+
desc
,
"fixed rate 0x%X
\n
"
,
lq_sta
->
dbg_fixed_rate
);
desc
+=
sprintf
(
buff
+
desc
,
"valid_tx_ant %s%s%s
\n
"
,
(
priv
->
eepro
m_data
->
valid_tx_ant
&
ANT_A
)
?
"ANT_A,"
:
""
,
(
priv
->
eepro
m_data
->
valid_tx_ant
&
ANT_B
)
?
"ANT_B,"
:
""
,
(
priv
->
eepro
m_data
->
valid_tx_ant
&
ANT_C
)
?
"ANT_C"
:
""
);
(
priv
->
nv
m_data
->
valid_tx_ant
&
ANT_A
)
?
"ANT_A,"
:
""
,
(
priv
->
nv
m_data
->
valid_tx_ant
&
ANT_B
)
?
"ANT_B,"
:
""
,
(
priv
->
nv
m_data
->
valid_tx_ant
&
ANT_C
)
?
"ANT_C"
:
""
);
desc
+=
sprintf
(
buff
+
desc
,
"lq type %s
\n
"
,
(
is_legacy
(
tbl
->
lq_type
))
?
"legacy"
:
"HT"
);
if
(
is_Ht
(
tbl
->
lq_type
))
{
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/dvm/rxon.c
浏览文件 @
ecbbec2e
...
...
@@ -420,10 +420,10 @@ static int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
return
-
EINVAL
;
}
if
(
tx_power
>
DIV_ROUND_UP
(
priv
->
eepro
m_data
->
max_tx_pwr_half_dbm
,
2
))
{
if
(
tx_power
>
DIV_ROUND_UP
(
priv
->
nv
m_data
->
max_tx_pwr_half_dbm
,
2
))
{
IWL_WARN
(
priv
,
"Requested user TXPOWER %d above upper limit %d.
\n
"
,
tx_power
,
priv
->
eepro
m_data
->
max_tx_pwr_half_dbm
);
tx_power
,
priv
->
nv
m_data
->
max_tx_pwr_half_dbm
);
return
-
EINVAL
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/dvm/scan.c
浏览文件 @
ecbbec2e
...
...
@@ -660,12 +660,12 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
u16
rx_chain
=
0
;
enum
ieee80211_band
band
;
u8
n_probes
=
0
;
u8
rx_ant
=
priv
->
eepro
m_data
->
valid_rx_ant
;
u8
rx_ant
=
priv
->
nv
m_data
->
valid_rx_ant
;
u8
rate
;
bool
is_active
=
false
;
int
chan_mod
;
u8
active_chains
;
u8
scan_tx_antennas
=
priv
->
eepro
m_data
->
valid_tx_ant
;
u8
scan_tx_antennas
=
priv
->
nv
m_data
->
valid_tx_ant
;
int
ret
;
int
scan_cmd_size
=
sizeof
(
struct
iwl_scan_cmd
)
+
MAX_SCAN_CHANNEL
*
sizeof
(
struct
iwl_scan_channel
)
+
...
...
@@ -673,8 +673,9 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
const
u8
*
ssid
=
NULL
;
u8
ssid_len
=
0
;
if
(
WARN_ON_ONCE
(
priv
->
scan_request
&&
priv
->
scan_request
->
n_channels
>
MAX_SCAN_CHANNEL
))
if
(
WARN_ON
(
priv
->
scan_type
==
IWL_SCAN_NORMAL
&&
(
!
priv
->
scan_request
||
priv
->
scan_request
->
n_channels
>
MAX_SCAN_CHANNEL
)))
return
-
EINVAL
;
lockdep_assert_held
(
&
priv
->
mutex
);
...
...
@@ -881,7 +882,7 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
/* MIMO is not used here, but value is required */
rx_chain
|=
priv
->
eepro
m_data
->
valid_rx_ant
<<
RXON_RX_CHAIN_VALID_POS
;
priv
->
nv
m_data
->
valid_rx_ant
<<
RXON_RX_CHAIN_VALID_POS
;
rx_chain
|=
rx_ant
<<
RXON_RX_CHAIN_FORCE_MIMO_SEL_POS
;
rx_chain
|=
rx_ant
<<
RXON_RX_CHAIN_FORCE_SEL_POS
;
rx_chain
|=
0x1
<<
RXON_RX_CHAIN_DRIVER_FORCE_POS
;
...
...
@@ -998,7 +999,7 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
void
iwl_init_scan_params
(
struct
iwl_priv
*
priv
)
{
u8
ant_idx
=
fls
(
priv
->
eepro
m_data
->
valid_tx_ant
)
-
1
;
u8
ant_idx
=
fls
(
priv
->
nv
m_data
->
valid_tx_ant
)
-
1
;
if
(
!
priv
->
scan_tx_ant
[
IEEE80211_BAND_5GHZ
])
priv
->
scan_tx_ant
[
IEEE80211_BAND_5GHZ
]
=
ant_idx
;
if
(
!
priv
->
scan_tx_ant
[
IEEE80211_BAND_2GHZ
])
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/dvm/sta.c
浏览文件 @
ecbbec2e
...
...
@@ -634,23 +634,23 @@ static void iwl_sta_fill_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
if
(
r
>=
IWL_FIRST_CCK_RATE
&&
r
<=
IWL_LAST_CCK_RATE
)
rate_flags
|=
RATE_MCS_CCK_MSK
;
rate_flags
|=
first_antenna
(
priv
->
eepro
m_data
->
valid_tx_ant
)
<<
rate_flags
|=
first_antenna
(
priv
->
nv
m_data
->
valid_tx_ant
)
<<
RATE_MCS_ANT_POS
;
rate_n_flags
=
iwl_hw_set_rate_n_flags
(
iwl_rates
[
r
].
plcp
,
rate_flags
);
for
(
i
=
0
;
i
<
LINK_QUAL_MAX_RETRY_NUM
;
i
++
)
link_cmd
->
rs_table
[
i
].
rate_n_flags
=
rate_n_flags
;
link_cmd
->
general_params
.
single_stream_ant_msk
=
first_antenna
(
priv
->
eepro
m_data
->
valid_tx_ant
);
first_antenna
(
priv
->
nv
m_data
->
valid_tx_ant
);
link_cmd
->
general_params
.
dual_stream_ant_msk
=
priv
->
eepro
m_data
->
valid_tx_ant
&
~
first_antenna
(
priv
->
eepro
m_data
->
valid_tx_ant
);
priv
->
nv
m_data
->
valid_tx_ant
&
~
first_antenna
(
priv
->
nv
m_data
->
valid_tx_ant
);
if
(
!
link_cmd
->
general_params
.
dual_stream_ant_msk
)
{
link_cmd
->
general_params
.
dual_stream_ant_msk
=
ANT_AB
;
}
else
if
(
num_of_ant
(
priv
->
eepro
m_data
->
valid_tx_ant
)
==
2
)
{
}
else
if
(
num_of_ant
(
priv
->
nv
m_data
->
valid_tx_ant
)
==
2
)
{
link_cmd
->
general_params
.
dual_stream_ant_msk
=
priv
->
eepro
m_data
->
valid_tx_ant
;
priv
->
nv
m_data
->
valid_tx_ant
;
}
link_cmd
->
agg_params
.
agg_dis_start_th
=
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/dvm/tx.c
浏览文件 @
ecbbec2e
...
...
@@ -188,7 +188,7 @@ static void iwlagn_tx_cmd_build_rate(struct iwl_priv *priv,
if
(
info
->
control
.
rates
[
0
].
flags
&
IEEE80211_TX_RC_MCS
||
(
rate_idx
<
0
)
||
(
rate_idx
>
IWL_RATE_COUNT_LEGACY
))
rate_idx
=
rate_lowest_index
(
&
priv
->
eepro
m_data
->
bands
[
info
->
band
],
sta
);
&
priv
->
nv
m_data
->
bands
[
info
->
band
],
sta
);
/* For 5 GHZ band, remap mac80211 rate indices into driver indices */
if
(
info
->
band
==
IEEE80211_BAND_5GHZ
)
rate_idx
+=
IWL_FIRST_OFDM_RATE
;
...
...
@@ -207,11 +207,11 @@ static void iwlagn_tx_cmd_build_rate(struct iwl_priv *priv,
priv
->
bt_full_concurrent
)
{
/* operated as 1x1 in full concurrency mode */
priv
->
mgmt_tx_ant
=
iwl_toggle_tx_ant
(
priv
,
priv
->
mgmt_tx_ant
,
first_antenna
(
priv
->
eepro
m_data
->
valid_tx_ant
));
first_antenna
(
priv
->
nv
m_data
->
valid_tx_ant
));
}
else
priv
->
mgmt_tx_ant
=
iwl_toggle_tx_ant
(
priv
,
priv
->
mgmt_tx_ant
,
priv
->
eepro
m_data
->
valid_tx_ant
);
priv
->
nv
m_data
->
valid_tx_ant
);
rate_flags
|=
iwl_ant_idx_to_flags
(
priv
->
mgmt_tx_ant
);
/* Set the rate in the TX cmd */
...
...
@@ -305,7 +305,7 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
u8
hdr_len
;
u16
len
,
seq_number
=
0
;
u8
sta_id
,
tid
=
IWL_MAX_TID_COUNT
;
bool
is_agg
=
false
;
bool
is_agg
=
false
,
is_data_qos
=
false
;
int
txq_id
;
if
(
info
->
control
.
vif
)
...
...
@@ -378,9 +378,6 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
iwl_sta_modify_sleep_tx_count
(
priv
,
sta_id
,
1
);
}
if
(
info
->
flags
&
IEEE80211_TX_CTL_AMPDU
)
is_agg
=
true
;
dev_cmd
=
iwl_trans_alloc_tx_cmd
(
priv
->
trans
);
if
(
unlikely
(
!
dev_cmd
))
...
...
@@ -442,6 +439,10 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
hdr
->
seq_ctrl
&=
cpu_to_le16
(
IEEE80211_SCTL_FRAG
);
hdr
->
seq_ctrl
|=
cpu_to_le16
(
seq_number
);
seq_number
+=
0x10
;
if
(
info
->
flags
&
IEEE80211_TX_CTL_AMPDU
)
is_agg
=
true
;
is_data_qos
=
true
;
}
/* Copy MAC header from skb into command buffer */
...
...
@@ -474,8 +475,7 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
if
(
iwl_trans_tx
(
priv
->
trans
,
skb
,
dev_cmd
,
txq_id
))
goto
drop_unlock_sta
;
if
(
ieee80211_is_data_qos
(
fc
)
&&
!
ieee80211_is_qos_nullfunc
(
fc
)
&&
!
ieee80211_has_morefrags
(
fc
))
if
(
is_data_qos
&&
!
ieee80211_has_morefrags
(
fc
))
priv
->
tid_data
[
sta_id
][
tid
].
seq_number
=
seq_number
;
spin_unlock
(
&
priv
->
sta_lock
);
...
...
@@ -1097,29 +1097,6 @@ static void iwl_check_abort_status(struct iwl_priv *priv,
}
}
static
int
iwl_reclaim
(
struct
iwl_priv
*
priv
,
int
sta_id
,
int
tid
,
int
txq_id
,
int
ssn
,
struct
sk_buff_head
*
skbs
)
{
if
(
unlikely
(
txq_id
>=
IWLAGN_FIRST_AMPDU_QUEUE
&&
tid
!=
IWL_TID_NON_QOS
&&
txq_id
!=
priv
->
tid_data
[
sta_id
][
tid
].
agg
.
txq_id
))
{
/*
* FIXME: this is a uCode bug which need to be addressed,
* log the information and return for now.
* Since it is can possibly happen very often and in order
* not to fill the syslog, don't use IWL_ERR or IWL_WARN
*/
IWL_DEBUG_TX_QUEUES
(
priv
,
"Bad queue mapping txq_id=%d, agg_txq[sta:%d,tid:%d]=%d
\n
"
,
txq_id
,
sta_id
,
tid
,
priv
->
tid_data
[
sta_id
][
tid
].
agg
.
txq_id
);
return
1
;
}
iwl_trans_reclaim
(
priv
->
trans
,
txq_id
,
ssn
,
skbs
);
return
0
;
}
int
iwlagn_rx_reply_tx
(
struct
iwl_priv
*
priv
,
struct
iwl_rx_cmd_buffer
*
rxb
,
struct
iwl_device_cmd
*
cmd
)
{
...
...
@@ -1181,9 +1158,8 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
next_reclaimed
);
}
/*we can free until ssn % q.n_bd not inclusive */
WARN_ON_ONCE
(
iwl_reclaim
(
priv
,
sta_id
,
tid
,
txq_id
,
ssn
,
&
skbs
));
iwl_trans_reclaim
(
priv
->
trans
,
txq_id
,
ssn
,
&
skbs
);
iwlagn_check_ratid_empty
(
priv
,
sta_id
,
tid
);
freed
=
0
;
...
...
@@ -1308,16 +1284,27 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
return
0
;
}
if
(
unlikely
(
scd_flow
!=
agg
->
txq_id
))
{
/*
* FIXME: this is a uCode bug which need to be addressed,
* log the information and return for now.
* Since it is can possibly happen very often and in order
* not to fill the syslog, don't use IWL_ERR or IWL_WARN
*/
IWL_DEBUG_TX_QUEUES
(
priv
,
"Bad queue mapping txq_id=%d, agg_txq[sta:%d,tid:%d]=%d
\n
"
,
scd_flow
,
sta_id
,
tid
,
agg
->
txq_id
);
spin_unlock
(
&
priv
->
sta_lock
);
return
0
;
}
__skb_queue_head_init
(
&
reclaimed_skbs
);
/* Release all TFDs before the SSN, i.e. all TFDs in front of
* block-ack window (we assume that they've been successfully
* transmitted ... if not, it's too late anyway). */
if
(
iwl_reclaim
(
priv
,
sta_id
,
tid
,
scd_flow
,
ba_resp_scd_ssn
,
&
reclaimed_skbs
))
{
spin_unlock
(
&
priv
->
sta_lock
);
return
0
;
}
iwl_trans_reclaim
(
priv
->
trans
,
scd_flow
,
ba_resp_scd_ssn
,
&
reclaimed_skbs
);
IWL_DEBUG_TX_REPLY
(
priv
,
"REPLY_COMPRESSED_BA [%d] Received from %pM, "
"sta_id = %d
\n
"
,
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/dvm/ucode.c
浏览文件 @
ecbbec2e
...
...
@@ -61,7 +61,7 @@ iwl_get_ucode_image(struct iwl_priv *priv, enum iwl_ucode_type ucode_type)
static
int
iwl_set_Xtal_calib
(
struct
iwl_priv
*
priv
)
{
struct
iwl_calib_xtal_freq_cmd
cmd
;
__le16
*
xtal_calib
=
priv
->
eepro
m_data
->
xtal_calib
;
__le16
*
xtal_calib
=
priv
->
nv
m_data
->
xtal_calib
;
iwl_set_calib_hdr
(
&
cmd
.
hdr
,
IWL_PHY_CALIBRATE_CRYSTAL_FRQ_CMD
);
cmd
.
cap_pin1
=
le16_to_cpu
(
xtal_calib
[
0
]);
...
...
@@ -75,7 +75,7 @@ static int iwl_set_temperature_offset_calib(struct iwl_priv *priv)
memset
(
&
cmd
,
0
,
sizeof
(
cmd
));
iwl_set_calib_hdr
(
&
cmd
.
hdr
,
IWL_PHY_CALIBRATE_TEMP_OFFSET_CMD
);
cmd
.
radio_sensor_offset
=
priv
->
eepro
m_data
->
raw_temperature
;
cmd
.
radio_sensor_offset
=
priv
->
nv
m_data
->
raw_temperature
;
if
(
!
(
cmd
.
radio_sensor_offset
))
cmd
.
radio_sensor_offset
=
DEFAULT_RADIO_SENSOR_OFFSET
;
...
...
@@ -90,14 +90,14 @@ static int iwl_set_temperature_offset_calib_v2(struct iwl_priv *priv)
memset
(
&
cmd
,
0
,
sizeof
(
cmd
));
iwl_set_calib_hdr
(
&
cmd
.
hdr
,
IWL_PHY_CALIBRATE_TEMP_OFFSET_CMD
);
cmd
.
radio_sensor_offset_high
=
priv
->
eepro
m_data
->
kelvin_temperature
;
cmd
.
radio_sensor_offset_low
=
priv
->
eepro
m_data
->
raw_temperature
;
cmd
.
radio_sensor_offset_high
=
priv
->
nv
m_data
->
kelvin_temperature
;
cmd
.
radio_sensor_offset_low
=
priv
->
nv
m_data
->
raw_temperature
;
if
(
!
cmd
.
radio_sensor_offset_low
)
{
IWL_DEBUG_CALIB
(
priv
,
"no info in EEPROM, use default
\n
"
);
cmd
.
radio_sensor_offset_low
=
DEFAULT_RADIO_SENSOR_OFFSET
;
cmd
.
radio_sensor_offset_high
=
DEFAULT_RADIO_SENSOR_OFFSET
;
}
cmd
.
burntVoltageRef
=
priv
->
eepro
m_data
->
calib_voltage
;
cmd
.
burntVoltageRef
=
priv
->
nv
m_data
->
calib_voltage
;
IWL_DEBUG_CALIB
(
priv
,
"Radio sensor offset high: %d
\n
"
,
le16_to_cpu
(
cmd
.
radio_sensor_offset_high
));
...
...
@@ -257,7 +257,7 @@ static int iwl_alive_notify(struct iwl_priv *priv)
iwl_trans_fw_alive
(
priv
->
trans
,
0
);
if
(
priv
->
fw
->
ucode_capa
.
flags
&
IWL_UCODE_TLV_FLAGS_PAN
&&
priv
->
eeprom_data
->
sku
&
EEPROM_SKU_CAP_IPAN_ENABLE
)
{
priv
->
nvm_data
->
sku_cap_ipan_enable
)
{
n_queues
=
ARRAY_SIZE
(
iwlagn_ipan_queue_to_tx_fifo
);
queue_to_txf
=
iwlagn_ipan_queue_to_tx_fifo
;
}
else
{
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/iwl-config.h
浏览文件 @
ecbbec2e
...
...
@@ -226,8 +226,8 @@ struct iwl_eeprom_params {
* @max_data_size: The maximal length of the fw data section
* @valid_tx_ant: valid transmit antenna
* @valid_rx_ant: valid receive antenna
* @
eeprom_ver: EEPRO
M version
* @
eeprom_calib_ver: EEPRO
M calibration version
* @
nvm_ver: NV
M version
* @
nvm_calib_ver: NV
M calibration version
* @lib: pointer to the lib ops
* @base_params: pointer to basic parameters
* @ht_params: point to ht patameters
...
...
@@ -257,8 +257,8 @@ struct iwl_cfg {
const
u32
max_inst_size
;
u8
valid_tx_ant
;
u8
valid_rx_ant
;
u16
eepro
m_ver
;
u16
eepro
m_calib_ver
;
u16
nv
m_ver
;
u16
nv
m_calib_ver
;
/* params not likely to change within a device family */
const
struct
iwl_base_params
*
base_params
;
/* params likely to change within a device family */
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/iwl-devtrace.h
浏览文件 @
ecbbec2e
...
...
@@ -133,6 +133,40 @@ TRACE_EVENT(iwlwifi_dev_iowrite32,
__get_str
(
dev
),
__entry
->
offs
,
__entry
->
val
)
);
TRACE_EVENT
(
iwlwifi_dev_iowrite_prph32
,
TP_PROTO
(
const
struct
device
*
dev
,
u32
offs
,
u32
val
),
TP_ARGS
(
dev
,
offs
,
val
),
TP_STRUCT__entry
(
DEV_ENTRY
__field
(
u32
,
offs
)
__field
(
u32
,
val
)
),
TP_fast_assign
(
DEV_ASSIGN
;
__entry
->
offs
=
offs
;
__entry
->
val
=
val
;
),
TP_printk
(
"[%s] write PRPH[%#x] = %#x)"
,
__get_str
(
dev
),
__entry
->
offs
,
__entry
->
val
)
);
TRACE_EVENT
(
iwlwifi_dev_ioread_prph32
,
TP_PROTO
(
const
struct
device
*
dev
,
u32
offs
,
u32
val
),
TP_ARGS
(
dev
,
offs
,
val
),
TP_STRUCT__entry
(
DEV_ENTRY
__field
(
u32
,
offs
)
__field
(
u32
,
val
)
),
TP_fast_assign
(
DEV_ASSIGN
;
__entry
->
offs
=
offs
;
__entry
->
val
=
val
;
),
TP_printk
(
"[%s] read PRPH[%#x] = %#x"
,
__get_str
(
dev
),
__entry
->
offs
,
__entry
->
val
)
);
TRACE_EVENT
(
iwlwifi_dev_irq
,
TP_PROTO
(
const
struct
device
*
dev
),
TP_ARGS
(
dev
),
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/iwl-drv.c
浏览文件 @
ecbbec2e
...
...
@@ -1032,6 +1032,7 @@ struct iwl_drv *iwl_drv_start(struct iwl_trans *trans,
if
(
!
drv
->
dbgfs_drv
)
{
IWL_ERR
(
drv
,
"failed to create debugfs directory
\n
"
);
ret
=
-
ENOMEM
;
goto
err_free_drv
;
}
...
...
@@ -1040,12 +1041,12 @@ struct iwl_drv *iwl_drv_start(struct iwl_trans *trans,
if
(
!
drv
->
trans
->
dbgfs_dir
)
{
IWL_ERR
(
drv
,
"failed to create transport debugfs directory
\n
"
);
ret
=
-
ENOMEM
;
goto
err_free_dbgfs
;
}
#endif
ret
=
iwl_request_firmware
(
drv
,
true
);
if
(
ret
)
{
IWL_ERR
(
trans
,
"Couldn't request the fw
\n
"
);
goto
err_fw
;
...
...
@@ -1060,9 +1061,8 @@ struct iwl_drv *iwl_drv_start(struct iwl_trans *trans,
err_free_drv:
#endif
kfree
(
drv
);
drv
=
NULL
;
return
drv
;
return
ERR_PTR
(
ret
)
;
}
void
iwl_drv_stop
(
struct
iwl_drv
*
drv
)
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/iwl-eeprom-parse.c
浏览文件 @
ecbbec2e
...
...
@@ -116,6 +116,24 @@ struct iwl_eeprom_calib_hdr {
#define EEPROM_KELVIN_TEMPERATURE ((2*0x12A) | EEPROM_CALIB_ALL)
#define EEPROM_RAW_TEMPERATURE ((2*0x12B) | EEPROM_CALIB_ALL)
/* SKU Capabilities (actual values from EEPROM definition) */
enum
eeprom_sku_bits
{
EEPROM_SKU_CAP_BAND_24GHZ
=
BIT
(
4
),
EEPROM_SKU_CAP_BAND_52GHZ
=
BIT
(
5
),
EEPROM_SKU_CAP_11N_ENABLE
=
BIT
(
6
),
EEPROM_SKU_CAP_AMT_ENABLE
=
BIT
(
7
),
EEPROM_SKU_CAP_IPAN_ENABLE
=
BIT
(
8
)
};
/* radio config bits (actual values from EEPROM definition) */
#define EEPROM_RF_CFG_TYPE_MSK(x) (x & 0x3)
/* bits 0-1 */
#define EEPROM_RF_CFG_STEP_MSK(x) ((x >> 2) & 0x3)
/* bits 2-3 */
#define EEPROM_RF_CFG_DASH_MSK(x) ((x >> 4) & 0x3)
/* bits 4-5 */
#define EEPROM_RF_CFG_PNUM_MSK(x) ((x >> 6) & 0x3)
/* bits 6-7 */
#define EEPROM_RF_CFG_TX_ANT_MSK(x) ((x >> 8) & 0xF)
/* bits 8-11 */
#define EEPROM_RF_CFG_RX_ANT_MSK(x) ((x >> 12) & 0xF)
/* bits 12-15 */
/*
* EEPROM bands
* These are the channel numbers from each band in the order
...
...
@@ -251,7 +269,7 @@ static const u8 *iwl_eeprom_query_addr(const u8 *eeprom, size_t eeprom_size,
}
static
int
iwl_eeprom_read_calib
(
const
u8
*
eeprom
,
size_t
eeprom_size
,
struct
iwl_
eepro
m_data
*
data
)
struct
iwl_
nv
m_data
*
data
)
{
struct
iwl_eeprom_calib_hdr
*
hdr
;
...
...
@@ -330,7 +348,7 @@ struct iwl_eeprom_enhanced_txpwr {
s8
mimo3_max
;
}
__packed
;
static
s8
iwl_get_max_txpwr_half_dbm
(
const
struct
iwl_
eepro
m_data
*
data
,
static
s8
iwl_get_max_txpwr_half_dbm
(
const
struct
iwl_
nv
m_data
*
data
,
struct
iwl_eeprom_enhanced_txpwr
*
txp
)
{
s8
result
=
0
;
/* (.5 dBm) */
...
...
@@ -364,7 +382,7 @@ static s8 iwl_get_max_txpwr_half_dbm(const struct iwl_eeprom_data *data,
((txp->flags & IWL_EEPROM_ENH_TXP_FL_##x) ? # x " " : "")
static
void
iwl_eeprom_enh_txp_read_element
(
struct
iwl_
eepro
m_data
*
data
,
iwl_eeprom_enh_txp_read_element
(
struct
iwl_
nv
m_data
*
data
,
struct
iwl_eeprom_enhanced_txpwr
*
txp
,
int
n_channels
,
s8
max_txpower_avg
)
{
...
...
@@ -392,7 +410,7 @@ iwl_eeprom_enh_txp_read_element(struct iwl_eeprom_data *data,
}
static
void
iwl_eeprom_enhanced_txpower
(
struct
device
*
dev
,
struct
iwl_
eepro
m_data
*
data
,
struct
iwl_
nv
m_data
*
data
,
const
u8
*
eeprom
,
size_t
eeprom_size
,
int
n_channels
)
{
...
...
@@ -504,7 +522,7 @@ static void iwl_init_band_reference(const struct iwl_cfg *cfg,
((eeprom_ch->flags & EEPROM_CHANNEL_##x) ? # x " " : "")
static
void
iwl_mod_ht40_chan_info
(
struct
device
*
dev
,
struct
iwl_
eepro
m_data
*
data
,
int
n_channels
,
struct
iwl_
nv
m_data
*
data
,
int
n_channels
,
enum
ieee80211_band
band
,
u16
channel
,
const
struct
iwl_eeprom_channel
*
eeprom_ch
,
u8
clear_ht40_extension_channel
)
...
...
@@ -547,7 +565,7 @@ static void iwl_mod_ht40_chan_info(struct device *dev,
((eeprom_ch_info[ch_idx].flags & EEPROM_CHANNEL_##x) ? # x " " : "")
static
int
iwl_init_channel_map
(
struct
device
*
dev
,
const
struct
iwl_cfg
*
cfg
,
struct
iwl_
eepro
m_data
*
data
,
struct
iwl_
nv
m_data
*
data
,
const
u8
*
eeprom
,
size_t
eeprom_size
)
{
int
band
,
ch_idx
;
...
...
@@ -685,7 +703,7 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
return
n_channels
;
}
static
int
iwl_init_sband_channels
(
struct
iwl_
eepro
m_data
*
data
,
static
int
iwl_init_sband_channels
(
struct
iwl_
nv
m_data
*
data
,
struct
ieee80211_supported_band
*
sband
,
int
n_channels
,
enum
ieee80211_band
band
)
{
...
...
@@ -711,7 +729,7 @@ static int iwl_init_sband_channels(struct iwl_eeprom_data *data,
#define MAX_BIT_RATE_20_MHZ 72
/* Mbps */
static
void
iwl_init_ht_hw_capab
(
const
struct
iwl_cfg
*
cfg
,
struct
iwl_
eepro
m_data
*
data
,
struct
iwl_
nv
m_data
*
data
,
struct
ieee80211_sta_ht_cap
*
ht_info
,
enum
ieee80211_band
band
)
{
...
...
@@ -725,7 +743,7 @@ static void iwl_init_ht_hw_capab(const struct iwl_cfg *cfg,
else
rx_chains
=
hweight8
(
data
->
valid_rx_ant
);
if
(
!
(
data
->
sku
&
EEPROM_SKU_CAP_11N_ENABLE
)
||
!
cfg
->
ht_params
)
{
if
(
!
(
data
->
sku
_cap_11n_enable
)
||
!
cfg
->
ht_params
)
{
ht_info
->
ht_supported
=
false
;
return
;
}
...
...
@@ -773,7 +791,7 @@ static void iwl_init_ht_hw_capab(const struct iwl_cfg *cfg,
}
static
void
iwl_init_sbands
(
struct
device
*
dev
,
const
struct
iwl_cfg
*
cfg
,
struct
iwl_
eepro
m_data
*
data
,
struct
iwl_
nv
m_data
*
data
,
const
u8
*
eeprom
,
size_t
eeprom_size
)
{
int
n_channels
=
iwl_init_channel_map
(
dev
,
cfg
,
data
,
...
...
@@ -804,12 +822,13 @@ static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
/* EEPROM data functions */
struct
iwl_
eepro
m_data
*
struct
iwl_
nv
m_data
*
iwl_parse_eeprom_data
(
struct
device
*
dev
,
const
struct
iwl_cfg
*
cfg
,
const
u8
*
eeprom
,
size_t
eeprom_size
)
{
struct
iwl_
eepro
m_data
*
data
;
struct
iwl_
nv
m_data
*
data
;
const
void
*
tmp
;
u16
radio_cfg
,
sku
;
if
(
WARN_ON
(
!
cfg
||
!
cfg
->
eeprom_params
))
return
NULL
;
...
...
@@ -849,18 +868,27 @@ iwl_parse_eeprom_data(struct device *dev, const struct iwl_cfg *cfg,
data
->
kelvin_temperature
=
*
(
__le16
*
)
tmp
;
data
->
kelvin_voltage
=
*
((
__le16
*
)
tmp
+
1
);
data
->
radio_cfg
=
iwl_eeprom_query16
(
eeprom
,
eeprom_size
,
radio_cfg
=
iwl_eeprom_query16
(
eeprom
,
eeprom_size
,
EEPROM_RADIO_CONFIG
);
data
->
sku
=
iwl_eeprom_query16
(
eeprom
,
eeprom_size
,
EEPROM_SKU_CAP
);
data
->
radio_cfg_dash
=
EEPROM_RF_CFG_DASH_MSK
(
radio_cfg
);
data
->
radio_cfg_pnum
=
EEPROM_RF_CFG_PNUM_MSK
(
radio_cfg
);
data
->
radio_cfg_step
=
EEPROM_RF_CFG_STEP_MSK
(
radio_cfg
);
data
->
radio_cfg_type
=
EEPROM_RF_CFG_TYPE_MSK
(
radio_cfg
);
data
->
valid_rx_ant
=
EEPROM_RF_CFG_RX_ANT_MSK
(
radio_cfg
);
data
->
valid_tx_ant
=
EEPROM_RF_CFG_TX_ANT_MSK
(
radio_cfg
);
sku
=
iwl_eeprom_query16
(
eeprom
,
eeprom_size
,
EEPROM_SKU_CAP
);
data
->
sku_cap_11n_enable
=
sku
&
EEPROM_SKU_CAP_11N_ENABLE
;
data
->
sku_cap_amt_enable
=
sku
&
EEPROM_SKU_CAP_AMT_ENABLE
;
data
->
sku_cap_band_24GHz_enable
=
sku
&
EEPROM_SKU_CAP_BAND_24GHZ
;
data
->
sku_cap_band_52GHz_enable
=
sku
&
EEPROM_SKU_CAP_BAND_52GHZ
;
data
->
sku_cap_ipan_enable
=
sku
&
EEPROM_SKU_CAP_IPAN_ENABLE
;
if
(
iwlwifi_mod_params
.
disable_11n
&
IWL_DISABLE_HT_ALL
)
data
->
sku
&=
~
EEPROM_SKU_CAP_11N_ENABLE
;
data
->
eeprom_version
=
iwl_eeprom_query16
(
eeprom
,
eeprom_size
,
EEPROM_VERSION
);
data
->
sku_cap_11n_enable
=
false
;
data
->
valid_tx_ant
=
EEPROM_RF_CFG_TX_ANT_MSK
(
data
->
radio_cfg
);
data
->
valid_rx_ant
=
EEPROM_RF_CFG_RX_ANT_MSK
(
data
->
radio_cfg
);
data
->
nvm_version
=
iwl_eeprom_query16
(
eeprom
,
eeprom_size
,
EEPROM_VERSION
);
/* check overrides (some devices have wrong EEPROM) */
if
(
cfg
->
valid_tx_ant
)
...
...
@@ -884,20 +912,20 @@ iwl_parse_eeprom_data(struct device *dev, const struct iwl_cfg *cfg,
EXPORT_SYMBOL_GPL
(
iwl_parse_eeprom_data
);
/* helper functions */
int
iwl_
eeprom_check_version
(
struct
iwl_eepro
m_data
*
data
,
int
iwl_
nvm_check_version
(
struct
iwl_nv
m_data
*
data
,
struct
iwl_trans
*
trans
)
{
if
(
data
->
eeprom_version
>=
trans
->
cfg
->
eepro
m_ver
||
data
->
calib_version
>=
trans
->
cfg
->
eepro
m_calib_ver
)
{
if
(
data
->
nvm_version
>=
trans
->
cfg
->
nv
m_ver
||
data
->
calib_version
>=
trans
->
cfg
->
nv
m_calib_ver
)
{
IWL_DEBUG_INFO
(
trans
,
"device EEPROM VER=0x%x, CALIB=0x%x
\n
"
,
data
->
eepro
m_version
,
data
->
calib_version
);
data
->
nv
m_version
,
data
->
calib_version
);
return
0
;
}
IWL_ERR
(
trans
,
"Unsupported (too old) EEPROM VER=0x%x < 0x%x CALIB=0x%x < 0x%x
\n
"
,
data
->
eeprom_version
,
trans
->
cfg
->
eepro
m_ver
,
data
->
calib_version
,
trans
->
cfg
->
eepro
m_calib_ver
);
data
->
nvm_version
,
trans
->
cfg
->
nv
m_ver
,
data
->
calib_version
,
trans
->
cfg
->
nv
m_calib_ver
);
return
-
EINVAL
;
}
EXPORT_SYMBOL_GPL
(
iwl_
eepro
m_check_version
);
EXPORT_SYMBOL_GPL
(
iwl_
nv
m_check_version
);
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h
浏览文件 @
ecbbec2e
...
...
@@ -66,22 +66,7 @@
#include <linux/if_ether.h>
#include "iwl-trans.h"
/* SKU Capabilities (actual values from EEPROM definition) */
#define EEPROM_SKU_CAP_BAND_24GHZ (1 << 4)
#define EEPROM_SKU_CAP_BAND_52GHZ (1 << 5)
#define EEPROM_SKU_CAP_11N_ENABLE (1 << 6)
#define EEPROM_SKU_CAP_AMT_ENABLE (1 << 7)
#define EEPROM_SKU_CAP_IPAN_ENABLE (1 << 8)
/* radio config bits (actual values from EEPROM definition) */
#define EEPROM_RF_CFG_TYPE_MSK(x) (x & 0x3)
/* bits 0-1 */
#define EEPROM_RF_CFG_STEP_MSK(x) ((x >> 2) & 0x3)
/* bits 2-3 */
#define EEPROM_RF_CFG_DASH_MSK(x) ((x >> 4) & 0x3)
/* bits 4-5 */
#define EEPROM_RF_CFG_PNUM_MSK(x) ((x >> 6) & 0x3)
/* bits 6-7 */
#define EEPROM_RF_CFG_TX_ANT_MSK(x) ((x >> 8) & 0xF)
/* bits 8-11 */
#define EEPROM_RF_CFG_RX_ANT_MSK(x) ((x >> 12) & 0xF)
/* bits 12-15 */
struct
iwl_eeprom_data
{
struct
iwl_nvm_data
{
int
n_hw_addrs
;
u8
hw_addr
[
ETH_ALEN
];
...
...
@@ -93,13 +78,21 @@ struct iwl_eeprom_data {
__le16
kelvin_voltage
;
__le16
xtal_calib
[
2
];
u16
sku
;
u16
radio_cfg
;
u16
eeprom_version
;
s8
max_tx_pwr_half_dbm
;
bool
sku_cap_band_24GHz_enable
;
bool
sku_cap_band_52GHz_enable
;
bool
sku_cap_11n_enable
;
bool
sku_cap_amt_enable
;
bool
sku_cap_ipan_enable
;
u8
radio_cfg_type
;
u8
radio_cfg_step
;
u8
radio_cfg_dash
;
u8
radio_cfg_pnum
;
u8
valid_tx_ant
,
valid_rx_ant
;
u16
nvm_version
;
s8
max_tx_pwr_half_dbm
;
struct
ieee80211_supported_band
bands
[
IEEE80211_NUM_BANDS
];
struct
ieee80211_channel
channels
[];
};
...
...
@@ -115,22 +108,22 @@ struct iwl_eeprom_data {
* This function parses all EEPROM values we need and then
* returns a (newly allocated) struct containing all the
* relevant values for driver use. The struct must be freed
* later with iwl_free_
eepro
m_data().
* later with iwl_free_
nv
m_data().
*/
struct
iwl_
eepro
m_data
*
struct
iwl_
nv
m_data
*
iwl_parse_eeprom_data
(
struct
device
*
dev
,
const
struct
iwl_cfg
*
cfg
,
const
u8
*
eeprom
,
size_t
eeprom_size
);
/**
* iwl_free_
eeprom_data - free EEPRO
M data
* iwl_free_
nvm_data - free NV
M data
* @data: the data to free
*/
static
inline
void
iwl_free_
eeprom_data
(
struct
iwl_eepro
m_data
*
data
)
static
inline
void
iwl_free_
nvm_data
(
struct
iwl_nv
m_data
*
data
)
{
kfree
(
data
);
}
int
iwl_
eeprom_check_version
(
struct
iwl_eepro
m_data
*
data
,
struct
iwl_trans
*
trans
);
int
iwl_
nvm_check_version
(
struct
iwl_nv
m_data
*
data
,
struct
iwl_trans
*
trans
);
#endif
/* __iwl_eeprom_parse_h__ */
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/iwl-io.c
浏览文件 @
ecbbec2e
...
...
@@ -214,84 +214,84 @@ int iwl_poll_direct_bit(struct iwl_trans *trans, u32 addr, u32 mask,
}
EXPORT_SYMBOL_GPL
(
iwl_poll_direct_bit
);
static
inline
u32
__iwl_read_prph
(
struct
iwl_trans
*
trans
,
u32
reg
)
static
inline
u32
__iwl_read_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
)
{
iwl_write32
(
trans
,
HBUS_TARG_PRPH_RADDR
,
reg
|
(
3
<<
24
));
return
iwl_read32
(
trans
,
HBUS_TARG_PRPH_RDAT
);
u32
val
=
iwl_trans_read_prph
(
trans
,
ofs
);
trace_iwlwifi_dev_ioread_prph32
(
trans
->
dev
,
ofs
,
val
);
return
val
;
}
static
inline
void
__iwl_write_prph
(
struct
iwl_trans
*
trans
,
u32
addr
,
u32
val
)
static
inline
void
__iwl_write_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
val
)
{
iwl_write32
(
trans
,
HBUS_TARG_PRPH_WADDR
,
((
addr
&
0x0000FFFF
)
|
(
3
<<
24
)));
iwl_write32
(
trans
,
HBUS_TARG_PRPH_WDAT
,
val
);
trace_iwlwifi_dev_iowrite_prph32
(
trans
->
dev
,
ofs
,
val
);
iwl_trans_write_prph
(
trans
,
ofs
,
val
);
}
u32
iwl_read_prph
(
struct
iwl_trans
*
trans
,
u32
reg
)
u32
iwl_read_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
)
{
unsigned
long
flags
;
u32
val
;
spin_lock_irqsave
(
&
trans
->
reg_lock
,
flags
);
iwl_grab_nic_access
(
trans
);
val
=
__iwl_read_prph
(
trans
,
reg
);
val
=
__iwl_read_prph
(
trans
,
ofs
);
iwl_release_nic_access
(
trans
);
spin_unlock_irqrestore
(
&
trans
->
reg_lock
,
flags
);
return
val
;
}
EXPORT_SYMBOL_GPL
(
iwl_read_prph
);
void
iwl_write_prph
(
struct
iwl_trans
*
trans
,
u32
addr
,
u32
val
)
void
iwl_write_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
val
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
trans
->
reg_lock
,
flags
);
if
(
likely
(
iwl_grab_nic_access
(
trans
)))
{
__iwl_write_prph
(
trans
,
addr
,
val
);
__iwl_write_prph
(
trans
,
ofs
,
val
);
iwl_release_nic_access
(
trans
);
}
spin_unlock_irqrestore
(
&
trans
->
reg_lock
,
flags
);
}
EXPORT_SYMBOL_GPL
(
iwl_write_prph
);
void
iwl_set_bits_prph
(
struct
iwl_trans
*
trans
,
u32
reg
,
u32
mask
)
void
iwl_set_bits_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
mask
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
trans
->
reg_lock
,
flags
);
if
(
likely
(
iwl_grab_nic_access
(
trans
)))
{
__iwl_write_prph
(
trans
,
reg
,
__iwl_read_prph
(
trans
,
reg
)
|
mask
);
__iwl_write_prph
(
trans
,
ofs
,
__iwl_read_prph
(
trans
,
ofs
)
|
mask
);
iwl_release_nic_access
(
trans
);
}
spin_unlock_irqrestore
(
&
trans
->
reg_lock
,
flags
);
}
EXPORT_SYMBOL_GPL
(
iwl_set_bits_prph
);
void
iwl_set_bits_mask_prph
(
struct
iwl_trans
*
trans
,
u32
reg
,
void
iwl_set_bits_mask_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
bits
,
u32
mask
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
trans
->
reg_lock
,
flags
);
if
(
likely
(
iwl_grab_nic_access
(
trans
)))
{
__iwl_write_prph
(
trans
,
reg
,
(
__iwl_read_prph
(
trans
,
reg
)
&
mask
)
|
bits
);
__iwl_write_prph
(
trans
,
ofs
,
(
__iwl_read_prph
(
trans
,
ofs
)
&
mask
)
|
bits
);
iwl_release_nic_access
(
trans
);
}
spin_unlock_irqrestore
(
&
trans
->
reg_lock
,
flags
);
}
EXPORT_SYMBOL_GPL
(
iwl_set_bits_mask_prph
);
void
iwl_clear_bits_prph
(
struct
iwl_trans
*
trans
,
u32
reg
,
u32
mask
)
void
iwl_clear_bits_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
mask
)
{
unsigned
long
flags
;
u32
val
;
spin_lock_irqsave
(
&
trans
->
reg_lock
,
flags
);
if
(
likely
(
iwl_grab_nic_access
(
trans
)))
{
val
=
__iwl_read_prph
(
trans
,
reg
);
__iwl_write_prph
(
trans
,
reg
,
(
val
&
~
mask
));
val
=
__iwl_read_prph
(
trans
,
ofs
);
__iwl_write_prph
(
trans
,
ofs
,
(
val
&
~
mask
));
iwl_release_nic_access
(
trans
);
}
spin_unlock_irqrestore
(
&
trans
->
reg_lock
,
flags
);
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/iwl-io.h
浏览文件 @
ecbbec2e
...
...
@@ -69,12 +69,12 @@ u32 iwl_read_direct32(struct iwl_trans *trans, u32 reg);
void
iwl_write_direct32
(
struct
iwl_trans
*
trans
,
u32
reg
,
u32
value
);
u32
iwl_read_prph
(
struct
iwl_trans
*
trans
,
u32
reg
);
void
iwl_write_prph
(
struct
iwl_trans
*
trans
,
u32
addr
,
u32
val
);
void
iwl_set_bits_prph
(
struct
iwl_trans
*
trans
,
u32
reg
,
u32
mask
);
void
iwl_set_bits_mask_prph
(
struct
iwl_trans
*
trans
,
u32
reg
,
u32
iwl_read_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
);
void
iwl_write_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
val
);
void
iwl_set_bits_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
mask
);
void
iwl_set_bits_mask_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
bits
,
u32
mask
);
void
iwl_clear_bits_prph
(
struct
iwl_trans
*
trans
,
u32
reg
,
u32
mask
);
void
iwl_clear_bits_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
mask
);
void
_iwl_read_targ_mem_dwords
(
struct
iwl_trans
*
trans
,
u32
addr
,
void
*
buf
,
int
dwords
);
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/iwl-trans.h
浏览文件 @
ecbbec2e
...
...
@@ -385,6 +385,8 @@ struct iwl_trans;
* @write8: write a u8 to a register at offset ofs from the BAR
* @write32: write a u32 to a register at offset ofs from the BAR
* @read32: read a u32 register at offset ofs from the BAR
* @read_prph: read a DWORD from a periphery register
* @write_prph: write a DWORD to a periphery register
* @configure: configure parameters required by the transport layer from
* the op_mode. May be called several times before start_fw, can't be
* called after that.
...
...
@@ -420,6 +422,8 @@ struct iwl_trans_ops {
void
(
*
write8
)(
struct
iwl_trans
*
trans
,
u32
ofs
,
u8
val
);
void
(
*
write32
)(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
val
);
u32
(
*
read32
)(
struct
iwl_trans
*
trans
,
u32
ofs
);
u32
(
*
read_prph
)(
struct
iwl_trans
*
trans
,
u32
ofs
);
void
(
*
write_prph
)(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
val
);
void
(
*
configure
)(
struct
iwl_trans
*
trans
,
const
struct
iwl_trans_config
*
trans_cfg
);
void
(
*
set_pmi
)(
struct
iwl_trans
*
trans
,
bool
state
);
...
...
@@ -489,10 +493,6 @@ struct iwl_trans {
static
inline
void
iwl_trans_configure
(
struct
iwl_trans
*
trans
,
const
struct
iwl_trans_config
*
trans_cfg
)
{
/*
* only set the op_mode for the moment. Later on, this function will do
* more
*/
trans
->
op_mode
=
trans_cfg
->
op_mode
;
trans
->
ops
->
configure
(
trans
,
trans_cfg
);
...
...
@@ -512,6 +512,9 @@ static inline void iwl_trans_stop_hw(struct iwl_trans *trans,
trans
->
ops
->
stop_hw
(
trans
,
op_mode_leaving
);
if
(
op_mode_leaving
)
trans
->
op_mode
=
NULL
;
trans
->
state
=
IWL_TRANS_NO_FW
;
}
...
...
@@ -665,6 +668,17 @@ static inline u32 iwl_trans_read32(struct iwl_trans *trans, u32 ofs)
return
trans
->
ops
->
read32
(
trans
,
ofs
);
}
static
inline
u32
iwl_trans_read_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
)
{
return
trans
->
ops
->
read_prph
(
trans
,
ofs
);
}
static
inline
void
iwl_trans_write_prph
(
struct
iwl_trans
*
trans
,
u32
ofs
,
u32
val
)
{
return
trans
->
ops
->
write_prph
(
trans
,
ofs
,
val
);
}
static
inline
void
iwl_trans_set_pmi
(
struct
iwl_trans
*
trans
,
bool
state
)
{
trans
->
ops
->
set_pmi
(
trans
,
state
);
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/pcie/1000.c
浏览文件 @
ecbbec2e
...
...
@@ -94,8 +94,8 @@ static const struct iwl_eeprom_params iwl1000_eeprom_params = {
.device_family = IWL_DEVICE_FAMILY_1000, \
.max_inst_size = IWLAGN_RTC_INST_SIZE, \
.max_data_size = IWLAGN_RTC_DATA_SIZE, \
.
eepro
m_ver = EEPROM_1000_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_1000_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_1000_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_1000_TX_POWER_VERSION, \
.base_params = &iwl1000_base_params, \
.eeprom_params = &iwl1000_eeprom_params, \
.led_mode = IWL_LED_BLINK
...
...
@@ -119,8 +119,8 @@ const struct iwl_cfg iwl1000_bg_cfg = {
.device_family = IWL_DEVICE_FAMILY_100, \
.max_inst_size = IWLAGN_RTC_INST_SIZE, \
.max_data_size = IWLAGN_RTC_DATA_SIZE, \
.
eepro
m_ver = EEPROM_1000_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_1000_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_1000_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_1000_TX_POWER_VERSION, \
.base_params = &iwl1000_base_params, \
.eeprom_params = &iwl1000_eeprom_params, \
.led_mode = IWL_LED_RF_STATE, \
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/pcie/2000.c
浏览文件 @
ecbbec2e
...
...
@@ -138,8 +138,8 @@ static const struct iwl_eeprom_params iwl20x0_eeprom_params = {
.device_family = IWL_DEVICE_FAMILY_2000, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.
eepro
m_ver = EEPROM_2000_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_2000_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
.base_params = &iwl2000_base_params, \
.eeprom_params = &iwl20x0_eeprom_params, \
.need_temp_offset_calib = true, \
...
...
@@ -166,8 +166,8 @@ const struct iwl_cfg iwl2000_2bgn_d_cfg = {
.device_family = IWL_DEVICE_FAMILY_2030, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.
eepro
m_ver = EEPROM_2000_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_2000_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
.base_params = &iwl2030_base_params, \
.bt_params = &iwl2030_bt_params, \
.eeprom_params = &iwl20x0_eeprom_params, \
...
...
@@ -190,8 +190,8 @@ const struct iwl_cfg iwl2030_2bgn_cfg = {
.device_family = IWL_DEVICE_FAMILY_105, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.
eepro
m_ver = EEPROM_2000_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_2000_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
.base_params = &iwl2000_base_params, \
.eeprom_params = &iwl20x0_eeprom_params, \
.need_temp_offset_calib = true, \
...
...
@@ -220,8 +220,8 @@ const struct iwl_cfg iwl105_bgn_d_cfg = {
.device_family = IWL_DEVICE_FAMILY_135, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.
eepro
m_ver = EEPROM_2000_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_2000_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
.base_params = &iwl2030_base_params, \
.bt_params = &iwl2030_bt_params, \
.eeprom_params = &iwl20x0_eeprom_params, \
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/pcie/5000.c
浏览文件 @
ecbbec2e
...
...
@@ -92,8 +92,8 @@ static const struct iwl_eeprom_params iwl5000_eeprom_params = {
.device_family = IWL_DEVICE_FAMILY_5000, \
.max_inst_size = IWLAGN_RTC_INST_SIZE, \
.max_data_size = IWLAGN_RTC_DATA_SIZE, \
.
eepro
m_ver = EEPROM_5000_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_5000_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_5000_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_5000_TX_POWER_VERSION, \
.base_params = &iwl5000_base_params, \
.eeprom_params = &iwl5000_eeprom_params, \
.led_mode = IWL_LED_BLINK
...
...
@@ -139,8 +139,8 @@ const struct iwl_cfg iwl5350_agn_cfg = {
.
device_family
=
IWL_DEVICE_FAMILY_5000
,
.
max_inst_size
=
IWLAGN_RTC_INST_SIZE
,
.
max_data_size
=
IWLAGN_RTC_DATA_SIZE
,
.
eepro
m_ver
=
EEPROM_5050_EEPROM_VERSION
,
.
eepro
m_calib_ver
=
EEPROM_5050_TX_POWER_VERSION
,
.
nv
m_ver
=
EEPROM_5050_EEPROM_VERSION
,
.
nv
m_calib_ver
=
EEPROM_5050_TX_POWER_VERSION
,
.
base_params
=
&
iwl5000_base_params
,
.
eeprom_params
=
&
iwl5000_eeprom_params
,
.
ht_params
=
&
iwl5000_ht_params
,
...
...
@@ -156,8 +156,8 @@ const struct iwl_cfg iwl5350_agn_cfg = {
.device_family = IWL_DEVICE_FAMILY_5150, \
.max_inst_size = IWLAGN_RTC_INST_SIZE, \
.max_data_size = IWLAGN_RTC_DATA_SIZE, \
.
eepro
m_ver = EEPROM_5050_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_5050_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_5050_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_5050_TX_POWER_VERSION, \
.base_params = &iwl5000_base_params, \
.eeprom_params = &iwl5000_eeprom_params, \
.no_xtal_calib = true, \
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/pcie/6000.c
浏览文件 @
ecbbec2e
...
...
@@ -160,8 +160,8 @@ static const struct iwl_eeprom_params iwl6000_eeprom_params = {
.device_family = IWL_DEVICE_FAMILY_6005, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.
eepro
m_ver = EEPROM_6005_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_6005_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_6005_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_6005_TX_POWER_VERSION, \
.base_params = &iwl6000_g2_base_params, \
.eeprom_params = &iwl6000_eeprom_params, \
.need_temp_offset_calib = true, \
...
...
@@ -215,8 +215,8 @@ const struct iwl_cfg iwl6005_2agn_mow2_cfg = {
.device_family = IWL_DEVICE_FAMILY_6030, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.
eepro
m_ver = EEPROM_6030_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_6030_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_6030_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_6030_TX_POWER_VERSION, \
.base_params = &iwl6000_g2_base_params, \
.bt_params = &iwl6000_bt_params, \
.eeprom_params = &iwl6000_eeprom_params, \
...
...
@@ -254,8 +254,8 @@ const struct iwl_cfg iwl6030_2bg_cfg = {
.device_family = IWL_DEVICE_FAMILY_6030, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.
eepro
m_ver = EEPROM_6030_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_6030_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_6030_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_6030_TX_POWER_VERSION, \
.base_params = &iwl6000_g2_base_params, \
.bt_params = &iwl6000_bt_params, \
.eeprom_params = &iwl6000_eeprom_params, \
...
...
@@ -306,8 +306,8 @@ const struct iwl_cfg iwl130_bg_cfg = {
.max_data_size = IWL60_RTC_DATA_SIZE, \
.valid_tx_ant = ANT_BC,
/* .cfg overwrite */
\
.valid_rx_ant = ANT_BC,
/* .cfg overwrite */
\
.
eepro
m_ver = EEPROM_6000_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_6000_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_6000_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_6000_TX_POWER_VERSION, \
.base_params = &iwl6000_base_params, \
.eeprom_params = &iwl6000_eeprom_params, \
.led_mode = IWL_LED_BLINK
...
...
@@ -337,8 +337,8 @@ const struct iwl_cfg iwl6000i_2bg_cfg = {
.max_data_size = IWL60_RTC_DATA_SIZE, \
.valid_tx_ant = ANT_AB,
/* .cfg overwrite */
\
.valid_rx_ant = ANT_AB,
/* .cfg overwrite */
\
.
eepro
m_ver = EEPROM_6050_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_6050_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_6050_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_6050_TX_POWER_VERSION, \
.base_params = &iwl6050_base_params, \
.eeprom_params = &iwl6000_eeprom_params, \
.led_mode = IWL_LED_BLINK, \
...
...
@@ -362,8 +362,8 @@ const struct iwl_cfg iwl6050_2abg_cfg = {
.device_family = IWL_DEVICE_FAMILY_6150, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.
eepro
m_ver = EEPROM_6150_EEPROM_VERSION, \
.
eepro
m_calib_ver = EEPROM_6150_TX_POWER_VERSION, \
.
nv
m_ver = EEPROM_6150_EEPROM_VERSION, \
.
nv
m_calib_ver = EEPROM_6150_TX_POWER_VERSION, \
.base_params = &iwl6050_base_params, \
.eeprom_params = &iwl6000_eeprom_params, \
.led_mode = IWL_LED_BLINK, \
...
...
@@ -389,8 +389,8 @@ const struct iwl_cfg iwl6000_3agn_cfg = {
.
device_family
=
IWL_DEVICE_FAMILY_6000
,
.
max_inst_size
=
IWL60_RTC_INST_SIZE
,
.
max_data_size
=
IWL60_RTC_DATA_SIZE
,
.
eepro
m_ver
=
EEPROM_6000_EEPROM_VERSION
,
.
eepro
m_calib_ver
=
EEPROM_6000_TX_POWER_VERSION
,
.
nv
m_ver
=
EEPROM_6000_EEPROM_VERSION
,
.
nv
m_calib_ver
=
EEPROM_6000_TX_POWER_VERSION
,
.
base_params
=
&
iwl6000_base_params
,
.
eeprom_params
=
&
iwl6000_eeprom_params
,
.
ht_params
=
&
iwl6000_ht_params
,
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/pcie/drv.c
浏览文件 @
ecbbec2e
...
...
@@ -267,6 +267,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
const
struct
iwl_cfg
*
cfg
=
(
struct
iwl_cfg
*
)(
ent
->
driver_data
);
struct
iwl_trans
*
iwl_trans
;
struct
iwl_trans_pcie
*
trans_pcie
;
int
ret
;
iwl_trans
=
iwl_trans_pcie_alloc
(
pdev
,
ent
,
cfg
);
if
(
iwl_trans
==
NULL
)
...
...
@@ -276,11 +277,15 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
trans_pcie
=
IWL_TRANS_GET_PCIE_TRANS
(
iwl_trans
);
trans_pcie
->
drv
=
iwl_drv_start
(
iwl_trans
,
cfg
);
if
(
!
trans_pcie
->
drv
)
if
(
IS_ERR_OR_NULL
(
trans_pcie
->
drv
))
{
ret
=
PTR_ERR
(
trans_pcie
->
drv
);
goto
out_free_trans
;
}
/* register transport layer debugfs here */
if
(
iwl_trans_dbgfs_register
(
iwl_trans
,
iwl_trans
->
dbgfs_dir
))
ret
=
iwl_trans_dbgfs_register
(
iwl_trans
,
iwl_trans
->
dbgfs_dir
);
if
(
ret
)
goto
out_free_drv
;
return
0
;
...
...
@@ -290,7 +295,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
out_free_trans:
iwl_trans_pcie_free
(
iwl_trans
);
pci_set_drvdata
(
pdev
,
NULL
);
return
-
EFAULT
;
return
ret
;
}
static
void
iwl_pci_remove
(
struct
pci_dev
*
pdev
)
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/pcie/rx.c
浏览文件 @
ecbbec2e
...
...
@@ -717,7 +717,7 @@ static void iwl_pcie_rx_handle(struct iwl_trans *trans)
/* uCode's read index (stored in shared DRAM) indicates the last Rx
* buffer that the driver may process (last buffer filled by ucode). */
r
=
le16_to_cpu
(
rxq
->
rb_stts
->
closed_rb_num
)
&
0x0FFF
;
r
=
le16_to_cpu
(
ACCESS_ONCE
(
rxq
->
rb_stts
->
closed_rb_num
))
&
0x0FFF
;
i
=
rxq
->
read
;
/* Rx interrupt, but nothing sent from uCode */
...
...
@@ -1122,12 +1122,20 @@ static irqreturn_t iwl_pcie_isr(int irq, void *data)
* back-to-back ISRs and sporadic interrupts from our NIC.
* If we have something to service, the tasklet will re-enable ints.
* If we *don't* have something, we'll re-enable before leaving here. */
inta_mask
=
iwl_read32
(
trans
,
CSR_INT_MASK
);
/* just for debug */
inta_mask
=
iwl_read32
(
trans
,
CSR_INT_MASK
);
iwl_write32
(
trans
,
CSR_INT_MASK
,
0x00000000
);
/* Discover which interrupts are active/pending */
inta
=
iwl_read32
(
trans
,
CSR_INT
);
if
(
inta
&
(
~
inta_mask
))
{
IWL_DEBUG_ISR
(
trans
,
"We got a masked interrupt (0x%08x)...Ack and ignore
\n
"
,
inta
&
(
~
inta_mask
));
iwl_write32
(
trans
,
CSR_INT
,
inta
&
(
~
inta_mask
));
inta
&=
inta_mask
;
}
/* Ignore interrupt if there's nothing in NIC to service.
* This may be due to IRQ shared with another device,
* or due to sporadic interrupts thrown from our NIC. */
...
...
@@ -1209,7 +1217,7 @@ irqreturn_t iwl_pcie_isr_ict(int irq, void *data)
* If we have something to service, the tasklet will re-enable ints.
* If we *don't* have something, we'll re-enable before leaving here.
*/
inta_mask
=
iwl_read32
(
trans
,
CSR_INT_MASK
);
/* just for debug */
inta_mask
=
iwl_read32
(
trans
,
CSR_INT_MASK
);
iwl_write32
(
trans
,
CSR_INT_MASK
,
0x00000000
);
/* Ignore interrupt if there's nothing in NIC to service.
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/iwlwifi/pcie/trans.c
浏览文件 @
ecbbec2e
...
...
@@ -633,6 +633,8 @@ static void iwl_trans_pcie_stop_hw(struct iwl_trans *trans,
iwl_disable_interrupts
(
trans
);
spin_unlock_irqrestore
(
&
trans_pcie
->
irq_lock
,
flags
);
iwl_pcie_disable_ict
(
trans
);
if
(
!
op_mode_leaving
)
{
/*
* Even if we stop the HW, we still want the RF kill
...
...
@@ -666,6 +668,20 @@ static u32 iwl_trans_pcie_read32(struct iwl_trans *trans, u32 ofs)
return
readl
(
IWL_TRANS_GET_PCIE_TRANS
(
trans
)
->
hw_base
+
ofs
);
}
static
u32
iwl_trans_pcie_read_prph
(
struct
iwl_trans
*
trans
,
u32
reg
)
{
iwl_trans_pcie_write32
(
trans
,
HBUS_TARG_PRPH_RADDR
,
reg
|
(
3
<<
24
));
return
iwl_trans_pcie_read32
(
trans
,
HBUS_TARG_PRPH_RDAT
);
}
static
void
iwl_trans_pcie_write_prph
(
struct
iwl_trans
*
trans
,
u32
addr
,
u32
val
)
{
iwl_trans_pcie_write32
(
trans
,
HBUS_TARG_PRPH_WADDR
,
((
addr
&
0x0000FFFF
)
|
(
3
<<
24
)));
iwl_trans_pcie_write32
(
trans
,
HBUS_TARG_PRPH_WDAT
,
val
);
}
static
void
iwl_trans_pcie_configure
(
struct
iwl_trans
*
trans
,
const
struct
iwl_trans_config
*
trans_cfg
)
{
...
...
@@ -1221,6 +1237,8 @@ static const struct iwl_trans_ops trans_ops_pcie = {
.
write8
=
iwl_trans_pcie_write8
,
.
write32
=
iwl_trans_pcie_write32
,
.
read32
=
iwl_trans_pcie_read32
,
.
read_prph
=
iwl_trans_pcie_read_prph
,
.
write_prph
=
iwl_trans_pcie_write_prph
,
.
configure
=
iwl_trans_pcie_configure
,
.
set_pmi
=
iwl_trans_pcie_set_pmi
,
};
...
...
This diff is collapsed.
Click to expand it.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录
新手
引导
客服
返回
顶部