Lines Matching refs:rcs

100 	struct rmc_comm_state *rcs;  in rmc_comm_register()  local
103 rcs = ddi_get_soft_state(rmc_comm_statep, 0); in rmc_comm_register()
104 if ((rcs == NULL) || (!rcs->is_attached)) { in rmc_comm_register()
108 rcs->n_registrations++; in rmc_comm_register()
116 struct rmc_comm_state *rcs; in rmc_comm_unregister() local
119 rcs = ddi_get_soft_state(rmc_comm_statep, 0); in rmc_comm_unregister()
120 ASSERT(rcs != NULL); in rmc_comm_unregister()
121 ASSERT(rcs->n_registrations != 0); in rmc_comm_unregister()
122 rcs->n_registrations--; in rmc_comm_unregister()
132 struct rmc_comm_state *rcs = NULL; in rmc_comm_getstate() local
154 rcs = ddi_get_soft_state(rmc_comm_statep, instance); in rmc_comm_getstate()
155 if (rcs != NULL) { in rmc_comm_getstate()
156 sdip = rcs->dip; in rmc_comm_getstate()
158 rcs = NULL; in rmc_comm_getstate()
164 rcs = NULL; in rmc_comm_getstate()
168 return (rcs); in rmc_comm_getstate()
176 sio_put_reg(struct rmc_comm_state *rcs, uint_t reg, uint8_t val) in sio_put_reg() argument
178 DPRINTF(rcs, DSER, (CE_CONT, "REG[%d]<-$%02x", reg, val)); in sio_put_reg()
180 if (rcs->sd_state.sio_handle != NULL && !rcs->sd_state.sio_fault) { in sio_put_reg()
207 ddi_put8(rcs->sd_state.sio_handle, in sio_put_reg()
208 rcs->sd_state.sio_regs + reg, val); in sio_put_reg()
209 ddi_put8(rcs->sd_state.sio_handle, in sio_put_reg()
210 rcs->sd_state.sio_regs + SIO_SCR, val); in sio_put_reg()
212 (void) ddi_get8(rcs->sd_state.sio_handle, in sio_put_reg()
213 rcs->sd_state.sio_regs + SIO_SCR); in sio_put_reg()
218 sio_get_reg(struct rmc_comm_state *rcs, uint_t reg) in sio_get_reg() argument
222 if (rcs->sd_state.sio_handle && !rcs->sd_state.sio_fault) in sio_get_reg()
223 val = ddi_get8(rcs->sd_state.sio_handle, in sio_get_reg()
224 rcs->sd_state.sio_regs + reg); in sio_get_reg()
227 DPRINTF(rcs, DSER, (CE_CONT, "$%02x<-REG[%d]", val, reg)); in sio_get_reg()
232 sio_check_fault_status(struct rmc_comm_state *rcs) in sio_check_fault_status() argument
234 rcs->sd_state.sio_fault = in sio_check_fault_status()
235 ddi_check_acc_handle(rcs->sd_state.sio_handle) != DDI_SUCCESS; in sio_check_fault_status()
239 rmc_comm_faulty(struct rmc_comm_state *rcs) in rmc_comm_faulty() argument
241 if (!rcs->sd_state.sio_fault) in rmc_comm_faulty()
242 sio_check_fault_status(rcs); in rmc_comm_faulty()
243 return (rcs->sd_state.sio_fault); in rmc_comm_faulty()
250 sio_data_ready(struct rmc_comm_state *rcs) in sio_data_ready() argument
258 status = sio_get_reg(rcs, SIO_LSR); in sio_data_ready()
259 return ((status & SIO_LSR_RXDA) != 0 && !rmc_comm_faulty(rcs)); in sio_data_ready()
266 rmc_comm_set_irq(struct rmc_comm_state *rcs, boolean_t newstate) in rmc_comm_set_irq() argument
271 sio_put_reg(rcs, SIO_IER, SIO_IER_STD | val); in rmc_comm_set_irq()
272 rcs->sd_state.hw_int_enabled = newstate; in rmc_comm_set_irq()
299 struct rmc_comm_state *rcs = (void *)arg; in rmc_comm_hi_intr() local
303 if (rcs->sd_state.cycid != NULL) { in rmc_comm_hi_intr()
313 if (mutex_tryenter(rcs->sd_state.hw_mutex) == 0) { in rmc_comm_hi_intr()
317 mutex_enter(rcs->sd_state.hw_mutex); in rmc_comm_hi_intr()
319 if (rcs->sd_state.hw_int_enabled) { in rmc_comm_hi_intr()
320 rmc_comm_set_irq(rcs, B_FALSE); in rmc_comm_hi_intr()
321 ddi_trigger_softintr(rcs->sd_state.softid); in rmc_comm_hi_intr()
324 mutex_exit(rcs->sd_state.hw_mutex); in rmc_comm_hi_intr()
337 rmc_comm_serdev_receive(struct rmc_comm_state *rcs) in rmc_comm_serdev_receive() argument
341 DPRINTF(rcs, DSER, (CE_CONT, "serdev_receive: soft int handler\n")); in rmc_comm_serdev_receive()
348 if (!rmc_comm_faulty(rcs)) { in rmc_comm_serdev_receive()
350 char *rx_buf = rcs->sd_state.serdev_rx_buf; in rmc_comm_serdev_receive()
365 mutex_enter(rcs->sd_state.hw_mutex); in rmc_comm_serdev_receive()
366 while (sio_data_ready(rcs)) { in rmc_comm_serdev_receive()
367 data = sio_get_reg(rcs, SIO_RXD); in rmc_comm_serdev_receive()
372 rcs->sd_state.serdev_rx_count = rx_buflen; in rmc_comm_serdev_receive()
374 DATASCOPE(rcs, 'R', rx_buf, rx_buflen) in rmc_comm_serdev_receive()
376 rmc_comm_set_irq(rcs, B_TRUE); in rmc_comm_serdev_receive()
377 mutex_exit(rcs->sd_state.hw_mutex); in rmc_comm_serdev_receive()
382 rmc_comm_dp_drecv(rcs, (uint8_t *)rx_buf, rx_buflen); in rmc_comm_serdev_receive()
394 struct rmc_comm_state *rcs = (void *)arg; in rmc_comm_softint() local
396 mutex_enter(rcs->dp_state.dp_mutex); in rmc_comm_softint()
397 rmc_comm_serdev_receive(rcs); in rmc_comm_softint()
398 mutex_exit(rcs->dp_state.dp_mutex); in rmc_comm_softint()
409 struct rmc_comm_state *rcs = (void *)arg; in rmc_comm_cyclic() local
411 mutex_enter(rcs->dp_state.dp_mutex); in rmc_comm_cyclic()
412 rmc_comm_serdev_receive(rcs); in rmc_comm_cyclic()
413 mutex_exit(rcs->dp_state.dp_mutex); in rmc_comm_cyclic()
422 rmc_comm_serdev_send(struct rmc_comm_state *rcs, char *buf, int buflen) in rmc_comm_serdev_send() argument
435 sio_check_fault_status(rcs); in rmc_comm_serdev_send()
440 DATASCOPE(rcs, 'S', buf, buflen) in rmc_comm_serdev_send()
442 mutex_enter(rcs->sd_state.hw_mutex); in rmc_comm_serdev_send()
452 status = sio_get_reg(rcs, SIO_LSR); in rmc_comm_serdev_send()
455 status = sio_get_reg(rcs, SIO_LSR); in rmc_comm_serdev_send()
457 sio_put_reg(rcs, SIO_TXD, *p++); in rmc_comm_serdev_send()
459 mutex_exit(rcs->sd_state.hw_mutex); in rmc_comm_serdev_send()
466 rmc_comm_serdev_drain(struct rmc_comm_state *rcs) in rmc_comm_serdev_drain() argument
470 mutex_enter(rcs->sd_state.hw_mutex); in rmc_comm_serdev_drain()
471 status = sio_get_reg(rcs, SIO_LSR); in rmc_comm_serdev_drain()
474 status = sio_get_reg(rcs, SIO_LSR); in rmc_comm_serdev_drain()
476 mutex_exit(rcs->sd_state.hw_mutex); in rmc_comm_serdev_drain()
486 rmc_comm_hw_reset(struct rmc_comm_state *rcs) in rmc_comm_hw_reset() argument
494 rmc_comm_set_irq(rcs, B_FALSE); in rmc_comm_hw_reset()
495 sio_put_reg(rcs, SIO_FCR, SIO_FCR_RXSR | SIO_FCR_TXSR); in rmc_comm_hw_reset()
496 sio_put_reg(rcs, SIO_LCR, SIO_LCR_STD); in rmc_comm_hw_reset()
504 if (rcs->baud < SIO_BAUD_MIN || rcs->baud > SIO_BAUD_MAX) { in rmc_comm_hw_reset()
506 rcs->baud_divisor_factor; in rmc_comm_hw_reset()
508 divisor = SIO_BAUD_TO_DIVISOR(rcs->baud) * in rmc_comm_hw_reset()
509 rcs->baud_divisor_factor; in rmc_comm_hw_reset()
523 sio_put_reg(rcs, SIO_BSR, SIO_BSR_BANK1); in rmc_comm_hw_reset()
524 sio_put_reg(rcs, SIO_LBGDL, 0xff); in rmc_comm_hw_reset()
525 sio_put_reg(rcs, SIO_LBGDH, divisor >> 8); in rmc_comm_hw_reset()
526 sio_put_reg(rcs, SIO_LBGDL, divisor & 0xff); in rmc_comm_hw_reset()
527 sio_put_reg(rcs, SIO_BSR, SIO_BSR_BANK0); in rmc_comm_hw_reset()
532 sio_put_reg(rcs, SIO_MCR, SIO_MCR_STD); in rmc_comm_hw_reset()
533 sio_put_reg(rcs, SIO_FCR, SIO_FCR_STD); in rmc_comm_hw_reset()
540 rmc_comm_offline(struct rmc_comm_state *rcs) in rmc_comm_offline() argument
542 if (rcs->sd_state.sio_handle != NULL) in rmc_comm_offline()
543 ddi_regs_map_free(&rcs->sd_state.sio_handle); in rmc_comm_offline()
544 rcs->sd_state.sio_handle = NULL; in rmc_comm_offline()
545 rcs->sd_state.sio_regs = NULL; in rmc_comm_offline()
549 rmc_comm_online(struct rmc_comm_state *rcs, dev_info_t *dip) in rmc_comm_online() argument
568 rcs->sd_state.sio_handle = h; in rmc_comm_online()
569 rcs->sd_state.sio_regs = (void *)p; in rmc_comm_online()
582 rmc_comm_hw_reset(rcs); in rmc_comm_online()
593 rmc_comm_serdev_init(struct rmc_comm_state *rcs, dev_info_t *dip) in rmc_comm_serdev_init() argument
597 rcs->sd_state.cycid = NULL; in rmc_comm_serdev_init()
602 err = rmc_comm_online(rcs, dip); in rmc_comm_serdev_init()
613 &rcs->dp_state.dp_iblk); in rmc_comm_serdev_init()
617 err = ddi_get_iblock_cookie(dip, 0, &rcs->sd_state.hw_iblk); in rmc_comm_serdev_init()
624 mutex_init(rcs->dp_state.dp_mutex, NULL, MUTEX_DRIVER, in rmc_comm_serdev_init()
625 rcs->dp_state.dp_iblk); in rmc_comm_serdev_init()
627 mutex_init(rcs->sd_state.hw_mutex, NULL, MUTEX_DRIVER, in rmc_comm_serdev_init()
628 rcs->sd_state.hw_iblk); in rmc_comm_serdev_init()
638 err = ddi_add_softintr(dip, DDI_SOFTINT_LOW, &rcs->sd_state.softid, in rmc_comm_serdev_init()
639 &rcs->dp_state.dp_iblk, NULL, rmc_comm_softint, (caddr_t)rcs); in rmc_comm_serdev_init()
641 mutex_destroy(rcs->dp_state.dp_mutex); in rmc_comm_serdev_init()
642 mutex_destroy(rcs->sd_state.hw_mutex); in rmc_comm_serdev_init()
650 if (rcs->sd_state.sio_handle != NULL) { in rmc_comm_serdev_init()
651 err = ddi_add_intr(dip, 0, &rcs->sd_state.hw_iblk, NULL, in rmc_comm_serdev_init()
652 rmc_comm_hi_intr, (caddr_t)rcs); in rmc_comm_serdev_init()
658 ddi_remove_softintr(rcs->sd_state.softid); in rmc_comm_serdev_init()
659 mutex_destroy(rcs->dp_state.dp_mutex); in rmc_comm_serdev_init()
660 mutex_destroy(rcs->sd_state.hw_mutex); in rmc_comm_serdev_init()
668 rcs->sd_state.cycid = ddi_periodic_add(rmc_comm_cyclic, rcs, in rmc_comm_serdev_init()
679 rmc_comm_serdev_fini(struct rmc_comm_state *rcs, dev_info_t *dip) in rmc_comm_serdev_fini() argument
681 rmc_comm_hw_reset(rcs); in rmc_comm_serdev_fini()
683 if (rcs->sd_state.cycid != NULL) { in rmc_comm_serdev_fini()
684 ddi_periodic_delete(rcs->sd_state.cycid); in rmc_comm_serdev_fini()
685 rcs->sd_state.cycid = NULL; in rmc_comm_serdev_fini()
687 if (rcs->sd_state.sio_handle != NULL) in rmc_comm_serdev_fini()
688 ddi_remove_intr(dip, 0, rcs->sd_state.hw_iblk); in rmc_comm_serdev_fini()
690 ddi_remove_softintr(rcs->sd_state.softid); in rmc_comm_serdev_fini()
692 mutex_destroy(rcs->sd_state.hw_mutex); in rmc_comm_serdev_fini()
694 mutex_destroy(rcs->dp_state.dp_mutex); in rmc_comm_serdev_fini()
696 rmc_comm_offline(rcs); in rmc_comm_serdev_fini()
707 rmc_comm_unattach(struct rmc_comm_state *rcs, dev_info_t *dip, int instance, in rmc_comm_unattach() argument
710 if (rcs != NULL) { in rmc_comm_unattach()
714 rmc_comm_set_irq(rcs, B_FALSE); in rmc_comm_unattach()
720 rmc_comm_drvintf_fini(rcs); in rmc_comm_unattach()
726 rmc_comm_dp_fini(rcs); in rmc_comm_unattach()
732 rmc_comm_serdev_fini(rcs, dip); in rmc_comm_unattach()
746 struct rmc_comm_state *rcs = NULL; in rmc_comm_attach() local
762 if ((rcs = rmc_comm_getstate(dip, instance, in rmc_comm_attach()
766 rmc_comm_hw_reset(rcs); in rmc_comm_attach()
767 rmc_comm_set_irq(rcs, B_TRUE); in rmc_comm_attach()
768 rcs->dip = dip; in rmc_comm_attach()
777 mutex_enter(rcs->dp_state.dp_mutex); in rmc_comm_attach()
778 dp_reset(rcs, INITIAL_SEQID, 1, 1); in rmc_comm_attach()
779 mutex_exit(rcs->dp_state.dp_mutex); in rmc_comm_attach()
800 if ((rcs = rmc_comm_getstate(dip, instance, "rmc_comm_attach")) == in rmc_comm_attach()
802 rmc_comm_unattach(rcs, dip, instance, 0, 0, 0); in rmc_comm_attach()
805 ddi_set_driver_private(dip, rcs); in rmc_comm_attach()
807 rcs->dip = NULL; in rmc_comm_attach()
812 rcs->baud = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, in rmc_comm_attach()
814 rcs->debug = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, in rmc_comm_attach()
822 rcs->baud_divisor_factor = ddi_prop_get_int(DDI_DEV_T_ANY, dip, in rmc_comm_attach()
828 if ((rcs->baud_divisor_factor < SIO_BAUD_DIVISOR_MIN) || in rmc_comm_attach()
829 (rcs->baud_divisor_factor > SIO_BAUD_DIVISOR_MAX)) in rmc_comm_attach()
830 rcs->baud_divisor_factor = SIO_BAUD_DIVISOR_MIN; in rmc_comm_attach()
835 if (rmc_comm_serdev_init(rcs, dip) != 0) { in rmc_comm_attach()
836 rmc_comm_unattach(rcs, dip, instance, 0, 0, 0); in rmc_comm_attach()
843 rmc_comm_dp_init(rcs); in rmc_comm_attach()
848 if (rmc_comm_drvintf_init(rcs) != 0) { in rmc_comm_attach()
849 rmc_comm_unattach(rcs, dip, instance, 0, 1, 1); in rmc_comm_attach()
856 rcs->majornum = ddi_driver_major(dip); in rmc_comm_attach()
857 rcs->instance = instance; in rmc_comm_attach()
858 rcs->dip = dip; in rmc_comm_attach()
863 rmc_comm_set_irq(rcs, B_TRUE); in rmc_comm_attach()
870 rcs->is_attached = B_TRUE; in rmc_comm_attach()
878 struct rmc_comm_state *rcs; in rmc_comm_detach() local
882 if ((rcs = rmc_comm_getstate(dip, instance, "rmc_comm_detach")) == NULL) in rmc_comm_detach()
897 rcs->dip = NULL; in rmc_comm_detach()
898 rmc_comm_hw_reset(rcs); in rmc_comm_detach()
907 if (rcs->n_registrations != 0) { in rmc_comm_detach()
916 rcs->is_attached = B_FALSE; in rmc_comm_detach()
918 rmc_comm_unattach(rcs, dip, instance, 1, 1, 1); in rmc_comm_detach()
930 struct rmc_comm_state *rcs; in rmc_comm_reset() local
932 if ((rcs = rmc_comm_getstate(dip, -1, "rmc_comm_reset")) == NULL) in rmc_comm_reset()
934 rmc_comm_hw_reset(rcs); in rmc_comm_reset()