Lines Matching +full:ext +full:- +full:26 +full:m
1 /*** -*- linux-c -*- **********************************************************
5 Copyright 2000-2001 ATMEL Corporation.
6 Copyright 2003-2004 Simon Kelley.
81 over-rides any automatic selection */
101 MODULE_FIRMWARE("atmel_at76c502-wpa.bin");
103 MODULE_FIRMWARE("atmel_at76c502d-wpa.bin");
105 MODULE_FIRMWARE("atmel_at76c502e-wpa.bin");
107 MODULE_FIRMWARE("atmel_at76c502_3com-wpa.bin");
109 MODULE_FIRMWARE("atmel_at76c504-wpa.bin");
111 MODULE_FIRMWARE("atmel_at76c504_2958-wpa.bin");
113 MODULE_FIRMWARE("atmel_at76c504a_2958-wpa.bin");
115 MODULE_FIRMWARE("atmel_at76c506-wpa.bin");
145 #define BSS_SRAM 0x0200 /* AMBA module selection --> SRAM */
146 #define BSS_IRAM 0x0100 /* AMBA module selection --> IRAM */
231 * Host-MAC interface
279 #define PHY_MIB_REG_DOMAIN_POS 26
337 #define REG_DOMAIN_FCC 0x10 /* Channels 1-11 USA */
338 #define REG_DOMAIN_DOC 0x20 /* Channel 1-11 Canada */
339 #define REG_DOMAIN_ETSI 0x30 /* Channel 1-13 Europe (ex Spain/France) */
340 #define REG_DOMAIN_SPAIN 0x31 /* Channel 10-11 Spain */
341 #define REG_DOMAIN_FRANCE 0x32 /* Channel 10-13 France */
343 #define REG_DOMAIN_MKK1 0x41 /* Channel 1-14 Japan(MKK1) */
344 #define REG_DOMAIN_ISRAEL 0x50 /* Channel 3-9 ISRAEL */
618 return priv->host_info_base + offset; in atmel_hi()
623 return priv->host_info.command_pos + offset; in atmel_co()
628 return priv->host_info.rx_desc_pos + (sizeof(struct rx_desc) * desc) + offset; in atmel_rx()
633 return priv->host_info.tx_desc_pos + (sizeof(struct tx_desc) * desc) + offset; in atmel_tx()
638 return inb(dev->base_addr + offset); in atmel_read8()
643 outb(data, dev->base_addr + offset); in atmel_write8()
648 return inw(dev->base_addr + offset); in atmel_read16()
653 outw(data, dev->base_addr + offset); in atmel_write16()
658 atmel_writeAR(priv->dev, pos); in atmel_rmem8()
659 return atmel_read8(priv->dev, DR); in atmel_rmem8()
664 atmel_writeAR(priv->dev, pos); in atmel_wmem8()
665 atmel_write8(priv->dev, DR, data); in atmel_wmem8()
670 atmel_writeAR(priv->dev, pos); in atmel_rmem16()
671 return atmel_read16(priv->dev, DR); in atmel_rmem16()
676 atmel_writeAR(priv->dev, pos); in atmel_wmem16()
677 atmel_write16(priv->dev, DR, data); in atmel_wmem16()
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()
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()
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()
804 u16 buff, frame_ctl, len = (ETH_ZLEN < skb->len) ? skb->len : ETH_ZLEN; in start_tx()
806 if (priv->card && priv->present_callback && in start_tx()
807 !(*priv->present_callback)(priv->card)) { in start_tx()
808 dev->stats.tx_errors++; in start_tx()
813 if (priv->station_state != STATION_STATE_READY) { in start_tx()
814 dev->stats.tx_errors++; in start_tx()
820 spin_lock_bh(&priv->timerlock); in start_tx()
822 spin_lock_irqsave(&priv->irqlock, flags); in start_tx()
828 initial + 18 (+30-12) */ in start_tx()
831 dev->stats.tx_dropped++; in start_tx()
832 spin_unlock_irqrestore(&priv->irqlock, flags); in start_tx()
833 spin_unlock_bh(&priv->timerlock); in start_tx()
841 if (priv->wep_is_on) in start_tx()
843 if (priv->operating_mode == IW_MODE_ADHOC) { in start_tx()
845 memcpy(&header.addr2, dev->dev_addr, ETH_ALEN); in start_tx()
846 memcpy(&header.addr3, priv->BSSID, ETH_ALEN); in start_tx()
849 memcpy(&header.addr1, priv->CurrentBSSID, ETH_ALEN); in start_tx()
850 memcpy(&header.addr2, dev->dev_addr, ETH_ALEN); in start_tx()
854 if (priv->use_wpa) in start_tx()
861 atmel_copy_to_card(dev, buff + DATA_FRAME_WS_HEADER_SIZE, skb->data + 12, len - 12); in start_tx()
862 priv->tx_buff_tail += len - 12 + DATA_FRAME_WS_HEADER_SIZE; in start_tx()
865 tx_update_descriptor(priv, *(skb->data) & 0x01, len + 18, buff, TX_PACKET_TYPE_DATA); in start_tx()
866 dev->stats.tx_bytes += len; in start_tx()
868 spin_unlock_irqrestore(&priv->irqlock, flags); in start_tx()
869 spin_unlock_bh(&priv->timerlock); in start_tx()
885 atmel_copy_to_card(priv->dev, buff, (u8 *)header, MGMT_FRAME_BODY_OFFSET); in atmel_transmit_management_frame()
886 atmel_copy_to_card(priv->dev, buff + MGMT_FRAME_BODY_OFFSET, body, body_len); in atmel_transmit_management_frame()
887 priv->tx_buff_tail += len; in atmel_transmit_management_frame()
888 tx_update_descriptor(priv, header->addr1[0] & 0x01, len, buff, TX_PACKET_TYPE_MGMT); in atmel_transmit_management_frame()
901 atmel_copy_to_host(priv->dev, mac4, rx_packet_loc + 24, 6); in fast_rx_path()
902 msdu_size -= 6; in fast_rx_path()
904 if (priv->do_rx_crc) { in fast_rx_path()
906 msdu_size -= 4; in fast_rx_path()
910 priv->dev->stats.rx_dropped++; in fast_rx_path()
916 atmel_copy_to_host(priv->dev, skbp + 12, rx_packet_loc + 30, msdu_size); in fast_rx_path()
918 if (priv->do_rx_crc) { in fast_rx_path()
921 atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + 30 + msdu_size, 4); in fast_rx_path()
923 priv->dev->stats.rx_crc_errors++; in fast_rx_path()
929 memcpy(skbp, header->addr1, ETH_ALEN); /* destination address */ in fast_rx_path()
930 if (le16_to_cpu(header->frame_control) & IEEE80211_FCTL_FROMDS) in fast_rx_path()
931 memcpy(&skbp[ETH_ALEN], header->addr3, ETH_ALEN); in fast_rx_path()
933 memcpy(&skbp[ETH_ALEN], header->addr2, ETH_ALEN); /* source address */ in fast_rx_path()
935 skb->protocol = eth_type_trans(skb, priv->dev); in fast_rx_path()
936 skb->ip_summed = CHECKSUM_NONE; in fast_rx_path()
938 priv->dev->stats.rx_bytes += 12 + msdu_size; in fast_rx_path()
939 priv->dev->stats.rx_packets++; in fast_rx_path()
947 int i = msdu_size - 4; in probe_crc()
953 atmel_copy_to_host(priv->dev, (void *)&netcrc, packet_loc + i, 4); in probe_crc()
955 atmel_writeAR(priv->dev, packet_loc); in probe_crc()
956 while (i--) { in probe_crc()
957 u8 octet = atmel_read8(priv->dev, DR); in probe_crc()
973 if (le16_to_cpu(header->frame_control) & IEEE80211_FCTL_FROMDS) in frag_rx_path()
974 memcpy(source, header->addr3, ETH_ALEN); in frag_rx_path()
976 memcpy(source, header->addr2, ETH_ALEN); in frag_rx_path()
980 if (priv->do_rx_crc) in frag_rx_path()
981 msdu_size -= 4; in frag_rx_path()
984 atmel_copy_to_host(priv->dev, mac4, rx_packet_loc, ETH_ALEN); in frag_rx_path()
985 msdu_size -= ETH_ALEN; in frag_rx_path()
988 if (priv->do_rx_crc) in frag_rx_path()
991 priv->frag_seq = seq_no; in frag_rx_path()
992 priv->frag_no = 1; in frag_rx_path()
993 priv->frag_len = msdu_size; in frag_rx_path()
994 memcpy(priv->frag_source, source, ETH_ALEN); in frag_rx_path()
995 memcpy(&priv->rx_buf[ETH_ALEN], source, ETH_ALEN); in frag_rx_path()
996 memcpy(priv->rx_buf, header->addr1, ETH_ALEN); in frag_rx_path()
998 atmel_copy_to_host(priv->dev, &priv->rx_buf[12], rx_packet_loc, msdu_size); in frag_rx_path()
1000 if (priv->do_rx_crc) { in frag_rx_path()
1002 crc = crc32_le(crc, &priv->rx_buf[12], msdu_size); in frag_rx_path()
1003 atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + msdu_size, 4); in frag_rx_path()
1005 priv->dev->stats.rx_crc_errors++; in frag_rx_path()
1006 eth_broadcast_addr(priv->frag_source); in frag_rx_path()
1010 } else if (priv->frag_no == frag_no && in frag_rx_path()
1011 priv->frag_seq == seq_no && in frag_rx_path()
1012 memcmp(priv->frag_source, source, ETH_ALEN) == 0) { in frag_rx_path()
1014 atmel_copy_to_host(priv->dev, &priv->rx_buf[12 + priv->frag_len], in frag_rx_path()
1016 if (priv->do_rx_crc) { in frag_rx_path()
1019 &priv->rx_buf[12 + priv->frag_len], in frag_rx_path()
1021 atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + msdu_size, 4); in frag_rx_path()
1023 priv->dev->stats.rx_crc_errors++; in frag_rx_path()
1024 eth_broadcast_addr(priv->frag_source); in frag_rx_path()
1029 priv->frag_len += msdu_size; in frag_rx_path()
1030 priv->frag_no++; in frag_rx_path()
1033 eth_broadcast_addr(priv->frag_source); in frag_rx_path()
1034 if (!(skb = dev_alloc_skb(priv->frag_len + 14))) { in frag_rx_path()
1035 priv->dev->stats.rx_dropped++; in frag_rx_path()
1038 skb_put_data(skb, priv->rx_buf, in frag_rx_path()
1039 priv->frag_len + 12); in frag_rx_path()
1040 skb->protocol = eth_type_trans(skb, priv->dev); in frag_rx_path()
1041 skb->ip_summed = CHECKSUM_NONE; in frag_rx_path()
1043 priv->dev->stats.rx_bytes += priv->frag_len + 12; in frag_rx_path()
1044 priv->dev->stats.rx_packets++; in frag_rx_path()
1048 priv->wstats.discard.fragment++; in frag_rx_path()
1057 …atmel_rmem8(priv, atmel_rx(priv, RX_DESC_FLAGS_OFFSET, priv->rx_desc_head)) == RX_DESC_FLAG_VALID … in rx_done_irq()
1058 i < priv->host_info.rx_desc_count; in rx_done_irq()
1062 u8 status = atmel_rmem8(priv, atmel_rx(priv, RX_DESC_STATUS_OFFSET, priv->rx_desc_head)); in rx_done_irq()
1067 priv->wstats.discard.nwid++; in rx_done_irq()
1069 priv->dev->stats.rx_errors++; in rx_done_irq()
1073 msdu_size = atmel_rmem16(priv, atmel_rx(priv, RX_DESC_MSDU_SIZE_OFFSET, priv->rx_desc_head)); in rx_done_irq()
1074 rx_packet_loc = atmel_rmem16(priv, atmel_rx(priv, RX_DESC_MSDU_POS_OFFSET, priv->rx_desc_head)); in rx_done_irq()
1077 priv->dev->stats.rx_errors++; in rx_done_irq()
1082 atmel_copy_to_host(priv->dev, (char *)&header, rx_packet_loc, 24); in rx_done_irq()
1089 if (priv->probe_crc) { in rx_done_irq()
1090 if (!priv->wep_is_on || !(frame_ctl & IEEE80211_FCTL_PROTECTED)) { in rx_done_irq()
1091 priv->do_rx_crc = probe_crc(priv, rx_packet_loc, msdu_size); in rx_done_irq()
1093 priv->do_rx_crc = probe_crc(priv, rx_packet_loc + 24, msdu_size - 24); in rx_done_irq()
1095 if (priv->do_rx_crc) { in rx_done_irq()
1096 if (priv->crc_ok_cnt++ > 5) in rx_done_irq()
1097 priv->probe_crc = 0; in rx_done_irq()
1099 if (priv->crc_ko_cnt++ > 5) in rx_done_irq()
1100 priv->probe_crc = 0; in rx_done_irq()
1105 if (priv->do_rx_crc && (!priv->wep_is_on || !(frame_ctl & IEEE80211_FCTL_PROTECTED))) { in rx_done_irq()
1108 msdu_size -= 24; /* header */ in rx_done_irq()
1125 atmel_copy_to_host(priv->dev, (unsigned char *)&priv->rx_buf, rx_packet_loc + 24, msdu_size); in rx_done_irq()
1128 eth_broadcast_addr(priv->frag_source); in rx_done_irq()
1130 if (priv->do_rx_crc) { in rx_done_irq()
1132 msdu_size -= 4; in rx_done_irq()
1133 crc = crc32_le(crc, (unsigned char *)&priv->rx_buf, msdu_size); in rx_done_irq()
1134 if ((crc ^ 0xffffffff) != (*((u32 *)&priv->rx_buf[msdu_size]))) { in rx_done_irq()
1135 priv->dev->stats.rx_crc_errors++; in rx_done_irq()
1141 atmel_rmem8(priv, atmel_rx(priv, RX_DESC_RSSI_OFFSET, priv->rx_desc_head))); in rx_done_irq()
1146 …atmel_wmem8(priv, atmel_rx(priv, RX_DESC_FLAGS_OFFSET, priv->rx_desc_head), RX_DESC_FLAG_CONSUMED); in rx_done_irq()
1148 if (priv->rx_desc_head < (priv->host_info.rx_desc_count - 1)) in rx_done_irq()
1149 priv->rx_desc_head++; in rx_done_irq()
1151 priv->rx_desc_head = 0; in rx_done_irq()
1160 int i = -1; in service_interrupt()
1172 if (priv->card && priv->present_callback && in service_interrupt()
1173 !(*priv->present_callback)(priv->card)) in service_interrupt()
1176 /* In this state upper-level code assumes it can mess with in service_interrupt()
1181 if (priv->station_state == STATION_STATE_DOWN) in service_interrupt()
1189 printk(KERN_ALERT "%s: failed to contact MAC.\n", dev->name); in service_interrupt()
1198 return i == -1 ? IRQ_NONE : IRQ_HANDLED; in service_interrupt()
1209 printk(KERN_ALERT "%s: failed to contact MAC.\n", dev->name); in service_interrupt()
1221 if (priv->operating_mode == IW_MODE_INFRA && in service_interrupt()
1222 priv->station_state == STATION_STATE_READY) { in service_interrupt()
1223 priv->station_is_associated = 0; in service_interrupt()
1229 priv->wstats.discard.misc++; in service_interrupt()
1240 printk(KERN_ALERT "%s: *** FATAL error interrupt ***\n", dev->name); in service_interrupt()
1250 priv->CurrentBSSID, 6); in service_interrupt()
1252 if (priv->use_wpa) in service_interrupt()
1256 printk(KERN_INFO "%s: Generic_irq received.\n", dev->name); in service_interrupt()
1270 priv->wstats.status = priv->station_state; in atmel_get_wireless_stats()
1272 if (priv->operating_mode == IW_MODE_INFRA) { in atmel_get_wireless_stats()
1273 if (priv->station_state != STATION_STATE_READY) { in atmel_get_wireless_stats()
1274 priv->wstats.qual.qual = 0; in atmel_get_wireless_stats()
1275 priv->wstats.qual.level = 0; in atmel_get_wireless_stats()
1276 priv->wstats.qual.updated = (IW_QUAL_QUAL_INVALID in atmel_get_wireless_stats()
1279 priv->wstats.qual.noise = 0; in atmel_get_wireless_stats()
1280 priv->wstats.qual.updated |= IW_QUAL_NOISE_INVALID; in atmel_get_wireless_stats()
1282 /* Quality levels cannot be determined in ad-hoc mode, in atmel_get_wireless_stats()
1284 priv->wstats.qual.qual = 0; in atmel_get_wireless_stats()
1285 priv->wstats.qual.level = 0; in atmel_get_wireless_stats()
1286 priv->wstats.qual.noise = 0; in atmel_get_wireless_stats()
1287 priv->wstats.qual.updated = IW_QUAL_QUAL_INVALID in atmel_get_wireless_stats()
1290 priv->wstats.miss.beacon = 0; in atmel_get_wireless_stats()
1293 return &priv->wstats; in atmel_get_wireless_stats()
1300 memcpy (dev->dev_addr, addr->sa_data, dev->addr_len); in atmel_set_mac_address()
1312 del_timer_sync(&priv->management_timer); in atmel_open()
1315 priv->station_state = STATION_STATE_DOWN; in atmel_open()
1317 if (priv->new_SSID_size) { in atmel_open()
1318 memcpy(priv->SSID, priv->new_SSID, priv->new_SSID_size); in atmel_open()
1319 priv->SSID_size = priv->new_SSID_size; in atmel_open()
1320 priv->new_SSID_size = 0; in atmel_open()
1322 priv->BSS_list_entries = 0; in atmel_open()
1324 priv->AuthenticationRequestRetryCnt = 0; in atmel_open()
1325 priv->AssociationRequestRetryCnt = 0; in atmel_open()
1326 priv->ReAssociationRequestRetryCnt = 0; in atmel_open()
1327 priv->CurrentAuthentTransactionSeqNum = 0x0001; in atmel_open()
1328 priv->ExpectedAuthentTransactionSeqNum = 0x0002; in atmel_open()
1330 priv->site_survey_state = SITE_SURVEY_IDLE; in atmel_open()
1331 priv->station_is_associated = 0; in atmel_open()
1337 if (priv->config_reg_domain) { in atmel_open()
1338 priv->reg_domain = priv->config_reg_domain; in atmel_open()
1339 atmel_set_mib8(priv, Phy_Mib_Type, PHY_MIB_REG_DOMAIN_POS, priv->reg_domain); in atmel_open()
1341 priv->reg_domain = atmel_get_mib8(priv, Phy_Mib_Type, PHY_MIB_REG_DOMAIN_POS); in atmel_open()
1343 if (priv->reg_domain == channel_table[i].reg_domain) in atmel_open()
1346 priv->reg_domain = REG_DOMAIN_MKK1; in atmel_open()
1347 printk(KERN_ALERT "%s: failed to get regulatory domain: assuming MKK1.\n", dev->name); in atmel_open()
1351 if ((channel = atmel_validate_channel(priv, priv->channel))) in atmel_open()
1352 priv->channel = channel; in atmel_open()
1357 atmel_set_gcr(priv->dev, GCR_ENINT); /* enable interrupts */ in atmel_open()
1366 if (priv->station_state == STATION_STATE_READY) { in atmel_close()
1373 wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL); in atmel_close()
1378 if (priv->bus_type == BUS_TYPE_PCCARD) in atmel_close()
1391 if (priv->reg_domain == channel_table[i].reg_domain) { in atmel_validate_channel()
1402 static int atmel_proc_show(struct seq_file *m, void *v) in atmel_proc_show() argument
1404 struct atmel_private *priv = m->private; in atmel_proc_show()
1408 seq_printf(m, "Driver version:\t\t%d.%d\n", DRIVER_MAJOR, DRIVER_MINOR); in atmel_proc_show()
1410 if (priv->station_state != STATION_STATE_DOWN) { in atmel_proc_show()
1411 seq_printf(m, in atmel_proc_show()
1414 priv->host_info.major_version, in atmel_proc_show()
1415 priv->host_info.minor_version, in atmel_proc_show()
1416 priv->host_info.build_version); in atmel_proc_show()
1418 if (priv->card_type != CARD_TYPE_EEPROM) in atmel_proc_show()
1419 seq_puts(m, "on card\n"); in atmel_proc_show()
1420 else if (priv->firmware) in atmel_proc_show()
1421 seq_printf(m, "%s loaded by host\n", priv->firmware_id); in atmel_proc_show()
1423 seq_printf(m, "%s loaded by hotplug\n", priv->firmware_id); in atmel_proc_show()
1425 switch (priv->card_type) { in atmel_proc_show()
1441 if (priv->reg_domain == channel_table[i].reg_domain) in atmel_proc_show()
1444 seq_printf(m, "MAC memory type:\t%s\n", c); in atmel_proc_show()
1445 seq_printf(m, "Regulatory domain:\t%s\n", r); in atmel_proc_show()
1446 seq_printf(m, "Host CRC checking:\t%s\n", in atmel_proc_show()
1447 priv->do_rx_crc ? "On" : "Off"); in atmel_proc_show()
1448 seq_printf(m, "WPA-capable firmware:\t%s\n", in atmel_proc_show()
1449 priv->use_wpa ? "Yes" : "No"); in atmel_proc_show()
1452 switch (priv->station_state) { in atmel_proc_show()
1481 seq_printf(m, "Current state:\t\t%s\n", s); in atmel_proc_show()
1509 if (dev_alloc_name(dev, dev->name) < 0) { in init_atmel_card()
1515 priv->dev = dev; in init_atmel_card()
1516 priv->sys_dev = sys_dev; in init_atmel_card()
1517 priv->present_callback = card_present; in init_atmel_card()
1518 priv->card = card; in init_atmel_card()
1519 priv->firmware = NULL; in init_atmel_card()
1520 priv->firmware_type = fw_type; in init_atmel_card()
1522 strlcpy(priv->firmware_id, firmware, sizeof(priv->firmware_id)); in init_atmel_card()
1523 priv->bus_type = card_present ? BUS_TYPE_PCCARD : BUS_TYPE_PCI; in init_atmel_card()
1524 priv->station_state = STATION_STATE_DOWN; in init_atmel_card()
1525 priv->do_rx_crc = 0; in init_atmel_card()
1528 if (priv->bus_type == BUS_TYPE_PCCARD) { in init_atmel_card()
1529 priv->probe_crc = 1; in init_atmel_card()
1530 priv->crc_ok_cnt = priv->crc_ko_cnt = 0; in init_atmel_card()
1532 priv->probe_crc = 0; in init_atmel_card()
1533 priv->last_qual = jiffies; in init_atmel_card()
1534 priv->last_beacon_timestamp = 0; in init_atmel_card()
1535 memset(priv->frag_source, 0xff, sizeof(priv->frag_source)); in init_atmel_card()
1536 eth_zero_addr(priv->BSSID); in init_atmel_card()
1537 priv->CurrentBSSID[0] = 0xFF; /* Initialize to something invalid.... */ in init_atmel_card()
1538 priv->station_was_associated = 0; in init_atmel_card()
1540 priv->last_survey = jiffies; in init_atmel_card()
1541 priv->preamble = LONG_PREAMBLE; in init_atmel_card()
1542 priv->operating_mode = IW_MODE_INFRA; in init_atmel_card()
1543 priv->connect_to_any_BSS = 0; in init_atmel_card()
1544 priv->config_reg_domain = 0; in init_atmel_card()
1545 priv->reg_domain = 0; in init_atmel_card()
1546 priv->tx_rate = 3; in init_atmel_card()
1547 priv->auto_tx_rate = 1; in init_atmel_card()
1548 priv->channel = 4; in init_atmel_card()
1549 priv->power_mode = 0; in init_atmel_card()
1550 priv->SSID[0] = '\0'; in init_atmel_card()
1551 priv->SSID_size = 0; in init_atmel_card()
1552 priv->new_SSID_size = 0; in init_atmel_card()
1553 priv->frag_threshold = 2346; in init_atmel_card()
1554 priv->rts_threshold = 2347; in init_atmel_card()
1555 priv->short_retry = 7; in init_atmel_card()
1556 priv->long_retry = 4; in init_atmel_card()
1558 priv->wep_is_on = 0; in init_atmel_card()
1559 priv->default_key = 0; in init_atmel_card()
1560 priv->encryption_level = 0; in init_atmel_card()
1561 priv->exclude_unencrypted = 0; in init_atmel_card()
1562 priv->group_cipher_suite = priv->pairwise_cipher_suite = CIPHER_SUITE_NONE; in init_atmel_card()
1563 priv->use_wpa = 0; in init_atmel_card()
1564 memset(priv->wep_keys, 0, sizeof(priv->wep_keys)); in init_atmel_card()
1565 memset(priv->wep_key_len, 0, sizeof(priv->wep_key_len)); in init_atmel_card()
1567 priv->default_beacon_period = priv->beacon_period = 100; in init_atmel_card()
1568 priv->listen_interval = 1; in init_atmel_card()
1570 timer_setup(&priv->management_timer, atmel_management_timer, 0); in init_atmel_card()
1571 spin_lock_init(&priv->irqlock); in init_atmel_card()
1572 spin_lock_init(&priv->timerlock); in init_atmel_card()
1574 dev->netdev_ops = &atmel_netdev_ops; in init_atmel_card()
1575 dev->wireless_handlers = &atmel_handler_def; in init_atmel_card()
1576 dev->irq = irq; in init_atmel_card()
1577 dev->base_addr = port; in init_atmel_card()
1579 /* MTU range: 68 - 2312 */ in init_atmel_card()
1580 dev->min_mtu = 68; in init_atmel_card()
1581 dev->max_mtu = MAX_WIRELESS_BODY - ETH_FCS_LEN; in init_atmel_card()
1585 if ((rc = request_irq(dev->irq, service_interrupt, IRQF_SHARED, dev->name, dev))) { in init_atmel_card()
1586 printk(KERN_ERR "%s: register interrupt %d failed, rc %d\n", dev->name, irq, rc); in init_atmel_card()
1590 if (!request_region(dev->base_addr, 32, in init_atmel_card()
1591 priv->bus_type == BUS_TYPE_PCCARD ? "atmel_cs" : "atmel_pci")) { in init_atmel_card()
1610 dev->name, DRIVER_MAJOR, DRIVER_MINOR, dev->dev_addr); in init_atmel_card()
1615 release_region(dev->base_addr, 32); in init_atmel_card()
1617 free_irq(dev->irq, dev); in init_atmel_card()
1630 if (priv->bus_type == BUS_TYPE_PCCARD) in stop_atmel_card()
1634 del_timer_sync(&priv->management_timer); in stop_atmel_card()
1637 free_irq(dev->irq, dev); in stop_atmel_card()
1638 kfree(priv->firmware); in stop_atmel_card()
1639 release_region(dev->base_addr, 32); in stop_atmel_card()
1653 if (dwrq->flags == 0) { in atmel_set_essid()
1654 priv->connect_to_any_BSS = 1; in atmel_set_essid()
1656 int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; in atmel_set_essid()
1658 priv->connect_to_any_BSS = 0; in atmel_set_essid()
1661 if (dwrq->length > MAX_SSID_LENGTH) in atmel_set_essid()
1662 return -E2BIG; in atmel_set_essid()
1664 return -EINVAL; in atmel_set_essid()
1666 memcpy(priv->new_SSID, extra, dwrq->length); in atmel_set_essid()
1667 priv->new_SSID_size = dwrq->length; in atmel_set_essid()
1670 return -EINPROGRESS; in atmel_set_essid()
1681 if (priv->new_SSID_size != 0) { in atmel_get_essid()
1682 memcpy(extra, priv->new_SSID, priv->new_SSID_size); in atmel_get_essid()
1683 dwrq->length = priv->new_SSID_size; in atmel_get_essid()
1685 memcpy(extra, priv->SSID, priv->SSID_size); in atmel_get_essid()
1686 dwrq->length = priv->SSID_size; in atmel_get_essid()
1689 dwrq->flags = !priv->connect_to_any_BSS; /* active */ in atmel_get_essid()
1700 memcpy(awrq->sa_data, priv->CurrentBSSID, ETH_ALEN); in atmel_get_wap()
1701 awrq->sa_family = ARPHRD_ETHER; in atmel_get_wap()
1718 * don't do it. - Jean II */ in atmel_set_encode()
1719 if (dwrq->length > 0) { in atmel_set_encode()
1720 int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; in atmel_set_encode()
1721 int current_index = priv->default_key; in atmel_set_encode()
1723 if (dwrq->length > 13) { in atmel_set_encode()
1724 return -EINVAL; in atmel_set_encode()
1726 /* Check the index (none -> use current) */ in atmel_set_encode()
1730 priv->default_key = index; in atmel_set_encode()
1732 if (dwrq->length > 5) in atmel_set_encode()
1733 priv->wep_key_len[index] = 13; in atmel_set_encode()
1735 if (dwrq->length > 0) in atmel_set_encode()
1736 priv->wep_key_len[index] = 5; in atmel_set_encode()
1739 priv->wep_key_len[index] = 0; in atmel_set_encode()
1741 if (!(dwrq->flags & IW_ENCODE_NOKEY)) { in atmel_set_encode()
1743 memset(priv->wep_keys[index], 0, 13); in atmel_set_encode()
1745 memcpy(priv->wep_keys[index], extra, dwrq->length); in atmel_set_encode()
1751 priv->wep_key_len[index] > 0) { in atmel_set_encode()
1752 priv->wep_is_on = 1; in atmel_set_encode()
1753 priv->exclude_unencrypted = 1; in atmel_set_encode()
1754 if (priv->wep_key_len[index] > 5) { in atmel_set_encode()
1755 priv->pairwise_cipher_suite = CIPHER_SUITE_WEP_128; in atmel_set_encode()
1756 priv->encryption_level = 2; in atmel_set_encode()
1758 priv->pairwise_cipher_suite = CIPHER_SUITE_WEP_64; in atmel_set_encode()
1759 priv->encryption_level = 1; in atmel_set_encode()
1764 int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; in atmel_set_encode()
1766 priv->default_key = index; in atmel_set_encode()
1769 if (!(dwrq->flags & IW_ENCODE_MODE)) in atmel_set_encode()
1770 return -EINVAL; in atmel_set_encode()
1773 if (dwrq->flags & IW_ENCODE_DISABLED) { in atmel_set_encode()
1774 priv->wep_is_on = 0; in atmel_set_encode()
1775 priv->encryption_level = 0; in atmel_set_encode()
1776 priv->pairwise_cipher_suite = CIPHER_SUITE_NONE; in atmel_set_encode()
1778 priv->wep_is_on = 1; in atmel_set_encode()
1779 if (priv->wep_key_len[priv->default_key] > 5) { in atmel_set_encode()
1780 priv->pairwise_cipher_suite = CIPHER_SUITE_WEP_128; in atmel_set_encode()
1781 priv->encryption_level = 2; in atmel_set_encode()
1783 priv->pairwise_cipher_suite = CIPHER_SUITE_WEP_64; in atmel_set_encode()
1784 priv->encryption_level = 1; in atmel_set_encode()
1787 if (dwrq->flags & IW_ENCODE_RESTRICTED) in atmel_set_encode()
1788 priv->exclude_unencrypted = 1; in atmel_set_encode()
1789 if (dwrq->flags & IW_ENCODE_OPEN) in atmel_set_encode()
1790 priv->exclude_unencrypted = 0; in atmel_set_encode()
1792 return -EINPROGRESS; /* Call commit handler */ in atmel_set_encode()
1801 int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; in atmel_get_encode()
1803 if (!priv->wep_is_on) in atmel_get_encode()
1804 dwrq->flags = IW_ENCODE_DISABLED; in atmel_get_encode()
1806 if (priv->exclude_unencrypted) in atmel_get_encode()
1807 dwrq->flags = IW_ENCODE_RESTRICTED; in atmel_get_encode()
1809 dwrq->flags = IW_ENCODE_OPEN; in atmel_get_encode()
1811 /* Which key do we want ? -1 -> tx index */ in atmel_get_encode()
1813 index = priv->default_key; in atmel_get_encode()
1814 dwrq->flags |= index + 1; in atmel_get_encode()
1816 dwrq->length = priv->wep_key_len[index]; in atmel_get_encode()
1817 if (dwrq->length > 16) { in atmel_get_encode()
1818 dwrq->length = 0; in atmel_get_encode()
1821 memcpy(extra, priv->wep_keys[index], dwrq->length); in atmel_get_encode()
1833 struct iw_point *encoding = &wrqu->encoding; in atmel_set_encodeext()
1834 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; in atmel_set_encodeext() local
1835 int idx, key_len, alg = ext->alg, set_key = 1; in atmel_set_encodeext()
1838 idx = encoding->flags & IW_ENCODE_INDEX; in atmel_set_encodeext()
1841 return -EINVAL; in atmel_set_encodeext()
1842 idx--; in atmel_set_encodeext()
1844 idx = priv->default_key; in atmel_set_encodeext()
1846 if (encoding->flags & IW_ENCODE_DISABLED) in atmel_set_encodeext()
1849 if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) { in atmel_set_encodeext()
1850 priv->default_key = idx; in atmel_set_encodeext()
1851 set_key = ext->key_len > 0 ? 1 : 0; in atmel_set_encodeext()
1858 priv->wep_is_on = 0; in atmel_set_encodeext()
1859 priv->encryption_level = 0; in atmel_set_encodeext()
1860 priv->pairwise_cipher_suite = CIPHER_SUITE_NONE; in atmel_set_encodeext()
1863 if (ext->key_len > 5) { in atmel_set_encodeext()
1864 priv->wep_key_len[idx] = 13; in atmel_set_encodeext()
1865 priv->pairwise_cipher_suite = CIPHER_SUITE_WEP_128; in atmel_set_encodeext()
1866 priv->encryption_level = 2; in atmel_set_encodeext()
1867 } else if (ext->key_len > 0) { in atmel_set_encodeext()
1868 priv->wep_key_len[idx] = 5; in atmel_set_encodeext()
1869 priv->pairwise_cipher_suite = CIPHER_SUITE_WEP_64; in atmel_set_encodeext()
1870 priv->encryption_level = 1; in atmel_set_encodeext()
1872 return -EINVAL; in atmel_set_encodeext()
1874 priv->wep_is_on = 1; in atmel_set_encodeext()
1875 memset(priv->wep_keys[idx], 0, 13); in atmel_set_encodeext()
1876 key_len = min ((int)ext->key_len, priv->wep_key_len[idx]); in atmel_set_encodeext()
1877 memcpy(priv->wep_keys[idx], ext->key, key_len); in atmel_set_encodeext()
1880 return -EINVAL; in atmel_set_encodeext()
1884 return -EINPROGRESS; in atmel_set_encodeext()
1893 struct iw_point *encoding = &wrqu->encoding; in atmel_get_encodeext()
1894 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; in atmel_get_encodeext() local
1897 max_key_len = encoding->length - sizeof(*ext); in atmel_get_encodeext()
1899 return -EINVAL; in atmel_get_encodeext()
1901 idx = encoding->flags & IW_ENCODE_INDEX; in atmel_get_encodeext()
1904 return -EINVAL; in atmel_get_encodeext()
1905 idx--; in atmel_get_encodeext()
1907 idx = priv->default_key; in atmel_get_encodeext()
1909 encoding->flags = idx + 1; in atmel_get_encodeext()
1910 memset(ext, 0, sizeof(*ext)); in atmel_get_encodeext()
1912 if (!priv->wep_is_on) { in atmel_get_encodeext()
1913 ext->alg = IW_ENCODE_ALG_NONE; in atmel_get_encodeext()
1914 ext->key_len = 0; in atmel_get_encodeext()
1915 encoding->flags |= IW_ENCODE_DISABLED; in atmel_get_encodeext()
1917 if (priv->encryption_level > 0) in atmel_get_encodeext()
1918 ext->alg = IW_ENCODE_ALG_WEP; in atmel_get_encodeext()
1920 return -EINVAL; in atmel_get_encodeext()
1922 ext->key_len = priv->wep_key_len[idx]; in atmel_get_encodeext()
1923 memcpy(ext->key, priv->wep_keys[idx], ext->key_len); in atmel_get_encodeext()
1924 encoding->flags |= IW_ENCODE_ENABLED; in atmel_get_encodeext()
1935 struct iw_param *param = &wrqu->param; in atmel_set_auth()
1937 switch (param->flags & IW_AUTH_INDEX) { in atmel_set_auth()
1950 priv->exclude_unencrypted = param->value ? 1 : 0; in atmel_set_auth()
1954 if (param->value & IW_AUTH_ALG_SHARED_KEY) { in atmel_set_auth()
1955 priv->exclude_unencrypted = 1; in atmel_set_auth()
1956 } else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) { in atmel_set_auth()
1957 priv->exclude_unencrypted = 0; in atmel_set_auth()
1959 return -EINVAL; in atmel_set_auth()
1965 if (param->value > 0) in atmel_set_auth()
1966 return -EOPNOTSUPP; in atmel_set_auth()
1970 return -EOPNOTSUPP; in atmel_set_auth()
1972 return -EINPROGRESS; in atmel_set_auth()
1980 struct iw_param *param = &wrqu->param; in atmel_get_auth()
1982 switch (param->flags & IW_AUTH_INDEX) { in atmel_get_auth()
1984 param->value = priv->exclude_unencrypted; in atmel_get_auth()
1988 if (priv->exclude_unencrypted == 1) in atmel_get_auth()
1989 param->value = IW_AUTH_ALG_SHARED_KEY; in atmel_get_auth()
1991 param->value = IW_AUTH_ALG_OPEN_SYSTEM; in atmel_get_auth()
1995 param->value = 0; in atmel_get_auth()
1999 return -EOPNOTSUPP; in atmel_get_auth()
2010 strcpy(cwrq, "IEEE 802.11-DS"); in atmel_get_name()
2021 if (vwrq->fixed == 0) { in atmel_set_rate()
2022 priv->tx_rate = 3; in atmel_set_rate()
2023 priv->auto_tx_rate = 1; in atmel_set_rate()
2025 priv->auto_tx_rate = 0; in atmel_set_rate()
2028 if ((vwrq->value < 4) && (vwrq->value >= 0)) { in atmel_set_rate()
2030 priv->tx_rate = vwrq->value; in atmel_set_rate()
2033 switch (vwrq->value) { in atmel_set_rate()
2035 priv->tx_rate = 0; in atmel_set_rate()
2038 priv->tx_rate = 1; in atmel_set_rate()
2041 priv->tx_rate = 2; in atmel_set_rate()
2044 priv->tx_rate = 3; in atmel_set_rate()
2047 return -EINVAL; in atmel_set_rate()
2052 return -EINPROGRESS; in atmel_set_rate()
2063 return -EINVAL; in atmel_set_mode()
2065 priv->operating_mode = *uwrq; in atmel_set_mode()
2066 return -EINPROGRESS; in atmel_set_mode()
2076 *uwrq = priv->operating_mode; in atmel_get_mode()
2087 if (priv->auto_tx_rate) { in atmel_get_rate()
2088 vwrq->fixed = 0; in atmel_get_rate()
2089 vwrq->value = 11000000; in atmel_get_rate()
2091 vwrq->fixed = 1; in atmel_get_rate()
2092 switch (priv->tx_rate) { in atmel_get_rate()
2094 vwrq->value = 1000000; in atmel_get_rate()
2097 vwrq->value = 2000000; in atmel_get_rate()
2100 vwrq->value = 5500000; in atmel_get_rate()
2103 vwrq->value = 11000000; in atmel_get_rate()
2116 priv->power_mode = vwrq->disabled ? 0 : 1; in atmel_set_power()
2117 return -EINPROGRESS; in atmel_set_power()
2126 vwrq->disabled = priv->power_mode ? 0 : 1; in atmel_get_power()
2127 vwrq->flags = IW_POWER_ON; in atmel_get_power()
2138 if (!vwrq->disabled && (vwrq->flags & IW_RETRY_LIMIT)) { in atmel_set_retry()
2139 if (vwrq->flags & IW_RETRY_LONG) in atmel_set_retry()
2140 priv->long_retry = vwrq->value; in atmel_set_retry()
2141 else if (vwrq->flags & IW_RETRY_SHORT) in atmel_set_retry()
2142 priv->short_retry = vwrq->value; in atmel_set_retry()
2145 priv->long_retry = vwrq->value; in atmel_set_retry()
2146 priv->short_retry = vwrq->value; in atmel_set_retry()
2148 return -EINPROGRESS; in atmel_set_retry()
2151 return -EINVAL; in atmel_set_retry()
2161 vwrq->disabled = 0; /* Can't be disabled */ in atmel_get_retry()
2164 if (vwrq->flags & IW_RETRY_LONG) { in atmel_get_retry()
2165 vwrq->flags = IW_RETRY_LIMIT | IW_RETRY_LONG; in atmel_get_retry()
2166 vwrq->value = priv->long_retry; in atmel_get_retry()
2168 vwrq->flags = IW_RETRY_LIMIT; in atmel_get_retry()
2169 vwrq->value = priv->short_retry; in atmel_get_retry()
2170 if (priv->long_retry != priv->short_retry) in atmel_get_retry()
2171 vwrq->flags |= IW_RETRY_SHORT; in atmel_get_retry()
2183 int rthr = vwrq->value; in atmel_set_rts()
2185 if (vwrq->disabled) in atmel_set_rts()
2188 return -EINVAL; in atmel_set_rts()
2190 priv->rts_threshold = rthr; in atmel_set_rts()
2192 return -EINPROGRESS; /* Call commit handler */ in atmel_set_rts()
2202 vwrq->value = priv->rts_threshold; in atmel_get_rts()
2203 vwrq->disabled = (vwrq->value >= 2347); in atmel_get_rts()
2204 vwrq->fixed = 1; in atmel_get_rts()
2215 int fthr = vwrq->value; in atmel_set_frag()
2217 if (vwrq->disabled) in atmel_set_frag()
2220 return -EINVAL; in atmel_set_frag()
2222 fthr &= ~0x1; /* Get an even value - is it really needed ??? */ in atmel_set_frag()
2223 priv->frag_threshold = fthr; in atmel_set_frag()
2225 return -EINPROGRESS; /* Call commit handler */ in atmel_set_frag()
2235 vwrq->value = priv->frag_threshold; in atmel_get_frag()
2236 vwrq->disabled = (vwrq->value >= 2346); in atmel_get_frag()
2237 vwrq->fixed = 1; in atmel_get_frag()
2248 int rc = -EINPROGRESS; /* Call commit handler */ in atmel_set_freq()
2251 if (fwrq->e == 1) { in atmel_set_freq()
2252 int f = fwrq->m / 100000; in atmel_set_freq()
2255 fwrq->e = 0; in atmel_set_freq()
2256 fwrq->m = ieee80211_frequency_to_channel(f); in atmel_set_freq()
2259 if (fwrq->m < 0 || fwrq->m > 1000 || fwrq->e > 0) in atmel_set_freq()
2260 rc = -EOPNOTSUPP; in atmel_set_freq()
2262 int channel = fwrq->m; in atmel_set_freq()
2264 priv->channel = channel; in atmel_set_freq()
2266 rc = -EINVAL; in atmel_set_freq()
2279 fwrq->m = priv->channel; in atmel_get_freq()
2280 fwrq->e = 0; in atmel_get_freq()
2299 if (priv->station_state == STATION_STATE_DOWN) in atmel_set_scan()
2300 return -EAGAIN; in atmel_set_scan()
2303 if (time_after(jiffies, priv->last_survey + 20 * HZ)) in atmel_set_scan()
2304 priv->site_survey_state = SITE_SURVEY_IDLE; in atmel_set_scan()
2305 priv->last_survey = jiffies; in atmel_set_scan()
2308 if (priv->site_survey_state == SITE_SURVEY_IN_PROGRESS) in atmel_set_scan()
2309 return -EBUSY; in atmel_set_scan()
2311 del_timer_sync(&priv->management_timer); in atmel_set_scan()
2312 spin_lock_irqsave(&priv->irqlock, flags); in atmel_set_scan()
2314 priv->site_survey_state = SITE_SURVEY_IN_PROGRESS; in atmel_set_scan()
2315 priv->fast_scan = 0; in atmel_set_scan()
2317 spin_unlock_irqrestore(&priv->irqlock, flags); in atmel_set_scan()
2332 if (priv->site_survey_state != SITE_SURVEY_COMPLETED) in atmel_get_scan()
2333 return -EAGAIN; in atmel_get_scan()
2335 for (i = 0; i < priv->BSS_list_entries; i++) { in atmel_get_scan()
2338 memcpy(iwe.u.ap_addr.sa_data, priv->BSSinfo[i].BSSID, ETH_ALEN); in atmel_get_scan()
2343 iwe.u.data.length = priv->BSSinfo[i].SSIDsize; in atmel_get_scan()
2350 &iwe, priv->BSSinfo[i].SSID); in atmel_get_scan()
2353 iwe.u.mode = priv->BSSinfo[i].BSStype; in atmel_get_scan()
2359 iwe.u.freq.m = priv->BSSinfo[i].channel; in atmel_get_scan()
2367 iwe.u.qual.level = priv->BSSinfo[i].RSSI; in atmel_get_scan()
2376 if (priv->BSSinfo[i].UsingWEP) in atmel_get_scan()
2387 dwrq->length = (current_ev - extra); in atmel_get_scan()
2388 dwrq->flags = 0; in atmel_get_scan()
2402 dwrq->length = sizeof(struct iw_range); in atmel_get_range()
2404 range->min_nwid = 0x0000; in atmel_get_range()
2405 range->max_nwid = 0x0000; in atmel_get_range()
2406 range->num_channels = 0; in atmel_get_range()
2408 if (priv->reg_domain == channel_table[j].reg_domain) { in atmel_get_range()
2409 range->num_channels = channel_table[j].max - channel_table[j].min + 1; in atmel_get_range()
2412 if (range->num_channels != 0) { in atmel_get_range()
2414 range->freq[k].i = i; /* List index */ in atmel_get_range()
2416 /* Values in MHz -> * 10^5 * 10 */ in atmel_get_range()
2417 range->freq[k].m = 100000 * in atmel_get_range()
2419 range->freq[k++].e = 1; in atmel_get_range()
2421 range->num_frequency = k; in atmel_get_range()
2424 range->max_qual.qual = 100; in atmel_get_range()
2425 range->max_qual.level = 100; in atmel_get_range()
2426 range->max_qual.noise = 0; in atmel_get_range()
2427 range->max_qual.updated = IW_QUAL_NOISE_INVALID; in atmel_get_range()
2429 range->avg_qual.qual = 50; in atmel_get_range()
2430 range->avg_qual.level = 50; in atmel_get_range()
2431 range->avg_qual.noise = 0; in atmel_get_range()
2432 range->avg_qual.updated = IW_QUAL_NOISE_INVALID; in atmel_get_range()
2434 range->sensitivity = 0; in atmel_get_range()
2436 range->bitrate[0] = 1000000; in atmel_get_range()
2437 range->bitrate[1] = 2000000; in atmel_get_range()
2438 range->bitrate[2] = 5500000; in atmel_get_range()
2439 range->bitrate[3] = 11000000; in atmel_get_range()
2440 range->num_bitrates = 4; in atmel_get_range()
2442 range->min_rts = 0; in atmel_get_range()
2443 range->max_rts = 2347; in atmel_get_range()
2444 range->min_frag = 256; in atmel_get_range()
2445 range->max_frag = 2346; in atmel_get_range()
2447 range->encoding_size[0] = 5; in atmel_get_range()
2448 range->encoding_size[1] = 13; in atmel_get_range()
2449 range->num_encoding_sizes = 2; in atmel_get_range()
2450 range->max_encoding_tokens = 4; in atmel_get_range()
2452 range->pmp_flags = IW_POWER_ON; in atmel_get_range()
2453 range->pmt_flags = IW_POWER_ON; in atmel_get_range()
2454 range->pm_capa = 0; in atmel_get_range()
2456 range->we_version_source = WIRELESS_EXT; in atmel_get_range()
2457 range->we_version_compiled = WIRELESS_EXT; in atmel_get_range()
2458 range->retry_capa = IW_RETRY_LIMIT ; in atmel_get_range()
2459 range->retry_flags = IW_RETRY_LIMIT; in atmel_get_range()
2460 range->r_time_flags = 0; in atmel_get_range()
2461 range->min_retry = 1; in atmel_get_range()
2462 range->max_retry = 65535; in atmel_get_range()
2478 if (awrq->sa_family != ARPHRD_ETHER) in atmel_set_wap()
2479 return -EINVAL; in atmel_set_wap()
2481 if (!memcmp(any, awrq->sa_data, 6) || in atmel_set_wap()
2482 !memcmp(off, awrq->sa_data, 6)) { in atmel_set_wap()
2483 del_timer_sync(&priv->management_timer); in atmel_set_wap()
2484 spin_lock_irqsave(&priv->irqlock, flags); in atmel_set_wap()
2486 spin_unlock_irqrestore(&priv->irqlock, flags); in atmel_set_wap()
2490 for (i = 0; i < priv->BSS_list_entries; i++) { in atmel_set_wap()
2491 if (memcmp(priv->BSSinfo[i].BSSID, awrq->sa_data, 6) == 0) { in atmel_set_wap()
2492 if (!priv->wep_is_on && priv->BSSinfo[i].UsingWEP) { in atmel_set_wap()
2493 return -EINVAL; in atmel_set_wap()
2494 } else if (priv->wep_is_on && !priv->BSSinfo[i].UsingWEP) { in atmel_set_wap()
2495 return -EINVAL; in atmel_set_wap()
2497 del_timer_sync(&priv->management_timer); in atmel_set_wap()
2498 spin_lock_irqsave(&priv->irqlock, flags); in atmel_set_wap()
2500 spin_unlock_irqrestore(&priv->irqlock, flags); in atmel_set_wap()
2506 return -EINVAL; in atmel_set_wap()
2537 (iw_handler) NULL, /* -- hole -- */
2538 (iw_handler) NULL, /* -- hole -- */
2541 (iw_handler) NULL, /* -- hole -- */
2549 (iw_handler) NULL, /* -- hole -- */
2550 (iw_handler) NULL, /* -- hole -- */
2565 (iw_handler) NULL, /* -- hole -- */
2566 (iw_handler) NULL, /* -- hole -- */
2635 wrq->u.param.value = ATMELMAGIC; in atmel_ioctl()
2639 if (copy_from_user(&com, rq->ifr_data, sizeof(com))) { in atmel_ioctl()
2640 rc = -EFAULT; in atmel_ioctl()
2645 rc = -EPERM; in atmel_ioctl()
2655 kfree(priv->firmware); in atmel_ioctl()
2657 priv->firmware = new_firmware; in atmel_ioctl()
2658 priv->firmware_length = com.len; in atmel_ioctl()
2659 strncpy(priv->firmware_id, com.id, 31); in atmel_ioctl()
2660 priv->firmware_id[31] = '\0'; in atmel_ioctl()
2664 if (copy_from_user(domain, rq->ifr_data, REGDOMAINSZ)) { in atmel_ioctl()
2665 rc = -EFAULT; in atmel_ioctl()
2670 rc = -EPERM; in atmel_ioctl()
2675 rc = -EINVAL; in atmel_ioctl()
2678 priv->config_reg_domain = channel_table[i].reg_domain; in atmel_ioctl()
2683 if (rc == 0 && priv->station_state != STATION_STATE_DOWN) in atmel_ioctl()
2688 rc = -EOPNOTSUPP; in atmel_ioctl()
2705 int old_state = priv->station_state; in atmel_enter_state()
2710 priv->station_state = new_state; in atmel_enter_state()
2713 netif_start_queue(priv->dev); in atmel_enter_state()
2714 netif_carrier_on(priv->dev); in atmel_enter_state()
2718 netif_carrier_off(priv->dev); in atmel_enter_state()
2719 if (netif_running(priv->dev)) in atmel_enter_state()
2720 netif_stop_queue(priv->dev); in atmel_enter_state()
2721 priv->last_beacon_timestamp = 0; in atmel_enter_state()
2741 if (priv->fast_scan) { in atmel_scan()
2742 cmd.SSID_size = priv->SSID_size; in atmel_scan()
2743 memcpy(cmd.SSID, priv->SSID, priv->SSID_size); in atmel_scan()
2747 priv->BSS_list_entries = 0; in atmel_scan()
2758 cmd.channel = (priv->channel & 0x7f); in atmel_scan()
2760 cmd.BSS_type = cpu_to_le16(priv->operating_mode == IW_MODE_ADHOC ? in atmel_scan()
2775 u8 BSS_type; /* this is a short in a scan command - weird */ in join()
2782 cmd.SSID_size = priv->SSID_size; in join()
2783 memcpy(cmd.SSID, priv->SSID, priv->SSID_size); in join()
2784 memcpy(cmd.BSSID, priv->CurrentBSSID, ETH_ALEN); in join()
2785 cmd.channel = (priv->channel & 0x7f); in join()
2803 cmd.SSID_size = priv->SSID_size; in start()
2804 memcpy(cmd.SSID, priv->SSID, priv->SSID_size); in start()
2805 memcpy(cmd.BSSID, priv->BSSID, ETH_ALEN); in start()
2807 cmd.channel = (priv->channel & 0x7f); in start()
2819 if (priv->preamble != new) { in handle_beacon_probe()
2820 priv->preamble = new; in handle_beacon_probe()
2825 if (priv->channel != channel) { in handle_beacon_probe()
2826 priv->channel = channel; in handle_beacon_probe()
2832 priv->station_is_associated = 0; in handle_beacon_probe()
2835 if (priv->operating_mode == IW_MODE_INFRA) in handle_beacon_probe()
2851 memcpy(header.addr1, priv->CurrentBSSID, ETH_ALEN); in send_authentication_request()
2852 memcpy(header.addr2, priv->dev->dev_addr, ETH_ALEN); in send_authentication_request()
2853 memcpy(header.addr3, priv->CurrentBSSID, ETH_ALEN); in send_authentication_request()
2855 if (priv->wep_is_on && priv->CurrentAuthentTransactionSeqNum != 1) in send_authentication_request()
2862 auth.trans_seq = cpu_to_le16(priv->CurrentAuthentTransactionSeqNum); in send_authentication_request()
2863 priv->ExpectedAuthentTransactionSeqNum = priv->CurrentAuthentTransactionSeqNum+1; in send_authentication_request()
2864 priv->CurrentAuthentTransactionSeqNum += 2; in send_authentication_request()
2898 memcpy(header.addr1, priv->CurrentBSSID, ETH_ALEN); in send_association_request()
2899 memcpy(header.addr2, priv->dev->dev_addr, ETH_ALEN); in send_association_request()
2900 memcpy(header.addr3, priv->CurrentBSSID, ETH_ALEN); in send_association_request()
2903 if (priv->wep_is_on) in send_association_request()
2905 if (priv->preamble == SHORT_PREAMBLE) in send_association_request()
2908 body.listen_interval = cpu_to_le16(priv->listen_interval * priv->beacon_period); in send_association_request()
2910 /* current AP address - only in reassoc frame */ in send_association_request()
2912 memcpy(body.ap, priv->CurrentBSSID, ETH_ALEN); in send_association_request()
2914 bodysize = 18 + priv->SSID_size; in send_association_request()
2917 bodysize = 12 + priv->SSID_size; in send_association_request()
2921 ssid_el_p[1] = priv->SSID_size; in send_association_request()
2922 memcpy(ssid_el_p + 2, priv->SSID, priv->SSID_size); in send_association_request()
2923 ssid_el_p[2 + priv->SSID_size] = WLAN_EID_SUPP_RATES; in send_association_request()
2924 ssid_el_p[3 + priv->SSID_size] = 4; /* len of supported rates */ in send_association_request()
2925 memcpy(ssid_el_p + 4 + priv->SSID_size, atmel_basic_rates, 4); in send_association_request()
2933 if (le16_to_cpu(header->frame_control) & IEEE80211_FCTL_FROMDS) in is_frame_from_current_bss()
2934 return memcmp(header->addr3, priv->CurrentBSSID, 6) == 0; in is_frame_from_current_bss()
2936 return memcmp(header->addr2, priv->CurrentBSSID, 6) == 0; in is_frame_from_current_bss()
2942 int max_rssi = -128; in retrieve_bss()
2943 int max_index = -1; in retrieve_bss()
2945 if (priv->BSS_list_entries == 0) in retrieve_bss()
2946 return -1; in retrieve_bss()
2948 if (priv->connect_to_any_BSS) { in retrieve_bss()
2949 /* Select a BSS with the max-RSSI but of the same type and of in retrieve_bss()
2953 priv->current_BSS = 0; in retrieve_bss()
2954 for (i = 0; i < priv->BSS_list_entries; i++) { in retrieve_bss()
2955 if (priv->operating_mode == priv->BSSinfo[i].BSStype && in retrieve_bss()
2956 ((!priv->wep_is_on && !priv->BSSinfo[i].UsingWEP) || in retrieve_bss()
2957 (priv->wep_is_on && priv->BSSinfo[i].UsingWEP)) && in retrieve_bss()
2958 !(priv->BSSinfo[i].channel & 0x80)) { in retrieve_bss()
2959 max_rssi = priv->BSSinfo[i].RSSI; in retrieve_bss()
2960 priv->current_BSS = max_index = i; in retrieve_bss()
2966 for (i = 0; i < priv->BSS_list_entries; i++) { in retrieve_bss()
2967 if (priv->SSID_size == priv->BSSinfo[i].SSIDsize && in retrieve_bss()
2968 memcmp(priv->SSID, priv->BSSinfo[i].SSID, priv->SSID_size) == 0 && in retrieve_bss()
2969 priv->operating_mode == priv->BSSinfo[i].BSStype && in retrieve_bss()
2970 atmel_validate_channel(priv, priv->BSSinfo[i].channel) == 0) { in retrieve_bss()
2971 if (priv->BSSinfo[i].RSSI >= max_rssi) { in retrieve_bss()
2972 max_rssi = priv->BSSinfo[i].RSSI; in retrieve_bss()
2985 u8 *bss = capability & WLAN_CAPABILITY_ESS ? header->addr2 : header->addr3; in store_bss_info()
2988 for (index = -1, i = 0; i < priv->BSS_list_entries; i++) in store_bss_info()
2989 if (memcmp(bss, priv->BSSinfo[i].BSSID, ETH_ALEN) == 0) in store_bss_info()
2996 if (index == -1) { in store_bss_info()
2997 if (priv->BSS_list_entries == MAX_BSS_ENTRIES) in store_bss_info()
2999 index = priv->BSS_list_entries++; in store_bss_info()
3000 memcpy(priv->BSSinfo[index].BSSID, bss, ETH_ALEN); in store_bss_info()
3001 priv->BSSinfo[index].RSSI = rssi; in store_bss_info()
3003 if (rssi > priv->BSSinfo[index].RSSI) in store_bss_info()
3004 priv->BSSinfo[index].RSSI = rssi; in store_bss_info()
3009 priv->BSSinfo[index].channel = channel; in store_bss_info()
3010 priv->BSSinfo[index].beacon_period = beacon_period; in store_bss_info()
3011 priv->BSSinfo[index].UsingWEP = capability & WLAN_CAPABILITY_PRIVACY; in store_bss_info()
3012 memcpy(priv->BSSinfo[index].SSID, ssid, ssid_len); in store_bss_info()
3013 priv->BSSinfo[index].SSIDsize = ssid_len; in store_bss_info()
3016 priv->BSSinfo[index].BSStype = IW_MODE_ADHOC; in store_bss_info()
3018 priv->BSSinfo[index].BSStype = IW_MODE_INFRA; in store_bss_info()
3020 priv->BSSinfo[index].preamble = capability & WLAN_CAPABILITY_SHORT_PREAMBLE ? in store_bss_info()
3026 struct auth_body *auth = (struct auth_body *)priv->rx_buf; in authenticate()
3027 u16 status = le16_to_cpu(auth->status); in authenticate()
3028 u16 trans_seq_no = le16_to_cpu(auth->trans_seq); in authenticate()
3029 u16 system = le16_to_cpu(auth->alg); in authenticate()
3031 if (status == WLAN_STATUS_SUCCESS && !priv->wep_is_on) { in authenticate()
3033 if (priv->station_was_associated) { in authenticate()
3044 if (status == WLAN_STATUS_SUCCESS && priv->wep_is_on) { in authenticate()
3047 if (trans_seq_no != priv->ExpectedAuthentTransactionSeqNum) in authenticate()
3056 auth->el_id == WLAN_EID_CHALLENGE) { in authenticate()
3057 send_authentication_request(priv, system, auth->chall_text, auth->chall_text_len); in authenticate()
3065 if (priv->station_was_associated) { in authenticate()
3082 priv->CurrentAuthentTransactionSeqNum = 0x001; in authenticate()
3083 priv->exclude_unencrypted = 1; in authenticate()
3087 && priv->wep_is_on) { in authenticate()
3088 priv->CurrentAuthentTransactionSeqNum = 0x001; in authenticate()
3089 priv->exclude_unencrypted = 0; in authenticate()
3092 } else if (priv->connect_to_any_BSS) { in authenticate()
3095 priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80; in authenticate()
3097 if ((bss_index = retrieve_bss(priv)) != -1) { in authenticate()
3104 priv->AuthenticationRequestRetryCnt = 0; in authenticate()
3106 priv->station_is_associated = 0; in authenticate()
3118 } *ass_resp = (struct ass_resp_format *)priv->rx_buf; in associate()
3120 u16 status = le16_to_cpu(ass_resp->status); in associate()
3121 u16 ass_id = le16_to_cpu(ass_resp->ass_id); in associate()
3122 u16 rates_len = ass_resp->length > 4 ? 4 : ass_resp->length; in associate()
3131 priv->AssociationRequestRetryCnt = 0; in associate()
3133 priv->ReAssociationRequestRetryCnt = 0; in associate()
3138 PHY_MIB_RATE_SET_POS, ass_resp->rates, rates_len); in associate()
3139 if (priv->power_mode == 0) { in associate()
3140 priv->listen_interval = 1; in associate()
3146 priv->listen_interval = 2; in associate()
3153 priv->station_is_associated = 1; in associate()
3154 priv->station_was_associated = 1; in associate()
3160 memcpy(wrqu.ap_addr.sa_data, priv->CurrentBSSID, ETH_ALEN); in associate()
3162 wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL); in associate()
3170 priv->AssociationRequestRetryCnt < MAX_ASSOCIATION_RETRIES) { in associate()
3171 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); in associate()
3172 priv->AssociationRequestRetryCnt++; in associate()
3180 priv->ReAssociationRequestRetryCnt < MAX_ASSOCIATION_RETRIES) { in associate()
3181 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); in associate()
3182 priv->ReAssociationRequestRetryCnt++; in associate()
3188 priv->station_is_associated = 0; in associate()
3190 if (priv->connect_to_any_BSS) { in associate()
3192 priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80; in associate()
3194 if ((bss_index = retrieve_bss(priv)) != -1) in associate()
3201 struct bss_info *bss = &priv->BSSinfo[bss_index]; in atmel_join_bss()
3203 memcpy(priv->CurrentBSSID, bss->BSSID, ETH_ALEN); in atmel_join_bss()
3204 memcpy(priv->SSID, bss->SSID, priv->SSID_size = bss->SSIDsize); in atmel_join_bss()
3207 if (priv->use_wpa) in atmel_join_bss()
3212 if (bss->BSStype == IW_MODE_ADHOC && in atmel_join_bss()
3213 priv->operating_mode != IW_MODE_ADHOC && in atmel_join_bss()
3214 priv->power_mode) { in atmel_join_bss()
3215 priv->power_mode = 0; in atmel_join_bss()
3216 priv->listen_interval = 1; in atmel_join_bss()
3223 priv->operating_mode = bss->BSStype; in atmel_join_bss()
3224 priv->channel = bss->channel & 0x7f; in atmel_join_bss()
3225 priv->beacon_period = bss->beacon_period; in atmel_join_bss()
3227 if (priv->preamble != bss->preamble) { in atmel_join_bss()
3228 priv->preamble = bss->preamble; in atmel_join_bss()
3230 LOCAL_MIB_PREAMBLE_TYPE, bss->preamble); in atmel_join_bss()
3233 if (!priv->wep_is_on && bss->UsingWEP) { in atmel_join_bss()
3235 priv->station_is_associated = 0; in atmel_join_bss()
3239 if (priv->wep_is_on && !bss->UsingWEP) { in atmel_join_bss()
3241 priv->station_is_associated = 0; in atmel_join_bss()
3247 if (priv->operating_mode == IW_MODE_INFRA) in atmel_join_bss()
3257 if (!priv->connect_to_any_BSS) { in restart_search()
3260 priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80; in restart_search()
3262 if ((bss_index = retrieve_bss(priv)) != -1) in restart_search()
3271 u8 old = priv->wstats.qual.level; in smooth_rssi()
3272 u8 max_rssi = 42; /* 502-rmfd-revd max by experiment, default for now */ in smooth_rssi()
3274 switch (priv->firmware_type) { in smooth_rssi()
3276 max_rssi = 63; /* 502-rmfd-reve max by experiment */ in smooth_rssi()
3284 priv->wstats.qual.level = (rssi + old) / 2 + 1; in smooth_rssi()
3286 priv->wstats.qual.level = (rssi + old) / 2; in smooth_rssi()
3287 priv->wstats.qual.updated |= IW_QUAL_LEVEL_UPDATED; in smooth_rssi()
3288 priv->wstats.qual.updated &= ~IW_QUAL_LEVEL_INVALID; in smooth_rssi()
3293 unsigned long time_diff = (jiffies - priv->last_qual) / HZ; in atmel_smooth_qual()
3294 while (time_diff--) { in atmel_smooth_qual()
3295 priv->last_qual += HZ; in atmel_smooth_qual()
3296 priv->wstats.qual.qual = priv->wstats.qual.qual / 2; in atmel_smooth_qual()
3297 priv->wstats.qual.qual += in atmel_smooth_qual()
3298 priv->beacons_this_sec * priv->beacon_period * (priv->wstats.qual.level + 100) / 4000; in atmel_smooth_qual()
3299 priv->beacons_this_sec = 0; in atmel_smooth_qual()
3301 priv->wstats.qual.updated |= IW_QUAL_QUAL_UPDATED; in atmel_smooth_qual()
3302 priv->wstats.qual.updated &= ~IW_QUAL_QUAL_INVALID; in atmel_smooth_qual()
3312 subtype = le16_to_cpu(header->frame_control) & IEEE80211_FCTL_STYPE; in atmel_management_frame()
3317 /* beacon frame has multiple variable-length fields - in atmel_management_frame()
3333 } *beacon = (struct beacon_format *)priv->rx_buf; in atmel_management_frame()
3336 u64 timestamp = le64_to_cpu(beacon->timestamp); in atmel_management_frame()
3337 u16 beacon_interval = le16_to_cpu(beacon->interval); in atmel_management_frame()
3338 u16 capability = le16_to_cpu(beacon->capability); in atmel_management_frame()
3339 u8 *beaconp = priv->rx_buf; in atmel_management_frame()
3340 ssid_length = beacon->ssid_length; in atmel_management_frame()
3344 rates_length = beaconp[beacon->ssid_length + 15]; in atmel_management_frame()
3351 if (priv->station_state == STATION_STATE_READY) { in atmel_management_frame()
3354 priv->beacons_this_sec++; in atmel_management_frame()
3356 if (priv->last_beacon_timestamp) { in atmel_management_frame()
3357 /* Note truncate this to 32 bits - kernel can't divide a long long */ in atmel_management_frame()
3358 u32 beacon_delay = timestamp - priv->last_beacon_timestamp; in atmel_management_frame()
3361 priv->wstats.miss.beacon += beacons - 1; in atmel_management_frame()
3363 priv->last_beacon_timestamp = timestamp; in atmel_management_frame()
3368 if (priv->station_state == STATION_STATE_SCANNING) in atmel_management_frame()
3372 &beacon->rates_el_id, in atmel_management_frame()
3379 if (priv->station_state == STATION_STATE_AUTHENTICATING) in atmel_management_frame()
3387 if (priv->station_state == STATION_STATE_ASSOCIATING || in atmel_management_frame()
3388 priv->station_state == STATION_STATE_REASSOCIATING) in atmel_management_frame()
3394 if (priv->station_is_associated && in atmel_management_frame()
3395 priv->operating_mode == IW_MODE_INFRA && in atmel_management_frame()
3397 priv->station_was_associated = 0; in atmel_management_frame()
3398 priv->station_is_associated = 0; in atmel_management_frame()
3407 if (priv->operating_mode == IW_MODE_INFRA && in atmel_management_frame()
3409 priv->station_was_associated = 0; in atmel_management_frame()
3426 if (priv->card && priv->present_callback && in atmel_management_timer()
3427 !(*priv->present_callback)(priv->card)) in atmel_management_timer()
3430 spin_lock_irqsave(&priv->irqlock, flags); in atmel_management_timer()
3432 switch (priv->station_state) { in atmel_management_timer()
3435 if (priv->AuthenticationRequestRetryCnt >= MAX_AUTHENTICATION_RETRIES) { in atmel_management_timer()
3437 priv->station_is_associated = 0; in atmel_management_timer()
3438 priv->AuthenticationRequestRetryCnt = 0; in atmel_management_timer()
3442 priv->AuthenticationRequestRetryCnt++; in atmel_management_timer()
3443 priv->CurrentAuthentTransactionSeqNum = 0x0001; in atmel_management_timer()
3444 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); in atmel_management_timer()
3445 if (priv->wep_is_on && priv->exclude_unencrypted) in atmel_management_timer()
3452 if (priv->AssociationRequestRetryCnt == MAX_ASSOCIATION_RETRIES) { in atmel_management_timer()
3454 priv->station_is_associated = 0; in atmel_management_timer()
3455 priv->AssociationRequestRetryCnt = 0; in atmel_management_timer()
3458 priv->AssociationRequestRetryCnt++; in atmel_management_timer()
3459 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); in atmel_management_timer()
3465 if (priv->ReAssociationRequestRetryCnt == MAX_ASSOCIATION_RETRIES) { in atmel_management_timer()
3467 priv->station_is_associated = 0; in atmel_management_timer()
3468 priv->ReAssociationRequestRetryCnt = 0; in atmel_management_timer()
3471 priv->ReAssociationRequestRetryCnt++; in atmel_management_timer()
3472 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); in atmel_management_timer()
3481 spin_unlock_irqrestore(&priv->irqlock, flags); in atmel_management_timer()
3498 priv->station_was_associated = priv->station_is_associated; in atmel_command_irq()
3500 (u8 *)priv->CurrentBSSID, 6); in atmel_command_irq()
3506 fast_scan = priv->fast_scan; in atmel_command_irq()
3507 priv->fast_scan = 0; in atmel_command_irq()
3514 if (bss_index != -1) { in atmel_command_irq()
3516 } else if (priv->operating_mode == IW_MODE_ADHOC && in atmel_command_irq()
3517 priv->SSID_size != 0) { in atmel_command_irq()
3520 priv->fast_scan = !fast_scan; in atmel_command_irq()
3524 priv->site_survey_state = SITE_SURVEY_COMPLETED; in atmel_command_irq()
3528 wireless_send_event(priv->dev, SIOCGIWSCAN, &wrqu, NULL); in atmel_command_irq()
3534 priv->fast_scan = 0; in atmel_command_irq()
3539 priv->site_survey_state = SITE_SURVEY_COMPLETED; in atmel_command_irq()
3540 if (priv->station_is_associated) { in atmel_command_irq()
3544 wireless_send_event(priv->dev, SIOCGIWSCAN, &wrqu, NULL); in atmel_command_irq()
3552 if (priv->operating_mode == IW_MODE_ADHOC) { in atmel_command_irq()
3553 priv->station_was_associated = priv->station_is_associated; in atmel_command_irq()
3557 priv->AuthenticationRequestRetryCnt = 0; in atmel_command_irq()
3560 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); in atmel_command_irq()
3561 priv->CurrentAuthentTransactionSeqNum = 0x0001; in atmel_command_irq()
3562 if (priv->wep_is_on && priv->exclude_unencrypted) in atmel_command_irq()
3575 struct host_info_struct *iface = &priv->host_info; in atmel_wakeup_firmware()
3579 if (priv->card_type == CARD_TYPE_SPI_FLASH) in atmel_wakeup_firmware()
3580 atmel_set_gcr(priv->dev, GCR_REMAP); in atmel_wakeup_firmware()
3582 /* wake up on-board processor */ in atmel_wakeup_firmware()
3583 atmel_clear_gcr(priv->dev, 0x0040); in atmel_wakeup_firmware()
3584 atmel_write16(priv->dev, BSR, BSS_SRAM); in atmel_wakeup_firmware()
3586 if (priv->card_type == CARD_TYPE_SPI_FLASH) in atmel_wakeup_firmware()
3590 for (i = LOOP_RETRY_LIMIT; i; i--) { in atmel_wakeup_firmware()
3591 mr1 = atmel_read16(priv->dev, MR1); in atmel_wakeup_firmware()
3592 mr3 = atmel_read16(priv->dev, MR3); in atmel_wakeup_firmware()
3597 priv->bus_type == BUS_TYPE_PCCARD) in atmel_wakeup_firmware()
3602 printk(KERN_ALERT "%s: MAC failed to boot.\n", priv->dev->name); in atmel_wakeup_firmware()
3603 return -EIO; in atmel_wakeup_firmware()
3606 if ((priv->host_info_base = atmel_read16(priv->dev, MR2)) == 0xffff) { in atmel_wakeup_firmware()
3607 printk(KERN_ALERT "%s: card missing.\n", priv->dev->name); in atmel_wakeup_firmware()
3608 return -ENODEV; in atmel_wakeup_firmware()
3618 for (i = LOOP_RETRY_LIMIT; i; i--) { in atmel_wakeup_firmware()
3619 mr1 = atmel_read16(priv->dev, MR1); in atmel_wakeup_firmware()
3620 mr3 = atmel_read16(priv->dev, MR3); in atmel_wakeup_firmware()
3625 priv->bus_type == BUS_TYPE_PCCARD) in atmel_wakeup_firmware()
3631 priv->dev->name); in atmel_wakeup_firmware()
3632 return -EIO; in atmel_wakeup_firmware()
3637 !(atmel_read16(priv->dev, MR3) & MAC_INIT_OK)) { in atmel_wakeup_firmware()
3638 printk(KERN_ALERT "%s: MAC failed MR3 self-test.\n", priv->dev->name); in atmel_wakeup_firmware()
3639 return -EIO; in atmel_wakeup_firmware()
3642 !(atmel_read16(priv->dev, MR1) & MAC_INIT_OK)) { in atmel_wakeup_firmware()
3643 printk(KERN_ALERT "%s: MAC failed MR1 self-test.\n", priv->dev->name); in atmel_wakeup_firmware()
3644 return -EIO; in atmel_wakeup_firmware()
3647 atmel_copy_to_host(priv->dev, (unsigned char *)iface, in atmel_wakeup_firmware()
3648 priv->host_info_base, sizeof(*iface)); in atmel_wakeup_firmware()
3650 iface->tx_buff_pos = le16_to_cpu(iface->tx_buff_pos); in atmel_wakeup_firmware()
3651 iface->tx_buff_size = le16_to_cpu(iface->tx_buff_size); in atmel_wakeup_firmware()
3652 iface->tx_desc_pos = le16_to_cpu(iface->tx_desc_pos); in atmel_wakeup_firmware()
3653 iface->tx_desc_count = le16_to_cpu(iface->tx_desc_count); in atmel_wakeup_firmware()
3654 iface->rx_buff_pos = le16_to_cpu(iface->rx_buff_pos); in atmel_wakeup_firmware()
3655 iface->rx_buff_size = le16_to_cpu(iface->rx_buff_size); in atmel_wakeup_firmware()
3656 iface->rx_desc_pos = le16_to_cpu(iface->rx_desc_pos); in atmel_wakeup_firmware()
3657 iface->rx_desc_count = le16_to_cpu(iface->rx_desc_count); in atmel_wakeup_firmware()
3658 iface->build_version = le16_to_cpu(iface->build_version); in atmel_wakeup_firmware()
3659 iface->command_pos = le16_to_cpu(iface->command_pos); in atmel_wakeup_firmware()
3660 iface->major_version = le16_to_cpu(iface->major_version); in atmel_wakeup_firmware()
3661 iface->minor_version = le16_to_cpu(iface->minor_version); in atmel_wakeup_firmware()
3662 iface->func_ctrl = le16_to_cpu(iface->func_ctrl); in atmel_wakeup_firmware()
3663 iface->mac_status = le16_to_cpu(iface->mac_status); in atmel_wakeup_firmware()
3675 if (priv->bus_type == BUS_TYPE_PCCARD) in probe_atmel_card()
3685 priv->card_type = CARD_TYPE_EEPROM; in probe_atmel_card()
3689 atmel_clear_gcr(priv->dev, 0x0040); in probe_atmel_card()
3691 for (i = LOOP_RETRY_LIMIT; i; i--) in probe_atmel_card()
3695 printk(KERN_ALERT "%s: MAC failed to boot MAC address reader.\n", dev->name); in probe_atmel_card()
3697 atmel_copy_to_host(dev, dev->dev_addr, atmel_read16(dev, MR2), 6); in probe_atmel_card()
3700 if (priv->bus_type == BUS_TYPE_PCCARD) in probe_atmel_card()
3707 priv->card_type = CARD_TYPE_PARALLEL_FLASH; in probe_atmel_card()
3709 atmel_copy_to_host(dev, dev->dev_addr, 0xc000, 6); in probe_atmel_card()
3715 priv->card_type = CARD_TYPE_SPI_FLASH; in probe_atmel_card()
3717 atmel_get_mib(priv, Mac_Address_Mib_Type, 0, dev->dev_addr, 6); in probe_atmel_card()
3721 if (priv->bus_type == BUS_TYPE_PCCARD) in probe_atmel_card()
3729 if (dev->dev_addr[0] == 0xFF) { in probe_atmel_card()
3733 printk(KERN_ALERT "%s: *** Invalid MAC address. UPGRADE Firmware ****\n", dev->name); in probe_atmel_card()
3734 memcpy(dev->dev_addr, default_mac, ETH_ALEN); in probe_atmel_card()
3742 This routine is for the pre-WPA firmware: later firmware has
3761 mib.wep_is_on = priv->wep_is_on; in build_wep_mib()
3762 if (priv->wep_is_on) { in build_wep_mib()
3763 if (priv->wep_key_len[priv->default_key] > 5) in build_wep_mib()
3771 mib.default_key = priv->default_key; in build_wep_mib()
3772 mib.exclude_unencrypted = priv->exclude_unencrypted; in build_wep_mib()
3775 memcpy(mib.wep_keys[i], priv->wep_keys[i], 13); in build_wep_mib()
3802 mib.wep_is_on = priv->wep_is_on; in build_wpa_mib()
3803 mib.exclude_unencrypted = priv->exclude_unencrypted; in build_wpa_mib()
3804 memcpy(mib.receiver_address, priv->CurrentBSSID, ETH_ALEN); in build_wpa_mib()
3809 if (priv->wep_is_on) { in build_wpa_mib()
3817 if (priv->wep_key_len[i] > 0) { in build_wpa_mib()
3818 memcpy(mib.cipher_default_key_value[i], priv->wep_keys[i], MAX_ENCRYPTION_KEY_SIZE); in build_wpa_mib()
3819 if (i == priv->default_key) { in build_wpa_mib()
3821 mib.cipher_default_key_value[i][MAX_ENCRYPTION_KEY_SIZE-1] = 7; in build_wpa_mib()
3822 mib.cipher_default_key_value[i][MAX_ENCRYPTION_KEY_SIZE-2] = priv->pairwise_cipher_suite; in build_wpa_mib()
3825 priv->group_cipher_suite = priv->pairwise_cipher_suite; in build_wpa_mib()
3826 mib.cipher_default_key_value[i][MAX_ENCRYPTION_KEY_SIZE-1] = 1; in build_wpa_mib()
3827 mib.cipher_default_key_value[i][MAX_ENCRYPTION_KEY_SIZE-2] = priv->group_cipher_suite; in build_wpa_mib()
3848 can be altered on the fly, but many (WEP, infrastructure or ad-hoc) in reset_atmel_card()
3853 hardware-specific fields in the atmel_private structure, in reset_atmel_card()
3859 int old_state = priv->station_state; in reset_atmel_card()
3866 "-wpa", in reset_atmel_card()
3872 if (priv->bus_type == BUS_TYPE_PCCARD) in reset_atmel_card()
3873 atmel_write16(priv->dev, GCR, 0x0060); in reset_atmel_card()
3876 atmel_write16(priv->dev, GCR, 0x0040); in reset_atmel_card()
3878 if (priv->card_type == CARD_TYPE_EEPROM) { in reset_atmel_card()
3882 int len = priv->firmware_length; in reset_atmel_card()
3883 if (!(fw = priv->firmware)) { in reset_atmel_card()
3884 if (priv->firmware_type == ATMEL_FW_TYPE_NONE) { in reset_atmel_card()
3885 if (strlen(priv->firmware_id) == 0) { in reset_atmel_card()
3888 dev->name); in reset_atmel_card()
3891 dev->name); in reset_atmel_card()
3892 strcpy(priv->firmware_id, "atmel_at76c502.bin"); in reset_atmel_card()
3894 err = request_firmware(&fw_entry, priv->firmware_id, priv->sys_dev); in reset_atmel_card()
3898 dev->name, priv->firmware_id); in reset_atmel_card()
3906 while (fw_table[fw_index].fw_type != priv->firmware_type in reset_atmel_card()
3914 snprintf(priv->firmware_id, 32, "%s%s.%s", fw_table[fw_index].fw_file, in reset_atmel_card()
3916 priv->firmware_id[31] = '\0'; in reset_atmel_card()
3917 if (request_firmware(&fw_entry, priv->firmware_id, priv->sys_dev) == 0) { in reset_atmel_card()
3926 dev->name, priv->firmware_id); in reset_atmel_card()
3927 priv->firmware_id[0] = '\0'; in reset_atmel_card()
3928 return -ENOENT; in reset_atmel_card()
3932 fw = fw_entry->data; in reset_atmel_card()
3933 len = fw_entry->size; in reset_atmel_card()
3937 atmel_write16(priv->dev, BSR, BSS_IRAM); in reset_atmel_card()
3938 atmel_copy_to_card(priv->dev, 0, fw, len); in reset_atmel_card()
3939 atmel_set_gcr(priv->dev, GCR_REMAP); in reset_atmel_card()
3942 atmel_set_gcr(priv->dev, GCR_REMAP); in reset_atmel_card()
3943 atmel_write16(priv->dev, BSR, BSS_IRAM); in reset_atmel_card()
3944 atmel_copy_to_card(priv->dev, 0, fw, 0x6000); in reset_atmel_card()
3945 atmel_write16(priv->dev, BSR, 0x2ff); in reset_atmel_card()
3946 atmel_copy_to_card(priv->dev, 0x8000, &fw[0x6000], len - 0x6000); in reset_atmel_card()
3958 The pre-wpa 3com firmware reports major version 5, in reset_atmel_card()
3960 the 3com broken-ness filter. */ in reset_atmel_card()
3961 priv->use_wpa = (priv->host_info.major_version == 4); in reset_atmel_card()
3962 priv->radio_on_broken = (priv->host_info.major_version == 5); in reset_atmel_card()
3973 priv->tx_desc_free = priv->host_info.tx_desc_count; in reset_atmel_card()
3974 priv->tx_desc_head = 0; in reset_atmel_card()
3975 priv->tx_desc_tail = 0; in reset_atmel_card()
3976 priv->tx_desc_previous = 0; in reset_atmel_card()
3977 priv->tx_free_mem = priv->host_info.tx_buff_size; in reset_atmel_card()
3978 priv->tx_buff_head = 0; in reset_atmel_card()
3979 priv->tx_buff_tail = 0; in reset_atmel_card()
3986 priv->rx_desc_head = 0; in reset_atmel_card()
3992 if (!priv->radio_on_broken) { in reset_atmel_card()
3996 dev->name); in reset_atmel_card()
3997 return -EIO; in reset_atmel_card()
4002 atmel_set_mib8(priv, Local_Mib_Type, LOCAL_MIB_AUTO_TX_RATE_POS, priv->auto_tx_rate); in reset_atmel_card()
4004 atmel_set_mib16(priv, Mac_Mib_Type, MAC_MIB_RTS_THRESHOLD_POS, priv->rts_threshold); in reset_atmel_card()
4005 atmel_set_mib16(priv, Mac_Mib_Type, MAC_MIB_FRAG_THRESHOLD_POS, priv->frag_threshold); in reset_atmel_card()
4006 atmel_set_mib8(priv, Mac_Mib_Type, MAC_MIB_SHORT_RETRY_POS, priv->short_retry); in reset_atmel_card()
4007 atmel_set_mib8(priv, Mac_Mib_Type, MAC_MIB_LONG_RETRY_POS, priv->long_retry); in reset_atmel_card()
4008 atmel_set_mib8(priv, Local_Mib_Type, LOCAL_MIB_PREAMBLE_TYPE, priv->preamble); in reset_atmel_card()
4010 priv->dev->dev_addr, 6); in reset_atmel_card()
4013 atmel_set_mib16(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_BEACON_PER_POS, priv->default_beacon_period); in reset_atmel_card()
4015 atmel_set_mib8(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_CUR_PRIVACY_POS, priv->wep_is_on); in reset_atmel_card()
4016 if (priv->use_wpa) in reset_atmel_card()
4028 wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL); in reset_atmel_card()
4038 atmel_copy_to_card(priv->dev, atmel_co(priv, CMD_BLOCK_PARAMETERS_OFFSET), in atmel_send_command()
4052 for (i = 5000; i; i--) { in atmel_send_command_wait()
4061 printk(KERN_ALERT "%s: failed to contact MAC.\n", priv->dev->name); in atmel_send_command_wait()
4073 struct get_set_mib m; in atmel_get_mib8() local
4074 m.type = type; in atmel_get_mib8()
4075 m.size = 1; in atmel_get_mib8()
4076 m.index = index; in atmel_get_mib8()
4078 atmel_send_command_wait(priv, CMD_Get_MIB_Vars, &m, MIB_HEADER_SIZE + 1); in atmel_get_mib8()
4084 struct get_set_mib m; in atmel_set_mib8() local
4085 m.type = type; in atmel_set_mib8()
4086 m.size = 1; in atmel_set_mib8()
4087 m.index = index; in atmel_set_mib8()
4088 m.data[0] = data; in atmel_set_mib8()
4090 atmel_send_command_wait(priv, CMD_Set_MIB_Vars, &m, MIB_HEADER_SIZE + 1); in atmel_set_mib8()
4096 struct get_set_mib m; in atmel_set_mib16() local
4097 m.type = type; in atmel_set_mib16()
4098 m.size = 2; in atmel_set_mib16()
4099 m.index = index; in atmel_set_mib16()
4100 m.data[0] = data; in atmel_set_mib16()
4101 m.data[1] = data >> 8; in atmel_set_mib16()
4103 atmel_send_command_wait(priv, CMD_Set_MIB_Vars, &m, MIB_HEADER_SIZE + 2); in atmel_set_mib16()
4109 struct get_set_mib m; in atmel_set_mib() local
4110 m.type = type; in atmel_set_mib()
4111 m.size = data_len; in atmel_set_mib()
4112 m.index = index; in atmel_set_mib()
4115 printk(KERN_ALERT "%s: MIB buffer too small.\n", priv->dev->name); in atmel_set_mib()
4117 memcpy(m.data, data, data_len); in atmel_set_mib()
4118 atmel_send_command_wait(priv, CMD_Set_MIB_Vars, &m, MIB_HEADER_SIZE + data_len); in atmel_set_mib()
4124 struct get_set_mib m; in atmel_get_mib() local
4125 m.type = type; in atmel_get_mib()
4126 m.size = data_len; in atmel_get_mib()
4127 m.index = index; in atmel_get_mib()
4130 printk(KERN_ALERT "%s: MIB buffer too small.\n", priv->dev->name); in atmel_get_mib()
4132 atmel_send_command_wait(priv, CMD_Get_MIB_Vars, &m, MIB_HEADER_SIZE + data_len); in atmel_get_mib()
4133 atmel_copy_to_host(priv->dev, data, in atmel_get_mib()
4140 outw(data, dev->base_addr + AR); in atmel_writeAR()
4142 for (i = 0; data != inw(dev->base_addr + AR) && i < 10; i++) in atmel_writeAR()
4143 outw(data, dev->base_addr + AR); in atmel_writeAR()
4153 src++; len--; in atmel_copy_to_card()
4155 for (i = len; i > 1 ; i -= 2) { in atmel_copy_to_card()
4171 dest++; len--; in atmel_copy_to_host()
4173 for (i = len; i > 1 ; i -= 2) { in atmel_copy_to_host()
4184 outw(inw(dev->base_addr + GCR) | mask, dev->base_addr + GCR); in atmel_set_gcr()
4189 outw(inw(dev->base_addr + GCR) & ~mask, dev->base_addr + GCR); in atmel_clear_gcr()
4196 for (i = 5000; i; i--) { in atmel_lock_mac()
4208 if (!j--) in atmel_lock_mac()
4218 atmel_writeAR(priv->dev, pos); in atmel_wmem32()
4219 atmel_write16(priv->dev, DR, data); /* card is little-endian */ in atmel_wmem32()
4220 atmel_write16(priv->dev, DR, data >> 16); in atmel_wmem32()
4270 .set SP_TDRE, 2 /* status register bit -- TDR empty */
4271 .set SP_RDRF, 1 /* status register bit -- RDR full */
4322 /* I'm guessing this is initializing clock generator electronics for SPI */
4501 …ldr r0, [r4, #SP_RDR] /* what's this byte? It's the byte read while writing the TDR -- nonsense, …