mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 04:06:22 +00:00
Merge branch 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
This commit is contained in:
commit
eb1cf0f8f7
19 changed files with 274 additions and 235 deletions
|
@ -99,6 +99,8 @@ static struct iwl_lib_ops iwl1000_lib = {
|
||||||
.setup_deferred_work = iwl5000_setup_deferred_work,
|
.setup_deferred_work = iwl5000_setup_deferred_work,
|
||||||
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
||||||
.load_ucode = iwl5000_load_ucode,
|
.load_ucode = iwl5000_load_ucode,
|
||||||
|
.dump_nic_event_log = iwl_dump_nic_event_log,
|
||||||
|
.dump_nic_error_log = iwl_dump_nic_error_log,
|
||||||
.init_alive_start = iwl5000_init_alive_start,
|
.init_alive_start = iwl5000_init_alive_start,
|
||||||
.alive_notify = iwl5000_alive_notify,
|
.alive_notify = iwl5000_alive_notify,
|
||||||
.send_tx_power = iwl5000_send_tx_power,
|
.send_tx_power = iwl5000_send_tx_power,
|
||||||
|
|
|
@ -2839,6 +2839,8 @@ static struct iwl_lib_ops iwl3945_lib = {
|
||||||
.txq_free_tfd = iwl3945_hw_txq_free_tfd,
|
.txq_free_tfd = iwl3945_hw_txq_free_tfd,
|
||||||
.txq_init = iwl3945_hw_tx_queue_init,
|
.txq_init = iwl3945_hw_tx_queue_init,
|
||||||
.load_ucode = iwl3945_load_bsm,
|
.load_ucode = iwl3945_load_bsm,
|
||||||
|
.dump_nic_event_log = iwl3945_dump_nic_event_log,
|
||||||
|
.dump_nic_error_log = iwl3945_dump_nic_error_log,
|
||||||
.apm_ops = {
|
.apm_ops = {
|
||||||
.init = iwl3945_apm_init,
|
.init = iwl3945_apm_init,
|
||||||
.reset = iwl3945_apm_reset,
|
.reset = iwl3945_apm_reset,
|
||||||
|
|
|
@ -209,6 +209,8 @@ extern int __must_check iwl3945_send_cmd(struct iwl_priv *priv,
|
||||||
struct iwl_host_cmd *cmd);
|
struct iwl_host_cmd *cmd);
|
||||||
extern unsigned int iwl3945_fill_beacon_frame(struct iwl_priv *priv,
|
extern unsigned int iwl3945_fill_beacon_frame(struct iwl_priv *priv,
|
||||||
struct ieee80211_hdr *hdr,int left);
|
struct ieee80211_hdr *hdr,int left);
|
||||||
|
extern void iwl3945_dump_nic_event_log(struct iwl_priv *priv);
|
||||||
|
extern void iwl3945_dump_nic_error_log(struct iwl_priv *priv);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Currently used by iwl-3945-rs... look at restructuring so that it doesn't
|
* Currently used by iwl-3945-rs... look at restructuring so that it doesn't
|
||||||
|
|
|
@ -2298,6 +2298,8 @@ static struct iwl_lib_ops iwl4965_lib = {
|
||||||
.alive_notify = iwl4965_alive_notify,
|
.alive_notify = iwl4965_alive_notify,
|
||||||
.init_alive_start = iwl4965_init_alive_start,
|
.init_alive_start = iwl4965_init_alive_start,
|
||||||
.load_ucode = iwl4965_load_bsm,
|
.load_ucode = iwl4965_load_bsm,
|
||||||
|
.dump_nic_event_log = iwl_dump_nic_event_log,
|
||||||
|
.dump_nic_error_log = iwl_dump_nic_error_log,
|
||||||
.apm_ops = {
|
.apm_ops = {
|
||||||
.init = iwl4965_apm_init,
|
.init = iwl4965_apm_init,
|
||||||
.reset = iwl4965_apm_reset,
|
.reset = iwl4965_apm_reset,
|
||||||
|
|
|
@ -1535,6 +1535,8 @@ struct iwl_lib_ops iwl5000_lib = {
|
||||||
.rx_handler_setup = iwl5000_rx_handler_setup,
|
.rx_handler_setup = iwl5000_rx_handler_setup,
|
||||||
.setup_deferred_work = iwl5000_setup_deferred_work,
|
.setup_deferred_work = iwl5000_setup_deferred_work,
|
||||||
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
||||||
|
.dump_nic_event_log = iwl_dump_nic_event_log,
|
||||||
|
.dump_nic_error_log = iwl_dump_nic_error_log,
|
||||||
.load_ucode = iwl5000_load_ucode,
|
.load_ucode = iwl5000_load_ucode,
|
||||||
.init_alive_start = iwl5000_init_alive_start,
|
.init_alive_start = iwl5000_init_alive_start,
|
||||||
.alive_notify = iwl5000_alive_notify,
|
.alive_notify = iwl5000_alive_notify,
|
||||||
|
@ -1585,6 +1587,8 @@ static struct iwl_lib_ops iwl5150_lib = {
|
||||||
.rx_handler_setup = iwl5000_rx_handler_setup,
|
.rx_handler_setup = iwl5000_rx_handler_setup,
|
||||||
.setup_deferred_work = iwl5000_setup_deferred_work,
|
.setup_deferred_work = iwl5000_setup_deferred_work,
|
||||||
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
||||||
|
.dump_nic_event_log = iwl_dump_nic_event_log,
|
||||||
|
.dump_nic_error_log = iwl_dump_nic_error_log,
|
||||||
.load_ucode = iwl5000_load_ucode,
|
.load_ucode = iwl5000_load_ucode,
|
||||||
.init_alive_start = iwl5000_init_alive_start,
|
.init_alive_start = iwl5000_init_alive_start,
|
||||||
.alive_notify = iwl5000_alive_notify,
|
.alive_notify = iwl5000_alive_notify,
|
||||||
|
|
|
@ -100,6 +100,8 @@ static struct iwl_lib_ops iwl6000_lib = {
|
||||||
.setup_deferred_work = iwl5000_setup_deferred_work,
|
.setup_deferred_work = iwl5000_setup_deferred_work,
|
||||||
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
||||||
.load_ucode = iwl5000_load_ucode,
|
.load_ucode = iwl5000_load_ucode,
|
||||||
|
.dump_nic_event_log = iwl_dump_nic_event_log,
|
||||||
|
.dump_nic_error_log = iwl_dump_nic_error_log,
|
||||||
.init_alive_start = iwl5000_init_alive_start,
|
.init_alive_start = iwl5000_init_alive_start,
|
||||||
.alive_notify = iwl5000_alive_notify,
|
.alive_notify = iwl5000_alive_notify,
|
||||||
.send_tx_power = iwl5000_send_tx_power,
|
.send_tx_power = iwl5000_send_tx_power,
|
||||||
|
|
|
@ -1526,6 +1526,191 @@ static int iwl_read_ucode(struct iwl_priv *priv)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
static const char *desc_lookup_text[] = {
|
||||||
|
"OK",
|
||||||
|
"FAIL",
|
||||||
|
"BAD_PARAM",
|
||||||
|
"BAD_CHECKSUM",
|
||||||
|
"NMI_INTERRUPT_WDG",
|
||||||
|
"SYSASSERT",
|
||||||
|
"FATAL_ERROR",
|
||||||
|
"BAD_COMMAND",
|
||||||
|
"HW_ERROR_TUNE_LOCK",
|
||||||
|
"HW_ERROR_TEMPERATURE",
|
||||||
|
"ILLEGAL_CHAN_FREQ",
|
||||||
|
"VCC_NOT_STABLE",
|
||||||
|
"FH_ERROR",
|
||||||
|
"NMI_INTERRUPT_HOST",
|
||||||
|
"NMI_INTERRUPT_ACTION_PT",
|
||||||
|
"NMI_INTERRUPT_UNKNOWN",
|
||||||
|
"UCODE_VERSION_MISMATCH",
|
||||||
|
"HW_ERROR_ABS_LOCK",
|
||||||
|
"HW_ERROR_CAL_LOCK_FAIL",
|
||||||
|
"NMI_INTERRUPT_INST_ACTION_PT",
|
||||||
|
"NMI_INTERRUPT_DATA_ACTION_PT",
|
||||||
|
"NMI_TRM_HW_ER",
|
||||||
|
"NMI_INTERRUPT_TRM",
|
||||||
|
"NMI_INTERRUPT_BREAK_POINT"
|
||||||
|
"DEBUG_0",
|
||||||
|
"DEBUG_1",
|
||||||
|
"DEBUG_2",
|
||||||
|
"DEBUG_3",
|
||||||
|
"UNKNOWN"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *desc_lookup(int i)
|
||||||
|
{
|
||||||
|
int max = ARRAY_SIZE(desc_lookup_text) - 1;
|
||||||
|
|
||||||
|
if (i < 0 || i > max)
|
||||||
|
i = max;
|
||||||
|
|
||||||
|
return desc_lookup_text[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ERROR_START_OFFSET (1 * sizeof(u32))
|
||||||
|
#define ERROR_ELEM_SIZE (7 * sizeof(u32))
|
||||||
|
|
||||||
|
void iwl_dump_nic_error_log(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
u32 data2, line;
|
||||||
|
u32 desc, time, count, base, data1;
|
||||||
|
u32 blink1, blink2, ilink1, ilink2;
|
||||||
|
|
||||||
|
if (priv->ucode_type == UCODE_INIT)
|
||||||
|
base = le32_to_cpu(priv->card_alive_init.error_event_table_ptr);
|
||||||
|
else
|
||||||
|
base = le32_to_cpu(priv->card_alive.error_event_table_ptr);
|
||||||
|
|
||||||
|
if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
|
||||||
|
IWL_ERR(priv, "Not valid error log pointer 0x%08X\n", base);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
count = iwl_read_targ_mem(priv, base);
|
||||||
|
|
||||||
|
if (ERROR_START_OFFSET <= count * ERROR_ELEM_SIZE) {
|
||||||
|
IWL_ERR(priv, "Start IWL Error Log Dump:\n");
|
||||||
|
IWL_ERR(priv, "Status: 0x%08lX, count: %d\n",
|
||||||
|
priv->status, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
desc = iwl_read_targ_mem(priv, base + 1 * sizeof(u32));
|
||||||
|
blink1 = iwl_read_targ_mem(priv, base + 3 * sizeof(u32));
|
||||||
|
blink2 = iwl_read_targ_mem(priv, base + 4 * sizeof(u32));
|
||||||
|
ilink1 = iwl_read_targ_mem(priv, base + 5 * sizeof(u32));
|
||||||
|
ilink2 = iwl_read_targ_mem(priv, base + 6 * sizeof(u32));
|
||||||
|
data1 = iwl_read_targ_mem(priv, base + 7 * sizeof(u32));
|
||||||
|
data2 = iwl_read_targ_mem(priv, base + 8 * sizeof(u32));
|
||||||
|
line = iwl_read_targ_mem(priv, base + 9 * sizeof(u32));
|
||||||
|
time = iwl_read_targ_mem(priv, base + 11 * sizeof(u32));
|
||||||
|
|
||||||
|
IWL_ERR(priv, "Desc Time "
|
||||||
|
"data1 data2 line\n");
|
||||||
|
IWL_ERR(priv, "%-28s (#%02d) %010u 0x%08X 0x%08X %u\n",
|
||||||
|
desc_lookup(desc), desc, time, data1, data2, line);
|
||||||
|
IWL_ERR(priv, "blink1 blink2 ilink1 ilink2\n");
|
||||||
|
IWL_ERR(priv, "0x%05X 0x%05X 0x%05X 0x%05X\n", blink1, blink2,
|
||||||
|
ilink1, ilink2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#define EVENT_START_OFFSET (4 * sizeof(u32))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* iwl_print_event_log - Dump error event log to syslog
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static void iwl_print_event_log(struct iwl_priv *priv, u32 start_idx,
|
||||||
|
u32 num_events, u32 mode)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
u32 base; /* SRAM byte address of event log header */
|
||||||
|
u32 event_size; /* 2 u32s, or 3 u32s if timestamp recorded */
|
||||||
|
u32 ptr; /* SRAM byte address of log data */
|
||||||
|
u32 ev, time, data; /* event log data */
|
||||||
|
|
||||||
|
if (num_events == 0)
|
||||||
|
return;
|
||||||
|
if (priv->ucode_type == UCODE_INIT)
|
||||||
|
base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr);
|
||||||
|
else
|
||||||
|
base = le32_to_cpu(priv->card_alive.log_event_table_ptr);
|
||||||
|
|
||||||
|
if (mode == 0)
|
||||||
|
event_size = 2 * sizeof(u32);
|
||||||
|
else
|
||||||
|
event_size = 3 * sizeof(u32);
|
||||||
|
|
||||||
|
ptr = base + EVENT_START_OFFSET + (start_idx * event_size);
|
||||||
|
|
||||||
|
/* "time" is actually "data" for mode 0 (no timestamp).
|
||||||
|
* place event id # at far right for easier visual parsing. */
|
||||||
|
for (i = 0; i < num_events; i++) {
|
||||||
|
ev = iwl_read_targ_mem(priv, ptr);
|
||||||
|
ptr += sizeof(u32);
|
||||||
|
time = iwl_read_targ_mem(priv, ptr);
|
||||||
|
ptr += sizeof(u32);
|
||||||
|
if (mode == 0) {
|
||||||
|
/* data, ev */
|
||||||
|
IWL_ERR(priv, "EVT_LOG:0x%08x:%04u\n", time, ev);
|
||||||
|
} else {
|
||||||
|
data = iwl_read_targ_mem(priv, ptr);
|
||||||
|
ptr += sizeof(u32);
|
||||||
|
IWL_ERR(priv, "EVT_LOGT:%010u:0x%08x:%04u\n",
|
||||||
|
time, data, ev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void iwl_dump_nic_event_log(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
u32 base; /* SRAM byte address of event log header */
|
||||||
|
u32 capacity; /* event log capacity in # entries */
|
||||||
|
u32 mode; /* 0 - no timestamp, 1 - timestamp recorded */
|
||||||
|
u32 num_wraps; /* # times uCode wrapped to top of log */
|
||||||
|
u32 next_entry; /* index of next entry to be written by uCode */
|
||||||
|
u32 size; /* # entries that we'll print */
|
||||||
|
|
||||||
|
if (priv->ucode_type == UCODE_INIT)
|
||||||
|
base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr);
|
||||||
|
else
|
||||||
|
base = le32_to_cpu(priv->card_alive.log_event_table_ptr);
|
||||||
|
|
||||||
|
if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
|
||||||
|
IWL_ERR(priv, "Invalid event log pointer 0x%08X\n", base);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* event log header */
|
||||||
|
capacity = iwl_read_targ_mem(priv, base);
|
||||||
|
mode = iwl_read_targ_mem(priv, base + (1 * sizeof(u32)));
|
||||||
|
num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32)));
|
||||||
|
next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32)));
|
||||||
|
|
||||||
|
size = num_wraps ? capacity : next_entry;
|
||||||
|
|
||||||
|
/* bail out if nothing in log */
|
||||||
|
if (size == 0) {
|
||||||
|
IWL_ERR(priv, "Start IWL Event Log Dump: nothing in log\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IWL_ERR(priv, "Start IWL Event Log Dump: display count %d, wraps %d\n",
|
||||||
|
size, num_wraps);
|
||||||
|
|
||||||
|
/* if uCode has wrapped back to top of log, start at the oldest entry,
|
||||||
|
* i.e the next one that uCode would fill. */
|
||||||
|
if (num_wraps)
|
||||||
|
iwl_print_event_log(priv, next_entry,
|
||||||
|
capacity - next_entry, mode);
|
||||||
|
/* (then/else) start at top of log */
|
||||||
|
iwl_print_event_log(priv, 0, next_entry, mode);
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* iwl_alive_start - called after REPLY_ALIVE notification received
|
* iwl_alive_start - called after REPLY_ALIVE notification received
|
||||||
* from protocol/runtime uCode (initialization uCode's
|
* from protocol/runtime uCode (initialization uCode's
|
||||||
|
|
|
@ -1309,189 +1309,6 @@ static void iwl_print_rx_config_cmd(struct iwl_priv *priv)
|
||||||
IWL_DEBUG_RADIO(priv, "u8[6] bssid_addr: %pM\n", rxon->bssid_addr);
|
IWL_DEBUG_RADIO(priv, "u8[6] bssid_addr: %pM\n", rxon->bssid_addr);
|
||||||
IWL_DEBUG_RADIO(priv, "u16 assoc_id: 0x%x\n", le16_to_cpu(rxon->assoc_id));
|
IWL_DEBUG_RADIO(priv, "u16 assoc_id: 0x%x\n", le16_to_cpu(rxon->assoc_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *desc_lookup_text[] = {
|
|
||||||
"OK",
|
|
||||||
"FAIL",
|
|
||||||
"BAD_PARAM",
|
|
||||||
"BAD_CHECKSUM",
|
|
||||||
"NMI_INTERRUPT_WDG",
|
|
||||||
"SYSASSERT",
|
|
||||||
"FATAL_ERROR",
|
|
||||||
"BAD_COMMAND",
|
|
||||||
"HW_ERROR_TUNE_LOCK",
|
|
||||||
"HW_ERROR_TEMPERATURE",
|
|
||||||
"ILLEGAL_CHAN_FREQ",
|
|
||||||
"VCC_NOT_STABLE",
|
|
||||||
"FH_ERROR",
|
|
||||||
"NMI_INTERRUPT_HOST",
|
|
||||||
"NMI_INTERRUPT_ACTION_PT",
|
|
||||||
"NMI_INTERRUPT_UNKNOWN",
|
|
||||||
"UCODE_VERSION_MISMATCH",
|
|
||||||
"HW_ERROR_ABS_LOCK",
|
|
||||||
"HW_ERROR_CAL_LOCK_FAIL",
|
|
||||||
"NMI_INTERRUPT_INST_ACTION_PT",
|
|
||||||
"NMI_INTERRUPT_DATA_ACTION_PT",
|
|
||||||
"NMI_TRM_HW_ER",
|
|
||||||
"NMI_INTERRUPT_TRM",
|
|
||||||
"NMI_INTERRUPT_BREAK_POINT"
|
|
||||||
"DEBUG_0",
|
|
||||||
"DEBUG_1",
|
|
||||||
"DEBUG_2",
|
|
||||||
"DEBUG_3",
|
|
||||||
"UNKNOWN"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *desc_lookup(int i)
|
|
||||||
{
|
|
||||||
int max = ARRAY_SIZE(desc_lookup_text) - 1;
|
|
||||||
|
|
||||||
if (i < 0 || i > max)
|
|
||||||
i = max;
|
|
||||||
|
|
||||||
return desc_lookup_text[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ERROR_START_OFFSET (1 * sizeof(u32))
|
|
||||||
#define ERROR_ELEM_SIZE (7 * sizeof(u32))
|
|
||||||
|
|
||||||
static void iwl_dump_nic_error_log(struct iwl_priv *priv)
|
|
||||||
{
|
|
||||||
u32 data2, line;
|
|
||||||
u32 desc, time, count, base, data1;
|
|
||||||
u32 blink1, blink2, ilink1, ilink2;
|
|
||||||
|
|
||||||
if (priv->ucode_type == UCODE_INIT)
|
|
||||||
base = le32_to_cpu(priv->card_alive_init.error_event_table_ptr);
|
|
||||||
else
|
|
||||||
base = le32_to_cpu(priv->card_alive.error_event_table_ptr);
|
|
||||||
|
|
||||||
if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
|
|
||||||
IWL_ERR(priv, "Not valid error log pointer 0x%08X\n", base);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
count = iwl_read_targ_mem(priv, base);
|
|
||||||
|
|
||||||
if (ERROR_START_OFFSET <= count * ERROR_ELEM_SIZE) {
|
|
||||||
IWL_ERR(priv, "Start IWL Error Log Dump:\n");
|
|
||||||
IWL_ERR(priv, "Status: 0x%08lX, count: %d\n",
|
|
||||||
priv->status, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
desc = iwl_read_targ_mem(priv, base + 1 * sizeof(u32));
|
|
||||||
blink1 = iwl_read_targ_mem(priv, base + 3 * sizeof(u32));
|
|
||||||
blink2 = iwl_read_targ_mem(priv, base + 4 * sizeof(u32));
|
|
||||||
ilink1 = iwl_read_targ_mem(priv, base + 5 * sizeof(u32));
|
|
||||||
ilink2 = iwl_read_targ_mem(priv, base + 6 * sizeof(u32));
|
|
||||||
data1 = iwl_read_targ_mem(priv, base + 7 * sizeof(u32));
|
|
||||||
data2 = iwl_read_targ_mem(priv, base + 8 * sizeof(u32));
|
|
||||||
line = iwl_read_targ_mem(priv, base + 9 * sizeof(u32));
|
|
||||||
time = iwl_read_targ_mem(priv, base + 11 * sizeof(u32));
|
|
||||||
|
|
||||||
IWL_ERR(priv, "Desc Time "
|
|
||||||
"data1 data2 line\n");
|
|
||||||
IWL_ERR(priv, "%-28s (#%02d) %010u 0x%08X 0x%08X %u\n",
|
|
||||||
desc_lookup(desc), desc, time, data1, data2, line);
|
|
||||||
IWL_ERR(priv, "blink1 blink2 ilink1 ilink2\n");
|
|
||||||
IWL_ERR(priv, "0x%05X 0x%05X 0x%05X 0x%05X\n", blink1, blink2,
|
|
||||||
ilink1, ilink2);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#define EVENT_START_OFFSET (4 * sizeof(u32))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* iwl_print_event_log - Dump error event log to syslog
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static void iwl_print_event_log(struct iwl_priv *priv, u32 start_idx,
|
|
||||||
u32 num_events, u32 mode)
|
|
||||||
{
|
|
||||||
u32 i;
|
|
||||||
u32 base; /* SRAM byte address of event log header */
|
|
||||||
u32 event_size; /* 2 u32s, or 3 u32s if timestamp recorded */
|
|
||||||
u32 ptr; /* SRAM byte address of log data */
|
|
||||||
u32 ev, time, data; /* event log data */
|
|
||||||
|
|
||||||
if (num_events == 0)
|
|
||||||
return;
|
|
||||||
if (priv->ucode_type == UCODE_INIT)
|
|
||||||
base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr);
|
|
||||||
else
|
|
||||||
base = le32_to_cpu(priv->card_alive.log_event_table_ptr);
|
|
||||||
|
|
||||||
if (mode == 0)
|
|
||||||
event_size = 2 * sizeof(u32);
|
|
||||||
else
|
|
||||||
event_size = 3 * sizeof(u32);
|
|
||||||
|
|
||||||
ptr = base + EVENT_START_OFFSET + (start_idx * event_size);
|
|
||||||
|
|
||||||
/* "time" is actually "data" for mode 0 (no timestamp).
|
|
||||||
* place event id # at far right for easier visual parsing. */
|
|
||||||
for (i = 0; i < num_events; i++) {
|
|
||||||
ev = iwl_read_targ_mem(priv, ptr);
|
|
||||||
ptr += sizeof(u32);
|
|
||||||
time = iwl_read_targ_mem(priv, ptr);
|
|
||||||
ptr += sizeof(u32);
|
|
||||||
if (mode == 0) {
|
|
||||||
/* data, ev */
|
|
||||||
IWL_ERR(priv, "EVT_LOG:0x%08x:%04u\n", time, ev);
|
|
||||||
} else {
|
|
||||||
data = iwl_read_targ_mem(priv, ptr);
|
|
||||||
ptr += sizeof(u32);
|
|
||||||
IWL_ERR(priv, "EVT_LOGT:%010u:0x%08x:%04u\n",
|
|
||||||
time, data, ev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void iwl_dump_nic_event_log(struct iwl_priv *priv)
|
|
||||||
{
|
|
||||||
u32 base; /* SRAM byte address of event log header */
|
|
||||||
u32 capacity; /* event log capacity in # entries */
|
|
||||||
u32 mode; /* 0 - no timestamp, 1 - timestamp recorded */
|
|
||||||
u32 num_wraps; /* # times uCode wrapped to top of log */
|
|
||||||
u32 next_entry; /* index of next entry to be written by uCode */
|
|
||||||
u32 size; /* # entries that we'll print */
|
|
||||||
|
|
||||||
if (priv->ucode_type == UCODE_INIT)
|
|
||||||
base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr);
|
|
||||||
else
|
|
||||||
base = le32_to_cpu(priv->card_alive.log_event_table_ptr);
|
|
||||||
|
|
||||||
if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
|
|
||||||
IWL_ERR(priv, "Invalid event log pointer 0x%08X\n", base);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* event log header */
|
|
||||||
capacity = iwl_read_targ_mem(priv, base);
|
|
||||||
mode = iwl_read_targ_mem(priv, base + (1 * sizeof(u32)));
|
|
||||||
num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32)));
|
|
||||||
next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32)));
|
|
||||||
|
|
||||||
size = num_wraps ? capacity : next_entry;
|
|
||||||
|
|
||||||
/* bail out if nothing in log */
|
|
||||||
if (size == 0) {
|
|
||||||
IWL_ERR(priv, "Start IWL Event Log Dump: nothing in log\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
IWL_ERR(priv, "Start IWL Event Log Dump: display count %d, wraps %d\n",
|
|
||||||
size, num_wraps);
|
|
||||||
|
|
||||||
/* if uCode has wrapped back to top of log, start at the oldest entry,
|
|
||||||
* i.e the next one that uCode would fill. */
|
|
||||||
if (num_wraps)
|
|
||||||
iwl_print_event_log(priv, next_entry,
|
|
||||||
capacity - next_entry, mode);
|
|
||||||
/* (then/else) start at top of log */
|
|
||||||
iwl_print_event_log(priv, 0, next_entry, mode);
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
/**
|
/**
|
||||||
* iwl_irq_handle_error - called for HW or SW error interrupt from card
|
* iwl_irq_handle_error - called for HW or SW error interrupt from card
|
||||||
|
@ -1506,8 +1323,8 @@ void iwl_irq_handle_error(struct iwl_priv *priv)
|
||||||
|
|
||||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
if (iwl_get_debug_level(priv) & IWL_DL_FW_ERRORS) {
|
if (iwl_get_debug_level(priv) & IWL_DL_FW_ERRORS) {
|
||||||
iwl_dump_nic_error_log(priv);
|
priv->cfg->ops->lib->dump_nic_error_log(priv);
|
||||||
iwl_dump_nic_event_log(priv);
|
priv->cfg->ops->lib->dump_nic_event_log(priv);
|
||||||
iwl_print_rx_config_cmd(priv);
|
iwl_print_rx_config_cmd(priv);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -166,6 +166,8 @@ struct iwl_lib_ops {
|
||||||
int (*is_valid_rtc_data_addr)(u32 addr);
|
int (*is_valid_rtc_data_addr)(u32 addr);
|
||||||
/* 1st ucode load */
|
/* 1st ucode load */
|
||||||
int (*load_ucode)(struct iwl_priv *priv);
|
int (*load_ucode)(struct iwl_priv *priv);
|
||||||
|
void (*dump_nic_event_log)(struct iwl_priv *priv);
|
||||||
|
void (*dump_nic_error_log)(struct iwl_priv *priv);
|
||||||
/* power management */
|
/* power management */
|
||||||
struct iwl_apm_ops apm_ops;
|
struct iwl_apm_ops apm_ops;
|
||||||
|
|
||||||
|
@ -540,7 +542,19 @@ int iwl_pci_resume(struct pci_dev *pdev);
|
||||||
/*****************************************************
|
/*****************************************************
|
||||||
* Error Handling Debugging
|
* Error Handling Debugging
|
||||||
******************************************************/
|
******************************************************/
|
||||||
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
void iwl_dump_nic_event_log(struct iwl_priv *priv);
|
void iwl_dump_nic_event_log(struct iwl_priv *priv);
|
||||||
|
void iwl_dump_nic_error_log(struct iwl_priv *priv);
|
||||||
|
#else
|
||||||
|
static inline void iwl_dump_nic_event_log(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void iwl_dump_nic_error_log(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void iwl_clear_isr_stats(struct iwl_priv *priv);
|
void iwl_clear_isr_stats(struct iwl_priv *priv);
|
||||||
|
|
||||||
/*****************************************************
|
/*****************************************************
|
||||||
|
|
|
@ -410,7 +410,7 @@ static ssize_t iwl_dbgfs_nvm_read(struct file *file,
|
||||||
pos += scnprintf(buf + pos, buf_size - pos, "0x%.4x ", ofs);
|
pos += scnprintf(buf + pos, buf_size - pos, "0x%.4x ", ofs);
|
||||||
hex_dump_to_buffer(ptr + ofs, 16 , 16, 2, buf + pos,
|
hex_dump_to_buffer(ptr + ofs, 16 , 16, 2, buf + pos,
|
||||||
buf_size - pos, 0);
|
buf_size - pos, 0);
|
||||||
pos += strlen(buf);
|
pos += strlen(buf + pos);
|
||||||
if (buf_size - pos > 0)
|
if (buf_size - pos > 0)
|
||||||
buf[pos++] = '\n';
|
buf[pos++] = '\n';
|
||||||
}
|
}
|
||||||
|
@ -436,7 +436,7 @@ static ssize_t iwl_dbgfs_log_event_write(struct file *file,
|
||||||
if (sscanf(buf, "%d", &event_log_flag) != 1)
|
if (sscanf(buf, "%d", &event_log_flag) != 1)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (event_log_flag == 1)
|
if (event_log_flag == 1)
|
||||||
iwl_dump_nic_event_log(priv);
|
priv->cfg->ops->lib->dump_nic_event_log(priv);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
@ -909,7 +909,7 @@ static ssize_t iwl_dbgfs_traffic_log_read(struct file *file,
|
||||||
"0x%.4x ", ofs);
|
"0x%.4x ", ofs);
|
||||||
hex_dump_to_buffer(ptr + ofs, 16, 16, 2,
|
hex_dump_to_buffer(ptr + ofs, 16, 16, 2,
|
||||||
buf + pos, bufsz - pos, 0);
|
buf + pos, bufsz - pos, 0);
|
||||||
pos += strlen(buf);
|
pos += strlen(buf + pos);
|
||||||
if (bufsz - pos > 0)
|
if (bufsz - pos > 0)
|
||||||
buf[pos++] = '\n';
|
buf[pos++] = '\n';
|
||||||
}
|
}
|
||||||
|
@ -932,7 +932,7 @@ static ssize_t iwl_dbgfs_traffic_log_read(struct file *file,
|
||||||
"0x%.4x ", ofs);
|
"0x%.4x ", ofs);
|
||||||
hex_dump_to_buffer(ptr + ofs, 16, 16, 2,
|
hex_dump_to_buffer(ptr + ofs, 16, 16, 2,
|
||||||
buf + pos, bufsz - pos, 0);
|
buf + pos, bufsz - pos, 0);
|
||||||
pos += strlen(buf);
|
pos += strlen(buf + pos);
|
||||||
if (bufsz - pos > 0)
|
if (bufsz - pos > 0)
|
||||||
buf[pos++] = '\n';
|
buf[pos++] = '\n';
|
||||||
}
|
}
|
||||||
|
|
|
@ -197,6 +197,12 @@ void iwl_cmd_queue_free(struct iwl_priv *priv)
|
||||||
pci_free_consistent(dev, priv->hw_params.tfd_size *
|
pci_free_consistent(dev, priv->hw_params.tfd_size *
|
||||||
txq->q.n_bd, txq->tfds, txq->q.dma_addr);
|
txq->q.n_bd, txq->tfds, txq->q.dma_addr);
|
||||||
|
|
||||||
|
/* deallocate arrays */
|
||||||
|
kfree(txq->cmd);
|
||||||
|
kfree(txq->meta);
|
||||||
|
txq->cmd = NULL;
|
||||||
|
txq->meta = NULL;
|
||||||
|
|
||||||
/* 0-fill queue descriptor structure */
|
/* 0-fill queue descriptor structure */
|
||||||
memset(txq, 0, sizeof(*txq));
|
memset(txq, 0, sizeof(*txq));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1481,6 +1481,7 @@ static inline void iwl_synchronize_irq(struct iwl_priv *priv)
|
||||||
tasklet_kill(&priv->irq_tasklet);
|
tasklet_kill(&priv->irq_tasklet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
static const char *desc_lookup(int i)
|
static const char *desc_lookup(int i)
|
||||||
{
|
{
|
||||||
switch (i) {
|
switch (i) {
|
||||||
|
@ -1504,7 +1505,7 @@ static const char *desc_lookup(int i)
|
||||||
#define ERROR_START_OFFSET (1 * sizeof(u32))
|
#define ERROR_START_OFFSET (1 * sizeof(u32))
|
||||||
#define ERROR_ELEM_SIZE (7 * sizeof(u32))
|
#define ERROR_ELEM_SIZE (7 * sizeof(u32))
|
||||||
|
|
||||||
static void iwl3945_dump_nic_error_log(struct iwl_priv *priv)
|
void iwl3945_dump_nic_error_log(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
u32 i;
|
u32 i;
|
||||||
u32 desc, time, count, base, data1;
|
u32 desc, time, count, base, data1;
|
||||||
|
@ -1598,7 +1599,7 @@ static void iwl3945_print_event_log(struct iwl_priv *priv, u32 start_idx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iwl3945_dump_nic_event_log(struct iwl_priv *priv)
|
void iwl3945_dump_nic_event_log(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
u32 base; /* SRAM byte address of event log header */
|
u32 base; /* SRAM byte address of event log header */
|
||||||
u32 capacity; /* event log capacity in # entries */
|
u32 capacity; /* event log capacity in # entries */
|
||||||
|
@ -1640,6 +1641,16 @@ static void iwl3945_dump_nic_event_log(struct iwl_priv *priv)
|
||||||
iwl3945_print_event_log(priv, 0, next_entry, mode);
|
iwl3945_print_event_log(priv, 0, next_entry, mode);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
void iwl3945_dump_nic_event_log(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void iwl3945_dump_nic_error_log(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static void iwl3945_irq_tasklet(struct iwl_priv *priv)
|
static void iwl3945_irq_tasklet(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
|
@ -3683,21 +3694,6 @@ static ssize_t dump_error_log(struct device *d,
|
||||||
|
|
||||||
static DEVICE_ATTR(dump_errors, S_IWUSR, NULL, dump_error_log);
|
static DEVICE_ATTR(dump_errors, S_IWUSR, NULL, dump_error_log);
|
||||||
|
|
||||||
static ssize_t dump_event_log(struct device *d,
|
|
||||||
struct device_attribute *attr,
|
|
||||||
const char *buf, size_t count)
|
|
||||||
{
|
|
||||||
struct iwl_priv *priv = dev_get_drvdata(d);
|
|
||||||
char *p = (char *)buf;
|
|
||||||
|
|
||||||
if (p[0] == '1')
|
|
||||||
iwl3945_dump_nic_event_log(priv);
|
|
||||||
|
|
||||||
return strnlen(buf, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
static DEVICE_ATTR(dump_events, S_IWUSR, NULL, dump_event_log);
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* driver setup and tear down
|
* driver setup and tear down
|
||||||
|
@ -3742,7 +3738,6 @@ static struct attribute *iwl3945_sysfs_entries[] = {
|
||||||
&dev_attr_antenna.attr,
|
&dev_attr_antenna.attr,
|
||||||
&dev_attr_channels.attr,
|
&dev_attr_channels.attr,
|
||||||
&dev_attr_dump_errors.attr,
|
&dev_attr_dump_errors.attr,
|
||||||
&dev_attr_dump_events.attr,
|
|
||||||
&dev_attr_flags.attr,
|
&dev_attr_flags.attr,
|
||||||
&dev_attr_filter_flags.attr,
|
&dev_attr_filter_flags.attr,
|
||||||
#ifdef CONFIG_IWL3945_SPECTRUM_MEASUREMENT
|
#ifdef CONFIG_IWL3945_SPECTRUM_MEASUREMENT
|
||||||
|
|
|
@ -1041,6 +1041,9 @@ static int sony_nc_resume(struct acpi_device *device)
|
||||||
sony_backlight_update_status(sony_backlight_device) < 0)
|
sony_backlight_update_status(sony_backlight_device) < 0)
|
||||||
printk(KERN_WARNING DRV_PFX "unable to restore brightness level\n");
|
printk(KERN_WARNING DRV_PFX "unable to restore brightness level\n");
|
||||||
|
|
||||||
|
/* re-read rfkill state */
|
||||||
|
sony_nc_rfkill_update();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1078,6 +1081,8 @@ static int sony_nc_setup_rfkill(struct acpi_device *device,
|
||||||
struct rfkill *rfk;
|
struct rfkill *rfk;
|
||||||
enum rfkill_type type;
|
enum rfkill_type type;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
int result;
|
||||||
|
bool hwblock;
|
||||||
|
|
||||||
switch (nc_type) {
|
switch (nc_type) {
|
||||||
case SONY_WIFI:
|
case SONY_WIFI:
|
||||||
|
@ -1105,6 +1110,10 @@ static int sony_nc_setup_rfkill(struct acpi_device *device,
|
||||||
if (!rfk)
|
if (!rfk)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
sony_call_snc_handle(0x124, 0x200, &result);
|
||||||
|
hwblock = !(result & 0x1);
|
||||||
|
rfkill_set_hw_state(rfk, hwblock);
|
||||||
|
|
||||||
err = rfkill_register(rfk);
|
err = rfkill_register(rfk);
|
||||||
if (err) {
|
if (err) {
|
||||||
rfkill_destroy(rfk);
|
rfkill_destroy(rfk);
|
||||||
|
|
|
@ -14,6 +14,7 @@ extern int wext_handle_ioctl(struct net *net, struct ifreq *ifr, unsigned int cm
|
||||||
void __user *arg);
|
void __user *arg);
|
||||||
extern int compat_wext_handle_ioctl(struct net *net, unsigned int cmd,
|
extern int compat_wext_handle_ioctl(struct net *net, unsigned int cmd,
|
||||||
unsigned long arg);
|
unsigned long arg);
|
||||||
|
extern struct iw_statistics *get_wireless_stats(struct net_device *dev);
|
||||||
#else
|
#else
|
||||||
static inline int wext_proc_init(struct net *net)
|
static inline int wext_proc_init(struct net *net)
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include <net/sock.h>
|
#include <net/sock.h>
|
||||||
#include <linux/rtnetlink.h>
|
#include <linux/rtnetlink.h>
|
||||||
#include <linux/wireless.h>
|
#include <linux/wireless.h>
|
||||||
#include <net/iw_handler.h>
|
#include <net/wext.h>
|
||||||
|
|
||||||
#include "net-sysfs.h"
|
#include "net-sysfs.h"
|
||||||
|
|
||||||
|
@ -363,15 +363,13 @@ static ssize_t wireless_show(struct device *d, char *buf,
|
||||||
char *))
|
char *))
|
||||||
{
|
{
|
||||||
struct net_device *dev = to_net_dev(d);
|
struct net_device *dev = to_net_dev(d);
|
||||||
const struct iw_statistics *iw = NULL;
|
const struct iw_statistics *iw;
|
||||||
ssize_t ret = -EINVAL;
|
ssize_t ret = -EINVAL;
|
||||||
|
|
||||||
read_lock(&dev_base_lock);
|
read_lock(&dev_base_lock);
|
||||||
if (dev_isalive(dev)) {
|
if (dev_isalive(dev)) {
|
||||||
if (dev->wireless_handlers &&
|
iw = get_wireless_stats(dev);
|
||||||
dev->wireless_handlers->get_wireless_stats)
|
if (iw)
|
||||||
iw = dev->wireless_handlers->get_wireless_stats(dev);
|
|
||||||
if (iw != NULL)
|
|
||||||
ret = (*format)(iw, buf);
|
ret = (*format)(iw, buf);
|
||||||
}
|
}
|
||||||
read_unlock(&dev_base_lock);
|
read_unlock(&dev_base_lock);
|
||||||
|
@ -505,7 +503,7 @@ int netdev_register_kobject(struct net_device *net)
|
||||||
*groups++ = &netstat_group;
|
*groups++ = &netstat_group;
|
||||||
|
|
||||||
#ifdef CONFIG_WIRELESS_EXT_SYSFS
|
#ifdef CONFIG_WIRELESS_EXT_SYSFS
|
||||||
if (net->wireless_handlers && net->wireless_handlers->get_wireless_stats)
|
if (net->wireless_handlers || net->ieee80211_ptr)
|
||||||
*groups++ = &wireless_group;
|
*groups++ = &wireless_group;
|
||||||
#endif
|
#endif
|
||||||
#endif /* CONFIG_SYSFS */
|
#endif /* CONFIG_SYSFS */
|
||||||
|
|
|
@ -1388,8 +1388,8 @@ ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
|
reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
|
||||||
|
|
||||||
printk(KERN_DEBUG "%s: disassociated (Reason: %u)\n",
|
printk(KERN_DEBUG "%s: disassociated from %pM (Reason: %u)\n",
|
||||||
sdata->dev->name, reason_code);
|
sdata->dev->name, mgmt->sa, reason_code);
|
||||||
|
|
||||||
ieee80211_set_disassoc(sdata, false);
|
ieee80211_set_disassoc(sdata, false);
|
||||||
return RX_MGMT_CFG80211_DISASSOC;
|
return RX_MGMT_CFG80211_DISASSOC;
|
||||||
|
@ -1675,7 +1675,7 @@ static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
/* direct probe may be part of the association flow */
|
/* direct probe may be part of the association flow */
|
||||||
if (wk && wk->state == IEEE80211_MGD_STATE_PROBE) {
|
if (wk && wk->state == IEEE80211_MGD_STATE_PROBE) {
|
||||||
printk(KERN_DEBUG "%s direct probe responded\n",
|
printk(KERN_DEBUG "%s: direct probe responded\n",
|
||||||
sdata->dev->name);
|
sdata->dev->name);
|
||||||
wk->tries = 0;
|
wk->tries = 0;
|
||||||
wk->state = IEEE80211_MGD_STATE_AUTH;
|
wk->state = IEEE80211_MGD_STATE_AUTH;
|
||||||
|
@ -2502,9 +2502,6 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
||||||
struct ieee80211_mgd_work *wk;
|
struct ieee80211_mgd_work *wk;
|
||||||
const u8 *bssid = NULL;
|
const u8 *bssid = NULL;
|
||||||
|
|
||||||
printk(KERN_DEBUG "%s: deauthenticating by local choice (reason=%d)\n",
|
|
||||||
sdata->dev->name, req->reason_code);
|
|
||||||
|
|
||||||
mutex_lock(&ifmgd->mtx);
|
mutex_lock(&ifmgd->mtx);
|
||||||
|
|
||||||
if (ifmgd->associated && &ifmgd->associated->cbss == req->bss) {
|
if (ifmgd->associated && &ifmgd->associated->cbss == req->bss) {
|
||||||
|
@ -2532,6 +2529,9 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
mutex_unlock(&ifmgd->mtx);
|
mutex_unlock(&ifmgd->mtx);
|
||||||
|
|
||||||
|
printk(KERN_DEBUG "%s: deauthenticating from %pM by local choice (reason=%d)\n",
|
||||||
|
sdata->dev->name, bssid, req->reason_code);
|
||||||
|
|
||||||
ieee80211_send_deauth_disassoc(sdata, bssid,
|
ieee80211_send_deauth_disassoc(sdata, bssid,
|
||||||
IEEE80211_STYPE_DEAUTH, req->reason_code,
|
IEEE80211_STYPE_DEAUTH, req->reason_code,
|
||||||
cookie);
|
cookie);
|
||||||
|
@ -2545,9 +2545,6 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||||
{
|
{
|
||||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||||
|
|
||||||
printk(KERN_DEBUG "%s: disassociating by local choice (reason=%d)\n",
|
|
||||||
sdata->dev->name, req->reason_code);
|
|
||||||
|
|
||||||
mutex_lock(&ifmgd->mtx);
|
mutex_lock(&ifmgd->mtx);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2561,6 +2558,9 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||||
return -ENOLINK;
|
return -ENOLINK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printk(KERN_DEBUG "%s: disassociating from %pM by local choice (reason=%d)\n",
|
||||||
|
sdata->dev->name, req->bss->bssid, req->reason_code);
|
||||||
|
|
||||||
ieee80211_set_disassoc(sdata, false);
|
ieee80211_set_disassoc(sdata, false);
|
||||||
|
|
||||||
mutex_unlock(&ifmgd->mtx);
|
mutex_unlock(&ifmgd->mtx);
|
||||||
|
|
|
@ -762,9 +762,8 @@ int __cfg80211_connect(struct cfg80211_registered_device *rdev,
|
||||||
wdev->conn->params.ssid = wdev->ssid;
|
wdev->conn->params.ssid = wdev->ssid;
|
||||||
wdev->conn->params.ssid_len = connect->ssid_len;
|
wdev->conn->params.ssid_len = connect->ssid_len;
|
||||||
|
|
||||||
/* don't care about result -- but fill bssid & channel */
|
/* see if we have the bss already */
|
||||||
if (!wdev->conn->params.bssid || !wdev->conn->params.channel)
|
bss = cfg80211_get_conn_bss(wdev);
|
||||||
bss = cfg80211_get_conn_bss(wdev);
|
|
||||||
|
|
||||||
wdev->sme_state = CFG80211_SME_CONNECTING;
|
wdev->sme_state = CFG80211_SME_CONNECTING;
|
||||||
wdev->connect_keys = connkeys;
|
wdev->connect_keys = connkeys;
|
||||||
|
|
|
@ -30,7 +30,8 @@ int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
|
||||||
if (wdev->wext.keys) {
|
if (wdev->wext.keys) {
|
||||||
wdev->wext.keys->def = wdev->wext.default_key;
|
wdev->wext.keys->def = wdev->wext.default_key;
|
||||||
wdev->wext.keys->defmgmt = wdev->wext.default_mgmt_key;
|
wdev->wext.keys->defmgmt = wdev->wext.default_mgmt_key;
|
||||||
wdev->wext.connect.privacy = true;
|
if (wdev->wext.default_key != -1)
|
||||||
|
wdev->wext.connect.privacy = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wdev->wext.connect.ssid_len)
|
if (!wdev->wext.connect.ssid_len)
|
||||||
|
@ -229,8 +230,7 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev,
|
||||||
data->flags = 1;
|
data->flags = 1;
|
||||||
data->length = wdev->wext.connect.ssid_len;
|
data->length = wdev->wext.connect.ssid_len;
|
||||||
memcpy(ssid, wdev->wext.connect.ssid, data->length);
|
memcpy(ssid, wdev->wext.connect.ssid, data->length);
|
||||||
} else
|
}
|
||||||
data->flags = 0;
|
|
||||||
wdev_unlock(wdev);
|
wdev_unlock(wdev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -306,8 +306,6 @@ int cfg80211_mgd_wext_giwap(struct net_device *dev,
|
||||||
wdev_lock(wdev);
|
wdev_lock(wdev);
|
||||||
if (wdev->current_bss)
|
if (wdev->current_bss)
|
||||||
memcpy(ap_addr->sa_data, wdev->current_bss->pub.bssid, ETH_ALEN);
|
memcpy(ap_addr->sa_data, wdev->current_bss->pub.bssid, ETH_ALEN);
|
||||||
else if (wdev->wext.connect.bssid)
|
|
||||||
memcpy(ap_addr->sa_data, wdev->wext.connect.bssid, ETH_ALEN);
|
|
||||||
else
|
else
|
||||||
memset(ap_addr->sa_data, 0, ETH_ALEN);
|
memset(ap_addr->sa_data, 0, ETH_ALEN);
|
||||||
wdev_unlock(wdev);
|
wdev_unlock(wdev);
|
||||||
|
|
|
@ -470,7 +470,7 @@ static iw_handler get_handler(struct net_device *dev, unsigned int cmd)
|
||||||
/*
|
/*
|
||||||
* Get statistics out of the driver
|
* Get statistics out of the driver
|
||||||
*/
|
*/
|
||||||
static struct iw_statistics *get_wireless_stats(struct net_device *dev)
|
struct iw_statistics *get_wireless_stats(struct net_device *dev)
|
||||||
{
|
{
|
||||||
/* New location */
|
/* New location */
|
||||||
if ((dev->wireless_handlers != NULL) &&
|
if ((dev->wireless_handlers != NULL) &&
|
||||||
|
@ -773,10 +773,13 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd,
|
||||||
essid_compat = 1;
|
essid_compat = 1;
|
||||||
else if (IW_IS_SET(cmd) && (iwp->length != 0)) {
|
else if (IW_IS_SET(cmd) && (iwp->length != 0)) {
|
||||||
char essid[IW_ESSID_MAX_SIZE + 1];
|
char essid[IW_ESSID_MAX_SIZE + 1];
|
||||||
|
unsigned int len;
|
||||||
|
len = iwp->length * descr->token_size;
|
||||||
|
|
||||||
err = copy_from_user(essid, iwp->pointer,
|
if (len > IW_ESSID_MAX_SIZE)
|
||||||
iwp->length *
|
return -EFAULT;
|
||||||
descr->token_size);
|
|
||||||
|
err = copy_from_user(essid, iwp->pointer, len);
|
||||||
if (err)
|
if (err)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue