Lines Matching defs:pcwl_p

208 	pcwl_maci_t *pcwl_p;
225 pcwl_p = (pcwl_maci_t *)ddi_get_soft_state(pcwl_soft_state_p,
227 pcwl_p->pcwl_device_type = pcwl_device_type;
228 if (pcwl_p->pcwl_device_type == PCWL_DEVICE_PCI) {
230 (caddr_t *)&pcwl_p->pcwl_cfg_base, 0, 0,
231 &accattr, &pcwl_p->pcwl_cfg_handle) != DDI_SUCCESS) {
237 stat = ddi_get16(pcwl_p->pcwl_cfg_handle,
238 (uint16_t *)(pcwl_p->pcwl_cfg_base + PCI_CONF_COMM));
240 ddi_put16(pcwl_p->pcwl_cfg_handle,
241 (uint16_t *)(pcwl_p->pcwl_cfg_base + PCI_CONF_COMM), stat);
242 stat = ddi_get16(pcwl_p->pcwl_cfg_handle,
243 (uint16_t *)(pcwl_p->pcwl_cfg_base + PCI_CONF_COMM));
252 if (ddi_regs_map_setup(dip, 1, (caddr_t *)&pcwl_p->pcwl_bar,
253 0, 0, &accattr, (ddi_acc_handle_t *)&pcwl_p->pcwl_handle)
260 (void *)pcwl_p->pcwl_bar));
265 PCWL_WRITE(pcwl_p, 0x26, 0x80);
267 PCWL_WRITE(pcwl_p, 0x26, 0x0);
271 PCWL_READ(pcwl_p, 0x0, stat);
287 PCWL_WRITE(pcwl_p, 0x28, 0x4a2d);
288 PCWL_READ(pcwl_p, 0x28, stat);
296 pcwl_p->pcwl_dip = dip;
297 pcwl_p->pcwl_flag = 0;
298 pcwl_p->pcwl_socket = ddi_getprop(DDI_DEV_T_NONE, dip,
300 pcwl_p->pcwl_reschedule_need = B_FALSE;
303 0, &pcwl_p->pcwl_ib_cookie) != DDI_SUCCESS) {
308 mutex_init(&pcwl_p->pcwl_glock, NULL, MUTEX_DRIVER,
309 pcwl_p->pcwl_ib_cookie);
310 mutex_init(&pcwl_p->pcwl_scanlist_lock, NULL, MUTEX_DRIVER,
311 pcwl_p->pcwl_ib_cookie);
312 mutex_init(&pcwl_p->pcwl_txring.wl_tx_lock, NULL, MUTEX_DRIVER,
313 pcwl_p->pcwl_ib_cookie);
315 if (pcwl_p->pcwl_device_type == PCWL_DEVICE_PCI) {
317 pcwl_intr, (caddr_t)pcwl_p)) {
321 } else if (pcwl_p->pcwl_device_type == PCWL_DEVICE_PCCARD) {
322 if (ret = pcwl_register_cs(dip, pcwl_p)) {
331 mutex_enter(&pcwl_p->pcwl_glock);
332 if (ret = pcwl_reset_backend(pcwl_p)) {
334 mutex_exit(&pcwl_p->pcwl_glock);
337 if (ret = pcwl_get_cap(pcwl_p)) { /* sets macaddr for mac_register */
339 mutex_exit(&pcwl_p->pcwl_glock);
342 mutex_exit(&pcwl_p->pcwl_glock);
358 macp->m_driver = pcwl_p;
360 macp->m_src_addr = pcwl_p->pcwl_mac_addr;
367 err = mac_register(macp, &pcwl_p->pcwl_mh);
375 mutex_enter(&pcwl_p->pcwl_glock);
376 if (pcwl_p->pcwl_device_type == PCWL_DEVICE_PCCARD) {
384 (void) csx_ModifyConfiguration(pcwl_p->pcwl_chdl, &cfgmod);
387 if (ret = pcwl_init_nicmem(pcwl_p)) {
390 mutex_exit(&pcwl_p->pcwl_glock);
393 pcwl_chip_type(pcwl_p);
394 if (ret = pcwl_loaddef_rf(pcwl_p)) {
396 mutex_exit(&pcwl_p->pcwl_glock);
399 (void) pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0);
400 pcwl_stop_locked(pcwl_p); /* leaves interface down */
401 list_create(&pcwl_p->pcwl_scan_list, sizeof (wl_scan_list_t),
403 pcwl_p->pcwl_scan_num = 0;
404 mutex_exit(&pcwl_p->pcwl_glock);
405 pcwl_p->pcwl_scanlist_timeout_id = timeout(pcwl_scanlist_timeout,
406 pcwl_p, drv_usectohz(1000000));
413 pcwl_p->pcwl_flag |= PCWL_ATTACHED;
414 if (pcwl_p->pcwl_device_type == PCWL_DEVICE_PCI) {
415 pcwl_p->pcwl_flag |= PCWL_CARD_READY;
419 if (pcwl_p->pcwl_scanlist_timeout_id != 0) {
420 (void) untimeout(pcwl_p->pcwl_scanlist_timeout_id);
421 pcwl_p->pcwl_scanlist_timeout_id = 0;
423 list_destroy(&pcwl_p->pcwl_scan_list);
425 (void) mac_unregister(pcwl_p->pcwl_mh);
427 if (pcwl_p->pcwl_device_type == PCWL_DEVICE_PCI) {
428 ddi_remove_intr(dip, 0, pcwl_p->pcwl_ib_cookie);
429 } else if (pcwl_p->pcwl_device_type == PCWL_DEVICE_PCCARD) {
430 pcwl_unregister_cs(pcwl_p);
433 pcwl_destroy_locks(pcwl_p);
435 if (pcwl_p->pcwl_device_type == PCWL_DEVICE_PCI)
436 ddi_regs_map_free(&pcwl_p->pcwl_handle);
438 if (pcwl_p->pcwl_device_type == PCWL_DEVICE_PCI)
439 ddi_regs_map_free(&pcwl_p->pcwl_cfg_handle);
449 pcwl_maci_t *pcwl_p;
452 pcwl_p = ddi_get_soft_state(pcwl_soft_state_p, ddi_get_instance(dip));
457 if (!(pcwl_p->pcwl_flag & PCWL_ATTACHED))
460 ret = mac_disable(pcwl_p->pcwl_mh);
464 if (pcwl_p->pcwl_device_type == PCWL_DEVICE_PCI) {
465 mutex_enter(&pcwl_p->pcwl_glock);
466 (void) pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0);
467 PCWL_DISABLE_INTR(pcwl_p);
468 mutex_exit(&pcwl_p->pcwl_glock);
470 if (pcwl_p->pcwl_scanlist_timeout_id != 0) {
471 (void) untimeout(pcwl_p->pcwl_scanlist_timeout_id);
472 pcwl_p->pcwl_scanlist_timeout_id = 0;
474 if (pcwl_p->pcwl_connect_timeout_id != 0) {
475 (void) untimeout(pcwl_p->pcwl_connect_timeout_id);
476 pcwl_p->pcwl_connect_timeout_id = 0;
478 mutex_enter(&pcwl_p->pcwl_scanlist_lock);
479 scan_item0 = list_head(&pcwl_p->pcwl_scan_list);
481 pcwl_delete_scan_item(pcwl_p, scan_item0);
482 scan_item0 = list_head(&pcwl_p->pcwl_scan_list);
484 list_destroy(&pcwl_p->pcwl_scan_list);
485 mutex_exit(&pcwl_p->pcwl_scanlist_lock);
486 (void) mac_unregister(pcwl_p->pcwl_mh);
488 if (pcwl_p->pcwl_device_type == PCWL_DEVICE_PCI) {
489 mutex_enter(&pcwl_p->pcwl_glock);
490 ddi_remove_intr(dip, 0, pcwl_p->pcwl_ib_cookie);
491 ddi_regs_map_free(&pcwl_p->pcwl_handle);
492 ddi_regs_map_free(&pcwl_p->pcwl_cfg_handle);
493 mutex_exit(&pcwl_p->pcwl_glock);
494 } else if (pcwl_p->pcwl_device_type == PCWL_DEVICE_PCCARD) {
495 pcwl_unregister_cs(pcwl_p);
497 pcwl_destroy_locks(pcwl_p);
507 pcwl_register_cs(dev_info_t *dip, pcwl_maci_t *pcwl_p)
521 cr.event_callback_args.client_data = pcwl_p;
530 pcwl_p->pcwl_chdl = chdl;
543 cv_init(&pcwl_p->pcwl_cscv, NULL, CV_DRIVER, NULL);
544 mutex_init(&pcwl_p->pcwl_cslock, NULL, MUTEX_DRIVER, *cr.iblk_cookie);
545 mutex_enter(&pcwl_p->pcwl_cslock);
546 if (ret = csx_MapLogSocket(chdl, &pcwl_p->pcwl_log_sock)) {
552 pcwl_p->pcwl_log_sock.LogSocket,
553 pcwl_p->pcwl_log_sock.PhyAdapter,
554 pcwl_p->pcwl_log_sock.PhySocket));
564 while (!(pcwl_p->pcwl_flag & PCWL_CARD_READY))
565 cv_wait(&pcwl_p->pcwl_cscv, &pcwl_p->pcwl_cslock);
566 mutex_exit(&pcwl_p->pcwl_cslock);
568 pcwl_p->pcwl_flag |= PCWL_CS_REGISTERED;
571 mutex_destroy(&pcwl_p->pcwl_cslock);
572 cv_destroy(&pcwl_p->pcwl_cscv);
576 pcwl_p->pcwl_flag &= ~PCWL_CS_REGISTERED;
581 pcwl_unregister_cs(pcwl_maci_t *pcwl_p)
585 mask.Socket = pcwl_p->pcwl_socket;
592 if (!(pcwl_p->pcwl_flag | PCWL_CS_REGISTERED))
595 if (ret = csx_ReleaseSocketMask(pcwl_p->pcwl_chdl, &mask))
598 if (pcwl_p->pcwl_flag & PCWL_CARD_READY) {
599 pcwl_card_remove(pcwl_p);
600 pcwl_p->pcwl_flag &= ~PCWL_CARD_READY;
602 mutex_destroy(&pcwl_p->pcwl_cslock);
603 cv_destroy(&pcwl_p->pcwl_cscv);
604 if (ret = csx_DeregisterClient(pcwl_p->pcwl_chdl))
609 pcwl_destroy_locks(pcwl_maci_t *pcwl_p)
611 mutex_destroy(&pcwl_p->pcwl_txring.wl_tx_lock);
612 mutex_destroy(&pcwl_p->pcwl_scanlist_lock);
613 mutex_destroy(&pcwl_p->pcwl_glock);
617 pcwl_do_suspend(pcwl_maci_t *pcwl_p);
623 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg->client_data;
626 mutex_enter(&pcwl_p->pcwl_cslock);
629 ret = pcwl_card_insert(pcwl_p);
630 cv_broadcast(&pcwl_p->pcwl_cscv);
633 cv_broadcast(&pcwl_p->pcwl_cscv);
638 pcwl_card_remove(pcwl_p);
639 cv_broadcast(&pcwl_p->pcwl_cscv);
654 pcwl_do_suspend(pcwl_p);
660 mutex_exit(&pcwl_p->pcwl_cslock);
668 pcwl_do_suspend(pcwl_maci_t *pcwl_p)
672 if (pcwl_p->pcwl_flag & PCWL_CARD_LINKUP) {
673 if (pcwl_p->pcwl_connect_timeout_id != 0) {
674 (void) untimeout(pcwl_p->pcwl_connect_timeout_id);
675 pcwl_p->pcwl_connect_timeout_id = 0;
677 mutex_enter(&pcwl_p->pcwl_glock);
678 pcwl_p->pcwl_flag &= ~PCWL_CARD_LINKUP;
679 (void) pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0);
686 if ((pcwl_p->pcwl_rf.rf_porttype == WL_BSS_IBSS) &&
687 (pcwl_p->pcwl_chip_type == PCWL_CHIP_LUCENT)) {
688 (void) pcwl_reset_backend(pcwl_p);
689 (void) pcwl_init_nicmem(pcwl_p);
690 pcwl_start_locked(pcwl_p);
692 if (ret = pcwl_loaddef_rf(pcwl_p)) {
695 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_ENABLE, 0)) {
698 pcwl_delay(pcwl_p, 1000000);
699 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0)) {
702 mac_link_update(GLD3(pcwl_p), LINK_STATE_DOWN);
703 mutex_exit(&pcwl_p->pcwl_glock);
705 pcwl_p->pcwl_flag |= PCWL_CARD_SUSPEND;
711 pcwl_card_insert(pcwl_maci_t *pcwl_p)
721 register client_handle_t chdl = pcwl_p->pcwl_chdl;
793 pcwl_p->pcwl_config_hi = tbl_p->index;
797 pcwl_p->pcwl_config = tbl_p->index;
802 pcwl_p->pcwl_vcc = tbl_p->pd.pd_vcc.nomV;
804 pcwl_p->pcwl_iodecode = tbl_p->io.addr_lines;
808 pcwl_p->pcwl_config_hi, pcwl_p->pcwl_config,
809 pcwl_p->pcwl_vcc, pcwl_p->pcwl_iodecode));
812 io.NumPorts1 = 1 << pcwl_p->pcwl_iodecode;
814 io.IOAddrLines = pcwl_p->pcwl_iodecode;
819 pcwl_p->pcwl_port = io.BasePort1.handle;
820 if (ret = ddi_add_softintr(DIP(pcwl_p), DDI_SOFTINT_HIGH,
821 &pcwl_p->pcwl_softint_id, &pcwl_p->pcwl_ib_cookie, NULL,
822 pcwl_intr, (caddr_t)pcwl_p)) {
827 irq.irq_handler = ddi_intr_hilevel(DIP(pcwl_p), 0) ?
829 irq.irq_handler_arg = pcwl_p;
830 if (ret = csx_RequestIRQ(pcwl_p->pcwl_chdl, &irq)) {
839 cfg.ConfigIndex = pcwl_p->pcwl_config;
842 pcwl_p->pcwl_flag |= PCWL_CARD_READY;
848 if (pcwl_p->pcwl_flag & PCWL_CARD_SUSPEND) {
849 mutex_enter(&pcwl_p->pcwl_glock);
850 (void) pcwl_reset_backend(pcwl_p);
856 (void) csx_ModifyConfiguration(pcwl_p->pcwl_chdl, &cfgmod);
858 (void) pcwl_init_nicmem(pcwl_p);
859 pcwl_chip_type(pcwl_p);
860 (void) pcwl_loaddef_rf(pcwl_p);
861 (void) pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0);
862 pcwl_stop_locked(pcwl_p); /* leaves interface down */
863 pcwl_p->pcwl_flag &= ~PCWL_CARD_SUSPEND;
864 mutex_exit(&pcwl_p->pcwl_glock);
866 if (pcwl_p->pcwl_flag & PCWL_CARD_PLUMBED) {
867 (void) pcwl_start(pcwl_p);
868 pcwl_p->pcwl_flag &= ~PCWL_CARD_PLUMBED;
874 ddi_remove_softintr(pcwl_p->pcwl_softint_id);
876 pcwl_p->pcwl_port = 0;
878 pcwl_p->pcwl_flag &= ~PCWL_CARD_READY;
887 pcwl_card_remove(pcwl_maci_t *pcwl_p)
897 if (!(pcwl_p->pcwl_flag & PCWL_CARD_READY))
900 if (pcwl_p->pcwl_connect_timeout_id != 0) {
901 (void) untimeout(pcwl_p->pcwl_connect_timeout_id);
902 pcwl_p->pcwl_connect_timeout_id = 0;
905 if (pcwl_p->pcwl_flag & PCWL_CARD_LINKUP) {
906 pcwl_p->pcwl_flag &= ~PCWL_CARD_LINKUP;
907 mac_link_update(GLD3(pcwl_p), LINK_STATE_DOWN);
909 mutex_enter(&pcwl_p->pcwl_glock);
910 if (pcwl_p->pcwl_flag & PCWL_CARD_INTREN) {
911 pcwl_stop_locked(pcwl_p);
912 pcwl_p->pcwl_flag |= PCWL_CARD_PLUMBED;
914 pcwl_p->pcwl_flag &= ~PCWL_CARD_READY;
915 mutex_exit(&pcwl_p->pcwl_glock);
916 if (ret = csx_ReleaseConfiguration(pcwl_p->pcwl_chdl, NULL))
920 if (ret = csx_ReleaseIRQ(pcwl_p->pcwl_chdl, &irq))
923 ddi_remove_softintr(pcwl_p->pcwl_softint_id);
926 io.BasePort1.handle = pcwl_p->pcwl_port;
928 if (ret = csx_ReleaseIO(pcwl_p->pcwl_chdl, &io))
931 pcwl_p->pcwl_port = 0;
940 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
942 mutex_enter(&pcwl_p->pcwl_glock);
943 if (!(pcwl_p->pcwl_flag & PCWL_CARD_READY)) {
944 mutex_exit(&pcwl_p->pcwl_glock);
947 pcwl_start_locked(pcwl_p);
948 mutex_exit(&pcwl_p->pcwl_glock);
955 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
958 mutex_enter(&pcwl_p->pcwl_glock);
959 if (!(pcwl_p->pcwl_flag & PCWL_CARD_READY)) {
960 mutex_exit(&pcwl_p->pcwl_glock);
964 pcwl_stop_locked(pcwl_p);
965 mutex_exit(&pcwl_p->pcwl_glock);
966 if (pcwl_p->pcwl_connect_timeout_id != 0) {
967 (void) untimeout(pcwl_p->pcwl_connect_timeout_id);
968 pcwl_p->pcwl_connect_timeout_id = 0;
976 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
978 mutex_enter(&pcwl_p->pcwl_glock);
979 if (!(pcwl_p->pcwl_flag & PCWL_CARD_READY)) {
983 ether_copy(macaddr, pcwl_p->pcwl_mac_addr);
984 if (pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0)) {
988 if (pcwl_saddr_locked(pcwl_p)) {
992 if (pcwl_set_cmd(pcwl_p, WL_CMD_ENABLE, 0)) {
998 mutex_exit(&pcwl_p->pcwl_glock);
1003 pcwl_send(pcwl_maci_t *pcwl_p, mblk_t *mblk_p)
1013 mutex_enter(&pcwl_p->pcwl_glock);
1014 if ((pcwl_p->pcwl_flag & (PCWL_CARD_READY | PCWL_CARD_LINKUP)) !=
1016 mutex_exit(&pcwl_p->pcwl_glock);
1020 mutex_exit(&pcwl_p->pcwl_glock);
1029 mutex_enter(&pcwl_p->pcwl_txring.wl_tx_lock);
1030 ring_idx = pcwl_p->pcwl_txring.wl_tx_prod;
1031 pcwl_p->pcwl_txring.wl_tx_prod = (ring_idx + 1) & (WL_XMT_BUF_NUM - 1);
1037 (pcwl_p->pcwl_txring.wl_tx_ring[ring_idx])) {
1038 ring_idx = pcwl_p->pcwl_txring.wl_tx_prod;
1039 pcwl_p->pcwl_txring.wl_tx_prod =
1044 mutex_exit(&pcwl_p->pcwl_txring.wl_tx_lock);
1045 mutex_enter(&pcwl_p->pcwl_glock);
1046 pcwl_p->pcwl_reschedule_need = B_TRUE;
1047 mutex_exit(&pcwl_p->pcwl_glock);
1048 pcwl_p->pcwl_noxmtbuf++;
1051 xmt_id = pcwl_p->pcwl_txring.wl_tx_fids[ring_idx];
1052 pcwl_p->pcwl_txring.wl_tx_ring[ring_idx] = xmt_id;
1053 mutex_exit(&pcwl_p->pcwl_txring.wl_tx_lock);
1103 mutex_enter(&pcwl_p->pcwl_glock);
1104 ret = (WRCH1(pcwl_p, xmt_id, 0, (uint16_t *)buf_p, 0x2e) ||
1105 WRPKT(pcwl_p, xmt_id, 0x2e, (uint16_t *)(buf_p + 0x2e),
1111 (void) pcwl_set_cmd(pcwl_p, WL_CMD_TX | WL_RECLAIM, xmt_id);
1114 mutex_exit(&pcwl_p->pcwl_glock);
1123 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
1127 mutex_enter(&pcwl_p->pcwl_glock);
1128 if ((pcwl_p->pcwl_flag & (PCWL_CARD_LINKUP | PCWL_CARD_READY)) !=
1130 mutex_exit(&pcwl_p->pcwl_glock);
1134 mutex_exit(&pcwl_p->pcwl_glock);
1139 if (pcwl_send(pcwl_p, mp)) {
1152 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
1154 mutex_enter(&pcwl_p->pcwl_glock);
1155 if (!(pcwl_p->pcwl_flag & PCWL_CARD_READY)) {
1163 pcwl_p->pcwl_rf.rf_promiscuous = 1;
1165 pcwl_p->pcwl_rf.rf_promiscuous = 0;
1166 if (ret = pcwl_fil_ltv(pcwl_p, 2, WL_RID_PROMISC,
1167 pcwl_p->pcwl_rf.rf_promiscuous)) {
1173 mutex_exit(&pcwl_p->pcwl_glock);
1180 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
1182 uint64_t *cntr_p = pcwl_p->pcwl_cntrs_s;
1187 mutex_enter(&pcwl_p->pcwl_glock);
1188 if (!(pcwl_p->pcwl_flag & PCWL_CARD_READY)) {
1193 if (pcwl_get_ltv(pcwl_p, 2, WL_RID_CUR_TX_RATE, &rate)) {
1198 switch (pcwl_p->pcwl_chip_type) {
1222 *val = pcwl_p->pcwl_noxmtbuf;
1284 mutex_exit(&pcwl_p->pcwl_glock);
1293 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
1294 uint16_t *mc_p = pcwl_p->pcwl_mcast;
1296 mutex_enter(&pcwl_p->pcwl_glock);
1297 if (!(pcwl_p->pcwl_flag & PCWL_CARD_READY)) {
1309 mc_p = pcwl_p->pcwl_mcast; /* reset mc_p for 2nd scan */
1333 if (i = pcwl_put_ltv(pcwl_p, ETHERADDRL << 4, WL_RID_MCAST,
1334 pcwl_p->pcwl_mcast)) {
1340 mutex_exit(&pcwl_p->pcwl_glock);
1348 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
1350 mutex_enter(&pcwl_p->pcwl_glock);
1351 if ((pcwl_p->pcwl_flag & (PCWL_CARD_READY | PCWL_CARD_INTREN)) !=
1353 mutex_exit(&pcwl_p->pcwl_glock);
1356 PCWL_READ(pcwl_p, WL_EVENT_STAT, stat);
1358 mutex_exit(&pcwl_p->pcwl_glock);
1362 PCWL_WRITE(pcwl_p, WL_INT_EN, 0);
1364 pcwl_rcv(pcwl_p);
1365 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_RX);
1366 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_RX);
1369 if (pcwl_txdone(pcwl_p) == PCWL_SUCCESS) {
1370 if (pcwl_p->pcwl_reschedule_need == B_TRUE) {
1371 mutex_exit(&pcwl_p->pcwl_glock);
1372 mac_tx_update(GLD3(pcwl_p));
1373 mutex_enter(&pcwl_p->pcwl_glock);
1374 pcwl_p->pcwl_reschedule_need = B_FALSE;
1377 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_TX);
1378 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_TX);
1381 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_ALLOC | 0x1000);
1382 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, 0x1000);
1385 pcwl_infodone(pcwl_p);
1386 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_INFO);
1387 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_INFO);
1390 if (pcwl_txdone(pcwl_p) == PCWL_SUCCESS) {
1391 if (pcwl_p->pcwl_reschedule_need == B_TRUE) {
1392 mutex_exit(&pcwl_p->pcwl_glock);
1393 mac_tx_update(GLD3(pcwl_p));
1394 mutex_enter(&pcwl_p->pcwl_glock);
1395 pcwl_p->pcwl_reschedule_need = B_FALSE;
1398 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_TX_EXC);
1399 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_TX_EXC);
1402 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_INFO_DROP);
1403 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_INFO_DROP);
1405 PCWL_ENABLE_INTR(pcwl_p);
1406 mutex_exit(&pcwl_p->pcwl_glock);
1415 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
1417 mutex_enter(&pcwl_p->pcwl_glock);
1418 if ((pcwl_p->pcwl_flag & (PCWL_CARD_READY | PCWL_CARD_INTREN)) !=
1420 mutex_exit(&pcwl_p->pcwl_glock);
1423 PCWL_READ(pcwl_p, WL_EVENT_STAT, stat);
1425 mutex_exit(&pcwl_p->pcwl_glock);
1428 PCWL_WRITE(pcwl_p, WL_INT_EN, 0); /* disable interrupt without ack */
1429 mutex_exit(&pcwl_p->pcwl_glock);
1430 ddi_trigger_softintr(pcwl_p->pcwl_softint_id);
1438 pcwl_rcv(pcwl_maci_t *pcwl_p)
1447 PCWL_READ(pcwl_p, WL_RX_FID, id);
1448 PCWL_WRITE(pcwl_p, WL_RX_FID, 0);
1454 if (ret = RDCH0(pcwl_p, id, 0, (uint16_t *)&frm, sizeof (frm))) {
1489 if ((pcwl_p->pcwl_rf.rf_porttype == WL_BSS_BSS) &&
1492 bcmp(pcwl_p->pcwl_bssid, frm.wl_addr2, 6) != 0)) {
1521 ret = RDPKT(pcwl_p, id, off, (uint16_t *)mp->b_wptr, len);
1538 mutex_exit(&pcwl_p->pcwl_glock);
1539 mac_rx(GLD3(pcwl_p), NULL, mp);
1540 mutex_enter(&pcwl_p->pcwl_glock);
1544 pcwl_txdone(pcwl_maci_t *pcwl_p)
1547 PCWL_READ(pcwl_p, WL_ALLOC_FID, fid);
1548 PCWL_WRITE(pcwl_p, WL_ALLOC_FID, 0);
1550 mutex_enter(&pcwl_p->pcwl_txring.wl_tx_lock);
1552 if (fid == pcwl_p->pcwl_txring.wl_tx_ring[i]) {
1553 pcwl_p->pcwl_txring.wl_tx_ring[i] = 0;
1557 pcwl_p->pcwl_txring.wl_tx_cons =
1558 (pcwl_p->pcwl_txring.wl_tx_cons + 1) & (WL_XMT_BUF_NUM - 1);
1559 mutex_exit(&pcwl_p->pcwl_txring.wl_tx_lock);
1567 pcwl_infodone(pcwl_maci_t *pcwl_p)
1574 PCWL_READ(pcwl_p, WL_INFO_FID, id);
1579 if (ret = RDCH0(pcwl_p, id, 0, linkStatus, sizeof (linkStatus))) {
1589 (void) RDCH0(pcwl_p, id, sizeof (linkStatus), &linkStat,
1592 if (!(pcwl_p->pcwl_flag & PCWL_CARD_LINKUP) &&
1598 pcwl_p->pcwl_flag |= PCWL_CARD_LINKUP;
1599 mutex_exit(&pcwl_p->pcwl_glock);
1600 if (pcwl_p->pcwl_connect_timeout_id != 0) {
1601 (void) untimeout(pcwl_p->
1603 pcwl_p->pcwl_connect_timeout_id = 0;
1605 mutex_enter(&pcwl_p->pcwl_glock);
1606 mac_link_update(GLD3(pcwl_p), LINK_STATE_UP);
1607 (void) pcwl_get_ltv(pcwl_p, 6,
1608 WL_RID_BSSID, (uint16_t *)pcwl_p->pcwl_bssid);
1609 PCWL_SWAP16((uint16_t *)pcwl_p->pcwl_bssid, 6);
1610 pcwl_get_rssi(pcwl_p);
1611 bcopy(pcwl_p->pcwl_bssid, wd.wd_bssid, 6);
1614 (void) mac_pdata_update(pcwl_p->pcwl_mh, &wd,
1617 if ((pcwl_p->pcwl_flag & PCWL_CARD_LINKUP) &&
1626 pcwl_p->pcwl_flag &= ~PCWL_CARD_LINKUP;
1628 pcwl_p->pcwl_connect_timeout_id =
1630 pcwl_p, drv_usectohz(1000));
1631 mutex_exit(&pcwl_p->pcwl_glock);
1632 mac_link_update(GLD3(pcwl_p), LINK_STATE_DOWN);
1633 mutex_enter(&pcwl_p->pcwl_glock);
1638 pcwl_ssid_scan(pcwl_p, id, linkStatus[0], linkStatus[1]);
1645 (void) RDCH0(pcwl_p, id, sizeof (linkStatus),
1646 pcwl_p->pcwl_cntrs_t, linkStatus[0]<<1);
1651 pcwl_p->pcwl_cntrs_s[i] += pcwl_p->pcwl_cntrs_t[i];
1659 pcwl_set_cmd(pcwl_maci_t *pcwl_p, uint16_t cmd, uint16_t param)
1665 ((pcwl_p->pcwl_flag & PCWL_ENABLED) != 0)) ||
1667 ((pcwl_p->pcwl_flag & PCWL_ENABLED) == 0)))
1671 PCWL_READ(pcwl_p, WL_COMMAND, stat);
1684 PCWL_WRITE(pcwl_p, WL_PARAM0, param);
1685 PCWL_WRITE(pcwl_p, WL_PARAM1, 0);
1686 PCWL_WRITE(pcwl_p, WL_PARAM2, 0);
1687 PCWL_WRITE(pcwl_p, WL_COMMAND, cmd);
1692 PCWL_READ(pcwl_p, WL_EVENT_STAT, stat);
1703 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, stat);
1706 PCWL_READ(pcwl_p, WL_STATUS, stat);
1707 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_CMD);
1714 pcwl_p->pcwl_flag |= PCWL_ENABLED;
1716 pcwl_p->pcwl_flag &= (~PCWL_ENABLED);
1721 pcwl_set_ch(pcwl_maci_t *pcwl_p, uint16_t type, uint16_t off, uint16_t channel)
1733 PCWL_WRITE(pcwl_p, select, type);
1734 PCWL_WRITE(pcwl_p, offset, off);
1736 PCWL_READ(pcwl_p, offset, stat);
1752 pcwl_get_ltv(pcwl_maci_t *pcwl_p, uint16_t len, uint16_t type, uint16_t *val_p)
1762 if (stat = pcwl_set_cmd(pcwl_p, WL_CMD_ACCESS | WL_ACCESS_READ, type))
1768 if (stat = pcwl_set_ch(pcwl_p, type, 0, 1))
1774 PCWL_READ(pcwl_p, WL_DATA1, stat);
1785 PCWL_READ(pcwl_p, WL_DATA1, stat);
1793 PCWL_READ_P(pcwl_p, WL_DATA1, val_p, 1);
1799 pcwl_fil_ltv(pcwl_maci_t *pcwl_p, uint16_t len, uint16_t type, uint16_t val)
1808 if (stat = pcwl_set_ch(pcwl_p, type, 0, 1))
1816 PCWL_WRITE(pcwl_p, WL_DATA1, stat);
1821 PCWL_WRITE(pcwl_p, WL_DATA1, type);
1827 PCWL_WRITE(pcwl_p, WL_DATA1, val);
1833 return (pcwl_set_cmd(pcwl_p, WL_CMD_ACCESS|WL_ACCESS_WRITE, type));
1837 pcwl_put_ltv(pcwl_maci_t *pcwl_p, uint16_t len, uint16_t type, uint16_t *val_p)
1846 if (stat = pcwl_set_ch(pcwl_p, type, 0, 1))
1854 PCWL_WRITE(pcwl_p, WL_DATA1, stat);
1859 PCWL_WRITE(pcwl_p, WL_DATA1, type);
1865 PCWL_WRITE_P(pcwl_p, WL_DATA1, val_p, 1);
1871 return (pcwl_set_cmd(pcwl_p, WL_CMD_ACCESS|WL_ACCESS_WRITE, type));
1876 pcwl_put_str(pcwl_maci_t *pcwl_p, uint16_t type, char *str_p)
1887 return (pcwl_put_ltv(pcwl_p, PCWL_COMPSTR_LEN, type, buf));
1892 pcwl_rdch0(pcwl_maci_t *pcwl_p, uint16_t type, uint16_t off, uint16_t *buf_p,
1902 if (pcwl_p->pcwl_chip_type == PCWL_CHIP_PRISMII) {
1903 if (type = pcwl_set_ch(pcwl_p, type, off, 1))
1907 if (type = pcwl_set_ch(pcwl_p, type, off, 0))
1913 PCWL_READ_P(pcwl_p, o, buf_p, order);
1920 pcwl_wrch1(pcwl_maci_t *pcwl_p, uint16_t type, uint16_t off, uint16_t *buf_p,
1924 if (type = pcwl_set_ch(pcwl_p, type, off, 1))
1928 PCWL_WRITE_P(pcwl_p, WL_DATA1, buf_p, order);
1934 pcwl_alloc_nicmem(pcwl_maci_t *pcwl_p, uint16_t len, uint16_t *id_p)
1941 if (stat = pcwl_set_cmd(pcwl_p, WL_CMD_ALLOC_MEM, len))
1944 PCWL_READ(pcwl_p, WL_EVENT_STAT, stat);
1952 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_ALLOC);
1953 PCWL_READ(pcwl_p, WL_ALLOC_FID, stat);
1959 (void) pcwl_set_ch(pcwl_p, stat, 0, 1);
1962 PCWL_WRITE(pcwl_p, WL_DATA1, 0);
1968 pcwl_add_scan_item(pcwl_maci_t *pcwl_p, wl_scan_result_t s)
1979 list_insert_tail(&pcwl_p->pcwl_scan_list, scan_item);
1980 pcwl_p->pcwl_scan_num++;
1985 pcwl_delete_scan_item(pcwl_maci_t *pcwl_p, wl_scan_list_t *s)
1987 list_remove(&pcwl_p->pcwl_scan_list, s);
1989 pcwl_p->pcwl_scan_num--;
1995 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
1998 mutex_enter(&pcwl_p->pcwl_scanlist_lock);
1999 scan_item0 = list_head(&pcwl_p->pcwl_scan_list);
2005 scan_item1 = list_next(&pcwl_p->pcwl_scan_list, scan_item0);
2007 pcwl_delete_scan_item(pcwl_p, scan_item0);
2013 mutex_exit(&pcwl_p->pcwl_scanlist_lock);
2014 pcwl_p->pcwl_scanlist_timeout_id = timeout(pcwl_scanlist_timeout,
2015 pcwl_p, drv_usectohz(1000000));
2019 pcwl_get_rssi(pcwl_maci_t *pcwl_p)
2025 mutex_enter(&pcwl_p->pcwl_scanlist_lock);
2026 scan_item0 = list_head(&pcwl_p->pcwl_scan_list);
2029 pcwl_p->pcwl_bssid, 6) == 0) {
2030 pcwl_p->pcwl_rssi = scan_item0->wl_val.wl_srt_sl;
2032 scan_item0 = list_next(&pcwl_p->pcwl_scan_list, scan_item0);
2034 mutex_exit(&pcwl_p->pcwl_scanlist_lock);
2035 if (!pcwl_p->pcwl_rssi) {
2036 (void) pcwl_get_ltv(pcwl_p, 6, WL_RID_COMMQUAL, cq);
2037 pcwl_p->pcwl_rssi = cq[1];
2046 pcwl_ssid_scan(pcwl_maci_t *pcwl_p, uint16_t fid, uint16_t flen, uint16_t stype)
2059 switch (pcwl_p->pcwl_chip_type) {
2061 (void) RDCH0(pcwl_p, fid, off, tmp, 4);
2082 (void) RDCH0(pcwl_p, fid, off, (uint16_t *)&sctbl, 2*szbuf);
2109 pcwl_p->pcwl_bssid, 6) == 0) {
2110 pcwl_p->pcwl_rssi = sctbl.wl_srt_sl;
2115 mutex_enter(&pcwl_p->pcwl_scanlist_lock);
2117 scan_item0 = list_head(&pcwl_p->pcwl_scan_list);
2119 if (pcwl_add_scan_item(pcwl_p, sctbl)
2121 mutex_exit(&pcwl_p->pcwl_scanlist_lock);
2134 scan_item0 = list_next(&pcwl_p->pcwl_scan_list,
2137 if (check_num == pcwl_p->pcwl_scan_num) {
2138 if (pcwl_add_scan_item(pcwl_p, sctbl)
2140 mutex_exit(&pcwl_p->pcwl_scanlist_lock);
2144 mutex_exit(&pcwl_p->pcwl_scanlist_lock);
2170 pcwl_delay(pcwl_maci_t *pcwl_p, clock_t microsecs)
2172 ASSERT(mutex_owned(&pcwl_p->pcwl_glock));
2174 mutex_exit(&pcwl_p->pcwl_glock);
2176 mutex_enter(&pcwl_p->pcwl_glock);
2180 pcwl_reset_backend(pcwl_maci_t *pcwl_p)
2184 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_INI, 0)) {
2188 pcwl_delay(pcwl_p, 100000); /* wait .1 sec */
2190 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_INI, 0)) {
2193 pcwl_delay(pcwl_p, 100000); /* wait .1 sec */
2195 PCWL_DISABLE_INTR(pcwl_p);
2204 pcwl_get_cap(pcwl_maci_t *pcwl_p)
2210 if (stat = pcwl_get_ltv(pcwl_p, 2, WL_RID_OWN_CHNL, &ch_no)) {
2215 if (stat = pcwl_get_ltv(pcwl_p, 2, WL_RID_WEP_AVAIL,
2216 &pcwl_p->pcwl_has_wep)) {
2221 if (stat = pcwl_get_ltv(pcwl_p, ETHERADDRL, WL_RID_MAC_NODE, buf)) {
2231 ether_copy(buf, pcwl_p->pcwl_mac_addr);
2236 pcwl_init_nicmem(pcwl_maci_t *pcwl_p)
2242 ret = pcwl_alloc_nicmem(pcwl_p, PCWL_NICMEM_SZ, &rc);
2248 pcwl_p->pcwl_txring.wl_tx_fids[i] = rc;
2249 pcwl_p->pcwl_txring.wl_tx_ring[i] = 0;
2252 pcwl_p->pcwl_txring.wl_tx_prod = pcwl_p->pcwl_txring.wl_tx_cons = 0;
2254 ret = pcwl_alloc_nicmem(pcwl_p, PCWL_NICMEM_SZ, &pcwl_p->pcwl_mgmt_id);
2260 pcwl_p->pcwl_mgmt_id));
2265 pcwl_loaddef_rf(pcwl_maci_t *pcwl_p)
2267 pcwl_p->pcwl_rf.rf_max_datalen = WL_DEFAULT_DATALEN;
2268 pcwl_p->pcwl_rf.rf_create_ibss = WL_DEFAULT_CREATE_IBSS;
2269 pcwl_p->pcwl_rf.rf_porttype = WL_BSS_BSS;
2270 pcwl_p->pcwl_rf.rf_rts_thresh = WL_DEFAULT_RTS_THRESH;
2271 pcwl_p->pcwl_rf.rf_tx_rate = WL_TX_RATE_FIX_11M(pcwl_p);
2272 pcwl_p->pcwl_rf.rf_pm_enabled = WL_DEFAULT_PM_ENABLED;
2273 pcwl_p->pcwl_rf.rf_own_chnl = WL_DEFAULT_CHAN;
2274 (void) strcpy(pcwl_p->pcwl_rf.rf_own_ssid, "");
2275 (void) strcpy(pcwl_p->pcwl_rf.rf_desired_ssid, "");
2276 (void) strcpy(pcwl_p->pcwl_rf.rf_nodename, "");
2277 pcwl_p->pcwl_rf.rf_encryption = WL_NOENCRYPTION;
2278 pcwl_p->pcwl_rf.rf_authtype = WL_OPENSYSTEM;
2279 pcwl_p->pcwl_rf.rf_tx_crypt_key = WL_DEFAULT_TX_CRYPT_KEY;
2280 bzero((pcwl_p->pcwl_rf.rf_ckeys), sizeof (rf_ckey_t) * 4);
2282 pcwl_p->pcwl_rf.rf_promiscuous = 0;
2284 return (pcwl_config_rf(pcwl_p));
2288 pcwl_config_rf(pcwl_maci_t *pcwl_p)
2290 pcwl_rf_t *rf_p = &pcwl_p->pcwl_rf;
2301 if (pcwl_p->pcwl_chip_type == PCWL_CHIP_PRISMII) {
2312 switch (pcwl_p->pcwl_chip_type) {
2327 FIL_LTV(pcwl_p, PCWL_MCBUF_LEN, WL_RID_MCAST, 0);
2328 FIL_LTV(pcwl_p, 2, WL_RID_PROMISC, 0);
2329 FIL_LTV(pcwl_p, 2, WL_RID_TICK_TIME, 0);
2331 FIL_LTV(pcwl_p, 2, WL_RID_MAX_DATALEN, rf_p->rf_max_datalen);
2332 FIL_LTV(pcwl_p, 2, WL_RID_CREATE_IBSS, create_ibss);
2333 FIL_LTV(pcwl_p, 2, WL_RID_PORTTYPE, porttype);
2334 FIL_LTV(pcwl_p, 2, WL_RID_RTS_THRESH, rf_p->rf_rts_thresh);
2335 FIL_LTV(pcwl_p, 2, WL_RID_TX_RATE, rf_p->rf_tx_rate);
2336 FIL_LTV(pcwl_p, 2, WL_RID_SYSTEM_SCALE, rf_p->rf_system_scale);
2337 FIL_LTV(pcwl_p, 2, WL_RID_PM_ENABLED, rf_p->rf_pm_enabled);
2338 FIL_LTV(pcwl_p, 2, WL_RID_MAX_SLEEP, rf_p->rf_max_sleep);
2339 FIL_LTV(pcwl_p, 2, WL_RID_OWN_CHNL, rf_p->rf_own_chnl);
2341 PUT_STR(pcwl_p, WL_RID_OWN_SSID, rf_p->rf_own_ssid);
2342 PUT_STR(pcwl_p, WL_RID_DESIRED_SSID, rf_p->rf_desired_ssid);
2343 PUT_STR(pcwl_p, WL_RID_NODENAME, rf_p->rf_nodename);
2345 if (!pcwl_p->pcwl_has_wep)
2348 switch (pcwl_p->pcwl_chip_type) {
2357 PUT_LTV(pcwl_p, k_len, WL_RID_CRYPT_KEY0_P2 + i,
2360 FIL_LTV(pcwl_p, 2, WL_RID_TX_CRYPT_KEY_P2,
2362 FIL_LTV(pcwl_p, 2, WL_RID_AUTHTYPE_P2,
2364 FIL_LTV(pcwl_p, 2, WL_RID_ENCRYPTION_P2,
2366 if (pcwl_p->pcwl_rf.rf_promiscuous)
2367 FIL_LTV(pcwl_p, 2, WL_RID_PROMISC, 1);
2372 FIL_LTV(pcwl_p, 2, WL_RID_ENCRYPTION,
2374 FIL_LTV(pcwl_p, 2, WL_RID_AUTHTYPE_L,
2376 FIL_LTV(pcwl_p, 2, WL_RID_TX_CRYPT_KEY,
2378 PUT_LTV(pcwl_p, sizeof (rf_p->rf_ckeys),
2388 pcwl_start_locked(pcwl_maci_t *pcwl_p)
2390 pcwl_p->pcwl_flag |= PCWL_CARD_INTREN;
2391 PCWL_ENABLE_INTR(pcwl_p);
2395 pcwl_stop_locked(pcwl_maci_t *pcwl_p)
2397 PCWL_DISABLE_INTR(pcwl_p);
2398 pcwl_p->pcwl_flag &= (~PCWL_CARD_INTREN);
2399 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_TX|WL_EV_RX|WL_EV_TX_EXC|
2401 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, WL_EV_TX|WL_EV_RX|WL_EV_TX_EXC|
2407 pcwl_saddr_locked(pcwl_maci_t *pcwl_p)
2412 ether_copy(pcwl_p->pcwl_mac_addr, buf);
2414 ret = pcwl_put_ltv(pcwl_p, ETHERADDRL, WL_RID_MAC_NODE, buf);
2423 pcwl_chip_type(pcwl_maci_t *pcwl_p)
2429 (void) pcwl_get_ltv(pcwl_p, sizeof (ver),
2436 pcwl_p->pcwl_chip_type = PCWL_CHIP_PRISMII;
2437 (void) pcwl_get_ltv(pcwl_p, sizeof (ver), WL_RID_COMP_IDENT,
2443 (void) pcwl_get_ltv(pcwl_p, sizeof (f), WL_RID_FWVER, (uint16_t *)&f);
2456 pcwl_set_essid(pcwl_maci_t *pcwl_p, const void *wldp_buf)
2462 rf_p = &pcwl_p->pcwl_rf;
2480 pcwl_get_essid(pcwl_maci_t *pcwl_p, void *wldp_buf)
2490 rf_p = &pcwl_p->pcwl_rf;
2494 ret = pcwl_get_ltv(pcwl_p, 2, WL_RID_PORTSTATUS, &val);
2512 (void) pcwl_get_ltv((pcwl_p), 34, WL_RID_SSID,
2534 pcwl_get_bssid(pcwl_maci_t *pcwl_p, void *wldp_buf)
2541 if (ret = pcwl_get_ltv(pcwl_p, 2, WL_RID_PORTSTATUS, &retval)) {
2552 (void) pcwl_get_ltv(pcwl_p, 6,
2569 pcwl_get_linkstatus(pcwl_maci_t *pcwl_p, void *wldp_buf)
2575 ret = pcwl_get_ltv(pcwl_p, 2, WL_RID_PORTSTATUS, &retval);
2605 pcwl_set_bsstype(pcwl_maci_t *pcwl_p, const void *wldp_buf)
2611 rf_p = &pcwl_p->pcwl_rf;
2627 pcwl_get_bsstype(pcwl_maci_t *pcwl_p, void *wldp_buf)
2631 rf_p = &pcwl_p->pcwl_rf;
2643 pcwl_set_phy(pcwl_maci_t *pcwl_p, const void *wldp_buf)
2650 rf_p = &pcwl_p->pcwl_rf;
2665 pcwl_get_phy(pcwl_maci_t *pcwl_p, void *wldp_buf)
2671 if (pcwl_get_ltv(pcwl_p, 2, WL_RID_CURRENT_CHNL, &retval)) {
2687 pcwl_set_desrates(pcwl_maci_t *pcwl_p, const void *wldp_buf)
2696 rf_p = &pcwl_p->pcwl_rf;
2710 rf_p->rf_tx_rate = WL_TX_RATE_FIX_1M(pcwl_p);
2713 rf_p->rf_tx_rate = WL_TX_RATE_FIX_2M(pcwl_p);
2716 rf_p->rf_tx_rate = WL_TX_RATE_FIX_11M(pcwl_p);
2719 rf_p->rf_tx_rate = WL_TX_RATE_FIX_5M(pcwl_p);
2730 rf_p->rf_tx_rate = WL_TX_RATE_AUTO_L(pcwl_p);
2733 rf_p->rf_tx_rate = WL_TX_RATE_AUTO_H(pcwl_p);
2736 rf_p->rf_tx_rate = WL_TX_RATE_AUTO_M(pcwl_p);
2748 rf_p->rf_tx_rate = WL_TX_RATE_AUTO_H(pcwl_p);
2751 rf_p->rf_tx_rate = WL_TX_RATE_AUTO_M(pcwl_p);
2759 rf_p->rf_tx_rate = WL_TX_RATE_AUTO_H(pcwl_p);
2771 pcwl_get_desrates(pcwl_maci_t *pcwl_p, void *wldp_buf)
2776 if (pcwl_get_ltv(pcwl_p, 2, WL_RID_TX_RATE, &rate)) {
2781 if (pcwl_p->pcwl_chip_type == PCWL_CHIP_PRISMII) {
2882 pcwl_set_powermode(pcwl_maci_t *pcwl_p, const void *wldp_buf)
2888 rf_p = &pcwl_p->pcwl_rf;
2903 pcwl_get_powermode(pcwl_maci_t *pcwl_p, void *wldp_buf)
2907 rf_p = &pcwl_p->pcwl_rf;
2915 pcwl_set_authmode(pcwl_maci_t *pcwl_p, const void *wldp_buf)
2921 rf_p = &pcwl_p->pcwl_rf;
2935 pcwl_get_authmode(pcwl_maci_t *pcwl_p, void *wldp_buf)
2939 rf_p = &pcwl_p->pcwl_rf;
2947 pcwl_set_encrypt(pcwl_maci_t *pcwl_p, const void *wldp_buf)
2953 rf_p = &pcwl_p->pcwl_rf;
2968 pcwl_get_encrypt(pcwl_maci_t *pcwl_p, void *wldp_buf)
2972 rf_p = &pcwl_p->pcwl_rf;
2980 pcwl_set_ibss(pcwl_maci_t *pcwl_p, const void *wldp_buf)
2986 rf_p = &pcwl_p->pcwl_rf;
3000 pcwl_get_ibss(pcwl_maci_t *pcwl_p, void *wldp_buf)
3004 rf_p = &pcwl_p->pcwl_rf;
3012 pcwl_get_param_rssi(pcwl_maci_t *pcwl_p, void *wldp_buf)
3015 if (pcwl_p->pcwl_chip_type == PCWL_CHIP_PRISMII) {
3017 min((pcwl_p->pcwl_rssi * 15 / 85 + 1), 15);
3025 if (pcwl_p->pcwl_rssi <= 27)
3027 else if (pcwl_p->pcwl_rssi > 154)
3031 min(15, ((pcwl_p->pcwl_rssi - 27) * 15 / 127));
3039 pcwl_set_wepkey(pcwl_maci_t *pcwl_p, const void *wldp_buf)
3045 rf_p = &pcwl_p->pcwl_rf;
3084 pcwl_get_esslist(pcwl_maci_t *pcwl_p, void *wldp_buf)
3090 mutex_enter(&pcwl_p->pcwl_scanlist_lock);
3093 pcwl_p->pcwl_scan_num;
3095 scan_item = list_head(&pcwl_p->pcwl_scan_list);
3097 for (i = 0; i < pcwl_p->pcwl_scan_num; i++) {
3119 if (pcwl_p->pcwl_chip_type == PCWL_CHIP_PRISMII) {
3139 scan_item = list_next(&pcwl_p->pcwl_scan_list, scan_item);
3142 mutex_exit(&pcwl_p->pcwl_scanlist_lock);
3151 pcwl_cfg_essid(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3172 rf_p = &pcwl_p->pcwl_rf;
3177 err = pcwl_get_essid(pcwl_p, outfp->wldp_buf);
3183 (void) pcwl_get_ltv(pcwl_p, 2, WL_RID_PORTSTATUS, &val);
3202 (void) pcwl_set_essid(pcwl_p, infp->wldp_buf);
3218 pcwl_cfg_bssid(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3237 err = pcwl_get_bssid(pcwl_p, outfp->wldp_buf);
3260 pcwl_cmd_scan(pcwl_maci_t *pcwl_p)
3267 rf_p = &pcwl_p->pcwl_rf;
3281 enable = pcwl_p->pcwl_flag & PCWL_ENABLED;
3284 if (pcwl_p->pcwl_rf.rf_porttype != WL_BSS_BSS) {
3286 (ret = pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0))) {
3290 FIL_LTV(pcwl_p, 2, WL_RID_PORTTYPE, WL_BSS_BSS);
3293 if ((pcwl_p->pcwl_chip_type == PCWL_CHIP_LUCENT) && (len != 0)) {
3295 (ret = pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0))) {
3299 PUT_STR(pcwl_p, WL_RID_DESIRED_SSID, "");
3302 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_ENABLE, 0)) {
3306 pcwl_delay(pcwl_p, 1000000);
3308 switch (pcwl_p->pcwl_chip_type) {
3314 PUT_LTV(pcwl_p, sizeof (vall),
3316 pcwl_delay(pcwl_p, 1000000);
3317 if (pcwl_p->pcwl_scan_num >= WL_SCAN_AGAIN_THRESHOLD)
3327 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_INQUIRE,
3332 pcwl_delay(pcwl_p, 500000);
3333 if (pcwl_p->pcwl_scan_num >= WL_SCAN_AGAIN_THRESHOLD)
3338 if ((pcwl_p->pcwl_rf.rf_porttype != WL_BSS_BSS) ||
3339 ((pcwl_p->pcwl_chip_type == PCWL_CHIP_LUCENT) && (len != 0))) {
3340 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0)) {
3344 if (ret = pcwl_config_rf(pcwl_p)) {
3348 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_ENABLE, 0)) {
3353 pcwl_delay(pcwl_p, 1000000);
3356 if ((!enable) && (ret = pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0))) {
3368 pcwl_cfg_scan(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3383 pcwl_get_esslist(pcwl_p, outfp->wldp_buf);
3387 pcwl_p->pcwl_scan_num * sizeof (wl_ess_conf_t);
3399 pcwl_cfg_linkstatus(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3416 err = pcwl_get_linkstatus(pcwl_p, outfp->wldp_buf);
3423 (void) pcwl_get_ltv(pcwl_p, 2, WL_RID_PORTSTATUS, &val);
3446 pcwl_cfg_bsstype(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3467 pcwl_get_bsstype(pcwl_p, outfp->wldp_buf);
3470 err = pcwl_set_bsstype(pcwl_p, infp->wldp_buf);
3490 pcwl_cfg_phy(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3511 err = pcwl_get_phy(pcwl_p, outfp->wldp_buf);
3519 err = pcwl_set_phy(pcwl_p, infp->wldp_buf);
3540 pcwl_cfg_desiredrates(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3561 err = pcwl_get_desrates(pcwl_p, outfp->wldp_buf);
3567 if (pcwl_p->pcwl_chip_type == PCWL_CHIP_PRISMII) {
3572 (void) pcwl_get_ltv(pcwl_p, 2, WL_RID_TX_RATE, &rate);
3615 err = pcwl_set_desrates(pcwl_p, infp->wldp_buf);
3643 pcwl_cfg_supportrates(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3675 pcwl_cfg_powermode(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3696 pcwl_get_powermode(pcwl_p, outfp->wldp_buf);
3699 err = pcwl_set_powermode(pcwl_p, infp->wldp_buf);
3720 pcwl_cfg_authmode(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3741 pcwl_get_authmode(pcwl_p, outfp->wldp_buf);
3744 err = pcwl_set_authmode(pcwl_p, infp->wldp_buf);
3764 pcwl_cfg_encryption(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3785 pcwl_get_encrypt(pcwl_p, outfp->wldp_buf);
3788 err = pcwl_set_encrypt(pcwl_p, infp->wldp_buf);
3808 pcwl_cfg_wepkeyid(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3826 rf_p = &pcwl_p->pcwl_rf;
3854 pcwl_cfg_createibss(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3875 pcwl_get_ibss(pcwl_p, outfp->wldp_buf);
3878 err = pcwl_set_ibss(pcwl_p, infp->wldp_buf);
3898 pcwl_cfg_rssi(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3917 pcwl_get_param_rssi(pcwl_p, outfp->wldp_buf);
3935 pcwl_cfg_radio(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3970 pcwl_cfg_wepkey(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
3992 (void) pcwl_set_wepkey(pcwl_p, infp->wldp_buf);
4009 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
4012 mutex_enter(&pcwl_p->pcwl_glock);
4013 PCWL_DISABLE_INTR(pcwl_p);
4014 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0)) {
4017 if (ret = pcwl_config_rf(pcwl_p)) {
4020 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_ENABLE, 0)) {
4023 PCWL_ENABLE_INTR(pcwl_p);
4027 mutex_exit(&pcwl_p->pcwl_glock);
4028 pcwl_p->pcwl_connect_timeout_id = 0;
4032 pcwl_getset(mblk_t *mp, pcwl_maci_t *pcwl_p, uint32_t cmd)
4037 mutex_enter(&pcwl_p->pcwl_glock);
4038 if (!(pcwl_p->pcwl_flag & PCWL_CARD_READY)) {
4039 mutex_exit(&pcwl_p->pcwl_glock);
4044 ret = pcwl_cfg_essid(mp, pcwl_p, cmd);
4049 ret = pcwl_cfg_bssid(mp, pcwl_p, cmd);
4054 ret = pcwl_cfg_scan(mp, pcwl_p, cmd);
4058 ret = pcwl_cfg_linkstatus(mp, pcwl_p, cmd);
4062 ret = pcwl_cfg_bsstype(mp, pcwl_p, cmd);
4067 ret = pcwl_cfg_phy(mp, pcwl_p, cmd);
4072 ret = pcwl_cfg_desiredrates(mp, pcwl_p, cmd);
4077 ret = pcwl_cfg_supportrates(mp, pcwl_p, cmd);
4081 ret = pcwl_cfg_powermode(mp, pcwl_p, cmd);
4085 ret = pcwl_cfg_authmode(mp, pcwl_p, cmd);
4090 ret = pcwl_cfg_encryption(mp, pcwl_p, cmd);
4095 ret = pcwl_cfg_wepkeyid(mp, pcwl_p, cmd);
4100 ret = pcwl_cfg_createibss(mp, pcwl_p, cmd);
4105 ret = pcwl_cfg_rssi(mp, pcwl_p, cmd);
4109 ret = pcwl_cfg_radio(mp, pcwl_p, cmd);
4113 ret = pcwl_cfg_wepkey(mp, pcwl_p, cmd);
4118 mutex_exit(&pcwl_p->pcwl_glock);
4119 if (pcwl_p->pcwl_connect_timeout_id != 0) {
4120 (void) untimeout(pcwl_p->pcwl_connect_timeout_id);
4121 pcwl_p->pcwl_connect_timeout_id = 0;
4123 mutex_enter(&pcwl_p->pcwl_glock);
4124 ret = pcwl_cmd_scan(pcwl_p);
4127 mutex_exit(&pcwl_p->pcwl_glock);
4128 if (pcwl_p->pcwl_connect_timeout_id != 0) {
4129 (void) untimeout(pcwl_p->pcwl_connect_timeout_id);
4130 pcwl_p->pcwl_connect_timeout_id = 0;
4132 mutex_enter(&pcwl_p->pcwl_glock);
4133 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0)) {
4137 if (ret = pcwl_loaddef_rf(pcwl_p)) {
4142 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_ENABLE, 0)) {
4146 pcwl_delay(pcwl_p, 1000000);
4147 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0)) {
4154 mutex_exit(&pcwl_p->pcwl_glock);
4155 if (pcwl_p->pcwl_connect_timeout_id != 0) {
4156 (void) untimeout(pcwl_p->pcwl_connect_timeout_id);
4157 pcwl_p->pcwl_connect_timeout_id = 0;
4160 mutex_enter(&pcwl_p->pcwl_glock);
4161 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0)) {
4171 if ((pcwl_p->pcwl_rf.rf_porttype == WL_BSS_IBSS) &&
4172 (pcwl_p->pcwl_chip_type == PCWL_CHIP_LUCENT)) {
4173 if (ret = pcwl_reset_backend(pcwl_p)) {
4177 if (ret = pcwl_init_nicmem(pcwl_p)) {
4181 pcwl_start_locked(pcwl_p);
4183 if (ret = pcwl_loaddef_rf(pcwl_p)) {
4188 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_ENABLE, 0)) {
4192 pcwl_delay(pcwl_p, 1000000);
4193 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0)) {
4201 mutex_exit(&pcwl_p->pcwl_glock);
4202 if (pcwl_p->pcwl_connect_timeout_id != 0) {
4203 (void) untimeout(pcwl_p->pcwl_connect_timeout_id);
4204 pcwl_p->pcwl_connect_timeout_id = 0;
4206 mutex_enter(&pcwl_p->pcwl_glock);
4207 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0)) {
4211 if (ret = pcwl_config_rf(pcwl_p)) {
4215 if (ret = pcwl_set_cmd(pcwl_p, WL_CMD_ENABLE, 0)) {
4224 mutex_exit(&pcwl_p->pcwl_glock);
4226 (void) pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0);
4227 if (pcwl_p->pcwl_connect_timeout_id != 0) {
4228 (void) untimeout(pcwl_p->pcwl_connect_timeout_id);
4229 pcwl_p->pcwl_connect_timeout_id = 0;
4231 pcwl_p->pcwl_connect_timeout_id = timeout(pcwl_connect_timeout,
4232 pcwl_p, 2 * drv_usectohz(1000000));
4238 pcwl_wlan_ioctl(pcwl_maci_t *pcwl_p, queue_t *wq, mblk_t *mp, uint32_t cmd)
4274 ret = pcwl_getset(mp1, pcwl_p, cmd);
4287 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
4312 pcwl_wlan_ioctl(pcwl_p, wq, mp, cmd);
4324 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
4326 mutex_enter(&pcwl_p->pcwl_glock);
4327 if (!(pcwl_p->pcwl_flag & PCWL_CARD_READY)) {
4328 mutex_exit(&pcwl_p->pcwl_glock);
4336 err = pcwl_set_essid(pcwl_p, wldp_buf);
4339 err = pcwl_set_phy(pcwl_p, wldp_buf);
4342 err = pcwl_set_wepkey(pcwl_p, wldp_buf);
4345 err = pcwl_set_authmode(pcwl_p, wldp_buf);
4348 err = pcwl_set_encrypt(pcwl_p, wldp_buf);
4351 err = pcwl_set_bsstype(pcwl_p, wldp_buf);
4354 err = pcwl_set_desrates(pcwl_p, wldp_buf);
4357 err = pcwl_set_powermode(pcwl_p, wldp_buf);
4360 err = pcwl_set_ibss(pcwl_p, wldp_buf);
4386 mutex_exit(&pcwl_p->pcwl_glock);
4389 (void) pcwl_set_cmd(pcwl_p, WL_CMD_DISABLE, 0);
4390 if (pcwl_p->pcwl_connect_timeout_id != 0) {
4391 (void) untimeout(pcwl_p->pcwl_connect_timeout_id);
4392 pcwl_p->pcwl_connect_timeout_id = 0;
4394 pcwl_p->pcwl_connect_timeout_id = timeout(pcwl_connect_timeout,
4395 pcwl_p, 2 * drv_usectohz(1000000));
4409 pcwl_maci_t *pcwl_p = (pcwl_maci_t *)arg;
4411 mutex_enter(&pcwl_p->pcwl_glock);
4412 if (!(pcwl_p->pcwl_flag & PCWL_CARD_READY)) {
4413 mutex_exit(&pcwl_p->pcwl_glock);
4421 err = pcwl_get_essid(pcwl_p, wldp_buf);
4424 err = pcwl_get_bssid(pcwl_p, wldp_buf);
4427 err = pcwl_get_phy(pcwl_p, wldp_buf);
4430 pcwl_get_authmode(pcwl_p, wldp_buf);
4433 pcwl_get_encrypt(pcwl_p, wldp_buf);
4436 pcwl_get_bsstype(pcwl_p, wldp_buf);
4439 err = pcwl_get_linkstatus(pcwl_p, wldp_buf);
4442 pcwl_get_esslist(pcwl_p, wldp_buf);
4448 pcwl_get_param_rssi(pcwl_p, wldp_buf);
4454 pcwl_get_powermode(pcwl_p, wldp_buf);
4457 pcwl_get_ibss(pcwl_p, wldp_buf);
4460 err = pcwl_get_desrates(pcwl_p, wldp_buf);
4481 mutex_exit(&pcwl_p->pcwl_glock);
4517 pcwl_maci_t *pcwl_p;
4519 pcwl_p = ddi_get_soft_state(pcwl_soft_state_p, ddi_get_instance(dip));
4520 if (pcwl_p == NULL)
4523 if (pcwl_p->pcwl_flag & PCWL_CARD_READY)
4524 pcwl_stop_locked(pcwl_p);