Commit d8ec5a5d authored by John W. Linville's avatar John W. Linville

Merge branch 'master' of...

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless into for-davem
parents 6115c11f 8e3ffa47
...@@ -187,17 +187,17 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah) ...@@ -187,17 +187,17 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
INIT_INI_ARRAY(&ah->iniCckfirJapan2484, INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
ar9485_1_1_baseband_core_txfir_coeff_japan_2484); ar9485_1_1_baseband_core_txfir_coeff_japan_2484);
/* Load PCIE SERDES settings from INI */ if (ah->config.no_pll_pwrsave) {
/* Awake Setting */
INIT_INI_ARRAY(&ah->iniPcieSerdes, INIT_INI_ARRAY(&ah->iniPcieSerdes,
ar9485_1_1_pcie_phy_clkreq_disable_L1); ar9485_1_1_pcie_phy_clkreq_disable_L1);
/* Sleep Setting */
INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
ar9485_1_1_pcie_phy_clkreq_disable_L1); ar9485_1_1_pcie_phy_clkreq_disable_L1);
} else {
INIT_INI_ARRAY(&ah->iniPcieSerdes,
ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1);
INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1);
}
} else if (AR_SREV_9462_21(ah)) { } else if (AR_SREV_9462_21(ah)) {
INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
ar9462_2p1_mac_core); ar9462_2p1_mac_core);
......
...@@ -32,13 +32,6 @@ static const u32 ar9485_1_1_mac_postamble[][5] = { ...@@ -32,13 +32,6 @@ static const u32 ar9485_1_1_mac_postamble[][5] = {
{0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440}, {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440},
}; };
static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_disable_L1[][2] = {
/* Addr allmodes */
{0x00018c00, 0x18012e5e},
{0x00018c04, 0x000801d8},
{0x00018c08, 0x0000080c},
};
static const u32 ar9485Common_wo_xlna_rx_gain_1_1[][2] = { static const u32 ar9485Common_wo_xlna_rx_gain_1_1[][2] = {
/* Addr allmodes */ /* Addr allmodes */
{0x00009e00, 0x037216a0}, {0x00009e00, 0x037216a0},
...@@ -1101,20 +1094,6 @@ static const u32 ar9485_common_rx_gain_1_1[][2] = { ...@@ -1101,20 +1094,6 @@ static const u32 ar9485_common_rx_gain_1_1[][2] = {
{0x0000a1fc, 0x00000296}, {0x0000a1fc, 0x00000296},
}; };
static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_enable_L1[][2] = {
/* Addr allmodes */
{0x00018c00, 0x18052e5e},
{0x00018c04, 0x000801d8},
{0x00018c08, 0x0000080c},
};
static const u32 ar9485_1_1_pcie_phy_clkreq_enable_L1[][2] = {
/* Addr allmodes */
{0x00018c00, 0x18053e5e},
{0x00018c04, 0x000801d8},
{0x00018c08, 0x0000080c},
};
static const u32 ar9485_1_1_soc_preamble[][2] = { static const u32 ar9485_1_1_soc_preamble[][2] = {
/* Addr allmodes */ /* Addr allmodes */
{0x00004014, 0xba280400}, {0x00004014, 0xba280400},
...@@ -1173,13 +1152,6 @@ static const u32 ar9485_1_1_baseband_postamble[][5] = { ...@@ -1173,13 +1152,6 @@ static const u32 ar9485_1_1_baseband_postamble[][5] = {
{0x0000be18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, {0x0000be18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
}; };
static const u32 ar9485_1_1_pcie_phy_clkreq_disable_L1[][2] = {
/* Addr allmodes */
{0x00018c00, 0x18013e5e},
{0x00018c04, 0x000801d8},
{0x00018c08, 0x0000080c},
};
static const u32 ar9485_1_1_radio_postamble[][2] = { static const u32 ar9485_1_1_radio_postamble[][2] = {
/* Addr allmodes */ /* Addr allmodes */
{0x0001609c, 0x0b283f31}, {0x0001609c, 0x0b283f31},
...@@ -1358,4 +1330,18 @@ static const u32 ar9485_1_1_baseband_core_txfir_coeff_japan_2484[][2] = { ...@@ -1358,4 +1330,18 @@ static const u32 ar9485_1_1_baseband_core_txfir_coeff_japan_2484[][2] = {
{0x0000a3a0, 0xca9228ee}, {0x0000a3a0, 0xca9228ee},
}; };
static const u32 ar9485_1_1_pcie_phy_clkreq_disable_L1[][2] = {
/* Addr allmodes */
{0x00018c00, 0x18013e5e},
{0x00018c04, 0x000801d8},
{0x00018c08, 0x0000080c},
};
static const u32 ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1[][2] = {
/* Addr allmodes */
{0x00018c00, 0x1801265e},
{0x00018c04, 0x000801d8},
{0x00018c08, 0x0000080c},
};
#endif /* INITVALS_9485_H */ #endif /* INITVALS_9485_H */
...@@ -641,6 +641,7 @@ void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs); ...@@ -641,6 +641,7 @@ void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs);
#define ATH9K_PCI_D3_L1_WAR 0x0040 #define ATH9K_PCI_D3_L1_WAR 0x0040
#define ATH9K_PCI_AR9565_1ANT 0x0080 #define ATH9K_PCI_AR9565_1ANT 0x0080
#define ATH9K_PCI_AR9565_2ANT 0x0100 #define ATH9K_PCI_AR9565_2ANT 0x0100
#define ATH9K_PCI_NO_PLL_PWRSAVE 0x0200
/* /*
* Default cache line size, in bytes. * Default cache line size, in bytes.
......
...@@ -44,14 +44,20 @@ static ssize_t read_file_dfs(struct file *file, char __user *user_buf, ...@@ -44,14 +44,20 @@ static ssize_t read_file_dfs(struct file *file, char __user *user_buf,
if (buf == NULL) if (buf == NULL)
return -ENOMEM; return -ENOMEM;
if (sc->dfs_detector)
dfs_pool_stats = sc->dfs_detector->get_stats(sc->dfs_detector);
len += scnprintf(buf + len, size - len, "DFS support for " len += scnprintf(buf + len, size - len, "DFS support for "
"macVersion = 0x%x, macRev = 0x%x: %s\n", "macVersion = 0x%x, macRev = 0x%x: %s\n",
hw_ver->macVersion, hw_ver->macRev, hw_ver->macVersion, hw_ver->macRev,
(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_DFS) ? (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_DFS) ?
"enabled" : "disabled"); "enabled" : "disabled");
if (!sc->dfs_detector) {
len += scnprintf(buf + len, size - len,
"DFS detector not enabled\n");
goto exit;
}
dfs_pool_stats = sc->dfs_detector->get_stats(sc->dfs_detector);
len += scnprintf(buf + len, size - len, "Pulse detector statistics:\n"); len += scnprintf(buf + len, size - len, "Pulse detector statistics:\n");
ATH9K_DFS_STAT("pulse events reported ", pulses_total); ATH9K_DFS_STAT("pulse events reported ", pulses_total);
ATH9K_DFS_STAT("invalid pulse events ", pulses_no_dfs); ATH9K_DFS_STAT("invalid pulse events ", pulses_no_dfs);
...@@ -76,6 +82,7 @@ static ssize_t read_file_dfs(struct file *file, char __user *user_buf, ...@@ -76,6 +82,7 @@ static ssize_t read_file_dfs(struct file *file, char __user *user_buf,
ATH9K_DFS_POOL_STAT("Seqs. alloc error ", pseq_alloc_error); ATH9K_DFS_POOL_STAT("Seqs. alloc error ", pseq_alloc_error);
ATH9K_DFS_POOL_STAT("Seqs. in use ", pseq_used); ATH9K_DFS_POOL_STAT("Seqs. in use ", pseq_used);
exit:
if (len > size) if (len > size)
len = size; len = size;
......
...@@ -316,6 +316,7 @@ struct ath9k_ops_config { ...@@ -316,6 +316,7 @@ struct ath9k_ops_config {
u32 ant_ctrl_comm2g_switch_enable; u32 ant_ctrl_comm2g_switch_enable;
bool xatten_margin_cfg; bool xatten_margin_cfg;
bool alt_mingainidx; bool alt_mingainidx;
bool no_pll_pwrsave;
}; };
enum ath9k_int { enum ath9k_int {
......
...@@ -609,6 +609,11 @@ static void ath9k_init_platform(struct ath_softc *sc) ...@@ -609,6 +609,11 @@ static void ath9k_init_platform(struct ath_softc *sc)
ah->config.pcie_waen = 0x0040473b; ah->config.pcie_waen = 0x0040473b;
ath_info(common, "Enable WAR for ASPM D3/L1\n"); ath_info(common, "Enable WAR for ASPM D3/L1\n");
} }
if (sc->driver_data & ATH9K_PCI_NO_PLL_PWRSAVE) {
ah->config.no_pll_pwrsave = true;
ath_info(common, "Disable PLL PowerSave\n");
}
} }
static void ath9k_eeprom_request_cb(const struct firmware *eeprom_blob, static void ath9k_eeprom_request_cb(const struct firmware *eeprom_blob,
...@@ -863,8 +868,8 @@ static const struct ieee80211_iface_combination if_comb[] = { ...@@ -863,8 +868,8 @@ static const struct ieee80211_iface_combination if_comb[] = {
.max_interfaces = 1, .max_interfaces = 1,
.num_different_channels = 1, .num_different_channels = 1,
.beacon_int_infra_match = true, .beacon_int_infra_match = true,
.radar_detect_widths = BIT(NL80211_CHAN_NO_HT) | .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
BIT(NL80211_CHAN_HT20), BIT(NL80211_CHAN_WIDTH_20),
} }
}; };
......
...@@ -195,6 +195,93 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = { ...@@ -195,6 +195,93 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = {
0x3219), 0x3219),
.driver_data = ATH9K_PCI_BT_ANT_DIV }, .driver_data = ATH9K_PCI_BT_ANT_DIV },
/* AR9485 cards with PLL power-save disabled by default. */
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
PCI_VENDOR_ID_AZWAVE,
0x2C97),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
PCI_VENDOR_ID_AZWAVE,
0x2100),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
0x1C56, /* ASKEY */
0x4001),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
0x11AD, /* LITEON */
0x6627),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
0x11AD, /* LITEON */
0x6628),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
PCI_VENDOR_ID_FOXCONN,
0xE04E),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
PCI_VENDOR_ID_FOXCONN,
0xE04F),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
0x144F, /* ASKEY */
0x7197),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
0x1B9A, /* XAVI */
0x2000),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
0x1B9A, /* XAVI */
0x2001),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
PCI_VENDOR_ID_AZWAVE,
0x1186),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
PCI_VENDOR_ID_AZWAVE,
0x1F86),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
PCI_VENDOR_ID_AZWAVE,
0x1195),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
PCI_VENDOR_ID_AZWAVE,
0x1F95),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
0x1B9A, /* XAVI */
0x1C00),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
0x1B9A, /* XAVI */
0x1C01),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
0x0032,
PCI_VENDOR_ID_ASUSTEK,
0x850D),
.driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
{ PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E AR9485 */ { PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E AR9485 */
{ PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E AR9580 */ { PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E AR9580 */
......
...@@ -126,7 +126,7 @@ static ssize_t write_file_dump(struct file *file, ...@@ -126,7 +126,7 @@ static ssize_t write_file_dump(struct file *file,
if (begin == NULL) if (begin == NULL)
break; break;
if (kstrtoul(begin, 0, (unsigned long *)(arg + i)) != 0) if (kstrtou32(begin, 0, &arg[i]) != 0)
break; break;
} }
......
...@@ -1286,7 +1286,8 @@ int wcn36xx_smd_send_beacon(struct wcn36xx *wcn, struct ieee80211_vif *vif, ...@@ -1286,7 +1286,8 @@ int wcn36xx_smd_send_beacon(struct wcn36xx *wcn, struct ieee80211_vif *vif,
} else { } else {
wcn36xx_err("Beacon is to big: beacon size=%d\n", wcn36xx_err("Beacon is to big: beacon size=%d\n",
msg_body.beacon_length); msg_body.beacon_length);
return -ENOMEM; ret = -ENOMEM;
goto out;
} }
memcpy(msg_body.bssid, vif->addr, ETH_ALEN); memcpy(msg_body.bssid, vif->addr, ETH_ALEN);
...@@ -1327,7 +1328,8 @@ int wcn36xx_smd_update_proberesp_tmpl(struct wcn36xx *wcn, ...@@ -1327,7 +1328,8 @@ int wcn36xx_smd_update_proberesp_tmpl(struct wcn36xx *wcn,
if (skb->len > BEACON_TEMPLATE_SIZE) { if (skb->len > BEACON_TEMPLATE_SIZE) {
wcn36xx_warn("probe response template is too big: %d\n", wcn36xx_warn("probe response template is too big: %d\n",
skb->len); skb->len);
return -E2BIG; ret = -E2BIG;
goto out;
} }
msg.probe_resp_template_len = skb->len; msg.probe_resp_template_len = skb->len;
...@@ -1606,7 +1608,8 @@ int wcn36xx_smd_keep_alive_req(struct wcn36xx *wcn, ...@@ -1606,7 +1608,8 @@ int wcn36xx_smd_keep_alive_req(struct wcn36xx *wcn,
/* TODO: it also support ARP response type */ /* TODO: it also support ARP response type */
} else { } else {
wcn36xx_warn("unknow keep alive packet type %d\n", packet_type); wcn36xx_warn("unknow keep alive packet type %d\n", packet_type);
return -EINVAL; ret = -EINVAL;
goto out;
} }
PREPARE_HAL_BUF(wcn->hal_buf, msg_body); PREPARE_HAL_BUF(wcn->hal_buf, msg_body);
......
...@@ -913,7 +913,10 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, ...@@ -913,7 +913,10 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf,
char *p2; char *p2;
struct debug_data *d = f->private_data; struct debug_data *d = f->private_data;
pdata = kmalloc(cnt, GFP_KERNEL); if (cnt == 0)
return 0;
pdata = kmalloc(cnt + 1, GFP_KERNEL);
if (pdata == NULL) if (pdata == NULL)
return 0; return 0;
...@@ -922,6 +925,7 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, ...@@ -922,6 +925,7 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf,
kfree(pdata); kfree(pdata);
return 0; return 0;
} }
pdata[cnt] = '\0';
p0 = pdata; p0 = pdata;
for (i = 0; i < num_of_items; i++) { for (i = 0; i < num_of_items; i++) {
......
...@@ -902,6 +902,7 @@ static int if_cs_probe(struct pcmcia_device *p_dev) ...@@ -902,6 +902,7 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
if (card->model == MODEL_UNKNOWN) { if (card->model == MODEL_UNKNOWN) {
pr_err("unsupported manf_id 0x%04x / card_id 0x%04x\n", pr_err("unsupported manf_id 0x%04x / card_id 0x%04x\n",
p_dev->manf_id, p_dev->card_id); p_dev->manf_id, p_dev->card_id);
ret = -ENODEV;
goto out2; goto out2;
} }
......
...@@ -1020,8 +1020,8 @@ struct mwifiex_power_group { ...@@ -1020,8 +1020,8 @@ struct mwifiex_power_group {
} __packed; } __packed;
struct mwifiex_types_power_group { struct mwifiex_types_power_group {
u16 type; __le16 type;
u16 length; __le16 length;
} __packed; } __packed;
struct host_cmd_ds_txpwr_cfg { struct host_cmd_ds_txpwr_cfg {
......
...@@ -82,7 +82,7 @@ mwifiex_update_autoindex_ies(struct mwifiex_private *priv, ...@@ -82,7 +82,7 @@ mwifiex_update_autoindex_ies(struct mwifiex_private *priv,
struct mwifiex_ie_list *ie_list) struct mwifiex_ie_list *ie_list)
{ {
u16 travel_len, index, mask; u16 travel_len, index, mask;
s16 input_len; s16 input_len, tlv_len;
struct mwifiex_ie *ie; struct mwifiex_ie *ie;
u8 *tmp; u8 *tmp;
...@@ -91,11 +91,13 @@ mwifiex_update_autoindex_ies(struct mwifiex_private *priv, ...@@ -91,11 +91,13 @@ mwifiex_update_autoindex_ies(struct mwifiex_private *priv,
ie_list->len = 0; ie_list->len = 0;
while (input_len > 0) { while (input_len >= sizeof(struct mwifiex_ie_types_header)) {
ie = (struct mwifiex_ie *)(((u8 *)ie_list) + travel_len); ie = (struct mwifiex_ie *)(((u8 *)ie_list) + travel_len);
input_len -= le16_to_cpu(ie->ie_length) + MWIFIEX_IE_HDR_SIZE; tlv_len = le16_to_cpu(ie->ie_length);
travel_len += le16_to_cpu(ie->ie_length) + MWIFIEX_IE_HDR_SIZE; travel_len += tlv_len + MWIFIEX_IE_HDR_SIZE;
if (input_len < tlv_len + MWIFIEX_IE_HDR_SIZE)
return -1;
index = le16_to_cpu(ie->ie_index); index = le16_to_cpu(ie->ie_index);
mask = le16_to_cpu(ie->mgmt_subtype_mask); mask = le16_to_cpu(ie->mgmt_subtype_mask);
...@@ -132,6 +134,7 @@ mwifiex_update_autoindex_ies(struct mwifiex_private *priv, ...@@ -132,6 +134,7 @@ mwifiex_update_autoindex_ies(struct mwifiex_private *priv,
le16_add_cpu(&ie_list->len, le16_add_cpu(&ie_list->len,
le16_to_cpu(priv->mgmt_ie[index].ie_length) + le16_to_cpu(priv->mgmt_ie[index].ie_length) +
MWIFIEX_IE_HDR_SIZE); MWIFIEX_IE_HDR_SIZE);
input_len -= tlv_len + MWIFIEX_IE_HDR_SIZE;
} }
if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP) if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP)
......
...@@ -1029,7 +1029,10 @@ static int mwifiex_decode_rx_packet(struct mwifiex_adapter *adapter, ...@@ -1029,7 +1029,10 @@ static int mwifiex_decode_rx_packet(struct mwifiex_adapter *adapter,
struct sk_buff *skb, u32 upld_typ) struct sk_buff *skb, u32 upld_typ)
{ {
u8 *cmd_buf; u8 *cmd_buf;
__le16 *curr_ptr = (__le16 *)skb->data;
u16 pkt_len = le16_to_cpu(*curr_ptr);
skb_trim(skb, pkt_len);
skb_pull(skb, INTF_HEADER_LEN); skb_pull(skb, INTF_HEADER_LEN);
switch (upld_typ) { switch (upld_typ) {
......
...@@ -239,14 +239,14 @@ static int mwifiex_cmd_tx_power_cfg(struct host_cmd_ds_command *cmd, ...@@ -239,14 +239,14 @@ static int mwifiex_cmd_tx_power_cfg(struct host_cmd_ds_command *cmd,
memmove(cmd_txp_cfg, txp, memmove(cmd_txp_cfg, txp,
sizeof(struct host_cmd_ds_txpwr_cfg) + sizeof(struct host_cmd_ds_txpwr_cfg) +
sizeof(struct mwifiex_types_power_group) + sizeof(struct mwifiex_types_power_group) +
pg_tlv->length); le16_to_cpu(pg_tlv->length));
pg_tlv = (struct mwifiex_types_power_group *) ((u8 *) pg_tlv = (struct mwifiex_types_power_group *) ((u8 *)
cmd_txp_cfg + cmd_txp_cfg +
sizeof(struct host_cmd_ds_txpwr_cfg)); sizeof(struct host_cmd_ds_txpwr_cfg));
cmd->size = cpu_to_le16(le16_to_cpu(cmd->size) + cmd->size = cpu_to_le16(le16_to_cpu(cmd->size) +
sizeof(struct mwifiex_types_power_group) + sizeof(struct mwifiex_types_power_group) +
pg_tlv->length); le16_to_cpu(pg_tlv->length));
} else { } else {
memmove(cmd_txp_cfg, txp, sizeof(*txp)); memmove(cmd_txp_cfg, txp, sizeof(*txp));
} }
......
...@@ -274,17 +274,20 @@ static int mwifiex_ret_tx_rate_cfg(struct mwifiex_private *priv, ...@@ -274,17 +274,20 @@ static int mwifiex_ret_tx_rate_cfg(struct mwifiex_private *priv,
struct host_cmd_ds_tx_rate_cfg *rate_cfg = &resp->params.tx_rate_cfg; struct host_cmd_ds_tx_rate_cfg *rate_cfg = &resp->params.tx_rate_cfg;
struct mwifiex_rate_scope *rate_scope; struct mwifiex_rate_scope *rate_scope;
struct mwifiex_ie_types_header *head; struct mwifiex_ie_types_header *head;
u16 tlv, tlv_buf_len; u16 tlv, tlv_buf_len, tlv_buf_left;
u8 *tlv_buf; u8 *tlv_buf;
u32 i; u32 i;
tlv_buf = ((u8 *)rate_cfg) + tlv_buf = ((u8 *)rate_cfg) + sizeof(struct host_cmd_ds_tx_rate_cfg);
sizeof(struct host_cmd_ds_tx_rate_cfg); tlv_buf_left = le16_to_cpu(resp->size) - S_DS_GEN - sizeof(*rate_cfg);
tlv_buf_len = le16_to_cpu(*(__le16 *) (tlv_buf + sizeof(u16)));
while (tlv_buf && tlv_buf_len > 0) { while (tlv_buf_left >= sizeof(*head)) {
tlv = (*tlv_buf); head = (struct mwifiex_ie_types_header *)tlv_buf;
tlv = tlv | (*(tlv_buf + 1) << 8); tlv = le16_to_cpu(head->type);
tlv_buf_len = le16_to_cpu(head->len);
if (tlv_buf_left < (sizeof(*head) + tlv_buf_len))
break;
switch (tlv) { switch (tlv) {
case TLV_TYPE_RATE_SCOPE: case TLV_TYPE_RATE_SCOPE:
...@@ -304,9 +307,8 @@ static int mwifiex_ret_tx_rate_cfg(struct mwifiex_private *priv, ...@@ -304,9 +307,8 @@ static int mwifiex_ret_tx_rate_cfg(struct mwifiex_private *priv,
/* Add RATE_DROP tlv here */ /* Add RATE_DROP tlv here */
} }
head = (struct mwifiex_ie_types_header *) tlv_buf; tlv_buf += (sizeof(*head) + tlv_buf_len);
tlv_buf += le16_to_cpu(head->len) + sizeof(*head); tlv_buf_left -= (sizeof(*head) + tlv_buf_len);
tlv_buf_len -= le16_to_cpu(head->len);
} }
priv->is_data_rate_auto = mwifiex_is_rate_auto(priv); priv->is_data_rate_auto = mwifiex_is_rate_auto(priv);
...@@ -340,13 +342,17 @@ static int mwifiex_get_power_level(struct mwifiex_private *priv, void *data_buf) ...@@ -340,13 +342,17 @@ static int mwifiex_get_power_level(struct mwifiex_private *priv, void *data_buf)
((u8 *) data_buf + sizeof(struct host_cmd_ds_txpwr_cfg)); ((u8 *) data_buf + sizeof(struct host_cmd_ds_txpwr_cfg));
pg = (struct mwifiex_power_group *) pg = (struct mwifiex_power_group *)
((u8 *) pg_tlv_hdr + sizeof(struct mwifiex_types_power_group)); ((u8 *) pg_tlv_hdr + sizeof(struct mwifiex_types_power_group));
length = pg_tlv_hdr->length; length = le16_to_cpu(pg_tlv_hdr->length);
if (length > 0) {
/* At least one structure required to update power */
if (length < sizeof(struct mwifiex_power_group))
return 0;
max_power = pg->power_max; max_power = pg->power_max;
min_power = pg->power_min; min_power = pg->power_min;
length -= sizeof(struct mwifiex_power_group); length -= sizeof(struct mwifiex_power_group);
}
while (length) { while (length >= sizeof(struct mwifiex_power_group)) {
pg++; pg++;
if (max_power < pg->power_max) if (max_power < pg->power_max)
max_power = pg->power_max; max_power = pg->power_max;
...@@ -356,10 +362,8 @@ static int mwifiex_get_power_level(struct mwifiex_private *priv, void *data_buf) ...@@ -356,10 +362,8 @@ static int mwifiex_get_power_level(struct mwifiex_private *priv, void *data_buf)
length -= sizeof(struct mwifiex_power_group); length -= sizeof(struct mwifiex_power_group);
} }
if (pg_tlv_hdr->length > 0) {
priv->min_tx_power_level = (u8) min_power; priv->min_tx_power_level = (u8) min_power;
priv->max_tx_power_level = (u8) max_power; priv->max_tx_power_level = (u8) max_power;
}
return 0; return 0;
} }
......
...@@ -638,8 +638,9 @@ int mwifiex_set_tx_power(struct mwifiex_private *priv, ...@@ -638,8 +638,9 @@ int mwifiex_set_tx_power(struct mwifiex_private *priv,
txp_cfg->mode = cpu_to_le32(1); txp_cfg->mode = cpu_to_le32(1);
pg_tlv = (struct mwifiex_types_power_group *) pg_tlv = (struct mwifiex_types_power_group *)
(buf + sizeof(struct host_cmd_ds_txpwr_cfg)); (buf + sizeof(struct host_cmd_ds_txpwr_cfg));
pg_tlv->type = TLV_TYPE_POWER_GROUP; pg_tlv->type = cpu_to_le16(TLV_TYPE_POWER_GROUP);
pg_tlv->length = 4 * sizeof(struct mwifiex_power_group); pg_tlv->length =
cpu_to_le16(4 * sizeof(struct mwifiex_power_group));
pg = (struct mwifiex_power_group *) pg = (struct mwifiex_power_group *)
(buf + sizeof(struct host_cmd_ds_txpwr_cfg) (buf + sizeof(struct host_cmd_ds_txpwr_cfg)
+ sizeof(struct mwifiex_types_power_group)); + sizeof(struct mwifiex_types_power_group));
......
...@@ -97,6 +97,7 @@ static void mwifiex_uap_queue_bridged_pkt(struct mwifiex_private *priv, ...@@ -97,6 +97,7 @@ static void mwifiex_uap_queue_bridged_pkt(struct mwifiex_private *priv,
struct mwifiex_txinfo *tx_info; struct mwifiex_txinfo *tx_info;
int hdr_chop; int hdr_chop;
struct timeval tv; struct timeval tv;
struct ethhdr *p_ethhdr;
u8 rfc1042_eth_hdr[ETH_ALEN] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 }; u8 rfc1042_eth_hdr[ETH_ALEN] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
uap_rx_pd = (struct uap_rxpd *)(skb->data); uap_rx_pd = (struct uap_rxpd *)(skb->data);
...@@ -112,14 +113,36 @@ static void mwifiex_uap_queue_bridged_pkt(struct mwifiex_private *priv, ...@@ -112,14 +113,36 @@ static void mwifiex_uap_queue_bridged_pkt(struct mwifiex_private *priv,
} }
if (!memcmp(&rx_pkt_hdr->rfc1042_hdr, if (!memcmp(&rx_pkt_hdr->rfc1042_hdr,
rfc1042_eth_hdr, sizeof(rfc1042_eth_hdr))) rfc1042_eth_hdr, sizeof(rfc1042_eth_hdr))) {
/* Replace the 803 header and rfc1042 header (llc/snap) with
* an Ethernet II header, keep the src/dst and snap_type
* (ethertype).
*
* The firmware only passes up SNAP frames converting all RX
* data from 802.11 to 802.2/LLC/SNAP frames.
*
* To create the Ethernet II, just move the src, dst address
* right before the snap_type.
*/
p_ethhdr = (struct ethhdr *)
((u8 *)(&rx_pkt_hdr->eth803_hdr)
+ sizeof(rx_pkt_hdr->eth803_hdr)
+ sizeof(rx_pkt_hdr->rfc1042_hdr)
- sizeof(rx_pkt_hdr->eth803_hdr.h_dest)
- sizeof(rx_pkt_hdr->eth803_hdr.h_source)
- sizeof(rx_pkt_hdr->rfc1042_hdr.snap_type));
memcpy(p_ethhdr->h_source, rx_pkt_hdr->eth803_hdr.h_source,
sizeof(p_ethhdr->h_source));
memcpy(p_ethhdr->h_dest, rx_pkt_hdr->eth803_hdr.h_dest,
sizeof(p_ethhdr->h_dest));
/* Chop off the rxpd + the excess memory from /* Chop off the rxpd + the excess memory from
* 802.2/llc/snap header that was removed. * 802.2/llc/snap header that was removed.
*/ */
hdr_chop = (u8 *)eth_hdr - (u8 *)uap_rx_pd; hdr_chop = (u8 *)p_ethhdr - (u8 *)uap_rx_pd;
else } else {
/* Chop off the rxpd */ /* Chop off the rxpd */
hdr_chop = (u8 *)&rx_pkt_hdr->eth803_hdr - (u8 *)uap_rx_pd; hdr_chop = (u8 *)&rx_pkt_hdr->eth803_hdr - (u8 *)uap_rx_pd;
}
/* Chop off the leading header bytes so the it points /* Chop off the leading header bytes so the it points
* to the start of either the reconstructed EthII frame * to the start of either the reconstructed EthII frame
......
...@@ -722,6 +722,9 @@ int mwifiex_ret_wmm_get_status(struct mwifiex_private *priv, ...@@ -722,6 +722,9 @@ int mwifiex_ret_wmm_get_status(struct mwifiex_private *priv,
tlv_hdr = (struct mwifiex_ie_types_data *) curr; tlv_hdr = (struct mwifiex_ie_types_data *) curr;
tlv_len = le16_to_cpu(tlv_hdr->header.len); tlv_len = le16_to_cpu(tlv_hdr->header.len);
if (resp_len < tlv_len + sizeof(tlv_hdr->header))
break;
switch (le16_to_cpu(tlv_hdr->header.type)) { switch (le16_to_cpu(tlv_hdr->header.type)) {
case TLV_TYPE_WMMQSTATUS: case TLV_TYPE_WMMQSTATUS:
tlv_wmm_qstatus = tlv_wmm_qstatus =
......
...@@ -811,6 +811,10 @@ static const struct net_device_ops islpci_netdev_ops = { ...@@ -811,6 +811,10 @@ static const struct net_device_ops islpci_netdev_ops = {
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
}; };
static struct device_type wlan_type = {
.name = "wlan",
};
struct net_device * struct net_device *
islpci_setup(struct pci_dev *pdev) islpci_setup(struct pci_dev *pdev)
{ {
...@@ -821,9 +825,8 @@ islpci_setup(struct pci_dev *pdev) ...@@ -821,9 +825,8 @@ islpci_setup(struct pci_dev *pdev)
return ndev; return ndev;
pci_set_drvdata(pdev, ndev); pci_set_drvdata(pdev, ndev);
#if defined(SET_NETDEV_DEV)
SET_NETDEV_DEV(ndev, &pdev->dev); SET_NETDEV_DEV(ndev, &pdev->dev);
#endif SET_NETDEV_DEVTYPE(ndev, &wlan_type);
/* setup the structure members */ /* setup the structure members */
ndev->base_addr = pci_resource_start(pdev, 0); ndev->base_addr = pci_resource_start(pdev, 0);
......
...@@ -2640,7 +2640,7 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev, ...@@ -2640,7 +2640,7 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
if (rt2x00_rt(rt2x00dev, RT5392)) { if (rt2x00_rt(rt2x00dev, RT5392)) {
rt2800_rfcsr_read(rt2x00dev, 50, &rfcsr); rt2800_rfcsr_read(rt2x00dev, 50, &rfcsr);
if (info->default_power1 > POWER_BOUND) if (info->default_power2 > POWER_BOUND)
rt2x00_set_field8(&rfcsr, RFCSR50_TX, POWER_BOUND); rt2x00_set_field8(&rfcsr, RFCSR50_TX, POWER_BOUND);
else else
rt2x00_set_field8(&rfcsr, RFCSR50_TX, rt2x00_set_field8(&rfcsr, RFCSR50_TX,
......
...@@ -146,7 +146,7 @@ void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length); ...@@ -146,7 +146,7 @@ void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length);
* @local: frame is not from mac80211 * @local: frame is not from mac80211
*/ */
int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
bool local); struct ieee80211_sta *sta, bool local);
/** /**
* rt2x00queue_update_beacon - Send new beacon from mac80211 * rt2x00queue_update_beacon - Send new beacon from mac80211
......
...@@ -90,7 +90,7 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev, ...@@ -90,7 +90,7 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,
frag_skb->data, data_length, tx_info, frag_skb->data, data_length, tx_info,
(struct ieee80211_rts *)(skb->data)); (struct ieee80211_rts *)(skb->data));
retval = rt2x00queue_write_tx_frame(queue, skb, true); retval = rt2x00queue_write_tx_frame(queue, skb, NULL, true);
if (retval) { if (retval) {
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
rt2x00_warn(rt2x00dev, "Failed to send RTS/CTS frame\n"); rt2x00_warn(rt2x00dev, "Failed to send RTS/CTS frame\n");
...@@ -151,7 +151,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, ...@@ -151,7 +151,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hw,
goto exit_fail; goto exit_fail;
} }
if (unlikely(rt2x00queue_write_tx_frame(queue, skb, false))) if (unlikely(rt2x00queue_write_tx_frame(queue, skb, control->sta, false)))
goto exit_fail; goto exit_fail;
/* /*
......
...@@ -635,7 +635,7 @@ static void rt2x00queue_bar_check(struct queue_entry *entry) ...@@ -635,7 +635,7 @@ static void rt2x00queue_bar_check(struct queue_entry *entry)
} }
int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
bool local) struct ieee80211_sta *sta, bool local)
{ {
struct ieee80211_tx_info *tx_info; struct ieee80211_tx_info *tx_info;
struct queue_entry *entry; struct queue_entry *entry;
...@@ -649,7 +649,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, ...@@ -649,7 +649,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
* after that we are free to use the skb->cb array * after that we are free to use the skb->cb array
* for our information. * for our information.
*/ */
rt2x00queue_create_tx_descriptor(queue->rt2x00dev, skb, &txdesc, NULL); rt2x00queue_create_tx_descriptor(queue->rt2x00dev, skb, &txdesc, sta);
/* /*
* All information is retrieved from the skb->cb array, * All information is retrieved from the skb->cb array,
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include <linux/ip.h> #include <linux/ip.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/udp.h>
/* /*
*NOTICE!!!: This file will be very big, we should *NOTICE!!!: This file will be very big, we should
...@@ -1074,64 +1075,52 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx) ...@@ -1074,64 +1075,52 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
if (!ieee80211_is_data(fc)) if (!ieee80211_is_data(fc))
return false; return false;
ip = (const struct iphdr *)(skb->data + mac_hdr_len +
ip = (struct iphdr *)((u8 *) skb->data + mac_hdr_len +
SNAP_SIZE + PROTOC_TYPE_SIZE); SNAP_SIZE + PROTOC_TYPE_SIZE);
ether_type = *(u16 *) ((u8 *) skb->data + mac_hdr_len + SNAP_SIZE); ether_type = be16_to_cpup((__be16 *)
/* ether_type = ntohs(ether_type); */ (skb->data + mac_hdr_len + SNAP_SIZE));
if (ETH_P_IP == ether_type) {
if (IPPROTO_UDP == ip->protocol) {
struct udphdr *udp = (struct udphdr *)((u8 *) ip +
(ip->ihl << 2));
if (((((u8 *) udp)[1] == 68) &&
(((u8 *) udp)[3] == 67)) ||
((((u8 *) udp)[1] == 67) &&
(((u8 *) udp)[3] == 68))) {
/*
* 68 : UDP BOOTP client
* 67 : UDP BOOTP server
*/
RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV),
DBG_DMESG, "dhcp %s !!\n",
is_tx ? "Tx" : "Rx");
if (is_tx) { switch (ether_type) {
rtlpriv->enter_ps = false; case ETH_P_IP: {
schedule_work(&rtlpriv-> struct udphdr *udp;
works.lps_change_work); u16 src;
ppsc->last_delaylps_stamp_jiffies = u16 dst;
jiffies;
}
return true; if (ip->protocol != IPPROTO_UDP)
} return false;
} udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2));
} else if (ETH_P_ARP == ether_type) { src = be16_to_cpu(udp->source);
if (is_tx) { dst = be16_to_cpu(udp->dest);
rtlpriv->enter_ps = false;
schedule_work(&rtlpriv->works.lps_change_work); /* If this case involves port 68 (UDP BOOTP client) connecting
ppsc->last_delaylps_stamp_jiffies = jiffies; * with port 67 (UDP BOOTP server), then return true so that
} * the lowest speed is used.
*/
if (!((src == 68 && dst == 67) || (src == 67 && dst == 68)))
return false;
return true; RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
} else if (ETH_P_PAE == ether_type) { "dhcp %s !!\n", is_tx ? "Tx" : "Rx");
break;
}
case ETH_P_ARP:
break;
case ETH_P_PAE:
RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG, RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
"802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx"); "802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx");
break;
case ETH_P_IPV6:
/* TODO: Is this right? */
return false;
default:
return false;
}
if (is_tx) { if (is_tx) {
rtlpriv->enter_ps = false; rtlpriv->enter_ps = false;
schedule_work(&rtlpriv->works.lps_change_work); schedule_work(&rtlpriv->works.lps_change_work);
ppsc->last_delaylps_stamp_jiffies = jiffies; ppsc->last_delaylps_stamp_jiffies = jiffies;
} }
return true; return true;
} else if (ETH_P_IPV6 == ether_type) {
/* IPv6 */
return true;
}
return false;
} }
EXPORT_SYMBOL_GPL(rtl_is_special_data); EXPORT_SYMBOL_GPL(rtl_is_special_data);
......
...@@ -262,9 +262,9 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf) ...@@ -262,9 +262,9 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)
sizeof(u8), GFP_ATOMIC); sizeof(u8), GFP_ATOMIC);
if (!efuse_tbl) if (!efuse_tbl)
return; return;
efuse_word = kmalloc(EFUSE_MAX_WORD_UNIT * sizeof(u16 *), GFP_ATOMIC); efuse_word = kzalloc(EFUSE_MAX_WORD_UNIT * sizeof(u16 *), GFP_ATOMIC);
if (!efuse_word) if (!efuse_word)
goto done; goto out;
for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) { for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) {
efuse_word[i] = kmalloc(efuse_max_section * sizeof(u16), efuse_word[i] = kmalloc(efuse_max_section * sizeof(u16),
GFP_ATOMIC); GFP_ATOMIC);
...@@ -378,6 +378,7 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf) ...@@ -378,6 +378,7 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)
for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++)
kfree(efuse_word[i]); kfree(efuse_word[i]);
kfree(efuse_word); kfree(efuse_word);
out:
kfree(efuse_tbl); kfree(efuse_tbl);
} }
......
...@@ -349,7 +349,7 @@ bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw, ...@@ -349,7 +349,7 @@ bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw,
p_drvinfo); p_drvinfo);
} }
/*rx_status->qual = stats->signal; */ /*rx_status->qual = stats->signal; */
rx_status->signal = stats->rssi + 10; rx_status->signal = stats->recvsignalpower + 10;
return true; return true;
} }
......
...@@ -525,7 +525,7 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats, ...@@ -525,7 +525,7 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
p_drvinfo); p_drvinfo);
} }
/*rx_status->qual = stats->signal; */ /*rx_status->qual = stats->signal; */
rx_status->signal = stats->rssi + 10; rx_status->signal = stats->recvsignalpower + 10;
return true; return true;
} }
......
...@@ -265,7 +265,7 @@ static void _rtl92s_get_txpower_writeval_byregulatory(struct ieee80211_hw *hw, ...@@ -265,7 +265,7 @@ static void _rtl92s_get_txpower_writeval_byregulatory(struct ieee80211_hw *hw,
rtlefuse->pwrgroup_ht40 rtlefuse->pwrgroup_ht40
[RF90_PATH_A][chnl - 1]) { [RF90_PATH_A][chnl - 1]) {
pwrdiff_limit[i] = pwrdiff_limit[i] =
rtlefuse->pwrgroup_ht20 rtlefuse->pwrgroup_ht40
[RF90_PATH_A][chnl - 1]; [RF90_PATH_A][chnl - 1];
} }
} else { } else {
......
...@@ -329,7 +329,7 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats, ...@@ -329,7 +329,7 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
} }
/*rx_status->qual = stats->signal; */ /*rx_status->qual = stats->signal; */
rx_status->signal = stats->rssi + 10; rx_status->signal = stats->recvsignalpower + 10;
return true; return true;
} }
......
...@@ -77,11 +77,7 @@ ...@@ -77,11 +77,7 @@
#define RTL_SLOT_TIME_9 9 #define RTL_SLOT_TIME_9 9
#define RTL_SLOT_TIME_20 20 #define RTL_SLOT_TIME_20 20
/*related with tcp/ip. */ /*related to tcp/ip. */
/*if_ehther.h*/
#define ETH_P_PAE 0x888E /*Port Access Entity (IEEE 802.1X) */
#define ETH_P_IP 0x0800 /*Internet Protocol packet */
#define ETH_P_ARP 0x0806 /*Address Resolution packet */
#define SNAP_SIZE 6 #define SNAP_SIZE 6
#define PROTOC_TYPE_SIZE 2 #define PROTOC_TYPE_SIZE 2
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment