Lines Matching refs:pptr

630 	pmcs_phy_t *pptr;  in pmcs_start_phy()  local
634 pptr = pwp->root_phys + phynum; in pmcs_start_phy()
635 if (pptr == NULL) { in pmcs_start_phy()
642 pmcs_lock_phy(pptr); in pmcs_start_phy()
645 pwrk = pmcs_gwork(pwp, PMCS_TAG_TYPE_WAIT, pptr); in pmcs_start_phy()
647 pmcs_unlock_phy(pptr); in pmcs_start_phy()
648 pmcs_prt(pwp, PMCS_PRT_ERR, pptr, NULL, pmcs_nowrk, __func__); in pmcs_start_phy()
657 pmcs_unlock_phy(pptr); in pmcs_start_phy()
659 pmcs_prt(pwp, PMCS_PRT_ERR, pptr, NULL, pmcs_nomsg, __func__); in pmcs_start_phy()
681 pptr->state.prog_min_rate = (lowbit((ulong_t)speed) - 1); in pmcs_start_phy()
682 pptr->state.prog_max_rate = (highbit((ulong_t)speed) - 1); in pmcs_start_phy()
683 pptr->state.hw_min_rate = PMCS_HW_MIN_LINK_RATE; in pmcs_start_phy()
684 pptr->state.hw_max_rate = PMCS_HW_MAX_LINK_RATE; in pmcs_start_phy()
686 pmcs_unlock_phy(pptr); in pmcs_start_phy()
691 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, pmcs_timeo, __func__); in pmcs_start_phy()
737 pmcs_reset_phy(pmcs_hw_t *pwp, pmcs_phy_t *pptr, uint8_t type) in pmcs_reset_phy() argument
751 ASSERT(mutex_owned(&pptr->phy_lock)); in pmcs_reset_phy()
754 phynum = pptr->phynum; in pmcs_reset_phy()
755 level = pptr->level; in pmcs_reset_phy()
757 pdevid = pptr->parent->device_id; in pmcs_reset_phy()
758 } else if ((level == 0) && (pptr->dtype == EXPANDER)) { in pmcs_reset_phy()
759 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, pptr->target, in pmcs_reset_phy()
760 "%s: Not resetting HBA PHY @ %s", __func__, pptr->path); in pmcs_reset_phy()
764 if (!pptr->iport || !pptr->valid_device_id) { in pmcs_reset_phy()
765 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, pptr->target, in pmcs_reset_phy()
766 "%s: Can't reach PHY %s", __func__, pptr->path); in pmcs_reset_phy()
770 pwrk = pmcs_gwork(pwp, PMCS_TAG_TYPE_WAIT, pptr); in pmcs_reset_phy()
773 pmcs_prt(pwp, PMCS_PRT_ERR, pptr, NULL, pmcs_nowrk, __func__); in pmcs_reset_phy()
807 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_reset_phy()
809 __func__, mbar, pptr->parent->path, pptr->phynum); in pmcs_reset_phy()
827 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_reset_phy()
828 "%s: sending %s to %s", __func__, mbar, pptr->path); in pmcs_reset_phy()
837 pmcs_prt(pwp, PMCS_PRT_ERR, pptr, NULL, pmcs_nomsg, __func__); in pmcs_reset_phy()
843 pmcs_hold_iport(pptr->iport); in pmcs_reset_phy()
844 iport = pptr->iport; in pmcs_reset_phy()
848 pmcs_unlock_phy(pptr); in pmcs_reset_phy()
853 pmcs_lock_phy(pptr); in pmcs_reset_phy()
855 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, pmcs_timeo, __func__); in pmcs_reset_phy()
857 if (pmcs_abort(pwp, pptr, htag, 0, 0)) { in pmcs_reset_phy()
858 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_reset_phy()
862 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_reset_phy()
878 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_reset_phy()
880 pptr->path); in pmcs_reset_phy()
895 pmcs_phy_t *pptr; in pmcs_stop_phy() local
899 pptr = pwp->root_phys + phynum; in pmcs_stop_phy()
900 if (pptr == NULL) { in pmcs_stop_phy()
907 pwrk = pmcs_gwork(pwp, PMCS_TAG_TYPE_WAIT, pptr); in pmcs_stop_phy()
910 pmcs_prt(pwp, PMCS_PRT_ERR, pptr, NULL, in pmcs_stop_phy()
921 pmcs_prt(pwp, PMCS_PRT_ERR, pptr, NULL, in pmcs_stop_phy()
938 pptr, NULL, pmcs_timeo, __func__); in pmcs_stop_phy()
944 pptr->configured = 0; in pmcs_stop_phy()
1168 pmcs_phy_t *pptr, *pnext, *pnext_uplevel[PMCS_MAX_XPND]; in pmcs_abort_handler() local
1175 pptr = pwp->root_phys; in pmcs_abort_handler()
1178 while (pptr) { in pmcs_abort_handler()
1183 pmcs_lock_phy(pptr); in pmcs_abort_handler()
1184 if (pptr->need_rl_ext) { in pmcs_abort_handler()
1185 ASSERT(pptr->dtype == SATA); in pmcs_abort_handler()
1189 r = pmcs_sata_abort_ncq(pwp, pptr); in pmcs_abort_handler()
1195 r = pmcs_reset_phy(pwp, pptr, in pmcs_abort_handler()
1201 pptr->abort_pending = 1; in pmcs_abort_handler()
1202 pptr->abort_sent = 0; in pmcs_abort_handler()
1205 if (pptr->abort_pending == 0 || pptr->abort_sent) { in pmcs_abort_handler()
1208 pptr->abort_pending = 0; in pmcs_abort_handler()
1209 if (pmcs_abort(pwp, pptr, pptr->device_id, 1, 1) == ENOMEM) { in pmcs_abort_handler()
1210 pptr->abort_pending = 1; in pmcs_abort_handler()
1213 pptr->abort_sent = 1; in pmcs_abort_handler()
1218 if ((pptr->iport == NULL) || in pmcs_abort_handler()
1219 (pptr->iport->ua_state != UA_ACTIVE)) { in pmcs_abort_handler()
1220 tgt = pptr->target; in pmcs_abort_handler()
1222 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, tgt, in pmcs_abort_handler()
1232 if (pptr->children) { in pmcs_abort_handler()
1233 pnext = pptr->children; in pmcs_abort_handler()
1234 pnext_uplevel[level++] = pptr->sibling; in pmcs_abort_handler()
1236 pnext = pptr->sibling; in pmcs_abort_handler()
1242 pmcs_unlock_phy(pptr); in pmcs_abort_handler()
1243 pptr = pnext; in pmcs_abort_handler()
1254 pmcs_register_device(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_register_device() argument
1266 (pwrk = pmcs_gwork(pwp, PMCS_TAG_TYPE_WAIT, pptr)) == NULL) { in pmcs_register_device()
1273 pwrk->dtype = pptr->dtype; in pmcs_register_device()
1278 (pptr->link_rate << PMCS_DEVREG_LINK_RATE_SHIFT); in pmcs_register_device()
1279 if (IS_ROOT_PHY(pptr)) { in pmcs_register_device()
1280 msg[2] = LE_32(pptr->portid | in pmcs_register_device()
1281 (pptr->phynum << PMCS_PHYID_SHIFT)); in pmcs_register_device()
1283 msg[2] = LE_32(pptr->portid); in pmcs_register_device()
1285 if (pptr->dtype == SATA) { in pmcs_register_device()
1286 if (IS_ROOT_PHY(pptr)) { in pmcs_register_device()
1296 (void) memcpy(&msg[5], pptr->sas_address, 8); in pmcs_register_device()
1302 pmcs_unlock_phy(pptr); in pmcs_register_device()
1305 pmcs_lock_phy(pptr); in pmcs_register_device()
1308 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, pmcs_timeo, __func__); in pmcs_register_device()
1318 if (pmcs_validate_devid(pwp->root_phys, pptr, tmp) == B_FALSE) { in pmcs_register_device()
1323 pmcs_prt(pwp, PMCS_PRT_INFO, pptr, NULL, in pmcs_register_device()
1325 __func__, pptr->path, tmp); in pmcs_register_device()
1329 pmcs_prt(pwp, PMCS_PRT_INFO, pptr, NULL, in pmcs_register_device()
1331 __func__, pptr->path, tmp); in pmcs_register_device()
1336 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_register_device()
1338 __func__, status, pptr->path); in pmcs_register_device()
1342 pptr->device_id = tmp; in pmcs_register_device()
1343 pptr->valid_device_id = 1; in pmcs_register_device()
1344 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, "Phy %s/" SAS_ADDR_FMT in pmcs_register_device()
1345 " registered with device_id 0x%x (portid %d)", pptr->path, in pmcs_register_device()
1346 SAS_ADDR_PRT(pptr->sas_address), tmp, pptr->portid); in pmcs_register_device()
1356 pmcs_deregister_device(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_deregister_device() argument
1363 pwrk = pmcs_gwork(pwp, PMCS_TAG_TYPE_WAIT, pptr); in pmcs_deregister_device()
1369 pwrk->dtype = pptr->dtype; in pmcs_deregister_device()
1380 msg[2] = LE_32(pptr->device_id); in pmcs_deregister_device()
1385 pmcs_unlock_phy(pptr); in pmcs_deregister_device()
1388 pmcs_lock_phy(pptr); in pmcs_deregister_device()
1391 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, pmcs_timeo, __func__); in pmcs_deregister_device()
1396 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_deregister_device()
1398 __func__, status, pptr->path); in pmcs_deregister_device()
1400 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_deregister_device()
1401 "%s: device %s deregistered", __func__, pptr->path); in pmcs_deregister_device()
1404 pptr->device_id = PMCS_INVALID_DEVICE_ID; in pmcs_deregister_device()
1405 pptr->configured = 0; in pmcs_deregister_device()
1406 pptr->deregister_wait = 0; in pmcs_deregister_device()
1407 pptr->valid_device_id = 0; in pmcs_deregister_device()
1441 pmcs_phy_t *pptr; in pmcs_soft_reset() local
1760 for (pptr = pwp->root_phys; pptr; pptr = pptr->sibling) { in pmcs_soft_reset()
1761 pmcs_lock_phy(pptr); in pmcs_soft_reset()
1762 pmcs_clear_phy(pwp, pptr); in pmcs_soft_reset()
1763 pptr->target = NULL; in pmcs_soft_reset()
1764 pmcs_unlock_phy(pptr); in pmcs_soft_reset()
1902 pmcs_reset_dev(pmcs_hw_t *pwp, pmcs_phy_t *pptr, uint64_t lun) in pmcs_reset_dev() argument
1906 if (pptr == NULL) { in pmcs_reset_dev()
1910 pmcs_lock_phy(pptr); in pmcs_reset_dev()
1911 if (pptr->dtype == SAS) { in pmcs_reset_dev()
1926 rval = pmcs_ssp_tmf(pwp, pptr, SAS_LOGICAL_UNIT_RESET, 0, lun, in pmcs_reset_dev()
1928 } else if (pptr->dtype == SATA) { in pmcs_reset_dev()
1930 pmcs_unlock_phy(pptr); in pmcs_reset_dev()
1933 rval = pmcs_reset_phy(pwp, pptr, PMCS_PHYOP_LINK_RESET); in pmcs_reset_dev()
1935 pmcs_unlock_phy(pptr); in pmcs_reset_dev()
1936 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_reset_dev()
1938 __func__, pptr->path); in pmcs_reset_dev()
1950 if (pmcs_abort(pwp, pptr, 0, 1, 0)) { in pmcs_reset_dev()
1951 pptr->abort_pending = 1; in pmcs_reset_dev()
1955 pmcs_unlock_phy(pptr); in pmcs_reset_dev()
1963 pmcs_get_device_handle(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_get_device_handle() argument
1965 if (pptr->valid_device_id == 0) { in pmcs_get_device_handle()
1966 int result = pmcs_register_device(pwp, pptr); in pmcs_get_device_handle()
1971 if (pptr->changed) { in pmcs_get_device_handle()
1981 PHY_CHANGED(pwp, pptr); in pmcs_get_device_handle()
1991 if (ddi_get_lbolt() < pptr->config_stop) { in pmcs_get_device_handle()
1992 PHY_CHANGED(pwp, pptr); in pmcs_get_device_handle()
1995 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_get_device_handle()
1997 __func__, pptr->path); in pmcs_get_device_handle()
1998 pptr->config_stop = 0; in pmcs_get_device_handle()
1999 pmcs_kill_changed(pwp, pptr, 0); in pmcs_get_device_handle()
2007 if (result || pptr->valid_device_id == 0) { in pmcs_get_device_handle()
2008 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_get_device_handle()
2010 pptr->path); in pmcs_get_device_handle()
2075 iport->pptr = NULL; in pmcs_iport_teardown_phys()
2096 pmcs_phy_t *pptr; in pmcs_iport_configure_phys() local
2120 pptr = pwp->root_phys + phynum; in pmcs_iport_configure_phys()
2121 ASSERT(pptr); in pmcs_iport_configure_phys()
2122 pmcs_lock_phy(pptr); in pmcs_iport_configure_phys()
2123 ASSERT(pptr->phynum == phynum); in pmcs_iport_configure_phys()
2128 pptr->iport = iport; in pmcs_iport_configure_phys()
2134 if (!pptr->subsidiary) { in pmcs_iport_configure_phys()
2135 iport->pptr = pptr; in pmcs_iport_configure_phys()
2136 iport->portid = pptr->portid; in pmcs_iport_configure_phys()
2142 pmcs_unlock_phy(pptr); in pmcs_iport_configure_phys()
2143 pmcs_add_phy_to_iport(iport, pptr); in pmcs_iport_configure_phys()
2145 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, "%s: found " in pmcs_iport_configure_phys()
2147 (void *)pptr, inst, iport->refcnt); in pmcs_iport_configure_phys()
2217 pmcs_phy_t *pptr, *child; in pmcs_promote_next_phy() local
2226 for (pptr = pwp->root_phys; pptr; pptr = pptr->sibling) { in pmcs_promote_next_phy()
2227 if ((pptr->portid == portid) && (pptr != prev_primary)) { in pmcs_promote_next_phy()
2228 mutex_enter(&pptr->phy_lock); in pmcs_promote_next_phy()
2233 if (pptr == NULL) { in pmcs_promote_next_phy()
2240 iport->pptr = pptr; in pmcs_promote_next_phy()
2245 pptr->children = prev_primary->children; in pmcs_promote_next_phy()
2246 child = pptr->children; in pmcs_promote_next_phy()
2248 child->parent = pptr; in pmcs_promote_next_phy()
2251 pptr->ncphy = prev_primary->ncphy; in pmcs_promote_next_phy()
2252 pptr->width = prev_primary->width; in pmcs_promote_next_phy()
2253 pptr->dtype = prev_primary->dtype; in pmcs_promote_next_phy()
2254 pptr->pend_dtype = prev_primary->pend_dtype; in pmcs_promote_next_phy()
2255 pptr->tolerates_sas2 = prev_primary->tolerates_sas2; in pmcs_promote_next_phy()
2256 pptr->atdt = prev_primary->atdt; in pmcs_promote_next_phy()
2257 pptr->portid = prev_primary->portid; in pmcs_promote_next_phy()
2258 pptr->link_rate = prev_primary->link_rate; in pmcs_promote_next_phy()
2259 pptr->configured = prev_primary->configured; in pmcs_promote_next_phy()
2260 pptr->iport = prev_primary->iport; in pmcs_promote_next_phy()
2261 pptr->target = prev_primary->target; in pmcs_promote_next_phy()
2262 if (pptr->target) { in pmcs_promote_next_phy()
2263 pptr->target->phy = pptr; in pmcs_promote_next_phy()
2268 pmcs_update_phy_pm_props(pptr, pptr->att_port_pm_tmp, in pmcs_promote_next_phy()
2269 pptr->tgt_port_pm_tmp, B_FALSE); in pmcs_promote_next_phy()
2271 pmcs_update_phy_pm_props(pptr, prev_primary->att_port_pm_tmp, in pmcs_promote_next_phy()
2274 pmcs_update_phy_pm_props(pptr, prev_primary->att_port_pm, in pmcs_promote_next_phy()
2280 pptr->subsidiary = 0; in pmcs_promote_next_phy()
2285 pptr->device_id = prev_primary->device_id; in pmcs_promote_next_phy()
2286 pptr->valid_device_id = prev_primary->valid_device_id; in pmcs_promote_next_phy()
2293 pmcs_unlock_phy(pptr); in pmcs_promote_next_phy()
2295 return (pptr); in pmcs_promote_next_phy()
2426 pmcs_phy_t *pptr; in pmcs_discover() local
2542 for (pptr = pwp->root_phys; pptr; pptr = pptr->sibling) { in pmcs_discover()
2548 pmcs_lock_phy(pptr); in pmcs_discover()
2549 pmcs_clear_expander(pwp, pptr, 0); in pmcs_discover()
2550 pmcs_unlock_phy(pptr); in pmcs_discover()
2611 pptr = pmcs_find_phy_needing_work(pwp, pwp->root_phys); in pmcs_discover()
2612 if (pptr != NULL) { in pmcs_discover()
2614 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_discover()
2616 "but no work scheduled", pptr->path, pptr->dead, in pmcs_discover()
2617 pptr->changed, pptr->configured); in pmcs_discover()
2619 pmcs_unlock_phy(pptr); in pmcs_discover()
2642 pmcs_find_phy_needing_work(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_find_phy_needing_work() argument
2646 while (pptr) { in pmcs_find_phy_needing_work()
2647 pmcs_lock_phy(pptr); in pmcs_find_phy_needing_work()
2649 if (pptr->changed || (pptr->dead && pptr->valid_device_id)) { in pmcs_find_phy_needing_work()
2650 return (pptr); in pmcs_find_phy_needing_work()
2653 pnext = pptr->sibling; in pmcs_find_phy_needing_work()
2655 if (pptr->children) { in pmcs_find_phy_needing_work()
2656 cphyp = pptr->children; in pmcs_find_phy_needing_work()
2657 pmcs_unlock_phy(pptr); in pmcs_find_phy_needing_work()
2663 pmcs_unlock_phy(pptr); in pmcs_find_phy_needing_work()
2666 pptr = pnext; in pmcs_find_phy_needing_work()
2759 pmcs_phy_t *pptr; in pmcs_report_observations() local
2766 pptr = pwp->root_phys; in pmcs_report_observations()
2768 while (pptr) { in pmcs_report_observations()
2769 pmcs_lock_phy(pptr); in pmcs_report_observations()
2774 if ((pptr->dtype == NOTHING) || pptr->dead) { in pmcs_report_observations()
2775 pmcs_unlock_phy(pptr); in pmcs_report_observations()
2776 pptr = pptr->sibling; in pmcs_report_observations()
2780 if (pptr->changed) { in pmcs_report_observations()
2781 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_report_observations()
2783 __func__, pptr->path); in pmcs_report_observations()
2784 pmcs_unlock_phy(pptr); in pmcs_report_observations()
2792 wwn = pmcs_barray2wwn(pptr->sas_address); in pmcs_report_observations()
2793 pmcs_unlock_phy(pptr); in pmcs_report_observations()
2799 pptr = pptr->sibling; in pmcs_report_observations()
2803 pmcs_lock_phy(pptr); in pmcs_report_observations()
2806 pwp, iport, pptr) == B_FALSE) { in pmcs_report_observations()
2808 pmcs_unlock_phy(pptr); in pmcs_report_observations()
2813 pmcs_unlock_phy(pptr); in pmcs_report_observations()
2814 pptr = pptr->sibling; in pmcs_report_observations()
2851 pptr = iport->pptr; in pmcs_report_observations()
2853 if (pptr == NULL) { in pmcs_report_observations()
2862 pmcs_lock_phy(pptr); in pmcs_report_observations()
2863 wwn = pmcs_barray2wwn(pptr->sas_address); in pmcs_report_observations()
2865 pmcs_unlock_phy(pptr); in pmcs_report_observations()
2981 pmcs_configure_new_devices(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_configure_new_devices() argument
2985 pmcs_phy_t *pnext, *orig_pptr = pptr, *root_phy, *pchild; in pmcs_configure_new_devices()
2991 while (pptr) { in pmcs_configure_new_devices()
2992 pmcs_lock_phy(pptr); in pmcs_configure_new_devices()
2993 pnext = pptr->sibling; in pmcs_configure_new_devices()
2998 if ((pptr->pend_dtype != NEW) && in pmcs_configure_new_devices()
2999 (pptr->pend_dtype != pptr->dtype)) { in pmcs_configure_new_devices()
3000 pptr->dtype = pptr->pend_dtype; in pmcs_configure_new_devices()
3003 if (pptr->changed == 0 || pptr->dead || pptr->configured) { in pmcs_configure_new_devices()
3008 root_phy = pmcs_get_root_phy(pptr); in pmcs_configure_new_devices()
3010 pmcs_unlock_phy(pptr); in pmcs_configure_new_devices()
3018 pmcs_lock_phy(pptr); in pmcs_configure_new_devices()
3022 pmcs_lock_phy(pptr); in pmcs_configure_new_devices()
3023 switch (pptr->dtype) { in pmcs_configure_new_devices()
3025 pptr->changed = 0; in pmcs_configure_new_devices()
3029 pptr->iport = iport; in pmcs_configure_new_devices()
3030 pmcs_new_tport(pwp, pptr); in pmcs_configure_new_devices()
3033 pmcs_configure_expander(pwp, pptr, iport); in pmcs_configure_new_devices()
3047 pmcs_unlock_phy(pptr); in pmcs_configure_new_devices()
3048 pptr = pnext; in pmcs_configure_new_devices()
3059 pptr = orig_pptr; in pmcs_configure_new_devices()
3060 while (pptr) { in pmcs_configure_new_devices()
3061 pmcs_lock_phy(pptr); in pmcs_configure_new_devices()
3062 pnext = pptr->sibling; in pmcs_configure_new_devices()
3063 pchild = pptr->children; in pmcs_configure_new_devices()
3064 pmcs_unlock_phy(pptr); in pmcs_configure_new_devices()
3073 pptr = pnext; in pmcs_configure_new_devices()
3089 pmcs_phy_t *pptr; in pmcs_set_changed() local
3105 pptr = parent; in pmcs_set_changed()
3106 while (pptr) { in pmcs_set_changed()
3108 PHY_CHANGED(pwp, pptr); in pmcs_set_changed()
3110 pptr->changed = 0; in pmcs_set_changed()
3112 if (pptr->dtype == EXPANDER && pptr->level) { in pmcs_set_changed()
3113 pptr->width = 1; in pmcs_set_changed()
3115 if (pptr->children) { in pmcs_set_changed()
3116 pmcs_set_changed(pwp, pptr->children, changed, in pmcs_set_changed()
3119 pptr = pptr->sibling; in pmcs_set_changed()
3133 pmcs_phy_t *pptr = parent; in pmcs_kill_changed() local
3135 while (pptr) { in pmcs_kill_changed()
3136 pptr->link_rate = 0; in pmcs_kill_changed()
3137 pptr->abort_sent = 0; in pmcs_kill_changed()
3138 pptr->abort_pending = 1; in pmcs_kill_changed()
3140 pptr->need_rl_ext = 0; in pmcs_kill_changed()
3142 if (pptr->dead == 0) { in pmcs_kill_changed()
3143 PHY_CHANGED(pwp, pptr); in pmcs_kill_changed()
3147 pptr->dead = 1; in pmcs_kill_changed()
3149 if (pptr->children) { in pmcs_kill_changed()
3150 pmcs_kill_changed(pwp, pptr->children, level + 1); in pmcs_kill_changed()
3160 pptr = pptr->sibling; in pmcs_kill_changed()
3168 pmcs_clear_phys(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_clear_phys() argument
3172 phyp = pptr; in pmcs_clear_phys()
3200 pmcs_clear_phy(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_clear_phy() argument
3202 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, "%s: %s", in pmcs_clear_phy()
3203 __func__, pptr->path); in pmcs_clear_phy()
3204 ASSERT(mutex_owned(&pptr->phy_lock)); in pmcs_clear_phy()
3208 pptr->device_id = PMCS_INVALID_DEVICE_ID; in pmcs_clear_phy()
3210 pptr->ncphy = 0; in pmcs_clear_phy()
3212 pptr->width = 0; in pmcs_clear_phy()
3213 pptr->ds_recovery_retries = 0; in pmcs_clear_phy()
3214 pptr->ds_prev_good_recoveries = 0; in pmcs_clear_phy()
3215 pptr->last_good_recovery = 0; in pmcs_clear_phy()
3216 pptr->prev_recovery = 0; in pmcs_clear_phy()
3219 pptr->config_stop = 0; in pmcs_clear_phy()
3220 pptr->spinup_hold = 0; in pmcs_clear_phy()
3221 pptr->atdt = 0; in pmcs_clear_phy()
3223 pptr->link_rate = 0; in pmcs_clear_phy()
3224 pptr->valid_device_id = 0; in pmcs_clear_phy()
3225 pptr->abort_sent = 0; in pmcs_clear_phy()
3226 pptr->abort_pending = 0; in pmcs_clear_phy()
3227 pptr->need_rl_ext = 0; in pmcs_clear_phy()
3228 pptr->subsidiary = 0; in pmcs_clear_phy()
3229 pptr->configured = 0; in pmcs_clear_phy()
3230 pptr->deregister_wait = 0; in pmcs_clear_phy()
3231 pptr->reenumerate = 0; in pmcs_clear_phy()
3234 if (!IS_ROOT_PHY(pptr) && (pptr->dtype != NOTHING)) in pmcs_clear_phy()
3235 pptr->dead = 1; in pmcs_clear_phy()
3236 pptr->changed = 0; in pmcs_clear_phy()
3241 if (!IS_ROOT_PHY(pptr)) { in pmcs_clear_phy()
3242 pptr->last_iport = pptr->iport; in pmcs_clear_phy()
3243 pptr->iport = NULL; in pmcs_clear_phy()
3256 pmcs_new_tport(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_new_tport() argument
3258 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, "%s: phy 0x%p @ %s", in pmcs_new_tport()
3259 __func__, (void *)pptr, pptr->path); in pmcs_new_tport()
3261 if (pmcs_configure_phy(pwp, pptr) == B_FALSE) { in pmcs_new_tport()
3265 PHY_CHANGED(pwp, pptr); in pmcs_new_tport()
3266 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_new_tport()
3268 (void *)pptr); in pmcs_new_tport()
3273 pptr->changed = 0; in pmcs_new_tport()
3284 if (pptr->target == NULL) { in pmcs_new_tport()
3285 if (IS_ROOT_PHY(pptr)) { in pmcs_new_tport()
3289 if (rphy == pptr) { in pmcs_new_tport()
3295 if ((rphy->iport == pptr->iport) && in pmcs_new_tport()
3298 pptr->target = rphy->target; in pmcs_new_tport()
3300 pptr->target->phy = pptr; in pmcs_new_tport()
3302 mutex_exit(&pptr->target->statlock); in pmcs_new_tport()
3305 pptr, pptr->target, in pmcs_new_tport()
3307 __func__, rphy->path, pptr->path); in pmcs_new_tport()
3315 pmcs_reap_dead_phy(pptr); in pmcs_new_tport()
3327 if (pptr->target) { in pmcs_new_tport()
3328 mutex_enter(&pptr->target->statlock); in pmcs_new_tport()
3329 if (pmcs_phy_target_match(pptr) == B_FALSE) { in pmcs_new_tport()
3330 mutex_exit(&pptr->target->statlock); in pmcs_new_tport()
3331 if (!IS_ROOT_PHY(pptr)) { in pmcs_new_tport()
3332 pmcs_dec_phy_ref_count(pptr); in pmcs_new_tport()
3334 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_new_tport()
3336 "(WWN mismatch)", __func__, (void *)pptr->target, in pmcs_new_tport()
3337 (void *)pptr); in pmcs_new_tport()
3338 pptr->target = NULL; in pmcs_new_tport()
3342 if (!pmcs_assign_device(pwp, pptr->target)) { in pmcs_new_tport()
3343 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, pptr->target, in pmcs_new_tport()
3345 __func__, (void *)pptr->target); in pmcs_new_tport()
3347 mutex_exit(&pptr->target->statlock); in pmcs_new_tport()
3355 pmcs_configure_phy(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_configure_phy() argument
3359 ASSERT(mutex_owned(&pptr->phy_lock)); in pmcs_configure_phy()
3364 pptr->changed = 0; in pmcs_configure_phy()
3369 if (pmcs_get_device_handle(pwp, pptr)) { in pmcs_configure_phy()
3373 pptr->configured = 1; in pmcs_configure_phy()
3375 switch (pptr->dtype) { in pmcs_configure_phy()
3389 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, "config_dev: %s " in pmcs_configure_phy()
3390 "dev %s " SAS_ADDR_FMT " dev id 0x%x lr 0x%x", dtype, pptr->path, in pmcs_configure_phy()
3391 SAS_ADDR_PRT(pptr->sas_address), pptr->device_id, pptr->link_rate); in pmcs_configure_phy()
3400 pmcs_configure_expander(pmcs_hw_t *pwp, pmcs_phy_t *pptr, pmcs_iport_t *iport) in pmcs_configure_expander() argument
3415 if (IS_ROOT_PHY(pptr) && pptr->changed) { in pmcs_configure_expander()
3416 pptr->config_stop = ddi_get_lbolt() + in pmcs_configure_expander()
3419 pptr->changed = 0; in pmcs_configure_expander()
3424 if (pptr->level == PMCS_MAX_XPND-1) { in pmcs_configure_expander()
3425 pmcs_prt(pwp, PMCS_PRT_WARN, pptr, NULL, in pmcs_configure_expander()
3439 if (!IS_ROOT_PHY(pptr)) { in pmcs_configure_expander()
3447 ctmp = pptr->parent->children; in pmcs_configure_expander()
3461 if (ctmp == pptr) { in pmcs_configure_expander()
3477 memcmp(ctmp->sas_address, pptr->sas_address, 8) == 0) { in pmcs_configure_expander()
3485 pptr->parent->sas_address, 8) == 0) { in pmcs_configure_expander()
3493 pptr->subsidiary = 1; in pmcs_configure_expander()
3501 pptr->att_port_pm_tmp, in pmcs_configure_expander()
3502 pptr->tgt_port_pm_tmp, B_TRUE); in pmcs_configure_expander()
3504 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_configure_expander()
3506 "(now %d wide)", __func__, pptr->path, in pmcs_configure_expander()
3526 pptr->subsidiary = 0; in pmcs_configure_expander()
3527 pptr->iport = iport; in pmcs_configure_expander()
3528 if (pmcs_get_device_handle(pwp, pptr)) { in pmcs_configure_expander()
3531 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, "Config expander %s " in pmcs_configure_expander()
3532 SAS_ADDR_FMT " dev id 0x%x lr 0x%x", pptr->path, in pmcs_configure_expander()
3533 SAS_ADDR_PRT(pptr->sas_address), pptr->device_id, pptr->link_rate); in pmcs_configure_expander()
3538 nphy = pmcs_expander_get_nphy(pwp, pptr); in pmcs_configure_expander()
3540 if (nphy == 0 && ddi_get_lbolt() < pptr->config_stop) { in pmcs_configure_expander()
3541 PHY_CHANGED(pwp, pptr); in pmcs_configure_expander()
3544 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_configure_expander()
3546 pptr->path); in pmcs_configure_expander()
3547 pptr->config_stop = 0; in pmcs_configure_expander()
3548 pmcs_kill_changed(pwp, pptr, 0); in pmcs_configure_expander()
3589 ctmp->parent = pptr; in pmcs_configure_expander()
3591 ctmp->level = pptr->level+1; in pmcs_configure_expander()
3592 ctmp->portid = pptr->portid; in pmcs_configure_expander()
3608 result = pmcs_expander_content_discover(pwp, pptr, ctmp); in pmcs_configure_expander()
3610 if (ddi_get_lbolt() < pptr->config_stop) { in pmcs_configure_expander()
3611 PHY_CHANGED(pwp, pptr); in pmcs_configure_expander()
3614 pptr->config_stop = 0; in pmcs_configure_expander()
3615 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_configure_expander()
3617 __func__, pptr->path); in pmcs_configure_expander()
3618 pmcs_kill_changed(pwp, pptr, 0); in pmcs_configure_expander()
3636 if (pptr->children != NULL) { in pmcs_configure_expander()
3637 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_configure_expander()
3639 __func__, pptr->path); in pmcs_configure_expander()
3640 pmcs_add_dead_phys(pwp, pptr->children); in pmcs_configure_expander()
3646 pptr->children = clist; in pmcs_configure_expander()
3648 pptr->ncphy = nphy; in pmcs_configure_expander()
3649 pptr->configured = 1; in pmcs_configure_expander()
3654 if (pptr->level) { in pmcs_configure_expander()
3655 pptr->width = 1; in pmcs_configure_expander()
3661 pptr->iport = iport; in pmcs_configure_expander()
3662 pmcs_new_tport(pwp, pptr); in pmcs_configure_expander()
3689 pmcs_check_expander(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_check_expander() argument
3695 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_check_expander()
3696 "%s: check %s", __func__, pptr->path); in pmcs_check_expander()
3702 pptr->changed = 0; in pmcs_check_expander()
3709 pptr->config_stop = ddi_get_lbolt() + in pmcs_check_expander()
3718 nphy = pmcs_expander_get_nphy(pwp, pptr); in pmcs_check_expander()
3720 if ((nphy == 0) && (ddi_get_lbolt() < pptr->config_stop)) { in pmcs_check_expander()
3721 PHY_CHANGED(pwp, pptr); in pmcs_check_expander()
3724 pptr->config_stop = 0; in pmcs_check_expander()
3725 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_check_expander()
3727 pptr->path); in pmcs_check_expander()
3728 pmcs_kill_changed(pwp, pptr, 0); in pmcs_check_expander()
3736 if (nphy != pptr->ncphy) { in pmcs_check_expander()
3737 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_check_expander()
3739 __func__, pptr->path, pptr->ncphy, nphy); in pmcs_check_expander()
3744 pmcs_kill_changed(pwp, pptr, 0); in pmcs_check_expander()
3752 if (pptr->level == PMCS_MAX_XPND-1) { in pmcs_check_expander()
3761 ctmp = pptr->children; in pmcs_check_expander()
3764 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_check_expander()
3766 pptr->path); in pmcs_check_expander()
3792 result = pmcs_expander_content_discover(pwp, pptr, local); in pmcs_check_expander()
3795 if (ddi_get_lbolt() < pptr->config_stop) { in pmcs_check_expander()
3796 PHY_CHANGED(pwp, pptr); in pmcs_check_expander()
3799 pptr->config_stop = 0; in pmcs_check_expander()
3800 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_check_expander()
3802 __func__, pptr->path); in pmcs_check_expander()
3803 pmcs_kill_changed(pwp, pptr, 0); in pmcs_check_expander()
3829 ctmp = pptr->children; in pmcs_check_expander()
4007 pmcs_check_expanders(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_check_expanders() argument
4011 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_check_expanders()
4012 "%s: %s", __func__, pptr->path); in pmcs_check_expanders()
4017 phyp = pptr; in pmcs_check_expanders()
4035 phyp = pptr; in pmcs_check_expanders()
4054 pmcs_clear_expander(pmcs_hw_t *pwp, pmcs_phy_t *pptr, int level) in pmcs_clear_expander() argument
4059 ASSERT(mutex_owned(&pptr->phy_lock)); in pmcs_clear_expander()
4060 ASSERT(pptr->level < PMCS_MAX_XPND - 1); in pmcs_clear_expander()
4062 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_clear_expander()
4063 "%s: checking %s", __func__, pptr->path); in pmcs_clear_expander()
4065 ctmp = pptr->children; in pmcs_clear_expander()
4070 if (pptr->dead) { in pmcs_clear_expander()
4082 if (!pptr->dead) { in pmcs_clear_expander()
4089 if (pptr->children) { in pmcs_clear_expander()
4090 pmcs_add_dead_phys(pwp, pptr->children); in pmcs_clear_expander()
4093 pptr->children = NULL; in pmcs_clear_expander()
4100 if (!IS_ROOT_PHY(pptr)) { in pmcs_clear_expander()
4102 mutex_enter(&pptr->parent->phy_lock); in pmcs_clear_expander()
4104 ctmp = pptr->parent->children; in pmcs_clear_expander()
4106 mutex_exit(&pptr->parent->phy_lock); in pmcs_clear_expander()
4113 if (ctmp == pptr) { in pmcs_clear_expander()
4126 memcmp(ctmp->sas_address, pptr->sas_address, in pmcs_clear_expander()
4143 pmcs_clear_phy(pwp, pptr); in pmcs_clear_expander()
4156 pmcs_expander_get_nphy(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_expander_get_nphy() argument
4170 if (!pptr->iport || !pptr->valid_device_id) { in pmcs_expander_get_nphy()
4171 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, pptr->target, in pmcs_expander_get_nphy()
4172 "%s: Can't reach PHY %s", __func__, pptr->path); in pmcs_expander_get_nphy()
4176 pwrk = pmcs_gwork(pwp, PMCS_TAG_TYPE_WAIT, pptr); in pmcs_expander_get_nphy()
4182 pwrk->dtype = pptr->dtype; in pmcs_expander_get_nphy()
4183 pwrk->xp = pptr->target; in pmcs_expander_get_nphy()
4189 pmcs_prt(pwp, PMCS_PRT_DEBUG2, pptr, NULL, in pmcs_expander_get_nphy()
4197 msg[2] = LE_32(pptr->device_id); in pmcs_expander_get_nphy()
4217 pmcs_hold_iport(pptr->iport); in pmcs_expander_get_nphy()
4218 iport = pptr->iport; in pmcs_expander_get_nphy()
4223 pmcs_unlock_phy(pptr); in pmcs_expander_get_nphy()
4228 pmcs_lock_phy(pptr); in pmcs_expander_get_nphy()
4231 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_expander_get_nphy()
4233 if (pmcs_abort(pwp, pptr, htag, 0, 1)) { in pmcs_expander_get_nphy()
4234 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_expander_get_nphy()
4255 pmcs_prt(pwp, PMCS_PRT_DEBUG_UNDERFLOW, pptr, NULL, in pmcs_expander_get_nphy()
4291 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_expander_get_nphy()
4293 __func__, pptr->path, nag); in pmcs_expander_get_nphy()
4302 pmcs_xscsi_t *xp = pptr->target; in pmcs_expander_get_nphy()
4304 pmcs_prt(pwp, PMCS_PRT_DEBUG_DEV_STATE, pptr, xp, in pmcs_expander_get_nphy()
4306 __func__, pptr->path); in pmcs_expander_get_nphy()
4317 pmcs_start_dev_state_recovery(xp, pptr); in pmcs_expander_get_nphy()
4330 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_expander_get_nphy()
4335 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_expander_get_nphy()
4347 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_expander_get_nphy()
4352 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_expander_get_nphy()
4356 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_expander_get_nphy()
4358 __func__, pptr->path); in pmcs_expander_get_nphy()
4363 pptr->tolerates_sas2 = 1; in pmcs_expander_get_nphy()
4368 bcopy(srgr, &pptr->rg_resp, sizeof (smp_report_general_resp_t)); in pmcs_expander_get_nphy()
4369 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_expander_get_nphy()
4370 "%s has %d phys and %s SAS2", pptr->path, result, in pmcs_expander_get_nphy()
4371 pptr->tolerates_sas2? "tolerates" : "does not tolerate"); in pmcs_expander_get_nphy()
4387 pmcs_phy_t *pptr) in pmcs_expander_content_discover() argument
4432 msg[6] = BE_32((pptr->phynum << 16)); in pmcs_expander_content_discover()
4464 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_expander_content_discover()
4466 if (pmcs_abort(pwp, pptr, htag, 0, 1)) { in pmcs_expander_content_discover()
4467 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_expander_content_discover()
4495 pmcs_prt(pwp, PMCS_PRT_DEBUG_UNDERFLOW, pptr, NULL, in pmcs_expander_content_discover()
4524 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_expander_content_discover()
4526 __func__, pptr->path, nag); in pmcs_expander_content_discover()
4535 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_expander_content_discover()
4541 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_expander_content_discover()
4558 bcopy(sdr, &pptr->disc_resp, sizeof (smp_discover_resp_t)); in pmcs_expander_content_discover()
4573 pptr->virtual = sdr->sdr_virtual_phy; in pmcs_expander_content_discover()
4578 pptr->routing_attr = sdr->sdr_routing_attr; in pmcs_expander_content_discover()
4582 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_expander_content_discover()
4585 pptr->path, in pmcs_expander_content_discover()
4596 pptr->dtype = SATA; in pmcs_expander_content_discover()
4598 pptr->dtype = SAS; in pmcs_expander_content_discover()
4600 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_expander_content_discover()
4602 __func__, pptr->path, tgt_support, ini_support); in pmcs_expander_content_discover()
4605 switch (pptr->routing_attr) { in pmcs_expander_content_discover()
4609 pptr->routing_method = SMP_ROUTING_DIRECT; in pmcs_expander_content_discover()
4612 pptr->routing_method = 0xff; /* Invalid method */ in pmcs_expander_content_discover()
4615 pmcs_update_phy_pm_props(pptr, (1ULL << pptr->phynum), in pmcs_expander_content_discover()
4620 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_expander_content_discover()
4623 pptr->path, in pmcs_expander_content_discover()
4640 pmcs_prt(pwp, PMCS_PRT_DEBUG3, pptr, NULL, in pmcs_expander_content_discover()
4642 "expander (%s)", __func__, pptr->path); in pmcs_expander_content_discover()
4643 pptr->dtype = NOTHING; in pmcs_expander_content_discover()
4646 pptr->dtype = EXPANDER; in pmcs_expander_content_discover()
4649 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_expander_content_discover()
4651 pptr->path, tgt_support, ini_support); in pmcs_expander_content_discover()
4652 pptr->dtype = EXPANDER; in pmcs_expander_content_discover()
4654 if (pptr->routing_attr == SMP_ROUTING_DIRECT) { in pmcs_expander_content_discover()
4655 pptr->routing_method = 0xff; /* Invalid method */ in pmcs_expander_content_discover()
4657 pptr->routing_method = pptr->routing_attr; in pmcs_expander_content_discover()
4659 pmcs_update_phy_pm_props(pptr, (1ULL << pptr->phynum), in pmcs_expander_content_discover()
4663 pptr->dtype = NOTHING; in pmcs_expander_content_discover()
4666 if (pptr->dtype != NOTHING) { in pmcs_expander_content_discover()
4675 if (expander->tolerates_sas2 && pptr->dtype == SATA && in pmcs_expander_content_discover()
4677 (void) memcpy(pptr->sas_address, in pmcs_expander_content_discover()
4680 (void) memcpy(pptr->sas_address, att_sas_address, 8); in pmcs_expander_content_discover()
4682 pptr->atdt = (sdr->sdr_attached_device_type); in pmcs_expander_content_discover()
4690 pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, in pmcs_expander_content_discover()
4692 "to %s being slower", pptr->path, in pmcs_expander_content_discover()
4700 pptr->link_rate = sdr->sdr_negotiated_logical_link_rate; in pmcs_expander_content_discover()
4701 pptr->state.prog_min_rate = sdr->sdr_prog_min_phys_link_rate; in pmcs_expander_content_discover()
4702 pptr->state.hw_min_rate = sdr->sdr_hw_min_phys_link_rate; in pmcs_expander_content_discover()
4703 pptr->state.prog_max_rate = sdr->sdr_prog_max_phys_link_rate; in pmcs_expander_content_discover()
4704 pptr->state.hw_max_rate = sdr->sdr_hw_max_phys_link_rate; in pmcs_expander_content_discover()
4705 PHY_CHANGED(pwp, pptr); in pmcs_expander_content_discover()
4707 pmcs_clear_phy(pwp, pptr); in pmcs_expander_content_discover()
4875 pmcs_abort(pmcs_hw_t *pwp, pmcs_phy_t *pptr, uint32_t tag, int all_cmds, in pmcs_abort() argument
4884 if (pptr->abort_all_start) { in pmcs_abort()
4885 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, "%s: ABORT_ALL for " in pmcs_abort()
4886 "(%s) already in progress.", __func__, pptr->path); in pmcs_abort()
4890 switch (pptr->dtype) { in pmcs_abort()
4905 pptr); in pmcs_abort()
4908 pmcs_prt(pwp, PMCS_PRT_ERR, pptr, NULL, pmcs_nowrk, __func__); in pmcs_abort()
4912 pwrk->dtype = pptr->dtype; in pmcs_abort()
4913 pwrk->xp = pptr->target; in pmcs_abort()
4918 if (pptr->valid_device_id == 0) { in pmcs_abort()
4920 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_abort()
4926 msg[2] = LE_32(pptr->device_id); in pmcs_abort()
4932 pptr->abort_all_start = gethrtime(); in pmcs_abort()
4943 pptr->abort_all_start = 0; in pmcs_abort()
4944 pmcs_prt(pwp, PMCS_PRT_ERR, pptr, NULL, pmcs_nomsg, __func__); in pmcs_abort()
4950 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_abort()
4952 __func__, pmcs_get_typename(pptr->dtype), pptr->path, in pmcs_abort()
4955 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_abort()
4957 __func__, tag, pmcs_get_typename(pptr->dtype), pptr->path, in pmcs_abort()
4969 pmcs_unlock_phy(pptr); in pmcs_abort()
4972 pmcs_lock_phy(pptr); in pmcs_abort()
4973 tgt = pptr->target; in pmcs_abort()
4976 pptr->abort_all_start = 0; in pmcs_abort()
4977 cv_signal(&pptr->abort_all_cv); in pmcs_abort()
4982 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, tgt, in pmcs_abort()
4985 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, tgt, in pmcs_abort()
4994 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, tgt, in pmcs_abort()
4998 PMCS_DEVICE_STATE_IN_RECOVERY, pptr, tgt); in pmcs_abort()
5019 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, tgt, in pmcs_abort()
5022 PHY_CHANGED(pwp, pptr); in pmcs_abort()
5034 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, tgt, in pmcs_abort()
5038 PMCS_DEVICE_STATE_OPERATIONAL, pptr, tgt); in pmcs_abort()
5053 pmcs_ssp_tmf(pmcs_hw_t *pwp, pmcs_phy_t *pptr, uint8_t tmf, uint32_t tag, in pmcs_ssp_tmf() argument
5066 pwrk = pmcs_gwork(pwp, PMCS_TAG_TYPE_WAIT, pptr); in pmcs_ssp_tmf()
5068 pmcs_prt(pwp, PMCS_PRT_ERR, pptr, NULL, pmcs_nowrk, __func__); in pmcs_ssp_tmf()
5080 msg[2] = LE_32(pptr->device_id); in pmcs_ssp_tmf()
5096 pmcs_prt(pwp, PMCS_PRT_ERR, pptr, NULL, pmcs_nomsg, __func__); in pmcs_ssp_tmf()
5101 pwrk->dtype = pptr->dtype; in pmcs_ssp_tmf()
5102 xp = pptr->target; in pmcs_ssp_tmf()
5111 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, "%s: Not " in pmcs_ssp_tmf()
5120 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5122 pmcs_tmf2str(tmf), pptr->path, (unsigned long long) lun, tag); in pmcs_ssp_tmf()
5126 pmcs_unlock_phy(pptr); in pmcs_ssp_tmf()
5134 pmcs_lock_phy(pptr); in pmcs_ssp_tmf()
5135 xp = pptr->target; in pmcs_ssp_tmf()
5143 pmcs_start_dev_state_recovery(xp, pptr); in pmcs_ssp_tmf()
5150 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5153 pptr->path, (unsigned long long) lun); in pmcs_ssp_tmf()
5172 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5178 pptr, xp); in pmcs_ssp_tmf()
5188 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5194 pptr, xp); in pmcs_ssp_tmf()
5200 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5208 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5231 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5236 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5241 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5246 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5251 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5256 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5261 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5267 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, in pmcs_ssp_tmf()
5279 pmcs_sata_abort_ncq(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_sata_abort_ncq() argument
5289 pwrk = pmcs_gwork(pwp, PMCS_TAG_TYPE_WAIT, pptr); in pmcs_sata_abort_ncq()
5297 msg[2] = LE_32(pptr->device_id); in pmcs_sata_abort_ncq()
5312 pwrk->dtype = pptr->dtype; in pmcs_sata_abort_ncq()
5313 pwrk->xp = pptr->target; in pmcs_sata_abort_ncq()
5326 pmcs_unlock_phy(pptr); in pmcs_sata_abort_ncq()
5329 pmcs_lock_phy(pptr); in pmcs_sata_abort_ncq()
5331 tgt = pptr->target; in pmcs_sata_abort_ncq()
5333 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, tgt, pmcs_timeo, __func__); in pmcs_sata_abort_ncq()
5339 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, tgt, in pmcs_sata_abort_ncq()
5341 "dev state recovery", __func__, (void *)pptr); in pmcs_sata_abort_ncq()
5356 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, tgt, "%s: Trying " in pmcs_sata_abort_ncq()
5359 (void) pmcs_send_err_recovery_cmd(pwp, ds, pptr, tgt); in pmcs_sata_abort_ncq()
5371 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, tgt, in pmcs_sata_abort_ncq()
5374 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, tgt, in pmcs_sata_abort_ncq()
5378 pptr->need_rl_ext = 0; in pmcs_sata_abort_ncq()
5707 pmcs_phy_name(pmcs_hw_t *pwp, pmcs_phy_t *pptr, char *obuf, size_t olen) in pmcs_phy_name() argument
5709 if (pptr->parent) { in pmcs_phy_name()
5710 pmcs_phy_name(pwp, pptr->parent, obuf, olen); in pmcs_phy_name()
5711 (void) snprintf(obuf, olen, "%s.%02x", obuf, pptr->phynum); in pmcs_phy_name()
5713 (void) snprintf(obuf, olen, "pp%02x", pptr->phynum); in pmcs_phy_name()
5724 pmcs_phy_t *pptr, *pchild; in pmcs_validate_devid() local
5727 pptr = parent; in pmcs_validate_devid()
5729 while (pptr) { in pmcs_validate_devid()
5730 if (pptr->valid_device_id && (pptr != phyp) && in pmcs_validate_devid()
5731 (pptr->device_id == device_id)) { in pmcs_validate_devid()
5740 if ((phyp->parent == pptr->parent) && in pmcs_validate_devid()
5742 pptr->sas_address, 8) == 0) && (phyp->width > 1)) { in pmcs_validate_devid()
5747 pmcs_lock_phy(pptr); in pmcs_validate_devid()
5748 phyp->children = pptr->children; in pmcs_validate_devid()
5755 phyp->ncphy = pptr->ncphy; in pmcs_validate_devid()
5760 pptr->children = NULL; in pmcs_validate_devid()
5761 pptr->subsidiary = 1; in pmcs_validate_devid()
5762 pptr->ncphy = 0; in pmcs_validate_devid()
5763 pmcs_unlock_phy(pptr); in pmcs_validate_devid()
5764 pmcs_prt(pptr->pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_validate_devid()
5766 __func__, device_id, pptr->path, in pmcs_validate_devid()
5770 pmcs_prt(pptr->pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_validate_devid()
5773 pptr->path, device_id); in pmcs_validate_devid()
5777 if (pptr->children) { in pmcs_validate_devid()
5778 rval = pmcs_validate_devid(pptr->children, phyp, in pmcs_validate_devid()
5785 pptr = pptr->sibling; in pmcs_validate_devid()
5842 pmcs_phy_t *pptr, *matched_phy; in pmcs_find_phy_by_wwn() local
5846 pptr = pwp->root_phys; in pmcs_find_phy_by_wwn()
5847 while (pptr) { in pmcs_find_phy_by_wwn()
5848 matched_phy = pmcs_find_phy_by_wwn_impl(pptr, ebstr); in pmcs_find_phy_by_wwn()
5854 pptr = pptr->sibling; in pmcs_find_phy_by_wwn()
5874 pmcs_phy_t *pptr, *pnext, *pchild; in pmcs_find_phy_by_sas_address() local
5877 pptr = pwp->root_phys; in pmcs_find_phy_by_sas_address()
5879 pptr = root; in pmcs_find_phy_by_sas_address()
5882 while (pptr) { in pmcs_find_phy_by_sas_address()
5883 pmcs_lock_phy(pptr); in pmcs_find_phy_by_sas_address()
5888 if ((pptr->dead) || (!pptr->valid_device_id)) { in pmcs_find_phy_by_sas_address()
5892 if (pptr->iport != iport) { in pmcs_find_phy_by_sas_address()
5896 wwn = pmcs_barray2wwn(pptr->sas_address); in pmcs_find_phy_by_sas_address()
5899 return (pptr); in pmcs_find_phy_by_sas_address()
5902 if (pptr->children) { in pmcs_find_phy_by_sas_address()
5903 pchild = pptr->children; in pmcs_find_phy_by_sas_address()
5904 pmcs_unlock_phy(pptr); in pmcs_find_phy_by_sas_address()
5910 pmcs_lock_phy(pptr); in pmcs_find_phy_by_sas_address()
5914 pnext = pptr->sibling; in pmcs_find_phy_by_sas_address()
5915 pmcs_unlock_phy(pptr); in pmcs_find_phy_by_sas_address()
5916 pptr = pnext; in pmcs_find_phy_by_sas_address()
6110 pmcs_kill_device(pmcs_hw_t *pwp, pmcs_phy_t *pptr) in pmcs_kill_device() argument
6114 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, "kill %s device @ %s", in pmcs_kill_device()
6115 pmcs_get_typename(pptr->dtype), pptr->path); in pmcs_kill_device()
6124 if (pptr->abort_all_start) { in pmcs_kill_device()
6125 while (pptr->abort_all_start) { in pmcs_kill_device()
6126 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_kill_device()
6128 __func__, (void *)pptr); in pmcs_kill_device()
6129 cv_wait(&pptr->abort_all_cv, &pptr->phy_lock); in pmcs_kill_device()
6131 } else if (pptr->abort_pending) { in pmcs_kill_device()
6132 rval = pmcs_abort(pwp, pptr, pptr->device_id, 1, 1); in pmcs_kill_device()
6134 pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, in pmcs_kill_device()
6136 "PHY 0x%p", __func__, rval, (void *)pptr); in pmcs_kill_device()
6139 pptr->abort_pending = 0; in pmcs_kill_device()
6142 if (pptr->valid_device_id) { in pmcs_kill_device()
6143 pmcs_deregister_device(pwp, pptr); in pmcs_kill_device()
6146 PHY_CHANGED(pwp, pptr); in pmcs_kill_device()
6148 pptr->valid_device_id = 0; in pmcs_kill_device()
6161 pmcs_phy_t *pptr; in pmcs_ack_events() local
6163 for (pptr = pwp->root_phys; pptr; pptr = pptr->sibling) { in pmcs_ack_events()
6164 pmcs_lock_phy(pptr); in pmcs_ack_events()
6165 if (pptr->hw_event_ack == 0) { in pmcs_ack_events()
6166 pmcs_unlock_phy(pptr); in pmcs_ack_events()
6175 pmcs_unlock_phy(pptr); in pmcs_ack_events()
6183 msg[2] = LE_32(pptr->hw_event_ack); in pmcs_ack_events()
6186 pwrk->dtype = pptr->dtype; in pmcs_ack_events()
6187 pptr->hw_event_ack = 0; in pmcs_ack_events()
6190 pmcs_unlock_phy(pptr); in pmcs_ack_events()
7125 pmcs_phy_t *pptr = NULL; in pmcs_complete_work_impl() local
7145 pptr = pwrk->phy; in pmcs_complete_work_impl()
7149 if ((pwrk->abt_htag == PMCS_ABT_HTAG_ALL) && (pptr != NULL)) { in pmcs_complete_work_impl()
7150 mutex_enter(&pptr->phy_lock); in pmcs_complete_work_impl()
7151 if (pptr->abort_all_start) { in pmcs_complete_work_impl()
7152 pptr->abort_all_start = 0; in pmcs_complete_work_impl()
7153 cv_signal(&pptr->abort_all_cv); in pmcs_complete_work_impl()
7155 mutex_exit(&pptr->phy_lock); in pmcs_complete_work_impl()
7921 pmcs_phy_t *pptr, *next_pptr; in pmcs_remove_phy_from_iport() local
7929 for (pptr = list_head(&iport->phys); pptr != NULL; in pmcs_remove_phy_from_iport()
7930 pptr = next_pptr) { in pmcs_remove_phy_from_iport()
7931 next_pptr = list_next(&iport->phys, pptr); in pmcs_remove_phy_from_iport()
7932 mutex_enter(&pptr->phy_lock); in pmcs_remove_phy_from_iport()
7933 if (pptr->phy_stats != NULL) { in pmcs_remove_phy_from_iport()
7934 kstat_delete(pptr->phy_stats); in pmcs_remove_phy_from_iport()
7935 pptr->phy_stats = NULL; in pmcs_remove_phy_from_iport()
7937 pptr->iport = NULL; in pmcs_remove_phy_from_iport()
7938 pmcs_update_phy_pm_props(pptr, pptr->att_port_pm_tmp, in pmcs_remove_phy_from_iport()
7939 pptr->tgt_port_pm_tmp, B_FALSE); in pmcs_remove_phy_from_iport()
7940 mutex_exit(&pptr->phy_lock); in pmcs_remove_phy_from_iport()
7942 list_remove(&iport->phys, pptr); in pmcs_remove_phy_from_iport()
8141 pmcs_phy_t *pptr; in pmcs_deregister_device_work() local
8143 for (pptr = pwp->root_phys; pptr; pptr = pptr->sibling) { in pmcs_deregister_device_work()
8144 pmcs_lock_phy(pptr); in pmcs_deregister_device_work()
8145 if (pptr->deregister_wait) { in pmcs_deregister_device_work()
8146 pmcs_deregister_device(pwp, pptr); in pmcs_deregister_device_work()
8148 pmcs_unlock_phy(pptr); in pmcs_deregister_device_work()