Lines Matching refs:priv

574 static void build_wpa_mib(struct atmel_private *priv);
582 static int atmel_lock_mac(struct atmel_private *priv);
583 static void atmel_wmem32(struct atmel_private *priv, u16 pos, u32 data);
584 static void atmel_command_irq(struct atmel_private *priv);
585 static int atmel_validate_channel(struct atmel_private *priv, int channel);
586 static void atmel_management_frame(struct atmel_private *priv,
590 static void atmel_send_command(struct atmel_private *priv, int command,
592 static int atmel_send_command_wait(struct atmel_private *priv, int command,
594 static void atmel_transmit_management_frame(struct atmel_private *priv,
598 static u8 atmel_get_mib8(struct atmel_private *priv, u8 type, u8 index);
599 static void atmel_set_mib8(struct atmel_private *priv, u8 type, u8 index,
601 static void atmel_set_mib16(struct atmel_private *priv, u8 type, u8 index,
603 static void atmel_set_mib(struct atmel_private *priv, u8 type, u8 index,
605 static void atmel_get_mib(struct atmel_private *priv, u8 type, u8 index,
607 static void atmel_scan(struct atmel_private *priv, int specific_ssid);
608 static void atmel_join_bss(struct atmel_private *priv, int bss_index);
609 static void atmel_smooth_qual(struct atmel_private *priv);
613 static void atmel_enter_state(struct atmel_private *priv, int new_state);
616 static inline u16 atmel_hi(struct atmel_private *priv, u16 offset) in atmel_hi() argument
618 return priv->host_info_base + offset; in atmel_hi()
621 static inline u16 atmel_co(struct atmel_private *priv, u16 offset) in atmel_co() argument
623 return priv->host_info.command_pos + offset; in atmel_co()
626 static inline u16 atmel_rx(struct atmel_private *priv, u16 offset, u16 desc) in atmel_rx() argument
628 return priv->host_info.rx_desc_pos + (sizeof(struct rx_desc) * desc) + offset; in atmel_rx()
631 static inline u16 atmel_tx(struct atmel_private *priv, u16 offset, u16 desc) in atmel_tx() argument
633 return priv->host_info.tx_desc_pos + (sizeof(struct tx_desc) * desc) + offset; in atmel_tx()
656 static inline u8 atmel_rmem8(struct atmel_private *priv, u16 pos) in atmel_rmem8() argument
658 atmel_writeAR(priv->dev, pos); in atmel_rmem8()
659 return atmel_read8(priv->dev, DR); in atmel_rmem8()
662 static inline void atmel_wmem8(struct atmel_private *priv, u16 pos, u16 data) in atmel_wmem8() argument
664 atmel_writeAR(priv->dev, pos); in atmel_wmem8()
665 atmel_write8(priv->dev, DR, data); in atmel_wmem8()
668 static inline u16 atmel_rmem16(struct atmel_private *priv, u16 pos) in atmel_rmem16() argument
670 atmel_writeAR(priv->dev, pos); in atmel_rmem16()
671 return atmel_read16(priv->dev, DR); in atmel_rmem16()
674 static inline void atmel_wmem16(struct atmel_private *priv, u16 pos, u16 data) in atmel_wmem16() argument
676 atmel_writeAR(priv->dev, pos); in atmel_wmem16()
677 atmel_write16(priv->dev, DR, data); in atmel_wmem16()
682 static void tx_done_irq(struct atmel_private *priv) in tx_done_irq() argument
687 atmel_rmem8(priv, atmel_tx(priv, TX_DESC_FLAGS_OFFSET, priv->tx_desc_head)) == TX_DONE && in tx_done_irq()
688 i < priv->host_info.tx_desc_count; in tx_done_irq()
690 u8 status = atmel_rmem8(priv, atmel_tx(priv, TX_DESC_STATUS_OFFSET, priv->tx_desc_head)); in tx_done_irq()
691 u16 msdu_size = atmel_rmem16(priv, atmel_tx(priv, TX_DESC_SIZE_OFFSET, priv->tx_desc_head)); in tx_done_irq()
692 u8 type = atmel_rmem8(priv, atmel_tx(priv, TX_DESC_PACKET_TYPE_OFFSET, priv->tx_desc_head)); in tx_done_irq()
694 atmel_wmem8(priv, atmel_tx(priv, TX_DESC_FLAGS_OFFSET, priv->tx_desc_head), 0); in tx_done_irq()
696 priv->tx_free_mem += msdu_size; in tx_done_irq()
697 priv->tx_desc_free++; in tx_done_irq()
699 if (priv->tx_buff_head + msdu_size > (priv->host_info.tx_buff_pos + priv->host_info.tx_buff_size)) in tx_done_irq()
700 priv->tx_buff_head = 0; in tx_done_irq()
702 priv->tx_buff_head += msdu_size; in tx_done_irq()
704 if (priv->tx_desc_head < (priv->host_info.tx_desc_count - 1)) in tx_done_irq()
705 priv->tx_desc_head++ ; in tx_done_irq()
707 priv->tx_desc_head = 0; in tx_done_irq()
711 priv->dev->stats.tx_packets++; in tx_done_irq()
713 priv->dev->stats.tx_errors++; in tx_done_irq()
714 netif_wake_queue(priv->dev); in tx_done_irq()
719 static u16 find_tx_buff(struct atmel_private *priv, u16 len) in find_tx_buff() argument
721 u16 bottom_free = priv->host_info.tx_buff_size - priv->tx_buff_tail; in find_tx_buff()
723 if (priv->tx_desc_free == 3 || priv->tx_free_mem < len) in find_tx_buff()
727 return priv->host_info.tx_buff_pos + priv->tx_buff_tail; in find_tx_buff()
729 if (priv->tx_free_mem - bottom_free >= len) { in find_tx_buff()
730 priv->tx_buff_tail = 0; in find_tx_buff()
731 return priv->host_info.tx_buff_pos; in find_tx_buff()
737 static void tx_update_descriptor(struct atmel_private *priv, int is_bcast, in tx_update_descriptor() argument
740 atmel_wmem16(priv, atmel_tx(priv, TX_DESC_POS_OFFSET, priv->tx_desc_tail), buff); in tx_update_descriptor()
741 atmel_wmem16(priv, atmel_tx(priv, TX_DESC_SIZE_OFFSET, priv->tx_desc_tail), len); in tx_update_descriptor()
742 if (!priv->use_wpa) in tx_update_descriptor()
743 atmel_wmem16(priv, atmel_tx(priv, TX_DESC_HOST_LENGTH_OFFSET, priv->tx_desc_tail), len); in tx_update_descriptor()
744 atmel_wmem8(priv, atmel_tx(priv, TX_DESC_PACKET_TYPE_OFFSET, priv->tx_desc_tail), type); in tx_update_descriptor()
745 atmel_wmem8(priv, atmel_tx(priv, TX_DESC_RATE_OFFSET, priv->tx_desc_tail), priv->tx_rate); in tx_update_descriptor()
746 atmel_wmem8(priv, atmel_tx(priv, TX_DESC_RETRY_OFFSET, priv->tx_desc_tail), 0); in tx_update_descriptor()
747 if (priv->use_wpa) { in tx_update_descriptor()
750 cipher_type = priv->group_cipher_suite; in tx_update_descriptor()
756 else if (priv->pairwise_cipher_suite == CIPHER_SUITE_WEP_64 || in tx_update_descriptor()
757 priv->pairwise_cipher_suite == CIPHER_SUITE_WEP_128) { in tx_update_descriptor()
758 cipher_type = priv->pairwise_cipher_suite; in tx_update_descriptor()
765 cipher_type = priv->pairwise_cipher_suite; in tx_update_descriptor()
771 else if (priv->group_cipher_suite == CIPHER_SUITE_WEP_64 || in tx_update_descriptor()
772 priv->group_cipher_suite == CIPHER_SUITE_WEP_128) { in tx_update_descriptor()
773 cipher_type = priv->group_cipher_suite; in tx_update_descriptor()
781 atmel_wmem8(priv, atmel_tx(priv, TX_DESC_CIPHER_TYPE_OFFSET, priv->tx_desc_tail), in tx_update_descriptor()
783 atmel_wmem8(priv, atmel_tx(priv, TX_DESC_CIPHER_LENGTH_OFFSET, priv->tx_desc_tail), in tx_update_descriptor()
786 atmel_wmem32(priv, atmel_tx(priv, TX_DESC_NEXT_OFFSET, priv->tx_desc_tail), 0x80000000L); in tx_update_descriptor()
787 atmel_wmem8(priv, atmel_tx(priv, TX_DESC_FLAGS_OFFSET, priv->tx_desc_tail), TX_FIRM_OWN); in tx_update_descriptor()
788 if (priv->tx_desc_previous != priv->tx_desc_tail) in tx_update_descriptor()
789 atmel_wmem32(priv, atmel_tx(priv, TX_DESC_NEXT_OFFSET, priv->tx_desc_previous), 0); in tx_update_descriptor()
790 priv->tx_desc_previous = priv->tx_desc_tail; in tx_update_descriptor()
791 if (priv->tx_desc_tail < (priv->host_info.tx_desc_count - 1)) in tx_update_descriptor()
792 priv->tx_desc_tail++; in tx_update_descriptor()
794 priv->tx_desc_tail = 0; in tx_update_descriptor()
795 priv->tx_desc_free--; in tx_update_descriptor()
796 priv->tx_free_mem -= len; in tx_update_descriptor()
802 struct atmel_private *priv = netdev_priv(dev); in start_tx() local
807 if (priv->card && priv->present_callback && in start_tx()
808 !(*priv->present_callback)(priv->card)) { in start_tx()
814 if (priv->station_state != STATION_STATE_READY) { in start_tx()
821 spin_lock_bh(&priv->timerlock); in start_tx()
823 spin_lock_irqsave(&priv->irqlock, flags); in start_tx()
831 if (!(buff = find_tx_buff(priv, len + 18))) { in start_tx()
833 spin_unlock_irqrestore(&priv->irqlock, flags); in start_tx()
834 spin_unlock_bh(&priv->timerlock); in start_tx()
842 if (priv->wep_is_on) in start_tx()
844 if (priv->operating_mode == IW_MODE_ADHOC) { in start_tx()
847 memcpy(&header.addr3, priv->BSSID, ETH_ALEN); in start_tx()
850 memcpy(&header.addr1, priv->CurrentBSSID, ETH_ALEN); in start_tx()
855 if (priv->use_wpa) in start_tx()
863 priv->tx_buff_tail += len - 12 + DATA_FRAME_WS_HEADER_SIZE; in start_tx()
866 tx_update_descriptor(priv, *(skb->data) & 0x01, len + 18, buff, TX_PACKET_TYPE_DATA); in start_tx()
869 spin_unlock_irqrestore(&priv->irqlock, flags); in start_tx()
870 spin_unlock_bh(&priv->timerlock); in start_tx()
876 static void atmel_transmit_management_frame(struct atmel_private *priv, in atmel_transmit_management_frame() argument
883 if (!(buff = find_tx_buff(priv, len))) in atmel_transmit_management_frame()
886 atmel_copy_to_card(priv->dev, buff, (u8 *)header, MGMT_FRAME_BODY_OFFSET); in atmel_transmit_management_frame()
887 atmel_copy_to_card(priv->dev, buff + MGMT_FRAME_BODY_OFFSET, body, body_len); in atmel_transmit_management_frame()
888 priv->tx_buff_tail += len; in atmel_transmit_management_frame()
889 tx_update_descriptor(priv, header->addr1[0] & 0x01, len, buff, TX_PACKET_TYPE_MGMT); in atmel_transmit_management_frame()
892 static void fast_rx_path(struct atmel_private *priv, in fast_rx_path() argument
902 atmel_copy_to_host(priv->dev, mac4, rx_packet_loc + 24, 6); in fast_rx_path()
905 if (priv->do_rx_crc) { in fast_rx_path()
911 priv->dev->stats.rx_dropped++; in fast_rx_path()
917 atmel_copy_to_host(priv->dev, skbp + 12, rx_packet_loc + 30, msdu_size); in fast_rx_path()
919 if (priv->do_rx_crc) { in fast_rx_path()
922 atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + 30 + msdu_size, 4); in fast_rx_path()
924 priv->dev->stats.rx_crc_errors++; in fast_rx_path()
936 skb->protocol = eth_type_trans(skb, priv->dev); in fast_rx_path()
939 priv->dev->stats.rx_bytes += 12 + msdu_size; in fast_rx_path()
940 priv->dev->stats.rx_packets++; in fast_rx_path()
946 static int probe_crc(struct atmel_private *priv, u16 packet_loc, u16 msdu_size) in probe_crc() argument
954 atmel_copy_to_host(priv->dev, (void *)&netcrc, packet_loc + i, 4); in probe_crc()
956 atmel_writeAR(priv->dev, packet_loc); in probe_crc()
958 u8 octet = atmel_read8(priv->dev, DR); in probe_crc()
965 static void frag_rx_path(struct atmel_private *priv, in frag_rx_path() argument
981 if (priv->do_rx_crc) in frag_rx_path()
985 atmel_copy_to_host(priv->dev, mac4, rx_packet_loc, ETH_ALEN); in frag_rx_path()
989 if (priv->do_rx_crc) in frag_rx_path()
992 priv->frag_seq = seq_no; in frag_rx_path()
993 priv->frag_no = 1; in frag_rx_path()
994 priv->frag_len = msdu_size; in frag_rx_path()
995 memcpy(priv->frag_source, source, ETH_ALEN); in frag_rx_path()
996 memcpy(&priv->rx_buf[ETH_ALEN], source, ETH_ALEN); in frag_rx_path()
997 memcpy(priv->rx_buf, header->addr1, ETH_ALEN); in frag_rx_path()
999 atmel_copy_to_host(priv->dev, &priv->rx_buf[12], rx_packet_loc, msdu_size); in frag_rx_path()
1001 if (priv->do_rx_crc) { in frag_rx_path()
1003 crc = crc32_le(crc, &priv->rx_buf[12], msdu_size); in frag_rx_path()
1004 atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + msdu_size, 4); in frag_rx_path()
1006 priv->dev->stats.rx_crc_errors++; in frag_rx_path()
1007 eth_broadcast_addr(priv->frag_source); in frag_rx_path()
1011 } else if (priv->frag_no == frag_no && in frag_rx_path()
1012 priv->frag_seq == seq_no && in frag_rx_path()
1013 memcmp(priv->frag_source, source, ETH_ALEN) == 0) { in frag_rx_path()
1015 atmel_copy_to_host(priv->dev, &priv->rx_buf[12 + priv->frag_len], in frag_rx_path()
1017 if (priv->do_rx_crc) { in frag_rx_path()
1020 &priv->rx_buf[12 + priv->frag_len], in frag_rx_path()
1022 atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + msdu_size, 4); in frag_rx_path()
1024 priv->dev->stats.rx_crc_errors++; in frag_rx_path()
1025 eth_broadcast_addr(priv->frag_source); in frag_rx_path()
1030 priv->frag_len += msdu_size; in frag_rx_path()
1031 priv->frag_no++; in frag_rx_path()
1034 eth_broadcast_addr(priv->frag_source); in frag_rx_path()
1035 if (!(skb = dev_alloc_skb(priv->frag_len + 14))) { in frag_rx_path()
1036 priv->dev->stats.rx_dropped++; in frag_rx_path()
1039 memcpy(skb_put(skb, priv->frag_len + 12), in frag_rx_path()
1040 priv->rx_buf, in frag_rx_path()
1041 priv->frag_len + 12); in frag_rx_path()
1042 skb->protocol = eth_type_trans(skb, priv->dev); in frag_rx_path()
1045 priv->dev->stats.rx_bytes += priv->frag_len + 12; in frag_rx_path()
1046 priv->dev->stats.rx_packets++; in frag_rx_path()
1050 priv->wstats.discard.fragment++; in frag_rx_path()
1053 static void rx_done_irq(struct atmel_private *priv) in rx_done_irq() argument
1059 …atmel_rmem8(priv, atmel_rx(priv, RX_DESC_FLAGS_OFFSET, priv->rx_desc_head)) == RX_DESC_FLAG_VALID … in rx_done_irq()
1060 i < priv->host_info.rx_desc_count; in rx_done_irq()
1064 u8 status = atmel_rmem8(priv, atmel_rx(priv, RX_DESC_STATUS_OFFSET, priv->rx_desc_head)); in rx_done_irq()
1069 priv->wstats.discard.nwid++; in rx_done_irq()
1071 priv->dev->stats.rx_errors++; in rx_done_irq()
1075 msdu_size = atmel_rmem16(priv, atmel_rx(priv, RX_DESC_MSDU_SIZE_OFFSET, priv->rx_desc_head)); in rx_done_irq()
1076 rx_packet_loc = atmel_rmem16(priv, atmel_rx(priv, RX_DESC_MSDU_POS_OFFSET, priv->rx_desc_head)); in rx_done_irq()
1079 priv->dev->stats.rx_errors++; in rx_done_irq()
1084 atmel_copy_to_host(priv->dev, (char *)&header, rx_packet_loc, 24); in rx_done_irq()
1091 if (priv->probe_crc) { in rx_done_irq()
1092 if (!priv->wep_is_on || !(frame_ctl & IEEE80211_FCTL_PROTECTED)) { in rx_done_irq()
1093 priv->do_rx_crc = probe_crc(priv, rx_packet_loc, msdu_size); in rx_done_irq()
1095 priv->do_rx_crc = probe_crc(priv, rx_packet_loc + 24, msdu_size - 24); in rx_done_irq()
1097 if (priv->do_rx_crc) { in rx_done_irq()
1098 if (priv->crc_ok_cnt++ > 5) in rx_done_irq()
1099 priv->probe_crc = 0; in rx_done_irq()
1101 if (priv->crc_ko_cnt++ > 5) in rx_done_irq()
1102 priv->probe_crc = 0; in rx_done_irq()
1107 if (priv->do_rx_crc && (!priv->wep_is_on || !(frame_ctl & IEEE80211_FCTL_PROTECTED))) { in rx_done_irq()
1118 fast_rx_path(priv, &header, msdu_size, rx_packet_loc, crc); in rx_done_irq()
1120 frag_rx_path(priv, &header, msdu_size, rx_packet_loc, crc, in rx_done_irq()
1127 atmel_copy_to_host(priv->dev, (unsigned char *)&priv->rx_buf, rx_packet_loc + 24, msdu_size); in rx_done_irq()
1130 eth_broadcast_addr(priv->frag_source); in rx_done_irq()
1132 if (priv->do_rx_crc) { in rx_done_irq()
1135 crc = crc32_le(crc, (unsigned char *)&priv->rx_buf, msdu_size); in rx_done_irq()
1136 if ((crc ^ 0xffffffff) != (*((u32 *)&priv->rx_buf[msdu_size]))) { in rx_done_irq()
1137 priv->dev->stats.rx_crc_errors++; in rx_done_irq()
1142 atmel_management_frame(priv, &header, msdu_size, in rx_done_irq()
1143 atmel_rmem8(priv, atmel_rx(priv, RX_DESC_RSSI_OFFSET, priv->rx_desc_head))); in rx_done_irq()
1148 …atmel_wmem8(priv, atmel_rx(priv, RX_DESC_FLAGS_OFFSET, priv->rx_desc_head), RX_DESC_FLAG_CONSUMED); in rx_done_irq()
1150 if (priv->rx_desc_head < (priv->host_info.rx_desc_count - 1)) in rx_done_irq()
1151 priv->rx_desc_head++; in rx_done_irq()
1153 priv->rx_desc_head = 0; in rx_done_irq()
1160 struct atmel_private *priv = netdev_priv(dev); in service_interrupt() local
1174 if (priv->card && priv->present_callback && in service_interrupt()
1175 !(*priv->present_callback)(priv->card)) in service_interrupt()
1183 if (priv->station_state == STATION_STATE_DOWN) in service_interrupt()
1189 if (!atmel_lock_mac(priv)) { in service_interrupt()
1195 isr = atmel_rmem8(priv, atmel_hi(priv, IFACE_INT_STATUS_OFFSET)); in service_interrupt()
1196 atmel_wmem8(priv, atmel_hi(priv, IFACE_LOCKOUT_MAC_OFFSET), 0); in service_interrupt()
1209 if (!atmel_lock_mac(priv)) { in service_interrupt()
1215 isr = atmel_rmem8(priv, atmel_hi(priv, IFACE_INT_STATUS_OFFSET)); in service_interrupt()
1217 atmel_wmem8(priv, atmel_hi(priv, IFACE_INT_STATUS_OFFSET), isr); in service_interrupt()
1218 atmel_wmem8(priv, atmel_hi(priv, IFACE_LOCKOUT_MAC_OFFSET), 0); in service_interrupt()
1223 if (priv->operating_mode == IW_MODE_INFRA && in service_interrupt()
1224 priv->station_state == STATION_STATE_READY) { in service_interrupt()
1225 priv->station_is_associated = 0; in service_interrupt()
1226 atmel_scan(priv, 1); in service_interrupt()
1231 priv->wstats.discard.misc++; in service_interrupt()
1234 rx_done_irq(priv); in service_interrupt()
1238 tx_done_irq(priv); in service_interrupt()
1243 atmel_enter_state(priv, STATION_STATE_MGMT_ERROR); in service_interrupt()
1247 atmel_command_irq(priv); in service_interrupt()
1251 atmel_get_mib(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_CUR_BSSID_POS, in service_interrupt()
1252 priv->CurrentBSSID, 6); in service_interrupt()
1254 if (priv->use_wpa) in service_interrupt()
1255 build_wpa_mib(priv); in service_interrupt()
1266 struct atmel_private *priv = netdev_priv(dev); in atmel_get_wireless_stats() local
1270 atmel_smooth_qual(priv); in atmel_get_wireless_stats()
1272 priv->wstats.status = priv->station_state; in atmel_get_wireless_stats()
1274 if (priv->operating_mode == IW_MODE_INFRA) { in atmel_get_wireless_stats()
1275 if (priv->station_state != STATION_STATE_READY) { in atmel_get_wireless_stats()
1276 priv->wstats.qual.qual = 0; in atmel_get_wireless_stats()
1277 priv->wstats.qual.level = 0; in atmel_get_wireless_stats()
1278 priv->wstats.qual.updated = (IW_QUAL_QUAL_INVALID in atmel_get_wireless_stats()
1281 priv->wstats.qual.noise = 0; in atmel_get_wireless_stats()
1282 priv->wstats.qual.updated |= IW_QUAL_NOISE_INVALID; in atmel_get_wireless_stats()
1286 priv->wstats.qual.qual = 0; in atmel_get_wireless_stats()
1287 priv->wstats.qual.level = 0; in atmel_get_wireless_stats()
1288 priv->wstats.qual.noise = 0; in atmel_get_wireless_stats()
1289 priv->wstats.qual.updated = IW_QUAL_QUAL_INVALID in atmel_get_wireless_stats()
1292 priv->wstats.miss.beacon = 0; in atmel_get_wireless_stats()
1295 return &priv->wstats; in atmel_get_wireless_stats()
1318 struct atmel_private *priv = netdev_priv(dev); in atmel_open() local
1322 del_timer_sync(&priv->management_timer); in atmel_open()
1325 priv->station_state = STATION_STATE_DOWN; in atmel_open()
1327 if (priv->new_SSID_size) { in atmel_open()
1328 memcpy(priv->SSID, priv->new_SSID, priv->new_SSID_size); in atmel_open()
1329 priv->SSID_size = priv->new_SSID_size; in atmel_open()
1330 priv->new_SSID_size = 0; in atmel_open()
1332 priv->BSS_list_entries = 0; in atmel_open()
1334 priv->AuthenticationRequestRetryCnt = 0; in atmel_open()
1335 priv->AssociationRequestRetryCnt = 0; in atmel_open()
1336 priv->ReAssociationRequestRetryCnt = 0; in atmel_open()
1337 priv->CurrentAuthentTransactionSeqNum = 0x0001; in atmel_open()
1338 priv->ExpectedAuthentTransactionSeqNum = 0x0002; in atmel_open()
1340 priv->site_survey_state = SITE_SURVEY_IDLE; in atmel_open()
1341 priv->station_is_associated = 0; in atmel_open()
1347 if (priv->config_reg_domain) { in atmel_open()
1348 priv->reg_domain = priv->config_reg_domain; in atmel_open()
1349 atmel_set_mib8(priv, Phy_Mib_Type, PHY_MIB_REG_DOMAIN_POS, priv->reg_domain); in atmel_open()
1351 priv->reg_domain = atmel_get_mib8(priv, Phy_Mib_Type, PHY_MIB_REG_DOMAIN_POS); in atmel_open()
1353 if (priv->reg_domain == channel_table[i].reg_domain) in atmel_open()
1356 priv->reg_domain = REG_DOMAIN_MKK1; in atmel_open()
1361 if ((channel = atmel_validate_channel(priv, priv->channel))) in atmel_open()
1362 priv->channel = channel; in atmel_open()
1365 atmel_scan(priv, 1); in atmel_open()
1367 atmel_set_gcr(priv->dev, GCR_ENINT); /* enable interrupts */ in atmel_open()
1373 struct atmel_private *priv = netdev_priv(dev); in atmel_close() local
1376 if (priv->station_state == STATION_STATE_READY) { in atmel_close()
1383 wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL); in atmel_close()
1386 atmel_enter_state(priv, STATION_STATE_DOWN); in atmel_close()
1388 if (priv->bus_type == BUS_TYPE_PCCARD) in atmel_close()
1394 static int atmel_validate_channel(struct atmel_private *priv, int channel) in atmel_validate_channel() argument
1401 if (priv->reg_domain == channel_table[i].reg_domain) { in atmel_validate_channel()
1413 struct atmel_private *priv = m->private; in atmel_proc_show() local
1419 if (priv->station_state != STATION_STATE_DOWN) { in atmel_proc_show()
1423 priv->host_info.major_version, in atmel_proc_show()
1424 priv->host_info.minor_version, in atmel_proc_show()
1425 priv->host_info.build_version); in atmel_proc_show()
1427 if (priv->card_type != CARD_TYPE_EEPROM) in atmel_proc_show()
1429 else if (priv->firmware) in atmel_proc_show()
1430 seq_printf(m, "%s loaded by host\n", priv->firmware_id); in atmel_proc_show()
1432 seq_printf(m, "%s loaded by hotplug\n", priv->firmware_id); in atmel_proc_show()
1434 switch (priv->card_type) { in atmel_proc_show()
1450 if (priv->reg_domain == channel_table[i].reg_domain) in atmel_proc_show()
1456 priv->do_rx_crc ? "On" : "Off"); in atmel_proc_show()
1458 priv->use_wpa ? "Yes" : "No"); in atmel_proc_show()
1461 switch (priv->station_state) { in atmel_proc_show()
1522 struct atmel_private *priv; in init_atmel_card() local
1526 dev = alloc_etherdev(sizeof(*priv)); in init_atmel_card()
1535 priv = netdev_priv(dev); in init_atmel_card()
1536 priv->dev = dev; in init_atmel_card()
1537 priv->sys_dev = sys_dev; in init_atmel_card()
1538 priv->present_callback = card_present; in init_atmel_card()
1539 priv->card = card; in init_atmel_card()
1540 priv->firmware = NULL; in init_atmel_card()
1541 priv->firmware_id[0] = '\0'; in init_atmel_card()
1542 priv->firmware_type = fw_type; in init_atmel_card()
1544 strcpy(priv->firmware_id, firmware); in init_atmel_card()
1545 priv->bus_type = card_present ? BUS_TYPE_PCCARD : BUS_TYPE_PCI; in init_atmel_card()
1546 priv->station_state = STATION_STATE_DOWN; in init_atmel_card()
1547 priv->do_rx_crc = 0; in init_atmel_card()
1550 if (priv->bus_type == BUS_TYPE_PCCARD) { in init_atmel_card()
1551 priv->probe_crc = 1; in init_atmel_card()
1552 priv->crc_ok_cnt = priv->crc_ko_cnt = 0; in init_atmel_card()
1554 priv->probe_crc = 0; in init_atmel_card()
1555 priv->last_qual = jiffies; in init_atmel_card()
1556 priv->last_beacon_timestamp = 0; in init_atmel_card()
1557 memset(priv->frag_source, 0xff, sizeof(priv->frag_source)); in init_atmel_card()
1558 eth_zero_addr(priv->BSSID); in init_atmel_card()
1559 priv->CurrentBSSID[0] = 0xFF; /* Initialize to something invalid.... */ in init_atmel_card()
1560 priv->station_was_associated = 0; in init_atmel_card()
1562 priv->last_survey = jiffies; in init_atmel_card()
1563 priv->preamble = LONG_PREAMBLE; in init_atmel_card()
1564 priv->operating_mode = IW_MODE_INFRA; in init_atmel_card()
1565 priv->connect_to_any_BSS = 0; in init_atmel_card()
1566 priv->config_reg_domain = 0; in init_atmel_card()
1567 priv->reg_domain = 0; in init_atmel_card()
1568 priv->tx_rate = 3; in init_atmel_card()
1569 priv->auto_tx_rate = 1; in init_atmel_card()
1570 priv->channel = 4; in init_atmel_card()
1571 priv->power_mode = 0; in init_atmel_card()
1572 priv->SSID[0] = '\0'; in init_atmel_card()
1573 priv->SSID_size = 0; in init_atmel_card()
1574 priv->new_SSID_size = 0; in init_atmel_card()
1575 priv->frag_threshold = 2346; in init_atmel_card()
1576 priv->rts_threshold = 2347; in init_atmel_card()
1577 priv->short_retry = 7; in init_atmel_card()
1578 priv->long_retry = 4; in init_atmel_card()
1580 priv->wep_is_on = 0; in init_atmel_card()
1581 priv->default_key = 0; in init_atmel_card()
1582 priv->encryption_level = 0; in init_atmel_card()
1583 priv->exclude_unencrypted = 0; in init_atmel_card()
1584 priv->group_cipher_suite = priv->pairwise_cipher_suite = CIPHER_SUITE_NONE; in init_atmel_card()
1585 priv->use_wpa = 0; in init_atmel_card()
1586 memset(priv->wep_keys, 0, sizeof(priv->wep_keys)); in init_atmel_card()
1587 memset(priv->wep_key_len, 0, sizeof(priv->wep_key_len)); in init_atmel_card()
1589 priv->default_beacon_period = priv->beacon_period = 100; in init_atmel_card()
1590 priv->listen_interval = 1; in init_atmel_card()
1592 init_timer(&priv->management_timer); in init_atmel_card()
1593 spin_lock_init(&priv->irqlock); in init_atmel_card()
1594 spin_lock_init(&priv->timerlock); in init_atmel_card()
1595 priv->management_timer.function = atmel_management_timer; in init_atmel_card()
1596 priv->management_timer.data = (unsigned long) dev; in init_atmel_card()
1611 priv->bus_type == BUS_TYPE_PCCARD ? "atmel_cs" : "atmel_pci")) { in init_atmel_card()
1625 if (!proc_create_data("driver/atmel", 0, NULL, &atmel_proc_fops, priv)) in init_atmel_card()
1646 struct atmel_private *priv = netdev_priv(dev); in stop_atmel_card() local
1649 if (priv->bus_type == BUS_TYPE_PCCARD) in stop_atmel_card()
1653 del_timer_sync(&priv->management_timer); in stop_atmel_card()
1657 kfree(priv->firmware); in stop_atmel_card()
1669 struct atmel_private *priv = netdev_priv(dev); in atmel_set_essid() local
1673 priv->connect_to_any_BSS = 1; in atmel_set_essid()
1677 priv->connect_to_any_BSS = 0; in atmel_set_essid()
1685 memcpy(priv->new_SSID, extra, dwrq->length); in atmel_set_essid()
1686 priv->new_SSID_size = dwrq->length; in atmel_set_essid()
1697 struct atmel_private *priv = netdev_priv(dev); in atmel_get_essid() local
1700 if (priv->new_SSID_size != 0) { in atmel_get_essid()
1701 memcpy(extra, priv->new_SSID, priv->new_SSID_size); in atmel_get_essid()
1702 dwrq->length = priv->new_SSID_size; in atmel_get_essid()
1704 memcpy(extra, priv->SSID, priv->SSID_size); in atmel_get_essid()
1705 dwrq->length = priv->SSID_size; in atmel_get_essid()
1708 dwrq->flags = !priv->connect_to_any_BSS; /* active */ in atmel_get_essid()
1718 struct atmel_private *priv = netdev_priv(dev); in atmel_get_wap() local
1719 memcpy(awrq->sa_data, priv->CurrentBSSID, ETH_ALEN); in atmel_get_wap()
1730 struct atmel_private *priv = netdev_priv(dev); in atmel_set_encode() local
1740 int current_index = priv->default_key; in atmel_set_encode()
1749 priv->default_key = index; in atmel_set_encode()
1752 priv->wep_key_len[index] = 13; in atmel_set_encode()
1755 priv->wep_key_len[index] = 5; in atmel_set_encode()
1758 priv->wep_key_len[index] = 0; in atmel_set_encode()
1762 memset(priv->wep_keys[index], 0, 13); in atmel_set_encode()
1764 memcpy(priv->wep_keys[index], extra, dwrq->length); in atmel_set_encode()
1770 priv->wep_key_len[index] > 0) { in atmel_set_encode()
1771 priv->wep_is_on = 1; in atmel_set_encode()
1772 priv->exclude_unencrypted = 1; in atmel_set_encode()
1773 if (priv->wep_key_len[index] > 5) { in atmel_set_encode()
1774 priv->pairwise_cipher_suite = CIPHER_SUITE_WEP_128; in atmel_set_encode()
1775 priv->encryption_level = 2; in atmel_set_encode()
1777 priv->pairwise_cipher_suite = CIPHER_SUITE_WEP_64; in atmel_set_encode()
1778 priv->encryption_level = 1; in atmel_set_encode()
1785 priv->default_key = index; in atmel_set_encode()
1793 priv->wep_is_on = 0; in atmel_set_encode()
1794 priv->encryption_level = 0; in atmel_set_encode()
1795 priv->pairwise_cipher_suite = CIPHER_SUITE_NONE; in atmel_set_encode()
1797 priv->wep_is_on = 1; in atmel_set_encode()
1798 if (priv->wep_key_len[priv->default_key] > 5) { in atmel_set_encode()
1799 priv->pairwise_cipher_suite = CIPHER_SUITE_WEP_128; in atmel_set_encode()
1800 priv->encryption_level = 2; in atmel_set_encode()
1802 priv->pairwise_cipher_suite = CIPHER_SUITE_WEP_64; in atmel_set_encode()
1803 priv->encryption_level = 1; in atmel_set_encode()
1807 priv->exclude_unencrypted = 1; in atmel_set_encode()
1809 priv->exclude_unencrypted = 0; in atmel_set_encode()
1819 struct atmel_private *priv = netdev_priv(dev); in atmel_get_encode() local
1822 if (!priv->wep_is_on) in atmel_get_encode()
1825 if (priv->exclude_unencrypted) in atmel_get_encode()
1832 index = priv->default_key; in atmel_get_encode()
1835 dwrq->length = priv->wep_key_len[index]; in atmel_get_encode()
1840 memcpy(extra, priv->wep_keys[index], dwrq->length); in atmel_get_encode()
1851 struct atmel_private *priv = netdev_priv(dev); in atmel_set_encodeext() local
1863 idx = priv->default_key; in atmel_set_encodeext()
1869 priv->default_key = idx; in atmel_set_encodeext()
1877 priv->wep_is_on = 0; in atmel_set_encodeext()
1878 priv->encryption_level = 0; in atmel_set_encodeext()
1879 priv->pairwise_cipher_suite = CIPHER_SUITE_NONE; in atmel_set_encodeext()
1883 priv->wep_key_len[idx] = 13; in atmel_set_encodeext()
1884 priv->pairwise_cipher_suite = CIPHER_SUITE_WEP_128; in atmel_set_encodeext()
1885 priv->encryption_level = 2; in atmel_set_encodeext()
1887 priv->wep_key_len[idx] = 5; in atmel_set_encodeext()
1888 priv->pairwise_cipher_suite = CIPHER_SUITE_WEP_64; in atmel_set_encodeext()
1889 priv->encryption_level = 1; in atmel_set_encodeext()
1893 priv->wep_is_on = 1; in atmel_set_encodeext()
1894 memset(priv->wep_keys[idx], 0, 13); in atmel_set_encodeext()
1895 key_len = min ((int)ext->key_len, priv->wep_key_len[idx]); in atmel_set_encodeext()
1896 memcpy(priv->wep_keys[idx], ext->key, key_len); in atmel_set_encodeext()
1911 struct atmel_private *priv = netdev_priv(dev); in atmel_get_encodeext() local
1926 idx = priv->default_key; in atmel_get_encodeext()
1931 if (!priv->wep_is_on) { in atmel_get_encodeext()
1936 if (priv->encryption_level > 0) in atmel_get_encodeext()
1941 ext->key_len = priv->wep_key_len[idx]; in atmel_get_encodeext()
1942 memcpy(ext->key, priv->wep_keys[idx], ext->key_len); in atmel_get_encodeext()
1953 struct atmel_private *priv = netdev_priv(dev); in atmel_set_auth() local
1969 priv->exclude_unencrypted = param->value ? 1 : 0; in atmel_set_auth()
1974 priv->exclude_unencrypted = 1; in atmel_set_auth()
1976 priv->exclude_unencrypted = 0; in atmel_set_auth()
1998 struct atmel_private *priv = netdev_priv(dev); in atmel_get_auth() local
2003 param->value = priv->exclude_unencrypted; in atmel_get_auth()
2007 if (priv->exclude_unencrypted == 1) in atmel_get_auth()
2038 struct atmel_private *priv = netdev_priv(dev); in atmel_set_rate() local
2041 priv->tx_rate = 3; in atmel_set_rate()
2042 priv->auto_tx_rate = 1; in atmel_set_rate()
2044 priv->auto_tx_rate = 0; in atmel_set_rate()
2049 priv->tx_rate = vwrq->value; in atmel_set_rate()
2054 priv->tx_rate = 0; in atmel_set_rate()
2057 priv->tx_rate = 1; in atmel_set_rate()
2060 priv->tx_rate = 2; in atmel_set_rate()
2063 priv->tx_rate = 3; in atmel_set_rate()
2079 struct atmel_private *priv = netdev_priv(dev); in atmel_set_mode() local
2084 priv->operating_mode = *uwrq; in atmel_set_mode()
2093 struct atmel_private *priv = netdev_priv(dev); in atmel_get_mode() local
2095 *uwrq = priv->operating_mode; in atmel_get_mode()
2104 struct atmel_private *priv = netdev_priv(dev); in atmel_get_rate() local
2106 if (priv->auto_tx_rate) { in atmel_get_rate()
2111 switch (priv->tx_rate) { in atmel_get_rate()
2134 struct atmel_private *priv = netdev_priv(dev); in atmel_set_power() local
2135 priv->power_mode = vwrq->disabled ? 0 : 1; in atmel_set_power()
2144 struct atmel_private *priv = netdev_priv(dev); in atmel_get_power() local
2145 vwrq->disabled = priv->power_mode ? 0 : 1; in atmel_get_power()
2155 struct atmel_private *priv = netdev_priv(dev); in atmel_set_retry() local
2159 priv->long_retry = vwrq->value; in atmel_set_retry()
2161 priv->short_retry = vwrq->value; in atmel_set_retry()
2164 priv->long_retry = vwrq->value; in atmel_set_retry()
2165 priv->short_retry = vwrq->value; in atmel_set_retry()
2178 struct atmel_private *priv = netdev_priv(dev); in atmel_get_retry() local
2185 vwrq->value = priv->long_retry; in atmel_get_retry()
2188 vwrq->value = priv->short_retry; in atmel_get_retry()
2189 if (priv->long_retry != priv->short_retry) in atmel_get_retry()
2201 struct atmel_private *priv = netdev_priv(dev); in atmel_set_rts() local
2209 priv->rts_threshold = rthr; in atmel_set_rts()
2219 struct atmel_private *priv = netdev_priv(dev); in atmel_get_rts() local
2221 vwrq->value = priv->rts_threshold; in atmel_get_rts()
2233 struct atmel_private *priv = netdev_priv(dev); in atmel_set_frag() local
2242 priv->frag_threshold = fthr; in atmel_set_frag()
2252 struct atmel_private *priv = netdev_priv(dev); in atmel_get_frag() local
2254 vwrq->value = priv->frag_threshold; in atmel_get_frag()
2266 struct atmel_private *priv = netdev_priv(dev); in atmel_set_freq() local
2282 if (atmel_validate_channel(priv, channel) == 0) { in atmel_set_freq()
2283 priv->channel = channel; in atmel_set_freq()
2296 struct atmel_private *priv = netdev_priv(dev); in atmel_get_freq() local
2298 fwrq->m = priv->channel; in atmel_get_freq()
2308 struct atmel_private *priv = netdev_priv(dev); in atmel_set_scan() local
2318 if (priv->station_state == STATION_STATE_DOWN) in atmel_set_scan()
2322 if (time_after(jiffies, priv->last_survey + 20 * HZ)) in atmel_set_scan()
2323 priv->site_survey_state = SITE_SURVEY_IDLE; in atmel_set_scan()
2324 priv->last_survey = jiffies; in atmel_set_scan()
2327 if (priv->site_survey_state == SITE_SURVEY_IN_PROGRESS) in atmel_set_scan()
2330 del_timer_sync(&priv->management_timer); in atmel_set_scan()
2331 spin_lock_irqsave(&priv->irqlock, flags); in atmel_set_scan()
2333 priv->site_survey_state = SITE_SURVEY_IN_PROGRESS; in atmel_set_scan()
2334 priv->fast_scan = 0; in atmel_set_scan()
2335 atmel_scan(priv, 0); in atmel_set_scan()
2336 spin_unlock_irqrestore(&priv->irqlock, flags); in atmel_set_scan()
2346 struct atmel_private *priv = netdev_priv(dev); in atmel_get_scan() local
2351 if (priv->site_survey_state != SITE_SURVEY_COMPLETED) in atmel_get_scan()
2354 for (i = 0; i < priv->BSS_list_entries; i++) { in atmel_get_scan()
2357 memcpy(iwe.u.ap_addr.sa_data, priv->BSSinfo[i].BSSID, ETH_ALEN); in atmel_get_scan()
2362 iwe.u.data.length = priv->BSSinfo[i].SSIDsize; in atmel_get_scan()
2369 &iwe, priv->BSSinfo[i].SSID); in atmel_get_scan()
2372 iwe.u.mode = priv->BSSinfo[i].BSStype; in atmel_get_scan()
2378 iwe.u.freq.m = priv->BSSinfo[i].channel; in atmel_get_scan()
2386 iwe.u.qual.level = priv->BSSinfo[i].RSSI; in atmel_get_scan()
2395 if (priv->BSSinfo[i].UsingWEP) in atmel_get_scan()
2417 struct atmel_private *priv = netdev_priv(dev); in atmel_get_range() local
2427 if (priv->reg_domain == channel_table[j].reg_domain) { in atmel_get_range()
2491 struct atmel_private *priv = netdev_priv(dev); in atmel_set_wap() local
2502 del_timer_sync(&priv->management_timer); in atmel_set_wap()
2503 spin_lock_irqsave(&priv->irqlock, flags); in atmel_set_wap()
2504 atmel_scan(priv, 1); in atmel_set_wap()
2505 spin_unlock_irqrestore(&priv->irqlock, flags); in atmel_set_wap()
2509 for (i = 0; i < priv->BSS_list_entries; i++) { in atmel_set_wap()
2510 if (memcmp(priv->BSSinfo[i].BSSID, awrq->sa_data, 6) == 0) { in atmel_set_wap()
2511 if (!priv->wep_is_on && priv->BSSinfo[i].UsingWEP) { in atmel_set_wap()
2513 } else if (priv->wep_is_on && !priv->BSSinfo[i].UsingWEP) { in atmel_set_wap()
2516 del_timer_sync(&priv->management_timer); in atmel_set_wap()
2517 spin_lock_irqsave(&priv->irqlock, flags); in atmel_set_wap()
2518 atmel_join_bss(priv, i); in atmel_set_wap()
2519 spin_unlock_irqrestore(&priv->irqlock, flags); in atmel_set_wap()
2646 struct atmel_private *priv = netdev_priv(dev); in atmel_ioctl() local
2679 kfree(priv->firmware); in atmel_ioctl()
2681 priv->firmware = new_firmware; in atmel_ioctl()
2682 priv->firmware_length = com.len; in atmel_ioctl()
2683 strncpy(priv->firmware_id, com.id, 31); in atmel_ioctl()
2684 priv->firmware_id[31] = '\0'; in atmel_ioctl()
2702 priv->config_reg_domain = channel_table[i].reg_domain; in atmel_ioctl()
2707 if (rc == 0 && priv->station_state != STATION_STATE_DOWN) in atmel_ioctl()
2727 static void atmel_enter_state(struct atmel_private *priv, int new_state) in atmel_enter_state() argument
2729 int old_state = priv->station_state; in atmel_enter_state()
2734 priv->station_state = new_state; in atmel_enter_state()
2737 netif_start_queue(priv->dev); in atmel_enter_state()
2738 netif_carrier_on(priv->dev); in atmel_enter_state()
2742 netif_carrier_off(priv->dev); in atmel_enter_state()
2743 if (netif_running(priv->dev)) in atmel_enter_state()
2744 netif_stop_queue(priv->dev); in atmel_enter_state()
2745 priv->last_beacon_timestamp = 0; in atmel_enter_state()
2749 static void atmel_scan(struct atmel_private *priv, int specific_ssid) in atmel_scan() argument
2765 if (priv->fast_scan) { in atmel_scan()
2766 cmd.SSID_size = priv->SSID_size; in atmel_scan()
2767 memcpy(cmd.SSID, priv->SSID, priv->SSID_size); in atmel_scan()
2771 priv->BSS_list_entries = 0; in atmel_scan()
2782 cmd.channel = (priv->channel & 0x7f); in atmel_scan()
2784 cmd.BSS_type = cpu_to_le16(priv->operating_mode == IW_MODE_ADHOC ? in atmel_scan()
2787 atmel_send_command(priv, CMD_Scan, &cmd, sizeof(cmd)); in atmel_scan()
2791 atmel_enter_state(priv, STATION_STATE_SCANNING); in atmel_scan()
2794 static void join(struct atmel_private *priv, int type) in join() argument
2806 cmd.SSID_size = priv->SSID_size; in join()
2807 memcpy(cmd.SSID, priv->SSID, priv->SSID_size); in join()
2808 memcpy(cmd.BSSID, priv->CurrentBSSID, ETH_ALEN); in join()
2809 cmd.channel = (priv->channel & 0x7f); in join()
2813 atmel_send_command(priv, CMD_Join, &cmd, sizeof(cmd)); in join()
2816 static void start(struct atmel_private *priv, int type) in start() argument
2827 cmd.SSID_size = priv->SSID_size; in start()
2828 memcpy(cmd.SSID, priv->SSID, priv->SSID_size); in start()
2829 memcpy(cmd.BSSID, priv->BSSID, ETH_ALEN); in start()
2831 cmd.channel = (priv->channel & 0x7f); in start()
2833 atmel_send_command(priv, CMD_Start, &cmd, sizeof(cmd)); in start()
2836 static void handle_beacon_probe(struct atmel_private *priv, u16 capability, in handle_beacon_probe() argument
2843 if (priv->preamble != new) { in handle_beacon_probe()
2844 priv->preamble = new; in handle_beacon_probe()
2846 atmel_set_mib8(priv, Local_Mib_Type, LOCAL_MIB_PREAMBLE_TYPE, new); in handle_beacon_probe()
2849 if (priv->channel != channel) { in handle_beacon_probe()
2850 priv->channel = channel; in handle_beacon_probe()
2852 atmel_set_mib8(priv, Phy_Mib_Type, PHY_MIB_CHANNEL_POS, channel); in handle_beacon_probe()
2856 priv->station_is_associated = 0; in handle_beacon_probe()
2857 atmel_enter_state(priv, STATION_STATE_JOINNING); in handle_beacon_probe()
2859 if (priv->operating_mode == IW_MODE_INFRA) in handle_beacon_probe()
2860 join(priv, BSS_TYPE_INFRASTRUCTURE); in handle_beacon_probe()
2862 join(priv, BSS_TYPE_AD_HOC); in handle_beacon_probe()
2866 static void send_authentication_request(struct atmel_private *priv, u16 system, in send_authentication_request() argument
2875 memcpy(header.addr1, priv->CurrentBSSID, ETH_ALEN); in send_authentication_request()
2876 memcpy(header.addr2, priv->dev->dev_addr, ETH_ALEN); in send_authentication_request()
2877 memcpy(header.addr3, priv->CurrentBSSID, ETH_ALEN); in send_authentication_request()
2879 if (priv->wep_is_on && priv->CurrentAuthentTransactionSeqNum != 1) in send_authentication_request()
2886 auth.trans_seq = cpu_to_le16(priv->CurrentAuthentTransactionSeqNum); in send_authentication_request()
2887 priv->ExpectedAuthentTransactionSeqNum = priv->CurrentAuthentTransactionSeqNum+1; in send_authentication_request()
2888 priv->CurrentAuthentTransactionSeqNum += 2; in send_authentication_request()
2894 atmel_transmit_management_frame(priv, &header, (u8 *)&auth, 8 + challenge_len); in send_authentication_request()
2896 atmel_transmit_management_frame(priv, &header, (u8 *)&auth, 6); in send_authentication_request()
2900 static void send_association_request(struct atmel_private *priv, int is_reassoc) in send_association_request() argument
2922 memcpy(header.addr1, priv->CurrentBSSID, ETH_ALEN); in send_association_request()
2923 memcpy(header.addr2, priv->dev->dev_addr, ETH_ALEN); in send_association_request()
2924 memcpy(header.addr3, priv->CurrentBSSID, ETH_ALEN); in send_association_request()
2927 if (priv->wep_is_on) in send_association_request()
2929 if (priv->preamble == SHORT_PREAMBLE) in send_association_request()
2932 body.listen_interval = cpu_to_le16(priv->listen_interval * priv->beacon_period); in send_association_request()
2936 memcpy(body.ap, priv->CurrentBSSID, ETH_ALEN); in send_association_request()
2938 bodysize = 18 + priv->SSID_size; in send_association_request()
2941 bodysize = 12 + priv->SSID_size; in send_association_request()
2945 ssid_el_p[1] = priv->SSID_size; in send_association_request()
2946 memcpy(ssid_el_p + 2, priv->SSID, priv->SSID_size); in send_association_request()
2947 ssid_el_p[2 + priv->SSID_size] = WLAN_EID_SUPP_RATES; in send_association_request()
2948 ssid_el_p[3 + priv->SSID_size] = 4; /* len of supported rates */ in send_association_request()
2949 memcpy(ssid_el_p + 4 + priv->SSID_size, atmel_basic_rates, 4); in send_association_request()
2951 atmel_transmit_management_frame(priv, &header, (void *)&body, bodysize); in send_association_request()
2954 static int is_frame_from_current_bss(struct atmel_private *priv, in is_frame_from_current_bss() argument
2958 return memcmp(header->addr3, priv->CurrentBSSID, 6) == 0; in is_frame_from_current_bss()
2960 return memcmp(header->addr2, priv->CurrentBSSID, 6) == 0; in is_frame_from_current_bss()
2963 static int retrieve_bss(struct atmel_private *priv) in retrieve_bss() argument
2969 if (priv->BSS_list_entries == 0) in retrieve_bss()
2972 if (priv->connect_to_any_BSS) { in retrieve_bss()
2977 priv->current_BSS = 0; in retrieve_bss()
2978 for (i = 0; i < priv->BSS_list_entries; i++) { in retrieve_bss()
2979 if (priv->operating_mode == priv->BSSinfo[i].BSStype && in retrieve_bss()
2980 ((!priv->wep_is_on && !priv->BSSinfo[i].UsingWEP) || in retrieve_bss()
2981 (priv->wep_is_on && priv->BSSinfo[i].UsingWEP)) && in retrieve_bss()
2982 !(priv->BSSinfo[i].channel & 0x80)) { in retrieve_bss()
2983 max_rssi = priv->BSSinfo[i].RSSI; in retrieve_bss()
2984 priv->current_BSS = max_index = i; in retrieve_bss()
2990 for (i = 0; i < priv->BSS_list_entries; i++) { in retrieve_bss()
2991 if (priv->SSID_size == priv->BSSinfo[i].SSIDsize && in retrieve_bss()
2992 memcmp(priv->SSID, priv->BSSinfo[i].SSID, priv->SSID_size) == 0 && in retrieve_bss()
2993 priv->operating_mode == priv->BSSinfo[i].BSStype && in retrieve_bss()
2994 atmel_validate_channel(priv, priv->BSSinfo[i].channel) == 0) { in retrieve_bss()
2995 if (priv->BSSinfo[i].RSSI >= max_rssi) { in retrieve_bss()
2996 max_rssi = priv->BSSinfo[i].RSSI; in retrieve_bss()
3004 static void store_bss_info(struct atmel_private *priv, in store_bss_info() argument
3012 for (index = -1, i = 0; i < priv->BSS_list_entries; i++) in store_bss_info()
3013 if (memcmp(bss, priv->BSSinfo[i].BSSID, ETH_ALEN) == 0) in store_bss_info()
3021 if (priv->BSS_list_entries == MAX_BSS_ENTRIES) in store_bss_info()
3023 index = priv->BSS_list_entries++; in store_bss_info()
3024 memcpy(priv->BSSinfo[index].BSSID, bss, ETH_ALEN); in store_bss_info()
3025 priv->BSSinfo[index].RSSI = rssi; in store_bss_info()
3027 if (rssi > priv->BSSinfo[index].RSSI) in store_bss_info()
3028 priv->BSSinfo[index].RSSI = rssi; in store_bss_info()
3033 priv->BSSinfo[index].channel = channel; in store_bss_info()
3034 priv->BSSinfo[index].beacon_period = beacon_period; in store_bss_info()
3035 priv->BSSinfo[index].UsingWEP = capability & WLAN_CAPABILITY_PRIVACY; in store_bss_info()
3036 memcpy(priv->BSSinfo[index].SSID, ssid, ssid_len); in store_bss_info()
3037 priv->BSSinfo[index].SSIDsize = ssid_len; in store_bss_info()
3040 priv->BSSinfo[index].BSStype = IW_MODE_ADHOC; in store_bss_info()
3042 priv->BSSinfo[index].BSStype = IW_MODE_INFRA; in store_bss_info()
3044 priv->BSSinfo[index].preamble = capability & WLAN_CAPABILITY_SHORT_PREAMBLE ? in store_bss_info()
3048 static void authenticate(struct atmel_private *priv, u16 frame_len) in authenticate() argument
3050 struct auth_body *auth = (struct auth_body *)priv->rx_buf; in authenticate()
3055 if (status == WLAN_STATUS_SUCCESS && !priv->wep_is_on) { in authenticate()
3057 if (priv->station_was_associated) { in authenticate()
3058 atmel_enter_state(priv, STATION_STATE_REASSOCIATING); in authenticate()
3059 send_association_request(priv, 1); in authenticate()
3062 atmel_enter_state(priv, STATION_STATE_ASSOCIATING); in authenticate()
3063 send_association_request(priv, 0); in authenticate()
3068 if (status == WLAN_STATUS_SUCCESS && priv->wep_is_on) { in authenticate()
3071 if (trans_seq_no != priv->ExpectedAuthentTransactionSeqNum) in authenticate()
3081 send_authentication_request(priv, system, auth->chall_text, auth->chall_text_len); in authenticate()
3089 if (priv->station_was_associated) { in authenticate()
3090 atmel_enter_state(priv, STATION_STATE_REASSOCIATING); in authenticate()
3091 send_association_request(priv, 1); in authenticate()
3094 atmel_enter_state(priv, STATION_STATE_ASSOCIATING); in authenticate()
3095 send_association_request(priv, 0); in authenticate()
3106 priv->CurrentAuthentTransactionSeqNum = 0x001; in authenticate()
3107 priv->exclude_unencrypted = 1; in authenticate()
3108 send_authentication_request(priv, WLAN_AUTH_SHARED_KEY, NULL, 0); in authenticate()
3111 && priv->wep_is_on) { in authenticate()
3112 priv->CurrentAuthentTransactionSeqNum = 0x001; in authenticate()
3113 priv->exclude_unencrypted = 0; in authenticate()
3114 send_authentication_request(priv, WLAN_AUTH_OPEN, NULL, 0); in authenticate()
3116 } else if (priv->connect_to_any_BSS) { in authenticate()
3119 priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80; in authenticate()
3121 if ((bss_index = retrieve_bss(priv)) != -1) { in authenticate()
3122 atmel_join_bss(priv, bss_index); in authenticate()
3128 priv->AuthenticationRequestRetryCnt = 0; in authenticate()
3129 atmel_enter_state(priv, STATION_STATE_MGMT_ERROR); in authenticate()
3130 priv->station_is_associated = 0; in authenticate()
3133 static void associate(struct atmel_private *priv, u16 frame_len, u16 subtype) in associate() argument
3142 } *ass_resp = (struct ass_resp_format *)priv->rx_buf; in associate()
3155 priv->AssociationRequestRetryCnt = 0; in associate()
3157 priv->ReAssociationRequestRetryCnt = 0; in associate()
3159 atmel_set_mib16(priv, Mac_Mgmt_Mib_Type, in associate()
3161 atmel_set_mib(priv, Phy_Mib_Type, in associate()
3163 if (priv->power_mode == 0) { in associate()
3164 priv->listen_interval = 1; in associate()
3165 atmel_set_mib8(priv, Mac_Mgmt_Mib_Type, in associate()
3167 atmel_set_mib16(priv, Mac_Mgmt_Mib_Type, in associate()
3170 priv->listen_interval = 2; in associate()
3171 atmel_set_mib8(priv, Mac_Mgmt_Mib_Type, in associate()
3173 atmel_set_mib16(priv, Mac_Mgmt_Mib_Type, in associate()
3177 priv->station_is_associated = 1; in associate()
3178 priv->station_was_associated = 1; in associate()
3179 atmel_enter_state(priv, STATION_STATE_READY); in associate()
3184 memcpy(wrqu.ap_addr.sa_data, priv->CurrentBSSID, ETH_ALEN); in associate()
3186 wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL); in associate()
3194 priv->AssociationRequestRetryCnt < MAX_ASSOCIATION_RETRIES) { in associate()
3195 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); in associate()
3196 priv->AssociationRequestRetryCnt++; in associate()
3197 send_association_request(priv, 0); in associate()
3204 priv->ReAssociationRequestRetryCnt < MAX_ASSOCIATION_RETRIES) { in associate()
3205 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); in associate()
3206 priv->ReAssociationRequestRetryCnt++; in associate()
3207 send_association_request(priv, 1); in associate()
3211 atmel_enter_state(priv, STATION_STATE_MGMT_ERROR); in associate()
3212 priv->station_is_associated = 0; in associate()
3214 if (priv->connect_to_any_BSS) { in associate()
3216 priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80; in associate()
3218 if ((bss_index = retrieve_bss(priv)) != -1) in associate()
3219 atmel_join_bss(priv, bss_index); in associate()
3223 static void atmel_join_bss(struct atmel_private *priv, int bss_index) in atmel_join_bss() argument
3225 struct bss_info *bss = &priv->BSSinfo[bss_index]; in atmel_join_bss()
3227 memcpy(priv->CurrentBSSID, bss->BSSID, ETH_ALEN); in atmel_join_bss()
3228 memcpy(priv->SSID, bss->SSID, priv->SSID_size = bss->SSIDsize); in atmel_join_bss()
3231 if (priv->use_wpa) in atmel_join_bss()
3232 build_wpa_mib(priv); in atmel_join_bss()
3237 priv->operating_mode != IW_MODE_ADHOC && in atmel_join_bss()
3238 priv->power_mode) { in atmel_join_bss()
3239 priv->power_mode = 0; in atmel_join_bss()
3240 priv->listen_interval = 1; in atmel_join_bss()
3241 atmel_set_mib8(priv, Mac_Mgmt_Mib_Type, in atmel_join_bss()
3243 atmel_set_mib16(priv, Mac_Mgmt_Mib_Type, in atmel_join_bss()
3247 priv->operating_mode = bss->BSStype; in atmel_join_bss()
3248 priv->channel = bss->channel & 0x7f; in atmel_join_bss()
3249 priv->beacon_period = bss->beacon_period; in atmel_join_bss()
3251 if (priv->preamble != bss->preamble) { in atmel_join_bss()
3252 priv->preamble = bss->preamble; in atmel_join_bss()
3253 atmel_set_mib8(priv, Local_Mib_Type, in atmel_join_bss()
3257 if (!priv->wep_is_on && bss->UsingWEP) { in atmel_join_bss()
3258 atmel_enter_state(priv, STATION_STATE_MGMT_ERROR); in atmel_join_bss()
3259 priv->station_is_associated = 0; in atmel_join_bss()
3263 if (priv->wep_is_on && !bss->UsingWEP) { in atmel_join_bss()
3264 atmel_enter_state(priv, STATION_STATE_MGMT_ERROR); in atmel_join_bss()
3265 priv->station_is_associated = 0; in atmel_join_bss()
3269 atmel_enter_state(priv, STATION_STATE_JOINNING); in atmel_join_bss()
3271 if (priv->operating_mode == IW_MODE_INFRA) in atmel_join_bss()
3272 join(priv, BSS_TYPE_INFRASTRUCTURE); in atmel_join_bss()
3274 join(priv, BSS_TYPE_AD_HOC); in atmel_join_bss()
3277 static void restart_search(struct atmel_private *priv) in restart_search() argument
3281 if (!priv->connect_to_any_BSS) { in restart_search()
3282 atmel_scan(priv, 1); in restart_search()
3284 priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80; in restart_search()
3286 if ((bss_index = retrieve_bss(priv)) != -1) in restart_search()
3287 atmel_join_bss(priv, bss_index); in restart_search()
3289 atmel_scan(priv, 0); in restart_search()
3293 static void smooth_rssi(struct atmel_private *priv, u8 rssi) in smooth_rssi() argument
3295 u8 old = priv->wstats.qual.level; in smooth_rssi()
3298 switch (priv->firmware_type) { in smooth_rssi()
3308 priv->wstats.qual.level = (rssi + old) / 2 + 1; in smooth_rssi()
3310 priv->wstats.qual.level = (rssi + old) / 2; in smooth_rssi()
3311 priv->wstats.qual.updated |= IW_QUAL_LEVEL_UPDATED; in smooth_rssi()
3312 priv->wstats.qual.updated &= ~IW_QUAL_LEVEL_INVALID; in smooth_rssi()
3315 static void atmel_smooth_qual(struct atmel_private *priv) in atmel_smooth_qual() argument
3317 unsigned long time_diff = (jiffies - priv->last_qual) / HZ; in atmel_smooth_qual()
3319 priv->last_qual += HZ; in atmel_smooth_qual()
3320 priv->wstats.qual.qual = priv->wstats.qual.qual / 2; in atmel_smooth_qual()
3321 priv->wstats.qual.qual += in atmel_smooth_qual()
3322 priv->beacons_this_sec * priv->beacon_period * (priv->wstats.qual.level + 100) / 4000; in atmel_smooth_qual()
3323 priv->beacons_this_sec = 0; in atmel_smooth_qual()
3325 priv->wstats.qual.updated |= IW_QUAL_QUAL_UPDATED; in atmel_smooth_qual()
3326 priv->wstats.qual.updated &= ~IW_QUAL_QUAL_INVALID; in atmel_smooth_qual()
3330 static void atmel_management_frame(struct atmel_private *priv, in atmel_management_frame() argument
3357 } *beacon = (struct beacon_format *)priv->rx_buf; in atmel_management_frame()
3363 u8 *beaconp = priv->rx_buf; in atmel_management_frame()
3375 if (priv->station_state == STATION_STATE_READY) { in atmel_management_frame()
3376 smooth_rssi(priv, rssi); in atmel_management_frame()
3377 if (is_frame_from_current_bss(priv, header)) { in atmel_management_frame()
3378 priv->beacons_this_sec++; in atmel_management_frame()
3379 atmel_smooth_qual(priv); in atmel_management_frame()
3380 if (priv->last_beacon_timestamp) { in atmel_management_frame()
3382 u32 beacon_delay = timestamp - priv->last_beacon_timestamp; in atmel_management_frame()
3385 priv->wstats.miss.beacon += beacons - 1; in atmel_management_frame()
3387 priv->last_beacon_timestamp = timestamp; in atmel_management_frame()
3388 handle_beacon_probe(priv, capability, channel); in atmel_management_frame()
3392 if (priv->station_state == STATION_STATE_SCANNING) in atmel_management_frame()
3393 store_bss_info(priv, header, capability, in atmel_management_frame()
3403 if (priv->station_state == STATION_STATE_AUTHENTICATING) in atmel_management_frame()
3404 authenticate(priv, frame_len); in atmel_management_frame()
3411 if (priv->station_state == STATION_STATE_ASSOCIATING || in atmel_management_frame()
3412 priv->station_state == STATION_STATE_REASSOCIATING) in atmel_management_frame()
3413 associate(priv, frame_len, subtype); in atmel_management_frame()
3418 if (priv->station_is_associated && in atmel_management_frame()
3419 priv->operating_mode == IW_MODE_INFRA && in atmel_management_frame()
3420 is_frame_from_current_bss(priv, header)) { in atmel_management_frame()
3421 priv->station_was_associated = 0; in atmel_management_frame()
3422 priv->station_is_associated = 0; in atmel_management_frame()
3424 atmel_enter_state(priv, STATION_STATE_JOINNING); in atmel_management_frame()
3425 join(priv, BSS_TYPE_INFRASTRUCTURE); in atmel_management_frame()
3431 if (priv->operating_mode == IW_MODE_INFRA && in atmel_management_frame()
3432 is_frame_from_current_bss(priv, header)) { in atmel_management_frame()
3433 priv->station_was_associated = 0; in atmel_management_frame()
3435 atmel_enter_state(priv, STATION_STATE_JOINNING); in atmel_management_frame()
3436 join(priv, BSS_TYPE_INFRASTRUCTURE); in atmel_management_frame()
3447 struct atmel_private *priv = netdev_priv(dev); in atmel_management_timer() local
3451 if (priv->card && priv->present_callback && in atmel_management_timer()
3452 !(*priv->present_callback)(priv->card)) in atmel_management_timer()
3455 spin_lock_irqsave(&priv->irqlock, flags); in atmel_management_timer()
3457 switch (priv->station_state) { in atmel_management_timer()
3460 if (priv->AuthenticationRequestRetryCnt >= MAX_AUTHENTICATION_RETRIES) { in atmel_management_timer()
3461 atmel_enter_state(priv, STATION_STATE_MGMT_ERROR); in atmel_management_timer()
3462 priv->station_is_associated = 0; in atmel_management_timer()
3463 priv->AuthenticationRequestRetryCnt = 0; in atmel_management_timer()
3464 restart_search(priv); in atmel_management_timer()
3467 priv->AuthenticationRequestRetryCnt++; in atmel_management_timer()
3468 priv->CurrentAuthentTransactionSeqNum = 0x0001; in atmel_management_timer()
3469 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); in atmel_management_timer()
3470 if (priv->wep_is_on && priv->exclude_unencrypted) in atmel_management_timer()
3472 send_authentication_request(priv, auth, NULL, 0); in atmel_management_timer()
3477 if (priv->AssociationRequestRetryCnt == MAX_ASSOCIATION_RETRIES) { in atmel_management_timer()
3478 atmel_enter_state(priv, STATION_STATE_MGMT_ERROR); in atmel_management_timer()
3479 priv->station_is_associated = 0; in atmel_management_timer()
3480 priv->AssociationRequestRetryCnt = 0; in atmel_management_timer()
3481 restart_search(priv); in atmel_management_timer()
3483 priv->AssociationRequestRetryCnt++; in atmel_management_timer()
3484 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); in atmel_management_timer()
3485 send_association_request(priv, 0); in atmel_management_timer()
3490 if (priv->ReAssociationRequestRetryCnt == MAX_ASSOCIATION_RETRIES) { in atmel_management_timer()
3491 atmel_enter_state(priv, STATION_STATE_MGMT_ERROR); in atmel_management_timer()
3492 priv->station_is_associated = 0; in atmel_management_timer()
3493 priv->ReAssociationRequestRetryCnt = 0; in atmel_management_timer()
3494 restart_search(priv); in atmel_management_timer()
3496 priv->ReAssociationRequestRetryCnt++; in atmel_management_timer()
3497 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); in atmel_management_timer()
3498 send_association_request(priv, 1); in atmel_management_timer()
3506 spin_unlock_irqrestore(&priv->irqlock, flags); in atmel_management_timer()
3509 static void atmel_command_irq(struct atmel_private *priv) in atmel_command_irq() argument
3511 u8 status = atmel_rmem8(priv, atmel_co(priv, CMD_BLOCK_STATUS_OFFSET)); in atmel_command_irq()
3512 u8 command = atmel_rmem8(priv, atmel_co(priv, CMD_BLOCK_COMMAND_OFFSET)); in atmel_command_irq()
3523 priv->station_was_associated = priv->station_is_associated; in atmel_command_irq()
3524 atmel_get_mib(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_CUR_BSSID_POS, in atmel_command_irq()
3525 (u8 *)priv->CurrentBSSID, 6); in atmel_command_irq()
3526 atmel_enter_state(priv, STATION_STATE_READY); in atmel_command_irq()
3531 fast_scan = priv->fast_scan; in atmel_command_irq()
3532 priv->fast_scan = 0; in atmel_command_irq()
3535 atmel_scan(priv, 1); in atmel_command_irq()
3537 int bss_index = retrieve_bss(priv); in atmel_command_irq()
3540 atmel_join_bss(priv, bss_index); in atmel_command_irq()
3541 } else if (priv->operating_mode == IW_MODE_ADHOC && in atmel_command_irq()
3542 priv->SSID_size != 0) { in atmel_command_irq()
3543 start(priv, BSS_TYPE_AD_HOC); in atmel_command_irq()
3545 priv->fast_scan = !fast_scan; in atmel_command_irq()
3546 atmel_scan(priv, 1); in atmel_command_irq()
3549 priv->site_survey_state = SITE_SURVEY_COMPLETED; in atmel_command_irq()
3553 wireless_send_event(priv->dev, SIOCGIWSCAN, &wrqu, NULL); in atmel_command_irq()
3559 priv->fast_scan = 0; in atmel_command_irq()
3564 priv->site_survey_state = SITE_SURVEY_COMPLETED; in atmel_command_irq()
3565 if (priv->station_is_associated) { in atmel_command_irq()
3566 atmel_enter_state(priv, STATION_STATE_READY); in atmel_command_irq()
3569 wireless_send_event(priv->dev, SIOCGIWSCAN, &wrqu, NULL); in atmel_command_irq()
3571 atmel_scan(priv, 1); in atmel_command_irq()
3577 if (priv->operating_mode == IW_MODE_ADHOC) { in atmel_command_irq()
3578 priv->station_was_associated = priv->station_is_associated; in atmel_command_irq()
3579 atmel_enter_state(priv, STATION_STATE_READY); in atmel_command_irq()
3582 priv->AuthenticationRequestRetryCnt = 0; in atmel_command_irq()
3583 atmel_enter_state(priv, STATION_STATE_AUTHENTICATING); in atmel_command_irq()
3585 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); in atmel_command_irq()
3586 priv->CurrentAuthentTransactionSeqNum = 0x0001; in atmel_command_irq()
3587 if (priv->wep_is_on && priv->exclude_unencrypted) in atmel_command_irq()
3589 send_authentication_request(priv, auth, NULL, 0); in atmel_command_irq()
3594 atmel_scan(priv, 1); in atmel_command_irq()
3598 static int atmel_wakeup_firmware(struct atmel_private *priv) in atmel_wakeup_firmware() argument
3600 struct host_info_struct *iface = &priv->host_info; in atmel_wakeup_firmware()
3604 if (priv->card_type == CARD_TYPE_SPI_FLASH) in atmel_wakeup_firmware()
3605 atmel_set_gcr(priv->dev, GCR_REMAP); in atmel_wakeup_firmware()
3608 atmel_clear_gcr(priv->dev, 0x0040); in atmel_wakeup_firmware()
3609 atmel_write16(priv->dev, BSR, BSS_SRAM); in atmel_wakeup_firmware()
3611 if (priv->card_type == CARD_TYPE_SPI_FLASH) in atmel_wakeup_firmware()
3616 mr1 = atmel_read16(priv->dev, MR1); in atmel_wakeup_firmware()
3617 mr3 = atmel_read16(priv->dev, MR3); in atmel_wakeup_firmware()
3622 priv->bus_type == BUS_TYPE_PCCARD) in atmel_wakeup_firmware()
3627 printk(KERN_ALERT "%s: MAC failed to boot.\n", priv->dev->name); in atmel_wakeup_firmware()
3631 if ((priv->host_info_base = atmel_read16(priv->dev, MR2)) == 0xffff) { in atmel_wakeup_firmware()
3632 printk(KERN_ALERT "%s: card missing.\n", priv->dev->name); in atmel_wakeup_firmware()
3641 atmel_wmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET), FUNC_CTRL_INIT_COMPLETE); in atmel_wakeup_firmware()
3644 mr1 = atmel_read16(priv->dev, MR1); in atmel_wakeup_firmware()
3645 mr3 = atmel_read16(priv->dev, MR3); in atmel_wakeup_firmware()
3650 priv->bus_type == BUS_TYPE_PCCARD) in atmel_wakeup_firmware()
3656 priv->dev->name); in atmel_wakeup_firmware()
3662 !(atmel_read16(priv->dev, MR3) & MAC_INIT_OK)) { in atmel_wakeup_firmware()
3663 printk(KERN_ALERT "%s: MAC failed MR3 self-test.\n", priv->dev->name); in atmel_wakeup_firmware()
3667 !(atmel_read16(priv->dev, MR1) & MAC_INIT_OK)) { in atmel_wakeup_firmware()
3668 printk(KERN_ALERT "%s: MAC failed MR1 self-test.\n", priv->dev->name); in atmel_wakeup_firmware()
3672 atmel_copy_to_host(priv->dev, (unsigned char *)iface, in atmel_wakeup_firmware()
3673 priv->host_info_base, sizeof(*iface)); in atmel_wakeup_firmware()
3697 struct atmel_private *priv = netdev_priv(dev); in probe_atmel_card() local
3700 if (priv->bus_type == BUS_TYPE_PCCARD) in probe_atmel_card()
3710 priv->card_type = CARD_TYPE_EEPROM; in probe_atmel_card()
3714 atmel_clear_gcr(priv->dev, 0x0040); in probe_atmel_card()
3725 if (priv->bus_type == BUS_TYPE_PCCARD) in probe_atmel_card()
3732 priv->card_type = CARD_TYPE_PARALLEL_FLASH; in probe_atmel_card()
3740 priv->card_type = CARD_TYPE_SPI_FLASH; in probe_atmel_card()
3741 if (atmel_wakeup_firmware(priv) == 0) { in probe_atmel_card()
3742 atmel_get_mib(priv, Mac_Address_Mib_Type, 0, dev->dev_addr, 6); in probe_atmel_card()
3746 if (priv->bus_type == BUS_TYPE_PCCARD) in probe_atmel_card()
3769 static void build_wep_mib(struct atmel_private *priv) in build_wep_mib() argument
3786 mib.wep_is_on = priv->wep_is_on; in build_wep_mib()
3787 if (priv->wep_is_on) { in build_wep_mib()
3788 if (priv->wep_key_len[priv->default_key] > 5) in build_wep_mib()
3796 mib.default_key = priv->default_key; in build_wep_mib()
3797 mib.exclude_unencrypted = priv->exclude_unencrypted; in build_wep_mib()
3800 memcpy(mib.wep_keys[i], priv->wep_keys[i], 13); in build_wep_mib()
3802 atmel_set_mib(priv, Mac_Wep_Mib_Type, 0, (u8 *)&mib, sizeof(mib)); in build_wep_mib()
3805 static void build_wpa_mib(struct atmel_private *priv) in build_wpa_mib() argument
3827 mib.wep_is_on = priv->wep_is_on; in build_wpa_mib()
3828 mib.exclude_unencrypted = priv->exclude_unencrypted; in build_wpa_mib()
3829 memcpy(mib.receiver_address, priv->CurrentBSSID, ETH_ALEN); in build_wpa_mib()
3834 if (priv->wep_is_on) { in build_wpa_mib()
3842 if (priv->wep_key_len[i] > 0) { in build_wpa_mib()
3843 memcpy(mib.cipher_default_key_value[i], priv->wep_keys[i], MAX_ENCRYPTION_KEY_SIZE); in build_wpa_mib()
3844 if (i == priv->default_key) { in build_wpa_mib()
3847 mib.cipher_default_key_value[i][MAX_ENCRYPTION_KEY_SIZE-2] = priv->pairwise_cipher_suite; in build_wpa_mib()
3850 priv->group_cipher_suite = priv->pairwise_cipher_suite; in build_wpa_mib()
3852 mib.cipher_default_key_value[i][MAX_ENCRYPTION_KEY_SIZE-2] = priv->group_cipher_suite; in build_wpa_mib()
3863 atmel_set_mib(priv, Mac_Wep_Mib_Type, 0, (u8 *)&mib, sizeof(mib)); in build_wpa_mib()
3882 struct atmel_private *priv = netdev_priv(dev); in reset_atmel_card() local
3884 int old_state = priv->station_state; in reset_atmel_card()
3897 if (priv->bus_type == BUS_TYPE_PCCARD) in reset_atmel_card()
3898 atmel_write16(priv->dev, GCR, 0x0060); in reset_atmel_card()
3901 atmel_write16(priv->dev, GCR, 0x0040); in reset_atmel_card()
3903 if (priv->card_type == CARD_TYPE_EEPROM) { in reset_atmel_card()
3907 int len = priv->firmware_length; in reset_atmel_card()
3908 if (!(fw = priv->firmware)) { in reset_atmel_card()
3909 if (priv->firmware_type == ATMEL_FW_TYPE_NONE) { in reset_atmel_card()
3910 if (strlen(priv->firmware_id) == 0) { in reset_atmel_card()
3917 strcpy(priv->firmware_id, "atmel_at76c502.bin"); in reset_atmel_card()
3919 err = request_firmware(&fw_entry, priv->firmware_id, priv->sys_dev); in reset_atmel_card()
3923 dev->name, priv->firmware_id); in reset_atmel_card()
3931 while (fw_table[fw_index].fw_type != priv->firmware_type in reset_atmel_card()
3939 snprintf(priv->firmware_id, 32, "%s%s.%s", fw_table[fw_index].fw_file, in reset_atmel_card()
3941 priv->firmware_id[31] = '\0'; in reset_atmel_card()
3942 if (request_firmware(&fw_entry, priv->firmware_id, priv->sys_dev) == 0) { in reset_atmel_card()
3951 dev->name, priv->firmware_id); in reset_atmel_card()
3952 priv->firmware_id[0] = '\0'; in reset_atmel_card()
3962 atmel_write16(priv->dev, BSR, BSS_IRAM); in reset_atmel_card()
3963 atmel_copy_to_card(priv->dev, 0, fw, len); in reset_atmel_card()
3964 atmel_set_gcr(priv->dev, GCR_REMAP); in reset_atmel_card()
3967 atmel_set_gcr(priv->dev, GCR_REMAP); in reset_atmel_card()
3968 atmel_write16(priv->dev, BSR, BSS_IRAM); in reset_atmel_card()
3969 atmel_copy_to_card(priv->dev, 0, fw, 0x6000); in reset_atmel_card()
3970 atmel_write16(priv->dev, BSR, 0x2ff); in reset_atmel_card()
3971 atmel_copy_to_card(priv->dev, 0x8000, &fw[0x6000], len - 0x6000); in reset_atmel_card()
3977 err = atmel_wakeup_firmware(priv); in reset_atmel_card()
3986 priv->use_wpa = (priv->host_info.major_version == 4); in reset_atmel_card()
3987 priv->radio_on_broken = (priv->host_info.major_version == 5); in reset_atmel_card()
3990 atmel_wmem8(priv, atmel_hi(priv, IFACE_INT_MASK_OFFSET), 0xff); in reset_atmel_card()
3993 atmel_wmem8(priv, atmel_tx(priv, TX_DESC_FLAGS_OFFSET, 0), 0); in reset_atmel_card()
3994 atmel_wmem32(priv, atmel_tx(priv, TX_DESC_NEXT_OFFSET, 0), 0x80000000L); in reset_atmel_card()
3995 atmel_wmem16(priv, atmel_tx(priv, TX_DESC_POS_OFFSET, 0), 0); in reset_atmel_card()
3996 atmel_wmem16(priv, atmel_tx(priv, TX_DESC_SIZE_OFFSET, 0), 0); in reset_atmel_card()
3998 priv->tx_desc_free = priv->host_info.tx_desc_count; in reset_atmel_card()
3999 priv->tx_desc_head = 0; in reset_atmel_card()
4000 priv->tx_desc_tail = 0; in reset_atmel_card()
4001 priv->tx_desc_previous = 0; in reset_atmel_card()
4002 priv->tx_free_mem = priv->host_info.tx_buff_size; in reset_atmel_card()
4003 priv->tx_buff_head = 0; in reset_atmel_card()
4004 priv->tx_buff_tail = 0; in reset_atmel_card()
4006 configuration = atmel_rmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET)); in reset_atmel_card()
4007 atmel_wmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET), in reset_atmel_card()
4011 priv->rx_desc_head = 0; in reset_atmel_card()
4013 configuration = atmel_rmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET)); in reset_atmel_card()
4014 atmel_wmem8(priv, atmel_hi(priv, IFACE_FUNC_CTRL_OFFSET), in reset_atmel_card()
4017 if (!priv->radio_on_broken) { in reset_atmel_card()
4018 if (atmel_send_command_wait(priv, CMD_EnableRadio, NULL, 0) == in reset_atmel_card()
4027 atmel_set_mib8(priv, Local_Mib_Type, LOCAL_MIB_AUTO_TX_RATE_POS, priv->auto_tx_rate); in reset_atmel_card()
4028 atmel_set_mib8(priv, Local_Mib_Type, LOCAL_MIB_TX_PROMISCUOUS_POS, PROM_MODE_OFF); in reset_atmel_card()
4029 atmel_set_mib16(priv, Mac_Mib_Type, MAC_MIB_RTS_THRESHOLD_POS, priv->rts_threshold); in reset_atmel_card()
4030 atmel_set_mib16(priv, Mac_Mib_Type, MAC_MIB_FRAG_THRESHOLD_POS, priv->frag_threshold); in reset_atmel_card()
4031 atmel_set_mib8(priv, Mac_Mib_Type, MAC_MIB_SHORT_RETRY_POS, priv->short_retry); in reset_atmel_card()
4032 atmel_set_mib8(priv, Mac_Mib_Type, MAC_MIB_LONG_RETRY_POS, priv->long_retry); in reset_atmel_card()
4033 atmel_set_mib8(priv, Local_Mib_Type, LOCAL_MIB_PREAMBLE_TYPE, priv->preamble); in reset_atmel_card()
4034 atmel_set_mib(priv, Mac_Address_Mib_Type, MAC_ADDR_MIB_MAC_ADDR_POS, in reset_atmel_card()
4035 priv->dev->dev_addr, 6); in reset_atmel_card()
4036 atmel_set_mib8(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_PS_MODE_POS, ACTIVE_MODE); in reset_atmel_card()
4037 atmel_set_mib16(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_LISTEN_INTERVAL_POS, 1); in reset_atmel_card()
4038 atmel_set_mib16(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_BEACON_PER_POS, priv->default_beacon_period); in reset_atmel_card()
4039 atmel_set_mib(priv, Phy_Mib_Type, PHY_MIB_RATE_SET_POS, atmel_basic_rates, 4); in reset_atmel_card()
4040 atmel_set_mib8(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_CUR_PRIVACY_POS, priv->wep_is_on); in reset_atmel_card()
4041 if (priv->use_wpa) in reset_atmel_card()
4042 build_wpa_mib(priv); in reset_atmel_card()
4044 build_wep_mib(priv); in reset_atmel_card()
4053 wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL); in reset_atmel_card()
4059 static void atmel_send_command(struct atmel_private *priv, int command, in atmel_send_command() argument
4063 atmel_copy_to_card(priv->dev, atmel_co(priv, CMD_BLOCK_PARAMETERS_OFFSET), in atmel_send_command()
4066 atmel_wmem8(priv, atmel_co(priv, CMD_BLOCK_COMMAND_OFFSET), command); in atmel_send_command()
4067 atmel_wmem8(priv, atmel_co(priv, CMD_BLOCK_STATUS_OFFSET), 0); in atmel_send_command()
4070 static int atmel_send_command_wait(struct atmel_private *priv, int command, in atmel_send_command_wait() argument
4075 atmel_send_command(priv, command, cmd, cmd_size); in atmel_send_command_wait()
4078 status = atmel_rmem8(priv, atmel_co(priv, CMD_BLOCK_STATUS_OFFSET)); in atmel_send_command_wait()
4086 printk(KERN_ALERT "%s: failed to contact MAC.\n", priv->dev->name); in atmel_send_command_wait()
4096 static u8 atmel_get_mib8(struct atmel_private *priv, u8 type, u8 index) in atmel_get_mib8() argument
4103 atmel_send_command_wait(priv, CMD_Get_MIB_Vars, &m, MIB_HEADER_SIZE + 1); in atmel_get_mib8()
4104 return atmel_rmem8(priv, atmel_co(priv, CMD_BLOCK_PARAMETERS_OFFSET + MIB_HEADER_SIZE)); in atmel_get_mib8()
4107 static void atmel_set_mib8(struct atmel_private *priv, u8 type, u8 index, u8 data) in atmel_set_mib8() argument
4115 atmel_send_command_wait(priv, CMD_Set_MIB_Vars, &m, MIB_HEADER_SIZE + 1); in atmel_set_mib8()
4118 static void atmel_set_mib16(struct atmel_private *priv, u8 type, u8 index, in atmel_set_mib16() argument
4128 atmel_send_command_wait(priv, CMD_Set_MIB_Vars, &m, MIB_HEADER_SIZE + 2); in atmel_set_mib16()
4131 static void atmel_set_mib(struct atmel_private *priv, u8 type, u8 index, in atmel_set_mib() argument
4140 printk(KERN_ALERT "%s: MIB buffer too small.\n", priv->dev->name); in atmel_set_mib()
4143 atmel_send_command_wait(priv, CMD_Set_MIB_Vars, &m, MIB_HEADER_SIZE + data_len); in atmel_set_mib()
4146 static void atmel_get_mib(struct atmel_private *priv, u8 type, u8 index, in atmel_get_mib() argument
4155 printk(KERN_ALERT "%s: MIB buffer too small.\n", priv->dev->name); in atmel_get_mib()
4157 atmel_send_command_wait(priv, CMD_Get_MIB_Vars, &m, MIB_HEADER_SIZE + data_len); in atmel_get_mib()
4158 atmel_copy_to_host(priv->dev, data, in atmel_get_mib()
4159 atmel_co(priv, CMD_BLOCK_PARAMETERS_OFFSET + MIB_HEADER_SIZE), data_len); in atmel_get_mib()
4217 static int atmel_lock_mac(struct atmel_private *priv) in atmel_lock_mac() argument
4222 if (!atmel_rmem8(priv, atmel_hi(priv, IFACE_LOCKOUT_HOST_OFFSET))) in atmel_lock_mac()
4230 atmel_wmem8(priv, atmel_hi(priv, IFACE_LOCKOUT_MAC_OFFSET), 1); in atmel_lock_mac()
4231 if (atmel_rmem8(priv, atmel_hi(priv, IFACE_LOCKOUT_HOST_OFFSET))) { in atmel_lock_mac()
4232 atmel_wmem8(priv, atmel_hi(priv, IFACE_LOCKOUT_MAC_OFFSET), 0); in atmel_lock_mac()
4241 static void atmel_wmem32(struct atmel_private *priv, u16 pos, u32 data) in atmel_wmem32() argument
4243 atmel_writeAR(priv->dev, pos); in atmel_wmem32()
4244 atmel_write16(priv->dev, DR, data); /* card is little-endian */ in atmel_wmem32()
4245 atmel_write16(priv->dev, DR, data >> 16); in atmel_wmem32()