Lines Matching refs:priv
201 static u32 ipw_qos_get_burst_duration(struct ipw_priv *priv);
203 static int ipw_send_qos_params_command(struct ipw_priv *priv, struct libipw_qos_parameters
205 static int ipw_send_qos_info_command(struct ipw_priv *priv, struct libipw_qos_information_element
210 static void ipw_remove_current_network(struct ipw_priv *priv);
211 static void ipw_rx(struct ipw_priv *priv);
212 static int ipw_queue_tx_reclaim(struct ipw_priv *priv,
214 static int ipw_queue_reset(struct ipw_priv *priv);
216 static int ipw_queue_tx_hcmd(struct ipw_priv *priv, int hcmd, void *buf,
229 static int init_supported_rates(struct ipw_priv *priv,
305 static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg);
313 static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value);
322 static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value);
331 static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value);
429 static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * data,
438 static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value) in _ipw_write_reg32() argument
440 IPW_DEBUG_IO(" %p : reg = 0x%8X : value = 0x%8X\n", priv, reg, value); in _ipw_write_reg32()
441 _ipw_write32(priv, IPW_INDIRECT_ADDR, reg); in _ipw_write_reg32()
442 _ipw_write32(priv, IPW_INDIRECT_DATA, value); in _ipw_write_reg32()
446 static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value) in _ipw_write_reg8() argument
452 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); in _ipw_write_reg8()
453 _ipw_write8(priv, IPW_INDIRECT_DATA + dif_len, value); in _ipw_write_reg8()
457 static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value) in _ipw_write_reg16() argument
463 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); in _ipw_write_reg16()
464 _ipw_write16(priv, IPW_INDIRECT_DATA + dif_len, value); in _ipw_write_reg16()
468 static u8 _ipw_read_reg8(struct ipw_priv *priv, u32 reg) in _ipw_read_reg8() argument
471 _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK); in _ipw_read_reg8()
473 word = _ipw_read32(priv, IPW_INDIRECT_DATA); in _ipw_read_reg8()
478 static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg) in _ipw_read_reg32() argument
482 IPW_DEBUG_IO("%p : reg = 0x%08x\n", priv, reg); in _ipw_read_reg32()
484 _ipw_write32(priv, IPW_INDIRECT_ADDR, reg); in _ipw_read_reg32()
485 value = _ipw_read32(priv, IPW_INDIRECT_DATA); in _ipw_read_reg32()
492 static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, in _ipw_read_indirect() argument
507 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); in _ipw_read_indirect()
510 *buf++ = _ipw_read8(priv, IPW_INDIRECT_DATA + i); in _ipw_read_indirect()
515 _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr); in _ipw_read_indirect()
517 *(u32 *) buf = _ipw_read32(priv, IPW_AUTOINC_DATA); in _ipw_read_indirect()
521 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); in _ipw_read_indirect()
523 *buf++ = ipw_read8(priv, IPW_INDIRECT_DATA + i); in _ipw_read_indirect()
529 static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, in _ipw_write_indirect() argument
544 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); in _ipw_write_indirect()
547 _ipw_write8(priv, IPW_INDIRECT_DATA + i, *buf); in _ipw_write_indirect()
552 _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr); in _ipw_write_indirect()
554 _ipw_write32(priv, IPW_AUTOINC_DATA, *(u32 *) buf); in _ipw_write_indirect()
558 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); in _ipw_write_indirect()
560 _ipw_write8(priv, IPW_INDIRECT_DATA + i, *buf); in _ipw_write_indirect()
566 static void ipw_write_direct(struct ipw_priv *priv, u32 addr, void *buf, in ipw_write_direct() argument
569 memcpy_toio((priv->hw_base + addr), buf, num); in ipw_write_direct()
573 static inline void ipw_set_bit(struct ipw_priv *priv, u32 reg, u32 mask) in ipw_set_bit() argument
575 ipw_write32(priv, reg, ipw_read32(priv, reg) | mask); in ipw_set_bit()
579 static inline void ipw_clear_bit(struct ipw_priv *priv, u32 reg, u32 mask) in ipw_clear_bit() argument
581 ipw_write32(priv, reg, ipw_read32(priv, reg) & ~mask); in ipw_clear_bit()
584 static inline void __ipw_enable_interrupts(struct ipw_priv *priv) in __ipw_enable_interrupts() argument
586 if (priv->status & STATUS_INT_ENABLED) in __ipw_enable_interrupts()
588 priv->status |= STATUS_INT_ENABLED; in __ipw_enable_interrupts()
589 ipw_write32(priv, IPW_INTA_MASK_R, IPW_INTA_MASK_ALL); in __ipw_enable_interrupts()
592 static inline void __ipw_disable_interrupts(struct ipw_priv *priv) in __ipw_disable_interrupts() argument
594 if (!(priv->status & STATUS_INT_ENABLED)) in __ipw_disable_interrupts()
596 priv->status &= ~STATUS_INT_ENABLED; in __ipw_disable_interrupts()
597 ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL); in __ipw_disable_interrupts()
600 static inline void ipw_enable_interrupts(struct ipw_priv *priv) in ipw_enable_interrupts() argument
604 spin_lock_irqsave(&priv->irq_lock, flags); in ipw_enable_interrupts()
605 __ipw_enable_interrupts(priv); in ipw_enable_interrupts()
606 spin_unlock_irqrestore(&priv->irq_lock, flags); in ipw_enable_interrupts()
609 static inline void ipw_disable_interrupts(struct ipw_priv *priv) in ipw_disable_interrupts() argument
613 spin_lock_irqsave(&priv->irq_lock, flags); in ipw_disable_interrupts()
614 __ipw_disable_interrupts(priv); in ipw_disable_interrupts()
615 spin_unlock_irqrestore(&priv->irq_lock, flags); in ipw_disable_interrupts()
656 static void ipw_dump_error_log(struct ipw_priv *priv, in ipw_dump_error_log() argument
685 static inline int ipw_is_init(struct ipw_priv *priv) in ipw_is_init() argument
687 return (priv->status & STATUS_INIT) ? 1 : 0; in ipw_is_init()
690 static int ipw_get_ordinal(struct ipw_priv *priv, u32 ord, void *val, u32 * len) in ipw_get_ordinal() argument
696 if (!priv || !val || !len) { in ipw_get_ordinal()
702 if (!priv->table0_addr || !priv->table1_addr || !priv->table2_addr) { in ipw_get_ordinal()
720 if (ord > priv->table0_len) { in ipw_get_ordinal()
722 "max (%i)\n", ord, priv->table0_len); in ipw_get_ordinal()
734 ord, priv->table0_addr + (ord << 2)); in ipw_get_ordinal()
738 *((u32 *) val) = ipw_read32(priv, priv->table0_addr + ord); in ipw_get_ordinal()
754 if (ord > priv->table1_len) { in ipw_get_ordinal()
767 ipw_read_reg32(priv, (priv->table1_addr + (ord << 2))); in ipw_get_ordinal()
785 if (ord > priv->table2_len) { in ipw_get_ordinal()
791 addr = ipw_read_reg32(priv, priv->table2_addr + (ord << 3)); in ipw_get_ordinal()
796 ipw_read_reg32(priv, in ipw_get_ordinal()
797 priv->table2_addr + (ord << 3) + in ipw_get_ordinal()
820 ipw_read_indirect(priv, addr, val, total_len); in ipw_get_ordinal()
832 static void ipw_init_ordinals(struct ipw_priv *priv) in ipw_init_ordinals() argument
834 priv->table0_addr = IPW_ORDINALS_TABLE_LOWER; in ipw_init_ordinals()
835 priv->table0_len = ipw_read32(priv, priv->table0_addr); in ipw_init_ordinals()
838 priv->table0_addr, priv->table0_len); in ipw_init_ordinals()
840 priv->table1_addr = ipw_read32(priv, IPW_ORDINALS_TABLE_1); in ipw_init_ordinals()
841 priv->table1_len = ipw_read_reg32(priv, priv->table1_addr); in ipw_init_ordinals()
844 priv->table1_addr, priv->table1_len); in ipw_init_ordinals()
846 priv->table2_addr = ipw_read32(priv, IPW_ORDINALS_TABLE_2); in ipw_init_ordinals()
847 priv->table2_len = ipw_read_reg32(priv, priv->table2_addr); in ipw_init_ordinals()
848 priv->table2_len &= 0x0000ffff; /* use first two bytes */ in ipw_init_ordinals()
851 priv->table2_addr, priv->table2_len); in ipw_init_ordinals()
880 static void ipw_led_link_on(struct ipw_priv *priv) in ipw_led_link_on() argument
887 if (priv->config & CFG_NO_LED || priv->nic_type == EEPROM_NIC_TYPE_1) in ipw_led_link_on()
890 spin_lock_irqsave(&priv->lock, flags); in ipw_led_link_on()
892 if (!(priv->status & STATUS_RF_KILL_MASK) && in ipw_led_link_on()
893 !(priv->status & STATUS_LED_LINK_ON)) { in ipw_led_link_on()
895 led = ipw_read_reg32(priv, IPW_EVENT_REG); in ipw_led_link_on()
896 led |= priv->led_association_on; in ipw_led_link_on()
901 ipw_write_reg32(priv, IPW_EVENT_REG, led); in ipw_led_link_on()
903 priv->status |= STATUS_LED_LINK_ON; in ipw_led_link_on()
906 if (!(priv->status & STATUS_ASSOCIATED)) in ipw_led_link_on()
907 schedule_delayed_work(&priv->led_link_off, in ipw_led_link_on()
911 spin_unlock_irqrestore(&priv->lock, flags); in ipw_led_link_on()
916 struct ipw_priv *priv = in ipw_bg_led_link_on() local
918 mutex_lock(&priv->mutex); in ipw_bg_led_link_on()
919 ipw_led_link_on(priv); in ipw_bg_led_link_on()
920 mutex_unlock(&priv->mutex); in ipw_bg_led_link_on()
923 static void ipw_led_link_off(struct ipw_priv *priv) in ipw_led_link_off() argument
930 if (priv->config & CFG_NO_LED || priv->nic_type == EEPROM_NIC_TYPE_1) in ipw_led_link_off()
933 spin_lock_irqsave(&priv->lock, flags); in ipw_led_link_off()
935 if (priv->status & STATUS_LED_LINK_ON) { in ipw_led_link_off()
936 led = ipw_read_reg32(priv, IPW_EVENT_REG); in ipw_led_link_off()
937 led &= priv->led_association_off; in ipw_led_link_off()
941 ipw_write_reg32(priv, IPW_EVENT_REG, led); in ipw_led_link_off()
945 priv->status &= ~STATUS_LED_LINK_ON; in ipw_led_link_off()
949 if (!(priv->status & STATUS_RF_KILL_MASK) && in ipw_led_link_off()
950 !(priv->status & STATUS_ASSOCIATED)) in ipw_led_link_off()
951 schedule_delayed_work(&priv->led_link_on, in ipw_led_link_off()
956 spin_unlock_irqrestore(&priv->lock, flags); in ipw_led_link_off()
961 struct ipw_priv *priv = in ipw_bg_led_link_off() local
963 mutex_lock(&priv->mutex); in ipw_bg_led_link_off()
964 ipw_led_link_off(priv); in ipw_bg_led_link_off()
965 mutex_unlock(&priv->mutex); in ipw_bg_led_link_off()
968 static void __ipw_led_activity_on(struct ipw_priv *priv) in __ipw_led_activity_on() argument
972 if (priv->config & CFG_NO_LED) in __ipw_led_activity_on()
975 if (priv->status & STATUS_RF_KILL_MASK) in __ipw_led_activity_on()
978 if (!(priv->status & STATUS_LED_ACT_ON)) { in __ipw_led_activity_on()
979 led = ipw_read_reg32(priv, IPW_EVENT_REG); in __ipw_led_activity_on()
980 led |= priv->led_activity_on; in __ipw_led_activity_on()
985 ipw_write_reg32(priv, IPW_EVENT_REG, led); in __ipw_led_activity_on()
989 priv->status |= STATUS_LED_ACT_ON; in __ipw_led_activity_on()
991 cancel_delayed_work(&priv->led_act_off); in __ipw_led_activity_on()
992 schedule_delayed_work(&priv->led_act_off, LD_TIME_ACT_ON); in __ipw_led_activity_on()
995 cancel_delayed_work(&priv->led_act_off); in __ipw_led_activity_on()
996 schedule_delayed_work(&priv->led_act_off, LD_TIME_ACT_ON); in __ipw_led_activity_on()
1001 void ipw_led_activity_on(struct ipw_priv *priv)
1004 spin_lock_irqsave(&priv->lock, flags);
1005 __ipw_led_activity_on(priv);
1006 spin_unlock_irqrestore(&priv->lock, flags);
1010 static void ipw_led_activity_off(struct ipw_priv *priv) in ipw_led_activity_off() argument
1015 if (priv->config & CFG_NO_LED) in ipw_led_activity_off()
1018 spin_lock_irqsave(&priv->lock, flags); in ipw_led_activity_off()
1020 if (priv->status & STATUS_LED_ACT_ON) { in ipw_led_activity_off()
1021 led = ipw_read_reg32(priv, IPW_EVENT_REG); in ipw_led_activity_off()
1022 led &= priv->led_activity_off; in ipw_led_activity_off()
1027 ipw_write_reg32(priv, IPW_EVENT_REG, led); in ipw_led_activity_off()
1031 priv->status &= ~STATUS_LED_ACT_ON; in ipw_led_activity_off()
1034 spin_unlock_irqrestore(&priv->lock, flags); in ipw_led_activity_off()
1039 struct ipw_priv *priv = in ipw_bg_led_activity_off() local
1041 mutex_lock(&priv->mutex); in ipw_bg_led_activity_off()
1042 ipw_led_activity_off(priv); in ipw_bg_led_activity_off()
1043 mutex_unlock(&priv->mutex); in ipw_bg_led_activity_off()
1046 static void ipw_led_band_on(struct ipw_priv *priv) in ipw_led_band_on() argument
1052 if (priv->config & CFG_NO_LED || in ipw_led_band_on()
1053 priv->nic_type != EEPROM_NIC_TYPE_1 || !priv->assoc_network) in ipw_led_band_on()
1056 spin_lock_irqsave(&priv->lock, flags); in ipw_led_band_on()
1058 led = ipw_read_reg32(priv, IPW_EVENT_REG); in ipw_led_band_on()
1059 if (priv->assoc_network->mode == IEEE_A) { in ipw_led_band_on()
1060 led |= priv->led_ofdm_on; in ipw_led_band_on()
1061 led &= priv->led_association_off; in ipw_led_band_on()
1063 } else if (priv->assoc_network->mode == IEEE_G) { in ipw_led_band_on()
1064 led |= priv->led_ofdm_on; in ipw_led_band_on()
1065 led |= priv->led_association_on; in ipw_led_band_on()
1068 led &= priv->led_ofdm_off; in ipw_led_band_on()
1069 led |= priv->led_association_on; in ipw_led_band_on()
1076 ipw_write_reg32(priv, IPW_EVENT_REG, led); in ipw_led_band_on()
1078 spin_unlock_irqrestore(&priv->lock, flags); in ipw_led_band_on()
1081 static void ipw_led_band_off(struct ipw_priv *priv) in ipw_led_band_off() argument
1087 if (priv->config & CFG_NO_LED || priv->nic_type != EEPROM_NIC_TYPE_1) in ipw_led_band_off()
1090 spin_lock_irqsave(&priv->lock, flags); in ipw_led_band_off()
1092 led = ipw_read_reg32(priv, IPW_EVENT_REG); in ipw_led_band_off()
1093 led &= priv->led_ofdm_off; in ipw_led_band_off()
1094 led &= priv->led_association_off; in ipw_led_band_off()
1099 ipw_write_reg32(priv, IPW_EVENT_REG, led); in ipw_led_band_off()
1101 spin_unlock_irqrestore(&priv->lock, flags); in ipw_led_band_off()
1104 static void ipw_led_radio_on(struct ipw_priv *priv) in ipw_led_radio_on() argument
1106 ipw_led_link_on(priv); in ipw_led_radio_on()
1109 static void ipw_led_radio_off(struct ipw_priv *priv) in ipw_led_radio_off() argument
1111 ipw_led_activity_off(priv); in ipw_led_radio_off()
1112 ipw_led_link_off(priv); in ipw_led_radio_off()
1115 static void ipw_led_link_up(struct ipw_priv *priv) in ipw_led_link_up() argument
1118 ipw_led_link_on(priv); in ipw_led_link_up()
1121 static void ipw_led_link_down(struct ipw_priv *priv) in ipw_led_link_down() argument
1123 ipw_led_activity_off(priv); in ipw_led_link_down()
1124 ipw_led_link_off(priv); in ipw_led_link_down()
1126 if (priv->status & STATUS_RF_KILL_MASK) in ipw_led_link_down()
1127 ipw_led_radio_off(priv); in ipw_led_link_down()
1130 static void ipw_led_init(struct ipw_priv *priv) in ipw_led_init() argument
1132 priv->nic_type = priv->eeprom[EEPROM_NIC_TYPE]; in ipw_led_init()
1135 priv->led_activity_on = IPW_ACTIVITY_LED; in ipw_led_init()
1136 priv->led_activity_off = ~(IPW_ACTIVITY_LED); in ipw_led_init()
1138 priv->led_association_on = IPW_ASSOCIATED_LED; in ipw_led_init()
1139 priv->led_association_off = ~(IPW_ASSOCIATED_LED); in ipw_led_init()
1142 priv->led_ofdm_on = IPW_OFDM_LED; in ipw_led_init()
1143 priv->led_ofdm_off = ~(IPW_OFDM_LED); in ipw_led_init()
1145 switch (priv->nic_type) { in ipw_led_init()
1148 priv->led_activity_on = IPW_ASSOCIATED_LED; in ipw_led_init()
1149 priv->led_activity_off = ~(IPW_ASSOCIATED_LED); in ipw_led_init()
1150 priv->led_association_on = IPW_ACTIVITY_LED; in ipw_led_init()
1151 priv->led_association_off = ~(IPW_ACTIVITY_LED); in ipw_led_init()
1153 if (!(priv->config & CFG_NO_LED)) in ipw_led_init()
1154 ipw_led_band_on(priv); in ipw_led_init()
1168 priv->nic_type); in ipw_led_init()
1169 priv->nic_type = EEPROM_NIC_TYPE_0; in ipw_led_init()
1173 if (!(priv->config & CFG_NO_LED)) { in ipw_led_init()
1174 if (priv->status & STATUS_ASSOCIATED) in ipw_led_init()
1175 ipw_led_link_on(priv); in ipw_led_init()
1177 ipw_led_link_off(priv); in ipw_led_init()
1181 static void ipw_led_shutdown(struct ipw_priv *priv) in ipw_led_shutdown() argument
1183 ipw_led_activity_off(priv); in ipw_led_shutdown()
1184 ipw_led_link_off(priv); in ipw_led_shutdown()
1185 ipw_led_band_off(priv); in ipw_led_shutdown()
1186 cancel_delayed_work(&priv->led_link_on); in ipw_led_shutdown()
1187 cancel_delayed_work(&priv->led_link_off); in ipw_led_shutdown()
1188 cancel_delayed_work(&priv->led_act_off); in ipw_led_shutdown()
1228 static inline u32 ipw_get_event_log_len(struct ipw_priv *priv) in ipw_get_event_log_len() argument
1231 return ipw_read_reg32(priv, ipw_read32(priv, IPW_EVENT_LOG)); in ipw_get_event_log_len()
1234 static void ipw_capture_event_log(struct ipw_priv *priv, in ipw_capture_event_log() argument
1240 base = ipw_read32(priv, IPW_EVENT_LOG); in ipw_capture_event_log()
1241 ipw_read_indirect(priv, base + sizeof(base) + sizeof(u32), in ipw_capture_event_log()
1246 static struct ipw_fw_error *ipw_alloc_error_log(struct ipw_priv *priv) in ipw_alloc_error_log() argument
1249 u32 log_len = ipw_get_event_log_len(priv); in ipw_alloc_error_log()
1250 u32 base = ipw_read32(priv, IPW_ERROR_LOG); in ipw_alloc_error_log()
1251 u32 elem_len = ipw_read_reg32(priv, base); in ipw_alloc_error_log()
1262 error->status = priv->status; in ipw_alloc_error_log()
1263 error->config = priv->config; in ipw_alloc_error_log()
1269 ipw_capture_event_log(priv, log_len, error->log); in ipw_alloc_error_log()
1272 ipw_read_indirect(priv, base + sizeof(base), (u8 *) error->elem, in ipw_alloc_error_log()
1281 struct ipw_priv *priv = dev_get_drvdata(d); in show_event_log() local
1282 u32 log_len = ipw_get_event_log_len(priv); in show_event_log()
1296 ipw_capture_event_log(priv, log_len, log); in show_event_log()
1313 struct ipw_priv *priv = dev_get_drvdata(d); in show_error() local
1315 if (!priv->error) in show_error()
1319 priv->error->jiffies, in show_error()
1320 priv->error->status, in show_error()
1321 priv->error->config, priv->error->elem_len); in show_error()
1322 for (i = 0; i < priv->error->elem_len; i++) in show_error()
1325 priv->error->elem[i].time, in show_error()
1326 priv->error->elem[i].desc, in show_error()
1327 priv->error->elem[i].blink1, in show_error()
1328 priv->error->elem[i].blink2, in show_error()
1329 priv->error->elem[i].link1, in show_error()
1330 priv->error->elem[i].link2, in show_error()
1331 priv->error->elem[i].data); in show_error()
1334 "\n%08X", priv->error->log_len); in show_error()
1335 for (i = 0; i < priv->error->log_len; i++) in show_error()
1338 priv->error->log[i].time, in show_error()
1339 priv->error->log[i].event, in show_error()
1340 priv->error->log[i].data); in show_error()
1349 struct ipw_priv *priv = dev_get_drvdata(d); in clear_error() local
1351 kfree(priv->error); in clear_error()
1352 priv->error = NULL; in clear_error()
1361 struct ipw_priv *priv = dev_get_drvdata(d); in show_cmd_log() local
1363 if (!priv->cmdlog) in show_cmd_log()
1365 for (i = (priv->cmdlog_pos + 1) % priv->cmdlog_len; in show_cmd_log()
1366 (i != priv->cmdlog_pos) && (len < PAGE_SIZE); in show_cmd_log()
1367 i = (i + 1) % priv->cmdlog_len) { in show_cmd_log()
1370 "\n%08lX%08X%08X%08X\n", priv->cmdlog[i].jiffies, in show_cmd_log()
1371 priv->cmdlog[i].retcode, priv->cmdlog[i].cmd.cmd, in show_cmd_log()
1372 priv->cmdlog[i].cmd.len); in show_cmd_log()
1375 (u8 *) priv->cmdlog[i].cmd.param, in show_cmd_log()
1376 priv->cmdlog[i].cmd.len); in show_cmd_log()
1386 static void ipw_prom_free(struct ipw_priv *priv);
1387 static int ipw_prom_alloc(struct ipw_priv *priv);
1392 struct ipw_priv *priv = dev_get_drvdata(d); in store_rtap_iface() local
1403 if (netif_running(priv->prom_net_dev)) { in store_rtap_iface()
1408 ipw_prom_free(priv); in store_rtap_iface()
1416 rc = ipw_prom_alloc(priv); in store_rtap_iface()
1437 struct ipw_priv *priv = dev_get_drvdata(d); in show_rtap_iface() local
1439 return sprintf(buf, "%s", priv->prom_net_dev->name); in show_rtap_iface()
1455 struct ipw_priv *priv = dev_get_drvdata(d); in store_rtap_filter() local
1457 if (!priv->prom_priv) { in store_rtap_filter()
1463 priv->prom_priv->filter = simple_strtol(buf, NULL, 0); in store_rtap_filter()
1466 BIT_ARG16(priv->prom_priv->filter)); in store_rtap_filter()
1475 struct ipw_priv *priv = dev_get_drvdata(d); in show_rtap_filter() local
1477 priv->prom_priv ? priv->prom_priv->filter : 0); in show_rtap_filter()
1487 struct ipw_priv *priv = dev_get_drvdata(d); in show_scan_age() local
1488 return sprintf(buf, "%d\n", priv->ieee->scan_age); in show_scan_age()
1494 struct ipw_priv *priv = dev_get_drvdata(d); in store_scan_age() local
1495 struct net_device *dev = priv->net_dev; in store_scan_age()
1517 priv->ieee->scan_age = val; in store_scan_age()
1518 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age); in store_scan_age()
1530 struct ipw_priv *priv = dev_get_drvdata(d); in show_led() local
1531 return sprintf(buf, "%d\n", (priv->config & CFG_NO_LED) ? 0 : 1); in show_led()
1537 struct ipw_priv *priv = dev_get_drvdata(d); in store_led() local
1546 priv->config |= CFG_NO_LED; in store_led()
1547 ipw_led_shutdown(priv); in store_led()
1550 priv->config &= ~CFG_NO_LED; in store_led()
1551 ipw_led_init(priv); in store_led()
1581 struct ipw_priv *priv = dev_get_drvdata(d); in show_nic_type() local
1582 return sprintf(buf, "TYPE: %d\n", priv->nic_type); in show_nic_type()
1690 struct ipw_priv *priv = dev_get_drvdata(d); in show_indirect_dword() local
1692 if (priv->status & STATUS_INDIRECT_DWORD) in show_indirect_dword()
1693 reg = ipw_read_reg32(priv, priv->indirect_dword); in show_indirect_dword()
1703 struct ipw_priv *priv = dev_get_drvdata(d); in store_indirect_dword() local
1705 sscanf(buf, "%x", &priv->indirect_dword); in store_indirect_dword()
1706 priv->status |= STATUS_INDIRECT_DWORD; in store_indirect_dword()
1717 struct ipw_priv *priv = dev_get_drvdata(d); in show_indirect_byte() local
1719 if (priv->status & STATUS_INDIRECT_BYTE) in show_indirect_byte()
1720 reg = ipw_read_reg8(priv, priv->indirect_byte); in show_indirect_byte()
1730 struct ipw_priv *priv = dev_get_drvdata(d); in store_indirect_byte() local
1732 sscanf(buf, "%x", &priv->indirect_byte); in store_indirect_byte()
1733 priv->status |= STATUS_INDIRECT_BYTE; in store_indirect_byte()
1744 struct ipw_priv *priv = dev_get_drvdata(d); in show_direct_dword() local
1746 if (priv->status & STATUS_DIRECT_DWORD) in show_direct_dword()
1747 reg = ipw_read32(priv, priv->direct_dword); in show_direct_dword()
1757 struct ipw_priv *priv = dev_get_drvdata(d); in store_direct_dword() local
1759 sscanf(buf, "%x", &priv->direct_dword); in store_direct_dword()
1760 priv->status |= STATUS_DIRECT_DWORD; in store_direct_dword()
1767 static int rf_kill_active(struct ipw_priv *priv) in rf_kill_active() argument
1769 if (0 == (ipw_read32(priv, 0x30) & 0x10000)) { in rf_kill_active()
1770 priv->status |= STATUS_RF_KILL_HW; in rf_kill_active()
1771 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true); in rf_kill_active()
1773 priv->status &= ~STATUS_RF_KILL_HW; in rf_kill_active()
1774 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false); in rf_kill_active()
1777 return (priv->status & STATUS_RF_KILL_HW) ? 1 : 0; in rf_kill_active()
1787 struct ipw_priv *priv = dev_get_drvdata(d); in show_rf_kill() local
1788 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) | in show_rf_kill()
1789 (rf_kill_active(priv) ? 0x2 : 0x0); in show_rf_kill()
1793 static int ipw_radio_kill_sw(struct ipw_priv *priv, int disable_radio) in ipw_radio_kill_sw() argument
1796 ((priv->status & STATUS_RF_KILL_SW) ? 1 : 0)) in ipw_radio_kill_sw()
1803 priv->status |= STATUS_RF_KILL_SW; in ipw_radio_kill_sw()
1805 cancel_delayed_work(&priv->request_scan); in ipw_radio_kill_sw()
1806 cancel_delayed_work(&priv->request_direct_scan); in ipw_radio_kill_sw()
1807 cancel_delayed_work(&priv->request_passive_scan); in ipw_radio_kill_sw()
1808 cancel_delayed_work(&priv->scan_event); in ipw_radio_kill_sw()
1809 schedule_work(&priv->down); in ipw_radio_kill_sw()
1811 priv->status &= ~STATUS_RF_KILL_SW; in ipw_radio_kill_sw()
1812 if (rf_kill_active(priv)) { in ipw_radio_kill_sw()
1816 cancel_delayed_work(&priv->rf_kill); in ipw_radio_kill_sw()
1817 schedule_delayed_work(&priv->rf_kill, in ipw_radio_kill_sw()
1820 schedule_work(&priv->up); in ipw_radio_kill_sw()
1829 struct ipw_priv *priv = dev_get_drvdata(d); in store_rf_kill() local
1831 ipw_radio_kill_sw(priv, buf[0] == '1'); in store_rf_kill()
1841 struct ipw_priv *priv = dev_get_drvdata(d); in show_speed_scan() local
1843 if (priv->config & CFG_SPEED_SCAN) { in show_speed_scan()
1844 while (priv->speed_scan[pos] != 0) in show_speed_scan()
1846 priv->speed_scan[pos++]); in show_speed_scan()
1856 struct ipw_priv *priv = dev_get_drvdata(d); in store_speed_scan() local
1863 priv->speed_scan[pos] = 0; in store_speed_scan()
1867 if (libipw_is_valid_channel(priv->ieee, channel)) in store_speed_scan()
1868 priv->speed_scan[pos++] = channel; in store_speed_scan()
1880 priv->config &= ~CFG_SPEED_SCAN; in store_speed_scan()
1882 priv->speed_scan_pos = 0; in store_speed_scan()
1883 priv->config |= CFG_SPEED_SCAN; in store_speed_scan()
1895 struct ipw_priv *priv = dev_get_drvdata(d); in show_net_stats() local
1896 return sprintf(buf, "%c\n", (priv->config & CFG_NET_STATS) ? '1' : '0'); in show_net_stats()
1902 struct ipw_priv *priv = dev_get_drvdata(d); in store_net_stats() local
1904 priv->config |= CFG_NET_STATS; in store_net_stats()
1906 priv->config &= ~CFG_NET_STATS; in store_net_stats()
1918 struct ipw_priv *priv = dev_get_drvdata(d); in show_channels() local
1919 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in show_channels()
1960 static void notify_wx_assoc_event(struct ipw_priv *priv) in notify_wx_assoc_event() argument
1964 if (priv->status & STATUS_ASSOCIATED) in notify_wx_assoc_event()
1965 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN); in notify_wx_assoc_event()
1968 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); in notify_wx_assoc_event()
1971 static void ipw_irq_tasklet(struct ipw_priv *priv) in ipw_irq_tasklet() argument
1977 spin_lock_irqsave(&priv->irq_lock, flags); in ipw_irq_tasklet()
1979 inta = ipw_read32(priv, IPW_INTA_RW); in ipw_irq_tasklet()
1980 inta_mask = ipw_read32(priv, IPW_INTA_MASK_R); in ipw_irq_tasklet()
1991 inta |= priv->isr_inta; in ipw_irq_tasklet()
1993 spin_unlock_irqrestore(&priv->irq_lock, flags); in ipw_irq_tasklet()
1995 spin_lock_irqsave(&priv->lock, flags); in ipw_irq_tasklet()
1999 ipw_rx(priv); in ipw_irq_tasklet()
2005 rc = ipw_queue_tx_reclaim(priv, &priv->txq_cmd, -1); in ipw_irq_tasklet()
2006 priv->status &= ~STATUS_HCMD_ACTIVE; in ipw_irq_tasklet()
2007 wake_up_interruptible(&priv->wait_command_queue); in ipw_irq_tasklet()
2013 rc = ipw_queue_tx_reclaim(priv, &priv->txq[0], 0); in ipw_irq_tasklet()
2019 rc = ipw_queue_tx_reclaim(priv, &priv->txq[1], 1); in ipw_irq_tasklet()
2025 rc = ipw_queue_tx_reclaim(priv, &priv->txq[2], 2); in ipw_irq_tasklet()
2031 rc = ipw_queue_tx_reclaim(priv, &priv->txq[3], 3); in ipw_irq_tasklet()
2062 priv->status |= STATUS_RF_KILL_HW; in ipw_irq_tasklet()
2063 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true); in ipw_irq_tasklet()
2064 wake_up_interruptible(&priv->wait_command_queue); in ipw_irq_tasklet()
2065 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); in ipw_irq_tasklet()
2066 cancel_delayed_work(&priv->request_scan); in ipw_irq_tasklet()
2067 cancel_delayed_work(&priv->request_direct_scan); in ipw_irq_tasklet()
2068 cancel_delayed_work(&priv->request_passive_scan); in ipw_irq_tasklet()
2069 cancel_delayed_work(&priv->scan_event); in ipw_irq_tasklet()
2070 schedule_work(&priv->link_down); in ipw_irq_tasklet()
2071 schedule_delayed_work(&priv->rf_kill, 2 * HZ); in ipw_irq_tasklet()
2077 if (priv->error) { in ipw_irq_tasklet()
2081 ipw_alloc_error_log(priv); in ipw_irq_tasklet()
2082 ipw_dump_error_log(priv, error); in ipw_irq_tasklet()
2086 priv->error = ipw_alloc_error_log(priv); in ipw_irq_tasklet()
2087 if (priv->error) in ipw_irq_tasklet()
2093 ipw_dump_error_log(priv, priv->error); in ipw_irq_tasklet()
2098 if (priv->ieee->sec.encrypt) { in ipw_irq_tasklet()
2099 priv->status &= ~STATUS_ASSOCIATED; in ipw_irq_tasklet()
2100 notify_wx_assoc_event(priv); in ipw_irq_tasklet()
2105 priv->status &= ~STATUS_INIT; in ipw_irq_tasklet()
2108 priv->status &= ~STATUS_HCMD_ACTIVE; in ipw_irq_tasklet()
2109 wake_up_interruptible(&priv->wait_command_queue); in ipw_irq_tasklet()
2111 schedule_work(&priv->adapter_restart); in ipw_irq_tasklet()
2124 spin_unlock_irqrestore(&priv->lock, flags); in ipw_irq_tasklet()
2127 ipw_enable_interrupts(priv); in ipw_irq_tasklet()
2191 static int __ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd) in __ipw_send_cmd() argument
2197 spin_lock_irqsave(&priv->lock, flags); in __ipw_send_cmd()
2198 if (priv->status & STATUS_HCMD_ACTIVE) { in __ipw_send_cmd()
2201 spin_unlock_irqrestore(&priv->lock, flags); in __ipw_send_cmd()
2205 priv->status |= STATUS_HCMD_ACTIVE; in __ipw_send_cmd()
2207 if (priv->cmdlog) { in __ipw_send_cmd()
2208 priv->cmdlog[priv->cmdlog_pos].jiffies = jiffies; in __ipw_send_cmd()
2209 priv->cmdlog[priv->cmdlog_pos].cmd.cmd = cmd->cmd; in __ipw_send_cmd()
2210 priv->cmdlog[priv->cmdlog_pos].cmd.len = cmd->len; in __ipw_send_cmd()
2211 memcpy(priv->cmdlog[priv->cmdlog_pos].cmd.param, cmd->param, in __ipw_send_cmd()
2213 priv->cmdlog[priv->cmdlog_pos].retcode = -1; in __ipw_send_cmd()
2218 priv->status); in __ipw_send_cmd()
2227 rc = ipw_queue_tx_hcmd(priv, cmd->cmd, cmd->param, cmd->len, 0); in __ipw_send_cmd()
2229 priv->status &= ~STATUS_HCMD_ACTIVE; in __ipw_send_cmd()
2232 spin_unlock_irqrestore(&priv->lock, flags); in __ipw_send_cmd()
2235 spin_unlock_irqrestore(&priv->lock, flags); in __ipw_send_cmd()
2240 rc = wait_event_interruptible_timeout(priv->wait_command_queue, in __ipw_send_cmd()
2241 !(priv-> in __ipw_send_cmd()
2252 spin_lock_irqsave(&priv->lock, flags); in __ipw_send_cmd()
2253 if (priv->status & STATUS_HCMD_ACTIVE) { in __ipw_send_cmd()
2256 priv->status &= ~STATUS_HCMD_ACTIVE; in __ipw_send_cmd()
2257 spin_unlock_irqrestore(&priv->lock, flags); in __ipw_send_cmd()
2261 spin_unlock_irqrestore(&priv->lock, flags); in __ipw_send_cmd()
2265 if (priv->status & STATUS_RF_KILL_HW) { in __ipw_send_cmd()
2273 if (priv->cmdlog) { in __ipw_send_cmd()
2274 priv->cmdlog[priv->cmdlog_pos++].retcode = rc; in __ipw_send_cmd()
2275 priv->cmdlog_pos %= priv->cmdlog_len; in __ipw_send_cmd()
2280 static int ipw_send_cmd_simple(struct ipw_priv *priv, u8 command) in ipw_send_cmd_simple() argument
2286 return __ipw_send_cmd(priv, &cmd); in ipw_send_cmd_simple()
2289 static int ipw_send_cmd_pdu(struct ipw_priv *priv, u8 command, u8 len, in ipw_send_cmd_pdu() argument
2298 return __ipw_send_cmd(priv, &cmd); in ipw_send_cmd_pdu()
2301 static int ipw_send_host_complete(struct ipw_priv *priv) in ipw_send_host_complete() argument
2303 if (!priv) { in ipw_send_host_complete()
2308 return ipw_send_cmd_simple(priv, IPW_CMD_HOST_COMPLETE); in ipw_send_host_complete()
2311 static int ipw_send_system_config(struct ipw_priv *priv) in ipw_send_system_config() argument
2313 return ipw_send_cmd_pdu(priv, IPW_CMD_SYSTEM_CONFIG, in ipw_send_system_config()
2314 sizeof(priv->sys_config), in ipw_send_system_config()
2315 &priv->sys_config); in ipw_send_system_config()
2318 static int ipw_send_ssid(struct ipw_priv *priv, u8 * ssid, int len) in ipw_send_ssid() argument
2320 if (!priv || !ssid) { in ipw_send_ssid()
2325 return ipw_send_cmd_pdu(priv, IPW_CMD_SSID, min(len, IW_ESSID_MAX_SIZE), in ipw_send_ssid()
2329 static int ipw_send_adapter_address(struct ipw_priv *priv, u8 * mac) in ipw_send_adapter_address() argument
2331 if (!priv || !mac) { in ipw_send_adapter_address()
2337 priv->net_dev->name, mac); in ipw_send_adapter_address()
2339 return ipw_send_cmd_pdu(priv, IPW_CMD_ADAPTER_ADDRESS, ETH_ALEN, mac); in ipw_send_adapter_address()
2344 struct ipw_priv *priv = adapter; in ipw_adapter_restart() local
2346 if (priv->status & STATUS_RF_KILL_MASK) in ipw_adapter_restart()
2349 ipw_down(priv); in ipw_adapter_restart()
2351 if (priv->assoc_network && in ipw_adapter_restart()
2352 (priv->assoc_network->capability & WLAN_CAPABILITY_IBSS)) in ipw_adapter_restart()
2353 ipw_remove_current_network(priv); in ipw_adapter_restart()
2355 if (ipw_up(priv)) { in ipw_adapter_restart()
2363 struct ipw_priv *priv = in ipw_bg_adapter_restart() local
2365 mutex_lock(&priv->mutex); in ipw_bg_adapter_restart()
2366 ipw_adapter_restart(priv); in ipw_bg_adapter_restart()
2367 mutex_unlock(&priv->mutex); in ipw_bg_adapter_restart()
2370 static void ipw_abort_scan(struct ipw_priv *priv);
2376 struct ipw_priv *priv = data; in ipw_scan_check() local
2378 if (priv->status & STATUS_SCAN_ABORTING) { in ipw_scan_check()
2382 schedule_work(&priv->adapter_restart); in ipw_scan_check()
2383 } else if (priv->status & STATUS_SCANNING) { in ipw_scan_check()
2387 ipw_abort_scan(priv); in ipw_scan_check()
2388 schedule_delayed_work(&priv->scan_check, HZ); in ipw_scan_check()
2394 struct ipw_priv *priv = in ipw_bg_scan_check() local
2396 mutex_lock(&priv->mutex); in ipw_bg_scan_check()
2397 ipw_scan_check(priv); in ipw_bg_scan_check()
2398 mutex_unlock(&priv->mutex); in ipw_bg_scan_check()
2401 static int ipw_send_scan_request_ext(struct ipw_priv *priv, in ipw_send_scan_request_ext() argument
2404 return ipw_send_cmd_pdu(priv, IPW_CMD_SCAN_REQUEST_EXT, in ipw_send_scan_request_ext()
2408 static int ipw_send_scan_abort(struct ipw_priv *priv) in ipw_send_scan_abort() argument
2410 if (!priv) { in ipw_send_scan_abort()
2415 return ipw_send_cmd_simple(priv, IPW_CMD_SCAN_ABORT); in ipw_send_scan_abort()
2418 static int ipw_set_sensitivity(struct ipw_priv *priv, u16 sens) in ipw_set_sensitivity() argument
2424 return ipw_send_cmd_pdu(priv, IPW_CMD_SENSITIVITY_CALIB, sizeof(calib), in ipw_set_sensitivity()
2428 static int ipw_send_associate(struct ipw_priv *priv, in ipw_send_associate() argument
2431 if (!priv || !associate) { in ipw_send_associate()
2436 return ipw_send_cmd_pdu(priv, IPW_CMD_ASSOCIATE, sizeof(*associate), in ipw_send_associate()
2440 static int ipw_send_supported_rates(struct ipw_priv *priv, in ipw_send_supported_rates() argument
2443 if (!priv || !rates) { in ipw_send_supported_rates()
2448 return ipw_send_cmd_pdu(priv, IPW_CMD_SUPPORTED_RATES, sizeof(*rates), in ipw_send_supported_rates()
2452 static int ipw_set_random_seed(struct ipw_priv *priv) in ipw_set_random_seed() argument
2456 if (!priv) { in ipw_set_random_seed()
2463 return ipw_send_cmd_pdu(priv, IPW_CMD_SEED_NUMBER, sizeof(val), &val); in ipw_set_random_seed()
2466 static int ipw_send_card_disable(struct ipw_priv *priv, u32 phy_off) in ipw_send_card_disable() argument
2469 if (!priv) { in ipw_send_card_disable()
2474 return ipw_send_cmd_pdu(priv, IPW_CMD_CARD_DISABLE, sizeof(v), &v); in ipw_send_card_disable()
2477 static int ipw_send_tx_power(struct ipw_priv *priv, struct ipw_tx_power *power) in ipw_send_tx_power() argument
2479 if (!priv || !power) { in ipw_send_tx_power()
2484 return ipw_send_cmd_pdu(priv, IPW_CMD_TX_POWER, sizeof(*power), power); in ipw_send_tx_power()
2487 static int ipw_set_tx_power(struct ipw_priv *priv) in ipw_set_tx_power() argument
2489 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw_set_tx_power()
2504 min(max_power, priv->tx_power) : priv->tx_power; in ipw_set_tx_power()
2506 if (ipw_send_tx_power(priv, &tx_power)) in ipw_set_tx_power()
2511 if (ipw_send_tx_power(priv, &tx_power)) in ipw_set_tx_power()
2515 if (priv->ieee->abg_true) { in ipw_set_tx_power()
2523 min(max_power, priv->tx_power) : priv->tx_power; in ipw_set_tx_power()
2525 if (ipw_send_tx_power(priv, &tx_power)) in ipw_set_tx_power()
2531 static int ipw_send_rts_threshold(struct ipw_priv *priv, u16 rts) in ipw_send_rts_threshold() argument
2537 if (!priv) { in ipw_send_rts_threshold()
2542 return ipw_send_cmd_pdu(priv, IPW_CMD_RTS_THRESHOLD, in ipw_send_rts_threshold()
2546 static int ipw_send_frag_threshold(struct ipw_priv *priv, u16 frag) in ipw_send_frag_threshold() argument
2552 if (!priv) { in ipw_send_frag_threshold()
2557 return ipw_send_cmd_pdu(priv, IPW_CMD_FRAG_THRESHOLD, in ipw_send_frag_threshold()
2561 static int ipw_send_power_mode(struct ipw_priv *priv, u32 mode) in ipw_send_power_mode() argument
2565 if (!priv) { in ipw_send_power_mode()
2584 return ipw_send_cmd_pdu(priv, IPW_CMD_POWER_MODE, sizeof(param), in ipw_send_power_mode()
2588 static int ipw_send_retry_limit(struct ipw_priv *priv, u8 slimit, u8 llimit) in ipw_send_retry_limit() argument
2595 if (!priv) { in ipw_send_retry_limit()
2600 return ipw_send_cmd_pdu(priv, IPW_CMD_RETRY_LIMIT, sizeof(retry_limit), in ipw_send_retry_limit()
2631 static void eeprom_cs(struct ipw_priv *priv) in eeprom_cs() argument
2633 eeprom_write_reg(priv, 0); in eeprom_cs()
2634 eeprom_write_reg(priv, EEPROM_BIT_CS); in eeprom_cs()
2635 eeprom_write_reg(priv, EEPROM_BIT_CS | EEPROM_BIT_SK); in eeprom_cs()
2636 eeprom_write_reg(priv, EEPROM_BIT_CS); in eeprom_cs()
2640 static void eeprom_disable_cs(struct ipw_priv *priv) in eeprom_disable_cs() argument
2642 eeprom_write_reg(priv, EEPROM_BIT_CS); in eeprom_disable_cs()
2643 eeprom_write_reg(priv, 0); in eeprom_disable_cs()
2644 eeprom_write_reg(priv, EEPROM_BIT_SK); in eeprom_disable_cs()
2656 static void eeprom_op(struct ipw_priv *priv, u8 op, u8 addr) in eeprom_op() argument
2660 eeprom_cs(priv); in eeprom_op()
2661 eeprom_write_bit(priv, 1); in eeprom_op()
2662 eeprom_write_bit(priv, op & 2); in eeprom_op()
2663 eeprom_write_bit(priv, op & 1); in eeprom_op()
2665 eeprom_write_bit(priv, addr & (1 << i)); in eeprom_op()
2670 static u16 eeprom_read_u16(struct ipw_priv *priv, u8 addr) in eeprom_read_u16() argument
2676 eeprom_op(priv, EEPROM_CMD_READ, addr); in eeprom_read_u16()
2679 eeprom_write_reg(priv, EEPROM_BIT_CS); in eeprom_read_u16()
2684 eeprom_write_reg(priv, EEPROM_BIT_CS | EEPROM_BIT_SK); in eeprom_read_u16()
2685 eeprom_write_reg(priv, EEPROM_BIT_CS); in eeprom_read_u16()
2686 data = ipw_read_reg32(priv, FW_MEM_REG_EEPROM_ACCESS); in eeprom_read_u16()
2691 eeprom_write_reg(priv, 0); in eeprom_read_u16()
2692 eeprom_disable_cs(priv); in eeprom_read_u16()
2699 static void eeprom_parse_mac(struct ipw_priv *priv, u8 * mac) in eeprom_parse_mac() argument
2701 memcpy(mac, &priv->eeprom[EEPROM_MAC_ADDRESS], ETH_ALEN); in eeprom_parse_mac()
2704 static void ipw_read_eeprom(struct ipw_priv *priv) in ipw_read_eeprom() argument
2707 __le16 *eeprom = (__le16 *) priv->eeprom; in ipw_read_eeprom()
2713 eeprom[i] = cpu_to_le16(eeprom_read_u16(priv, (u8) i)); in ipw_read_eeprom()
2726 static void ipw_eeprom_init_sram(struct ipw_priv *priv) in ipw_eeprom_init_sram() argument
2737 if (priv->eeprom[EEPROM_VERSION] != 0) { in ipw_eeprom_init_sram()
2742 ipw_write8(priv, IPW_EEPROM_DATA + i, priv->eeprom[i]); in ipw_eeprom_init_sram()
2745 ipw_write32(priv, IPW_EEPROM_LOAD_DISABLE, 0); in ipw_eeprom_init_sram()
2750 ipw_write32(priv, IPW_EEPROM_LOAD_DISABLE, 1); in ipw_eeprom_init_sram()
2756 static void ipw_zero_memory(struct ipw_priv *priv, u32 start, u32 count) in ipw_zero_memory() argument
2761 _ipw_write32(priv, IPW_AUTOINC_ADDR, start); in ipw_zero_memory()
2763 _ipw_write32(priv, IPW_AUTOINC_DATA, 0); in ipw_zero_memory()
2766 static inline void ipw_fw_dma_reset_command_blocks(struct ipw_priv *priv) in ipw_fw_dma_reset_command_blocks() argument
2768 ipw_zero_memory(priv, IPW_SHARED_SRAM_DMA_CONTROL, in ipw_fw_dma_reset_command_blocks()
2773 static int ipw_fw_dma_enable(struct ipw_priv *priv) in ipw_fw_dma_enable() argument
2779 ipw_fw_dma_reset_command_blocks(priv); in ipw_fw_dma_enable()
2782 ipw_write_reg32(priv, IPW_DMA_I_CB_BASE, IPW_SHARED_SRAM_DMA_CONTROL); in ipw_fw_dma_enable()
2788 static void ipw_fw_dma_abort(struct ipw_priv *priv) in ipw_fw_dma_abort() argument
2796 ipw_write_reg32(priv, IPW_DMA_I_DMA_CONTROL, control); in ipw_fw_dma_abort()
2797 priv->sram_desc.last_cb_index = 0; in ipw_fw_dma_abort()
2802 static int ipw_fw_dma_write_command_block(struct ipw_priv *priv, int index, in ipw_fw_dma_write_command_block() argument
2810 ipw_write_indirect(priv, address, (u8 *) cb, in ipw_fw_dma_write_command_block()
2818 static int ipw_fw_dma_kick(struct ipw_priv *priv) in ipw_fw_dma_kick() argument
2825 for (index = 0; index < priv->sram_desc.last_cb_index; index++) in ipw_fw_dma_kick()
2826 ipw_fw_dma_write_command_block(priv, index, in ipw_fw_dma_kick()
2827 &priv->sram_desc.cb_list[index]); in ipw_fw_dma_kick()
2830 ipw_clear_bit(priv, IPW_RESET_REG, in ipw_fw_dma_kick()
2836 ipw_write_reg32(priv, IPW_DMA_I_DMA_CONTROL, control); in ipw_fw_dma_kick()
2842 static void ipw_fw_dma_dump_command_block(struct ipw_priv *priv) in ipw_fw_dma_dump_command_block() argument
2849 address = ipw_read_reg32(priv, IPW_DMA_I_CURRENT_CB); in ipw_fw_dma_dump_command_block()
2853 register_value = ipw_read_reg32(priv, IPW_DMA_I_DMA_CONTROL); in ipw_fw_dma_dump_command_block()
2858 register_value = ipw_read_reg32(priv, cb_fields_address); in ipw_fw_dma_dump_command_block()
2862 register_value = ipw_read_reg32(priv, cb_fields_address); in ipw_fw_dma_dump_command_block()
2866 register_value = ipw_read_reg32(priv, cb_fields_address); in ipw_fw_dma_dump_command_block()
2871 register_value = ipw_read_reg32(priv, cb_fields_address); in ipw_fw_dma_dump_command_block()
2877 static int ipw_fw_dma_command_block_index(struct ipw_priv *priv) in ipw_fw_dma_command_block_index() argument
2883 current_cb_address = ipw_read_reg32(priv, IPW_DMA_I_CURRENT_CB); in ipw_fw_dma_command_block_index()
2896 static int ipw_fw_dma_add_command_block(struct ipw_priv *priv, in ipw_fw_dma_add_command_block() argument
2912 if (priv->sram_desc.last_cb_index >= CB_NUMBER_OF_ELEMENTS_SMALL) in ipw_fw_dma_add_command_block()
2915 last_cb_element = priv->sram_desc.last_cb_index; in ipw_fw_dma_add_command_block()
2916 cb = &priv->sram_desc.cb_list[last_cb_element]; in ipw_fw_dma_add_command_block()
2917 priv->sram_desc.last_cb_index++; in ipw_fw_dma_add_command_block()
2941 static int ipw_fw_dma_add_buffer(struct ipw_priv *priv, dma_addr_t *src_address, in ipw_fw_dma_add_buffer() argument
2953 ret = ipw_fw_dma_add_command_block(priv, src_address[i], in ipw_fw_dma_add_buffer()
2968 static int ipw_fw_dma_wait(struct ipw_priv *priv) in ipw_fw_dma_wait() argument
2975 current_index = ipw_fw_dma_command_block_index(priv); in ipw_fw_dma_wait()
2977 (int)priv->sram_desc.last_cb_index); in ipw_fw_dma_wait()
2979 while (current_index < priv->sram_desc.last_cb_index) { in ipw_fw_dma_wait()
2982 current_index = ipw_fw_dma_command_block_index(priv); in ipw_fw_dma_wait()
2990 ipw_fw_dma_dump_command_block(priv); in ipw_fw_dma_wait()
2991 ipw_fw_dma_abort(priv); in ipw_fw_dma_wait()
2996 ipw_fw_dma_abort(priv); in ipw_fw_dma_wait()
2999 ipw_set_bit(priv, IPW_RESET_REG, in ipw_fw_dma_wait()
3006 static void ipw_remove_current_network(struct ipw_priv *priv) in ipw_remove_current_network() argument
3012 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_remove_current_network()
3013 list_for_each_safe(element, safe, &priv->ieee->network_list) { in ipw_remove_current_network()
3015 if (ether_addr_equal(network->bssid, priv->bssid)) { in ipw_remove_current_network()
3018 &priv->ieee->network_free_list); in ipw_remove_current_network()
3021 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_remove_current_network()
3033 static inline int ipw_alive(struct ipw_priv *priv) in ipw_alive() argument
3035 return ipw_read32(priv, 0x90) == 0xd55555d5; in ipw_alive()
3039 static int ipw_poll_bit(struct ipw_priv *priv, u32 addr, u32 mask, in ipw_poll_bit() argument
3045 if ((ipw_read32(priv, addr) & mask) == mask) in ipw_poll_bit()
3059 static int ipw_stop_master(struct ipw_priv *priv) in ipw_stop_master() argument
3065 ipw_set_bit(priv, IPW_RESET_REG, IPW_RESET_REG_STOP_MASTER); in ipw_stop_master()
3068 rc = ipw_poll_bit(priv, IPW_RESET_REG, in ipw_stop_master()
3080 static void ipw_arc_release(struct ipw_priv *priv) in ipw_arc_release() argument
3085 ipw_clear_bit(priv, IPW_RESET_REG, CBD_RESET_REG_PRINCETON_RESET); in ipw_arc_release()
3096 static int ipw_load_ucode(struct ipw_priv *priv, u8 * data, size_t len) in ipw_load_ucode() argument
3106 rc = ipw_stop_master(priv); in ipw_load_ucode()
3113 ipw_write32(priv, addr, 0); in ipw_load_ucode()
3117 memset(&priv->dino_alive, 0, sizeof(priv->dino_alive)); in ipw_load_ucode()
3121 ipw_write_reg32(priv, IPW_MEM_HALT_AND_RESET, IPW_BIT_HALT_RESET_ON); in ipw_load_ucode()
3122 ipw_arc_release(priv); in ipw_load_ucode()
3123 ipw_write_reg32(priv, IPW_MEM_HALT_AND_RESET, IPW_BIT_HALT_RESET_OFF); in ipw_load_ucode()
3127 ipw_write_reg32(priv, IPW_INTERNAL_CMD_EVENT, IPW_BASEBAND_POWER_DOWN); in ipw_load_ucode()
3130 ipw_write_reg32(priv, IPW_INTERNAL_CMD_EVENT, 0); in ipw_load_ucode()
3134 ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, 0x0); in ipw_load_ucode()
3135 ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, DINO_ENABLE_CS); in ipw_load_ucode()
3148 ipw_write_reg16(priv, IPW_BASEBAND_CONTROL_STORE, in ipw_load_ucode()
3152 ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, 0); in ipw_load_ucode()
3153 ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, DINO_ENABLE_SYSTEM); in ipw_load_ucode()
3160 cr = ipw_read_reg8(priv, IPW_BASEBAND_CONTROL_STATUS); in ipw_load_ucode()
3168 __le32 response_buffer[(sizeof(priv->dino_alive) + 3) / 4]; in ipw_load_ucode()
3172 cpu_to_le32(ipw_read_reg32(priv, in ipw_load_ucode()
3174 memcpy(&priv->dino_alive, response_buffer, in ipw_load_ucode()
3175 sizeof(priv->dino_alive)); in ipw_load_ucode()
3176 if (priv->dino_alive.alive_command == 1 in ipw_load_ucode()
3177 && priv->dino_alive.ucode_valid == 1) { in ipw_load_ucode()
3182 priv->dino_alive.software_revision, in ipw_load_ucode()
3183 priv->dino_alive.software_revision, in ipw_load_ucode()
3184 priv->dino_alive.device_identifier, in ipw_load_ucode()
3185 priv->dino_alive.device_identifier, in ipw_load_ucode()
3186 priv->dino_alive.time_stamp[0], in ipw_load_ucode()
3187 priv->dino_alive.time_stamp[1], in ipw_load_ucode()
3188 priv->dino_alive.time_stamp[2], in ipw_load_ucode()
3189 priv->dino_alive.time_stamp[3], in ipw_load_ucode()
3190 priv->dino_alive.time_stamp[4]); in ipw_load_ucode()
3202 ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, 0); in ipw_load_ucode()
3207 static int ipw_load_firmware(struct ipw_priv *priv, u8 * data, size_t len) in ipw_load_firmware() argument
3231 pool = pci_pool_create("ipw2200", priv->pci_dev, CB_MAX_LENGTH, 0, 0); in ipw_load_firmware()
3240 ret = ipw_fw_dma_enable(priv); in ipw_load_firmware()
3243 BUG_ON(priv->sram_desc.last_cb_index > 0); in ipw_load_firmware()
3277 ret = ipw_fw_dma_add_buffer(priv, &phys[total_nr - nr], in ipw_load_firmware()
3289 ret = ipw_fw_dma_kick(priv); in ipw_load_firmware()
3295 ret = ipw_fw_dma_wait(priv); in ipw_load_firmware()
3312 static int ipw_stop_nic(struct ipw_priv *priv) in ipw_stop_nic() argument
3317 ipw_write32(priv, IPW_RESET_REG, IPW_RESET_REG_STOP_MASTER); in ipw_stop_nic()
3319 rc = ipw_poll_bit(priv, IPW_RESET_REG, in ipw_stop_nic()
3326 ipw_set_bit(priv, IPW_RESET_REG, CBD_RESET_REG_PRINCETON_RESET); in ipw_stop_nic()
3331 static void ipw_start_nic(struct ipw_priv *priv) in ipw_start_nic() argument
3336 ipw_clear_bit(priv, IPW_RESET_REG, in ipw_start_nic()
3342 ipw_set_bit(priv, IPW_GP_CNTRL_RW, in ipw_start_nic()
3348 static int ipw_init_nic(struct ipw_priv *priv) in ipw_init_nic() argument
3356 ipw_set_bit(priv, IPW_GP_CNTRL_RW, IPW_GP_CNTRL_BIT_INIT_DONE); in ipw_init_nic()
3359 ipw_write32(priv, IPW_READ_INT_REGISTER, in ipw_init_nic()
3363 rc = ipw_poll_bit(priv, IPW_GP_CNTRL_RW, in ipw_init_nic()
3369 ipw_set_bit(priv, IPW_RESET_REG, IPW_RESET_REG_SW_RESET); in ipw_init_nic()
3374 ipw_set_bit(priv, IPW_GP_CNTRL_RW, IPW_GP_CNTRL_BIT_INIT_DONE); in ipw_init_nic()
3383 static int ipw_reset_nic(struct ipw_priv *priv) in ipw_reset_nic() argument
3390 rc = ipw_init_nic(priv); in ipw_reset_nic()
3392 spin_lock_irqsave(&priv->lock, flags); in ipw_reset_nic()
3394 priv->status &= ~STATUS_HCMD_ACTIVE; in ipw_reset_nic()
3395 wake_up_interruptible(&priv->wait_command_queue); in ipw_reset_nic()
3396 priv->status &= ~(STATUS_SCANNING | STATUS_SCAN_ABORTING); in ipw_reset_nic()
3397 wake_up_interruptible(&priv->wait_state); in ipw_reset_nic()
3398 spin_unlock_irqrestore(&priv->lock, flags); in ipw_reset_nic()
3413 static int ipw_get_fw(struct ipw_priv *priv, in ipw_get_fw() argument
3420 rc = request_firmware(raw, name, &priv->pci_dev->dev); in ipw_get_fw()
3450 static void ipw_rx_queue_reset(struct ipw_priv *priv, in ipw_rx_queue_reset() argument
3466 pci_unmap_single(priv->pci_dev, rxq->pool[i].dma_addr, in ipw_rx_queue_reset()
3497 static int ipw_load(struct ipw_priv *priv) in ipw_load() argument
3507 switch (priv->ieee->iw_mode) { in ipw_load()
3529 rc = ipw_get_fw(priv, &raw, name); in ipw_load()
3545 if (!priv->rxq) in ipw_load()
3546 priv->rxq = ipw_rx_queue_alloc(priv); in ipw_load()
3548 ipw_rx_queue_reset(priv, priv->rxq); in ipw_load()
3549 if (!priv->rxq) { in ipw_load()
3557 ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL); in ipw_load()
3558 priv->status &= ~STATUS_INT_ENABLED; in ipw_load()
3561 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_MASK_ALL); in ipw_load()
3563 ipw_stop_nic(priv); in ipw_load()
3565 rc = ipw_reset_nic(priv); in ipw_load()
3571 ipw_zero_memory(priv, IPW_NIC_SRAM_LOWER_BOUND, in ipw_load()
3575 rc = ipw_load_firmware(priv, boot_img, le32_to_cpu(fw->boot_size)); in ipw_load()
3582 ipw_start_nic(priv); in ipw_load()
3585 rc = ipw_poll_bit(priv, IPW_INTA_RW, in ipw_load()
3594 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE); in ipw_load()
3597 rc = ipw_load_ucode(priv, ucode_img, le32_to_cpu(fw->ucode_size)); in ipw_load()
3604 ipw_stop_nic(priv); in ipw_load()
3607 rc = ipw_load_firmware(priv, fw_img, le32_to_cpu(fw->fw_size)); in ipw_load()
3616 ipw_write32(priv, IPW_EEPROM_LOAD_DISABLE, 0); in ipw_load()
3618 rc = ipw_queue_reset(priv); in ipw_load()
3625 ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL); in ipw_load()
3627 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_MASK_ALL); in ipw_load()
3630 ipw_start_nic(priv); in ipw_load()
3632 if (ipw_read32(priv, IPW_INTA_RW) & IPW_INTA_BIT_PARITY_ERROR) { in ipw_load()
3645 rc = ipw_poll_bit(priv, IPW_INTA_RW, in ipw_load()
3654 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE); in ipw_load()
3657 priv->eeprom_delay = 1; in ipw_load()
3658 ipw_read_eeprom(priv); in ipw_load()
3660 ipw_eeprom_init_sram(priv); in ipw_load()
3663 ipw_enable_interrupts(priv); in ipw_load()
3666 ipw_rx_queue_replenish(priv); in ipw_load()
3668 ipw_write32(priv, IPW_RX_READ_INDEX, priv->rxq->read); in ipw_load()
3671 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_MASK_ALL); in ipw_load()
3679 if (priv->rxq) { in ipw_load()
3680 ipw_rx_queue_free(priv, priv->rxq); in ipw_load()
3681 priv->rxq = NULL; in ipw_load()
3683 ipw_tx_queue_free(priv); in ipw_load()
3765 static void ipw_queue_init(struct ipw_priv *priv, struct clx2_queue *q, in ipw_queue_init() argument
3782 ipw_write32(priv, base, q->dma_addr); in ipw_queue_init()
3783 ipw_write32(priv, size, count); in ipw_queue_init()
3784 ipw_write32(priv, read, 0); in ipw_queue_init()
3785 ipw_write32(priv, write, 0); in ipw_queue_init()
3787 _ipw_read32(priv, 0x90); in ipw_queue_init()
3790 static int ipw_queue_tx_init(struct ipw_priv *priv, in ipw_queue_tx_init() argument
3794 struct pci_dev *dev = priv->pci_dev; in ipw_queue_tx_init()
3812 ipw_queue_init(priv, &q->q, count, read, write, base, size); in ipw_queue_tx_init()
3823 static void ipw_queue_tx_free_tfd(struct ipw_priv *priv, in ipw_queue_tx_free_tfd() argument
3827 struct pci_dev *dev = priv->pci_dev; in ipw_queue_tx_free_tfd()
3864 static void ipw_queue_tx_free(struct ipw_priv *priv, struct clx2_tx_queue *txq) in ipw_queue_tx_free() argument
3867 struct pci_dev *dev = priv->pci_dev; in ipw_queue_tx_free()
3875 ipw_queue_tx_free_tfd(priv, txq); in ipw_queue_tx_free()
3892 static void ipw_tx_queue_free(struct ipw_priv *priv) in ipw_tx_queue_free() argument
3895 ipw_queue_tx_free(priv, &priv->txq_cmd); in ipw_tx_queue_free()
3898 ipw_queue_tx_free(priv, &priv->txq[0]); in ipw_tx_queue_free()
3899 ipw_queue_tx_free(priv, &priv->txq[1]); in ipw_tx_queue_free()
3900 ipw_queue_tx_free(priv, &priv->txq[2]); in ipw_tx_queue_free()
3901 ipw_queue_tx_free(priv, &priv->txq[3]); in ipw_tx_queue_free()
3904 static void ipw_create_bssid(struct ipw_priv *priv, u8 * bssid) in ipw_create_bssid() argument
3907 bssid[0] = priv->mac_addr[0]; in ipw_create_bssid()
3908 bssid[1] = priv->mac_addr[1]; in ipw_create_bssid()
3909 bssid[2] = priv->mac_addr[2]; in ipw_create_bssid()
3918 static u8 ipw_add_station(struct ipw_priv *priv, u8 * bssid) in ipw_add_station() argument
3923 for (i = 0; i < priv->num_stations; i++) { in ipw_add_station()
3924 if (ether_addr_equal(priv->stations[i], bssid)) { in ipw_add_station()
3926 priv->missed_adhoc_beacons = 0; in ipw_add_station()
3927 if (!(priv->config & CFG_STATIC_CHANNEL)) in ipw_add_station()
3929 priv->config &= ~CFG_ADHOC_PERSIST; in ipw_add_station()
3943 memcpy(priv->stations[i], bssid, ETH_ALEN); in ipw_add_station()
3944 ipw_write_direct(priv, IPW_STATION_TABLE_LOWER + i * sizeof(entry), in ipw_add_station()
3946 priv->num_stations++; in ipw_add_station()
3951 static u8 ipw_find_station(struct ipw_priv *priv, u8 * bssid) in ipw_find_station() argument
3955 for (i = 0; i < priv->num_stations; i++) in ipw_find_station()
3956 if (ether_addr_equal(priv->stations[i], bssid)) in ipw_find_station()
3962 static void ipw_send_disassociate(struct ipw_priv *priv, int quiet) in ipw_send_disassociate() argument
3966 if (priv->status & STATUS_ASSOCIATING) { in ipw_send_disassociate()
3968 schedule_work(&priv->disassociate); in ipw_send_disassociate()
3972 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw_send_disassociate()
3979 priv->assoc_request.bssid, in ipw_send_disassociate()
3980 priv->assoc_request.channel); in ipw_send_disassociate()
3982 priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED); in ipw_send_disassociate()
3983 priv->status |= STATUS_DISASSOCIATING; in ipw_send_disassociate()
3986 priv->assoc_request.assoc_type = HC_DISASSOC_QUIET; in ipw_send_disassociate()
3988 priv->assoc_request.assoc_type = HC_DISASSOCIATE; in ipw_send_disassociate()
3990 err = ipw_send_associate(priv, &priv->assoc_request); in ipw_send_disassociate()
4001 struct ipw_priv *priv = data; in ipw_disassociate() local
4002 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) in ipw_disassociate()
4005 netif_carrier_off(priv->net_dev); in ipw_disassociate()
4011 struct ipw_priv *priv = in ipw_bg_disassociate() local
4013 mutex_lock(&priv->mutex); in ipw_bg_disassociate()
4014 ipw_disassociate(priv); in ipw_bg_disassociate()
4015 mutex_unlock(&priv->mutex); in ipw_bg_disassociate()
4020 struct ipw_priv *priv = in ipw_system_config() local
4024 if (priv->prom_net_dev && netif_running(priv->prom_net_dev)) { in ipw_system_config()
4025 priv->sys_config.accept_all_data_frames = 1; in ipw_system_config()
4026 priv->sys_config.accept_non_directed_frames = 1; in ipw_system_config()
4027 priv->sys_config.accept_all_mgmt_bcpr = 1; in ipw_system_config()
4028 priv->sys_config.accept_all_mgmt_frames = 1; in ipw_system_config()
4032 ipw_send_system_config(priv); in ipw_system_config()
4130 static void ipw_reset_stats(struct ipw_priv *priv) in ipw_reset_stats() argument
4134 priv->quality = 0; in ipw_reset_stats()
4136 average_init(&priv->average_missed_beacons); in ipw_reset_stats()
4137 priv->exp_avg_rssi = -60; in ipw_reset_stats()
4138 priv->exp_avg_noise = -85 + 0x100; in ipw_reset_stats()
4140 priv->last_rate = 0; in ipw_reset_stats()
4141 priv->last_missed_beacons = 0; in ipw_reset_stats()
4142 priv->last_rx_packets = 0; in ipw_reset_stats()
4143 priv->last_tx_packets = 0; in ipw_reset_stats()
4144 priv->last_tx_failures = 0; in ipw_reset_stats()
4148 ipw_get_ordinal(priv, IPW_ORD_STAT_RX_ERR_CRC, in ipw_reset_stats()
4149 &priv->last_rx_err, &len); in ipw_reset_stats()
4150 ipw_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURE, in ipw_reset_stats()
4151 &priv->last_tx_failures, &len); in ipw_reset_stats()
4154 priv->missed_adhoc_beacons = 0; in ipw_reset_stats()
4155 priv->missed_beacons = 0; in ipw_reset_stats()
4156 priv->tx_packets = 0; in ipw_reset_stats()
4157 priv->rx_packets = 0; in ipw_reset_stats()
4161 static u32 ipw_get_max_rate(struct ipw_priv *priv) in ipw_get_max_rate() argument
4164 u32 mask = priv->rates_mask; in ipw_get_max_rate()
4167 if (priv->assoc_request.ieee_mode == IPW_B_MODE) in ipw_get_max_rate()
4202 if (priv->ieee->mode == IEEE_B) in ipw_get_max_rate()
4208 static u32 ipw_get_current_rate(struct ipw_priv *priv) in ipw_get_current_rate() argument
4213 if (!(priv->status & STATUS_ASSOCIATED)) in ipw_get_current_rate()
4216 if (priv->tx_packets > IPW_REAL_RATE_RX_PACKET_THRESHOLD) { in ipw_get_current_rate()
4217 err = ipw_get_ordinal(priv, IPW_ORD_STAT_TX_CURR_RATE, &rate, in ipw_get_current_rate()
4224 return ipw_get_max_rate(priv); in ipw_get_current_rate()
4257 static void ipw_gather_stats(struct ipw_priv *priv) in ipw_gather_stats() argument
4269 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw_gather_stats()
4270 priv->quality = 0; in ipw_gather_stats()
4275 ipw_get_ordinal(priv, IPW_ORD_STAT_MISSED_BEACONS, in ipw_gather_stats()
4276 &priv->missed_beacons, &len); in ipw_gather_stats()
4277 missed_beacons_delta = priv->missed_beacons - priv->last_missed_beacons; in ipw_gather_stats()
4278 priv->last_missed_beacons = priv->missed_beacons; in ipw_gather_stats()
4279 if (priv->assoc_request.beacon_interval) { in ipw_gather_stats()
4281 (HZ * le16_to_cpu(priv->assoc_request.beacon_interval)) / in ipw_gather_stats()
4286 average_add(&priv->average_missed_beacons, missed_beacons_percent); in ipw_gather_stats()
4288 ipw_get_ordinal(priv, IPW_ORD_STAT_RX_ERR_CRC, &rx_err, &len); in ipw_gather_stats()
4289 rx_err_delta = rx_err - priv->last_rx_err; in ipw_gather_stats()
4290 priv->last_rx_err = rx_err; in ipw_gather_stats()
4292 ipw_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURE, &tx_failures, &len); in ipw_gather_stats()
4293 tx_failures_delta = tx_failures - priv->last_tx_failures; in ipw_gather_stats()
4294 priv->last_tx_failures = tx_failures; in ipw_gather_stats()
4296 rx_packets_delta = priv->rx_packets - priv->last_rx_packets; in ipw_gather_stats()
4297 priv->last_rx_packets = priv->rx_packets; in ipw_gather_stats()
4299 tx_packets_delta = priv->tx_packets - priv->last_tx_packets; in ipw_gather_stats()
4300 priv->last_tx_packets = priv->tx_packets; in ipw_gather_stats()
4323 priv->last_rate = ipw_get_current_rate(priv); in ipw_gather_stats()
4324 max_rate = ipw_get_max_rate(priv); in ipw_gather_stats()
4325 rate_quality = priv->last_rate * 40 / max_rate + 60; in ipw_gather_stats()
4327 rate_quality, priv->last_rate / 1000000); in ipw_gather_stats()
4345 rssi = priv->exp_avg_rssi; in ipw_gather_stats()
4348 (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) * in ipw_gather_stats()
4349 (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) - in ipw_gather_stats()
4350 (priv->ieee->perfect_rssi - rssi) * in ipw_gather_stats()
4351 (15 * (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) + in ipw_gather_stats()
4352 62 * (priv->ieee->perfect_rssi - rssi))) / in ipw_gather_stats()
4353 ((priv->ieee->perfect_rssi - priv->ieee->worst_rssi) * in ipw_gather_stats()
4354 (priv->ieee->perfect_rssi - priv->ieee->worst_rssi)); in ipw_gather_stats()
4383 priv->quality = quality; in ipw_gather_stats()
4385 schedule_delayed_work(&priv->gather_stats, IPW_STATS_INTERVAL); in ipw_gather_stats()
4390 struct ipw_priv *priv = in ipw_bg_gather_stats() local
4392 mutex_lock(&priv->mutex); in ipw_bg_gather_stats()
4393 ipw_gather_stats(priv); in ipw_bg_gather_stats()
4394 mutex_unlock(&priv->mutex); in ipw_bg_gather_stats()
4402 static void ipw_handle_missed_beacon(struct ipw_priv *priv, in ipw_handle_missed_beacon() argument
4405 priv->notif_missed_beacons = missed_count; in ipw_handle_missed_beacon()
4407 if (missed_count > priv->disassociate_threshold && in ipw_handle_missed_beacon()
4408 priv->status & STATUS_ASSOCIATED) { in ipw_handle_missed_beacon()
4415 priv->status &= ~STATUS_ROAMING; in ipw_handle_missed_beacon()
4416 if (priv->status & STATUS_SCANNING) { in ipw_handle_missed_beacon()
4420 schedule_work(&priv->abort_scan); in ipw_handle_missed_beacon()
4423 schedule_work(&priv->disassociate); in ipw_handle_missed_beacon()
4427 if (priv->status & STATUS_ROAMING) { in ipw_handle_missed_beacon()
4437 (missed_count > priv->roaming_threshold && in ipw_handle_missed_beacon()
4438 missed_count <= priv->disassociate_threshold)) { in ipw_handle_missed_beacon()
4446 if (!(priv->status & STATUS_ROAMING)) { in ipw_handle_missed_beacon()
4447 priv->status |= STATUS_ROAMING; in ipw_handle_missed_beacon()
4448 if (!(priv->status & STATUS_SCANNING)) in ipw_handle_missed_beacon()
4449 schedule_delayed_work(&priv->request_scan, 0); in ipw_handle_missed_beacon()
4454 if (priv->status & STATUS_SCANNING && in ipw_handle_missed_beacon()
4462 schedule_work(&priv->abort_scan); in ipw_handle_missed_beacon()
4472 struct ipw_priv *priv = in ipw_scan_event() local
4477 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL); in ipw_scan_event()
4480 static void handle_scan_event(struct ipw_priv *priv) in handle_scan_event() argument
4483 if (!priv->user_requested_scan) { in handle_scan_event()
4484 schedule_delayed_work(&priv->scan_event, in handle_scan_event()
4487 priv->user_requested_scan = 0; in handle_scan_event()
4488 mod_delayed_work(system_wq, &priv->scan_event, 0); in handle_scan_event()
4496 static void ipw_rx_notification(struct ipw_priv *priv, in ipw_rx_notification() argument
4512 priv->essid_len, priv->essid, in ipw_rx_notification()
4513 priv->bssid); in ipw_rx_notification()
4515 switch (priv->ieee->iw_mode) { in ipw_rx_notification()
4517 memcpy(priv->ieee->bssid, in ipw_rx_notification()
4518 priv->bssid, ETH_ALEN); in ipw_rx_notification()
4522 memcpy(priv->ieee->bssid, in ipw_rx_notification()
4523 priv->bssid, ETH_ALEN); in ipw_rx_notification()
4526 priv->num_stations = 0; in ipw_rx_notification()
4531 &priv->adhoc_check, in ipw_rx_notification()
4532 le16_to_cpu(priv-> in ipw_rx_notification()
4538 priv->status &= ~STATUS_ASSOCIATING; in ipw_rx_notification()
4539 priv->status |= STATUS_ASSOCIATED; in ipw_rx_notification()
4540 schedule_work(&priv->system_config); in ipw_rx_notification()
4545 if ((priv->status & STATUS_AUTH) && in ipw_rx_notification()
4562 libipw_rx_mgt(priv-> in ipw_rx_notification()
4572 schedule_work(&priv->link_up); in ipw_rx_notification()
4578 if (priv-> in ipw_rx_notification()
4587 priv->essid_len, in ipw_rx_notification()
4588 priv->essid, in ipw_rx_notification()
4589 priv->bssid, in ipw_rx_notification()
4595 priv->status &= in ipw_rx_notification()
4600 schedule_work(&priv->link_down); in ipw_rx_notification()
4607 priv->essid_len, priv->essid, in ipw_rx_notification()
4608 priv->bssid); in ipw_rx_notification()
4613 if (priv->status & STATUS_AUTH) { in ipw_rx_notification()
4634 priv->essid_len, priv->essid, in ipw_rx_notification()
4635 priv->bssid); in ipw_rx_notification()
4637 priv->status &= in ipw_rx_notification()
4641 if (priv->assoc_network in ipw_rx_notification()
4642 && (priv->assoc_network-> in ipw_rx_notification()
4646 (priv); in ipw_rx_notification()
4648 schedule_work(&priv->link_down); in ipw_rx_notification()
4671 priv->essid_len, priv->essid, in ipw_rx_notification()
4672 priv->bssid); in ipw_rx_notification()
4673 priv->status |= STATUS_AUTH; in ipw_rx_notification()
4677 if (priv->status & STATUS_AUTH) { in ipw_rx_notification()
4689 priv->essid_len, priv->essid, in ipw_rx_notification()
4690 priv->bssid); in ipw_rx_notification()
4692 priv->status &= ~(STATUS_ASSOCIATING | in ipw_rx_notification()
4696 schedule_work(&priv->link_down); in ipw_rx_notification()
4780 priv->status &= in ipw_rx_notification()
4783 wake_up_interruptible(&priv->wait_state); in ipw_rx_notification()
4784 cancel_delayed_work(&priv->scan_check); in ipw_rx_notification()
4786 if (priv->status & STATUS_EXIT_PENDING) in ipw_rx_notification()
4789 priv->ieee->scans++; in ipw_rx_notification()
4792 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw_rx_notification()
4793 priv->status |= STATUS_SCAN_FORCED; in ipw_rx_notification()
4794 schedule_delayed_work(&priv->request_scan, 0); in ipw_rx_notification()
4797 priv->status &= ~STATUS_SCAN_FORCED; in ipw_rx_notification()
4801 if (priv->status & STATUS_DIRECT_SCAN_PENDING) in ipw_rx_notification()
4802 schedule_delayed_work(&priv->request_direct_scan, 0); in ipw_rx_notification()
4804 if (!(priv->status & (STATUS_ASSOCIATED | in ipw_rx_notification()
4808 schedule_work(&priv->associate); in ipw_rx_notification()
4809 else if (priv->status & STATUS_ROAMING) { in ipw_rx_notification()
4815 schedule_work(&priv->roam); in ipw_rx_notification()
4818 priv->status &= ~STATUS_ROAMING; in ipw_rx_notification()
4819 } else if (priv->status & STATUS_SCAN_PENDING) in ipw_rx_notification()
4820 schedule_delayed_work(&priv->request_scan, 0); in ipw_rx_notification()
4821 else if (priv->config & CFG_BACKGROUND_SCAN in ipw_rx_notification()
4822 && priv->status & STATUS_ASSOCIATED) in ipw_rx_notification()
4823 schedule_delayed_work(&priv->request_scan, in ipw_rx_notification()
4836 handle_scan_event(priv); in ipw_rx_notification()
4862 memcpy(&priv->last_link_deterioration, x, in ipw_rx_notification()
4874 if (priv->hcmd in ipw_rx_notification()
4875 && priv->hcmd->cmd != HOST_CMD_DINO_CONFIG) in ipw_rx_notification()
4892 ipw_handle_missed_beacon(priv, in ipw_rx_notification()
4919 memcpy(&priv->calib, x, sizeof(*x)); in ipw_rx_notification()
4932 priv->exp_avg_noise = in ipw_rx_notification()
4933 exponential_average(priv->exp_avg_noise, in ipw_rx_notification()
4958 static int ipw_queue_reset(struct ipw_priv *priv) in ipw_queue_reset() argument
4963 ipw_tx_queue_free(priv); in ipw_queue_reset()
4965 rc = ipw_queue_tx_init(priv, &priv->txq_cmd, nTxCmd, in ipw_queue_reset()
4975 rc = ipw_queue_tx_init(priv, &priv->txq[0], nTx, in ipw_queue_reset()
4983 rc = ipw_queue_tx_init(priv, &priv->txq[1], nTx, in ipw_queue_reset()
4991 rc = ipw_queue_tx_init(priv, &priv->txq[2], nTx, in ipw_queue_reset()
4999 rc = ipw_queue_tx_init(priv, &priv->txq[3], nTx, in ipw_queue_reset()
5008 priv->rx_bufs_min = 0; in ipw_queue_reset()
5009 priv->rx_pend_max = 0; in ipw_queue_reset()
5013 ipw_tx_queue_free(priv); in ipw_queue_reset()
5030 static int ipw_queue_tx_reclaim(struct ipw_priv *priv, in ipw_queue_tx_reclaim() argument
5037 hw_tail = ipw_read32(priv, q->reg_r); in ipw_queue_tx_reclaim()
5046 ipw_queue_tx_free_tfd(priv, txq); in ipw_queue_tx_reclaim()
5047 priv->tx_packets++; in ipw_queue_tx_reclaim()
5052 netif_wake_queue(priv->net_dev); in ipw_queue_tx_reclaim()
5060 static int ipw_queue_tx_hcmd(struct ipw_priv *priv, int hcmd, void *buf, in ipw_queue_tx_hcmd() argument
5063 struct clx2_tx_queue *txq = &priv->txq_cmd; in ipw_queue_tx_hcmd()
5078 priv->hcmd_seq++; in ipw_queue_tx_hcmd()
5083 ipw_write32(priv, q->reg_w, q->first_empty); in ipw_queue_tx_hcmd()
5084 _ipw_read32(priv, 0x90); in ipw_queue_tx_hcmd()
5162 static void ipw_rx_queue_restock(struct ipw_priv *priv) in ipw_rx_queue_restock() argument
5164 struct ipw_rx_queue *rxq = priv->rxq; in ipw_rx_queue_restock()
5177 ipw_write32(priv, IPW_RFDS_TABLE_LOWER + rxq->write * RFD_SIZE, in ipw_rx_queue_restock()
5188 schedule_work(&priv->rx_replenish); in ipw_rx_queue_restock()
5192 ipw_write32(priv, IPW_RX_WRITE_INDEX, rxq->write); in ipw_rx_queue_restock()
5203 struct ipw_priv *priv = data; in ipw_rx_queue_replenish() local
5204 struct ipw_rx_queue *rxq = priv->rxq; in ipw_rx_queue_replenish()
5216 priv->net_dev->name); in ipw_rx_queue_replenish()
5225 pci_map_single(priv->pci_dev, rxb->skb->data, in ipw_rx_queue_replenish()
5233 ipw_rx_queue_restock(priv); in ipw_rx_queue_replenish()
5238 struct ipw_priv *priv = in ipw_bg_rx_queue_replenish() local
5240 mutex_lock(&priv->mutex); in ipw_bg_rx_queue_replenish()
5241 ipw_rx_queue_replenish(priv); in ipw_bg_rx_queue_replenish()
5242 mutex_unlock(&priv->mutex); in ipw_bg_rx_queue_replenish()
5250 static void ipw_rx_queue_free(struct ipw_priv *priv, struct ipw_rx_queue *rxq) in ipw_rx_queue_free() argument
5259 pci_unmap_single(priv->pci_dev, rxq->pool[i].dma_addr, in ipw_rx_queue_free()
5268 static struct ipw_rx_queue *ipw_rx_queue_alloc(struct ipw_priv *priv) in ipw_rx_queue_alloc() argument
5294 static int ipw_is_rate_in_mask(struct ipw_priv *priv, int ieee_mode, u8 rate) in ipw_is_rate_in_mask() argument
5300 return priv->rates_mask & LIBIPW_OFDM_RATE_6MB_MASK ? in ipw_is_rate_in_mask()
5303 return priv->rates_mask & LIBIPW_OFDM_RATE_9MB_MASK ? in ipw_is_rate_in_mask()
5306 return priv-> in ipw_is_rate_in_mask()
5309 return priv-> in ipw_is_rate_in_mask()
5312 return priv-> in ipw_is_rate_in_mask()
5315 return priv-> in ipw_is_rate_in_mask()
5318 return priv-> in ipw_is_rate_in_mask()
5321 return priv-> in ipw_is_rate_in_mask()
5331 return priv->rates_mask & LIBIPW_CCK_RATE_1MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5333 return priv->rates_mask & LIBIPW_CCK_RATE_2MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5335 return priv->rates_mask & LIBIPW_CCK_RATE_5MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5337 return priv->rates_mask & LIBIPW_CCK_RATE_11MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5347 return priv->rates_mask & LIBIPW_OFDM_RATE_6MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5349 return priv->rates_mask & LIBIPW_OFDM_RATE_9MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5351 return priv->rates_mask & LIBIPW_OFDM_RATE_12MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5353 return priv->rates_mask & LIBIPW_OFDM_RATE_18MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5355 return priv->rates_mask & LIBIPW_OFDM_RATE_24MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5357 return priv->rates_mask & LIBIPW_OFDM_RATE_36MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5359 return priv->rates_mask & LIBIPW_OFDM_RATE_48MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5361 return priv->rates_mask & LIBIPW_OFDM_RATE_54MB_MASK ? 1 : 0; in ipw_is_rate_in_mask()
5367 static int ipw_compatible_rates(struct ipw_priv *priv, in ipw_compatible_rates() argument
5377 if (!ipw_is_rate_in_mask(priv, network->mode, in ipw_compatible_rates()
5390 network->rates[i], priv->rates_mask); in ipw_compatible_rates()
5400 if (!ipw_is_rate_in_mask(priv, network->mode, in ipw_compatible_rates()
5412 network->rates_ex[i], priv->rates_mask); in ipw_compatible_rates()
5502 static int ipw_find_adhoc_network(struct ipw_priv *priv, in ipw_find_adhoc_network() argument
5511 if ((priv->ieee->iw_mode == IW_MODE_ADHOC && in ipw_find_adhoc_network()
5533 if ((priv->config & CFG_STATIC_ESSID) && in ipw_find_adhoc_network()
5534 ((network->ssid_len != priv->essid_len) || in ipw_find_adhoc_network()
5535 memcmp(network->ssid, priv->essid, in ipw_find_adhoc_network()
5536 min(network->ssid_len, priv->essid_len)))) { in ipw_find_adhoc_network()
5539 network->bssid, priv->essid_len, in ipw_find_adhoc_network()
5540 priv->essid); in ipw_find_adhoc_network()
5559 if (priv->ieee->scan_age != 0 && in ipw_find_adhoc_network()
5560 time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) { in ipw_find_adhoc_network()
5569 if ((priv->config & CFG_STATIC_CHANNEL) && in ipw_find_adhoc_network()
5570 (network->channel != priv->channel)) { in ipw_find_adhoc_network()
5574 network->channel, priv->channel); in ipw_find_adhoc_network()
5579 if (((priv->capability & CAP_PRIVACY_ON) ? 1 : 0) != in ipw_find_adhoc_network()
5584 priv-> in ipw_find_adhoc_network()
5592 if (ether_addr_equal(network->bssid, priv->bssid)) { in ipw_find_adhoc_network()
5595 network->bssid, priv->bssid); in ipw_find_adhoc_network()
5600 if (!libipw_is_valid_mode(priv->ieee, network->mode)) { in ipw_find_adhoc_network()
5609 if (!ipw_compatible_rates(priv, network, &rates)) { in ipw_find_adhoc_network()
5638 struct ipw_priv *priv = in ipw_merge_adhoc_network() local
5642 .network = priv->assoc_network in ipw_merge_adhoc_network()
5645 if ((priv->status & STATUS_ASSOCIATED) && in ipw_merge_adhoc_network()
5646 (priv->ieee->iw_mode == IW_MODE_ADHOC)) { in ipw_merge_adhoc_network()
5651 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_merge_adhoc_network()
5652 list_for_each_entry(network, &priv->ieee->network_list, list) { in ipw_merge_adhoc_network()
5653 if (network != priv->assoc_network) in ipw_merge_adhoc_network()
5654 ipw_find_adhoc_network(priv, &match, network, in ipw_merge_adhoc_network()
5657 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_merge_adhoc_network()
5659 if (match.network == priv->assoc_network) { in ipw_merge_adhoc_network()
5665 mutex_lock(&priv->mutex); in ipw_merge_adhoc_network()
5666 if ((priv->ieee->iw_mode == IW_MODE_ADHOC)) { in ipw_merge_adhoc_network()
5668 priv->essid_len, priv->essid); in ipw_merge_adhoc_network()
5669 ipw_remove_current_network(priv); in ipw_merge_adhoc_network()
5672 ipw_disassociate(priv); in ipw_merge_adhoc_network()
5673 priv->assoc_network = match.network; in ipw_merge_adhoc_network()
5674 mutex_unlock(&priv->mutex); in ipw_merge_adhoc_network()
5679 static int ipw_best_network(struct ipw_priv *priv, in ipw_best_network() argument
5687 if ((priv->ieee->iw_mode == IW_MODE_INFRA && in ipw_best_network()
5689 (priv->ieee->iw_mode == IW_MODE_ADHOC && in ipw_best_network()
5711 if ((priv->config & CFG_STATIC_ESSID) && in ipw_best_network()
5712 ((network->ssid_len != priv->essid_len) || in ipw_best_network()
5713 memcmp(network->ssid, priv->essid, in ipw_best_network()
5714 min(network->ssid_len, priv->essid_len)))) { in ipw_best_network()
5717 network->bssid, priv->essid_len, in ipw_best_network()
5718 priv->essid); in ipw_best_network()
5746 if (priv->ieee->scan_age != 0 && in ipw_best_network()
5747 time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) { in ipw_best_network()
5756 if ((priv->config & CFG_STATIC_CHANNEL) && in ipw_best_network()
5757 (network->channel != priv->channel)) { in ipw_best_network()
5761 network->channel, priv->channel); in ipw_best_network()
5766 if (((priv->capability & CAP_PRIVACY_ON) ? 1 : 0) != in ipw_best_network()
5771 priv->capability & CAP_PRIVACY_ON ? "on" : in ipw_best_network()
5778 if ((priv->config & CFG_STATIC_BSSID) && in ipw_best_network()
5779 !ether_addr_equal(network->bssid, priv->bssid)) { in ipw_best_network()
5782 network->bssid, priv->bssid); in ipw_best_network()
5787 if (!libipw_is_valid_mode(priv->ieee, network->mode)) { in ipw_best_network()
5795 if (!libipw_is_valid_channel(priv->ieee, network->channel)) { in ipw_best_network()
5804 if (!ipw_compatible_rates(priv, network, &rates)) { in ipw_best_network()
5832 static void ipw_adhoc_create(struct ipw_priv *priv, in ipw_adhoc_create() argument
5835 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw_adhoc_create()
5850 switch (libipw_is_valid_channel(priv->ieee, priv->channel)) { in ipw_adhoc_create()
5853 i = libipw_channel_to_index(priv->ieee, priv->channel); in ipw_adhoc_create()
5857 priv->channel = geo->a[0].channel; in ipw_adhoc_create()
5862 if (priv->ieee->mode & IEEE_G) in ipw_adhoc_create()
5866 i = libipw_channel_to_index(priv->ieee, priv->channel); in ipw_adhoc_create()
5870 priv->channel = geo->bg[0].channel; in ipw_adhoc_create()
5876 if (priv->ieee->mode & IEEE_A) { in ipw_adhoc_create()
5878 priv->channel = geo->a[0].channel; in ipw_adhoc_create()
5879 } else if (priv->ieee->mode & IEEE_G) { in ipw_adhoc_create()
5881 priv->channel = geo->bg[0].channel; in ipw_adhoc_create()
5884 priv->channel = geo->bg[0].channel; in ipw_adhoc_create()
5889 network->channel = priv->channel; in ipw_adhoc_create()
5890 priv->config |= CFG_ADHOC_PERSIST; in ipw_adhoc_create()
5891 ipw_create_bssid(priv, network->bssid); in ipw_adhoc_create()
5892 network->ssid_len = priv->essid_len; in ipw_adhoc_create()
5893 memcpy(network->ssid, priv->essid, priv->essid_len); in ipw_adhoc_create()
5896 if (!(priv->config & CFG_PREAMBLE_LONG)) in ipw_adhoc_create()
5898 if (priv->capability & CAP_PRIVACY_ON) in ipw_adhoc_create()
5900 network->rates_len = min(priv->rates.num_rates, MAX_RATES_LENGTH); in ipw_adhoc_create()
5901 memcpy(network->rates, priv->rates.supported_rates, network->rates_len); in ipw_adhoc_create()
5902 network->rates_ex_len = priv->rates.num_rates - network->rates_len; in ipw_adhoc_create()
5904 &priv->rates.supported_rates[network->rates_len], in ipw_adhoc_create()
5918 static void ipw_send_tgi_tx_key(struct ipw_priv *priv, int type, int index) in ipw_send_tgi_tx_key() argument
5922 if (!(priv->ieee->sec.flags & (1 << index))) in ipw_send_tgi_tx_key()
5926 memcpy(key.key, priv->ieee->sec.keys[index], SCM_TEMPORAL_KEY_LENGTH); in ipw_send_tgi_tx_key()
5934 ipw_send_cmd_pdu(priv, IPW_CMD_TGI_TX_KEY, sizeof(key), &key); in ipw_send_tgi_tx_key()
5937 static void ipw_send_wep_keys(struct ipw_priv *priv, int type) in ipw_send_wep_keys() argument
5949 if (!(priv->ieee->sec.flags & (1 << i))) { in ipw_send_wep_keys()
5954 key.key_size = priv->ieee->sec.key_sizes[i]; in ipw_send_wep_keys()
5955 memcpy(key.key, priv->ieee->sec.keys[i], key.key_size); in ipw_send_wep_keys()
5957 ipw_send_cmd_pdu(priv, IPW_CMD_WEP_KEY, sizeof(key), &key); in ipw_send_wep_keys()
5961 static void ipw_set_hw_decrypt_unicast(struct ipw_priv *priv, int level) in ipw_set_hw_decrypt_unicast() argument
5963 if (priv->ieee->host_encrypt) in ipw_set_hw_decrypt_unicast()
5968 priv->sys_config.disable_unicast_decryption = 0; in ipw_set_hw_decrypt_unicast()
5969 priv->ieee->host_decrypt = 0; in ipw_set_hw_decrypt_unicast()
5972 priv->sys_config.disable_unicast_decryption = 1; in ipw_set_hw_decrypt_unicast()
5973 priv->ieee->host_decrypt = 1; in ipw_set_hw_decrypt_unicast()
5976 priv->sys_config.disable_unicast_decryption = 0; in ipw_set_hw_decrypt_unicast()
5977 priv->ieee->host_decrypt = 0; in ipw_set_hw_decrypt_unicast()
5980 priv->sys_config.disable_unicast_decryption = 1; in ipw_set_hw_decrypt_unicast()
5987 static void ipw_set_hw_decrypt_multicast(struct ipw_priv *priv, int level) in ipw_set_hw_decrypt_multicast() argument
5989 if (priv->ieee->host_encrypt) in ipw_set_hw_decrypt_multicast()
5994 priv->sys_config.disable_multicast_decryption = 0; in ipw_set_hw_decrypt_multicast()
5997 priv->sys_config.disable_multicast_decryption = 1; in ipw_set_hw_decrypt_multicast()
6000 priv->sys_config.disable_multicast_decryption = 0; in ipw_set_hw_decrypt_multicast()
6003 priv->sys_config.disable_multicast_decryption = 1; in ipw_set_hw_decrypt_multicast()
6010 static void ipw_set_hwcrypto_keys(struct ipw_priv *priv) in ipw_set_hwcrypto_keys() argument
6012 switch (priv->ieee->sec.level) { in ipw_set_hwcrypto_keys()
6014 if (priv->ieee->sec.flags & SEC_ACTIVE_KEY) in ipw_set_hwcrypto_keys()
6015 ipw_send_tgi_tx_key(priv, in ipw_set_hwcrypto_keys()
6017 priv->ieee->sec.active_key); in ipw_set_hwcrypto_keys()
6019 if (!priv->ieee->host_mc_decrypt) in ipw_set_hwcrypto_keys()
6020 ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_CCM); in ipw_set_hwcrypto_keys()
6023 if (priv->ieee->sec.flags & SEC_ACTIVE_KEY) in ipw_set_hwcrypto_keys()
6024 ipw_send_tgi_tx_key(priv, in ipw_set_hwcrypto_keys()
6026 priv->ieee->sec.active_key); in ipw_set_hwcrypto_keys()
6029 ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_WEP); in ipw_set_hwcrypto_keys()
6030 ipw_set_hw_decrypt_unicast(priv, priv->ieee->sec.level); in ipw_set_hwcrypto_keys()
6031 ipw_set_hw_decrypt_multicast(priv, priv->ieee->sec.level); in ipw_set_hwcrypto_keys()
6041 struct ipw_priv *priv = data; in ipw_adhoc_check() local
6043 if (priv->missed_adhoc_beacons++ > priv->disassociate_threshold && in ipw_adhoc_check()
6044 !(priv->config & CFG_ADHOC_PERSIST)) { in ipw_adhoc_check()
6048 priv->missed_adhoc_beacons); in ipw_adhoc_check()
6049 ipw_remove_current_network(priv); in ipw_adhoc_check()
6050 ipw_disassociate(priv); in ipw_adhoc_check()
6054 schedule_delayed_work(&priv->adhoc_check, in ipw_adhoc_check()
6055 le16_to_cpu(priv->assoc_request.beacon_interval)); in ipw_adhoc_check()
6060 struct ipw_priv *priv = in ipw_bg_adhoc_check() local
6062 mutex_lock(&priv->mutex); in ipw_bg_adhoc_check()
6063 ipw_adhoc_check(priv); in ipw_bg_adhoc_check()
6064 mutex_unlock(&priv->mutex); in ipw_bg_adhoc_check()
6067 static void ipw_debug_config(struct ipw_priv *priv) in ipw_debug_config() argument
6070 "[CFG 0x%08X]\n", priv->config); in ipw_debug_config()
6071 if (priv->config & CFG_STATIC_CHANNEL) in ipw_debug_config()
6072 IPW_DEBUG_INFO("Channel locked to %d\n", priv->channel); in ipw_debug_config()
6075 if (priv->config & CFG_STATIC_ESSID) in ipw_debug_config()
6077 priv->essid_len, priv->essid); in ipw_debug_config()
6080 if (priv->config & CFG_STATIC_BSSID) in ipw_debug_config()
6081 IPW_DEBUG_INFO("BSSID locked to %pM\n", priv->bssid); in ipw_debug_config()
6084 if (priv->capability & CAP_PRIVACY_ON) in ipw_debug_config()
6088 IPW_DEBUG_INFO("RATE MASK: 0x%08X\n", priv->rates_mask); in ipw_debug_config()
6091 static void ipw_set_fixed_rate(struct ipw_priv *priv, int mode) in ipw_set_fixed_rate() argument
6097 u16 new_tx_rates = priv->rates_mask; in ipw_set_fixed_rate()
6102 switch (priv->ieee->freq_band) { in ipw_set_fixed_rate()
6105 if (priv->rates_mask & ~LIBIPW_OFDM_RATES_MASK) { in ipw_set_fixed_rate()
6159 reg = ipw_read32(priv, IPW_MEM_FIXED_OVERRIDE); in ipw_set_fixed_rate()
6160 ipw_write_reg32(priv, reg, *(u32 *) & fr); in ipw_set_fixed_rate()
6163 static void ipw_abort_scan(struct ipw_priv *priv) in ipw_abort_scan() argument
6167 if (priv->status & STATUS_SCAN_ABORTING) { in ipw_abort_scan()
6171 priv->status |= STATUS_SCAN_ABORTING; in ipw_abort_scan()
6173 err = ipw_send_scan_abort(priv); in ipw_abort_scan()
6178 static void ipw_add_scan_channels(struct ipw_priv *priv, in ipw_add_scan_channels() argument
6186 geo = libipw_get_geo(priv->ieee); in ipw_add_scan_channels()
6188 if (priv->ieee->freq_band & LIBIPW_52GHZ_BAND) { in ipw_add_scan_channels()
6191 if ((priv->status & STATUS_ASSOCIATED) && in ipw_add_scan_channels()
6192 geo->a[i].channel == priv->channel) in ipw_add_scan_channels()
6210 if (priv->ieee->freq_band & LIBIPW_24GHZ_BAND) { in ipw_add_scan_channels()
6212 if (priv->config & CFG_SPEED_SCAN) { in ipw_add_scan_channels()
6222 priv->speed_scan[priv->speed_scan_pos]; in ipw_add_scan_channels()
6224 priv->speed_scan_pos = 0; in ipw_add_scan_channels()
6225 channel = priv->speed_scan[0]; in ipw_add_scan_channels()
6227 if ((priv->status & STATUS_ASSOCIATED) && in ipw_add_scan_channels()
6228 channel == priv->channel) { in ipw_add_scan_channels()
6229 priv->speed_scan_pos++; in ipw_add_scan_channels()
6242 priv->speed_scan_pos++; in ipw_add_scan_channels()
6246 libipw_channel_to_index(priv->ieee, channel); in ipw_add_scan_channels()
6256 if ((priv->status & STATUS_ASSOCIATED) && in ipw_add_scan_channels()
6257 geo->bg[i].channel == priv->channel) in ipw_add_scan_channels()
6278 static int ipw_passive_dwell_time(struct ipw_priv *priv) in ipw_passive_dwell_time() argument
6285 if (priv->status & STATUS_ASSOCIATED in ipw_passive_dwell_time()
6286 && priv->assoc_network->beacon_interval > 10) in ipw_passive_dwell_time()
6287 return priv->assoc_network->beacon_interval - 10; in ipw_passive_dwell_time()
6292 static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct) in ipw_request_scan_helper() argument
6297 if (!(priv->status & STATUS_INIT) || in ipw_request_scan_helper()
6298 (priv->status & STATUS_EXIT_PENDING)) in ipw_request_scan_helper()
6301 mutex_lock(&priv->mutex); in ipw_request_scan_helper()
6303 if (direct && (priv->direct_scan_ssid_len == 0)) { in ipw_request_scan_helper()
6305 priv->status &= ~STATUS_DIRECT_SCAN_PENDING; in ipw_request_scan_helper()
6309 if (priv->status & STATUS_SCANNING) { in ipw_request_scan_helper()
6311 priv->status |= direct ? STATUS_DIRECT_SCAN_PENDING : in ipw_request_scan_helper()
6316 if (!(priv->status & STATUS_SCAN_FORCED) && in ipw_request_scan_helper()
6317 priv->status & STATUS_SCAN_ABORTING) { in ipw_request_scan_helper()
6319 priv->status |= direct ? STATUS_DIRECT_SCAN_PENDING : in ipw_request_scan_helper()
6324 if (priv->status & STATUS_RF_KILL_MASK) { in ipw_request_scan_helper()
6326 priv->status |= direct ? STATUS_DIRECT_SCAN_PENDING : in ipw_request_scan_helper()
6332 scan.full_scan_index = cpu_to_le32(libipw_get_scans(priv->ieee)); in ipw_request_scan_helper()
6338 cpu_to_le16(ipw_passive_dwell_time(priv)); in ipw_request_scan_helper()
6339 ipw_add_scan_channels(priv, &scan, scan_type); in ipw_request_scan_helper()
6344 if (priv->config & CFG_SPEED_SCAN) in ipw_request_scan_helper()
6355 cpu_to_le16(ipw_passive_dwell_time(priv)); in ipw_request_scan_helper()
6359 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw_request_scan_helper()
6363 switch (libipw_is_valid_channel(priv->ieee, priv->channel)) { in ipw_request_scan_helper()
6366 channel = priv->channel; in ipw_request_scan_helper()
6371 channel = priv->channel; in ipw_request_scan_helper()
6400 err = ipw_send_ssid(priv, priv->direct_scan_ssid, in ipw_request_scan_helper()
6401 priv->direct_scan_ssid_len); in ipw_request_scan_helper()
6409 } else if ((priv->status & STATUS_ROAMING) in ipw_request_scan_helper()
6410 || (!(priv->status & STATUS_ASSOCIATED) in ipw_request_scan_helper()
6411 && (priv->config & CFG_STATIC_ESSID) in ipw_request_scan_helper()
6413 err = ipw_send_ssid(priv, priv->essid, priv->essid_len); in ipw_request_scan_helper()
6424 ipw_add_scan_channels(priv, &scan, scan_type); in ipw_request_scan_helper()
6430 err = ipw_send_scan_request_ext(priv, &scan); in ipw_request_scan_helper()
6436 priv->status |= STATUS_SCANNING; in ipw_request_scan_helper()
6438 priv->status &= ~STATUS_DIRECT_SCAN_PENDING; in ipw_request_scan_helper()
6439 priv->direct_scan_ssid_len = 0; in ipw_request_scan_helper()
6441 priv->status &= ~STATUS_SCAN_PENDING; in ipw_request_scan_helper()
6443 schedule_delayed_work(&priv->scan_check, IPW_SCAN_CHECK_WATCHDOG); in ipw_request_scan_helper()
6445 mutex_unlock(&priv->mutex); in ipw_request_scan_helper()
6451 struct ipw_priv *priv = in ipw_request_passive_scan() local
6453 ipw_request_scan_helper(priv, IW_SCAN_TYPE_PASSIVE, 0); in ipw_request_passive_scan()
6458 struct ipw_priv *priv = in ipw_request_scan() local
6460 ipw_request_scan_helper(priv, IW_SCAN_TYPE_ACTIVE, 0); in ipw_request_scan()
6465 struct ipw_priv *priv = in ipw_request_direct_scan() local
6467 ipw_request_scan_helper(priv, IW_SCAN_TYPE_ACTIVE, 1); in ipw_request_direct_scan()
6472 struct ipw_priv *priv = in ipw_bg_abort_scan() local
6474 mutex_lock(&priv->mutex); in ipw_bg_abort_scan()
6475 ipw_abort_scan(priv); in ipw_bg_abort_scan()
6476 mutex_unlock(&priv->mutex); in ipw_bg_abort_scan()
6479 static int ipw_wpa_enable(struct ipw_priv *priv, int value) in ipw_wpa_enable() argument
6483 priv->ieee->wpa_enabled = value; in ipw_wpa_enable()
6487 static int ipw_wpa_set_auth_algs(struct ipw_priv *priv, int value) in ipw_wpa_set_auth_algs() argument
6489 struct libipw_device *ieee = priv->ieee; in ipw_wpa_set_auth_algs()
6515 static void ipw_wpa_assoc_frame(struct ipw_priv *priv, char *wpa_ie, in ipw_wpa_assoc_frame() argument
6519 ipw_wpa_enable(priv, 1); in ipw_wpa_assoc_frame()
6522 static int ipw_set_rsn_capa(struct ipw_priv *priv, in ipw_set_rsn_capa() argument
6527 return ipw_send_cmd_pdu(priv, IPW_CMD_RSN_CAPABILITIES, length, in ipw_set_rsn_capa()
6540 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_genie() local
6541 struct libipw_device *ieee = priv->ieee; in ipw_wx_set_genie()
6565 ipw_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len); in ipw_wx_set_genie()
6575 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_genie() local
6576 struct libipw_device *ieee = priv->ieee; in ipw_wx_get_genie()
6618 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_auth() local
6619 struct libipw_device *ieee = priv->ieee; in ipw_wx_set_auth()
6629 ipw_set_hw_decrypt_unicast(priv, in ipw_wx_set_auth()
6633 ipw_set_hw_decrypt_multicast(priv, in ipw_wx_set_auth()
6643 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx]; in ipw_wx_set_auth()
6647 flags = crypt->ops->get_flags(crypt->priv); in ipw_wx_set_auth()
6654 crypt->ops->set_flags(flags, crypt->priv); in ipw_wx_set_auth()
6674 priv->ieee->drop_unencrypted = param->value; in ipw_wx_set_auth()
6685 if (priv->ieee->set_security) in ipw_wx_set_auth()
6686 priv->ieee->set_security(priv->ieee->dev, &sec); in ipw_wx_set_auth()
6691 ret = ipw_wpa_set_auth_algs(priv, param->value); in ipw_wx_set_auth()
6695 ret = ipw_wpa_enable(priv, param->value); in ipw_wx_set_auth()
6696 ipw_disassociate(priv); in ipw_wx_set_auth()
6718 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_auth() local
6719 struct libipw_device *ieee = priv->ieee; in ipw_wx_get_auth()
6734 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx]; in ipw_wx_get_auth()
6738 param->value = (crypt->ops->get_flags(crypt->priv) & in ipw_wx_get_auth()
6775 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_encodeext() local
6783 priv->ieee->host_mc_decrypt = 1; in ipw_wx_set_encodeext()
6785 priv->ieee->host_encrypt = 0; in ipw_wx_set_encodeext()
6786 priv->ieee->host_encrypt_msdu = 1; in ipw_wx_set_encodeext()
6787 priv->ieee->host_decrypt = 1; in ipw_wx_set_encodeext()
6790 priv->ieee->host_encrypt = 0; in ipw_wx_set_encodeext()
6791 priv->ieee->host_encrypt_msdu = 0; in ipw_wx_set_encodeext()
6792 priv->ieee->host_decrypt = 0; in ipw_wx_set_encodeext()
6793 priv->ieee->host_mc_decrypt = 0; in ipw_wx_set_encodeext()
6797 return libipw_wx_set_encodeext(priv->ieee, info, wrqu, extra); in ipw_wx_set_encodeext()
6805 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_encodeext() local
6806 return libipw_wx_get_encodeext(priv->ieee, info, wrqu, extra); in ipw_wx_get_encodeext()
6814 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_mlme() local
6826 ipw_disassociate(priv); in ipw_wx_set_mlme()
6842 static u8 ipw_qos_current_mode(struct ipw_priv * priv) in ipw_qos_current_mode() argument
6846 if (priv->status & STATUS_ASSOCIATED) { in ipw_qos_current_mode()
6849 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_qos_current_mode()
6850 mode = priv->assoc_network->mode; in ipw_qos_current_mode()
6851 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_qos_current_mode()
6853 mode = priv->ieee->mode; in ipw_qos_current_mode()
6862 static int ipw_qos_handle_probe_response(struct ipw_priv *priv, in ipw_qos_handle_probe_response() argument
6882 schedule_work(&priv->qos_activate); in ipw_qos_handle_probe_response()
6887 if ((priv->ieee->mode == IEEE_B) || (network->mode == IEEE_B)) in ipw_qos_handle_probe_response()
6896 schedule_work(&priv->qos_activate); in ipw_qos_handle_probe_response()
6902 if ((priv->status & STATUS_ASSOCIATED) && in ipw_qos_handle_probe_response()
6903 (priv->ieee->iw_mode == IW_MODE_ADHOC) && (active_network == 0)) { in ipw_qos_handle_probe_response()
6904 if (!ether_addr_equal(network->bssid, priv->bssid)) in ipw_qos_handle_probe_response()
6907 priv->assoc_network->ssid_len) && in ipw_qos_handle_probe_response()
6909 priv->assoc_network->ssid, in ipw_qos_handle_probe_response()
6911 schedule_work(&priv->merge_networks); in ipw_qos_handle_probe_response()
6922 static int ipw_qos_activate(struct ipw_priv *priv, in ipw_qos_activate() argument
6933 type = ipw_qos_current_mode(priv); in ipw_qos_activate()
6936 memcpy(active_one, priv->qos_data.def_qos_parm_CCK, size); in ipw_qos_activate()
6938 memcpy(active_one, priv->qos_data.def_qos_parm_OFDM, size); in ipw_qos_activate()
6948 burst_duration = ipw_qos_get_burst_duration(priv); in ipw_qos_activate()
6952 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw_qos_activate()
6956 if (priv->qos_data.qos_enable == 0) in ipw_qos_activate()
6959 active_one = priv->qos_data.def_qos_parm_CCK; in ipw_qos_activate()
6961 if (priv->qos_data.qos_enable == 0) in ipw_qos_activate()
6964 active_one = priv->qos_data.def_qos_parm_OFDM; in ipw_qos_activate()
6971 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_qos_activate()
6977 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_qos_activate()
6980 burst_duration = ipw_qos_get_burst_duration(priv); in ipw_qos_activate()
6988 err = ipw_send_qos_params_command(priv, &qos_parameters[0]); in ipw_qos_activate()
6998 static int ipw_qos_set_info_element(struct ipw_priv *priv) in ipw_qos_set_info_element() argument
7003 if (priv == NULL) in ipw_qos_set_info_element()
7016 ret = ipw_send_qos_info_command(priv, &qos_info); in ipw_qos_set_info_element()
7026 static int ipw_qos_association(struct ipw_priv *priv, in ipw_qos_association() argument
7036 switch (priv->ieee->iw_mode) { in ipw_qos_association()
7052 err = ipw_qos_activate(priv, qos_data); in ipw_qos_association()
7054 priv->assoc_request.policy_support &= ~HC_QOS_SUPPORT_ASSOC; in ipw_qos_association()
7058 if (priv->qos_data.qos_enable && qos_data->supported) { in ipw_qos_association()
7060 priv->assoc_request.policy_support |= HC_QOS_SUPPORT_ASSOC; in ipw_qos_association()
7061 return ipw_qos_set_info_element(priv); in ipw_qos_association()
7072 static int ipw_qos_association_resp(struct ipw_priv *priv, in ipw_qos_association_resp() argument
7080 if ((priv == NULL) || (network == NULL) || in ipw_qos_association_resp()
7081 (priv->assoc_network == NULL)) in ipw_qos_association_resp()
7084 if (!(priv->status & STATUS_ASSOCIATED)) in ipw_qos_association_resp()
7087 if ((priv->ieee->iw_mode != IW_MODE_INFRA)) in ipw_qos_association_resp()
7090 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_qos_association_resp()
7092 memcpy(&priv->assoc_network->qos_data, &network->qos_data, in ipw_qos_association_resp()
7094 priv->assoc_network->qos_data.active = 1; in ipw_qos_association_resp()
7103 if ((network->mode == IEEE_B) || (priv->ieee->mode == IEEE_B)) in ipw_qos_association_resp()
7104 memcpy(&priv->assoc_network->qos_data.parameters, in ipw_qos_association_resp()
7107 memcpy(&priv->assoc_network->qos_data.parameters, in ipw_qos_association_resp()
7109 priv->assoc_network->qos_data.active = 0; in ipw_qos_association_resp()
7110 priv->assoc_network->qos_data.supported = 0; in ipw_qos_association_resp()
7114 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_qos_association_resp()
7117 schedule_work(&priv->qos_activate); in ipw_qos_association_resp()
7122 static u32 ipw_qos_get_burst_duration(struct ipw_priv *priv) in ipw_qos_get_burst_duration() argument
7126 if ((priv == NULL)) in ipw_qos_get_burst_duration()
7129 if (!(priv->ieee->modulation & LIBIPW_OFDM_MODULATION)) in ipw_qos_get_burst_duration()
7130 ret = priv->qos_data.burst_duration_CCK; in ipw_qos_get_burst_duration()
7132 ret = priv->qos_data.burst_duration_OFDM; in ipw_qos_get_burst_duration()
7140 static void ipw_qos_init(struct ipw_priv *priv, int enable, in ipw_qos_init() argument
7144 priv->qos_data.qos_enable = enable; in ipw_qos_init()
7146 if (priv->qos_data.qos_enable) { in ipw_qos_init()
7147 priv->qos_data.def_qos_parm_CCK = &def_qos_parameters_CCK; in ipw_qos_init()
7148 priv->qos_data.def_qos_parm_OFDM = &def_qos_parameters_OFDM; in ipw_qos_init()
7151 priv->qos_data.def_qos_parm_CCK = &def_parameters_CCK; in ipw_qos_init()
7152 priv->qos_data.def_qos_parm_OFDM = &def_parameters_OFDM; in ipw_qos_init()
7156 priv->qos_data.burst_enable = burst_enable; in ipw_qos_init()
7159 priv->qos_data.burst_duration_CCK = burst_duration_CCK; in ipw_qos_init()
7160 priv->qos_data.burst_duration_OFDM = burst_duration_OFDM; in ipw_qos_init()
7162 priv->qos_data.burst_duration_CCK = 0; in ipw_qos_init()
7163 priv->qos_data.burst_duration_OFDM = 0; in ipw_qos_init()
7170 static int ipw_get_tx_queue_number(struct ipw_priv *priv, u16 priority) in ipw_get_tx_queue_number() argument
7172 if (priority > 7 || !priv->qos_data.qos_enable) in ipw_get_tx_queue_number()
7181 struct ipw_priv *priv = libipw_priv(dev); in ipw_is_qos_active() local
7187 if (!(priv->status & STATUS_ASSOCIATED)) in ipw_is_qos_active()
7190 qos_data = &priv->assoc_network->qos_data; in ipw_is_qos_active()
7192 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw_is_qos_active()
7202 priv->qos_data.qos_enable, active, supported, unicast); in ipw_is_qos_active()
7203 if (active && priv->qos_data.qos_enable) in ipw_is_qos_active()
7212 static int ipw_qos_set_tx_queue_command(struct ipw_priv *priv, in ipw_qos_set_tx_queue_command() argument
7222 if (priv->qos_data.qos_no_ack_mask & (1UL << tx_queue_id)) { in ipw_qos_set_tx_queue_command()
7234 struct ipw_priv *priv = in ipw_bg_qos_activate() local
7237 mutex_lock(&priv->mutex); in ipw_bg_qos_activate()
7239 if (priv->status & STATUS_ASSOCIATED) in ipw_bg_qos_activate()
7240 ipw_qos_activate(priv, &(priv->assoc_network->qos_data)); in ipw_bg_qos_activate()
7242 mutex_unlock(&priv->mutex); in ipw_bg_qos_activate()
7249 struct ipw_priv *priv = libipw_priv(dev); in ipw_handle_probe_response() local
7250 int active_network = ((priv->status & STATUS_ASSOCIATED) && in ipw_handle_probe_response()
7251 (network == priv->assoc_network)); in ipw_handle_probe_response()
7253 ipw_qos_handle_probe_response(priv, active_network, network); in ipw_handle_probe_response()
7262 struct ipw_priv *priv = libipw_priv(dev); in ipw_handle_beacon() local
7263 int active_network = ((priv->status & STATUS_ASSOCIATED) && in ipw_handle_beacon()
7264 (network == priv->assoc_network)); in ipw_handle_beacon()
7266 ipw_qos_handle_probe_response(priv, active_network, network); in ipw_handle_beacon()
7275 struct ipw_priv *priv = libipw_priv(dev); in ipw_handle_assoc_response() local
7276 ipw_qos_association_resp(priv, network); in ipw_handle_assoc_response()
7280 static int ipw_send_qos_params_command(struct ipw_priv *priv, struct libipw_qos_parameters in ipw_send_qos_params_command() argument
7283 return ipw_send_cmd_pdu(priv, IPW_CMD_QOS_PARAMETERS, in ipw_send_qos_params_command()
7287 static int ipw_send_qos_info_command(struct ipw_priv *priv, struct libipw_qos_information_element in ipw_send_qos_info_command() argument
7290 return ipw_send_cmd_pdu(priv, IPW_CMD_WME_INFO, sizeof(*qos_param), in ipw_send_qos_info_command()
7296 static int ipw_associate_network(struct ipw_priv *priv, in ipw_associate_network() argument
7302 if (priv->config & CFG_FIXED_RATE) in ipw_associate_network()
7303 ipw_set_fixed_rate(priv, network->mode); in ipw_associate_network()
7305 if (!(priv->config & CFG_STATIC_ESSID)) { in ipw_associate_network()
7306 priv->essid_len = min(network->ssid_len, in ipw_associate_network()
7308 memcpy(priv->essid, network->ssid, priv->essid_len); in ipw_associate_network()
7313 memset(&priv->assoc_request, 0, sizeof(priv->assoc_request)); in ipw_associate_network()
7314 priv->assoc_request.channel = network->channel; in ipw_associate_network()
7315 priv->assoc_request.auth_key = 0; in ipw_associate_network()
7317 if ((priv->capability & CAP_PRIVACY_ON) && in ipw_associate_network()
7318 (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)) { in ipw_associate_network()
7319 priv->assoc_request.auth_type = AUTH_SHARED_KEY; in ipw_associate_network()
7320 priv->assoc_request.auth_key = priv->ieee->sec.active_key; in ipw_associate_network()
7322 if (priv->ieee->sec.level == SEC_LEVEL_1) in ipw_associate_network()
7323 ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_WEP); in ipw_associate_network()
7325 } else if ((priv->capability & CAP_PRIVACY_ON) && in ipw_associate_network()
7326 (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP)) in ipw_associate_network()
7327 priv->assoc_request.auth_type = AUTH_LEAP; in ipw_associate_network()
7329 priv->assoc_request.auth_type = AUTH_OPEN; in ipw_associate_network()
7331 if (priv->ieee->wpa_ie_len) { in ipw_associate_network()
7332 priv->assoc_request.policy_support = cpu_to_le16(0x02); /* RSN active */ in ipw_associate_network()
7333 ipw_set_rsn_capa(priv, priv->ieee->wpa_ie, in ipw_associate_network()
7334 priv->ieee->wpa_ie_len); in ipw_associate_network()
7342 if (network->mode & priv->ieee->mode & IEEE_A) in ipw_associate_network()
7343 priv->assoc_request.ieee_mode = IPW_A_MODE; in ipw_associate_network()
7344 else if (network->mode & priv->ieee->mode & IEEE_G) in ipw_associate_network()
7345 priv->assoc_request.ieee_mode = IPW_G_MODE; in ipw_associate_network()
7346 else if (network->mode & priv->ieee->mode & IEEE_B) in ipw_associate_network()
7347 priv->assoc_request.ieee_mode = IPW_B_MODE; in ipw_associate_network()
7349 priv->assoc_request.capability = cpu_to_le16(network->capability); in ipw_associate_network()
7351 && !(priv->config & CFG_PREAMBLE_LONG)) { in ipw_associate_network()
7352 priv->assoc_request.preamble_length = DCT_FLAG_SHORT_PREAMBLE; in ipw_associate_network()
7354 priv->assoc_request.preamble_length = DCT_FLAG_LONG_PREAMBLE; in ipw_associate_network()
7357 priv->assoc_request.capability &= in ipw_associate_network()
7362 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw_associate_network()
7363 priv->assoc_request.capability &= in ipw_associate_network()
7368 priv->essid_len, priv->essid, in ipw_associate_network()
7370 ipw_modes[priv->assoc_request.ieee_mode], in ipw_associate_network()
7372 (priv->assoc_request.preamble_length == in ipw_associate_network()
7376 priv->capability & CAP_PRIVACY_ON ? "on " : "off", in ipw_associate_network()
7377 priv->capability & CAP_PRIVACY_ON ? in ipw_associate_network()
7378 (priv->capability & CAP_SHARED_KEY ? "(shared)" : in ipw_associate_network()
7380 priv->capability & CAP_PRIVACY_ON ? " key=" : "", in ipw_associate_network()
7381 priv->capability & CAP_PRIVACY_ON ? in ipw_associate_network()
7382 '1' + priv->ieee->sec.active_key : '.', in ipw_associate_network()
7383 priv->capability & CAP_PRIVACY_ON ? '.' : ' '); in ipw_associate_network()
7385 priv->assoc_request.beacon_interval = cpu_to_le16(network->beacon_interval); in ipw_associate_network()
7386 if ((priv->ieee->iw_mode == IW_MODE_ADHOC) && in ipw_associate_network()
7388 priv->assoc_request.assoc_type = HC_IBSS_START; in ipw_associate_network()
7389 priv->assoc_request.assoc_tsf_msw = 0; in ipw_associate_network()
7390 priv->assoc_request.assoc_tsf_lsw = 0; in ipw_associate_network()
7393 priv->assoc_request.assoc_type = HC_REASSOCIATE; in ipw_associate_network()
7395 priv->assoc_request.assoc_type = HC_ASSOCIATE; in ipw_associate_network()
7396 priv->assoc_request.assoc_tsf_msw = cpu_to_le32(network->time_stamp[1]); in ipw_associate_network()
7397 priv->assoc_request.assoc_tsf_lsw = cpu_to_le32(network->time_stamp[0]); in ipw_associate_network()
7400 memcpy(priv->assoc_request.bssid, network->bssid, ETH_ALEN); in ipw_associate_network()
7402 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw_associate_network()
7403 eth_broadcast_addr(priv->assoc_request.dest); in ipw_associate_network()
7404 priv->assoc_request.atim_window = cpu_to_le16(network->atim_window); in ipw_associate_network()
7406 memcpy(priv->assoc_request.dest, network->bssid, ETH_ALEN); in ipw_associate_network()
7407 priv->assoc_request.atim_window = 0; in ipw_associate_network()
7410 priv->assoc_request.listen_interval = cpu_to_le16(network->listen_interval); in ipw_associate_network()
7412 err = ipw_send_ssid(priv, priv->essid, priv->essid_len); in ipw_associate_network()
7418 rates->ieee_mode = priv->assoc_request.ieee_mode; in ipw_associate_network()
7420 ipw_send_supported_rates(priv, rates); in ipw_associate_network()
7422 if (priv->assoc_request.ieee_mode == IPW_G_MODE) in ipw_associate_network()
7423 priv->sys_config.dot11g_auto_detection = 1; in ipw_associate_network()
7425 priv->sys_config.dot11g_auto_detection = 0; in ipw_associate_network()
7427 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw_associate_network()
7428 priv->sys_config.answer_broadcast_ssid_probe = 1; in ipw_associate_network()
7430 priv->sys_config.answer_broadcast_ssid_probe = 0; in ipw_associate_network()
7432 err = ipw_send_system_config(priv); in ipw_associate_network()
7439 err = ipw_set_sensitivity(priv, network->stats.rssi + IPW_RSSI_TO_DBM); in ipw_associate_network()
7450 priv->channel = network->channel; in ipw_associate_network()
7451 memcpy(priv->bssid, network->bssid, ETH_ALEN); in ipw_associate_network()
7452 priv->status |= STATUS_ASSOCIATING; in ipw_associate_network()
7453 priv->status &= ~STATUS_SECURITY_UPDATED; in ipw_associate_network()
7455 priv->assoc_network = network; in ipw_associate_network()
7458 ipw_qos_association(priv, network); in ipw_associate_network()
7461 err = ipw_send_associate(priv, &priv->assoc_request); in ipw_associate_network()
7468 priv->essid_len, priv->essid, priv->bssid); in ipw_associate_network()
7475 struct ipw_priv *priv = data; in ipw_roam() local
7478 .network = priv->assoc_network in ipw_roam()
7501 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ROAMING))) in ipw_roam()
7504 if (priv->status & STATUS_ASSOCIATED) { in ipw_roam()
7508 u8 rssi = priv->assoc_network->stats.rssi; in ipw_roam()
7509 priv->assoc_network->stats.rssi = -128; in ipw_roam()
7510 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_roam()
7511 list_for_each_entry(network, &priv->ieee->network_list, list) { in ipw_roam()
7512 if (network != priv->assoc_network) in ipw_roam()
7513 ipw_best_network(priv, &match, network, 1); in ipw_roam()
7515 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_roam()
7516 priv->assoc_network->stats.rssi = rssi; in ipw_roam()
7518 if (match.network == priv->assoc_network) { in ipw_roam()
7521 priv->status &= ~STATUS_ROAMING; in ipw_roam()
7522 ipw_debug_config(priv); in ipw_roam()
7526 ipw_send_disassociate(priv, 1); in ipw_roam()
7527 priv->assoc_network = match.network; in ipw_roam()
7533 ipw_compatible_rates(priv, priv->assoc_network, &match.rates); in ipw_roam()
7534 ipw_associate_network(priv, priv->assoc_network, &match.rates, 1); in ipw_roam()
7535 priv->status &= ~STATUS_ROAMING; in ipw_roam()
7540 struct ipw_priv *priv = in ipw_bg_roam() local
7542 mutex_lock(&priv->mutex); in ipw_bg_roam()
7543 ipw_roam(priv); in ipw_bg_roam()
7544 mutex_unlock(&priv->mutex); in ipw_bg_roam()
7549 struct ipw_priv *priv = data; in ipw_associate() local
7559 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw_associate()
7564 if (priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { in ipw_associate()
7570 if (priv->status & STATUS_DISASSOCIATING) { in ipw_associate()
7573 schedule_work(&priv->associate); in ipw_associate()
7577 if (!ipw_is_init(priv) || (priv->status & STATUS_SCANNING)) { in ipw_associate()
7583 if (!(priv->config & CFG_ASSOCIATE) && in ipw_associate()
7584 !(priv->config & (CFG_STATIC_ESSID | CFG_STATIC_BSSID))) { in ipw_associate()
7590 spin_lock_irqsave(&priv->ieee->lock, flags); in ipw_associate()
7591 list_for_each_entry(network, &priv->ieee->network_list, list) in ipw_associate()
7592 ipw_best_network(priv, &match, network, 0); in ipw_associate()
7598 priv->ieee->iw_mode == IW_MODE_ADHOC && in ipw_associate()
7599 priv->config & CFG_ADHOC_CREATE && in ipw_associate()
7600 priv->config & CFG_STATIC_ESSID && in ipw_associate()
7601 priv->config & CFG_STATIC_CHANNEL) { in ipw_associate()
7603 if (list_empty(&priv->ieee->network_free_list)) { in ipw_associate()
7607 list_for_each_entry(target, &priv->ieee->network_list, list) { in ipw_associate()
7620 &priv->ieee->network_free_list); in ipw_associate()
7623 element = priv->ieee->network_free_list.next; in ipw_associate()
7625 ipw_adhoc_create(priv, network); in ipw_associate()
7626 rates = &priv->rates; in ipw_associate()
7628 list_add_tail(&network->list, &priv->ieee->network_list); in ipw_associate()
7630 spin_unlock_irqrestore(&priv->ieee->lock, flags); in ipw_associate()
7635 ipw_debug_config(priv); in ipw_associate()
7637 if (!(priv->status & STATUS_SCANNING)) { in ipw_associate()
7638 if (!(priv->config & CFG_SPEED_SCAN)) in ipw_associate()
7639 schedule_delayed_work(&priv->request_scan, in ipw_associate()
7642 schedule_delayed_work(&priv->request_scan, 0); in ipw_associate()
7648 ipw_associate_network(priv, network, rates, 0); in ipw_associate()
7655 struct ipw_priv *priv = in ipw_bg_associate() local
7657 mutex_lock(&priv->mutex); in ipw_bg_associate()
7658 ipw_associate(priv); in ipw_bg_associate()
7659 mutex_unlock(&priv->mutex); in ipw_bg_associate()
7662 static void ipw_rebuild_decrypted_skb(struct ipw_priv *priv, in ipw_rebuild_decrypted_skb() argument
7675 switch (priv->ieee->sec.level) { in ipw_rebuild_decrypted_skb()
7696 priv->ieee->sec.level); in ipw_rebuild_decrypted_skb()
7701 static void ipw_handle_data_packet(struct ipw_priv *priv, in ipw_handle_data_packet() argument
7705 struct net_device *dev = priv->net_dev; in ipw_handle_data_packet()
7717 priv->wstats.discard.misc++; in ipw_handle_data_packet()
7720 } else if (unlikely(!netif_running(priv->net_dev))) { in ipw_handle_data_packet()
7722 priv->wstats.discard.misc++; in ipw_handle_data_packet()
7737 if (priv->ieee->iw_mode != IW_MODE_MONITOR && in ipw_handle_data_packet()
7739 !priv->ieee->host_mc_decrypt : !priv->ieee->host_decrypt)) in ipw_handle_data_packet()
7740 ipw_rebuild_decrypted_skb(priv, rxb->skb); in ipw_handle_data_packet()
7742 if (!libipw_rx(priv->ieee, rxb->skb, stats)) in ipw_handle_data_packet()
7746 __ipw_led_activity_on(priv); in ipw_handle_data_packet()
7751 static void ipw_handle_data_packet_monitor(struct ipw_priv *priv, in ipw_handle_data_packet_monitor() argument
7755 struct net_device *dev = priv->net_dev; in ipw_handle_data_packet_monitor()
7780 priv->wstats.discard.misc++; in ipw_handle_data_packet_monitor()
7783 } else if (unlikely(!netif_running(priv->net_dev))) { in ipw_handle_data_packet_monitor()
7785 priv->wstats.discard.misc++; in ipw_handle_data_packet_monitor()
7795 priv->wstats.discard.misc++; in ipw_handle_data_packet_monitor()
7899 if (!libipw_rx(priv->ieee, rxb->skb, stats)) in ipw_handle_data_packet_monitor()
7928 static void ipw_handle_promiscuous_rx(struct ipw_priv *priv, in ipw_handle_promiscuous_rx() argument
7932 struct net_device *dev = priv->prom_net_dev; in ipw_handle_promiscuous_rx()
7948 u16 filter = priv->prom_priv->filter; in ipw_handle_promiscuous_rx()
8105 if (!libipw_rx(priv->prom_priv->ieee, skb, stats)) { in ipw_handle_promiscuous_rx()
8112 static int is_network_packet(struct ipw_priv *priv, in is_network_packet() argument
8117 switch (priv->ieee->iw_mode) { in is_network_packet()
8120 if (ether_addr_equal(header->addr2, priv->net_dev->dev_addr)) in is_network_packet()
8125 return ether_addr_equal(header->addr3, priv->bssid); in is_network_packet()
8129 priv->net_dev->dev_addr); in is_network_packet()
8133 if (ether_addr_equal(header->addr3, priv->net_dev->dev_addr)) in is_network_packet()
8138 return ether_addr_equal(header->addr2, priv->bssid); in is_network_packet()
8142 priv->net_dev->dev_addr); in is_network_packet()
8150 static int is_duplicate_packet(struct ipw_priv *priv, in is_duplicate_packet() argument
8159 switch (priv->ieee->iw_mode) { in is_duplicate_packet()
8167 list_for_each(p, &priv->ibss_mac_hash[index]) { in is_duplicate_packet()
8173 if (p == &priv->ibss_mac_hash[index]) { in is_duplicate_packet()
8185 &priv->ibss_mac_hash[index]); in is_duplicate_packet()
8194 last_seq = &priv->last_seq_num; in is_duplicate_packet()
8195 last_frag = &priv->last_frag_num; in is_duplicate_packet()
8196 last_time = &priv->last_packet_time; in is_duplicate_packet()
8223 static void ipw_handle_mgmt_packet(struct ipw_priv *priv, in ipw_handle_mgmt_packet() argument
8232 libipw_rx_mgt(priv->ieee, header, stats); in ipw_handle_mgmt_packet()
8234 if (priv->ieee->iw_mode == IW_MODE_ADHOC && in ipw_handle_mgmt_packet()
8239 if (ether_addr_equal(header->addr3, priv->bssid)) in ipw_handle_mgmt_packet()
8240 ipw_add_station(priv, header->addr2); in ipw_handle_mgmt_packet()
8243 if (priv->config & CFG_NET_STATS) { in ipw_handle_mgmt_packet()
8257 skb->dev = priv->ieee->dev; in ipw_handle_mgmt_packet()
8275 static void ipw_rx(struct ipw_priv *priv) in ipw_rx() argument
8284 r = ipw_read32(priv, IPW_RX_READ_INDEX); in ipw_rx()
8285 w = ipw_read32(priv, IPW_RX_WRITE_INDEX); in ipw_rx()
8286 i = priv->rxq->read; in ipw_rx()
8288 if (ipw_rx_queue_space (priv->rxq) > (RX_QUEUE_SIZE / 2)) in ipw_rx()
8292 rxb = priv->rxq->queue[i]; in ipw_rx()
8297 priv->rxq->queue[i] = NULL; in ipw_rx()
8299 pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr, in ipw_rx()
8339 priv->rx_packets++; in ipw_rx()
8342 if (priv->prom_net_dev && netif_running(priv->prom_net_dev)) in ipw_rx()
8343 ipw_handle_promiscuous_rx(priv, rxb, &stats); in ipw_rx()
8347 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw_rx()
8350 ipw_handle_data_packet_monitor(priv, in ipw_rx()
8354 ipw_handle_data_packet(priv, rxb, in ipw_rx()
8372 is_network_packet(priv, header); in ipw_rx()
8373 if (network_packet && priv->assoc_network) { in ipw_rx()
8374 priv->assoc_network->stats.rssi = in ipw_rx()
8376 priv->exp_avg_rssi = in ipw_rx()
8377 exponential_average(priv->exp_avg_rssi, in ipw_rx()
8390 priv->net_dev->stats.rx_errors++; in ipw_rx()
8391 priv->wstats.discard.misc++; in ipw_rx()
8399 ipw_handle_mgmt_packet(priv, rxb, in ipw_rx()
8408 is_duplicate_packet(priv, in ipw_rx()
8421 ipw_handle_data_packet(priv, rxb, in ipw_rx()
8435 ipw_rx_notification(priv, &pkt->u.notification); in ipw_rx()
8453 pci_unmap_single(priv->pci_dev, rxb->dma_addr, in ipw_rx()
8455 list_add_tail(&rxb->list, &priv->rxq->rx_used); in ipw_rx()
8462 priv->rxq->read = i; in ipw_rx()
8463 ipw_rx_queue_replenish(priv); in ipw_rx()
8468 priv->rxq->read = i; in ipw_rx()
8469 ipw_rx_queue_restock(priv); in ipw_rx()
8486 static int ipw_sw_reset(struct ipw_priv *priv, int option) in ipw_sw_reset() argument
8489 int old_mode = priv->ieee->iw_mode; in ipw_sw_reset()
8492 priv->config = 0; in ipw_sw_reset()
8497 priv->config |= CFG_NO_LED; in ipw_sw_reset()
8500 priv->config |= CFG_ASSOCIATE; in ipw_sw_reset()
8505 priv->config |= CFG_ADHOC_CREATE; in ipw_sw_reset()
8509 priv->config &= ~CFG_STATIC_ESSID; in ipw_sw_reset()
8510 priv->essid_len = 0; in ipw_sw_reset()
8511 memset(priv->essid, 0, IW_ESSID_MAX_SIZE); in ipw_sw_reset()
8514 priv->status |= STATUS_RF_KILL_SW; in ipw_sw_reset()
8519 priv->config |= CFG_STATIC_CHANNEL; in ipw_sw_reset()
8520 priv->channel = default_channel; in ipw_sw_reset()
8525 ipw_qos_init(priv, qos_enable, qos_burst_enable, in ipw_sw_reset()
8531 priv->ieee->iw_mode = IW_MODE_ADHOC; in ipw_sw_reset()
8532 priv->net_dev->type = ARPHRD_ETHER; in ipw_sw_reset()
8537 priv->ieee->iw_mode = IW_MODE_MONITOR; in ipw_sw_reset()
8539 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; in ipw_sw_reset()
8541 priv->net_dev->type = ARPHRD_IEEE80211; in ipw_sw_reset()
8547 priv->net_dev->type = ARPHRD_ETHER; in ipw_sw_reset()
8548 priv->ieee->iw_mode = IW_MODE_INFRA; in ipw_sw_reset()
8553 priv->ieee->host_encrypt = 0; in ipw_sw_reset()
8554 priv->ieee->host_encrypt_msdu = 0; in ipw_sw_reset()
8555 priv->ieee->host_decrypt = 0; in ipw_sw_reset()
8556 priv->ieee->host_mc_decrypt = 0; in ipw_sw_reset()
8561 priv->ieee->host_open_frag = 0; in ipw_sw_reset()
8563 if ((priv->pci_dev->device == 0x4223) || in ipw_sw_reset()
8564 (priv->pci_dev->device == 0x4224)) { in ipw_sw_reset()
8569 priv->ieee->abg_true = 1; in ipw_sw_reset()
8573 priv->adapter = IPW_2915ABG; in ipw_sw_reset()
8574 priv->ieee->mode = IEEE_A | IEEE_G | IEEE_B; in ipw_sw_reset()
8581 priv->ieee->abg_true = 0; in ipw_sw_reset()
8585 priv->adapter = IPW_2200BG; in ipw_sw_reset()
8586 priv->ieee->mode = IEEE_G | IEEE_B; in ipw_sw_reset()
8589 priv->ieee->freq_band = band; in ipw_sw_reset()
8590 priv->ieee->modulation = modulation; in ipw_sw_reset()
8592 priv->rates_mask = LIBIPW_DEFAULT_RATES_MASK; in ipw_sw_reset()
8594 priv->disassociate_threshold = IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT; in ipw_sw_reset()
8595 priv->roaming_threshold = IPW_MB_ROAMING_THRESHOLD_DEFAULT; in ipw_sw_reset()
8597 priv->rts_threshold = DEFAULT_RTS_THRESHOLD; in ipw_sw_reset()
8598 priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT; in ipw_sw_reset()
8599 priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT; in ipw_sw_reset()
8602 priv->power_mode = IPW_POWER_AC; in ipw_sw_reset()
8603 priv->tx_power = IPW_TX_POWER_DEFAULT; in ipw_sw_reset()
8605 return old_mode == priv->ieee->iw_mode; in ipw_sw_reset()
8618 static int ipw_set_channel(struct ipw_priv *priv, u8 channel) in ipw_set_channel() argument
8622 priv->config &= ~CFG_STATIC_CHANNEL; in ipw_set_channel()
8625 ipw_associate(priv); in ipw_set_channel()
8629 priv->config |= CFG_STATIC_CHANNEL; in ipw_set_channel()
8631 if (priv->channel == channel) { in ipw_set_channel()
8638 priv->channel = channel; in ipw_set_channel()
8641 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { in ipw_set_channel()
8643 if (priv->status & STATUS_SCANNING) { in ipw_set_channel()
8646 ipw_abort_scan(priv); in ipw_set_channel()
8649 for (i = 1000; i && (priv->status & STATUS_SCANNING); i--) in ipw_set_channel()
8652 if (priv->status & STATUS_SCANNING) in ipw_set_channel()
8664 if (!ipw_disassociate(priv)) in ipw_set_channel()
8665 ipw_associate(priv); in ipw_set_channel()
8674 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_freq() local
8675 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw_wx_set_freq()
8683 mutex_lock(&priv->mutex); in ipw_wx_set_freq()
8684 ret = ipw_set_channel(priv, 0); in ipw_wx_set_freq()
8685 mutex_unlock(&priv->mutex); in ipw_wx_set_freq()
8690 channel = libipw_freq_to_channel(priv->ieee, fwrq->m); in ipw_wx_set_freq()
8696 if (!(band = libipw_is_valid_channel(priv->ieee, channel))) in ipw_wx_set_freq()
8699 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { in ipw_wx_set_freq()
8700 i = libipw_channel_to_index(priv->ieee, channel); in ipw_wx_set_freq()
8713 mutex_lock(&priv->mutex); in ipw_wx_set_freq()
8714 ret = ipw_set_channel(priv, channel); in ipw_wx_set_freq()
8715 mutex_unlock(&priv->mutex); in ipw_wx_set_freq()
8723 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_freq() local
8729 mutex_lock(&priv->mutex); in ipw_wx_get_freq()
8730 if (priv->config & CFG_STATIC_CHANNEL || in ipw_wx_get_freq()
8731 priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) { in ipw_wx_get_freq()
8734 i = libipw_channel_to_index(priv->ieee, priv->channel); in ipw_wx_get_freq()
8738 switch (libipw_is_valid_channel(priv->ieee, priv->channel)) { in ipw_wx_get_freq()
8740 wrqu->freq.m = priv->ieee->geo.a[i].freq * 100000; in ipw_wx_get_freq()
8744 wrqu->freq.m = priv->ieee->geo.bg[i].freq * 100000; in ipw_wx_get_freq()
8753 mutex_unlock(&priv->mutex); in ipw_wx_get_freq()
8754 IPW_DEBUG_WX("GET Freq/Channel -> %d\n", priv->channel); in ipw_wx_get_freq()
8762 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_mode() local
8780 if (wrqu->mode == priv->ieee->iw_mode) in ipw_wx_set_mode()
8783 mutex_lock(&priv->mutex); in ipw_wx_set_mode()
8785 ipw_sw_reset(priv, 0); in ipw_wx_set_mode()
8788 if (priv->ieee->iw_mode == IW_MODE_MONITOR) in ipw_wx_set_mode()
8789 priv->net_dev->type = ARPHRD_ETHER; in ipw_wx_set_mode()
8793 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; in ipw_wx_set_mode()
8795 priv->net_dev->type = ARPHRD_IEEE80211; in ipw_wx_set_mode()
8803 priv->ieee->iw_mode = wrqu->mode; in ipw_wx_set_mode()
8805 schedule_work(&priv->adapter_restart); in ipw_wx_set_mode()
8806 mutex_unlock(&priv->mutex); in ipw_wx_set_mode()
8814 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_mode() local
8815 mutex_lock(&priv->mutex); in ipw_wx_get_mode()
8816 wrqu->mode = priv->ieee->iw_mode; in ipw_wx_get_mode()
8818 mutex_unlock(&priv->mutex); in ipw_wx_get_mode()
8843 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_range() local
8845 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw_wx_get_range()
8865 mutex_lock(&priv->mutex); in ipw_wx_get_range()
8866 range->num_bitrates = min(priv->rates.num_rates, (u8) IW_MAX_BITRATES); in ipw_wx_get_range()
8869 range->bitrate[i] = (priv->rates.supported_rates[i] & 0x7F) * in ipw_wx_get_range()
8886 if (priv->ieee->mode & (IEEE_B | IEEE_G)) { in ipw_wx_get_range()
8888 if ((priv->ieee->iw_mode == IW_MODE_ADHOC) && in ipw_wx_get_range()
8899 if (priv->ieee->mode & IEEE_A) { in ipw_wx_get_range()
8901 if ((priv->ieee->iw_mode == IW_MODE_ADHOC) && in ipw_wx_get_range()
8915 mutex_unlock(&priv->mutex); in ipw_wx_get_range()
8937 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_wap() local
8941 mutex_lock(&priv->mutex); in ipw_wx_set_wap()
8946 priv->config &= ~CFG_STATIC_BSSID; in ipw_wx_set_wap()
8949 ipw_associate(priv); in ipw_wx_set_wap()
8950 mutex_unlock(&priv->mutex); in ipw_wx_set_wap()
8954 priv->config |= CFG_STATIC_BSSID; in ipw_wx_set_wap()
8955 if (ether_addr_equal(priv->bssid, wrqu->ap_addr.sa_data)) { in ipw_wx_set_wap()
8957 mutex_unlock(&priv->mutex); in ipw_wx_set_wap()
8964 memcpy(priv->bssid, wrqu->ap_addr.sa_data, ETH_ALEN); in ipw_wx_set_wap()
8968 if (!ipw_disassociate(priv)) in ipw_wx_set_wap()
8969 ipw_associate(priv); in ipw_wx_set_wap()
8971 mutex_unlock(&priv->mutex); in ipw_wx_set_wap()
8979 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_wap() local
8983 mutex_lock(&priv->mutex); in ipw_wx_get_wap()
8984 if (priv->config & CFG_STATIC_BSSID || in ipw_wx_get_wap()
8985 priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { in ipw_wx_get_wap()
8987 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN); in ipw_wx_get_wap()
8993 mutex_unlock(&priv->mutex); in ipw_wx_get_wap()
9001 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_essid() local
9004 mutex_lock(&priv->mutex); in ipw_wx_set_essid()
9009 ipw_disassociate(priv); in ipw_wx_set_essid()
9010 priv->config &= ~CFG_STATIC_ESSID; in ipw_wx_set_essid()
9011 ipw_associate(priv); in ipw_wx_set_essid()
9012 mutex_unlock(&priv->mutex); in ipw_wx_set_essid()
9018 priv->config |= CFG_STATIC_ESSID; in ipw_wx_set_essid()
9020 if (priv->essid_len == length && !memcmp(priv->essid, extra, length) in ipw_wx_set_essid()
9021 && (priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) { in ipw_wx_set_essid()
9023 mutex_unlock(&priv->mutex); in ipw_wx_set_essid()
9029 priv->essid_len = length; in ipw_wx_set_essid()
9030 memcpy(priv->essid, extra, priv->essid_len); in ipw_wx_set_essid()
9034 if (!ipw_disassociate(priv)) in ipw_wx_set_essid()
9035 ipw_associate(priv); in ipw_wx_set_essid()
9037 mutex_unlock(&priv->mutex); in ipw_wx_set_essid()
9045 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_essid() local
9049 mutex_lock(&priv->mutex); in ipw_wx_get_essid()
9050 if (priv->config & CFG_STATIC_ESSID || in ipw_wx_get_essid()
9051 priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { in ipw_wx_get_essid()
9053 priv->essid_len, priv->essid); in ipw_wx_get_essid()
9054 memcpy(extra, priv->essid, priv->essid_len); in ipw_wx_get_essid()
9055 wrqu->essid.length = priv->essid_len; in ipw_wx_get_essid()
9062 mutex_unlock(&priv->mutex); in ipw_wx_get_essid()
9070 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_nick() local
9075 mutex_lock(&priv->mutex); in ipw_wx_set_nick()
9076 wrqu->data.length = min_t(size_t, wrqu->data.length, sizeof(priv->nick)); in ipw_wx_set_nick()
9077 memset(priv->nick, 0, sizeof(priv->nick)); in ipw_wx_set_nick()
9078 memcpy(priv->nick, extra, wrqu->data.length); in ipw_wx_set_nick()
9080 mutex_unlock(&priv->mutex); in ipw_wx_set_nick()
9089 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_nick() local
9091 mutex_lock(&priv->mutex); in ipw_wx_get_nick()
9092 wrqu->data.length = strlen(priv->nick); in ipw_wx_get_nick()
9093 memcpy(extra, priv->nick, wrqu->data.length); in ipw_wx_get_nick()
9095 mutex_unlock(&priv->mutex); in ipw_wx_get_nick()
9103 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_sens() local
9108 mutex_lock(&priv->mutex); in ipw_wx_set_sens()
9112 priv->roaming_threshold = IPW_MB_ROAMING_THRESHOLD_DEFAULT; in ipw_wx_set_sens()
9113 priv->disassociate_threshold = IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT; in ipw_wx_set_sens()
9122 priv->roaming_threshold = wrqu->sens.value; in ipw_wx_set_sens()
9123 priv->disassociate_threshold = 3*wrqu->sens.value; in ipw_wx_set_sens()
9125 mutex_unlock(&priv->mutex); in ipw_wx_set_sens()
9133 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_sens() local
9134 mutex_lock(&priv->mutex); in ipw_wx_get_sens()
9136 wrqu->sens.value = priv->roaming_threshold; in ipw_wx_get_sens()
9137 mutex_unlock(&priv->mutex); in ipw_wx_get_sens()
9150 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_rate() local
9234 mutex_lock(&priv->mutex); in ipw_wx_set_rate()
9236 priv->config &= ~CFG_FIXED_RATE; in ipw_wx_set_rate()
9237 ipw_set_fixed_rate(priv, priv->ieee->mode); in ipw_wx_set_rate()
9239 priv->config |= CFG_FIXED_RATE; in ipw_wx_set_rate()
9241 if (priv->rates_mask == mask) { in ipw_wx_set_rate()
9243 mutex_unlock(&priv->mutex); in ipw_wx_set_rate()
9247 priv->rates_mask = mask; in ipw_wx_set_rate()
9251 if (!ipw_disassociate(priv)) in ipw_wx_set_rate()
9252 ipw_associate(priv); in ipw_wx_set_rate()
9254 mutex_unlock(&priv->mutex); in ipw_wx_set_rate()
9262 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_rate() local
9263 mutex_lock(&priv->mutex); in ipw_wx_get_rate()
9264 wrqu->bitrate.value = priv->last_rate; in ipw_wx_get_rate()
9265 wrqu->bitrate.fixed = (priv->config & CFG_FIXED_RATE) ? 1 : 0; in ipw_wx_get_rate()
9266 mutex_unlock(&priv->mutex); in ipw_wx_get_rate()
9275 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_rts() local
9276 mutex_lock(&priv->mutex); in ipw_wx_set_rts()
9278 priv->rts_threshold = DEFAULT_RTS_THRESHOLD; in ipw_wx_set_rts()
9282 mutex_unlock(&priv->mutex); in ipw_wx_set_rts()
9285 priv->rts_threshold = wrqu->rts.value; in ipw_wx_set_rts()
9288 ipw_send_rts_threshold(priv, priv->rts_threshold); in ipw_wx_set_rts()
9289 mutex_unlock(&priv->mutex); in ipw_wx_set_rts()
9290 IPW_DEBUG_WX("SET RTS Threshold -> %d\n", priv->rts_threshold); in ipw_wx_set_rts()
9298 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_rts() local
9299 mutex_lock(&priv->mutex); in ipw_wx_get_rts()
9300 wrqu->rts.value = priv->rts_threshold; in ipw_wx_get_rts()
9303 mutex_unlock(&priv->mutex); in ipw_wx_get_rts()
9312 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_txpow() local
9315 mutex_lock(&priv->mutex); in ipw_wx_set_txpow()
9316 if (ipw_radio_kill_sw(priv, wrqu->power.disabled)) { in ipw_wx_set_txpow()
9335 priv->tx_power = wrqu->power.value; in ipw_wx_set_txpow()
9336 err = ipw_set_tx_power(priv); in ipw_wx_set_txpow()
9338 mutex_unlock(&priv->mutex); in ipw_wx_set_txpow()
9346 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_txpow() local
9347 mutex_lock(&priv->mutex); in ipw_wx_get_txpow()
9348 wrqu->power.value = priv->tx_power; in ipw_wx_get_txpow()
9351 wrqu->power.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0; in ipw_wx_get_txpow()
9352 mutex_unlock(&priv->mutex); in ipw_wx_get_txpow()
9364 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_frag() local
9365 mutex_lock(&priv->mutex); in ipw_wx_set_frag()
9367 priv->ieee->fts = DEFAULT_FTS; in ipw_wx_set_frag()
9371 mutex_unlock(&priv->mutex); in ipw_wx_set_frag()
9375 priv->ieee->fts = wrqu->frag.value & ~0x1; in ipw_wx_set_frag()
9378 ipw_send_frag_threshold(priv, wrqu->frag.value); in ipw_wx_set_frag()
9379 mutex_unlock(&priv->mutex); in ipw_wx_set_frag()
9388 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_frag() local
9389 mutex_lock(&priv->mutex); in ipw_wx_get_frag()
9390 wrqu->frag.value = priv->ieee->fts; in ipw_wx_get_frag()
9393 mutex_unlock(&priv->mutex); in ipw_wx_get_frag()
9403 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_retry() local
9414 mutex_lock(&priv->mutex); in ipw_wx_set_retry()
9416 priv->short_retry_limit = (u8) wrqu->retry.value; in ipw_wx_set_retry()
9418 priv->long_retry_limit = (u8) wrqu->retry.value; in ipw_wx_set_retry()
9420 priv->short_retry_limit = (u8) wrqu->retry.value; in ipw_wx_set_retry()
9421 priv->long_retry_limit = (u8) wrqu->retry.value; in ipw_wx_set_retry()
9424 ipw_send_retry_limit(priv, priv->short_retry_limit, in ipw_wx_set_retry()
9425 priv->long_retry_limit); in ipw_wx_set_retry()
9426 mutex_unlock(&priv->mutex); in ipw_wx_set_retry()
9428 priv->short_retry_limit, priv->long_retry_limit); in ipw_wx_set_retry()
9436 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_retry() local
9438 mutex_lock(&priv->mutex); in ipw_wx_get_retry()
9442 mutex_unlock(&priv->mutex); in ipw_wx_get_retry()
9448 wrqu->retry.value = priv->long_retry_limit; in ipw_wx_get_retry()
9451 wrqu->retry.value = priv->short_retry_limit; in ipw_wx_get_retry()
9454 wrqu->retry.value = priv->short_retry_limit; in ipw_wx_get_retry()
9456 mutex_unlock(&priv->mutex); in ipw_wx_get_retry()
9467 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_scan() local
9471 mutex_lock(&priv->mutex); in ipw_wx_set_scan()
9473 priv->user_requested_scan = 1; in ipw_wx_set_scan()
9478 (int)sizeof(priv->direct_scan_ssid)); in ipw_wx_set_scan()
9479 memcpy(priv->direct_scan_ssid, req->essid, len); in ipw_wx_set_scan()
9480 priv->direct_scan_ssid_len = len; in ipw_wx_set_scan()
9481 work = &priv->request_direct_scan; in ipw_wx_set_scan()
9483 work = &priv->request_passive_scan; in ipw_wx_set_scan()
9487 work = &priv->request_scan; in ipw_wx_set_scan()
9490 mutex_unlock(&priv->mutex); in ipw_wx_set_scan()
9503 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_scan() local
9504 return libipw_wx_get_scan(priv->ieee, info, wrqu, extra); in ipw_wx_get_scan()
9511 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_encode() local
9513 u32 cap = priv->capability; in ipw_wx_set_encode()
9515 mutex_lock(&priv->mutex); in ipw_wx_set_encode()
9516 ret = libipw_wx_set_encode(priv->ieee, info, wrqu, key); in ipw_wx_set_encode()
9520 if (cap != priv->capability && in ipw_wx_set_encode()
9521 priv->ieee->iw_mode == IW_MODE_ADHOC && in ipw_wx_set_encode()
9522 priv->status & STATUS_ASSOCIATED) in ipw_wx_set_encode()
9523 ipw_disassociate(priv); in ipw_wx_set_encode()
9525 mutex_unlock(&priv->mutex); in ipw_wx_set_encode()
9533 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_encode() local
9534 return libipw_wx_get_encode(priv->ieee, info, wrqu, key); in ipw_wx_get_encode()
9541 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_power() local
9543 mutex_lock(&priv->mutex); in ipw_wx_set_power()
9545 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); in ipw_wx_set_power()
9546 err = ipw_send_power_mode(priv, IPW_POWER_MODE_CAM); in ipw_wx_set_power()
9549 mutex_unlock(&priv->mutex); in ipw_wx_set_power()
9553 mutex_unlock(&priv->mutex); in ipw_wx_set_power()
9565 mutex_unlock(&priv->mutex); in ipw_wx_set_power()
9571 if (IPW_POWER_LEVEL(priv->power_mode) == IPW_POWER_AC) in ipw_wx_set_power()
9572 priv->power_mode = IPW_POWER_ENABLED | IPW_POWER_BATTERY; in ipw_wx_set_power()
9574 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode; in ipw_wx_set_power()
9576 err = ipw_send_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode)); in ipw_wx_set_power()
9579 mutex_unlock(&priv->mutex); in ipw_wx_set_power()
9583 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode); in ipw_wx_set_power()
9584 mutex_unlock(&priv->mutex); in ipw_wx_set_power()
9592 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_power() local
9593 mutex_lock(&priv->mutex); in ipw_wx_get_power()
9594 if (!(priv->power_mode & IPW_POWER_ENABLED)) in ipw_wx_get_power()
9599 mutex_unlock(&priv->mutex); in ipw_wx_get_power()
9600 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode); in ipw_wx_get_power()
9609 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_powermode() local
9613 mutex_lock(&priv->mutex); in ipw_wx_set_powermode()
9617 if (IPW_POWER_LEVEL(priv->power_mode) != mode) { in ipw_wx_set_powermode()
9618 err = ipw_send_power_mode(priv, mode); in ipw_wx_set_powermode()
9621 mutex_unlock(&priv->mutex); in ipw_wx_set_powermode()
9624 priv->power_mode = IPW_POWER_ENABLED | mode; in ipw_wx_set_powermode()
9626 mutex_unlock(&priv->mutex); in ipw_wx_set_powermode()
9635 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_powermode() local
9636 int level = IPW_POWER_LEVEL(priv->power_mode); in ipw_wx_get_powermode()
9655 if (!(priv->power_mode & IPW_POWER_ENABLED)) in ipw_wx_get_powermode()
9667 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_wireless_mode() local
9675 mutex_lock(&priv->mutex); in ipw_wx_set_wireless_mode()
9676 if (priv->adapter == IPW_2915ABG) { in ipw_wx_set_wireless_mode()
9677 priv->ieee->abg_true = 1; in ipw_wx_set_wireless_mode()
9682 priv->ieee->abg_true = 0; in ipw_wx_set_wireless_mode()
9687 mutex_unlock(&priv->mutex); in ipw_wx_set_wireless_mode()
9691 priv->ieee->abg_true = 0; in ipw_wx_set_wireless_mode()
9698 priv->ieee->abg_true = 0; in ipw_wx_set_wireless_mode()
9704 priv->ieee->abg_true = 0; in ipw_wx_set_wireless_mode()
9706 priv->ieee->mode = mode; in ipw_wx_set_wireless_mode()
9707 priv->ieee->freq_band = band; in ipw_wx_set_wireless_mode()
9708 priv->ieee->modulation = modulation; in ipw_wx_set_wireless_mode()
9709 init_supported_rates(priv, &priv->rates); in ipw_wx_set_wireless_mode()
9713 if (!ipw_disassociate(priv)) { in ipw_wx_set_wireless_mode()
9714 ipw_send_supported_rates(priv, &priv->rates); in ipw_wx_set_wireless_mode()
9715 ipw_associate(priv); in ipw_wx_set_wireless_mode()
9719 ipw_led_band_on(priv); in ipw_wx_set_wireless_mode()
9724 mutex_unlock(&priv->mutex); in ipw_wx_set_wireless_mode()
9732 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_wireless_mode() local
9733 mutex_lock(&priv->mutex); in ipw_wx_get_wireless_mode()
9734 switch (priv->ieee->mode) { in ipw_wx_get_wireless_mode()
9765 mutex_unlock(&priv->mutex); in ipw_wx_get_wireless_mode()
9774 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_preamble() local
9776 mutex_lock(&priv->mutex); in ipw_wx_set_preamble()
9779 if (!(priv->config & CFG_PREAMBLE_LONG)) { in ipw_wx_set_preamble()
9780 priv->config |= CFG_PREAMBLE_LONG; in ipw_wx_set_preamble()
9785 if (!ipw_disassociate(priv)) in ipw_wx_set_preamble()
9786 ipw_associate(priv); in ipw_wx_set_preamble()
9792 priv->config &= ~CFG_PREAMBLE_LONG; in ipw_wx_set_preamble()
9795 mutex_unlock(&priv->mutex); in ipw_wx_set_preamble()
9799 mutex_unlock(&priv->mutex); in ipw_wx_set_preamble()
9807 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_get_preamble() local
9808 mutex_lock(&priv->mutex); in ipw_wx_get_preamble()
9809 if (priv->config & CFG_PREAMBLE_LONG) in ipw_wx_get_preamble()
9813 mutex_unlock(&priv->mutex); in ipw_wx_get_preamble()
9822 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_set_monitor() local
9825 mutex_lock(&priv->mutex); in ipw_wx_set_monitor()
9828 if (priv->ieee->iw_mode != IW_MODE_MONITOR) { in ipw_wx_set_monitor()
9830 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; in ipw_wx_set_monitor()
9832 priv->net_dev->type = ARPHRD_IEEE80211; in ipw_wx_set_monitor()
9834 schedule_work(&priv->adapter_restart); in ipw_wx_set_monitor()
9837 ipw_set_channel(priv, parms[1]); in ipw_wx_set_monitor()
9839 if (priv->ieee->iw_mode != IW_MODE_MONITOR) { in ipw_wx_set_monitor()
9840 mutex_unlock(&priv->mutex); in ipw_wx_set_monitor()
9843 priv->net_dev->type = ARPHRD_ETHER; in ipw_wx_set_monitor()
9844 schedule_work(&priv->adapter_restart); in ipw_wx_set_monitor()
9846 mutex_unlock(&priv->mutex); in ipw_wx_set_monitor()
9856 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_reset() local
9858 schedule_work(&priv->adapter_restart); in ipw_wx_reset()
9866 struct ipw_priv *priv = libipw_priv(dev); in ipw_wx_sw_reset() local
9876 mutex_lock(&priv->mutex); in ipw_wx_sw_reset()
9878 ret = ipw_sw_reset(priv, 2); in ipw_wx_sw_reset()
9881 ipw_adapter_restart(priv); in ipw_wx_sw_reset()
9886 ipw_radio_kill_sw(priv, priv->status & STATUS_RF_KILL_SW); in ipw_wx_sw_reset()
9888 mutex_unlock(&priv->mutex); in ipw_wx_sw_reset()
9889 libipw_wx_set_encode(priv->ieee, info, &wrqu_sec, NULL); in ipw_wx_sw_reset()
9890 mutex_lock(&priv->mutex); in ipw_wx_sw_reset()
9892 if (!(priv->status & STATUS_RF_KILL_MASK)) { in ipw_wx_sw_reset()
9896 if (!ipw_disassociate(priv)) in ipw_wx_sw_reset()
9897 ipw_associate(priv); in ipw_wx_sw_reset()
9900 mutex_unlock(&priv->mutex); in ipw_wx_sw_reset()
10033 struct ipw_priv *priv = libipw_priv(dev); in ipw_get_wireless_stats() local
10036 wstats = &priv->wstats; in ipw_get_wireless_stats()
10043 if (!(priv->status & STATUS_ASSOCIATED)) { in ipw_get_wireless_stats()
10055 wstats->qual.qual = priv->quality; in ipw_get_wireless_stats()
10056 wstats->qual.level = priv->exp_avg_rssi; in ipw_get_wireless_stats()
10057 wstats->qual.noise = priv->exp_avg_noise; in ipw_get_wireless_stats()
10061 wstats->miss.beacon = average_value(&priv->average_missed_beacons); in ipw_get_wireless_stats()
10062 wstats->discard.retries = priv->last_tx_failures; in ipw_get_wireless_stats()
10063 wstats->discard.code = priv->ieee->ieee_stats.rx_discards_undecryptable; in ipw_get_wireless_stats()
10117 static int ipw_tx_skb(struct ipw_priv *priv, struct libipw_txb *txb, in ipw_tx_skb() argument
10125 int tx_id = ipw_get_tx_queue_number(priv, pri); in ipw_tx_skb()
10126 struct clx2_tx_queue *txq = &priv->txq[tx_id]; in ipw_tx_skb()
10128 struct clx2_tx_queue *txq = &priv->txq[0]; in ipw_tx_skb()
10134 if (!(priv->status & STATUS_ASSOCIATED)) in ipw_tx_skb()
10138 switch (priv->ieee->iw_mode) { in ipw_tx_skb()
10141 id = ipw_find_station(priv, hdr->addr1); in ipw_tx_skb()
10143 id = ipw_add_station(priv, hdr->addr1); in ipw_tx_skb()
10171 if (priv->assoc_request.ieee_mode == IPW_B_MODE) in ipw_tx_skb()
10176 if (priv->assoc_request.preamble_length == DCT_FLAG_SHORT_PREAMBLE) in ipw_tx_skb()
10187 if (txb->encrypted && !priv->ieee->host_encrypt) { in ipw_tx_skb()
10188 switch (priv->ieee->sec.level) { in ipw_tx_skb()
10214 tfd->u.data.key_index = priv->ieee->crypt_info.tx_keyidx; in ipw_tx_skb()
10215 if (priv->ieee->sec.key_sizes[priv->ieee->crypt_info.tx_keyidx] <= in ipw_tx_skb()
10225 priv->ieee->sec.level); in ipw_tx_skb()
10234 ipw_qos_set_tx_queue_command(priv, pri, &(tfd->u.data)); in ipw_tx_skb()
10254 (priv->pci_dev, in ipw_tx_skb()
10287 (priv->pci_dev, skb->data, in ipw_tx_skb()
10297 ipw_write32(priv, q->reg_w, q->first_empty); in ipw_tx_skb()
10300 netif_stop_queue(priv->net_dev); in ipw_tx_skb()
10312 struct ipw_priv *priv = libipw_priv(dev); in ipw_net_is_queue_full() local
10314 int tx_id = ipw_get_tx_queue_number(priv, pri); in ipw_net_is_queue_full()
10315 struct clx2_tx_queue *txq = &priv->txq[tx_id]; in ipw_net_is_queue_full()
10317 struct clx2_tx_queue *txq = &priv->txq[0]; in ipw_net_is_queue_full()
10327 static void ipw_handle_promiscuous_tx(struct ipw_priv *priv, in ipw_handle_promiscuous_tx() argument
10333 u16 filter = priv->prom_priv->filter; in ipw_handle_promiscuous_tx()
10384 ieee80211chan2mhz(priv->channel)); in ipw_handle_promiscuous_tx()
10385 if (priv->channel > 14) /* 802.11a */ in ipw_handle_promiscuous_tx()
10389 else if (priv->ieee->mode == IEEE_B) /* 802.11b */ in ipw_handle_promiscuous_tx()
10402 if (!libipw_rx(priv->prom_priv->ieee, dst, &dummystats)) in ipw_handle_promiscuous_tx()
10411 struct ipw_priv *priv = libipw_priv(dev); in ipw_net_hard_start_xmit() local
10416 spin_lock_irqsave(&priv->lock, flags); in ipw_net_hard_start_xmit()
10419 if (rtap_iface && netif_running(priv->prom_net_dev)) in ipw_net_hard_start_xmit()
10420 ipw_handle_promiscuous_tx(priv, txb); in ipw_net_hard_start_xmit()
10423 ret = ipw_tx_skb(priv, txb, pri); in ipw_net_hard_start_xmit()
10425 __ipw_led_activity_on(priv); in ipw_net_hard_start_xmit()
10426 spin_unlock_irqrestore(&priv->lock, flags); in ipw_net_hard_start_xmit()
10438 struct ipw_priv *priv = libipw_priv(dev); in ipw_net_set_mac_address() local
10443 mutex_lock(&priv->mutex); in ipw_net_set_mac_address()
10444 priv->config |= CFG_CUSTOM_MAC; in ipw_net_set_mac_address()
10445 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); in ipw_net_set_mac_address()
10447 priv->net_dev->name, priv->mac_addr); in ipw_net_set_mac_address()
10448 schedule_work(&priv->adapter_restart); in ipw_net_set_mac_address()
10449 mutex_unlock(&priv->mutex); in ipw_net_set_mac_address()
10477 struct ipw_priv *priv = libipw_priv(dev); in ipw_ethtool_get_link() local
10478 return (priv->status & STATUS_ASSOCIATED) != 0; in ipw_ethtool_get_link()
10525 struct ipw_priv *priv = data; in ipw_isr() local
10528 if (!priv) in ipw_isr()
10531 spin_lock(&priv->irq_lock); in ipw_isr()
10533 if (!(priv->status & STATUS_INT_ENABLED)) { in ipw_isr()
10538 inta = ipw_read32(priv, IPW_INTA_RW); in ipw_isr()
10539 inta_mask = ipw_read32(priv, IPW_INTA_MASK_R); in ipw_isr()
10553 __ipw_disable_interrupts(priv); in ipw_isr()
10557 ipw_write32(priv, IPW_INTA_RW, inta); in ipw_isr()
10560 priv->isr_inta = inta; in ipw_isr()
10562 tasklet_schedule(&priv->irq_tasklet); in ipw_isr()
10564 spin_unlock(&priv->irq_lock); in ipw_isr()
10568 spin_unlock(&priv->irq_lock); in ipw_isr()
10574 struct ipw_priv *priv = adapter; in ipw_rf_kill() local
10577 spin_lock_irqsave(&priv->lock, flags); in ipw_rf_kill()
10579 if (rf_kill_active(priv)) { in ipw_rf_kill()
10581 schedule_delayed_work(&priv->rf_kill, 2 * HZ); in ipw_rf_kill()
10587 if (!(priv->status & STATUS_RF_KILL_MASK)) { in ipw_rf_kill()
10592 schedule_work(&priv->adapter_restart); in ipw_rf_kill()
10598 spin_unlock_irqrestore(&priv->lock, flags); in ipw_rf_kill()
10603 struct ipw_priv *priv = in ipw_bg_rf_kill() local
10605 mutex_lock(&priv->mutex); in ipw_bg_rf_kill()
10606 ipw_rf_kill(priv); in ipw_bg_rf_kill()
10607 mutex_unlock(&priv->mutex); in ipw_bg_rf_kill()
10610 static void ipw_link_up(struct ipw_priv *priv) in ipw_link_up() argument
10612 priv->last_seq_num = -1; in ipw_link_up()
10613 priv->last_frag_num = -1; in ipw_link_up()
10614 priv->last_packet_time = 0; in ipw_link_up()
10616 netif_carrier_on(priv->net_dev); in ipw_link_up()
10618 cancel_delayed_work(&priv->request_scan); in ipw_link_up()
10619 cancel_delayed_work(&priv->request_direct_scan); in ipw_link_up()
10620 cancel_delayed_work(&priv->request_passive_scan); in ipw_link_up()
10621 cancel_delayed_work(&priv->scan_event); in ipw_link_up()
10622 ipw_reset_stats(priv); in ipw_link_up()
10624 priv->last_rate = ipw_get_current_rate(priv); in ipw_link_up()
10625 ipw_gather_stats(priv); in ipw_link_up()
10626 ipw_led_link_up(priv); in ipw_link_up()
10627 notify_wx_assoc_event(priv); in ipw_link_up()
10629 if (priv->config & CFG_BACKGROUND_SCAN) in ipw_link_up()
10630 schedule_delayed_work(&priv->request_scan, HZ); in ipw_link_up()
10635 struct ipw_priv *priv = in ipw_bg_link_up() local
10637 mutex_lock(&priv->mutex); in ipw_bg_link_up()
10638 ipw_link_up(priv); in ipw_bg_link_up()
10639 mutex_unlock(&priv->mutex); in ipw_bg_link_up()
10642 static void ipw_link_down(struct ipw_priv *priv) in ipw_link_down() argument
10644 ipw_led_link_down(priv); in ipw_link_down()
10645 netif_carrier_off(priv->net_dev); in ipw_link_down()
10646 notify_wx_assoc_event(priv); in ipw_link_down()
10649 cancel_delayed_work(&priv->request_scan); in ipw_link_down()
10650 cancel_delayed_work(&priv->request_direct_scan); in ipw_link_down()
10651 cancel_delayed_work(&priv->request_passive_scan); in ipw_link_down()
10652 cancel_delayed_work(&priv->adhoc_check); in ipw_link_down()
10653 cancel_delayed_work(&priv->gather_stats); in ipw_link_down()
10655 ipw_reset_stats(priv); in ipw_link_down()
10657 if (!(priv->status & STATUS_EXIT_PENDING)) { in ipw_link_down()
10659 schedule_delayed_work(&priv->request_scan, 0); in ipw_link_down()
10661 cancel_delayed_work(&priv->scan_event); in ipw_link_down()
10666 struct ipw_priv *priv = in ipw_bg_link_down() local
10668 mutex_lock(&priv->mutex); in ipw_bg_link_down()
10669 ipw_link_down(priv); in ipw_bg_link_down()
10670 mutex_unlock(&priv->mutex); in ipw_bg_link_down()
10673 static int ipw_setup_deferred_work(struct ipw_priv *priv) in ipw_setup_deferred_work() argument
10677 init_waitqueue_head(&priv->wait_command_queue); in ipw_setup_deferred_work()
10678 init_waitqueue_head(&priv->wait_state); in ipw_setup_deferred_work()
10680 INIT_DELAYED_WORK(&priv->adhoc_check, ipw_bg_adhoc_check); in ipw_setup_deferred_work()
10681 INIT_WORK(&priv->associate, ipw_bg_associate); in ipw_setup_deferred_work()
10682 INIT_WORK(&priv->disassociate, ipw_bg_disassociate); in ipw_setup_deferred_work()
10683 INIT_WORK(&priv->system_config, ipw_system_config); in ipw_setup_deferred_work()
10684 INIT_WORK(&priv->rx_replenish, ipw_bg_rx_queue_replenish); in ipw_setup_deferred_work()
10685 INIT_WORK(&priv->adapter_restart, ipw_bg_adapter_restart); in ipw_setup_deferred_work()
10686 INIT_DELAYED_WORK(&priv->rf_kill, ipw_bg_rf_kill); in ipw_setup_deferred_work()
10687 INIT_WORK(&priv->up, ipw_bg_up); in ipw_setup_deferred_work()
10688 INIT_WORK(&priv->down, ipw_bg_down); in ipw_setup_deferred_work()
10689 INIT_DELAYED_WORK(&priv->request_scan, ipw_request_scan); in ipw_setup_deferred_work()
10690 INIT_DELAYED_WORK(&priv->request_direct_scan, ipw_request_direct_scan); in ipw_setup_deferred_work()
10691 INIT_DELAYED_WORK(&priv->request_passive_scan, ipw_request_passive_scan); in ipw_setup_deferred_work()
10692 INIT_DELAYED_WORK(&priv->scan_event, ipw_scan_event); in ipw_setup_deferred_work()
10693 INIT_DELAYED_WORK(&priv->gather_stats, ipw_bg_gather_stats); in ipw_setup_deferred_work()
10694 INIT_WORK(&priv->abort_scan, ipw_bg_abort_scan); in ipw_setup_deferred_work()
10695 INIT_WORK(&priv->roam, ipw_bg_roam); in ipw_setup_deferred_work()
10696 INIT_DELAYED_WORK(&priv->scan_check, ipw_bg_scan_check); in ipw_setup_deferred_work()
10697 INIT_WORK(&priv->link_up, ipw_bg_link_up); in ipw_setup_deferred_work()
10698 INIT_WORK(&priv->link_down, ipw_bg_link_down); in ipw_setup_deferred_work()
10699 INIT_DELAYED_WORK(&priv->led_link_on, ipw_bg_led_link_on); in ipw_setup_deferred_work()
10700 INIT_DELAYED_WORK(&priv->led_link_off, ipw_bg_led_link_off); in ipw_setup_deferred_work()
10701 INIT_DELAYED_WORK(&priv->led_act_off, ipw_bg_led_activity_off); in ipw_setup_deferred_work()
10702 INIT_WORK(&priv->merge_networks, ipw_merge_adhoc_network); in ipw_setup_deferred_work()
10705 INIT_WORK(&priv->qos_activate, ipw_bg_qos_activate); in ipw_setup_deferred_work()
10708 tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) in ipw_setup_deferred_work()
10709 ipw_irq_tasklet, (unsigned long)priv); in ipw_setup_deferred_work()
10717 struct ipw_priv *priv = libipw_priv(dev); in shim__set_security() local
10721 priv->ieee->sec.encode_alg[i] = sec->encode_alg[i]; in shim__set_security()
10722 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i]; in shim__set_security()
10724 priv->ieee->sec.flags &= ~(1 << i); in shim__set_security()
10726 memcpy(priv->ieee->sec.keys[i], sec->keys[i], in shim__set_security()
10728 priv->ieee->sec.flags |= (1 << i); in shim__set_security()
10730 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
10732 priv->ieee->sec.flags &= ~(1 << i); in shim__set_security()
10737 priv->ieee->sec.active_key = sec->active_key; in shim__set_security()
10738 priv->ieee->sec.flags |= SEC_ACTIVE_KEY; in shim__set_security()
10740 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY; in shim__set_security()
10741 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
10743 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY; in shim__set_security()
10746 (priv->ieee->sec.auth_mode != sec->auth_mode)) { in shim__set_security()
10747 priv->ieee->sec.auth_mode = sec->auth_mode; in shim__set_security()
10748 priv->ieee->sec.flags |= SEC_AUTH_MODE; in shim__set_security()
10750 priv->capability |= CAP_SHARED_KEY; in shim__set_security()
10752 priv->capability &= ~CAP_SHARED_KEY; in shim__set_security()
10753 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
10756 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) { in shim__set_security()
10757 priv->ieee->sec.flags |= SEC_ENABLED; in shim__set_security()
10758 priv->ieee->sec.enabled = sec->enabled; in shim__set_security()
10759 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
10761 priv->capability |= CAP_PRIVACY_ON; in shim__set_security()
10763 priv->capability &= ~CAP_PRIVACY_ON; in shim__set_security()
10767 priv->ieee->sec.encrypt = sec->encrypt; in shim__set_security()
10769 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) { in shim__set_security()
10770 priv->ieee->sec.level = sec->level; in shim__set_security()
10771 priv->ieee->sec.flags |= SEC_LEVEL; in shim__set_security()
10772 priv->status |= STATUS_SECURITY_UPDATED; in shim__set_security()
10775 if (!priv->ieee->host_encrypt && (sec->flags & SEC_ENCRYPT)) in shim__set_security()
10776 ipw_set_hwcrypto_keys(priv); in shim__set_security()
10782 if ((priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) && in shim__set_security()
10783 (((priv->assoc_request.capability & in shim__set_security()
10785 (!(priv->assoc_request.capability & in shim__set_security()
10789 ipw_disassociate(priv); in shim__set_security()
10794 static int init_supported_rates(struct ipw_priv *priv, in init_supported_rates() argument
10801 switch (priv->ieee->freq_band) { in init_supported_rates()
10814 if (priv->ieee->modulation & LIBIPW_OFDM_MODULATION) { in init_supported_rates()
10824 static int ipw_config(struct ipw_priv *priv) in ipw_config() argument
10829 if (ipw_set_tx_power(priv)) in ipw_config()
10833 if (ipw_send_adapter_address(priv, priv->net_dev->dev_addr)) in ipw_config()
10837 init_sys_config(&priv->sys_config); in ipw_config()
10842 unsigned char bt_caps = priv->eeprom[EEPROM_SKU_CAPABILITY]; in ipw_config()
10845 priv->sys_config.bt_coexistence in ipw_config()
10848 priv->sys_config.bt_coexistence in ipw_config()
10853 if (priv->prom_net_dev && netif_running(priv->prom_net_dev)) { in ipw_config()
10854 priv->sys_config.accept_all_data_frames = 1; in ipw_config()
10855 priv->sys_config.accept_non_directed_frames = 1; in ipw_config()
10856 priv->sys_config.accept_all_mgmt_bcpr = 1; in ipw_config()
10857 priv->sys_config.accept_all_mgmt_frames = 1; in ipw_config()
10861 if (priv->ieee->iw_mode == IW_MODE_ADHOC) in ipw_config()
10862 priv->sys_config.answer_broadcast_ssid_probe = 1; in ipw_config()
10864 priv->sys_config.answer_broadcast_ssid_probe = 0; in ipw_config()
10866 if (ipw_send_system_config(priv)) in ipw_config()
10869 init_supported_rates(priv, &priv->rates); in ipw_config()
10870 if (ipw_send_supported_rates(priv, &priv->rates)) in ipw_config()
10874 if (priv->rts_threshold) { in ipw_config()
10875 if (ipw_send_rts_threshold(priv, priv->rts_threshold)) in ipw_config()
10880 ipw_qos_activate(priv, NULL); in ipw_config()
10883 if (ipw_set_random_seed(priv)) in ipw_config()
10887 if (ipw_send_host_complete(priv)) in ipw_config()
10890 priv->status |= STATUS_INIT; in ipw_config()
10892 ipw_led_init(priv); in ipw_config()
10893 ipw_led_radio_on(priv); in ipw_config()
10894 priv->notif_missed_beacons = 0; in ipw_config()
10897 if ((priv->capability & CAP_PRIVACY_ON) && in ipw_config()
10898 (priv->ieee->sec.level == SEC_LEVEL_1) && in ipw_config()
10899 !(priv->ieee->host_encrypt || priv->ieee->host_decrypt)) in ipw_config()
10900 ipw_set_hwcrypto_keys(priv); in ipw_config()
11168 static void ipw_set_geo(struct ipw_priv *priv) in ipw_set_geo() argument
11173 if (!memcmp(&priv->eeprom[EEPROM_COUNTRY_CODE], in ipw_set_geo()
11180 priv->eeprom[EEPROM_COUNTRY_CODE + 0], in ipw_set_geo()
11181 priv->eeprom[EEPROM_COUNTRY_CODE + 1], in ipw_set_geo()
11182 priv->eeprom[EEPROM_COUNTRY_CODE + 2]); in ipw_set_geo()
11186 libipw_set_geo(priv->ieee, &ipw_geos[j]); in ipw_set_geo()
11190 static int ipw_up(struct ipw_priv *priv) in ipw_up() argument
11195 if (priv->suspend_time) { in ipw_up()
11196 libipw_networks_age(priv->ieee, priv->suspend_time); in ipw_up()
11197 priv->suspend_time = 0; in ipw_up()
11200 if (priv->status & STATUS_EXIT_PENDING) in ipw_up()
11203 if (cmdlog && !priv->cmdlog) { in ipw_up()
11204 priv->cmdlog = kcalloc(cmdlog, sizeof(*priv->cmdlog), in ipw_up()
11206 if (priv->cmdlog == NULL) { in ipw_up()
11211 priv->cmdlog_len = cmdlog; in ipw_up()
11218 rc = ipw_load(priv); in ipw_up()
11224 ipw_init_ordinals(priv); in ipw_up()
11225 if (!(priv->config & CFG_CUSTOM_MAC)) in ipw_up()
11226 eeprom_parse_mac(priv, priv->mac_addr); in ipw_up()
11227 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN); in ipw_up()
11229 ipw_set_geo(priv); in ipw_up()
11231 if (priv->status & STATUS_RF_KILL_SW) { in ipw_up()
11234 } else if (rf_kill_active(priv)) { in ipw_up()
11238 schedule_delayed_work(&priv->rf_kill, 2 * HZ); in ipw_up()
11242 rc = ipw_config(priv); in ipw_up()
11248 schedule_delayed_work(&priv->request_scan, 0); in ipw_up()
11259 ipw_down(priv); in ipw_up()
11271 struct ipw_priv *priv = in ipw_bg_up() local
11273 mutex_lock(&priv->mutex); in ipw_bg_up()
11274 ipw_up(priv); in ipw_bg_up()
11275 mutex_unlock(&priv->mutex); in ipw_bg_up()
11278 static void ipw_deinit(struct ipw_priv *priv) in ipw_deinit() argument
11282 if (priv->status & STATUS_SCANNING) { in ipw_deinit()
11284 ipw_abort_scan(priv); in ipw_deinit()
11287 if (priv->status & STATUS_ASSOCIATED) { in ipw_deinit()
11289 ipw_disassociate(priv); in ipw_deinit()
11292 ipw_led_shutdown(priv); in ipw_deinit()
11297 for (i = 1000; i && (priv->status & in ipw_deinit()
11302 if (priv->status & (STATUS_DISASSOCIATING | in ipw_deinit()
11309 ipw_send_card_disable(priv, 0); in ipw_deinit()
11311 priv->status &= ~STATUS_INIT; in ipw_deinit()
11314 static void ipw_down(struct ipw_priv *priv) in ipw_down() argument
11316 int exit_pending = priv->status & STATUS_EXIT_PENDING; in ipw_down()
11318 priv->status |= STATUS_EXIT_PENDING; in ipw_down()
11320 if (ipw_is_init(priv)) in ipw_down()
11321 ipw_deinit(priv); in ipw_down()
11326 priv->status &= ~STATUS_EXIT_PENDING; in ipw_down()
11329 ipw_disable_interrupts(priv); in ipw_down()
11332 priv->status &= STATUS_RF_KILL_MASK | STATUS_EXIT_PENDING; in ipw_down()
11333 netif_carrier_off(priv->net_dev); in ipw_down()
11335 ipw_stop_nic(priv); in ipw_down()
11337 ipw_led_radio_off(priv); in ipw_down()
11342 struct ipw_priv *priv = in ipw_bg_down() local
11344 mutex_lock(&priv->mutex); in ipw_bg_down()
11345 ipw_down(priv); in ipw_bg_down()
11346 mutex_unlock(&priv->mutex); in ipw_bg_down()
11352 struct ipw_priv *priv = libipw_priv(dev); in ipw_wdev_init() local
11353 const struct libipw_geo *geo = libipw_get_geo(priv->ieee); in ipw_wdev_init()
11354 struct wireless_dev *wdev = &priv->ieee->wdev; in ipw_wdev_init()
11356 memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN); in ipw_wdev_init()
11360 struct ieee80211_supported_band *bg_band = &priv->ieee->bg_band; in ipw_wdev_init()
11399 struct ieee80211_supported_band *a_band = &priv->ieee->a_band; in ipw_wdev_init()
11439 set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev); in ipw_wdev_init()
11516 struct ipw_priv *priv = prom_priv->priv; in ipw_prom_open() local
11521 if (priv->ieee->iw_mode != IW_MODE_MONITOR) { in ipw_prom_open()
11522 priv->sys_config.accept_all_data_frames = 1; in ipw_prom_open()
11523 priv->sys_config.accept_non_directed_frames = 1; in ipw_prom_open()
11524 priv->sys_config.accept_all_mgmt_bcpr = 1; in ipw_prom_open()
11525 priv->sys_config.accept_all_mgmt_frames = 1; in ipw_prom_open()
11527 ipw_send_system_config(priv); in ipw_prom_open()
11536 struct ipw_priv *priv = prom_priv->priv; in ipw_prom_stop() local
11540 if (priv->ieee->iw_mode != IW_MODE_MONITOR) { in ipw_prom_stop()
11541 priv->sys_config.accept_all_data_frames = 0; in ipw_prom_stop()
11542 priv->sys_config.accept_non_directed_frames = 0; in ipw_prom_stop()
11543 priv->sys_config.accept_all_mgmt_bcpr = 0; in ipw_prom_stop()
11544 priv->sys_config.accept_all_mgmt_frames = 0; in ipw_prom_stop()
11546 ipw_send_system_config(priv); in ipw_prom_stop()
11569 static int ipw_prom_alloc(struct ipw_priv *priv) in ipw_prom_alloc() argument
11573 if (priv->prom_net_dev) in ipw_prom_alloc()
11576 priv->prom_net_dev = alloc_libipw(sizeof(struct ipw_prom_priv), 1); in ipw_prom_alloc()
11577 if (priv->prom_net_dev == NULL) in ipw_prom_alloc()
11580 priv->prom_priv = libipw_priv(priv->prom_net_dev); in ipw_prom_alloc()
11581 priv->prom_priv->ieee = netdev_priv(priv->prom_net_dev); in ipw_prom_alloc()
11582 priv->prom_priv->priv = priv; in ipw_prom_alloc()
11584 strcpy(priv->prom_net_dev->name, "rtap%d"); in ipw_prom_alloc()
11585 memcpy(priv->prom_net_dev->dev_addr, priv->mac_addr, ETH_ALEN); in ipw_prom_alloc()
11587 priv->prom_net_dev->type = ARPHRD_IEEE80211_RADIOTAP; in ipw_prom_alloc()
11588 priv->prom_net_dev->netdev_ops = &ipw_prom_netdev_ops; in ipw_prom_alloc()
11590 priv->prom_priv->ieee->iw_mode = IW_MODE_MONITOR; in ipw_prom_alloc()
11591 SET_NETDEV_DEV(priv->prom_net_dev, &priv->pci_dev->dev); in ipw_prom_alloc()
11593 rc = register_netdev(priv->prom_net_dev); in ipw_prom_alloc()
11595 free_libipw(priv->prom_net_dev, 1); in ipw_prom_alloc()
11596 priv->prom_net_dev = NULL; in ipw_prom_alloc()
11603 static void ipw_prom_free(struct ipw_priv *priv) in ipw_prom_free() argument
11605 if (!priv->prom_net_dev) in ipw_prom_free()
11608 unregister_netdev(priv->prom_net_dev); in ipw_prom_free()
11609 free_libipw(priv->prom_net_dev, 1); in ipw_prom_free()
11611 priv->prom_net_dev = NULL; in ipw_prom_free()
11633 struct ipw_priv *priv; in ipw_pci_probe() local
11642 priv = libipw_priv(net_dev); in ipw_pci_probe()
11643 priv->ieee = netdev_priv(net_dev); in ipw_pci_probe()
11645 priv->net_dev = net_dev; in ipw_pci_probe()
11646 priv->pci_dev = pdev; in ipw_pci_probe()
11648 spin_lock_init(&priv->irq_lock); in ipw_pci_probe()
11649 spin_lock_init(&priv->lock); in ipw_pci_probe()
11651 INIT_LIST_HEAD(&priv->ibss_mac_hash[i]); in ipw_pci_probe()
11653 mutex_init(&priv->mutex); in ipw_pci_probe()
11669 pci_set_drvdata(pdev, priv); in ipw_pci_probe()
11682 priv->hw_len = length; in ipw_pci_probe()
11690 priv->hw_base = base; in ipw_pci_probe()
11694 err = ipw_setup_deferred_work(priv); in ipw_pci_probe()
11700 ipw_sw_reset(priv, 1); in ipw_pci_probe()
11702 err = request_irq(pdev->irq, ipw_isr, IRQF_SHARED, DRV_NAME, priv); in ipw_pci_probe()
11710 mutex_lock(&priv->mutex); in ipw_pci_probe()
11712 priv->ieee->hard_start_xmit = ipw_net_hard_start_xmit; in ipw_pci_probe()
11713 priv->ieee->set_security = shim__set_security; in ipw_pci_probe()
11714 priv->ieee->is_queue_full = ipw_net_is_queue_full; in ipw_pci_probe()
11717 priv->ieee->is_qos_active = ipw_is_qos_active; in ipw_pci_probe()
11718 priv->ieee->handle_probe_response = ipw_handle_beacon; in ipw_pci_probe()
11719 priv->ieee->handle_beacon = ipw_handle_probe_response; in ipw_pci_probe()
11720 priv->ieee->handle_assoc_response = ipw_handle_assoc_response; in ipw_pci_probe()
11723 priv->ieee->perfect_rssi = -20; in ipw_pci_probe()
11724 priv->ieee->worst_rssi = -85; in ipw_pci_probe()
11727 priv->wireless_data.spy_data = &priv->ieee->spy_data; in ipw_pci_probe()
11728 net_dev->wireless_data = &priv->wireless_data; in ipw_pci_probe()
11735 mutex_unlock(&priv->mutex); in ipw_pci_probe()
11739 if (ipw_up(priv)) { in ipw_pci_probe()
11740 mutex_unlock(&priv->mutex); in ipw_pci_probe()
11745 mutex_unlock(&priv->mutex); in ipw_pci_probe()
11761 err = ipw_prom_alloc(priv); in ipw_pci_probe()
11765 unregister_netdev(priv->net_dev); in ipw_pci_probe()
11773 priv->ieee->geo.name, priv->ieee->geo.bg_channels, in ipw_pci_probe()
11774 priv->ieee->geo.a_channels); in ipw_pci_probe()
11779 wiphy_unregister(priv->ieee->wdev.wiphy); in ipw_pci_probe()
11780 kfree(priv->ieee->a_band.channels); in ipw_pci_probe()
11781 kfree(priv->ieee->bg_band.channels); in ipw_pci_probe()
11785 free_irq(pdev->irq, priv); in ipw_pci_probe()
11787 iounmap(priv->hw_base); in ipw_pci_probe()
11793 free_libipw(priv->net_dev, 0); in ipw_pci_probe()
11800 struct ipw_priv *priv = pci_get_drvdata(pdev); in ipw_pci_remove() local
11804 if (!priv) in ipw_pci_remove()
11807 mutex_lock(&priv->mutex); in ipw_pci_remove()
11809 priv->status |= STATUS_EXIT_PENDING; in ipw_pci_remove()
11810 ipw_down(priv); in ipw_pci_remove()
11813 mutex_unlock(&priv->mutex); in ipw_pci_remove()
11815 unregister_netdev(priv->net_dev); in ipw_pci_remove()
11817 if (priv->rxq) { in ipw_pci_remove()
11818 ipw_rx_queue_free(priv, priv->rxq); in ipw_pci_remove()
11819 priv->rxq = NULL; in ipw_pci_remove()
11821 ipw_tx_queue_free(priv); in ipw_pci_remove()
11823 if (priv->cmdlog) { in ipw_pci_remove()
11824 kfree(priv->cmdlog); in ipw_pci_remove()
11825 priv->cmdlog = NULL; in ipw_pci_remove()
11829 cancel_delayed_work_sync(&priv->adhoc_check); in ipw_pci_remove()
11830 cancel_work_sync(&priv->associate); in ipw_pci_remove()
11831 cancel_work_sync(&priv->disassociate); in ipw_pci_remove()
11832 cancel_work_sync(&priv->system_config); in ipw_pci_remove()
11833 cancel_work_sync(&priv->rx_replenish); in ipw_pci_remove()
11834 cancel_work_sync(&priv->adapter_restart); in ipw_pci_remove()
11835 cancel_delayed_work_sync(&priv->rf_kill); in ipw_pci_remove()
11836 cancel_work_sync(&priv->up); in ipw_pci_remove()
11837 cancel_work_sync(&priv->down); in ipw_pci_remove()
11838 cancel_delayed_work_sync(&priv->request_scan); in ipw_pci_remove()
11839 cancel_delayed_work_sync(&priv->request_direct_scan); in ipw_pci_remove()
11840 cancel_delayed_work_sync(&priv->request_passive_scan); in ipw_pci_remove()
11841 cancel_delayed_work_sync(&priv->scan_event); in ipw_pci_remove()
11842 cancel_delayed_work_sync(&priv->gather_stats); in ipw_pci_remove()
11843 cancel_work_sync(&priv->abort_scan); in ipw_pci_remove()
11844 cancel_work_sync(&priv->roam); in ipw_pci_remove()
11845 cancel_delayed_work_sync(&priv->scan_check); in ipw_pci_remove()
11846 cancel_work_sync(&priv->link_up); in ipw_pci_remove()
11847 cancel_work_sync(&priv->link_down); in ipw_pci_remove()
11848 cancel_delayed_work_sync(&priv->led_link_on); in ipw_pci_remove()
11849 cancel_delayed_work_sync(&priv->led_link_off); in ipw_pci_remove()
11850 cancel_delayed_work_sync(&priv->led_act_off); in ipw_pci_remove()
11851 cancel_work_sync(&priv->merge_networks); in ipw_pci_remove()
11855 list_for_each_safe(p, q, &priv->ibss_mac_hash[i]) { in ipw_pci_remove()
11861 kfree(priv->error); in ipw_pci_remove()
11862 priv->error = NULL; in ipw_pci_remove()
11865 ipw_prom_free(priv); in ipw_pci_remove()
11868 free_irq(pdev->irq, priv); in ipw_pci_remove()
11869 iounmap(priv->hw_base); in ipw_pci_remove()
11873 wiphy_unregister(priv->ieee->wdev.wiphy); in ipw_pci_remove()
11874 kfree(priv->ieee->a_band.channels); in ipw_pci_remove()
11875 kfree(priv->ieee->bg_band.channels); in ipw_pci_remove()
11876 free_libipw(priv->net_dev, 0); in ipw_pci_remove()
11883 struct ipw_priv *priv = pci_get_drvdata(pdev); in ipw_pci_suspend() local
11884 struct net_device *dev = priv->net_dev; in ipw_pci_suspend()
11889 ipw_down(priv); in ipw_pci_suspend()
11898 priv->suspend_at = get_seconds(); in ipw_pci_suspend()
11905 struct ipw_priv *priv = pci_get_drvdata(pdev); in ipw_pci_resume() local
11906 struct net_device *dev = priv->net_dev; in ipw_pci_resume()
11935 priv->suspend_time = get_seconds() - priv->suspend_at; in ipw_pci_resume()
11938 schedule_work(&priv->up); in ipw_pci_resume()
11946 struct ipw_priv *priv = pci_get_drvdata(pdev); in ipw_pci_shutdown() local
11949 ipw_down(priv); in ipw_pci_shutdown()