Lines Matching refs:ssp

348 lombus_trace(struct lombus_state *ssp, char code, const char *caller,  in lombus_trace()  argument
355 if (ssp->debug & (1 << (code-'@'))) { in lombus_trace()
366 (void) strlog(ssp->majornum, ssp->instance, code, SL_TRACE, in lombus_trace()
374 struct lombus_state *ssp = NULL; in lombus_getstate() local
397 ssp = ddi_get_soft_state(lombus_statep, instance); in lombus_getstate()
398 if (ssp != NULL) { in lombus_getstate()
399 sdip = ssp->dip; in lombus_getstate()
401 ssp = NULL; in lombus_getstate()
407 ssp = NULL; in lombus_getstate()
411 return (ssp); in lombus_getstate()
419 sio_put_reg(struct lombus_state *ssp, uint_t reg, uint8_t val) in sio_put_reg() argument
421 lombus_trace(ssp, 'P', "sio_put_reg", "REG[%d] <- $%02x", reg, val); in sio_put_reg()
423 if (ssp->sio_handle != NULL && !ssp->sio_fault) { in sio_put_reg()
450 ddi_put8(ssp->sio_handle, ssp->sio_regs + reg, val); in sio_put_reg()
451 ddi_put8(ssp->sio_handle, ssp->sio_regs + SIO_SCR, val); in sio_put_reg()
453 (void) ddi_get8(ssp->sio_handle, ssp->sio_regs + SIO_SCR); in sio_put_reg()
458 sio_get_reg(struct lombus_state *ssp, uint_t reg) in sio_get_reg() argument
462 if (ssp->sio_handle && !ssp->sio_fault) in sio_get_reg()
463 val = ddi_get8(ssp->sio_handle, ssp->sio_regs + reg); in sio_get_reg()
467 lombus_trace(ssp, 'G', "sio_get_reg", "$%02x <- REG[%d]", val, reg); in sio_get_reg()
473 sio_check_fault_status(struct lombus_state *ssp) in sio_check_fault_status() argument
475 ssp->sio_fault = ddi_check_acc_handle(ssp->sio_handle) != DDI_SUCCESS; in sio_check_fault_status()
479 sio_faulty(struct lombus_state *ssp) in sio_faulty() argument
481 if (!ssp->sio_fault) in sio_faulty()
482 sio_check_fault_status(ssp); in sio_faulty()
483 return (ssp->sio_fault); in sio_faulty()
491 sio_data_ready(struct lombus_state *ssp) in sio_data_ready() argument
499 status = sio_get_reg(ssp, SIO_LSR); in sio_data_ready()
500 return ((status & SIO_LSR_RXDA) != 0 && !sio_faulty(ssp)); in sio_data_ready()
507 sio_lom_ready(struct lombus_state *ssp) in sio_lom_ready() argument
519 status = sio_get_reg(ssp, SIO_MSR); in sio_lom_ready()
520 rslt = (status & SIO_MSR_CTS) != 0 && !sio_faulty(ssp); in sio_lom_ready()
522 lombus_trace(ssp, 'R', "sio_lom_ready", "S $%02x R %d F %d", in sio_lom_ready()
523 status, rslt, ssp->fake_cts); in sio_lom_ready()
525 return (rslt || ssp->fake_cts); in sio_lom_ready()
533 sio_irq_pending(struct lombus_state *ssp)
546 status = sio_get_reg(ssp, SIO_EIR);
548 rslt = (status & SIO_EIR_IPF) == 0 && !sio_faulty(ssp);
549 lombus_trace(ssp, 'I', "sio_irq_pending", "S $%02x R %d",
560 ASSERT(ssp->hw_int_enabled);
570 lombus_set_irq(struct lombus_state *ssp, boolean_t newstate) in lombus_set_irq() argument
575 sio_put_reg(ssp, SIO_IER, SIO_IER_STD | val); in lombus_set_irq()
576 ssp->hw_int_enabled = newstate; in lombus_set_irq()
583 lombus_toggle_rts(struct lombus_state *ssp) in lombus_toggle_rts() argument
587 val = sio_get_reg(ssp, SIO_MCR); in lombus_toggle_rts()
591 sio_put_reg(ssp, SIO_MCR, val); in lombus_toggle_rts()
619 struct lombus_state *ssp = (void *)arg; in lombus_hi_intr() local
623 if (ssp->cycid != NULL) { in lombus_hi_intr()
624 mutex_enter(ssp->hw_mutex); in lombus_hi_intr()
625 if (ssp->hw_int_enabled) { in lombus_hi_intr()
626 lombus_set_irq(ssp, B_FALSE); in lombus_hi_intr()
627 ddi_trigger_softintr(ssp->softid); in lombus_hi_intr()
630 mutex_exit(ssp->hw_mutex); in lombus_hi_intr()
644 lombus_receive(struct lombus_state *ssp) in lombus_receive() argument
651 lombus_trace(ssp, 'S', "lombus_receive", in lombus_receive()
653 ssp->cmdstate, ssp->error); in lombus_receive()
660 if (!sio_faulty(ssp)) { in lombus_receive()
666 mutex_enter(ssp->hw_mutex); in lombus_receive()
667 while (sio_data_ready(ssp)) { in lombus_receive()
668 data = sio_get_reg(ssp, SIO_RXD); in lombus_receive()
669 ssp->reply[rcvd = ssp->index] = data; in lombus_receive()
672 ssp->index = rcvd; in lombus_receive()
676 lombus_set_irq(ssp, B_TRUE); in lombus_receive()
677 mutex_exit(ssp->hw_mutex); in lombus_receive()
680 lombus_trace(ssp, 'S', "lombus_receive", in lombus_receive()
683 ssp->reply[0], ssp->reply[1], in lombus_receive()
684 ssp->reply[2], ssp->reply[3], in lombus_receive()
685 ssp->reply[4], ssp->reply[5], in lombus_receive()
686 ssp->reply[6], ssp->reply[7]); in lombus_receive()
688 if (ssp->cmdstate != LOMBUS_CMDSTATE_WAITING) { in lombus_receive()
694 ssp->index = 0; in lombus_receive()
702 if (ddi_get_lbolt() > ssp->deadline) { in lombus_receive()
703 ssp->cmdstate = LOMBUS_CMDSTATE_ERROR; in lombus_receive()
704 ssp->error = LOMBUS_ERR_TIMEOUT; in lombus_receive()
713 ssp->index = 0; in lombus_receive()
714 ssp->cmdstate = LOMBUS_CMDSTATE_ERROR; in lombus_receive()
715 ssp->error = LOMBUS_ERR_OFLOW; in lombus_receive()
737 if (ssp->allow_echo) { in lombus_receive()
738 lombus_trace(ssp, 'E', "lombus_receive", in lombus_receive()
741 ssp->reply[0], ssp->reply[1], in lombus_receive()
742 ssp->reply[2], ssp->reply[3], in lombus_receive()
743 ssp->reply[4], ssp->reply[5], in lombus_receive()
744 ssp->reply[6], ssp->reply[7]); in lombus_receive()
745 ssp->index = 0; in lombus_receive()
747 ssp->cmdstate = LOMBUS_CMDSTATE_ERROR; in lombus_receive()
748 ssp->error = LOMBUS_ERR_BADSTATUS; in lombus_receive()
751 } else if ((data & LOMBUS_SEQ) != ssp->sequence) { in lombus_receive()
755 ssp->cmdstate = LOMBUS_CMDSTATE_ERROR; in lombus_receive()
756 ssp->error = LOMBUS_ERR_SEQUENCE; in lombus_receive()
769 ssp->async = (data & LOMBUS_STATUS_ASYNC) ? 1 : 0; in lombus_receive()
770 tmp = ((data & LOMBUS_STATUS_MSB) ? 0x80 : 0) | ssp->reply[0]; in lombus_receive()
772 ssp->cmdstate = LOMBUS_CMDSTATE_ERROR; in lombus_receive()
773 ssp->error = tmp; in lombus_receive()
775 ssp->cmdstate = LOMBUS_CMDSTATE_READY; in lombus_receive()
776 ssp->result = tmp; in lombus_receive()
781 lombus_trace(ssp, 'T', "lombus_receive", in lombus_receive()
783 rcvd, data, ssp->cmdstate, ssp->error, ready); in lombus_receive()
786 cv_broadcast(ssp->lo_cv); in lombus_receive()
797 struct lombus_state *ssp = (void *)arg; in lombus_softint() local
799 mutex_enter(ssp->lo_mutex); in lombus_softint()
800 lombus_receive(ssp); in lombus_softint()
801 mutex_exit(ssp->lo_mutex); in lombus_softint()
813 struct lombus_state *ssp = (void *)arg; in lombus_cyclic() local
815 mutex_enter(ssp->lo_mutex); in lombus_cyclic()
816 lombus_receive(ssp); in lombus_cyclic()
817 mutex_exit(ssp->lo_mutex); in lombus_cyclic()
829 struct lombus_state *ssp; in lombus_cmd() local
839 ssp = HANDLE_PRIVATE(hdlp); in lombus_cmd()
840 mutex_enter(ssp->lo_mutex); in lombus_cmd()
841 while (ssp->cmdstate != LOMBUS_CMDSTATE_IDLE && !panicstr) in lombus_cmd()
842 cv_wait(ssp->lo_cv, ssp->lo_mutex); in lombus_cmd()
844 ssp->cmdstate = LOMBUS_CMDSTATE_BUSY; in lombus_cmd()
845 ssp->sequence = (ssp->sequence + LOMBUS_SEQ_LSB) & LOMBUS_SEQ; in lombus_cmd()
855 p = &ssp->cmdbuf[0]; in lombus_cmd()
856 *p++ = LOMBUS_CMD | ssp->sequence | cmd; in lombus_cmd()
861 ssp->cmdbuf[0] |= LOMBUS_CMD_WMSB; in lombus_cmd()
866 ssp->cmdbuf[0] |= LOMBUS_CMD_XADDR; in lombus_cmd()
882 sio_check_fault_status(ssp); in lombus_cmd()
892 ssp->deadline = start + drv_usectohz(LOMBUS_CTS_TIMEOUT/1000); in lombus_cmd()
893 while (!sio_lom_ready(ssp)) { in lombus_cmd()
894 if (ddi_get_lbolt() > ssp->deadline) in lombus_cmd()
897 (void) cv_reltimedwait(ssp->lo_cv, ssp->lo_mutex, in lombus_cmd()
912 lombus_receive(ssp); in lombus_cmd()
913 mutex_enter(ssp->hw_mutex); in lombus_cmd()
914 while (p > ssp->cmdbuf) in lombus_cmd()
915 sio_put_reg(ssp, SIO_TXD, *--p); in lombus_cmd()
916 mutex_exit(ssp->hw_mutex); in lombus_cmd()
924 ssp->deadline = start + drv_usectohz(LOMBUS_CMD_TIMEOUT/1000); in lombus_cmd()
925 ssp->error = 0; in lombus_cmd()
926 ssp->index = 0; in lombus_cmd()
927 ssp->result = DUMMY_VALUE; in lombus_cmd()
928 ssp->cmdstate = LOMBUS_CMDSTATE_WAITING; in lombus_cmd()
929 while (ssp->cmdstate == LOMBUS_CMDSTATE_WAITING) { in lombus_cmd()
930 if (cv_reltimedwait(ssp->lo_cv, ssp->lo_mutex, in lombus_cmd()
932 lombus_receive(ssp); in lombus_cmd()
938 val = ssp->result; in lombus_cmd()
939 if (sio_faulty(ssp)) { in lombus_cmd()
942 } else if (ssp->cmdstate != LOMBUS_CMDSTATE_READY) { in lombus_cmd()
948 if (ssp->error != 0) in lombus_cmd()
949 HANDLE_FAULT(hdlp) = ssp->error; in lombus_cmd()
957 ssp->index = 0; in lombus_cmd()
958 ssp->cmdstate = LOMBUS_CMDSTATE_IDLE; in lombus_cmd()
959 cv_broadcast(ssp->lo_cv); in lombus_cmd()
960 mutex_exit(ssp->lo_mutex); in lombus_cmd()
1083 struct lombus_state *ssp; in lombus_pat_put8() local
1102 ssp = HANDLE_PRIVATE(hdlp); in lombus_pat_put8()
1103 mutex_enter(ssp->hw_mutex); in lombus_pat_put8()
1105 if ((now - ssp->hw_last_pat) >= LOMBUS_MIN_PAT) { in lombus_pat_put8()
1106 lombus_toggle_rts(ssp); in lombus_pat_put8()
1107 ssp->hw_last_pat = now; in lombus_pat_put8()
1109 mutex_exit(ssp->hw_mutex); in lombus_pat_put8()
1142 struct lombus_state *ssp; in lombus_event_get16() local
1162 ssp = HANDLE_PRIVATE(hdlp); in lombus_event_get16()
1163 return (ssp->async); in lombus_event_get16()
1222 struct lombus_state *ssp; in lombus_meta_get32() local
1260 ssp = HANDLE_PRIVATE(hdlp); in lombus_meta_get32()
1261 return (ssp->async); in lombus_meta_get32()
1495 lombus_hw_reset(struct lombus_state *ssp) in lombus_hw_reset() argument
1503 lombus_set_irq(ssp, B_FALSE); in lombus_hw_reset()
1504 sio_put_reg(ssp, SIO_FCR, SIO_FCR_RXSR | SIO_FCR_TXSR); in lombus_hw_reset()
1505 sio_put_reg(ssp, SIO_LCR, SIO_LCR_STD); in lombus_hw_reset()
1513 if (ssp->baud < SIO_BAUD_MIN || ssp->baud > SIO_BAUD_MAX) in lombus_hw_reset()
1516 divisor = SIO_BAUD_TO_DIVISOR(ssp->baud); in lombus_hw_reset()
1529 sio_put_reg(ssp, SIO_BSR, SIO_BSR_BANK1); in lombus_hw_reset()
1530 sio_put_reg(ssp, SIO_LBGDL, 0xff); in lombus_hw_reset()
1531 sio_put_reg(ssp, SIO_LBGDH, divisor >> 8); in lombus_hw_reset()
1532 sio_put_reg(ssp, SIO_LBGDL, divisor & 0xff); in lombus_hw_reset()
1533 sio_put_reg(ssp, SIO_BSR, SIO_BSR_BANK0); in lombus_hw_reset()
1538 sio_put_reg(ssp, SIO_MCR, SIO_MCR_STD); in lombus_hw_reset()
1539 sio_put_reg(ssp, SIO_FCR, SIO_FCR_STD); in lombus_hw_reset()
1548 lombus_offline(struct lombus_state *ssp) in lombus_offline() argument
1550 if (ssp->sio_handle != NULL) in lombus_offline()
1551 ddi_regs_map_free(&ssp->sio_handle); in lombus_offline()
1552 ssp->sio_handle = NULL; in lombus_offline()
1553 ssp->sio_regs = NULL; in lombus_offline()
1557 lombus_online(struct lombus_state *ssp) in lombus_online() argument
1564 if (ddi_dev_nregs(ssp->dip, &nregs) != DDI_SUCCESS) in lombus_online()
1573 err = ddi_regs_map_setup(ssp->dip, 0, &p, 0, 0, in lombus_online()
1575 lombus_trace(ssp, 'O', "online", in lombus_online()
1580 ssp->sio_handle = h; in lombus_online()
1581 ssp->sio_regs = (void *)p; in lombus_online()
1595 lombus_hw_reset(ssp); in lombus_online()
1688 lombus_map_handle(struct lombus_state *ssp, ddi_map_op_t op, in lombus_map_handle() argument
1715 hdlp->ah_bus_private = ssp; in lombus_map_handle()
1728 lombus_map_handle(struct lombus_state *ssp, ddi_map_op_t op, in lombus_map_handle() argument
1817 hdlp->ah_bus_private = ssp; in lombus_map_handle()
1834 struct lombus_state *ssp; in lombus_map() local
1837 if ((ssp = lombus_getstate(dip, -1, "lombus_map")) == NULL) in lombus_map()
1866 return (lombus_map_handle(ssp, mp->map_op, in lombus_map()
1876 struct lombus_state *ssp; in lombus_ctlops() local
1887 if ((ssp = lombus_getstate(dip, -1, "lombus_ctlops")) == NULL) in lombus_ctlops()
1911 lombus_trace(ssp, 'C', "initchild", in lombus_ctlops()
2008 lombus_unattach(struct lombus_state *ssp, int instance) in lombus_unattach() argument
2010 if (ssp != NULL) { in lombus_unattach()
2011 lombus_hw_reset(ssp); in lombus_unattach()
2012 if (ssp->cycid != NULL) { in lombus_unattach()
2013 ddi_periodic_delete(ssp->cycid); in lombus_unattach()
2014 ssp->cycid = NULL; in lombus_unattach()
2015 if (ssp->sio_handle != NULL) in lombus_unattach()
2016 ddi_remove_intr(ssp->dip, 0, ssp->hw_iblk); in lombus_unattach()
2017 ddi_remove_softintr(ssp->softid); in lombus_unattach()
2018 cv_destroy(ssp->lo_cv); in lombus_unattach()
2019 mutex_destroy(ssp->lo_mutex); in lombus_unattach()
2020 mutex_destroy(ssp->hw_mutex); in lombus_unattach()
2022 lombus_offline(ssp); in lombus_unattach()
2023 ddi_set_driver_private(ssp->dip, NULL); in lombus_unattach()
2037 struct lombus_state *ssp = NULL; in lombus_attach() local
2055 if ((ssp = lombus_getstate(dip, instance, "lombus_attach")) == NULL) in lombus_attach()
2056 return (lombus_unattach(ssp, instance)); in lombus_attach()
2057 ddi_set_driver_private(dip, ssp); in lombus_attach()
2062 ssp->dip = dip; in lombus_attach()
2063 ssp->majornum = ddi_driver_major(dip); in lombus_attach()
2064 ssp->instance = instance; in lombus_attach()
2069 ssp->allow_echo = ddi_prop_get_int(DDI_DEV_T_ANY, dip, in lombus_attach()
2071 ssp->baud = ddi_prop_get_int(DDI_DEV_T_ANY, dip, in lombus_attach()
2073 ssp->debug = ddi_prop_get_int(DDI_DEV_T_ANY, dip, in lombus_attach()
2075 ssp->fake_cts = ddi_prop_get_int(DDI_DEV_T_ANY, dip, in lombus_attach()
2081 ssp->cmdstate = LOMBUS_CMDSTATE_IDLE; in lombus_attach()
2082 ssp->hw_last_pat = gethrtime(); in lombus_attach()
2083 ssp->cycid = NULL; in lombus_attach()
2088 err = lombus_online(ssp); in lombus_attach()
2090 return (lombus_unattach(ssp, instance)); in lombus_attach()
2098 err = ddi_add_softintr(dip, DDI_SOFTINT_LOW, &ssp->softid, in lombus_attach()
2099 &ssp->lo_iblk, NULL, lombus_softint, (caddr_t)ssp); in lombus_attach()
2101 return (lombus_unattach(ssp, instance)); in lombus_attach()
2103 if (ssp->sio_handle != NULL) in lombus_attach()
2104 err = ddi_add_intr(dip, 0, &ssp->hw_iblk, NULL, in lombus_attach()
2105 lombus_hi_intr, (caddr_t)ssp); in lombus_attach()
2107 mutex_init(ssp->hw_mutex, NULL, MUTEX_DRIVER, ssp->hw_iblk); in lombus_attach()
2108 mutex_init(ssp->lo_mutex, NULL, MUTEX_DRIVER, ssp->lo_iblk); in lombus_attach()
2109 cv_init(ssp->lo_cv, NULL, CV_DRIVER, NULL); in lombus_attach()
2114 ssp->cycid = ddi_periodic_add(lombus_cyclic, ssp, LOMBUS_ONE_SEC, in lombus_attach()
2122 return (lombus_unattach(ssp, instance)); in lombus_attach()
2124 lombus_set_irq(ssp, B_TRUE); in lombus_attach()
2137 struct lombus_state *ssp; in lombus_detach() local
2149 if ((ssp = lombus_getstate(dip, instance, "lombus_detach")) == NULL) in lombus_detach()
2152 (void) lombus_unattach(ssp, instance); in lombus_detach()
2159 struct lombus_state *ssp; in lombus_reset() local
2163 if ((ssp = lombus_getstate(dip, -1, "lombus_reset")) == NULL) in lombus_reset()
2166 lombus_hw_reset(ssp); in lombus_reset()