Lines Matching refs:ss

107 static fct_status_t fcoet_attach_init(fcoet_soft_state_t *ss);
108 static fct_status_t fcoet_detach_uninit(fcoet_soft_state_t *ss);
110 static void fcoet_handle_sol_flogi(fcoet_soft_state_t *ss);
114 static int fcoet_dbuf_init(fcoet_soft_state_t *ss);
115 static void fcoet_dbuf_destroy(fcoet_soft_state_t *ss);
244 fcoet_soft_state_t *ss; in fcoet_attach() local
256 ss = ddi_get_soft_state(fcoet_state, instance); in fcoet_attach()
257 ss->ss_instance = instance; in fcoet_attach()
258 ss->ss_dip = dip; in fcoet_attach()
260 ret = fcoet_attach_init(ss); in fcoet_attach()
287 fcoet_soft_state_t *ss; in fcoet_detach() local
290 ss = ddi_get_soft_state(fcoet_state, instance); in fcoet_detach()
291 if (ss == NULL) { in fcoet_detach()
297 fcoe_ret = fcoet_detach_uninit(ss); in fcoet_detach()
325 fcoet_soft_state_t *ss; in fcoet_open() local
339 ss = ddi_get_soft_state(fcoet_state, instance); in fcoet_open()
340 if (ss == NULL) { in fcoet_open()
344 mutex_enter(&ss->ss_ioctl_mutex); in fcoet_open()
345 if (ss->ss_ioctl_flags & FCOET_IOCTL_FLAG_EXCL) { in fcoet_open()
350 mutex_exit(&ss->ss_ioctl_mutex); in fcoet_open()
355 if (ss->ss_ioctl_flags & FCOET_IOCTL_FLAG_OPEN) { in fcoet_open()
360 mutex_exit(&ss->ss_ioctl_mutex); in fcoet_open()
363 ss->ss_ioctl_flags |= FCOET_IOCTL_FLAG_EXCL; in fcoet_open()
365 ss->ss_ioctl_flags |= FCOET_IOCTL_FLAG_OPEN; in fcoet_open()
366 mutex_exit(&ss->ss_ioctl_mutex); in fcoet_open()
376 fcoet_soft_state_t *ss; in fcoet_close() local
383 ss = ddi_get_soft_state(fcoet_state, instance); in fcoet_close()
384 if (ss == NULL) { in fcoet_close()
388 mutex_enter(&ss->ss_ioctl_mutex); in fcoet_close()
389 if ((ss->ss_ioctl_flags & FCOET_IOCTL_FLAG_OPEN) == 0) { in fcoet_close()
390 mutex_exit(&ss->ss_ioctl_mutex); in fcoet_close()
399 ss->ss_ioctl_flags &= ~FCOET_IOCTL_FLAG_MASK; in fcoet_close()
400 mutex_exit(&ss->ss_ioctl_mutex); in fcoet_close()
410 fcoet_soft_state_t *ss; in fcoet_ioctl() local
417 ss = ddi_get_soft_state(fcoet_state, (int32_t)getminor(dev)); in fcoet_ioctl()
418 if (ss == NULL) { in fcoet_ioctl()
434 fcoet_attach_init(fcoet_soft_state_t *ss) in fcoet_attach_init() argument
454 client_fcoet.ect_client_port_struct = ss; in fcoet_attach_init()
457 ret = ddi_prop_get_int(DDI_DEV_T_ANY, ss->ss_dip, in fcoet_attach_init()
479 if (fcoet_dbuf_init(ss) != FCOE_SUCCESS) { in fcoet_attach_init()
489 fds->fds_fca_private = (void *)ss; in fcoet_attach_init()
499 (void) snprintf(ss->ss_alias, sizeof (ss->ss_alias), "fcoet%d", in fcoet_attach_init()
500 ss->ss_instance); in fcoet_attach_init()
501 ret = ddi_create_minor_node(ss->ss_dip, "admin", in fcoet_attach_init()
502 S_IFCHR, ss->ss_instance, DDI_NT_STMF_PP, 0); in fcoet_attach_init()
507 ss->ss_state = FCT_STATE_OFFLINE; in fcoet_attach_init()
508 ss->ss_state_not_acked = 1; in fcoet_attach_init()
509 ss->ss_flags = 0; in fcoet_attach_init()
510 ss->ss_port = port; in fcoet_attach_init()
511 ss->ss_eport = eport; in fcoet_attach_init()
514 ss->ss_rportid_in_dereg = 0; in fcoet_attach_init()
515 ss->ss_rport_dereg_state = 0; in fcoet_attach_init()
517 ss->ss_next_sol_oxid = 0xFFFF; in fcoet_attach_init()
518 ss->ss_next_unsol_rxid = 0xFFFF; in fcoet_attach_init()
519 ss->ss_sol_oxid_hash = mod_hash_create_idhash( in fcoet_attach_init()
522 ss->ss_unsol_rxid_hash = mod_hash_create_idhash( in fcoet_attach_init()
526 ss->ss_watch_count = 0; in fcoet_attach_init()
527 mutex_init(&ss->ss_watch_mutex, 0, MUTEX_DRIVER, 0); in fcoet_attach_init()
528 cv_init(&ss->ss_watch_cv, NULL, CV_DRIVER, NULL); in fcoet_attach_init()
530 list_create(&ss->ss_abort_xchg_list, sizeof (fcoet_exchange_t), in fcoet_attach_init()
533 ss->ss_sol_flogi = NULL; in fcoet_attach_init()
534 ss->ss_sol_flogi_state = SFS_WAIT_LINKUP; in fcoet_attach_init()
536 bzero(&ss->ss_link_info, sizeof (fct_link_info_t)); in fcoet_attach_init()
538 ss->ss_ioctl_flags = 0; in fcoet_attach_init()
539 mutex_init(&ss->ss_ioctl_mutex, 0, MUTEX_DRIVER, 0); in fcoet_attach_init()
541 ss->ss_change_state_flags = 0; in fcoet_attach_init()
549 port->port_fca_private = ss; in fcoet_attach_init()
551 bcopy(ss->ss_eport->eport_nodewwn, port->port_nwwn, 8); in fcoet_attach_init()
552 bcopy(ss->ss_eport->eport_portwwn, port->port_pwwn, 8); in fcoet_attach_init()
553 port->port_default_alias = ss->ss_alias; in fcoet_attach_init()
588 "stmf_fct_fcoet_%d_taskq", ss->ss_instance); in fcoet_attach_init()
589 if ((ss->ss_watchdog_taskq = ddi_taskq_create(NULL, in fcoet_attach_init()
594 atomic_and_32(&ss->ss_flags, ~SS_FLAG_TERMINATE_WATCHDOG); in fcoet_attach_init()
595 (void) ddi_taskq_dispatch(ss->ss_watchdog_taskq, in fcoet_attach_init()
596 fcoet_watchdog, ss, DDI_SLEEP); in fcoet_attach_init()
597 while ((ss->ss_flags & SS_FLAG_WATCHDOG_RUNNING) == 0) { in fcoet_attach_init()
601 ddi_report_dev(ss->ss_dip); in fcoet_attach_init()
605 if (ss->ss_flags & SS_FLAG_WATCHDOG_RUNNING) { in fcoet_attach_init()
606 atomic_or_32(&ss->ss_flags, SS_FLAG_TERMINATE_WATCHDOG); in fcoet_attach_init()
607 cv_broadcast(&ss->ss_watch_cv); in fcoet_attach_init()
608 while (ss->ss_flags & SS_FLAG_WATCHDOG_RUNNING) { in fcoet_attach_init()
613 ddi_taskq_destroy(ss->ss_watchdog_taskq); in fcoet_attach_init()
617 mutex_destroy(&ss->ss_ioctl_mutex); in fcoet_attach_init()
618 mutex_destroy(&ss->ss_watch_mutex); in fcoet_attach_init()
619 cv_destroy(&ss->ss_watch_cv); in fcoet_attach_init()
620 mod_hash_destroy_hash(ss->ss_sol_oxid_hash); in fcoet_attach_init()
621 mod_hash_destroy_hash(ss->ss_unsol_rxid_hash); in fcoet_attach_init()
622 list_destroy(&ss->ss_abort_xchg_list); in fcoet_attach_init()
634 fcoet_dbuf_destroy(ss); in fcoet_attach_init()
638 ss->ss_eport->eport_deregister_client(ss->ss_eport); in fcoet_attach_init()
647 fcoet_detach_uninit(fcoet_soft_state_t *ss) in fcoet_detach_uninit() argument
649 if ((ss->ss_state != FCT_STATE_OFFLINE) || in fcoet_detach_uninit()
650 ss->ss_state_not_acked) { in fcoet_detach_uninit()
657 if (ss->ss_eport != NULL && in fcoet_detach_uninit()
658 ss->ss_eport->eport_flags & EPORT_FLAG_MAC_IN_USE) { in fcoet_detach_uninit()
662 if (ss->ss_port == NULL) { in fcoet_detach_uninit()
666 ss->ss_sol_oxid_hash_empty = 1; in fcoet_detach_uninit()
667 ss->ss_unsol_rxid_hash_empty = 1; in fcoet_detach_uninit()
668 mod_hash_walk(ss->ss_sol_oxid_hash, fcoet_sol_oxid_hash_empty, ss); in fcoet_detach_uninit()
669 mod_hash_walk(ss->ss_unsol_rxid_hash, fcoet_unsol_rxid_hash_empty, ss); in fcoet_detach_uninit()
670 if ((!ss->ss_sol_oxid_hash_empty) || (!ss->ss_unsol_rxid_hash_empty)) { in fcoet_detach_uninit()
678 if (fct_deregister_local_port(ss->ss_port) != FCT_SUCCESS) { in fcoet_detach_uninit()
687 if (ss->ss_flags & SS_FLAG_WATCHDOG_RUNNING) { in fcoet_detach_uninit()
688 atomic_or_32(&ss->ss_flags, SS_FLAG_TERMINATE_WATCHDOG); in fcoet_detach_uninit()
689 cv_broadcast(&ss->ss_watch_cv); in fcoet_detach_uninit()
690 while (ss->ss_flags & SS_FLAG_WATCHDOG_RUNNING) { in fcoet_detach_uninit()
695 ddi_taskq_destroy(ss->ss_watchdog_taskq); in fcoet_detach_uninit()
700 mutex_destroy(&ss->ss_ioctl_mutex); in fcoet_detach_uninit()
701 mutex_destroy(&ss->ss_watch_mutex); in fcoet_detach_uninit()
702 cv_destroy(&ss->ss_watch_cv); in fcoet_detach_uninit()
703 mod_hash_destroy_hash(ss->ss_sol_oxid_hash); in fcoet_detach_uninit()
704 mod_hash_destroy_hash(ss->ss_unsol_rxid_hash); in fcoet_detach_uninit()
705 list_destroy(&ss->ss_abort_xchg_list); in fcoet_detach_uninit()
707 fct_free(ss->ss_port->port_fds); in fcoet_detach_uninit()
708 fct_free(ss->ss_port); in fcoet_detach_uninit()
709 ss->ss_port = NULL; in fcoet_detach_uninit()
711 fcoet_dbuf_destroy(ss); in fcoet_detach_uninit()
713 if (ss->ss_eport != NULL && in fcoet_detach_uninit()
714 ss->ss_eport->eport_deregister_client != NULL) { in fcoet_detach_uninit()
715 ss->ss_eport->eport_deregister_client(ss->ss_eport); in fcoet_detach_uninit()
717 ddi_soft_state_free(fcoet_state, ss->ss_instance); in fcoet_detach_uninit()
724 fcoet_soft_state_t *ss = (fcoet_soft_state_t *)arg; in fcoet_watchdog() local
728 FCOET_LOG("fcoet_watchdog", "fcoet_soft_state is %p", ss); in fcoet_watchdog()
730 mutex_enter(&ss->ss_watch_mutex); in fcoet_watchdog()
731 atomic_or_32(&ss->ss_flags, SS_FLAG_WATCHDOG_RUNNING); in fcoet_watchdog()
734 while ((ss->ss_flags & SS_FLAG_TERMINATE_WATCHDOG) == 0) { in fcoet_watchdog()
735 ss->ss_watch_count++; in fcoet_watchdog()
737 if (ss->ss_sol_flogi_state != SFS_FLOGI_DONE) { in fcoet_watchdog()
738 fcoet_handle_sol_flogi(ss); in fcoet_watchdog()
740 for (xchg = list_head(&ss->ss_abort_xchg_list); xchg; ) { in fcoet_watchdog()
741 xchg_next = list_next(&ss->ss_abort_xchg_list, xchg); in fcoet_watchdog()
743 list_remove(&ss->ss_abort_xchg_list, xchg); in fcoet_watchdog()
744 mutex_exit(&ss->ss_watch_mutex); in fcoet_watchdog()
755 mutex_enter(&ss->ss_watch_mutex); in fcoet_watchdog()
760 atomic_or_32(&ss->ss_flags, SS_FLAG_DOG_WAITING); in fcoet_watchdog()
761 (void) cv_reltimedwait(&ss->ss_watch_cv, &ss->ss_watch_mutex, in fcoet_watchdog()
763 atomic_and_32(&ss->ss_flags, ~SS_FLAG_DOG_WAITING); in fcoet_watchdog()
769 if (ss->ss_sol_flogi) { in fcoet_watchdog()
770 fcoet_clear_sol_exchange(ss->ss_sol_flogi); in fcoet_watchdog()
771 fct_free(ss->ss_sol_flogi->xch_cmd); in fcoet_watchdog()
772 ss->ss_sol_flogi = NULL; in fcoet_watchdog()
775 atomic_and_32(&ss->ss_flags, ~SS_FLAG_WATCHDOG_RUNNING); in fcoet_watchdog()
776 mutex_exit(&ss->ss_watch_mutex); in fcoet_watchdog()
780 fcoet_handle_sol_flogi(fcoet_soft_state_t *ss) in fcoet_handle_sol_flogi() argument
785 if (ss->ss_flags & SS_FLAG_PORT_DISABLED) { in fcoet_handle_sol_flogi()
786 ss->ss_sol_flogi_state = SFS_WAIT_LINKUP; in fcoet_handle_sol_flogi()
789 switch (ss->ss_sol_flogi_state) { in fcoet_handle_sol_flogi()
791 if (ss->ss_sol_flogi) { in fcoet_handle_sol_flogi()
792 if (ss->ss_sol_flogi->xch_ref == 0) { in fcoet_handle_sol_flogi()
793 fcoet_clear_sol_exchange(ss->ss_sol_flogi); in fcoet_handle_sol_flogi()
794 fct_free(ss->ss_sol_flogi->xch_cmd); in fcoet_handle_sol_flogi()
795 ss->ss_sol_flogi = NULL; in fcoet_handle_sol_flogi()
801 if (ss->ss_sol_flogi) { in fcoet_handle_sol_flogi()
805 ss->ss_sol_flogi_state = SFS_CLEAR_FLOGI; in fcoet_handle_sol_flogi()
808 fcoet_send_sol_flogi(ss); in fcoet_handle_sol_flogi()
809 ss->ss_sol_flogi_state++; in fcoet_handle_sol_flogi()
813 if ((ss->ss_sol_flogi->xch_start_time + twosec) < in fcoet_handle_sol_flogi()
815 ss->ss_sol_flogi_state++; in fcoet_handle_sol_flogi()
820 fcoet_send_sol_abts(ss->ss_sol_flogi); in fcoet_handle_sol_flogi()
821 ss->ss_sol_flogi_state++; in fcoet_handle_sol_flogi()
825 if (ss->ss_sol_flogi) { in fcoet_handle_sol_flogi()
826 if (ss->ss_sol_flogi->xch_ref) { in fcoet_handle_sol_flogi()
829 fcoet_clear_sol_exchange(ss->ss_sol_flogi); in fcoet_handle_sol_flogi()
830 fct_free(ss->ss_sol_flogi->xch_cmd); in fcoet_handle_sol_flogi()
831 ss->ss_sol_flogi = NULL; in fcoet_handle_sol_flogi()
833 ss->ss_sol_flogi_state = SFS_FLOGI_INIT; in fcoet_handle_sol_flogi()
837 ss->ss_sol_flogi_state++; in fcoet_handle_sol_flogi()
841 if (!(ss->ss_flags & SS_FLAG_PORT_DISABLED) && in fcoet_handle_sol_flogi()
842 ss->ss_sol_flogi) { in fcoet_handle_sol_flogi()
843 fcoet_clear_sol_exchange(ss->ss_sol_flogi); in fcoet_handle_sol_flogi()
844 fct_free(ss->ss_sol_flogi->xch_cmd); in fcoet_handle_sol_flogi()
845 ss->ss_sol_flogi = NULL; in fcoet_handle_sol_flogi()
852 fct_handle_event(ss->ss_port, in fcoet_handle_sol_flogi()
855 fct_handle_event(ss->ss_port, in fcoet_handle_sol_flogi()
867 fcoet_dbuf_init(fcoet_soft_state_t *ss) in fcoet_dbuf_init() argument
874 fcoet_dbuf_destroy(fcoet_soft_state_t *ss) in fcoet_dbuf_destroy() argument
892 fcoet_soft_state_t *ss = in fcoet_dbuf_alloc() local
903 sge_num = (size - 1) / ss->ss_fcp_data_payload_size + 1; in fcoet_dbuf_alloc()
920 sge_size = ss->ss_fcp_data_payload_size; in fcoet_dbuf_alloc()
921 netb = ss->ss_eport->eport_alloc_netb( in fcoet_dbuf_alloc()
922 ss->ss_eport, sizeof (fcoe_fc_frame_header_t) + in fcoet_dbuf_alloc()
926 ss->ss_eport->eport_free_netb( in fcoet_dbuf_alloc()
942 if (size % ss->ss_fcp_data_payload_size) { in fcoet_dbuf_alloc()
943 sge_size = P2ROUNDUP(size % ss->ss_fcp_data_payload_size, 4); in fcoet_dbuf_alloc()
945 sge_size = ss->ss_fcp_data_payload_size; in fcoet_dbuf_alloc()
948 netb = ss->ss_eport->eport_alloc_netb( in fcoet_dbuf_alloc()
949 ss->ss_eport, in fcoet_dbuf_alloc()
954 ss->ss_eport->eport_free_netb( in fcoet_dbuf_alloc()
979 fcoet_soft_state_t *ss = in fcoet_dbuf_free() local
984 ss->ss_eport->eport_free_netb( in fcoet_dbuf_free()
1007 fcoet_soft_state_t *ss = (fcoet_soft_state_t *)arg; in fcoet_sol_oxid_hash_empty() local
1009 ss->ss_sol_oxid_hash_empty = 0; in fcoet_sol_oxid_hash_empty()
1018 fcoet_soft_state_t *ss = (fcoet_soft_state_t *)arg; in fcoet_unsol_rxid_hash_empty() local
1020 ss->ss_sol_oxid_hash_empty = 0; in fcoet_unsol_rxid_hash_empty()