Lines Matching refs:ai

1108 static int enable_MAC(struct airo_info *ai, int lock);
1109 static void disable_MAC(struct airo_info *ai, int lock);
1132 static void mpi_receive_802_3(struct airo_info *ai);
1133 static void mpi_receive_802_11(struct airo_info *ai);
1134 static int waitbusy (struct airo_info *ai);
1147 static void micinit(struct airo_info *ai);
1148 static int micsetup(struct airo_info *ai);
1149 static int encapsulate(struct airo_info *ai, etherHead *pPacket, MICBuffer *buffer, int len);
1150 static int decapsulate(struct airo_info *ai, MICBuffer *mic, etherHead *pPacket, u16 payLen);
1155 static void airo_networks_free(struct airo_info *ai);
1251 static inline int bap_read(struct airo_info *ai, __le16 *pu16Dst, int bytelen, in bap_read() argument
1254 return ai->bap_read(ai, pu16Dst, bytelen, whichbap); in bap_read()
1262 static int cmdreset(struct airo_info *ai);
1263 static int setflashmode (struct airo_info *ai);
1264 static int flashgchar(struct airo_info *ai,int matchbyte,int dwelltime);
1265 static int flashputbuf(struct airo_info *ai);
1266 static int flashrestart(struct airo_info *ai,struct net_device *dev);
1290 static int RxSeqValid (struct airo_info *ai,miccntx *context,int mcast,u32 micSeq);
1297 static int flashpchar(struct airo_info *ai,int byte,int dwelltime);
1324 static void micinit(struct airo_info *ai) in micinit() argument
1328 clear_bit(JOB_MIC, &ai->jobs); in micinit()
1329 PC4500_readrid(ai, RID_MIC, &mic_rid, sizeof(mic_rid), 0); in micinit()
1330 up(&ai->sem); in micinit()
1332 ai->micstats.enabled = (le16_to_cpu(mic_rid.state) & 0x00FF) ? 1 : 0; in micinit()
1333 if (!ai->micstats.enabled) { in micinit()
1337 ai->mod[0].uCtx.valid = 0; in micinit()
1338 ai->mod[0].mCtx.valid = 0; in micinit()
1343 age_mic_context(&ai->mod[0].mCtx, &ai->mod[1].mCtx, in micinit()
1345 ai->tfm); in micinit()
1349 age_mic_context(&ai->mod[0].uCtx, &ai->mod[1].uCtx, in micinit()
1351 ai->tfm); in micinit()
1357 static int micsetup(struct airo_info *ai) { in micsetup() argument
1360 if (ai->tfm == NULL) in micsetup()
1361 ai->tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); in micsetup()
1363 if (IS_ERR(ai->tfm)) { in micsetup()
1364 airo_print_err(ai->dev->name, "failed to load transform for AES"); in micsetup()
1365 ai->tfm = NULL; in micsetup()
1370 memset(&ai->mod[i].mCtx,0,sizeof(miccntx)); in micsetup()
1371 memset(&ai->mod[i].uCtx,0,sizeof(miccntx)); in micsetup()
1394 static int encapsulate(struct airo_info *ai ,etherHead *frame, MICBuffer *mic, int payLen) in encapsulate() argument
1401 if (test_bit(FLAG_ADHOC, &ai->flags) && (frame->da[0] & 0x1)) in encapsulate()
1402 context = &ai->mod[0].mCtx; in encapsulate()
1404 context = &ai->mod[0].uCtx; in encapsulate()
1450 static int decapsulate(struct airo_info *ai, MICBuffer *mic, etherHead *eth, u16 payLen) in decapsulate() argument
1460 if (!ai->micstats.enabled) { in decapsulate()
1463 ai->micstats.rxMICPlummed++; in decapsulate()
1474 ai->micstats.rxMICPlummed++; in decapsulate()
1485 ai->micstats.rxWrongSequence++; in decapsulate()
1492 context = mcast ? &ai->mod[i].mCtx : &ai->mod[i].uCtx; in decapsulate()
1521 if (RxSeqValid(ai, context, mcast, micSEQ) == SUCCESS) { in decapsulate()
1522 ai->micstats.rxSuccess++; in decapsulate()
1531 case NOMICPLUMMED: ai->micstats.rxMICPlummed++; break; in decapsulate()
1532 case SEQUENCE: ai->micstats.rxWrongSequence++; break; in decapsulate()
1533 case INCORRECTMIC: ai->micstats.rxIncorrectMIC++; break; in decapsulate()
1554 static int RxSeqValid (struct airo_info *ai,miccntx *context,int mcast,u32 micSeq) in RxSeqValid() argument
1562 if (test_bit(FLAG_UPDATE_MULTI, &ai->flags)) { in RxSeqValid()
1563 clear_bit (FLAG_UPDATE_MULTI, &ai->flags); in RxSeqValid()
1567 } else if (test_bit(FLAG_UPDATE_UNI, &ai->flags)) { in RxSeqValid()
1568 clear_bit (FLAG_UPDATE_UNI, &ai->flags); in RxSeqValid()
1743 static int readBSSListRid(struct airo_info *ai, int first, in readBSSListRid() argument
1750 if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN; in readBSSListRid()
1753 if (down_interruptible(&ai->sem)) in readBSSListRid()
1755 ai->list_bss_task = current; in readBSSListRid()
1756 issuecommand(ai, &cmd, &rsp); in readBSSListRid()
1757 up(&ai->sem); in readBSSListRid()
1760 ai->list_bss_task = NULL; in readBSSListRid()
1762 return PC4500_readrid(ai, first ? ai->bssListFirst : ai->bssListNext, in readBSSListRid()
1763 list, ai->bssListRidLen, 1); in readBSSListRid()
1766 static int readWepKeyRid(struct airo_info *ai, WepKeyRid *wkr, int temp, int lock) in readWepKeyRid() argument
1768 return PC4500_readrid(ai, temp ? RID_WEP_TEMP : RID_WEP_PERM, in readWepKeyRid()
1772 static int writeWepKeyRid(struct airo_info *ai, WepKeyRid *wkr, int perm, int lock) in writeWepKeyRid() argument
1775 rc = PC4500_writerid(ai, RID_WEP_TEMP, wkr, sizeof(*wkr), lock); in writeWepKeyRid()
1777 airo_print_err(ai->dev->name, "WEP_TEMP set %x", rc); in writeWepKeyRid()
1779 rc = PC4500_writerid(ai, RID_WEP_PERM, wkr, sizeof(*wkr), lock); in writeWepKeyRid()
1781 airo_print_err(ai->dev->name, "WEP_PERM set %x", rc); in writeWepKeyRid()
1786 static int readSsidRid(struct airo_info*ai, SsidRid *ssidr) in readSsidRid() argument
1788 return PC4500_readrid(ai, RID_SSID, ssidr, sizeof(*ssidr), 1); in readSsidRid()
1791 static int writeSsidRid(struct airo_info*ai, SsidRid *pssidr, int lock) in writeSsidRid() argument
1793 return PC4500_writerid(ai, RID_SSID, pssidr, sizeof(*pssidr), lock); in writeSsidRid()
1796 static int readConfigRid(struct airo_info *ai, int lock) in readConfigRid() argument
1801 if (ai->config.len) in readConfigRid()
1804 rc = PC4500_readrid(ai, RID_ACTUALCONFIG, &cfg, sizeof(cfg), lock); in readConfigRid()
1808 ai->config = cfg; in readConfigRid()
1812 static inline void checkThrottle(struct airo_info *ai) in checkThrottle() argument
1816 if (ai->config.authType != AUTH_OPEN && maxencrypt) { in checkThrottle()
1818 if (ai->config.rates[i] > maxencrypt) { in checkThrottle()
1819 ai->config.rates[i] = 0; in checkThrottle()
1825 static int writeConfigRid(struct airo_info *ai, int lock) in writeConfigRid() argument
1829 if (!test_bit (FLAG_COMMIT, &ai->flags)) in writeConfigRid()
1832 clear_bit (FLAG_COMMIT, &ai->flags); in writeConfigRid()
1833 clear_bit (FLAG_RESET, &ai->flags); in writeConfigRid()
1834 checkThrottle(ai); in writeConfigRid()
1835 cfgr = ai->config; in writeConfigRid()
1838 set_bit(FLAG_ADHOC, &ai->flags); in writeConfigRid()
1840 clear_bit(FLAG_ADHOC, &ai->flags); in writeConfigRid()
1842 return PC4500_writerid( ai, RID_CONFIG, &cfgr, sizeof(cfgr), lock); in writeConfigRid()
1845 static int readStatusRid(struct airo_info *ai, StatusRid *statr, int lock) in readStatusRid() argument
1847 return PC4500_readrid(ai, RID_STATUS, statr, sizeof(*statr), lock); in readStatusRid()
1850 static int readAPListRid(struct airo_info *ai, APListRid *aplr) in readAPListRid() argument
1852 return PC4500_readrid(ai, RID_APLIST, aplr, sizeof(*aplr), 1); in readAPListRid()
1855 static int writeAPListRid(struct airo_info *ai, APListRid *aplr, int lock) in writeAPListRid() argument
1857 return PC4500_writerid(ai, RID_APLIST, aplr, sizeof(*aplr), lock); in writeAPListRid()
1860 static int readCapabilityRid(struct airo_info *ai, CapabilityRid *capr, int lock) in readCapabilityRid() argument
1862 return PC4500_readrid(ai, RID_CAPABILITIES, capr, sizeof(*capr), lock); in readCapabilityRid()
1865 static int readStatsRid(struct airo_info*ai, StatsRid *sr, int rid, int lock) in readStatsRid() argument
1867 return PC4500_readrid(ai, rid, sr, sizeof(*sr), lock); in readStatsRid()
1870 static void try_auto_wep(struct airo_info *ai) in try_auto_wep() argument
1872 if (auto_wep && !test_bit(FLAG_RADIO_DOWN, &ai->flags)) { in try_auto_wep()
1873 ai->expires = RUN_AT(3*HZ); in try_auto_wep()
1874 wake_up_interruptible(&ai->thr_wait); in try_auto_wep()
1879 struct airo_info *ai = dev->ml_priv; in airo_open() local
1882 if (test_bit(FLAG_FLASHING, &ai->flags)) in airo_open()
1889 if (test_bit(FLAG_COMMIT, &ai->flags)) { in airo_open()
1890 disable_MAC(ai, 1); in airo_open()
1891 writeConfigRid(ai, 1); in airo_open()
1894 if (ai->wifidev != dev) { in airo_open()
1895 clear_bit(JOB_DIE, &ai->jobs); in airo_open()
1896 ai->airo_thread_task = kthread_run(airo_thread, dev, "%s", in airo_open()
1898 if (IS_ERR(ai->airo_thread_task)) in airo_open()
1899 return (int)PTR_ERR(ai->airo_thread_task); in airo_open()
1907 set_bit(JOB_DIE, &ai->jobs); in airo_open()
1908 kthread_stop(ai->airo_thread_task); in airo_open()
1913 clear_bit(FLAG_RADIO_DOWN, &ai->flags); in airo_open()
1914 enable_interrupts(ai); in airo_open()
1916 try_auto_wep(ai); in airo_open()
1918 enable_MAC(ai, 1); in airo_open()
1929 struct airo_info *ai = dev->ml_priv; in mpi_start_xmit() local
1935 npacks = skb_queue_len (&ai->txq); in mpi_start_xmit()
1943 skb_queue_tail (&ai->txq, skb); in mpi_start_xmit()
1947 spin_lock_irqsave(&ai->aux_lock, flags); in mpi_start_xmit()
1948 skb_queue_tail (&ai->txq, skb); in mpi_start_xmit()
1949 pending = test_bit(FLAG_PENDING_XMIT, &ai->flags); in mpi_start_xmit()
1950 spin_unlock_irqrestore(&ai->aux_lock,flags); in mpi_start_xmit()
1954 set_bit(FLAG_PENDING_XMIT, &ai->flags); in mpi_start_xmit()
1973 struct airo_info *ai = dev->ml_priv; in mpi_send_packet() local
1978 if ((skb = skb_dequeue(&ai->txq)) == NULL) { in mpi_send_packet()
1989 ai->txfids[0].tx_desc.offset = 0; in mpi_send_packet()
1990 ai->txfids[0].tx_desc.valid = 1; in mpi_send_packet()
1991 ai->txfids[0].tx_desc.eoc = 1; in mpi_send_packet()
1992 ai->txfids[0].tx_desc.len =len+sizeof(WifiHdr); in mpi_send_packet()
2002 memcpy(ai->txfids[0].virtual_host_addr, in mpi_send_packet()
2005 payloadLen = (__le16 *)(ai->txfids[0].virtual_host_addr + in mpi_send_packet()
2007 sendbuf = ai->txfids[0].virtual_host_addr + in mpi_send_packet()
2014 if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && in mpi_send_packet()
2018 if (encapsulate(ai, (etherHead *)buffer, &pMic, len - sizeof(etherHead)) != SUCCESS) in mpi_send_packet()
2022 ai->txfids[0].tx_desc.len += sizeof(pMic); in mpi_send_packet()
2039 memcpy_toio(ai->txfids[0].card_ram_off, in mpi_send_packet()
2040 &ai->txfids[0].tx_desc, sizeof(TxFid)); in mpi_send_packet()
2042 OUT4500(ai, EVACK, 8); in mpi_send_packet()
2048 static void get_tx_error(struct airo_info *ai, s32 fid) in get_tx_error() argument
2053 status = ((WifiCtlHdr *)ai->txfids[0].virtual_host_addr)->ctlhdr.status; in get_tx_error()
2055 if (bap_setup(ai, ai->fids[fid] & 0xffff, 4, BAP0) != SUCCESS) in get_tx_error()
2057 bap_read(ai, &status, 2, BAP0); in get_tx_error()
2060 ai->dev->stats.tx_aborted_errors++; in get_tx_error()
2062 ai->dev->stats.tx_heartbeat_errors++; in get_tx_error()
2066 ai->dev->stats.tx_carrier_errors++; in get_tx_error()
2081 bap_read(ai, (__le16 *) junk, 0x18, BAP0); in get_tx_error()
2095 wireless_send_event(ai->dev, IWEVTXDROP, &wrqu, NULL); in get_tx_error()
2242 struct airo_info *ai = dev->ml_priv; in airo_read_stats() local
2246 clear_bit(JOB_STATS, &ai->jobs); in airo_read_stats()
2247 if (ai->power.event) { in airo_read_stats()
2248 up(&ai->sem); in airo_read_stats()
2251 readStatsRid(ai, &stats_rid, RID_STATS, 0); in airo_read_stats()
2252 up(&ai->sem); in airo_read_stats()
2290 static void airo_set_promisc(struct airo_info *ai) { in airo_set_promisc() argument
2296 clear_bit(JOB_PROMISC, &ai->jobs); in airo_set_promisc()
2297 cmd.parm0=(ai->flags&IFF_PROMISC) ? PROMISC : NOPROMISC; in airo_set_promisc()
2298 issuecommand(ai, &cmd, &rsp); in airo_set_promisc()
2299 up(&ai->sem); in airo_set_promisc()
2303 struct airo_info *ai = dev->ml_priv; in airo_set_multicast_list() local
2305 if ((dev->flags ^ ai->flags) & IFF_PROMISC) { in airo_set_multicast_list()
2306 change_bit(FLAG_PROMISC, &ai->flags); in airo_set_multicast_list()
2307 if (down_trylock(&ai->sem) != 0) { in airo_set_multicast_list()
2308 set_bit(JOB_PROMISC, &ai->jobs); in airo_set_multicast_list()
2309 wake_up_interruptible(&ai->thr_wait); in airo_set_multicast_list()
2311 airo_set_promisc(ai); in airo_set_multicast_list()
2321 struct airo_info *ai = dev->ml_priv; in airo_set_mac_address() local
2324 readConfigRid(ai, 1); in airo_set_mac_address()
2325 memcpy (ai->config.macAddr, addr->sa_data, dev->addr_len); in airo_set_mac_address()
2326 set_bit (FLAG_COMMIT, &ai->flags); in airo_set_mac_address()
2327 disable_MAC(ai, 1); in airo_set_mac_address()
2328 writeConfigRid (ai, 1); in airo_set_mac_address()
2329 enable_MAC(ai, 1); in airo_set_mac_address()
2330 memcpy (ai->dev->dev_addr, addr->sa_data, dev->addr_len); in airo_set_mac_address()
2331 if (ai->wifidev) in airo_set_mac_address()
2332 memcpy (ai->wifidev->dev_addr, addr->sa_data, dev->addr_len); in airo_set_mac_address()
2346 static void add_airo_dev(struct airo_info *ai) in add_airo_dev() argument
2350 if (!ai->pci) in add_airo_dev()
2351 list_add_tail(&ai->dev_list, &airo_devices); in add_airo_dev()
2354 static void del_airo_dev(struct airo_info *ai) in del_airo_dev() argument
2356 if (!ai->pci) in del_airo_dev()
2357 list_del(&ai->dev_list); in del_airo_dev()
2361 struct airo_info *ai = dev->ml_priv; in airo_close() local
2365 if (ai->wifidev != dev) { in airo_close()
2372 set_bit(FLAG_RADIO_DOWN, &ai->flags); in airo_close()
2373 disable_MAC(ai, 1); in airo_close()
2375 disable_interrupts( ai ); in airo_close()
2379 set_bit(JOB_DIE, &ai->jobs); in airo_close()
2380 kthread_stop(ai->airo_thread_task); in airo_close()
2387 struct airo_info *ai = dev->ml_priv; in stop_airo_card() local
2389 set_bit(FLAG_RADIO_DOWN, &ai->flags); in stop_airo_card()
2390 disable_MAC(ai, 1); in stop_airo_card()
2391 disable_interrupts(ai); in stop_airo_card()
2392 takedown_proc_entry( dev, ai ); in stop_airo_card()
2393 if (test_bit(FLAG_REGISTERED, &ai->flags)) { in stop_airo_card()
2395 if (ai->wifidev) { in stop_airo_card()
2396 unregister_netdev(ai->wifidev); in stop_airo_card()
2397 free_netdev(ai->wifidev); in stop_airo_card()
2398 ai->wifidev = NULL; in stop_airo_card()
2400 clear_bit(FLAG_REGISTERED, &ai->flags); in stop_airo_card()
2405 if (test_bit(FLAG_MPI, &ai->flags) && !skb_queue_empty(&ai->txq)) { in stop_airo_card()
2407 for (;(skb = skb_dequeue(&ai->txq));) in stop_airo_card()
2411 airo_networks_free (ai); in stop_airo_card()
2413 kfree(ai->flash); in stop_airo_card()
2414 kfree(ai->rssi); in stop_airo_card()
2415 kfree(ai->APList); in stop_airo_card()
2416 kfree(ai->SSID); in stop_airo_card()
2420 if (test_bit(FLAG_MPI, &ai->flags)) { in stop_airo_card()
2421 if (ai->pci) in stop_airo_card()
2422 mpi_unmap_card(ai->pci); in stop_airo_card()
2423 if (ai->pcimem) in stop_airo_card()
2424 iounmap(ai->pcimem); in stop_airo_card()
2425 if (ai->pciaux) in stop_airo_card()
2426 iounmap(ai->pciaux); in stop_airo_card()
2427 pci_free_consistent(ai->pci, PCI_SHARED_LEN, in stop_airo_card()
2428 ai->shared, ai->shared_dma); in stop_airo_card()
2431 crypto_free_cipher(ai->tfm); in stop_airo_card()
2432 del_airo_dev(ai); in stop_airo_card()
2462 static int mpi_init_descriptors (struct airo_info *ai) in mpi_init_descriptors() argument
2470 netif_stop_queue(ai->dev); in mpi_init_descriptors()
2477 cmd.parm1 = (ai->rxfids[0].card_ram_off - ai->pciaux); in mpi_init_descriptors()
2479 rc=issuecommand(ai, &cmd, &rsp); in mpi_init_descriptors()
2481 airo_print_err(ai->dev->name, "Couldn't allocate RX FID"); in mpi_init_descriptors()
2486 memcpy_toio(ai->rxfids[i].card_ram_off, in mpi_init_descriptors()
2487 &ai->rxfids[i].rx_desc, sizeof(RxFid)); in mpi_init_descriptors()
2497 cmd.parm1 = (ai->txfids[0].card_ram_off - ai->pciaux); in mpi_init_descriptors()
2501 ai->txfids[i].tx_desc.valid = 1; in mpi_init_descriptors()
2502 memcpy_toio(ai->txfids[i].card_ram_off, in mpi_init_descriptors()
2503 &ai->txfids[i].tx_desc, sizeof(TxFid)); in mpi_init_descriptors()
2505 ai->txfids[i-1].tx_desc.eoc = 1; /* Last descriptor has EOC set */ in mpi_init_descriptors()
2507 rc=issuecommand(ai, &cmd, &rsp); in mpi_init_descriptors()
2509 airo_print_err(ai->dev->name, "Couldn't allocate TX FID"); in mpi_init_descriptors()
2519 cmd.parm1 = (ai->config_desc.card_ram_off - ai->pciaux); in mpi_init_descriptors()
2521 rc=issuecommand(ai, &cmd, &rsp); in mpi_init_descriptors()
2523 airo_print_err(ai->dev->name, "Couldn't allocate RID"); in mpi_init_descriptors()
2527 memcpy_toio(ai->config_desc.card_ram_off, in mpi_init_descriptors()
2528 &ai->config_desc.rid_desc, sizeof(Rid)); in mpi_init_descriptors()
2539 static int mpi_map_card(struct airo_info *ai, struct pci_dev *pci) in mpi_map_card() argument
2564 ai->pcimem = ioremap(mem_start, mem_len); in mpi_map_card()
2565 if (!ai->pcimem) { in mpi_map_card()
2570 ai->pciaux = ioremap(aux_start, aux_len); in mpi_map_card()
2571 if (!ai->pciaux) { in mpi_map_card()
2578 ai->shared = pci_alloc_consistent(pci, PCI_SHARED_LEN, &ai->shared_dma); in mpi_map_card()
2579 if (!ai->shared) { in mpi_map_card()
2588 busaddroff = ai->shared_dma; in mpi_map_card()
2589 pciaddroff = ai->pciaux + AUX_OFFSET; in mpi_map_card()
2590 vpackoff = ai->shared; in mpi_map_card()
2594 ai->rxfids[i].pending = 0; in mpi_map_card()
2595 ai->rxfids[i].card_ram_off = pciaddroff; in mpi_map_card()
2596 ai->rxfids[i].virtual_host_addr = vpackoff; in mpi_map_card()
2597 ai->rxfids[i].rx_desc.host_addr = busaddroff; in mpi_map_card()
2598 ai->rxfids[i].rx_desc.valid = 1; in mpi_map_card()
2599 ai->rxfids[i].rx_desc.len = PKTSIZE; in mpi_map_card()
2600 ai->rxfids[i].rx_desc.rdy = 0; in mpi_map_card()
2609 ai->txfids[i].card_ram_off = pciaddroff; in mpi_map_card()
2610 ai->txfids[i].virtual_host_addr = vpackoff; in mpi_map_card()
2611 ai->txfids[i].tx_desc.valid = 1; in mpi_map_card()
2612 ai->txfids[i].tx_desc.host_addr = busaddroff; in mpi_map_card()
2613 memcpy(ai->txfids[i].virtual_host_addr, in mpi_map_card()
2620 ai->txfids[i-1].tx_desc.eoc = 1; /* Last descriptor has EOC set */ in mpi_map_card()
2623 ai->config_desc.card_ram_off = pciaddroff; in mpi_map_card()
2624 ai->config_desc.virtual_host_addr = vpackoff; in mpi_map_card()
2625 ai->config_desc.rid_desc.host_addr = busaddroff; in mpi_map_card()
2626 ai->ridbus = busaddroff; in mpi_map_card()
2627 ai->config_desc.rid_desc.rid = 0; in mpi_map_card()
2628 ai->config_desc.rid_desc.len = RIDSIZE; in mpi_map_card()
2629 ai->config_desc.rid_desc.valid = 1; in mpi_map_card()
2635 if (mpi_init_descriptors (ai) != SUCCESS) in mpi_map_card()
2640 pci_free_consistent(pci, PCI_SHARED_LEN, ai->shared, ai->shared_dma); in mpi_map_card()
2642 iounmap(ai->pciaux); in mpi_map_card()
2644 iounmap(ai->pcimem); in mpi_map_card()
2684 static struct net_device *init_wifidev(struct airo_info *ai, in init_wifidev() argument
2707 struct airo_info *ai = dev->ml_priv; in reset_card() local
2709 if (lock && down_interruptible(&ai->sem)) in reset_card()
2711 waitbusy (ai); in reset_card()
2712 OUT4500(ai,COMMAND,CMD_SOFTRESET); in reset_card()
2714 waitbusy (ai); in reset_card()
2717 up(&ai->sem); in reset_card()
2722 static int airo_networks_allocate(struct airo_info *ai) in airo_networks_allocate() argument
2724 if (ai->networks) in airo_networks_allocate()
2727 ai->networks = kcalloc(AIRO_MAX_NETWORK_COUNT, sizeof(BSSListElement), in airo_networks_allocate()
2729 if (!ai->networks) { in airo_networks_allocate()
2737 static void airo_networks_free(struct airo_info *ai) in airo_networks_free() argument
2739 kfree(ai->networks); in airo_networks_free()
2740 ai->networks = NULL; in airo_networks_free()
2743 static void airo_networks_initialize(struct airo_info *ai) in airo_networks_initialize() argument
2747 INIT_LIST_HEAD(&ai->network_free_list); in airo_networks_initialize()
2748 INIT_LIST_HEAD(&ai->network_list); in airo_networks_initialize()
2750 list_add_tail(&ai->networks[i].list, in airo_networks_initialize()
2751 &ai->network_free_list); in airo_networks_initialize()
2784 struct airo_info *ai; in _init_airo_card() local
2789 dev = alloc_netdev(sizeof(*ai), "", NET_NAME_UNKNOWN, ether_setup); in _init_airo_card()
2795 ai = dev->ml_priv = netdev_priv(dev); in _init_airo_card()
2796 ai->wifidev = NULL; in _init_airo_card()
2797 ai->flags = 1 << FLAG_RADIO_DOWN; in _init_airo_card()
2798 ai->jobs = 0; in _init_airo_card()
2799 ai->dev = dev; in _init_airo_card()
2802 set_bit(FLAG_MPI, &ai->flags); in _init_airo_card()
2804 spin_lock_init(&ai->aux_lock); in _init_airo_card()
2805 sema_init(&ai->sem, 1); in _init_airo_card()
2806 ai->config.len = 0; in _init_airo_card()
2807 ai->pci = pci; in _init_airo_card()
2808 init_waitqueue_head (&ai->thr_wait); in _init_airo_card()
2809 ai->tfm = NULL; in _init_airo_card()
2810 add_airo_dev(ai); in _init_airo_card()
2812 if (airo_networks_allocate (ai)) in _init_airo_card()
2814 airo_networks_initialize (ai); in _init_airo_card()
2816 skb_queue_head_init (&ai->txq); in _init_airo_card()
2819 if (test_bit(FLAG_MPI,&ai->flags)) in _init_airo_card()
2824 ai->wireless_data.spy_data = &ai->spy_data; in _init_airo_card()
2825 dev->wireless_data = &ai->wireless_data; in _init_airo_card()
2843 if (test_bit(FLAG_MPI,&ai->flags)) { in _init_airo_card()
2844 if (mpi_map_card(ai, pci)) { in _init_airo_card()
2851 if (setup_card(ai, dev->dev_addr, 1) != SUCCESS) { in _init_airo_card()
2856 } else if (!test_bit(FLAG_MPI,&ai->flags)) { in _init_airo_card()
2857 ai->bap_read = fast_bap_read; in _init_airo_card()
2858 set_bit(FLAG_FLASHING, &ai->flags); in _init_airo_card()
2867 ai->wifidev = init_wifidev(ai, dev); in _init_airo_card()
2868 if (!ai->wifidev) in _init_airo_card()
2871 rc = readCapabilityRid(ai, &cap_rid, 1); in _init_airo_card()
2877 ai->wep_capable = (cap_rid.softCap & cpu_to_le16(0x02)) ? 1 : 0; in _init_airo_card()
2878 ai->max_wep_idx = (cap_rid.softCap & cpu_to_le16(0x80)) ? 3 : 0; in _init_airo_card()
2890 airo_print_info(ai->dev->name, "WPA supported."); in _init_airo_card()
2892 set_bit(FLAG_WPA_CAPABLE, &ai->flags); in _init_airo_card()
2893 ai->bssListFirst = RID_WPA_BSSLISTFIRST; in _init_airo_card()
2894 ai->bssListNext = RID_WPA_BSSLISTNEXT; in _init_airo_card()
2895 ai->bssListRidLen = sizeof(BSSListRid); in _init_airo_card()
2897 airo_print_info(ai->dev->name, "WPA unsupported with firmware " in _init_airo_card()
2900 ai->bssListFirst = RID_BSSLISTFIRST; in _init_airo_card()
2901 ai->bssListNext = RID_BSSLISTNEXT; in _init_airo_card()
2902 ai->bssListRidLen = sizeof(BSSListRid) - sizeof(BSSListRidExtra); in _init_airo_card()
2905 set_bit(FLAG_REGISTERED,&ai->flags); in _init_airo_card()
2909 if (probe && !test_bit(FLAG_MPI,&ai->flags)) in _init_airo_card()
2911 ai->fids[i] = transmit_allocate(ai,AIRO_DEF_MTU,i>=MAX_FIDS/2); in _init_airo_card()
2919 unregister_netdev(ai->wifidev); in _init_airo_card()
2920 free_netdev(ai->wifidev); in _init_airo_card()
2924 if (test_bit(FLAG_MPI,&ai->flags) && pci) { in _init_airo_card()
2925 pci_free_consistent(pci, PCI_SHARED_LEN, ai->shared, ai->shared_dma); in _init_airo_card()
2926 iounmap(ai->pciaux); in _init_airo_card()
2927 iounmap(ai->pcimem); in _init_airo_card()
2928 mpi_unmap_card(ai->pci); in _init_airo_card()
2934 airo_networks_free(ai); in _init_airo_card()
2936 del_airo_dev(ai); in _init_airo_card()
2949 static int waitbusy (struct airo_info *ai) { in waitbusy() argument
2951 while ((IN4500(ai, COMMAND) & COMMAND_BUSY) && (delay < 10000)) { in waitbusy()
2954 OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY); in waitbusy()
2962 struct airo_info *ai = dev->ml_priv; in reset_airo_card() local
2967 if ( setup_card(ai, dev->dev_addr, 1 ) != SUCCESS ) { in reset_airo_card()
2973 if (!test_bit(FLAG_MPI,&ai->flags)) in reset_airo_card()
2975 ai->fids[i] = transmit_allocate (ai,AIRO_DEF_MTU,i>=MAX_FIDS/2); in reset_airo_card()
2977 enable_interrupts( ai ); in reset_airo_card()
2985 struct airo_info *ai = dev->ml_priv; in airo_send_event() local
2989 clear_bit(JOB_EVENT, &ai->jobs); in airo_send_event()
2990 PC4500_readrid(ai, RID_STATUS, &status_rid, sizeof(status_rid), 0); in airo_send_event()
2991 up(&ai->sem); in airo_send_event()
3001 static void airo_process_scan_results (struct airo_info *ai) { in airo_process_scan_results() argument
3009 list_for_each_entry_safe (loop_net, tmp_net, &ai->network_list, list) { in airo_process_scan_results()
3010 list_move_tail (&loop_net->list, &ai->network_free_list); in airo_process_scan_results()
3016 rc = PC4500_readrid(ai, ai->bssListFirst, &bss, ai->bssListRidLen, 0); in airo_process_scan_results()
3026 if (!list_empty(&ai->network_free_list)) { in airo_process_scan_results()
3027 tmp_net = list_entry(ai->network_free_list.next, in airo_process_scan_results()
3029 list_del(ai->network_free_list.next); in airo_process_scan_results()
3034 list_add_tail(&tmp_net->list, &ai->network_list); in airo_process_scan_results()
3039 rc = PC4500_readrid(ai, ai->bssListNext, in airo_process_scan_results()
3040 &bss, ai->bssListRidLen, 0); in airo_process_scan_results()
3044 ai->scan_timeout = 0; in airo_process_scan_results()
3045 clear_bit(JOB_SCAN_RESULTS, &ai->jobs); in airo_process_scan_results()
3046 up(&ai->sem); in airo_process_scan_results()
3057 wireless_send_event(ai->dev, SIOCGIWSCAN, &wrqu, NULL); in airo_process_scan_results()
3062 struct airo_info *ai = dev->ml_priv; in airo_thread() local
3070 if (test_bit(JOB_DIE, &ai->jobs)) in airo_thread()
3073 if (ai->jobs) { in airo_thread()
3074 locked = down_interruptible(&ai->sem); in airo_thread()
3079 add_wait_queue(&ai->thr_wait, &wait); in airo_thread()
3082 if (ai->jobs) in airo_thread()
3084 if (ai->expires || ai->scan_timeout) { in airo_thread()
3085 if (ai->scan_timeout && in airo_thread()
3086 time_after_eq(jiffies,ai->scan_timeout)){ in airo_thread()
3087 set_bit(JOB_SCAN_RESULTS, &ai->jobs); in airo_thread()
3089 } else if (ai->expires && in airo_thread()
3090 time_after_eq(jiffies,ai->expires)){ in airo_thread()
3091 set_bit(JOB_AUTOWEP, &ai->jobs); in airo_thread()
3097 if (!ai->expires || !ai->scan_timeout) { in airo_thread()
3098 wake_at = max(ai->expires, in airo_thread()
3099 ai->scan_timeout); in airo_thread()
3101 wake_at = min(ai->expires, in airo_thread()
3102 ai->scan_timeout); in airo_thread()
3115 remove_wait_queue(&ai->thr_wait, &wait); in airo_thread()
3122 if (test_bit(JOB_DIE, &ai->jobs)) { in airo_thread()
3123 up(&ai->sem); in airo_thread()
3127 if (ai->power.event || test_bit(FLAG_FLASHING, &ai->flags)) { in airo_thread()
3128 up(&ai->sem); in airo_thread()
3132 if (test_bit(JOB_XMIT, &ai->jobs)) in airo_thread()
3134 else if (test_bit(JOB_XMIT11, &ai->jobs)) in airo_thread()
3136 else if (test_bit(JOB_STATS, &ai->jobs)) in airo_thread()
3138 else if (test_bit(JOB_WSTATS, &ai->jobs)) in airo_thread()
3139 airo_read_wireless_stats(ai); in airo_thread()
3140 else if (test_bit(JOB_PROMISC, &ai->jobs)) in airo_thread()
3141 airo_set_promisc(ai); in airo_thread()
3142 else if (test_bit(JOB_MIC, &ai->jobs)) in airo_thread()
3143 micinit(ai); in airo_thread()
3144 else if (test_bit(JOB_EVENT, &ai->jobs)) in airo_thread()
3146 else if (test_bit(JOB_AUTOWEP, &ai->jobs)) in airo_thread()
3148 else if (test_bit(JOB_SCAN_RESULTS, &ai->jobs)) in airo_thread()
3149 airo_process_scan_results(ai); in airo_thread()
3151 up(&ai->sem); in airo_thread()
3172 static void airo_handle_cisco_mic(struct airo_info *ai) in airo_handle_cisco_mic() argument
3174 if (test_bit(FLAG_MIC_CAPABLE, &ai->flags)) { in airo_handle_cisco_mic()
3175 set_bit(JOB_MIC, &ai->jobs); in airo_handle_cisco_mic()
3176 wake_up_interruptible(&ai->thr_wait); in airo_handle_cisco_mic()
3241 static void airo_handle_link(struct airo_info *ai) in airo_handle_link() argument
3248 status = le16_to_cpu(IN4500(ai, LINKSTAT)); in airo_handle_link()
3249 OUT4500(ai, EVACK, EV_LINK); in airo_handle_link()
3251 if ((status == STAT_FORCELOSS) && (ai->scan_timeout > 0)) in airo_handle_link()
3254 airo_print_status(ai->dev->name, status); in airo_handle_link()
3258 ai->expires = 0; in airo_handle_link()
3259 if (ai->list_bss_task) in airo_handle_link()
3260 wake_up_process(ai->list_bss_task); in airo_handle_link()
3261 set_bit(FLAG_UPDATE_UNI, &ai->flags); in airo_handle_link()
3262 set_bit(FLAG_UPDATE_MULTI, &ai->flags); in airo_handle_link()
3264 if (down_trylock(&ai->sem) != 0) { in airo_handle_link()
3265 set_bit(JOB_EVENT, &ai->jobs); in airo_handle_link()
3266 wake_up_interruptible(&ai->thr_wait); in airo_handle_link()
3268 airo_send_event(ai->dev); in airo_handle_link()
3270 if (auto_wep && !ai->expires) { in airo_handle_link()
3271 ai->expires = RUN_AT(3*HZ); in airo_handle_link()
3272 wake_up_interruptible(&ai->thr_wait); in airo_handle_link()
3278 wireless_send_event(ai->dev, SIOCGIWAP, &wrqu, NULL); in airo_handle_link()
3282 static void airo_handle_rx(struct airo_info *ai) in airo_handle_rx() argument
3290 if (test_bit(FLAG_MPI, &ai->flags)) { in airo_handle_rx()
3291 if (test_bit(FLAG_802_11, &ai->flags)) in airo_handle_rx()
3292 mpi_receive_802_11(ai); in airo_handle_rx()
3294 mpi_receive_802_3(ai); in airo_handle_rx()
3295 OUT4500(ai, EVACK, EV_RX); in airo_handle_rx()
3299 fid = IN4500(ai, RXFID); in airo_handle_rx()
3302 if (test_bit(FLAG_802_11, &ai->flags)) { in airo_handle_rx()
3303 bap_setup (ai, fid, 4, BAP0); in airo_handle_rx()
3304 bap_read (ai, (__le16*)&hdr, sizeof(hdr), BAP0); in airo_handle_rx()
3308 if (ai->wifidev == NULL) in airo_handle_rx()
3311 bap_setup(ai, fid, 0x36, BAP0); in airo_handle_rx()
3312 bap_read(ai, &hdr.len, 2, BAP0); in airo_handle_rx()
3317 airo_print_err(ai->dev->name, "Bad size %d", len); in airo_handle_rx()
3323 if (test_bit(FLAG_802_11, &ai->flags)) { in airo_handle_rx()
3324 bap_read(ai, &fc, sizeof (fc), BAP0); in airo_handle_rx()
3331 ai->dev->stats.rx_dropped++; in airo_handle_rx()
3337 if (test_bit(FLAG_802_11, &ai->flags)) { in airo_handle_rx()
3339 bap_read(ai, buffer + 1, hdrlen - 2, BAP0); in airo_handle_rx()
3341 bap_read(ai, tmpbuf, 6, BAP0); in airo_handle_rx()
3343 bap_read(ai, &v, sizeof(v), BAP0); in airo_handle_rx()
3347 bap_read(ai, tmpbuf, gap, BAP0); in airo_handle_rx()
3349 airo_print_err(ai->dev->name, "gaplen too " in airo_handle_rx()
3353 bap_read(ai, buffer + hdrlen/2, len, BAP0); in airo_handle_rx()
3357 bap_read(ai, buffer, ETH_ALEN * 2, BAP0); in airo_handle_rx()
3358 if (ai->micstats.enabled) { in airo_handle_rx()
3359 bap_read(ai, (__le16 *) &micbuf, sizeof (micbuf), BAP0); in airo_handle_rx()
3361 bap_setup(ai, fid, 0x44, BAP0); in airo_handle_rx()
3373 bap_read(ai, buffer + ETH_ALEN, len, BAP0); in airo_handle_rx()
3374 if (decapsulate(ai, &micbuf, (etherHead*) buffer, len)) in airo_handle_rx()
3381 if (success && (ai->spy_data.spy_number > 0)) { in airo_handle_rx()
3386 if (!test_bit(FLAG_802_11, &ai->flags)) { in airo_handle_rx()
3388 bap_setup(ai, fid, 8, BAP0); in airo_handle_rx()
3389 bap_read(ai, (__le16 *) hdr.rssi, 2, BAP0); in airo_handle_rx()
3393 if (ai->rssi) in airo_handle_rx()
3394 wstats.level = 0x100 - ai->rssi[hdr.rssi[1]].rssidBm; in airo_handle_rx()
3397 wstats.noise = ai->wstats.qual.noise; in airo_handle_rx()
3402 wireless_spy_update(ai->dev, sa, &wstats); in airo_handle_rx()
3407 OUT4500(ai, EVACK, EV_RX); in airo_handle_rx()
3410 if (test_bit(FLAG_802_11, &ai->flags)) { in airo_handle_rx()
3413 skb->dev = ai->wifidev; in airo_handle_rx()
3416 skb->protocol = eth_type_trans(skb, ai->dev); in airo_handle_rx()
3423 static void airo_handle_tx(struct airo_info *ai, u16 status) in airo_handle_tx() argument
3428 if (test_bit(FLAG_MPI, &ai->flags)) { in airo_handle_tx()
3432 get_tx_error(ai, -1); in airo_handle_tx()
3434 spin_lock_irqsave(&ai->aux_lock, flags); in airo_handle_tx()
3435 if (!skb_queue_empty(&ai->txq)) { in airo_handle_tx()
3436 spin_unlock_irqrestore(&ai->aux_lock,flags); in airo_handle_tx()
3437 mpi_send_packet(ai->dev); in airo_handle_tx()
3439 clear_bit(FLAG_PENDING_XMIT, &ai->flags); in airo_handle_tx()
3440 spin_unlock_irqrestore(&ai->aux_lock,flags); in airo_handle_tx()
3441 netif_wake_queue(ai->dev); in airo_handle_tx()
3443 OUT4500(ai, EVACK, status & (EV_TX | EV_TXCPY | EV_TXEXC)); in airo_handle_tx()
3447 fid = IN4500(ai, TXCOMPLFID); in airo_handle_tx()
3450 if ((ai->fids[i] & 0xffff) == fid) { in airo_handle_tx()
3451 len = ai->fids[i] >> 16; in airo_handle_tx()
3458 get_tx_error(ai, index); in airo_handle_tx()
3460 OUT4500(ai, EVACK, status & (EV_TX | EV_TXEXC)); in airo_handle_tx()
3463 ai->fids[index] &= 0xffff; in airo_handle_tx()
3465 if (!test_bit(FLAG_PENDING_XMIT, &ai->flags)) in airo_handle_tx()
3466 netif_wake_queue(ai->dev); in airo_handle_tx()
3468 if (!test_bit(FLAG_PENDING_XMIT11, &ai->flags)) in airo_handle_tx()
3469 netif_wake_queue(ai->wifidev); in airo_handle_tx()
3472 OUT4500(ai, EVACK, status & (EV_TX | EV_TXCPY | EV_TXEXC)); in airo_handle_tx()
3473 airo_print_err(ai->dev->name, "Unallocated FID was used to xmit"); in airo_handle_tx()
3481 struct airo_info *ai = dev->ml_priv; in airo_interrupt() local
3488 status = IN4500(ai, EVSTAT); in airo_interrupt()
3495 OUT4500(ai, EVACK, EV_AWAKE); in airo_interrupt()
3496 OUT4500(ai, EVACK, EV_AWAKE); in airo_interrupt()
3500 savedInterrupts = IN4500(ai, EVINTEN); in airo_interrupt()
3501 OUT4500(ai, EVINTEN, 0); in airo_interrupt()
3505 OUT4500(ai, EVACK, EV_MIC); in airo_interrupt()
3506 airo_handle_cisco_mic(ai); in airo_interrupt()
3511 airo_handle_link(ai); in airo_interrupt()
3516 airo_handle_rx(ai); in airo_interrupt()
3520 airo_handle_tx(ai, status); in airo_interrupt()
3523 airo_print_warn(ai->dev->name, "Got weird status %x", in airo_interrupt()
3529 OUT4500(ai, EVINTEN, savedInterrupts); in airo_interrupt()
3543 static void OUT4500( struct airo_info *ai, u16 reg, u16 val ) { in OUT4500() argument
3544 if (test_bit(FLAG_MPI,&ai->flags)) in OUT4500()
3547 outw( val, ai->dev->base_addr + reg ); in OUT4500()
3549 outb( val & 0xff, ai->dev->base_addr + reg ); in OUT4500()
3550 outb( val >> 8, ai->dev->base_addr + reg + 1 ); in OUT4500()
3554 static u16 IN4500( struct airo_info *ai, u16 reg ) { in IN4500() argument
3557 if (test_bit(FLAG_MPI,&ai->flags)) in IN4500()
3560 rc = inw( ai->dev->base_addr + reg ); in IN4500()
3562 rc = inb( ai->dev->base_addr + reg ); in IN4500()
3563 rc += ((int)inb( ai->dev->base_addr + reg + 1 )) << 8; in IN4500()
3568 static int enable_MAC(struct airo_info *ai, int lock) in enable_MAC() argument
3580 if (ai->flags & FLAG_RADIO_MASK) return SUCCESS; in enable_MAC()
3582 if (lock && down_interruptible(&ai->sem)) in enable_MAC()
3585 if (!test_bit(FLAG_ENABLED, &ai->flags)) { in enable_MAC()
3588 rc = issuecommand(ai, &cmd, &rsp); in enable_MAC()
3590 set_bit(FLAG_ENABLED, &ai->flags); in enable_MAC()
3595 up(&ai->sem); in enable_MAC()
3598 airo_print_err(ai->dev->name, "Cannot enable MAC"); in enable_MAC()
3600 airo_print_err(ai->dev->name, "Bad MAC enable reason=%x, " in enable_MAC()
3607 static void disable_MAC( struct airo_info *ai, int lock ) { in disable_MAC() argument
3611 if (lock && down_interruptible(&ai->sem)) in disable_MAC()
3614 if (test_bit(FLAG_ENABLED, &ai->flags)) { in disable_MAC()
3617 issuecommand(ai, &cmd, &rsp); in disable_MAC()
3618 clear_bit(FLAG_ENABLED, &ai->flags); in disable_MAC()
3621 up(&ai->sem); in disable_MAC()
3624 static void enable_interrupts( struct airo_info *ai ) { in enable_interrupts() argument
3626 OUT4500( ai, EVINTEN, STATUS_INTS ); in enable_interrupts()
3629 static void disable_interrupts( struct airo_info *ai ) { in disable_interrupts() argument
3630 OUT4500( ai, EVINTEN, 0 ); in disable_interrupts()
3633 static void mpi_receive_802_3(struct airo_info *ai) in mpi_receive_802_3() argument
3642 memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd)); in mpi_receive_802_3()
3651 ai->dev->stats.rx_dropped++; in mpi_receive_802_3()
3655 memcpy(buffer, ai->rxfids[0].virtual_host_addr, ETH_ALEN * 2); in mpi_receive_802_3()
3656 if (ai->micstats.enabled) { in mpi_receive_802_3()
3658 ai->rxfids[0].virtual_host_addr + ETH_ALEN * 2, in mpi_receive_802_3()
3669 ai->rxfids[0].virtual_host_addr + ETH_ALEN * 2 + off, in mpi_receive_802_3()
3671 if (decapsulate (ai, &micbuf, (etherHead*)buffer, len - off - ETH_ALEN * 2)) { in mpi_receive_802_3()
3677 if (ai->spy_data.spy_number > 0) { in mpi_receive_802_3()
3686 wireless_spy_update(ai->dev, sa, &wstats); in mpi_receive_802_3()
3691 skb->protocol = eth_type_trans(skb, ai->dev); in mpi_receive_802_3()
3699 memcpy_toio(ai->rxfids[0].card_ram_off, &rxd, sizeof(rxd)); in mpi_receive_802_3()
3703 static void mpi_receive_802_11(struct airo_info *ai) in mpi_receive_802_11() argument
3712 char *ptr = ai->rxfids[0].virtual_host_addr + 4; in mpi_receive_802_11()
3714 memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd)); in mpi_receive_802_11()
3720 if (ai->wifidev == NULL) in mpi_receive_802_11()
3724 airo_print_err(ai->dev->name, "Bad size %d", len); in mpi_receive_802_11()
3735 ai->dev->stats.rx_dropped++; in mpi_receive_802_11()
3749 airo_print_err(ai->dev->name, in mpi_receive_802_11()
3755 if (ai->spy_data.spy_number > 0) { in mpi_receive_802_11()
3761 if (ai->rssi) in mpi_receive_802_11()
3762 wstats.level = 0x100 - ai->rssi[hdr.rssi[1]].rssidBm; in mpi_receive_802_11()
3765 wstats.noise = ai->wstats.qual.noise; in mpi_receive_802_11()
3770 wireless_spy_update(ai->dev, sa, &wstats); in mpi_receive_802_11()
3775 skb->dev = ai->wifidev; in mpi_receive_802_11()
3785 memcpy_toio(ai->rxfids[0].card_ram_off, &rxd, sizeof(rxd)); in mpi_receive_802_11()
3789 static u16 setup_card(struct airo_info *ai, u8 *mac, int lock) in setup_card() argument
3800 kfree (ai->flash); in setup_card()
3801 ai->flash = NULL; in setup_card()
3806 if (lock && down_interruptible(&ai->sem)) in setup_card()
3808 if ( issuecommand( ai, &cmd, &rsp ) != SUCCESS ) { in setup_card()
3810 up(&ai->sem); in setup_card()
3813 disable_MAC( ai, 0); in setup_card()
3816 if (!test_bit(FLAG_MPI,&ai->flags)) { in setup_card()
3818 if (issuecommand(ai, &cmd, &rsp) != SUCCESS) { in setup_card()
3820 up(&ai->sem); in setup_card()
3821 airo_print_err(ai->dev->name, "Error checking for AUX port"); in setup_card()
3825 ai->bap_read = fast_bap_read; in setup_card()
3826 airo_print_dbg(ai->dev->name, "Doing fast bap_reads"); in setup_card()
3828 ai->bap_read = aux_bap_read; in setup_card()
3829 airo_print_dbg(ai->dev->name, "Doing AUX bap_reads"); in setup_card()
3833 up(&ai->sem); in setup_card()
3834 if (ai->config.len == 0) { in setup_card()
3839 kfree(ai->APList); in setup_card()
3840 ai->APList = NULL; in setup_card()
3841 kfree(ai->SSID); in setup_card()
3842 ai->SSID = NULL; in setup_card()
3844 status = readConfigRid(ai, lock); in setup_card()
3847 status = readCapabilityRid(ai, &cap_rid, lock); in setup_card()
3850 status = PC4500_readrid(ai,RID_RSSI,&rssi_rid,sizeof(rssi_rid),lock); in setup_card()
3852 if (ai->rssi || (ai->rssi = kmalloc(512, GFP_KERNEL)) != NULL) in setup_card()
3853 memcpy(ai->rssi, (u8*)&rssi_rid + 2, 512); /* Skip RID length member */ in setup_card()
3856 kfree(ai->rssi); in setup_card()
3857 ai->rssi = NULL; in setup_card()
3859 ai->config.rmode |= RXMODE_NORMALIZED_RSSI; in setup_card()
3861 airo_print_warn(ai->dev->name, "unknown received signal " in setup_card()
3864 ai->config.opmode = adhoc ? MODE_STA_IBSS : MODE_STA_ESS; in setup_card()
3865 ai->config.authType = AUTH_OPEN; in setup_card()
3866 ai->config.modulation = MOD_CCK; in setup_card()
3870 micsetup(ai) == SUCCESS) { in setup_card()
3871 ai->config.opmode |= MODE_MIC; in setup_card()
3872 set_bit(FLAG_MIC_CAPABLE, &ai->flags); in setup_card()
3877 mac[i] = ai->config.macAddr[i]; in setup_card()
3883 memset(ai->config.rates,0,sizeof(ai->config.rates)); in setup_card()
3885 ai->config.rates[i] = rates[i]; in setup_card()
3888 set_bit (FLAG_COMMIT, &ai->flags); in setup_card()
3904 status = writeConfigRid(ai, lock); in setup_card()
3909 status = writeSsidRid(ai, &mySsid, lock); in setup_card()
3913 status = enable_MAC(ai, lock); in setup_card()
3918 rc = readWepKeyRid(ai, &wkr, 1, lock); in setup_card()
3922 ai->defindex = wkr.mac[0]; in setup_card()
3924 rc = readWepKeyRid(ai, &wkr, 0, lock); in setup_card()
3927 try_auto_wep(ai); in setup_card()
3932 static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) { in issuecommand() argument
3936 if (IN4500(ai, EVSTAT) & EV_CMD) in issuecommand()
3937 OUT4500(ai, EVACK, EV_CMD); in issuecommand()
3939 OUT4500(ai, PARAM0, pCmd->parm0); in issuecommand()
3940 OUT4500(ai, PARAM1, pCmd->parm1); in issuecommand()
3941 OUT4500(ai, PARAM2, pCmd->parm2); in issuecommand()
3942 OUT4500(ai, COMMAND, pCmd->cmd); in issuecommand()
3944 while (max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0) { in issuecommand()
3945 if ((IN4500(ai, COMMAND)) == pCmd->cmd) in issuecommand()
3947 OUT4500(ai, COMMAND, pCmd->cmd); in issuecommand()
3953 airo_print_err(ai->dev->name, in issuecommand()
3955 if (IN4500(ai, COMMAND) & COMMAND_BUSY) in issuecommand()
3956 OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY); in issuecommand()
3961 pRsp->status = IN4500(ai, STATUS); in issuecommand()
3962 pRsp->rsp0 = IN4500(ai, RESP0); in issuecommand()
3963 pRsp->rsp1 = IN4500(ai, RESP1); in issuecommand()
3964 pRsp->rsp2 = IN4500(ai, RESP2); in issuecommand()
3966 airo_print_err(ai->dev->name, in issuecommand()
3972 if (IN4500(ai, COMMAND) & COMMAND_BUSY) { in issuecommand()
3973 OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY); in issuecommand()
3976 OUT4500(ai, EVACK, EV_CMD); in issuecommand()
3984 static int bap_setup(struct airo_info *ai, u16 rid, u16 offset, int whichbap ) in bap_setup() argument
3989 OUT4500(ai, SELECT0+whichbap, rid); in bap_setup()
3990 OUT4500(ai, OFFSET0+whichbap, offset); in bap_setup()
3992 int status = IN4500(ai, OFFSET0+whichbap); in bap_setup()
4001 airo_print_err(ai->dev->name, "BAP error %x %d", in bap_setup()
4008 airo_print_err(ai->dev->name, in bap_setup()
4013 OUT4500(ai, SELECT0+whichbap, rid); in bap_setup()
4014 OUT4500(ai, OFFSET0+whichbap, offset); in bap_setup()
4022 static u16 aux_setup(struct airo_info *ai, u16 page, in aux_setup() argument
4027 OUT4500(ai, AUXPAGE, page); in aux_setup()
4028 OUT4500(ai, AUXOFF, 0); in aux_setup()
4029 next = IN4500(ai, AUXDATA); in aux_setup()
4030 *len = IN4500(ai, AUXDATA)&0xff; in aux_setup()
4031 if (offset != 4) OUT4500(ai, AUXOFF, offset); in aux_setup()
4036 static int aux_bap_read(struct airo_info *ai, __le16 *pu16Dst, in aux_bap_read() argument
4047 spin_lock_irqsave(&ai->aux_lock, flags); in aux_bap_read()
4048 page = IN4500(ai, SWS0+whichbap); in aux_bap_read()
4049 offset = IN4500(ai, SWS2+whichbap); in aux_bap_read()
4050 next = aux_setup(ai, page, offset, &len); in aux_bap_read()
4057 insw( ai->dev->base_addr+DATA0+whichbap, in aux_bap_read()
4060 insb( ai->dev->base_addr+DATA0+whichbap, in aux_bap_read()
4064 next = aux_setup(ai, next, 4, &len); in aux_bap_read()
4067 spin_unlock_irqrestore(&ai->aux_lock, flags); in aux_bap_read()
4073 static int fast_bap_read(struct airo_info *ai, __le16 *pu16Dst, in fast_bap_read() argument
4078 insw( ai->dev->base_addr+DATA0+whichbap, pu16Dst, bytelen>>1 ); in fast_bap_read()
4080 insb( ai->dev->base_addr+DATA0+whichbap, pu16Dst, bytelen ); in fast_bap_read()
4085 static int bap_write(struct airo_info *ai, const __le16 *pu16Src, in bap_write() argument
4090 outsw( ai->dev->base_addr+DATA0+whichbap, in bap_write()
4093 outsb( ai->dev->base_addr+DATA0+whichbap, pu16Src, bytelen ); in bap_write()
4097 static int PC4500_accessrid(struct airo_info *ai, u16 rid, u16 accmd) in PC4500_accessrid() argument
4106 status = issuecommand(ai, &cmd, &rsp); in PC4500_accessrid()
4116 static int PC4500_readrid(struct airo_info *ai, u16 rid, void *pBuf, int len, int lock) in PC4500_readrid() argument
4122 if (down_interruptible(&ai->sem)) in PC4500_readrid()
4125 if (test_bit(FLAG_MPI,&ai->flags)) { in PC4500_readrid()
4131 ai->config_desc.rid_desc.valid = 1; in PC4500_readrid()
4132 ai->config_desc.rid_desc.len = RIDSIZE; in PC4500_readrid()
4133 ai->config_desc.rid_desc.rid = 0; in PC4500_readrid()
4134 ai->config_desc.rid_desc.host_addr = ai->ridbus; in PC4500_readrid()
4139 memcpy_toio(ai->config_desc.card_ram_off, in PC4500_readrid()
4140 &ai->config_desc.rid_desc, sizeof(Rid)); in PC4500_readrid()
4142 rc = issuecommand(ai, &cmd, &rsp); in PC4500_readrid()
4147 memcpy(pBuf, ai->config_desc.virtual_host_addr, len); in PC4500_readrid()
4150 if ((status = PC4500_accessrid(ai, rid, CMD_ACCESS))!=SUCCESS) { in PC4500_readrid()
4154 if (bap_setup(ai, rid, 0, BAP1) != SUCCESS) { in PC4500_readrid()
4159 bap_read(ai, pBuf, 2, BAP1); in PC4500_readrid()
4164 airo_print_err(ai->dev->name, in PC4500_readrid()
4171 rc = bap_read(ai, ((__le16*)pBuf)+1, len, BAP1); in PC4500_readrid()
4175 up(&ai->sem); in PC4500_readrid()
4181 static int PC4500_writerid(struct airo_info *ai, u16 rid, in PC4500_writerid() argument
4190 if (down_interruptible(&ai->sem)) in PC4500_writerid()
4193 if (test_bit(FLAG_MPI,&ai->flags)) { in PC4500_writerid()
4197 if (test_bit(FLAG_ENABLED, &ai->flags) && (RID_WEP_TEMP != rid)) in PC4500_writerid()
4198 airo_print_err(ai->dev->name, in PC4500_writerid()
4204 ai->config_desc.rid_desc.valid = 1; in PC4500_writerid()
4205 ai->config_desc.rid_desc.len = *((u16 *)pBuf); in PC4500_writerid()
4206 ai->config_desc.rid_desc.rid = 0; in PC4500_writerid()
4211 memcpy_toio(ai->config_desc.card_ram_off, in PC4500_writerid()
4212 &ai->config_desc.rid_desc, sizeof(Rid)); in PC4500_writerid()
4215 airo_print_err(ai->dev->name, "%s: len=%d", __func__, len); in PC4500_writerid()
4218 memcpy(ai->config_desc.virtual_host_addr, in PC4500_writerid()
4221 rc = issuecommand(ai, &cmd, &rsp); in PC4500_writerid()
4223 airo_print_err(ai->dev->name, "%s: Write rid Error %d", in PC4500_writerid()
4225 airo_print_err(ai->dev->name, "%s: Cmd=%04x", in PC4500_writerid()
4234 if ( (status = PC4500_accessrid(ai, rid, CMD_ACCESS)) != 0) { in PC4500_writerid()
4239 if (bap_setup(ai, rid, 0, BAP1) != SUCCESS) { in PC4500_writerid()
4243 bap_write(ai, pBuf, len, BAP1); in PC4500_writerid()
4245 rc = PC4500_accessrid(ai, rid, 0x100|CMD_ACCESS); in PC4500_writerid()
4249 up(&ai->sem); in PC4500_writerid()
4255 static u16 transmit_allocate(struct airo_info *ai, int lenPayload, int raw) in transmit_allocate() argument
4265 if (down_interruptible(&ai->sem)) in transmit_allocate()
4267 if (issuecommand(ai, &cmd, &rsp) != SUCCESS) { in transmit_allocate()
4278 while (((IN4500(ai, EVSTAT) & EV_ALLOC) == 0) && --loop); in transmit_allocate()
4285 txFid = IN4500(ai, TXALLOCFID); in transmit_allocate()
4286 OUT4500(ai, EVACK, EV_ALLOC); in transmit_allocate()
4299 if (bap_setup(ai, txFid, 0x0008, BAP1) != SUCCESS) in transmit_allocate()
4302 bap_write(ai, &txControl, sizeof(txControl), BAP1); in transmit_allocate()
4305 up(&ai->sem); in transmit_allocate()
4313 static int transmit_802_3_packet(struct airo_info *ai, int len, char *pPacket) in transmit_802_3_packet() argument
4325 airo_print_warn(ai->dev->name, "Short packet %d", len); in transmit_802_3_packet()
4330 if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && in transmit_802_3_packet()
4332 if (encapsulate(ai,(etherHead *)pPacket,&pMic,len) != SUCCESS) in transmit_802_3_packet()
4338 if (bap_setup(ai, txFid, 0x0036, BAP1) != SUCCESS) return ERROR; in transmit_802_3_packet()
4342 bap_write(ai, &payloadLen, sizeof(payloadLen),BAP1); in transmit_802_3_packet()
4343 bap_write(ai, (__le16*)pPacket, sizeof(etherHead), BAP1); in transmit_802_3_packet()
4345 bap_write(ai, (__le16*)&pMic, miclen, BAP1); in transmit_802_3_packet()
4346 bap_write(ai, (__le16*)(pPacket + sizeof(etherHead)), len, BAP1); in transmit_802_3_packet()
4351 if (issuecommand(ai, &cmd, &rsp) != SUCCESS) return ERROR; in transmit_802_3_packet()
4356 static int transmit_802_11_packet(struct airo_info *ai, int len, char *pPacket) in transmit_802_11_packet() argument
4371 airo_print_warn(ai->dev->name, "Short packet %d", len); in transmit_802_11_packet()
4377 if (bap_setup(ai, txFid, 6, BAP1) != SUCCESS) return ERROR; in transmit_802_11_packet()
4381 bap_write(ai, &payloadLen, sizeof(payloadLen),BAP1); in transmit_802_11_packet()
4382 if (bap_setup(ai, txFid, 0x0014, BAP1) != SUCCESS) return ERROR; in transmit_802_11_packet()
4383 bap_write(ai, (__le16 *)pPacket, hdrlen, BAP1); in transmit_802_11_packet()
4384 bap_write(ai, (__le16 *)(tail + (hdrlen - 10)), 38 - hdrlen, BAP1); in transmit_802_11_packet()
4386 bap_write(ai, (__le16 *)(pPacket + hdrlen), len - hdrlen, BAP1); in transmit_802_11_packet()
4391 if (issuecommand(ai, &cmd, &rsp) != SUCCESS) return ERROR; in transmit_802_11_packet()
4770 static inline int sniffing_mode(struct airo_info *ai) in sniffing_mode() argument
4772 return (le16_to_cpu(ai->config.rmode) & le16_to_cpu(RXMODE_MASK)) >= in sniffing_mode()
4780 struct airo_info *ai = dev->ml_priv; in proc_config_on_close() local
4785 readConfigRid(ai, 1); in proc_config_on_close()
4786 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4793 if (sniffing_mode(ai)) in proc_config_on_close()
4794 set_bit (FLAG_RESET, &ai->flags); in proc_config_on_close()
4795 ai->config.rmode &= ~RXMODE_FULL_MASK; in proc_config_on_close()
4796 clear_bit (FLAG_802_11, &ai->flags); in proc_config_on_close()
4797 ai->config.opmode &= ~MODE_CFG_MASK; in proc_config_on_close()
4798 ai->config.scanMode = SCANMODE_ACTIVE; in proc_config_on_close()
4800 ai->config.opmode |= MODE_STA_IBSS; in proc_config_on_close()
4802 ai->config.opmode |= MODE_STA_ESS; in proc_config_on_close()
4804 ai->config.rmode |= RXMODE_RFMON | RXMODE_DISABLE_802_3_HEADER; in proc_config_on_close()
4805 ai->config.scanMode = SCANMODE_PASSIVE; in proc_config_on_close()
4806 set_bit (FLAG_802_11, &ai->flags); in proc_config_on_close()
4808 ai->config.rmode |= RXMODE_RFMON_ANYBSS | RXMODE_DISABLE_802_3_HEADER; in proc_config_on_close()
4809 ai->config.scanMode = SCANMODE_PASSIVE; in proc_config_on_close()
4810 set_bit (FLAG_802_11, &ai->flags); in proc_config_on_close()
4812 ai->config.rmode |= RXMODE_LANMON; in proc_config_on_close()
4814 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4821 set_bit (FLAG_RADIO_OFF, &ai->flags); in proc_config_on_close()
4823 clear_bit (FLAG_RADIO_OFF, &ai->flags); in proc_config_on_close()
4831 memset( ai->config.nodeName, 0, 16 ); in proc_config_on_close()
4834 ai->config.nodeName[j] = line[j]; in proc_config_on_close()
4836 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4843 ai->config.powerSaveMode = POWERSAVE_PSPCAM; in proc_config_on_close()
4844 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4846 ai->config.powerSaveMode = POWERSAVE_PSP; in proc_config_on_close()
4847 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4849 ai->config.powerSaveMode = POWERSAVE_CAM; in proc_config_on_close()
4850 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4858 ai->config.rates[k++] = (u8)v; in proc_config_on_close()
4862 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4868 ai->config.channelSet = cpu_to_le16(v); in proc_config_on_close()
4869 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4876 ai->config.txPower = cpu_to_le16(v); in proc_config_on_close()
4877 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4883 ai->config.authType = AUTH_SHAREDKEY; in proc_config_on_close()
4886 ai->config.authType = AUTH_ENCRYPT; in proc_config_on_close()
4889 ai->config.authType = AUTH_OPEN; in proc_config_on_close()
4892 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4899 ai->config.longRetryLimit = cpu_to_le16(v); in proc_config_on_close()
4900 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4907 ai->config.shortRetryLimit = cpu_to_le16(v); in proc_config_on_close()
4908 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4915 ai->config.rtsThres = cpu_to_le16(v); in proc_config_on_close()
4916 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4923 ai->config.txLifetime = cpu_to_le16(v); in proc_config_on_close()
4924 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4931 ai->config.rxLifetime = cpu_to_le16(v); in proc_config_on_close()
4932 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4934 ai->config.txDiversity = in proc_config_on_close()
4937 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4939 ai->config.rxDiversity = in proc_config_on_close()
4942 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4950 ai->config.fragThresh = cpu_to_le16(v); in proc_config_on_close()
4951 set_bit (FLAG_COMMIT, &ai->flags); in proc_config_on_close()
4955 case 'd': ai->config.modulation=MOD_DEFAULT; set_bit(FLAG_COMMIT, &ai->flags); break; in proc_config_on_close()
4956 case 'c': ai->config.modulation=MOD_CCK; set_bit(FLAG_COMMIT, &ai->flags); break; in proc_config_on_close()
4957 case 'm': ai->config.modulation=MOD_MOK; set_bit(FLAG_COMMIT, &ai->flags); break; in proc_config_on_close()
4958 default: airo_print_warn(ai->dev->name, "Unknown modulation"); in proc_config_on_close()
4963 case 'a': ai->config.preamble=PREAMBLE_AUTO; set_bit(FLAG_COMMIT, &ai->flags); break; in proc_config_on_close()
4964 case 'l': ai->config.preamble=PREAMBLE_LONG; set_bit(FLAG_COMMIT, &ai->flags); break; in proc_config_on_close()
4965 case 's': ai->config.preamble=PREAMBLE_SHORT; set_bit(FLAG_COMMIT, &ai->flags); break; in proc_config_on_close()
4966 default: airo_print_warn(ai->dev->name, "Unknown preamble"); in proc_config_on_close()
4969 airo_print_warn(ai->dev->name, "Couldn't figure out %s", line); in proc_config_on_close()
4991 struct airo_info *ai = dev->ml_priv; in proc_config_open() local
5010 readConfigRid(ai, 1); in proc_config_open()
5012 mode = ai->config.opmode & MODE_CFG_MASK; in proc_config_open()
5022 mode == MODE_STA_ESS ? get_rmode(ai->config.rmode): in proc_config_open()
5025 test_bit(FLAG_RADIO_OFF, &ai->flags) ? "off" : "on", in proc_config_open()
5026 ai->config.nodeName, in proc_config_open()
5027 ai->config.powerSaveMode == POWERSAVE_CAM ? "CAM" : in proc_config_open()
5028 ai->config.powerSaveMode == POWERSAVE_PSP ? "PSP" : in proc_config_open()
5029 ai->config.powerSaveMode == POWERSAVE_PSPCAM ? "PSPCAM" : in proc_config_open()
5031 (int)ai->config.rates[0], in proc_config_open()
5032 (int)ai->config.rates[1], in proc_config_open()
5033 (int)ai->config.rates[2], in proc_config_open()
5034 (int)ai->config.rates[3], in proc_config_open()
5035 (int)ai->config.rates[4], in proc_config_open()
5036 (int)ai->config.rates[5], in proc_config_open()
5037 (int)ai->config.rates[6], in proc_config_open()
5038 (int)ai->config.rates[7], in proc_config_open()
5039 le16_to_cpu(ai->config.channelSet), in proc_config_open()
5040 le16_to_cpu(ai->config.txPower) in proc_config_open()
5054 le16_to_cpu(ai->config.longRetryLimit), in proc_config_open()
5055 le16_to_cpu(ai->config.shortRetryLimit), in proc_config_open()
5056 le16_to_cpu(ai->config.rtsThres), in proc_config_open()
5057 le16_to_cpu(ai->config.txLifetime), in proc_config_open()
5058 le16_to_cpu(ai->config.rxLifetime), in proc_config_open()
5059 ai->config.txDiversity == 1 ? "left" : in proc_config_open()
5060 ai->config.txDiversity == 2 ? "right" : "both", in proc_config_open()
5061 ai->config.rxDiversity == 1 ? "left" : in proc_config_open()
5062 ai->config.rxDiversity == 2 ? "right" : "both", in proc_config_open()
5063 le16_to_cpu(ai->config.fragThresh), in proc_config_open()
5064 ai->config.authType == AUTH_ENCRYPT ? "encrypt" : in proc_config_open()
5065 ai->config.authType == AUTH_SHAREDKEY ? "shared" : "open", in proc_config_open()
5066 ai->config.modulation == MOD_DEFAULT ? "default" : in proc_config_open()
5067 ai->config.modulation == MOD_CCK ? "cck" : in proc_config_open()
5068 ai->config.modulation == MOD_MOK ? "mok" : "error", in proc_config_open()
5069 ai->config.preamble == PREAMBLE_AUTO ? "auto" : in proc_config_open()
5070 ai->config.preamble == PREAMBLE_LONG ? "long" : in proc_config_open()
5071 ai->config.preamble == PREAMBLE_SHORT ? "short" : "error" in proc_config_open()
5081 struct airo_info *ai = dev->ml_priv; in proc_SSID_on_close() local
5108 disable_MAC(ai, 1); in proc_SSID_on_close()
5109 writeSsidRid(ai, &SSID_rid, 1); in proc_SSID_on_close()
5110 enable_MAC(ai, 1); in proc_SSID_on_close()
5116 struct airo_info *ai = dev->ml_priv; in proc_APList_on_close() local
5140 disable_MAC(ai, 1); in proc_APList_on_close()
5141 writeAPListRid(ai, &APList_rid, 1); in proc_APList_on_close()
5142 enable_MAC(ai, 1); in proc_APList_on_close()
5146 static int do_writerid( struct airo_info *ai, u16 rid, const void *rid_data, in do_writerid() argument
5150 disable_MAC(ai, 1); in do_writerid()
5151 rc = PC4500_writerid(ai, rid, rid_data, len, 1); in do_writerid()
5152 enable_MAC(ai, 1); in do_writerid()
5159 static int get_wep_key(struct airo_info *ai, u16 index, char *buf, u16 buflen) in get_wep_key() argument
5165 rc = readWepKeyRid(ai, &wkr, 1, 1); in get_wep_key()
5175 rc = readWepKeyRid(ai, &wkr, 0, 1); in get_wep_key()
5182 static int get_wep_tx_idx(struct airo_info *ai) in get_wep_tx_idx() argument
5188 rc = readWepKeyRid(ai, &wkr, 1, 1); in get_wep_tx_idx()
5195 rc = readWepKeyRid(ai, &wkr, 0, 1); in get_wep_tx_idx()
5202 static int set_wep_key(struct airo_info *ai, u16 index, const char *key, in set_wep_key() argument
5219 if (perm) disable_MAC(ai, lock); in set_wep_key()
5220 rc = writeWepKeyRid(ai, &wkr, perm, lock); in set_wep_key()
5221 if (perm) enable_MAC(ai, lock); in set_wep_key()
5225 static int set_wep_tx_idx(struct airo_info *ai, u16 index, int perm, int lock) in set_wep_tx_idx() argument
5236 ai->defindex = (char)index; in set_wep_tx_idx()
5237 disable_MAC(ai, lock); in set_wep_tx_idx()
5240 rc = writeWepKeyRid(ai, &wkr, perm, lock); in set_wep_tx_idx()
5243 enable_MAC(ai, lock); in set_wep_tx_idx()
5250 struct airo_info *ai = dev->ml_priv; in proc_wepkey_on_close() local
5265 rc = set_wep_tx_idx(ai, index, 1, 1); in proc_wepkey_on_close()
5267 airo_print_err(ai->dev->name, "failed to set " in proc_wepkey_on_close()
5275 airo_print_err(ai->dev->name, "WepKey passed invalid key index"); in proc_wepkey_on_close()
5290 rc = set_wep_key(ai, index, key, i/3, 1, 1); in proc_wepkey_on_close()
5292 airo_print_err(ai->dev->name, "failed to set WEP key at index " in proc_wepkey_on_close()
5301 struct airo_info *ai = dev->ml_priv; in proc_wepkey_open() local
5327 rc = readWepKeyRid(ai, &wkr, 1, 1); in proc_wepkey_open()
5338 readWepKeyRid(ai, &wkr, 0, 1); in proc_wepkey_open()
5349 struct airo_info *ai = dev->ml_priv; in proc_SSID_open() local
5371 readSsidRid(ai, &SSID_rid); in proc_SSID_open()
5392 struct airo_info *ai = dev->ml_priv; in proc_APList_open() local
5413 readAPListRid(ai, &APList_rid); in proc_APList_open()
5431 struct airo_info *ai = dev->ml_priv; in proc_BSSList_open() local
5455 if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN; in proc_BSSList_open()
5458 if (down_interruptible(&ai->sem)) in proc_BSSList_open()
5460 issuecommand(ai, &cmd, &rsp); in proc_BSSList_open()
5461 up(&ai->sem); in proc_BSSList_open()
5471 rc = readBSSListRid(ai, doLoseSync, &BSSList_rid); in proc_BSSList_open()
5484 rc = readBSSListRid(ai, 0, &BSSList_rid); in proc_BSSList_open()
5579 struct airo_info *ai = dev->ml_priv; in airo_pci_suspend() local
5583 if (!ai->APList) in airo_pci_suspend()
5584 ai->APList = kmalloc(sizeof(APListRid), GFP_KERNEL); in airo_pci_suspend()
5585 if (!ai->APList) in airo_pci_suspend()
5587 if (!ai->SSID) in airo_pci_suspend()
5588 ai->SSID = kmalloc(sizeof(SsidRid), GFP_KERNEL); in airo_pci_suspend()
5589 if (!ai->SSID) in airo_pci_suspend()
5591 readAPListRid(ai, ai->APList); in airo_pci_suspend()
5592 readSsidRid(ai, ai->SSID); in airo_pci_suspend()
5595 if (down_interruptible(&ai->sem)) in airo_pci_suspend()
5597 disable_MAC(ai, 0); in airo_pci_suspend()
5599 ai->power = state; in airo_pci_suspend()
5601 issuecommand(ai, &cmd, &rsp); in airo_pci_suspend()
5612 struct airo_info *ai = dev->ml_priv; in airo_pci_resume() local
5621 mpi_init_descriptors(ai); in airo_pci_resume()
5622 setup_card(ai, dev->dev_addr, 0); in airo_pci_resume()
5623 clear_bit(FLAG_RADIO_OFF, &ai->flags); in airo_pci_resume()
5624 clear_bit(FLAG_PENDING_XMIT, &ai->flags); in airo_pci_resume()
5626 OUT4500(ai, EVACK, EV_AWAKEN); in airo_pci_resume()
5627 OUT4500(ai, EVACK, EV_AWAKEN); in airo_pci_resume()
5631 set_bit(FLAG_COMMIT, &ai->flags); in airo_pci_resume()
5632 disable_MAC(ai, 0); in airo_pci_resume()
5634 if (ai->SSID) { in airo_pci_resume()
5635 writeSsidRid(ai, ai->SSID, 0); in airo_pci_resume()
5636 kfree(ai->SSID); in airo_pci_resume()
5637 ai->SSID = NULL; in airo_pci_resume()
5639 if (ai->APList) { in airo_pci_resume()
5640 writeAPListRid(ai, ai->APList, 0); in airo_pci_resume()
5641 kfree(ai->APList); in airo_pci_resume()
5642 ai->APList = NULL; in airo_pci_resume()
5644 writeConfigRid(ai, 0); in airo_pci_resume()
5645 enable_MAC(ai, 0); in airo_pci_resume()
5646 ai->power = PMSG_ON; in airo_pci_resume()
5649 enable_interrupts(ai); in airo_pci_resume()
5650 up(&ai->sem); in airo_pci_resume()
5695 struct airo_info *ai; in airo_cleanup_module() local
5697 ai = list_entry(airo_devices.next, struct airo_info, dev_list); in airo_cleanup_module()
5698 airo_print_info(ai->dev->name, "Unregistering..."); in airo_cleanup_module()
5699 stop_airo_card(ai->dev, 1); in airo_cleanup_module()
6299 static inline int valid_index(struct airo_info *ai, int index) in valid_index() argument
6301 return (index >= 0) && (index <= ai->max_wep_idx); in valid_index()
7216 struct airo_info *ai = dev->ml_priv; in airo_set_scan() local
7227 if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN; in airo_set_scan()
7229 if (down_interruptible(&ai->sem)) in airo_set_scan()
7234 if (ai->scan_timeout > 0) in airo_set_scan()
7238 ai->scan_timeout = RUN_AT(3*HZ); in airo_set_scan()
7241 issuecommand(ai, &cmd, &rsp); in airo_set_scan()
7245 up(&ai->sem); in airo_set_scan()
7247 wake_up_interruptible(&ai->thr_wait); in airo_set_scan()
7262 struct airo_info *ai = dev->ml_priv; in airo_translate_scan() local
7313 if (ai->rssi) { in airo_translate_scan()
7315 iwe.u.qual.qual = airo_dbm_to_pct(ai->rssi, dBm); in airo_translate_scan()
7326 iwe.u.qual.noise = ai->wstats.qual.noise; in airo_translate_scan()
7375 if (test_bit(FLAG_WPA_CAPABLE, &ai->flags)) { in airo_translate_scan()
7439 struct airo_info *ai = dev->ml_priv; in airo_get_scan() local
7445 if (ai->scan_timeout > 0) in airo_get_scan()
7448 if (down_interruptible(&ai->sem)) in airo_get_scan()
7451 list_for_each_entry (net, &ai->network_list, list) { in airo_get_scan()
7470 up(&ai->sem); in airo_get_scan()
7628 struct airo_info *ai = dev->ml_priv; in airo_ioctl() local
7630 if (ai->power.event) in airo_ioctl()
7781 struct airo_info *ai = dev->ml_priv; in readrids() local
7783 if (test_bit(FLAG_FLASHING, &ai->flags)) in readrids()
7790 if (test_bit(FLAG_COMMIT, &ai->flags)) { in readrids()
7791 disable_MAC (ai, 1); in readrids()
7792 writeConfigRid (ai, 1); in readrids()
7793 enable_MAC(ai, 1); in readrids()
7814 if (copy_to_user(comp->data, &ai->micstats, in readrids()
7815 min((int)comp->len,(int)sizeof(ai->micstats)))) in readrids()
7826 PC4500_readrid(ai,ridcode,iobuf,RIDSIZE, 1); in readrids()
7846 struct airo_info *ai = dev->ml_priv; in writerids() local
7856 if (test_bit(FLAG_FLASHING, &ai->flags)) in writerids()
7867 case AIROPCFG: ai->config.len = 0; in writerids()
7868 clear_bit(FLAG_COMMIT, &ai->flags); in writerids()
7882 if (enable_MAC(ai, 1) != 0) in writerids()
7891 disable_MAC(ai, 1); in writerids()
7902 PC4500_readrid(ai,RID_STATSDELTACLEAR,iobuf,RIDSIZE, 1); in writerids()
7904 enabled = ai->micstats.enabled; in writerids()
7905 memset(&ai->micstats,0,sizeof(ai->micstats)); in writerids()
7906 ai->micstats.enabled = enabled; in writerids()
7933 if (test_bit(FLAG_MIC_CAPABLE, &ai->flags)) in writerids()
7937 set_bit (FLAG_ADHOC, &ai->flags); in writerids()
7939 clear_bit (FLAG_ADHOC, &ai->flags); in writerids()
7942 if((*writer)(ai, ridcode, iobuf,comp->len,1)) { in writerids()
8018 static int cmdreset(struct airo_info *ai) { in cmdreset() argument
8019 disable_MAC(ai, 1); in cmdreset()
8021 if(!waitbusy (ai)){ in cmdreset()
8022 airo_print_info(ai->dev->name, "Waitbusy hang before RESET"); in cmdreset()
8026 OUT4500(ai,COMMAND,CMD_SOFTRESET); in cmdreset()
8030 if(!waitbusy (ai)){ in cmdreset()
8031 airo_print_info(ai->dev->name, "Waitbusy hang AFTER RESET"); in cmdreset()
8042 static int setflashmode (struct airo_info *ai) { in setflashmode() argument
8043 set_bit (FLAG_FLASHING, &ai->flags); in setflashmode()
8045 OUT4500(ai, SWS0, FLASH_COMMAND); in setflashmode()
8046 OUT4500(ai, SWS1, FLASH_COMMAND); in setflashmode()
8048 OUT4500(ai, SWS0, FLASH_COMMAND); in setflashmode()
8049 OUT4500(ai, COMMAND,0x10); in setflashmode()
8051 OUT4500(ai, SWS2, FLASH_COMMAND); in setflashmode()
8052 OUT4500(ai, SWS3, FLASH_COMMAND); in setflashmode()
8053 OUT4500(ai, COMMAND,0); in setflashmode()
8057 if(!waitbusy(ai)) { in setflashmode()
8058 clear_bit (FLAG_FLASHING, &ai->flags); in setflashmode()
8059 airo_print_info(ai->dev->name, "Waitbusy hang after setflash mode"); in setflashmode()
8069 static int flashpchar(struct airo_info *ai,int byte,int dwelltime) { in flashpchar() argument
8081 while ((IN4500 (ai, SWS0) & 0x8000) && waittime > 0) { in flashpchar()
8088 airo_print_info(ai->dev->name, "flash putchar busywait timeout!"); in flashpchar()
8094 OUT4500(ai,SWS0,byte); in flashpchar()
8097 echo = IN4500(ai,SWS1); in flashpchar()
8100 OUT4500(ai,SWS1,0); in flashpchar()
8109 static int flashgchar(struct airo_info *ai,int matchbyte,int dwelltime){ in flashgchar() argument
8114 rchar = IN4500(ai,SWS1); in flashgchar()
8124 OUT4500(ai,SWS1,0); in flashgchar()
8129 OUT4500(ai,SWS1,0); in flashgchar()
8140 static int flashputbuf(struct airo_info *ai){ in flashputbuf() argument
8144 if (test_bit(FLAG_MPI,&ai->flags)) in flashputbuf()
8145 memcpy_toio(ai->pciaux + 0x8000, ai->flash, FLASHSIZE); in flashputbuf()
8147 OUT4500(ai,AUXPAGE,0x100); in flashputbuf()
8148 OUT4500(ai,AUXOFF,0); in flashputbuf()
8151 OUT4500(ai,AUXDATA,ai->flash[nwords] & 0xffff); in flashputbuf()
8154 OUT4500(ai,SWS0,0x8000); in flashputbuf()
8162 static int flashrestart(struct airo_info *ai,struct net_device *dev){ in flashrestart() argument
8166 clear_bit (FLAG_FLASHING, &ai->flags); in flashrestart()
8167 if (test_bit(FLAG_MPI, &ai->flags)) { in flashrestart()
8168 status = mpi_init_descriptors(ai); in flashrestart()
8172 status = setup_card(ai, dev->dev_addr, 1); in flashrestart()
8174 if (!test_bit(FLAG_MPI,&ai->flags)) in flashrestart()
8176 ai->fids[i] = transmit_allocate in flashrestart()
8177 ( ai, AIRO_DEF_MTU, i >= MAX_FIDS / 2 ); in flashrestart()