Lines Matching refs:sc
112 static void ipw2100_hwconf_get(struct ipw2100_softc *sc);
113 static int ipw2100_chip_reset(struct ipw2100_softc *sc);
114 static void ipw2100_master_stop(struct ipw2100_softc *sc);
115 static void ipw2100_stop(struct ipw2100_softc *sc);
116 static int ipw2100_config(struct ipw2100_softc *sc);
117 static int ipw2100_cmd(struct ipw2100_softc *sc, uint32_t type,
119 static int ipw2100_dma_region_alloc(struct ipw2100_softc *sc,
122 static void ipw2100_tables_init(struct ipw2100_softc *sc);
123 static void ipw2100_ring_hwsetup(struct ipw2100_softc *sc);
124 static int ipw2100_ring_alloc(struct ipw2100_softc *sc);
125 static void ipw2100_ring_free(struct ipw2100_softc *sc);
126 static void ipw2100_ring_reset(struct ipw2100_softc *sc);
127 static int ipw2100_ring_init(struct ipw2100_softc *sc);
152 static void ipw2100_rcvpkt(struct ipw2100_softc *sc,
160 static void ipw2100_thread(struct ipw2100_softc *sc);
165 static int ipw2100_ioctl(struct ipw2100_softc *sc, queue_t *q, mblk_t *m);
166 static int ipw2100_getset(struct ipw2100_softc *sc,
168 static int ipw_wificfg_radio(struct ipw2100_softc *sc,
171 static int ipw_wificfg_disassoc(struct ipw2100_softc *sc,
177 static int ipw2100_cpr_suspend(struct ipw2100_softc *sc);
178 static int ipw2100_cpr_resume(struct ipw2100_softc *sc);
256 struct ipw2100_softc *sc; in ipw2100_attach() local
269 sc = ddi_get_soft_state(ipw2100_ssp, ddi_get_instance(dip)); in ipw2100_attach()
270 if (sc == NULL) { in ipw2100_attach()
274 return (ipw2100_cpr_resume(sc)); in ipw2100_attach()
287 sc = ddi_get_soft_state(ipw2100_ssp, instance); in ipw2100_attach()
288 sc->sc_dip = dip; in ipw2100_attach()
306 err = ddi_regs_map_setup(dip, IPW2100_PCI_CSR_RNUM, &sc->sc_regs, in ipw2100_attach()
307 0, 0, &ipw2100_csr_accattr, &sc->sc_ioh); in ipw2100_attach()
317 err = ipw2100_chip_reset(sc); in ipw2100_attach()
327 ipw2100_hwconf_get(sc); in ipw2100_attach()
328 err = ipw2100_ring_init(sc); in ipw2100_attach()
339 err = ddi_get_iblock_cookie(dip, 0, &sc->sc_iblk); in ipw2100_attach()
348 mutex_init(&sc->sc_ilock, "interrupt-lock", MUTEX_DRIVER, in ipw2100_attach()
349 (void *) sc->sc_iblk); in ipw2100_attach()
350 cv_init(&sc->sc_fw_cond, "firmware", CV_DRIVER, NULL); in ipw2100_attach()
351 cv_init(&sc->sc_cmd_cond, "command", CV_DRIVER, NULL); in ipw2100_attach()
355 mutex_init(&sc->sc_tx_lock, "tx-ring", MUTEX_DRIVER, in ipw2100_attach()
356 (void *) sc->sc_iblk); in ipw2100_attach()
357 cv_init(&sc->sc_tx_cond, "tx-ring", CV_DRIVER, NULL); in ipw2100_attach()
361 mutex_init(&sc->sc_resched_lock, "reschedule-lock", MUTEX_DRIVER, in ipw2100_attach()
362 (void *) sc->sc_iblk); in ipw2100_attach()
366 mutex_init(&sc->sc_mflock, "function-lock", MUTEX_DRIVER, in ipw2100_attach()
367 (void *) sc->sc_iblk); in ipw2100_attach()
368 cv_init(&sc->sc_mfthread_cv, NULL, CV_DRIVER, NULL); in ipw2100_attach()
369 sc->sc_mf_thread = NULL; in ipw2100_attach()
370 sc->sc_mfthread_switch = 0; in ipw2100_attach()
375 ic = &sc->sc_ic; in ipw2100_attach()
387 IEEE80211_ADDR_COPY(ic->ic_macaddr, sc->sc_macaddr); in ipw2100_attach()
389 if (sc->sc_chmask &(1 << i)) { in ipw2100_attach()
408 sc->sc_newstate = ic->ic_newstate; in ipw2100_attach()
417 sc->sc_authmode = IEEE80211_AUTH_OPEN; in ipw2100_attach()
422 err = ddi_add_intr(dip, 0, &sc->sc_iblk, NULL, in ipw2100_attach()
423 ipw2100_intr, (caddr_t)sc); in ipw2100_attach()
445 macp->m_driver = sc; in ipw2100_attach()
479 (void) ipw2100_cache_firmware(sc); in ipw2100_attach()
490 sc->sc_mfthread_switch = 1; in ipw2100_attach()
491 if (sc->sc_mf_thread == NULL) in ipw2100_attach()
492 sc->sc_mf_thread = thread_create((caddr_t)NULL, 0, in ipw2100_attach()
493 ipw2100_thread, sc, 0, &p0, TS_RUN, minclsyspri); in ipw2100_attach()
498 ddi_remove_intr(dip, 0, sc->sc_iblk); in ipw2100_attach()
502 mutex_destroy(&sc->sc_ilock); in ipw2100_attach()
503 mutex_destroy(&sc->sc_tx_lock); in ipw2100_attach()
504 mutex_destroy(&sc->sc_mflock); in ipw2100_attach()
505 mutex_destroy(&sc->sc_resched_lock); in ipw2100_attach()
506 cv_destroy(&sc->sc_mfthread_cv); in ipw2100_attach()
507 cv_destroy(&sc->sc_tx_cond); in ipw2100_attach()
508 cv_destroy(&sc->sc_cmd_cond); in ipw2100_attach()
509 cv_destroy(&sc->sc_fw_cond); in ipw2100_attach()
511 ipw2100_ring_free(sc); in ipw2100_attach()
513 ddi_regs_map_free(&sc->sc_ioh); in ipw2100_attach()
523 struct ipw2100_softc *sc = in ipw2100_detach() local
527 ASSERT(sc != NULL); in ipw2100_detach()
533 return (ipw2100_cpr_suspend(sc)); in ipw2100_detach()
541 mutex_enter(&sc->sc_mflock); in ipw2100_detach()
542 sc->sc_mfthread_switch = 0; in ipw2100_detach()
543 while (sc->sc_mf_thread != NULL) { in ipw2100_detach()
544 if (cv_wait_sig(&sc->sc_mfthread_cv, &sc->sc_mflock) == 0) in ipw2100_detach()
547 mutex_exit(&sc->sc_mflock); in ipw2100_detach()
552 err = mac_unregister(sc->sc_ic.ic_mach); in ipw2100_detach()
556 ddi_remove_intr(dip, 0, sc->sc_iblk); in ipw2100_detach()
561 mutex_destroy(&sc->sc_ilock); in ipw2100_detach()
562 mutex_destroy(&sc->sc_tx_lock); in ipw2100_detach()
563 mutex_destroy(&sc->sc_mflock); in ipw2100_detach()
564 mutex_destroy(&sc->sc_resched_lock); in ipw2100_detach()
565 cv_destroy(&sc->sc_mfthread_cv); in ipw2100_detach()
566 cv_destroy(&sc->sc_tx_cond); in ipw2100_detach()
567 cv_destroy(&sc->sc_cmd_cond); in ipw2100_detach()
568 cv_destroy(&sc->sc_fw_cond); in ipw2100_detach()
573 ieee80211_detach(&sc->sc_ic); in ipw2100_detach()
575 (void) ipw2100_free_firmware(sc); in ipw2100_detach()
576 ipw2100_ring_free(sc); in ipw2100_detach()
578 ddi_regs_map_free(&sc->sc_ioh); in ipw2100_detach()
586 ipw2100_cpr_suspend(struct ipw2100_softc *sc) in ipw2100_cpr_suspend() argument
588 IPW2100_DBG(IPW2100_DBG_INIT, (sc->sc_dip, CE_CONT, in ipw2100_cpr_suspend()
594 mutex_enter(&sc->sc_mflock); in ipw2100_cpr_suspend()
595 sc->sc_mfthread_switch = 0; in ipw2100_cpr_suspend()
596 while (sc->sc_mf_thread != NULL) { in ipw2100_cpr_suspend()
597 if (cv_wait_sig(&sc->sc_mfthread_cv, &sc->sc_mflock) == 0) in ipw2100_cpr_suspend()
600 mutex_exit(&sc->sc_mflock); in ipw2100_cpr_suspend()
605 ipw2100_stop(sc); in ipw2100_cpr_suspend()
606 sc->sc_flags &= ~IPW2100_FLAG_RUNNING; in ipw2100_cpr_suspend()
607 sc->sc_suspended = 1; in ipw2100_cpr_suspend()
609 (void) ipw2100_free_firmware(sc); in ipw2100_cpr_suspend()
610 ipw2100_ring_free(sc); in ipw2100_cpr_suspend()
616 ipw2100_cpr_resume(struct ipw2100_softc *sc) in ipw2100_cpr_resume() argument
618 struct ieee80211com *ic = &sc->sc_ic; in ipw2100_cpr_resume()
619 dev_info_t *dip = sc->sc_dip; in ipw2100_cpr_resume()
622 IPW2100_DBG(IPW2100_DBG_INIT, (sc->sc_dip, CE_CONT, in ipw2100_cpr_resume()
628 err = ipw2100_chip_reset(sc); in ipw2100_cpr_resume()
639 err = ipw2100_ring_init(sc); in ipw2100_cpr_resume()
650 (void) ipw2100_cache_firmware(sc); in ipw2100_cpr_resume()
661 sc->sc_mfthread_switch = 1; in ipw2100_cpr_resume()
662 if (sc->sc_mf_thread == NULL) in ipw2100_cpr_resume()
663 sc->sc_mf_thread = thread_create((caddr_t)NULL, 0, in ipw2100_cpr_resume()
664 ipw2100_thread, sc, 0, &p0, TS_RUN, minclsyspri); in ipw2100_cpr_resume()
669 sc->sc_suspended = 0; in ipw2100_cpr_resume()
670 ipw2100_csr_put32(sc, IPW2100_CSR_INTR_MASK, IPW2100_INTR_MASK_ALL); in ipw2100_cpr_resume()
675 (void) ipw2100_init(sc); in ipw2100_cpr_resume()
677 sc->sc_flags |= IPW2100_FLAG_RUNNING; in ipw2100_cpr_resume()
694 struct ipw2100_softc *sc = in ipw2100_quiesce() local
697 if (sc == NULL) in ipw2100_quiesce()
704 sc->sc_flags |= IPW2100_FLAG_QUIESCED; in ipw2100_quiesce()
709 ipw2100_stop(sc); in ipw2100_quiesce()
714 ipw2100_tables_init(struct ipw2100_softc *sc) in ipw2100_tables_init() argument
716 sc->sc_table1_base = ipw2100_csr_get32(sc, IPW2100_CSR_TABLE1_BASE); in ipw2100_tables_init()
717 sc->sc_table2_base = ipw2100_csr_get32(sc, IPW2100_CSR_TABLE2_BASE); in ipw2100_tables_init()
721 ipw2100_stop(struct ipw2100_softc *sc) in ipw2100_stop() argument
723 struct ieee80211com *ic = &sc->sc_ic; in ipw2100_stop()
725 ipw2100_master_stop(sc); in ipw2100_stop()
726 ipw2100_csr_put32(sc, IPW2100_CSR_RST, IPW2100_RST_SW_RESET); in ipw2100_stop()
727 sc->sc_flags &= ~IPW2100_FLAG_FW_INITED; in ipw2100_stop()
729 if (!(sc->sc_flags & IPW2100_FLAG_QUIESCED)) in ipw2100_stop()
734 ipw2100_config(struct ipw2100_softc *sc) in ipw2100_config() argument
736 struct ieee80211com *ic = &sc->sc_ic; in ipw2100_config()
759 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
762 err = ipw2100_cmd(sc, IPW2100_CMD_SET_MODE, in ipw2100_config()
774 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
777 err = ipw2100_cmd(sc, IPW2100_CMD_SET_CHANNEL, in ipw2100_config()
786 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
791 err = ipw2100_cmd(sc, IPW2100_CMD_SET_MAC_ADDRESS, ic->ic_macaddr, in ipw2100_config()
803 if (sc->if_flags & IFF_PROMISC) in ipw2100_config()
806 cfg.bss_chan = LE_32(sc->sc_chmask >> 1); in ipw2100_config()
807 cfg.ibss_chan = LE_32(sc->sc_chmask >> 1); in ipw2100_config()
809 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
813 err = ipw2100_cmd(sc, IPW2100_CMD_SET_CONFIGURATION, in ipw2100_config()
823 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
826 err = ipw2100_cmd(sc, IPW2100_CMD_SET_BASIC_TX_RATES, in ipw2100_config()
835 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
838 err = ipw2100_cmd(sc, IPW2100_CMD_SET_TX_RATES, &data, sizeof (data)); in ipw2100_config()
846 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
848 err = ipw2100_cmd(sc, IPW2100_CMD_SET_POWER_MODE, &data, sizeof (data)); in ipw2100_config()
857 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
860 err = ipw2100_cmd(sc, IPW2100_CMD_SET_TX_POWER_INDEX, in ipw2100_config()
871 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
873 err = ipw2100_cmd(sc, IPW2100_CMD_SET_RTS_THRESHOLD, in ipw2100_config()
883 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
885 err = ipw2100_cmd(sc, IPW2100_CMD_SET_FRAG_THRESHOLD, in ipw2100_config()
893 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
896 err = ipw2100_cmd(sc, IPW2100_CMD_SET_ESSID, in ipw2100_config()
904 err = ipw2100_cmd(sc, IPW2100_CMD_SET_MANDATORY_BSSID, NULL, 0); in ipw2100_config()
912 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
915 err = ipw2100_cmd(sc, IPW2100_CMD_SET_DESIRED_BSSID, in ipw2100_config()
931 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
933 err = ipw2100_cmd(sc, IPW2100_CMD_SET_SECURITY_INFORMATION, in ipw2100_config()
952 err = ipw2100_cmd(sc, IPW2100_CMD_SET_WEP_KEY, in ipw2100_config()
958 err = ipw2100_cmd(sc, IPW2100_CMD_SET_WEP_KEY_INDEX, in ipw2100_config()
968 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
970 err = ipw2100_cmd(sc, IPW2100_CMD_SET_WEP_FLAGS, &data, sizeof (data)); in ipw2100_config()
981 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
984 err = ipw2100_cmd(sc, IPW2100_CMD_SET_BEACON_INTERVAL, in ipw2100_config()
994 sopt.channels = LE_32(sc->sc_chmask >> 1); in ipw2100_config()
995 err = ipw2100_cmd(sc, IPW2100_CMD_SET_SCAN_OPTIONS, in ipw2100_config()
1002 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_config()
1005 return (ipw2100_cmd(sc, IPW2100_CMD_ENABLE, NULL, 0)); in ipw2100_config()
1009 ipw2100_cmd(struct ipw2100_softc *sc, uint32_t type, void *buf, size_t len) in ipw2100_cmd() argument
1018 sc->sc_cmd->type = LE_32(type); in ipw2100_cmd()
1019 sc->sc_cmd->subtype = LE_32(0); in ipw2100_cmd()
1020 sc->sc_cmd->seq = LE_32(0); in ipw2100_cmd()
1025 (void) memcpy(sc->sc_cmd->data, buf, len); in ipw2100_cmd()
1026 sc->sc_cmd->len = LE_32(len); in ipw2100_cmd()
1031 mutex_enter(&sc->sc_tx_lock); in ipw2100_cmd()
1033 IPW2100_DBG(IPW2100_DBG_RING, (sc->sc_dip, CE_CONT, in ipw2100_cmd()
1034 "ipw2100_cmd(): tx-free=%d\n", sc->sc_tx_free)); in ipw2100_cmd()
1039 while (sc->sc_tx_free < 1) { in ipw2100_cmd()
1040 sc->sc_flags |= IPW2100_FLAG_CMD_WAIT; in ipw2100_cmd()
1041 cv_wait(&sc->sc_tx_cond, &sc->sc_tx_lock); in ipw2100_cmd()
1043 idx = sc->sc_tx_cur; in ipw2100_cmd()
1045 IPW2100_DBG(IPW2100_DBG_RING, (sc->sc_dip, CE_CONT, in ipw2100_cmd()
1048 sc->sc_done = 0; in ipw2100_cmd()
1050 txbd = &sc->sc_txbd[idx]; in ipw2100_cmd()
1051 txbd->phyaddr = LE_32(sc->sc_dma_cmd.dr_pbase); in ipw2100_cmd()
1059 (void) ddi_dma_sync(sc->sc_dma_cmd.dr_hnd, 0, in ipw2100_cmd()
1061 (void) ddi_dma_sync(sc->sc_dma_txbd.dr_hnd, in ipw2100_cmd()
1068 sc->sc_tx_cur = RING_FORWARD(sc->sc_tx_cur, 1, IPW2100_NUM_TXBD); in ipw2100_cmd()
1069 sc->sc_tx_free--; in ipw2100_cmd()
1070 ipw2100_csr_put32(sc, IPW2100_CSR_TX_WRITE_INDEX, sc->sc_tx_cur); in ipw2100_cmd()
1071 mutex_exit(&sc->sc_tx_lock); in ipw2100_cmd()
1077 mutex_enter(&sc->sc_ilock); in ipw2100_cmd()
1078 while (sc->sc_done == 0) { in ipw2100_cmd()
1082 if (cv_reltimedwait(&sc->sc_cmd_cond, &sc->sc_ilock, in ipw2100_cmd()
1086 mutex_exit(&sc->sc_ilock); in ipw2100_cmd()
1088 IPW2100_DBG(IPW2100_DBG_RING, (sc->sc_dip, CE_CONT, in ipw2100_cmd()
1089 "ipw2100_cmd(): cmd-done=%s\n", sc->sc_done ? "yes" : "no")); in ipw2100_cmd()
1091 if (sc->sc_done == 0) in ipw2100_cmd()
1098 ipw2100_init(struct ipw2100_softc *sc) in ipw2100_init() argument
1102 IPW2100_DBG(IPW2100_DBG_INIT, (sc->sc_dip, CE_CONT, in ipw2100_init()
1108 if (!(sc->sc_flags & IPW2100_FLAG_FW_CACHED)) { in ipw2100_init()
1109 IPW2100_WARN((sc->sc_dip, CE_WARN, in ipw2100_init()
1114 ipw2100_stop(sc); in ipw2100_init()
1116 err = ipw2100_chip_reset(sc); in ipw2100_init()
1118 IPW2100_WARN((sc->sc_dip, CE_WARN, in ipw2100_init()
1126 IPW2100_DBG(IPW2100_DBG_INIT, (sc->sc_dip, CE_CONT, in ipw2100_init()
1128 err = ipw2100_load_uc(sc); in ipw2100_init()
1130 IPW2100_WARN((sc->sc_dip, CE_WARN, in ipw2100_init()
1135 ipw2100_master_stop(sc); in ipw2100_init()
1137 ipw2100_ring_hwsetup(sc); in ipw2100_init()
1142 IPW2100_DBG(IPW2100_DBG_INIT, (sc->sc_dip, CE_CONT, in ipw2100_init()
1144 err = ipw2100_load_fw(sc); in ipw2100_init()
1146 IPW2100_WARN((sc->sc_dip, CE_WARN, in ipw2100_init()
1154 ipw2100_tables_init(sc); in ipw2100_init()
1155 ipw2100_table1_put32(sc, IPW2100_INFO_LOCK, 0); in ipw2100_init()
1160 err = ipw2100_config(sc); in ipw2100_init()
1162 IPW2100_WARN((sc->sc_dip, CE_WARN, in ipw2100_init()
1172 ipw2100_stop(sc); in ipw2100_init()
1181 ipw2100_hwconf_get(struct ipw2100_softc *sc) in ipw2100_hwconf_get() argument
1190 val = ipw2100_rom_get16(sc, IPW2100_ROM_MAC + 0); in ipw2100_hwconf_get()
1191 sc->sc_macaddr[i++] = val >> 8; in ipw2100_hwconf_get()
1192 sc->sc_macaddr[i++] = val & 0xff; in ipw2100_hwconf_get()
1193 val = ipw2100_rom_get16(sc, IPW2100_ROM_MAC + 1); in ipw2100_hwconf_get()
1194 sc->sc_macaddr[i++] = val >> 8; in ipw2100_hwconf_get()
1195 sc->sc_macaddr[i++] = val & 0xff; in ipw2100_hwconf_get()
1196 val = ipw2100_rom_get16(sc, IPW2100_ROM_MAC + 2); in ipw2100_hwconf_get()
1197 sc->sc_macaddr[i++] = val >> 8; in ipw2100_hwconf_get()
1198 sc->sc_macaddr[i++] = val & 0xff; in ipw2100_hwconf_get()
1203 (void) snprintf(sc->sc_macstr, sizeof (sc->sc_macstr), in ipw2100_hwconf_get()
1205 sc->sc_macaddr[0], sc->sc_macaddr[1], in ipw2100_hwconf_get()
1206 sc->sc_macaddr[2], sc->sc_macaddr[3], in ipw2100_hwconf_get()
1207 sc->sc_macaddr[4], sc->sc_macaddr[5]); in ipw2100_hwconf_get()
1212 val = ipw2100_rom_get16(sc, IPW2100_ROM_CHANNEL_LIST); in ipw2100_hwconf_get()
1215 sc->sc_chmask = val << 1; in ipw2100_hwconf_get()
1216 IPW2100_DBG(IPW2100_DBG_HWCAP, (sc->sc_dip, CE_CONT, in ipw2100_hwconf_get()
1217 "ipw2100_hwconf_get(): channel-mask=0x%08x\n", sc->sc_chmask)); in ipw2100_hwconf_get()
1222 val = ipw2100_rom_get16(sc, IPW2100_ROM_RADIO); in ipw2100_hwconf_get()
1224 sc->sc_flags |= IPW2100_FLAG_HAS_RADIO_SWITCH; in ipw2100_hwconf_get()
1226 IPW2100_DBG(IPW2100_DBG_HWCAP, (sc->sc_dip, CE_CONT, in ipw2100_hwconf_get()
1228 (sc->sc_flags & IPW2100_FLAG_HAS_RADIO_SWITCH)? "yes" : "no", in ipw2100_hwconf_get()
1236 ipw2100_master_stop(struct ipw2100_softc *sc) in ipw2100_master_stop() argument
1244 ipw2100_csr_put32(sc, IPW2100_CSR_INTR_MASK, 0); in ipw2100_master_stop()
1246 ipw2100_csr_put32(sc, IPW2100_CSR_RST, IPW2100_RST_STOP_MASTER); in ipw2100_master_stop()
1248 if (ipw2100_csr_get32(sc, IPW2100_CSR_RST) in ipw2100_master_stop()
1253 if (ntries == 50 && !(sc->sc_flags & IPW2100_FLAG_QUIESCED)) in ipw2100_master_stop()
1254 IPW2100_WARN((sc->sc_dip, CE_WARN, in ipw2100_master_stop()
1257 tmp = ipw2100_csr_get32(sc, IPW2100_CSR_RST); in ipw2100_master_stop()
1258 ipw2100_csr_put32(sc, IPW2100_CSR_RST, in ipw2100_master_stop()
1261 sc->sc_flags &= ~IPW2100_FLAG_FW_INITED; in ipw2100_master_stop()
1268 ipw2100_chip_reset(struct ipw2100_softc *sc) in ipw2100_chip_reset() argument
1273 ipw2100_master_stop(sc); in ipw2100_chip_reset()
1278 tmp = ipw2100_csr_get32(sc, IPW2100_CSR_CTL); in ipw2100_chip_reset()
1279 ipw2100_csr_put32(sc, IPW2100_CSR_CTL, tmp | IPW2100_CTL_INIT); in ipw2100_chip_reset()
1285 if (ipw2100_csr_get32(sc, IPW2100_CSR_CTL) in ipw2100_chip_reset()
1293 tmp = ipw2100_csr_get32(sc, IPW2100_CSR_RST); in ipw2100_chip_reset()
1294 ipw2100_csr_put32(sc, IPW2100_CSR_RST, tmp | IPW2100_RST_SW_RESET); in ipw2100_chip_reset()
1298 tmp = ipw2100_csr_get32(sc, IPW2100_CSR_CTL); in ipw2100_chip_reset()
1299 ipw2100_csr_put32(sc, IPW2100_CSR_CTL, tmp | IPW2100_CTL_INIT); in ipw2100_chip_reset()
1308 ipw2100_get_radio(struct ipw2100_softc *sc) in ipw2100_get_radio() argument
1310 if (ipw2100_csr_get32(sc, IPW2100_CSR_IO) & IPW2100_IO_RADIO_DISABLED) in ipw2100_get_radio()
1320 ipw2100_get_statistics(struct ipw2100_softc *sc) in ipw2100_get_statistics() argument
1322 struct ieee80211com *ic = &sc->sc_ic; in ipw2100_get_statistics()
1328 if (!(sc->sc_flags & IPW2100_FLAG_FW_INITED)) { in ipw2100_get_statistics()
1329 IPW2100_DBG(IPW2100_DBG_STATISTIC, (sc->sc_dip, CE_CONT, in ipw2100_get_statistics()
1334 ipw2100_csr_put32(sc, IPW2100_CSR_AUTOINC_ADDR, sc->sc_table1_base); in ipw2100_get_statistics()
1336 size = ipw2100_csr_get32(sc, IPW2100_CSR_AUTOINC_DATA); in ipw2100_get_statistics()
1339 addr = ipw2100_csr_get32(sc, IPW2100_CSR_AUTOINC_DATA); in ipw2100_get_statistics()
1340 *datatbl = ipw2100_imem_get32(sc, addr); in ipw2100_get_statistics()
1347 IPW2100_DBG(IPW2100_DBG_STATISTIC, (sc->sc_dip, CE_CONT, in ipw2100_get_statistics()
1380 ipw2100_dma_region_alloc(struct ipw2100_softc *sc, in ipw2100_dma_region_alloc() argument
1383 dev_info_t *dip = sc->sc_dip; in ipw2100_dma_region_alloc()
1450 ipw2100_ring_alloc(struct ipw2100_softc *sc) in ipw2100_ring_alloc() argument
1457 sc->sc_dma_txbd.dr_name = "ipw2100-tx-ring-bd"; in ipw2100_ring_alloc()
1458 err = ipw2100_dma_region_alloc(sc, &sc->sc_dma_txbd, in ipw2100_ring_alloc()
1466 sc->sc_dma_txbufs[i].dr_name = "ipw2100-tx-buf"; in ipw2100_ring_alloc()
1467 err = ipw2100_dma_region_alloc(sc, &sc->sc_dma_txbufs[i], in ipw2100_ring_alloc()
1472 ipw2100_dma_region_free(&sc->sc_dma_txbufs[i]); in ipw2100_ring_alloc()
1480 sc->sc_dma_rxbd.dr_name = "ipw2100-rx-ring-bd"; in ipw2100_ring_alloc()
1481 err = ipw2100_dma_region_alloc(sc, &sc->sc_dma_rxbd, in ipw2100_ring_alloc()
1489 sc->sc_dma_rxbufs[i].dr_name = "ipw2100-rx-buf"; in ipw2100_ring_alloc()
1490 err = ipw2100_dma_region_alloc(sc, &sc->sc_dma_rxbufs[i], in ipw2100_ring_alloc()
1495 ipw2100_dma_region_free(&sc->sc_dma_rxbufs[i]); in ipw2100_ring_alloc()
1503 sc->sc_dma_status.dr_name = "ipw2100-rx-status"; in ipw2100_ring_alloc()
1504 err = ipw2100_dma_region_alloc(sc, &sc->sc_dma_status, in ipw2100_ring_alloc()
1511 sc->sc_dma_cmd.dr_name = "ipw2100-cmd"; in ipw2100_ring_alloc()
1512 err = ipw2100_dma_region_alloc(sc, &sc->sc_dma_cmd, IPW2100_CMD_SIZE, in ipw2100_ring_alloc()
1520 ipw2100_dma_region_free(&sc->sc_dma_status); in ipw2100_ring_alloc()
1523 ipw2100_dma_region_free(&sc->sc_dma_rxbufs[i]); in ipw2100_ring_alloc()
1525 ipw2100_dma_region_free(&sc->sc_dma_rxbd); in ipw2100_ring_alloc()
1528 ipw2100_dma_region_free(&sc->sc_dma_txbufs[i]); in ipw2100_ring_alloc()
1530 ipw2100_dma_region_free(&sc->sc_dma_txbd); in ipw2100_ring_alloc()
1536 ipw2100_ring_free(struct ipw2100_softc *sc) in ipw2100_ring_free() argument
1543 ipw2100_dma_region_free(&sc->sc_dma_txbd); in ipw2100_ring_free()
1548 ipw2100_dma_region_free(&sc->sc_dma_txbufs[i]); in ipw2100_ring_free()
1552 ipw2100_dma_region_free(&sc->sc_dma_rxbd); in ipw2100_ring_free()
1557 ipw2100_dma_region_free(&sc->sc_dma_rxbufs[i]); in ipw2100_ring_free()
1561 ipw2100_dma_region_free(&sc->sc_dma_status); in ipw2100_ring_free()
1565 ipw2100_dma_region_free(&sc->sc_dma_cmd); in ipw2100_ring_free()
1569 ipw2100_ring_reset(struct ipw2100_softc *sc) in ipw2100_ring_reset() argument
1576 sc->sc_tx_cur = 0; in ipw2100_ring_reset()
1577 sc->sc_tx_free = IPW2100_NUM_TXBD; in ipw2100_ring_reset()
1578 sc->sc_txbd = (struct ipw2100_bd *)sc->sc_dma_txbd.dr_base; in ipw2100_ring_reset()
1580 sc->sc_txbufs[i] = in ipw2100_ring_reset()
1581 (struct ipw2100_txb *)sc->sc_dma_txbufs[i].dr_base; in ipw2100_ring_reset()
1585 sc->sc_rx_cur = 0; in ipw2100_ring_reset()
1586 sc->sc_rx_free = IPW2100_NUM_RXBD; in ipw2100_ring_reset()
1587 sc->sc_status = (struct ipw2100_status *)sc->sc_dma_status.dr_base; in ipw2100_ring_reset()
1588 sc->sc_rxbd = (struct ipw2100_bd *)sc->sc_dma_rxbd.dr_base; in ipw2100_ring_reset()
1590 sc->sc_rxbufs[i] = in ipw2100_ring_reset()
1591 (struct ipw2100_rxb *)sc->sc_dma_rxbufs[i].dr_base; in ipw2100_ring_reset()
1595 sc->sc_rxbd[i].phyaddr = LE_32(sc->sc_dma_rxbufs[i].dr_pbase); in ipw2100_ring_reset()
1596 sc->sc_rxbd[i].len = LE_32(sc->sc_dma_rxbufs[i].dr_size); in ipw2100_ring_reset()
1597 sc->sc_rxbd[i].flags = 0; in ipw2100_ring_reset()
1598 sc->sc_rxbd[i].nfrag = 1; in ipw2100_ring_reset()
1603 sc->sc_cmd = (struct ipw2100_cmd *)sc->sc_dma_cmd.dr_base; in ipw2100_ring_reset()
1610 ipw2100_ring_init(struct ipw2100_softc *sc) in ipw2100_ring_init() argument
1614 err = ipw2100_ring_alloc(sc); in ipw2100_ring_init()
1618 ipw2100_ring_reset(sc); in ipw2100_ring_init()
1624 ipw2100_ring_hwsetup(struct ipw2100_softc *sc) in ipw2100_ring_hwsetup() argument
1626 ipw2100_ring_reset(sc); in ipw2100_ring_hwsetup()
1630 ipw2100_csr_put32(sc, IPW2100_CSR_TX_BD_BASE, sc->sc_dma_txbd.dr_pbase); in ipw2100_ring_hwsetup()
1631 ipw2100_csr_put32(sc, IPW2100_CSR_TX_BD_SIZE, IPW2100_NUM_TXBD); in ipw2100_ring_hwsetup()
1635 ipw2100_csr_put32(sc, IPW2100_CSR_TX_READ_INDEX, sc->sc_tx_cur); in ipw2100_ring_hwsetup()
1636 ipw2100_csr_put32(sc, IPW2100_CSR_TX_WRITE_INDEX, sc->sc_tx_cur); in ipw2100_ring_hwsetup()
1640 ipw2100_csr_put32(sc, IPW2100_CSR_RX_BD_BASE, sc->sc_dma_rxbd.dr_pbase); in ipw2100_ring_hwsetup()
1641 ipw2100_csr_put32(sc, IPW2100_CSR_RX_BD_SIZE, IPW2100_NUM_RXBD); in ipw2100_ring_hwsetup()
1645 IPW2100_DBG(IPW2100_DBG_RING, (sc->sc_dip, CE_CONT, in ipw2100_ring_hwsetup()
1647 sc->sc_rx_cur, RING_BACKWARD(sc->sc_rx_cur, 1, IPW2100_NUM_RXBD))); in ipw2100_ring_hwsetup()
1648 ipw2100_csr_put32(sc, IPW2100_CSR_RX_READ_INDEX, sc->sc_rx_cur); in ipw2100_ring_hwsetup()
1649 ipw2100_csr_put32(sc, IPW2100_CSR_RX_WRITE_INDEX, in ipw2100_ring_hwsetup()
1650 RING_BACKWARD(sc->sc_rx_cur, 1, IPW2100_NUM_RXBD)); in ipw2100_ring_hwsetup()
1654 ipw2100_csr_put32(sc, IPW2100_CSR_RX_STATUS_BASE, in ipw2100_ring_hwsetup()
1655 sc->sc_dma_status.dr_pbase); in ipw2100_ring_hwsetup()
1667 struct ipw2100_softc *sc = (struct ipw2100_softc *)ic; in ipw2100_newstate() local
1673 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_newstate()
1684 (void) ipw2100_table2_getbuf(sc, IPW2100_INFO_CURRENT_BSSID, in ipw2100_newstate()
1722 sc->sc_linkstate = LINK_STATE_UP; in ipw2100_newstate()
1723 sc->sc_flags |= IPW2100_FLAG_LINK_CHANGE; in ipw2100_newstate()
1729 sc->sc_linkstate = LINK_STATE_DOWN; in ipw2100_newstate()
1730 sc->sc_flags |= IPW2100_FLAG_LINK_CHANGE; in ipw2100_newstate()
1812 ipw2100_thread(struct ipw2100_softc *sc) in ipw2100_thread() argument
1814 struct ieee80211com *ic = &sc->sc_ic; in ipw2100_thread()
1818 IPW2100_DBG(IPW2100_DBG_SOFTINT, (sc->sc_dip, CE_CONT, in ipw2100_thread()
1820 sc->sc_linkstate)); in ipw2100_thread()
1822 mutex_enter(&sc->sc_mflock); in ipw2100_thread()
1824 while (sc->sc_mfthread_switch) { in ipw2100_thread()
1828 if (ic->ic_mach && (sc->sc_flags & IPW2100_FLAG_LINK_CHANGE)) { in ipw2100_thread()
1829 IPW2100_DBG(IPW2100_DBG_SOFTINT, (sc->sc_dip, CE_CONT, in ipw2100_thread()
1831 sc->sc_linkstate)); in ipw2100_thread()
1833 sc->sc_flags &= ~IPW2100_FLAG_LINK_CHANGE; in ipw2100_thread()
1834 nlstate = sc->sc_linkstate; in ipw2100_thread()
1836 mutex_exit(&sc->sc_mflock); in ipw2100_thread()
1838 mutex_enter(&sc->sc_mflock); in ipw2100_thread()
1845 (sc->sc_flags & IPW2100_FLAG_HW_ERR_RECOVER)) { in ipw2100_thread()
1847 IPW2100_DBG(IPW2100_DBG_FATAL, (sc->sc_dip, CE_CONT, in ipw2100_thread()
1849 sc->sc_flags &= ~IPW2100_FLAG_HW_ERR_RECOVER; in ipw2100_thread()
1851 mutex_exit(&sc->sc_mflock); in ipw2100_thread()
1852 (void) ipw2100_init(sc); /* Force stat machine */ in ipw2100_thread()
1854 mutex_enter(&sc->sc_mflock); in ipw2100_thread()
1863 mutex_exit(&sc->sc_mflock); in ipw2100_thread()
1864 ipw2100_get_statistics(sc); in ipw2100_thread()
1865 mutex_enter(&sc->sc_mflock); in ipw2100_thread()
1869 mutex_exit(&sc->sc_mflock); in ipw2100_thread()
1871 mutex_enter(&sc->sc_mflock); in ipw2100_thread()
1873 sc->sc_mf_thread = NULL; in ipw2100_thread()
1874 cv_broadcast(&sc->sc_mfthread_cv); in ipw2100_thread()
1875 mutex_exit(&sc->sc_mflock); in ipw2100_thread()
1881 struct ipw2100_softc *sc = (struct ipw2100_softc *)arg; in ipw2100_m_start() local
1883 IPW2100_DBG(IPW2100_DBG_GLD, (sc->sc_dip, CE_CONT, in ipw2100_m_start()
1889 (void) ipw2100_init(sc); in ipw2100_m_start()
1891 sc->sc_flags |= IPW2100_FLAG_RUNNING; in ipw2100_m_start()
1903 struct ipw2100_softc *sc = (struct ipw2100_softc *)arg; in ipw2100_m_stop() local
1905 IPW2100_DBG(IPW2100_DBG_GLD, (sc->sc_dip, CE_CONT, in ipw2100_m_stop()
1908 ipw2100_stop(sc); in ipw2100_m_stop()
1910 sc->sc_flags &= ~IPW2100_FLAG_RUNNING; in ipw2100_m_stop()
1916 struct ipw2100_softc *sc = (struct ipw2100_softc *)arg; in ipw2100_m_unicst() local
1917 struct ieee80211com *ic = &sc->sc_ic; in ipw2100_m_unicst()
1920 IPW2100_DBG(IPW2100_DBG_GLD, (sc->sc_dip, CE_CONT, in ipw2100_m_unicst()
1923 IPW2100_DBG(IPW2100_DBG_GLD, (sc->sc_dip, CE_CONT, in ipw2100_m_unicst()
1932 if (sc->sc_flags & IPW2100_FLAG_RUNNING) { in ipw2100_m_unicst()
1933 err = ipw2100_config(sc); in ipw2100_m_unicst()
1935 IPW2100_WARN((sc->sc_dip, CE_WARN, in ipw2100_m_unicst()
1951 struct ipw2100_softc *sc = (struct ipw2100_softc *)arg; in ipw2100_m_promisc() local
1954 IPW2100_DBG(IPW2100_DBG_GLD, (sc->sc_dip, CE_CONT, in ipw2100_m_promisc()
1960 if (!(sc->if_flags & IFF_PROMISC)) { in ipw2100_m_promisc()
1961 sc->if_flags |= IFF_PROMISC; in ipw2100_m_promisc()
1965 if (sc->if_flags & IFF_PROMISC) { in ipw2100_m_promisc()
1966 sc->if_flags &= ~IFF_PROMISC; in ipw2100_m_promisc()
1970 if (recfg && (sc->sc_flags & IPW2100_FLAG_RUNNING)) { in ipw2100_m_promisc()
1971 err = ipw2100_config(sc); in ipw2100_m_promisc()
1973 IPW2100_WARN((sc->sc_dip, CE_WARN, in ipw2100_m_promisc()
1988 struct ipw2100_softc *sc = (struct ipw2100_softc *)arg; in ipw2100_m_tx() local
1989 struct ieee80211com *ic = &sc->sc_ic; in ipw2100_m_tx()
1998 IPW2100_DBG(IPW2100_DBG_GLD, (sc->sc_dip, CE_CONT, in ipw2100_m_tx()
2022 struct ipw2100_softc *sc = (struct ipw2100_softc *)ic; in ipw2100_send() local
2042 IPW2100_DBG(IPW2100_DBG_GLD, (sc->sc_dip, CE_CONT, in ipw2100_send()
2055 mutex_enter(&sc->sc_tx_lock); in ipw2100_send()
2062 if (sc->sc_tx_free < 2) { in ipw2100_send()
2063 mutex_enter(&sc->sc_resched_lock); in ipw2100_send()
2064 IPW2100_DBG(IPW2100_DBG_RING, (sc->sc_dip, CE_WARN, in ipw2100_send()
2066 sc->sc_tx_free)); in ipw2100_send()
2068 sc->sc_flags |= IPW2100_FLAG_TX_SCHED; in ipw2100_send()
2070 mutex_exit(&sc->sc_resched_lock); in ipw2100_send()
2073 IPW2100_DBG(IPW2100_DBG_RING, (sc->sc_dip, CE_CONT, in ipw2100_send()
2075 sc->sc_tx_free, sc->sc_tx_cur)); in ipw2100_send()
2099 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_send()
2118 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_send()
2124 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_send()
2132 IPW2100_DBG(IPW2100_DBG_WIFI, (sc->sc_dip, CE_CONT, in ipw2100_send()
2141 idx = sc->sc_tx_cur; in ipw2100_send()
2142 txbd[0] = &sc->sc_txbd[idx]; in ipw2100_send()
2145 sc->sc_tx_cur = RING_FORWARD(sc->sc_tx_cur, 1, IPW2100_NUM_TXBD); in ipw2100_send()
2146 sc->sc_tx_free--; in ipw2100_send()
2151 idx = sc->sc_tx_cur; in ipw2100_send()
2152 txbd[1] = &sc->sc_txbd[idx]; in ipw2100_send()
2155 sc->sc_tx_cur = RING_FORWARD(sc->sc_tx_cur, 1, IPW2100_NUM_TXBD); in ipw2100_send()
2156 sc->sc_tx_free--; in ipw2100_send()
2161 txbuf = sc->sc_txbufs[bidx]; in ipw2100_send()
2162 dr = &sc->sc_dma_txbufs[bidx]; in ipw2100_send()
2240 (void) ddi_dma_sync(sc->sc_dma_txbd.dr_hnd, in ipw2100_send()
2241 (txbd[0] - sc->sc_txbd) * sizeof (struct ipw2100_bd), in ipw2100_send()
2247 (void) ddi_dma_sync(sc->sc_dma_txbd.dr_hnd, in ipw2100_send()
2248 (txbd[1] - sc->sc_txbd) * sizeof (struct ipw2100_bd), in ipw2100_send()
2253 ipw2100_csr_put32(sc, IPW2100_CSR_TX_WRITE_INDEX, sc->sc_tx_cur); in ipw2100_send()
2261 mutex_exit(&sc->sc_tx_lock); in ipw2100_send()
2263 IPW2100_DBG(IPW2100_DBG_GLD, (sc->sc_dip, CE_CONT, in ipw2100_send()
2277 struct ipw2100_softc *sc = (struct ipw2100_softc *)arg; in ipw2100_m_ioctl() local
2278 struct ieee80211com *ic = &sc->sc_ic; in ipw2100_m_ioctl()
2281 IPW2100_DBG(IPW2100_DBG_GLD, (sc->sc_dip, CE_CONT, in ipw2100_m_ioctl()
2287 if (ipw2100_ioctl(sc, q, m) == IEEE80211_IOCTL_NOT_REQUIRED) in ipw2100_m_ioctl()
2292 if (sc->sc_flags & IPW2100_FLAG_RUNNING) { in ipw2100_m_ioctl()
2293 (void) ipw2100_m_start(sc); in ipw2100_m_ioctl()
2299 if (sc->sc_flags & IPW2100_FLAG_RUNNING) in ipw2100_m_ioctl()
2300 (void) ipw2100_chip_reset(sc); in ipw2100_m_ioctl()
2305 ipw2100_ioctl(struct ipw2100_softc *sc, queue_t *q, mblk_t *m) in ipw2100_ioctl() argument
2314 IPW2100_DBG(IPW2100_DBG_IOCTL, (sc->sc_dip, CE_CONT, in ipw2100_ioctl()
2336 IPW2100_DBG(IPW2100_DBG_IOCTL, (sc->sc_dip, CE_CONT, in ipw2100_ioctl()
2365 ret = ipw2100_getset(sc, m0, cmd, &need_net80211); in ipw2100_ioctl()
2369 IPW2100_DBG(IPW2100_DBG_IOCTL, (sc->sc_dip, CE_CONT, in ipw2100_ioctl()
2383 ipw2100_getset(struct ipw2100_softc *sc, mblk_t *m, uint32_t cmd, in ipw2100_getset() argument
2395 IPW2100_DBG(IPW2100_DBG_IOCTL, (sc->sc_dip, CE_CONT, in ipw2100_getset()
2403 ret = ipw_wificfg_radio(sc, cmd, outfp); in ipw2100_getset()
2419 ret = ipw_wificfg_disassoc(sc, outfp); in ipw2100_getset()
2447 if ((ipw2100_get_radio(sc) == 0) && in ipw2100_getset()
2450 IPW2100_REPORT((sc->sc_dip, CE_WARN, in ipw2100_getset()
2477 struct ipw2100_softc *sc = (struct ipw2100_softc *)arg; in ipw2100_m_getprop() local
2478 struct ieee80211com *ic = &sc->sc_ic; in ipw2100_m_getprop()
2484 IPW2100_DBG(IPW2100_DBG_BRUSSELS, (sc->sc_dip, CE_CONT, in ipw2100_m_getprop()
2488 *(wl_linkstatus_t *)wldp_buf = ipw2100_get_radio(sc); in ipw2100_m_getprop()
2504 struct ipw2100_softc *sc = (struct ipw2100_softc *)arg; in ipw2100_m_propinfo() local
2505 struct ieee80211com *ic = &sc->sc_ic; in ipw2100_m_propinfo()
2515 struct ipw2100_softc *sc = (struct ipw2100_softc *)arg; in ipw2100_m_setprop() local
2516 struct ieee80211com *ic = &sc->sc_ic; in ipw2100_m_setprop()
2522 IPW2100_DBG(IPW2100_DBG_BRUSSELS, (sc->sc_dip, CE_CONT, in ipw2100_m_setprop()
2527 IPW2100_DBG(IPW2100_DBG_BRUSSELS, (sc->sc_dip, CE_CONT, in ipw2100_m_setprop()
2539 if (sc->sc_flags & IPW2100_FLAG_RUNNING) { in ipw2100_m_setprop()
2540 (void) ipw2100_m_start(sc); in ipw2100_m_setprop()
2552 ipw_wificfg_radio(struct ipw2100_softc *sc, uint32_t cmd, wldp_t *outfp) in ipw_wificfg_radio() argument
2558 *(wl_linkstatus_t *)(outfp->wldp_buf) = ipw2100_get_radio(sc); in ipw_wificfg_radio()
2582 ipw_wificfg_disassoc(struct ipw2100_softc *sc, wldp_t *outfp) in ipw_wificfg_disassoc() argument
2584 struct ieee80211com *ic = &sc->sc_ic; in ipw_wificfg_disassoc()
2640 ipw2100_rcvpkt(struct ipw2100_softc *sc, struct ipw2100_status *status, in ipw2100_rcvpkt() argument
2643 struct ieee80211com *ic = &sc->sc_ic; in ipw2100_rcvpkt()
2659 IPW2100_WARN((sc->sc_dip, CE_WARN, in ipw2100_rcvpkt()
2668 struct ipw2100_softc *sc = (struct ipw2100_softc *)(uintptr_t)arg; in ipw2100_intr() local
2670 struct ieee80211com *ic = &sc->sc_ic; in ipw2100_intr()
2679 if (sc->sc_suspended) in ipw2100_intr()
2682 ireg = ipw2100_csr_get32(sc, IPW2100_CSR_INTR); in ipw2100_intr()
2690 ipw2100_csr_put32(sc, IPW2100_CSR_INTR_MASK, 0); in ipw2100_intr()
2695 ipw2100_csr_put32(sc, IPW2100_CSR_INTR, ireg); in ipw2100_intr()
2697 IPW2100_DBG(IPW2100_DBG_INT, (sc->sc_dip, CE_CONT, in ipw2100_intr()
2702 IPW2100_DBG(IPW2100_DBG_FATAL, (sc->sc_dip, CE_CONT, in ipw2100_intr()
2709 mutex_enter(&sc->sc_mflock); in ipw2100_intr()
2710 sc->sc_flags |= IPW2100_FLAG_HW_ERR_RECOVER; in ipw2100_intr()
2711 mutex_exit(&sc->sc_mflock); in ipw2100_intr()
2720 mutex_enter(&sc->sc_ilock); in ipw2100_intr()
2721 sc->sc_flags |= IPW2100_FLAG_FW_INITED; in ipw2100_intr()
2722 cv_signal(&sc->sc_fw_cond); in ipw2100_intr()
2723 mutex_exit(&sc->sc_ilock); in ipw2100_intr()
2730 ridx = ipw2100_csr_get32(sc, in ipw2100_intr()
2733 for (; sc->sc_rx_cur != ridx; in ipw2100_intr()
2734 sc->sc_rx_cur = RING_FORWARD( in ipw2100_intr()
2735 sc->sc_rx_cur, 1, IPW2100_NUM_RXBD)) { in ipw2100_intr()
2737 i = sc->sc_rx_cur; in ipw2100_intr()
2738 status = &sc->sc_status[i]; in ipw2100_intr()
2739 rxbuf = &sc->sc_rxbufs[i]->rxb_dat[0]; in ipw2100_intr()
2740 dr = &sc->sc_dma_rxbufs[i]; in ipw2100_intr()
2745 (void) ddi_dma_sync(sc->sc_dma_status.dr_hnd, in ipw2100_intr()
2749 (void) ddi_dma_sync(sc->sc_dma_rxbd.dr_hnd, in ipw2100_intr()
2756 IPW2100_DBG(IPW2100_DBG_INT, (sc->sc_dip, CE_CONT, in ipw2100_intr()
2762 rxbd = &sc->sc_rxbd[i]; in ipw2100_intr()
2763 IPW2100_DBG(IPW2100_DBG_INT, (sc->sc_dip, CE_CONT, in ipw2100_intr()
2774 mutex_enter(&sc->sc_ilock); in ipw2100_intr()
2775 sc->sc_done = 1; in ipw2100_intr()
2776 cv_signal(&sc->sc_cmd_cond); in ipw2100_intr()
2777 mutex_exit(&sc->sc_ilock); in ipw2100_intr()
2785 (sc->sc_dip, CE_CONT, in ipw2100_intr()
2805 IPW2100_REPORT((sc->sc_dip, CE_WARN, in ipw2100_intr()
2807 ipw2100_stop(sc); in ipw2100_intr()
2825 ipw2100_rcvpkt(sc, status, rxbuf); in ipw2100_intr()
2830 IPW2100_WARN((sc->sc_dip, CE_WARN, in ipw2100_intr()
2840 ipw2100_csr_put32(sc, IPW2100_CSR_RX_WRITE_INDEX, in ipw2100_intr()
2841 RING_BACKWARD(sc->sc_rx_cur, 1, IPW2100_NUM_RXBD)); in ipw2100_intr()
2848 mutex_enter(&sc->sc_tx_lock); in ipw2100_intr()
2849 ridx = ipw2100_csr_get32(sc, IPW2100_CSR_TX_READ_INDEX); in ipw2100_intr()
2850 len = RING_FLEN(RING_FORWARD(sc->sc_tx_cur, in ipw2100_intr()
2851 sc->sc_tx_free, IPW2100_NUM_TXBD), in ipw2100_intr()
2853 sc->sc_tx_free += len; in ipw2100_intr()
2854 IPW2100_DBG(IPW2100_DBG_INT, (sc->sc_dip, CE_CONT, in ipw2100_intr()
2856 mutex_exit(&sc->sc_tx_lock); in ipw2100_intr()
2858 mutex_enter(&sc->sc_resched_lock); in ipw2100_intr()
2859 if (len > 1 && (sc->sc_flags & IPW2100_FLAG_TX_SCHED)) { in ipw2100_intr()
2860 sc->sc_flags &= ~IPW2100_FLAG_TX_SCHED; in ipw2100_intr()
2863 mutex_exit(&sc->sc_resched_lock); in ipw2100_intr()
2870 ipw2100_csr_put32(sc, IPW2100_CSR_INTR_MASK, IPW2100_INTR_MASK_ALL); in ipw2100_intr()