1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 #pragma ident   "%Z%%M% %I%     %E% SMI"
  28 
  29 /*
  30  * s1394_dev_disc.c
  31  *    1394 Services Layer Device Discovery Routines
  32  *    This file contains the bus reset thread code, bus manager routines and
  33  *    various routines that are used to implement remote Config ROM reading.
  34  *
  35  *    FUTURE:
  36  *    Rescan the bus if invalid nodes are seen.
  37  *    Investigate taskq for reading phase2 config rom reads.
  38  *    If we are reading the entire bus info blk, we should attempt
  39  *    a block read and fallback to quad reads if this fails.
  40  */
  41 
  42 #include <sys/conf.h>
  43 #include <sys/sysmacros.h>
  44 #include <sys/ddi.h>
  45 #include <sys/sunddi.h>
  46 #include <sys/cmn_err.h>
  47 #include <sys/sunndi.h>
  48 #include <sys/modctl.h>
  49 #include <sys/ddi_impldefs.h>
  50 #include <sys/types.h>
  51 #include <sys/kmem.h>
  52 #include <sys/kstat.h>
  53 #include <sys/varargs.h>
  54 
  55 #include <sys/tnf_probe.h>
  56 
  57 #include <sys/1394/t1394.h>
  58 #include <sys/1394/s1394.h>
  59 #include <sys/1394/h1394.h>
  60 #include <sys/1394/ieee1394.h>
  61 #include <sys/1394/ieee1212.h>
  62 
  63 /* hcmd_ret_t */
  64 typedef enum {
  65         S1394_HCMD_INVALID,
  66         S1394_HCMD_NODE_DONE,
  67         S1394_HCMD_NODE_EXPECT_MORE,
  68         S1394_HCMD_LOCK_FAILED
  69 } hcmd_ret_t;
  70 
  71 #define QUAD_TO_CFGROM_ADDR(b, n, q, addr) {                    \
  72         uint64_t bl = (b);                                      \
  73         uint64_t nl = (n);                                      \
  74         addr = ((bl) << IEEE1394_ADDR_BUS_ID_SHIFT) |             \
  75                 ((nl) << IEEE1394_ADDR_PHY_ID_SHIFT);             \
  76         addr += IEEE1394_CONFIG_ROM_ADDR + ((q) << 2);            \
  77 }
  78 
  79 #define CFGROM_READ_PAUSE(d)                                            \
  80         ((s1394_cfgrom_read_delay_ms == 0) ? (void) 0 :                 \
  81         delay(drv_usectohz((d) * 1000)))
  82 
  83 #define BUMP_CFGROM_READ_DELAY(n)                                       \
  84         (n)->cfgrom_read_delay += s1394_cfgrom_read_delay_incr
  85 
  86 #define CFGROM_GET_READ_DELAY(n, d)                                     \
  87         ((d) = (n)->cfgrom_read_delay)
  88 
  89 #define SETUP_QUAD_READ(n, reset_fails, quadlet, cnt)                   \
  90 {                                                                       \
  91         int i = (reset_fails);                                          \
  92         if (i != 0) {                                                   \
  93                 (n)->cfgrom_read_fails = 0;                          \
  94                 (n)->cfgrom_read_delay = (uchar_t)s1394_cfgrom_read_delay_ms; \
  95         }                                                               \
  96         (n)->cfgrom_quad_to_read = (quadlet);                                \
  97         (n)->cfgrom_quad_read_cnt = (cnt);                           \
  98 }
  99 
 100 static void s1394_wait_for_events(s1394_hal_t *hal, int firsttime);
 101 
 102 static int s1394_wait_for_cfgrom_callbacks(s1394_hal_t *hal, uint_t wait_gen,
 103     hcmd_ret_t(*handle_cmd_fn)(s1394_hal_t *hal, cmd1394_cmd_t *cmd));
 104 
 105 static void s1394_flush_cmplq(s1394_hal_t *hal);
 106 
 107 static void s1394_br_thread_exit(s1394_hal_t *hal);
 108 
 109 static void s1394_target_bus_reset_notifies(s1394_hal_t *hal,
 110     t1394_localinfo_t *localinfo);
 111 
 112 static int s1394_alloc_cfgrom(s1394_hal_t *hal, s1394_node_t *node,
 113     s1394_status_t *status);
 114 
 115 static int s1394_cfgrom_scan_phase1(s1394_hal_t *hal);
 116 
 117 static hcmd_ret_t s1394_br_thread_handle_cmd_phase1(s1394_hal_t *hal,
 118     cmd1394_cmd_t *cmd);
 119 
 120 static int s1394_cfgrom_scan_phase2(s1394_hal_t *hal);
 121 
 122 static hcmd_ret_t s1394_br_thread_handle_cmd_phase2(s1394_hal_t *hal,
 123     cmd1394_cmd_t *cmd);
 124 
 125 static int s1394_read_config_quadlet(s1394_hal_t *hal, cmd1394_cmd_t *cmd,
 126     s1394_status_t *status);
 127 
 128 static void s1394_cfgrom_read_callback(cmd1394_cmd_t *cmd);
 129 
 130 static void s1394_get_quad_info(cmd1394_cmd_t *cmd, uint32_t *node_num,
 131     uint32_t *quadlet, uint32_t *data);
 132 
 133 static int s1394_match_GUID(s1394_hal_t *hal, s1394_node_t *nnode);
 134 
 135 static int s1394_match_all_GUIDs(s1394_hal_t *hal);
 136 
 137 static void s1394_become_bus_mgr(void *arg);
 138 
 139 static void s1394_become_bus_mgr_callback(cmd1394_cmd_t *cmd);
 140 
 141 static int s1394_bus_mgr_processing(s1394_hal_t *hal);
 142 
 143 static int s1394_do_bus_mgr_processing(s1394_hal_t *hal);
 144 
 145 static void s1394_bus_mgr_timers_stop(s1394_hal_t *hal,
 146     timeout_id_t *bus_mgr_query_tid, timeout_id_t *bus_mgr_tid);
 147 
 148 static void s1394_bus_mgr_timers_start(s1394_hal_t *hal,
 149     timeout_id_t *bus_mgr_query_tid, timeout_id_t *bus_mgr_tid);
 150 
 151 static int s1394_cycle_master_capable(s1394_hal_t *hal);
 152 
 153 static int s1394_do_phy_config_pkt(s1394_hal_t *hal, int new_root,
 154     int new_gap_cnt, uint32_t IRM_flags);
 155 
 156 static void s1394_phy_config_callback(cmd1394_cmd_t *cmd);
 157 
 158 static int s1394_calc_next_quad(s1394_hal_t *hal, s1394_node_t *node,
 159     uint32_t quadlet, uint32_t *nextquadp);
 160 
 161 static int s1394_cfgrom_read_retry_cnt = 3;     /* 1 + 3 retries */
 162 static int s1394_cfgrom_read_delay_ms = 20;     /* start with 20ms */
 163 static int s1394_cfgrom_read_delay_incr = 10;   /* 10ms increments */
 164 static int s1394_enable_crc_validation = 0;
 165 static int s1394_turn_off_dir_stack = 0;
 166 static int s1394_crcsz_is_cfgsz = 0;
 167 static int s1394_enable_rio_pass1_workarounds = 0;
 168 
 169 /*
 170  * s1394_br_thread()
 171  *    is the bus reset thread. Its sole purpose is to read/reread config roms
 172  *    as appropriate and do bus reset time things (bus manager processing,
 173  *    isoch resource reallocation etc.).
 174  */
 175 void
 176 s1394_br_thread(s1394_hal_t *hal)
 177 {
 178         TNF_PROBE_0_DEBUG(s1394_br_thread_enter, S1394_TNF_SL_HOTPLUG_STACK,
 179             "");
 180 
 181         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 182 
 183         /* Initialize the Bus Mgr timers */
 184         hal->bus_mgr_timeout_id = 0;
 185         hal->bus_mgr_query_timeout_id = 0;
 186 
 187         /* Initialize the cmpletion Q */
 188         mutex_enter(&hal->br_cmplq_mutex);
 189         hal->br_cmplq_head = hal->br_cmplq_tail = NULL;
 190         mutex_exit(&hal->br_cmplq_mutex);
 191 
 192         s1394_wait_for_events(hal, 1);
 193 
 194         for (;;) {
 195                 ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 196 
 197                 TNF_PROBE_0_DEBUG(s1394_br_thread_wait,
 198                     S1394_TNF_SL_HOTPLUG_STACK, "");
 199 
 200                 s1394_wait_for_events(hal, 0);
 201 
 202                 ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 203 
 204                 TNF_PROBE_1_DEBUG(s1394_br_thread_restart,
 205                     S1394_TNF_SL_HOTPLUG_STACK, "",
 206                     tnf_int, hal_instance, ddi_get_instance(hal->halinfo.dip));
 207 
 208                 /* stop bus manager timeouts, if needed */
 209                 s1394_bus_mgr_timers_stop(hal, &hal->bus_mgr_query_timeout_id,
 210                     &hal->bus_mgr_timeout_id);
 211 
 212                 s1394_flush_cmplq(hal);
 213 
 214                 /* start timers for checking bus manager, if needed */
 215                 s1394_bus_mgr_timers_start(hal, &hal->bus_mgr_query_timeout_id,
 216                     &hal->bus_mgr_timeout_id);
 217 
 218                 /* Try to reallocate all isoch resources */
 219                 s1394_isoch_rsrc_realloc(hal);
 220 
 221                 if (s1394_cfgrom_scan_phase1(hal) != DDI_SUCCESS) {
 222                         TNF_PROBE_0_DEBUG(br_thread_phase1_restart,
 223                             S1394_TNF_SL_HOTPLUG_STACK, "");
 224                         continue;
 225                 }
 226 
 227                 TNF_PROBE_1_DEBUG(s1394_br_thread_phase1_done,
 228                     S1394_TNF_SL_HOTPLUG_STACK, "",
 229                     tnf_int, hal_instance, ddi_get_instance(hal->halinfo.dip));
 230 
 231                 if (s1394_bus_mgr_processing(hal) != DDI_SUCCESS) {
 232                         TNF_PROBE_0_DEBUG(br_thread_bus_mgr_restart,
 233                             S1394_TNF_SL_HOTPLUG_STACK, "");
 234                         continue;
 235                 }
 236 
 237                 TNF_PROBE_1_DEBUG(s1394_br_thread_bus_mgr_proc_done,
 238                     S1394_TNF_SL_HOTPLUG_STACK, "",
 239                     tnf_int, hal_instance, ddi_get_instance(hal->halinfo.dip));
 240 
 241                 ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 242 
 243                 if (s1394_cfgrom_scan_phase2(hal) != DDI_SUCCESS) {
 244                         TNF_PROBE_0_DEBUG(br_thread_phase2_restart,
 245                             S1394_TNF_SL_HOTPLUG_STACK, "");
 246                         continue;
 247                 }
 248 
 249                 TNF_PROBE_1_DEBUG(s1394_br_thread_done,
 250                     S1394_TNF_SL_HOTPLUG_STACK, "",
 251                     tnf_int, hal_instance, ddi_get_instance(hal->halinfo.dip));
 252 
 253                 ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 254         }
 255 }
 256 
 257 /*
 258  * s1394_wait_for_events()
 259  *    blocks waiting for a cv_signal on the bus reset condition variable.
 260  *    Used by the bus reset thread for synchronizing with the bus reset/
 261  *    self id interrupt callback from the hal. Does CPR initialization
 262  *    first time it is called. If services layer sees a valid self id
 263  *    buffer, it builds the topology tree and signals the bus reset thread
 264  *    to read the config roms as appropriate (indicated by BR_THR_CFGROM_SCAN).
 265  *    If the services layer wishes to kill the bus reset thread, it signals
 266  *    this by signaling a BR_THR_GO_AWAY event.
 267  */
 268 static void
 269 s1394_wait_for_events(s1394_hal_t *hal, int firsttime)
 270 {
 271         uint_t event;
 272 
 273         TNF_PROBE_0_DEBUG(s1394_wait_for_events_enter,
 274             S1394_TNF_SL_HOTPLUG_STACK, "");
 275 
 276         ASSERT(MUTEX_NOT_HELD(&hal->br_thread_mutex));
 277         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 278 
 279         if (firsttime)
 280                 CALLB_CPR_INIT(&hal->hal_cprinfo, &hal->br_thread_mutex,
 281                     callb_generic_cpr, "s1394_br_thread");
 282 
 283         /* Check and wait for a BUS RESET */
 284         mutex_enter(&hal->br_thread_mutex);
 285         while ((event = hal->br_thread_ev_type) == 0) {
 286                 CALLB_CPR_SAFE_BEGIN(&hal->hal_cprinfo);
 287                 cv_wait(&hal->br_thread_cv, &hal->br_thread_mutex);
 288                 CALLB_CPR_SAFE_END(&hal->hal_cprinfo, &hal->br_thread_mutex);
 289         }
 290 
 291         if (event & BR_THR_GO_AWAY) {
 292                 TNF_PROBE_1(s1394_wait_for_events, S1394_TNF_SL_HOTPLUG_STACK,
 293                     "", tnf_string, msg, "Go away set");
 294                 s1394_br_thread_exit(hal);
 295                 TNF_PROBE_0_DEBUG(s1394_wait_for_events_exit,
 296                     S1394_TNF_SL_HOTPLUG_STACK, "");
 297                 /*NOTREACHED*/
 298                 return;
 299         }
 300 
 301         if (firsttime) {
 302                 TNF_PROBE_0_DEBUG(s1394_wait_for_events_exit,
 303                     S1394_TNF_SL_HOTPLUG_STACK, "");
 304                 mutex_exit(&hal->br_thread_mutex);
 305                 return;
 306         }
 307 
 308         mutex_enter(&hal->topology_tree_mutex);
 309         if (event & BR_THR_CFGROM_SCAN) {
 310                 TNF_PROBE_2_DEBUG(s1394_wait_for_events_scan,
 311                     S1394_TNF_SL_HOTPLUG_STACK, "",
 312                     tnf_int, br_thread_gen, hal->br_cfgrom_read_gen,
 313                     tnf_int, hal_generation, hal->generation_count);
 314         }
 315         hal->br_cfgrom_read_gen = hal->generation_count;
 316 
 317         hal->br_thread_ev_type &= ~BR_THR_CFGROM_SCAN;
 318         mutex_exit(&hal->topology_tree_mutex);
 319         mutex_exit(&hal->br_thread_mutex);
 320 
 321         TNF_PROBE_0_DEBUG(s1394_wait_for_events_exit,
 322             S1394_TNF_SL_HOTPLUG_STACK, "");
 323 }
 324 
 325 /*
 326  * s1394_wait_for_cfgrom_callbacks()
 327  *    Waits for completed config rom reads. Takes each completion off the
 328  *    completion queue and passes it to the "completion handler" function
 329  *    that was passed in as an argument. Further processing of the completion
 330  *    queue depends on the return status of the completion handler. If there
 331  *    is a bus reset while waiting for completions or if the services layer
 332  *    signals BR_THR_GO_AWAY, quits waiting for completions and returns
 333  *    non-zero. Also returns non-zero if completion handler returns
 334  *    S1394_HCMD_LOCK_FAILED.  Returns 0 if config roms for all nodes have
 335  *    been dealt with.
 336  */
 337 static int
 338 s1394_wait_for_cfgrom_callbacks(s1394_hal_t *hal, uint_t wait_gen,
 339     hcmd_ret_t(*handle_cmd_fn)(s1394_hal_t *hal, cmd1394_cmd_t *cmd))
 340 {
 341         cmd1394_cmd_t *cmd;
 342         s1394_cmd_priv_t *s_priv;
 343         int ret, done = 0;
 344         hcmd_ret_t cmdret;
 345 
 346         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 347 
 348         TNF_PROBE_1_DEBUG(s1394_wait_for_cfgrom_callbacks_enter,
 349             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_uint, wait_gen, wait_gen);
 350 
 351         ret = DDI_SUCCESS;
 352 
 353         while (!done) {
 354                 mutex_enter(&hal->br_cmplq_mutex);
 355                 mutex_enter(&hal->topology_tree_mutex);
 356                 while (wait_gen == hal->generation_count &&
 357                     (hal->br_thread_ev_type & BR_THR_GO_AWAY) == 0 &&
 358                     hal->br_cmplq_head == NULL) {
 359                         mutex_exit(&hal->topology_tree_mutex);
 360                         cv_wait(&hal->br_cmplq_cv, &hal->br_cmplq_mutex);
 361                         mutex_enter(&hal->topology_tree_mutex);
 362                 }
 363                 ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
 364                 if (wait_gen != hal->generation_count ||
 365                     (hal->br_thread_ev_type & BR_THR_GO_AWAY) != 0) {
 366 
 367 #if !defined(NPROBE) && defined(TNF_DEBUG)
 368                         int hal_gen = hal->generation_count;
 369 #endif
 370 
 371                         mutex_exit(&hal->topology_tree_mutex);
 372                         mutex_exit(&hal->br_cmplq_mutex);
 373                         s1394_flush_cmplq(hal);
 374                         TNF_PROBE_1_DEBUG(s1394_wait_for_cfgrom_callbacks_exit,
 375                             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_int, hal_gen,
 376                             hal_gen);
 377                         return (DDI_FAILURE);
 378                 }
 379                 mutex_exit(&hal->topology_tree_mutex);
 380 
 381                 if ((cmd = hal->br_cmplq_head) != NULL) {
 382                         s_priv = S1394_GET_CMD_PRIV(cmd);
 383 
 384                         hal->br_cmplq_head = s_priv->cmd_priv_next;
 385                 }
 386                 if (cmd == hal->br_cmplq_tail)
 387                         hal->br_cmplq_tail = NULL;
 388                 mutex_exit(&hal->br_cmplq_mutex);
 389 
 390                 if (cmd != NULL) {
 391                         if (cmd->bus_generation != wait_gen) {
 392                                 TNF_PROBE_3(
 393                                     s1394_wait_for_cfgrom_callbacks,
 394                                     S1394_TNF_SL_HOTPLUG_STACK, "",
 395                                     tnf_string, msg, "command gen != wait_gen",
 396                                     tnf_uint, cmd_gen, cmd->bus_generation,
 397                                     tnf_uint, wait_gen, wait_gen);
 398                                 (void) s1394_free_cmd(hal, &cmd);
 399                                 continue;
 400                         }
 401                         cmdret = (*handle_cmd_fn)(hal, cmd);
 402                         TNF_PROBE_2_DEBUG(s1394_wait_for_cfgrom_callbacks,
 403                             S1394_TNF_SL_HOTPLUG_STACK, "",
 404                             tnf_opaque, cmd, cmd, tnf_int, cmdret, cmdret);
 405                         ASSERT(cmdret != S1394_HCMD_INVALID);
 406                         if (cmdret == S1394_HCMD_LOCK_FAILED) {
 407                                 /* flush completion queue */
 408                                 ret = DDI_FAILURE;
 409                                 s1394_flush_cmplq(hal);
 410                                 break;
 411                         } else if (cmdret == S1394_HCMD_NODE_DONE) {
 412                                 if (--hal->cfgroms_being_read == 0) {
 413                                         /* All done */
 414                                         break;
 415                                 }
 416                         } else {
 417                                 ASSERT(cmdret == S1394_HCMD_NODE_EXPECT_MORE);
 418                                 done = 0;
 419                         }
 420                 }
 421         }
 422 
 423         TNF_PROBE_0_DEBUG(s1394_wait_for_cfgrom_callbacks_exit,
 424             S1394_TNF_SL_HOTPLUG_STACK, "");
 425 
 426         return (ret);
 427 }
 428 
 429 /*
 430  * s1394_flush_cmplq()
 431  *    Frees all cmds on the completion queue.
 432  */
 433 static void
 434 s1394_flush_cmplq(s1394_hal_t *hal)
 435 {
 436         s1394_cmd_priv_t *s_priv;
 437         cmd1394_cmd_t *cmd, *tcmd;
 438 
 439         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 440 
 441         TNF_PROBE_0_DEBUG(s1394_flush_cmplq_enter, S1394_TNF_SL_HOTPLUG_STACK,
 442             "");
 443 
 444         cmd = NULL;
 445 
 446         do {
 447                 mutex_enter(&hal->br_cmplq_mutex);
 448                 cmd = hal->br_cmplq_head;
 449                 hal->br_cmplq_head = hal->br_cmplq_tail = NULL;
 450                 mutex_exit(&hal->br_cmplq_mutex);
 451 
 452                 while (cmd != NULL) {
 453                         s_priv = S1394_GET_CMD_PRIV(cmd);
 454 
 455                         tcmd = s_priv->cmd_priv_next;
 456                         TNF_PROBE_2_DEBUG(s1394_flush_cmplq,
 457                             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_opaque, cmd,
 458                             cmd, tnf_uint, cmd_gen, cmd->bus_generation);
 459                         (void) s1394_free_cmd(hal, &cmd);
 460                         cmd = tcmd;
 461                 }
 462 
 463                 mutex_enter(&hal->br_cmplq_mutex);
 464                 cmd = hal->br_cmplq_head;
 465                 mutex_exit(&hal->br_cmplq_mutex);
 466 
 467         } while (cmd != NULL);
 468 
 469         TNF_PROBE_0_DEBUG(s1394_flush_cmplq_exit, S1394_TNF_SL_HOTPLUG_STACK,
 470             "");
 471 
 472 }
 473 
 474 /*
 475  * s1394_br_thread_exit()
 476  *    Flushes the completion queue and calls thread_exit() (which effectively
 477  *    kills the bus reset thread).
 478  */
 479 static void
 480 s1394_br_thread_exit(s1394_hal_t *hal)
 481 {
 482         ASSERT(MUTEX_HELD(&hal->br_thread_mutex));
 483         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 484         TNF_PROBE_0(s1394_br_thread_exit_enter, S1394_TNF_SL_HOTPLUG_STACK, "");
 485         s1394_flush_cmplq(hal);
 486 #ifndef __lock_lint
 487         CALLB_CPR_EXIT(&hal->hal_cprinfo);
 488 #endif
 489         hal->br_thread_ev_type &= ~BR_THR_GO_AWAY;
 490         thread_exit();
 491         /*NOTREACHED*/
 492         TNF_PROBE_0(s1394_br_thread_exit_enter, S1394_TNF_SL_HOTPLUG_STACK, "");
 493 }
 494 
 495 /*
 496  * s1394_target_bus_reset_notifies()
 497  *    tells the ndi event framework to invoke any callbacks registered for
 498  *    "bus reset event".
 499  */
 500 static void
 501 s1394_target_bus_reset_notifies(s1394_hal_t *hal, t1394_localinfo_t *localinfo)
 502 {
 503         ddi_eventcookie_t cookie;
 504 
 505         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 506 
 507         TNF_PROBE_2_DEBUG(s1394_target_bus_reset_notifies_enter,
 508             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_uint, bus_gen,
 509             localinfo->bus_generation, tnf_uint, node_id,
 510             localinfo->local_nodeID);
 511 
 512         if (ndi_event_retrieve_cookie(hal->hal_ndi_event_hdl, NULL,
 513             DDI_DEVI_BUS_RESET_EVENT, &cookie, NDI_EVENT_NOPASS) ==
 514             NDI_SUCCESS) {
 515                 (void) ndi_event_run_callbacks(hal->hal_ndi_event_hdl, NULL,
 516                     cookie, localinfo);
 517         }
 518         TNF_PROBE_0_DEBUG(s1394_target_bus_reset_notifies_exit,
 519             S1394_TNF_SL_HOTPLUG_STACK, "");
 520 }
 521 
 522 /*
 523  * s1394_alloc_cfgrom()
 524  *    Allocates config rom for the node. Sets CFGROM_NEW_ALLOC bit in the
 525  *    node cfgrom state. Drops topology_tree_mutex around the calls to
 526  *    kmem_zalloc(). If re-locking fails, returns DDI_FAILURE, else returns
 527  *    DDI_SUCCESS.
 528  */
 529 static int
 530 s1394_alloc_cfgrom(s1394_hal_t *hal, s1394_node_t *node, s1394_status_t *status)
 531 {
 532         uint32_t *cfgrom;
 533 
 534         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
 535 
 536         TNF_PROBE_0_DEBUG(s1394_alloc_cfgrom_enter, S1394_TNF_SL_HOTPLUG_STACK,
 537             "");
 538 
 539         *status = S1394_NOSTATUS;
 540 
 541         /*
 542          * if cfgrom is non-NULL, this has to be generation changed
 543          * case (where we allocate cfgrom again to reread the cfgrom)
 544          */
 545         ASSERT(node->cfgrom == NULL || (node->cfgrom != NULL &&
 546             CFGROM_GEN_CHANGED(node) == B_TRUE));
 547 
 548         /*
 549          * if node matched, either cfgrom has to be NULL or link should be
 550          * off in the last matched node or config rom generations changed.
 551          */
 552         ASSERT(NODE_MATCHED(node) == B_FALSE || (NODE_MATCHED(node) == B_TRUE &&
 553             (node->cfgrom == NULL || LINK_ACTIVE(node->old_node) == B_FALSE) ||
 554             CFGROM_GEN_CHANGED(node) == B_TRUE));
 555 
 556         s1394_unlock_tree(hal);
 557         cfgrom = (uint32_t *)kmem_zalloc(IEEE1394_CONFIG_ROM_SZ, KM_SLEEP);
 558         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
 559                 kmem_free(cfgrom, IEEE1394_CONFIG_ROM_SZ);
 560                 *status |= S1394_LOCK_FAILED;
 561                 TNF_PROBE_1(s1394_alloc_cfgrom, S1394_TNF_SL_HOTPLUG_ERROR,
 562                     "", tnf_string, msg, "cannot relock the tree");
 563                 TNF_PROBE_0_DEBUG(s1394_alloc_cfgrom_exit,
 564                     S1394_TNF_SL_HOTPLUG_STACK, "");
 565                 return (DDI_FAILURE);
 566         }
 567         node->cfgrom = cfgrom;
 568         node->cfgrom_size = IEEE1394_CONFIG_ROM_QUAD_SZ;
 569         SET_CFGROM_NEW_ALLOC(node);
 570         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
 571         TNF_PROBE_3(s1394_alloc_cfgrom_exit, S1394_TNF_SL_HOTPLUG_STACK,
 572             "cfgrom alloc", tnf_uint, hal_gen, hal->generation_count, tnf_uint,
 573             node_num, node->node_num, tnf_opaque, cfgrom, cfgrom);
 574         return (DDI_SUCCESS);
 575 }
 576 
 577 /*
 578  * s1394_free_cfgrom()
 579  *    Marks the config rom invalid and frees up the config based on otpions.
 580  */
 581 void
 582 s1394_free_cfgrom(s1394_hal_t *hal, s1394_node_t *node,
 583     s1394_free_cfgrom_t options)
 584 {
 585         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
 586         ASSERT(node->cfgrom != NULL);
 587 
 588         TNF_PROBE_0_DEBUG(s1394_free_cfgrom_enter, S1394_TNF_SL_HOTPLUG_STACK,
 589             "");
 590 
 591         if (options == S1394_FREE_CFGROM_BOTH) {
 592                 /*
 593                  * free in both old and new trees; will be called with
 594                  * new node.
 595                  */
 596                 s1394_node_t *onode = node->old_node;
 597 
 598                 if (NODE_MATCHED(node) == B_TRUE && onode->cfgrom != NULL)
 599                         ASSERT(onode->cfgrom == node->cfgrom);
 600 
 601                 TNF_PROBE_4(s1394_free_cfgrom_both,
 602                     S1394_TNF_SL_HOTPLUG_STACK, "cfgrom free", tnf_uint,
 603                     hal_gen, hal->generation_count, tnf_int, node_num,
 604                     node->node_num, tnf_opaque, old_cfgrom, onode->cfgrom,
 605                     tnf_opaque, cfgrom, node->cfgrom);
 606 
 607                 if (onode != NULL && onode->cfgrom != NULL && onode->cfgrom !=
 608                     node->cfgrom)
 609                         kmem_free(onode->cfgrom, IEEE1394_CONFIG_ROM_SZ);
 610 
 611                 kmem_free(node->cfgrom, IEEE1394_CONFIG_ROM_SZ);
 612                 onode->cfgrom = NULL;
 613                 node->cfgrom = NULL;
 614 
 615                 CLEAR_CFGROM_STATE(onode);
 616                 CLEAR_CFGROM_STATE(node);
 617 
 618         } else if (options == S1394_FREE_CFGROM_NEW) {
 619 
 620                 TNF_PROBE_2(s1394_free_cfgrom_new,
 621                     S1394_TNF_SL_HOTPLUG_STACK, "cfgrom free",
 622                     tnf_int, node_num, node->node_num,
 623                     tnf_opaque, cfgrom, node->cfgrom);
 624 
 625                 ASSERT(CFGROM_NEW_ALLOC(node) == B_TRUE);
 626                 kmem_free(node->cfgrom, IEEE1394_CONFIG_ROM_SZ);
 627                 CLEAR_CFGROM_NEW_ALLOC(node);
 628                 node->cfgrom = NULL;
 629                 CLEAR_CFGROM_STATE(node);
 630 
 631         } else if (options == S1394_FREE_CFGROM_OLD) {
 632 
 633                 /* freeing in old tree */
 634                 TNF_PROBE_2_DEBUG(s1394_free_cfgrom_old,
 635                     S1394_TNF_SL_HOTPLUG_STACK, "cfgrom free",
 636                     tnf_int, node_num, node->node_num,
 637                     tnf_opaque, cfgrom, node->cfgrom);
 638                 kmem_free(node->cfgrom, IEEE1394_CONFIG_ROM_SZ);
 639                 node->cfgrom = NULL;
 640                 CLEAR_CFGROM_STATE(node);
 641         }
 642 
 643         TNF_PROBE_0_DEBUG(s1394_free_cfgrom_exit, S1394_TNF_SL_HOTPLUG_STACK,
 644             "");
 645 }
 646 
 647 /*
 648  * s1394_copy_cfgrom()
 649  *    Copies config rom info from "from" node to "to" node. Clears
 650  *    CFGROM_NEW_ALLOC bit in cfgrom state in bothe nodes. (CFGROM_NEW_ALLOC
 651  *    acts as a reference count. If set, only the node in the current tree
 652  *    has a pointer to it; if clear, both the node in the current tree as
 653  *    well as the corresponding node in the old tree point to the same memory).
 654  */
 655 void
 656 s1394_copy_cfgrom(s1394_node_t *to, s1394_node_t *from)
 657 {
 658         TNF_PROBE_3_DEBUG(s1394_copy_cfgrom_enter, S1394_TNF_SL_HOTPLUG_STACK,
 659             "", tnf_int, to_node, to->node_num, tnf_int,
 660             from_node, from->node_num, tnf_opaque, from_cfgrom, from->cfgrom);
 661 
 662         ASSERT(to->cfgrom == NULL);
 663 
 664         to->cfgrom = from->cfgrom;
 665         to->cfgrom_state = from->cfgrom_state;
 666         to->cfgrom_valid_size = from->cfgrom_valid_size;
 667         to->cfgrom_size = from->cfgrom_size;
 668         to->node_state = from->node_state;
 669 
 670         bcopy(from->dir_stack, to->dir_stack,
 671             offsetof(s1394_node_t, cfgrom_quad_to_read) -
 672             offsetof(s1394_node_t, dir_stack));
 673 
 674         to->cfgrom_quad_to_read = from->cfgrom_quad_to_read;
 675 
 676         CLEAR_CFGROM_NEW_ALLOC(to);
 677         CLEAR_CFGROM_NEW_ALLOC(from);
 678 
 679         /*
 680          * old link off, new link on => handled in s1394_cfgrom_scan_phase1
 681          * old link on, new link off => handled in s1394_process_old_tree
 682          */
 683         if (LINK_ACTIVE(from) == B_FALSE) {
 684                 /*
 685                  * if last time around, link was off, there wouldn't
 686                  * have been config rom allocated.
 687                  */
 688                 ASSERT(from->cfgrom == NULL);
 689                 TNF_PROBE_0_DEBUG(s1394_copy_cfgrom_exit,
 690                     S1394_TNF_SL_HOTPLUG_STACK, "");
 691                 return;
 692         } else {
 693                 s1394_selfid_pkt_t *selfid_pkt = to->selfid_packet;
 694 
 695                 if (IEEE1394_SELFID_ISLINKON(selfid_pkt))
 696                         SET_LINK_ACTIVE(to);
 697         }
 698 
 699         TNF_PROBE_0_DEBUG(s1394_copy_cfgrom_exit,
 700             S1394_TNF_SL_HOTPLUG_STACK, "");
 701 }
 702 
 703 /*
 704  * s1394_read_bus_info_blk()
 705  *    Attempts to kick off reading IEEE1212_NODE_CAP_QUAD quad or quad 0.
 706  *    Increments cfgroms_being_read by 1. Returns DDI_SUCCESS command was
 707  *    issued, else sets status to the failure reason and returns DDI_FAILURE.
 708  */
 709 static int
 710 s1394_read_bus_info_blk(s1394_hal_t *hal, s1394_node_t *node,
 711     s1394_status_t *status)
 712 {
 713         uint32_t quadlet;
 714         cmd1394_cmd_t *cmd;
 715         uchar_t node_num;
 716 
 717         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
 718         ASSERT(LINK_ACTIVE(node) == B_TRUE);
 719 
 720         node_num = node->node_num;
 721 
 722         TNF_PROBE_2_DEBUG(s1394_read_bus_info_blk_enter,
 723             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_uint, hal_gen,
 724             hal->generation_count, tnf_int, node_num, node_num);
 725 
 726         /*
 727          * drop the topology lock around command allocation. Return failure
 728          * if either command allocation fails or cannot reacquire the lock
 729          */
 730         s1394_unlock_tree(hal);
 731         *status = S1394_NOSTATUS;
 732 
 733         if (s1394_alloc_cmd(hal, 0, &cmd) != DDI_SUCCESS) {
 734                 TNF_PROBE_1(s1394_read_bus_info_blk, S1394_TNF_SL_HOTPLUG_ERROR,
 735                     "", tnf_string, msg, "command allocation failed");
 736                 *status |= S1394_CMD_ALLOC_FAILED;
 737         }
 738         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
 739                 *status |= S1394_LOCK_FAILED;
 740                 TNF_PROBE_1(s1394_read_bus_info_blk, S1394_TNF_SL_HOTPLUG_ERROR,
 741                     "", tnf_string, msg, "unable to relock the tree");
 742                 /* free the cmd allocated above */
 743                 if (((*status) & S1394_CMD_ALLOC_FAILED) != 0)
 744                         (void) s1394_free_cmd(hal, (cmd1394_cmd_t **)&cmd);
 745         }
 746         if (((*status) & (S1394_CMD_ALLOC_FAILED | S1394_LOCK_FAILED)) != 0) {
 747                 TNF_PROBE_0_DEBUG(s1394_read_bus_info_blk_exit,
 748                     S1394_TNF_SL_HOTPLUG_STACK, "");
 749                 return (DDI_FAILURE);
 750         }
 751 
 752         /* allocate cfgrom if needed */
 753         if (node->cfgrom == NULL && s1394_alloc_cfgrom(hal, node, status) !=
 754             DDI_SUCCESS) {
 755                 ASSERT(((*status) & S1394_LOCK_FAILED) != 0);
 756                 (void) s1394_free_cmd(hal, (cmd1394_cmd_t **)&cmd);
 757                 ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 758                 TNF_PROBE_1(s1394_read_bus_info_blk, S1394_TNF_SL_HOTPLUG_ERROR,
 759                     "", tnf_string, msg, "config rom allocation failed");
 760                 TNF_PROBE_0_DEBUG(s1394_read_bus_info_blk_exit,
 761                     S1394_TNF_SL_HOTPLUG_STACK, "");
 762                 return (DDI_FAILURE);
 763         }
 764 
 765         /*
 766          * if this is a matched node, read quad 2 (node capabilities) to
 767          * see if the generation count changed.
 768          */
 769         quadlet = CFGROM_BIB_READ(node) ? IEEE1212_NODE_CAP_QUAD : 0;
 770 
 771         /*
 772          * read bus info block at 100Mbit. This will help us with the cases
 773          * where LINK is slower than PHY; s1394 uses PHY speed till speed map
 774          * is updated.
 775          */
 776         cmd->completion_callback = s1394_cfgrom_read_callback;
 777         cmd->bus_generation = hal->generation_count;
 778         cmd->cmd_options = (CMD1394_CANCEL_ON_BUS_RESET |
 779             CMD1394_OVERRIDE_ADDR | CMD1394_OVERRIDE_SPEED);
 780         cmd->cmd_speed = IEEE1394_S100;
 781         cmd->cmd_type = CMD1394_ASYNCH_RD_QUAD;
 782 
 783         QUAD_TO_CFGROM_ADDR(IEEE1394_LOCAL_BUS, node_num,
 784             quadlet, cmd->cmd_addr);
 785 
 786         TNF_PROBE_3_DEBUG(s1394_read_bus_info_blk,
 787             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_uint, hal_gen,
 788             hal->generation_count, tnf_int, node_num, node_num, tnf_uint,
 789             quadlet, quadlet);
 790 
 791         TNF_PROBE_5_DEBUG(s1394_read_bus_info_blk,
 792             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_int,
 793             node_num, node_num, tnf_int, parsed, CFGROM_PARSED(node), tnf_int,
 794             matched, NODE_MATCHED(node), tnf_int, visited,
 795             NODE_VISITED(node), tnf_int, generation_changed,
 796             CFGROM_GEN_CHANGED(node));
 797 
 798         SETUP_QUAD_READ(node, 1, quadlet, 1);
 799         if (s1394_read_config_quadlet(hal, cmd, status) != DDI_SUCCESS) {
 800                 TNF_PROBE_1(s1394_read_bus_info_blk, S1394_TNF_SL_HOTPLUG_ERROR,
 801                     "", tnf_string, msg, "Unable to start read");
 802                 /* free the command if it wasn't handed over to the HAL */
 803                 if (((*status) & S1394_CMD_INFLIGHT) == 0) {
 804                         (void) s1394_free_cmd(hal, (cmd1394_cmd_t **)&cmd);
 805                 }
 806                 if (((*status) & S1394_LOCK_FAILED) != 0) {
 807                         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 808                 }
 809                 TNF_PROBE_0_DEBUG(s1394_read_bus_info_blk_exit,
 810                     S1394_TNF_SL_HOTPLUG_STACK, "");
 811                 return (DDI_FAILURE);
 812         }
 813 
 814         hal->cfgroms_being_read++;
 815         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
 816 
 817         TNF_PROBE_1_DEBUG(s1394_read_bus_info_blk_exit,
 818             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_int, cfgrom_read_cnt,
 819             hal->cfgroms_being_read);
 820 
 821         return (DDI_SUCCESS);
 822 }
 823 
 824 /*
 825  * s1394_read_rest_of_cfgrom()
 826  *    Attempts to start reading node->cfgrom_quad_to_read quadlet. Increments
 827  *    cfgroms_being_read by 1 and returns DDI_SUCCESS if command was issued,
 828  *    else sets status to the failure reason and returns DDI_FAILURE.
 829  */
 830 int
 831 s1394_read_rest_of_cfgrom(s1394_hal_t *hal, s1394_node_t *node,
 832     s1394_status_t *status)
 833 {
 834         cmd1394_cmd_t *cmd;
 835         uchar_t node_num = node->node_num;
 836 
 837         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
 838         ASSERT(LINK_ACTIVE(node) == B_TRUE);
 839 
 840         TNF_PROBE_2_DEBUG(s1394_read_rest_of_cfgrom_enter,
 841             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_uint, hal_gen,
 842             hal->generation_count, tnf_int, node_num, node_num);
 843 
 844         /*
 845          * drop the topology lock around command allocation. Return failure
 846          * if either command allocation fails or cannot reacquire the lock
 847          */
 848         s1394_unlock_tree(hal);
 849         *status = S1394_NOSTATUS;
 850 
 851         if (s1394_alloc_cmd(hal, 0, &cmd) != DDI_SUCCESS) {
 852                 *status |= S1394_CMD_ALLOC_FAILED;
 853                 TNF_PROBE_1(s1394_read_rest_of_cfgrom,
 854                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
 855                     "command allocation failed");
 856         }
 857         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
 858                 *status |= S1394_LOCK_FAILED;
 859                 /* free if we allocated a cmd above */
 860                 if (((*status) & S1394_CMD_ALLOC_FAILED) == 0)
 861                         (void) s1394_free_cmd(hal, (cmd1394_cmd_t **)&cmd);
 862                 TNF_PROBE_1(s1394_read_rest_of_cfgrom,
 863                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
 864                     "unable to relock the tree");
 865         }
 866         if (((*status) & (S1394_CMD_ALLOC_FAILED | S1394_LOCK_FAILED)) != 0) {
 867                 TNF_PROBE_0_DEBUG(s1394_read_rest_of_cfgrom_exit,
 868                     S1394_TNF_SL_HOTPLUG_STACK, "");
 869                 return (DDI_FAILURE);
 870         }
 871 
 872         cmd->completion_callback = s1394_cfgrom_read_callback;
 873         cmd->bus_generation = hal->generation_count;
 874         cmd->cmd_options = (CMD1394_CANCEL_ON_BUS_RESET |
 875             CMD1394_OVERRIDE_ADDR);
 876         cmd->cmd_type = CMD1394_ASYNCH_RD_QUAD;
 877 
 878         TNF_PROBE_2_DEBUG(s1394_read_rest_of_cfgrom, S1394_TNF_SL_HOTPLUG_STACK,
 879             "", tnf_uint, hal_gen, hal->generation_count, tnf_int, node_num,
 880             node->node_num);
 881 
 882         QUAD_TO_CFGROM_ADDR(IEEE1394_LOCAL_BUS, node_num,
 883             node->cfgrom_quad_to_read, cmd->cmd_addr);
 884         SETUP_QUAD_READ(node, 1, node->cfgrom_quad_to_read, 1);
 885         if (s1394_read_config_quadlet(hal, cmd, status) != DDI_SUCCESS) {
 886                 TNF_PROBE_1(s1394_read_rest_of_cfgrom_exit,
 887                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
 888                     "unable to start read");
 889                 /* free the command if it wasn't handed over to the HAL */
 890                 if (((*status) & S1394_CMD_INFLIGHT) == 0) {
 891                         (void) s1394_free_cmd(hal, (cmd1394_cmd_t **)&cmd);
 892                 }
 893                 if (((*status) & S1394_LOCK_FAILED) != 0) {
 894                         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 895                 }
 896                 TNF_PROBE_0_DEBUG(s1394_read_rest_of_cfgrom_exit,
 897                     S1394_TNF_SL_HOTPLUG_STACK, "");
 898                 return (DDI_FAILURE);
 899         }
 900 
 901         hal->cfgroms_being_read++;
 902         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
 903 
 904         TNF_PROBE_1_DEBUG(s1394_read_rest_of_cfgrom_exit,
 905             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_int, cfgrom_read_cnt,
 906             hal->cfgroms_being_read);
 907 
 908         return (DDI_SUCCESS);
 909 }
 910 
 911 /*
 912  * s1394_cfgrom_scan_phase1()
 913  *    Attempts to read bus info blocks for nodes as needed. Returns DDI_FAILURE
 914  *    if bus reset generations changed (as indicated by s1394_lock_tree()
 915  *    return status) or if any of the callees return failure, else returns
 916  *    DDI_SUCCESS.
 917  */
 918 static int
 919 s1394_cfgrom_scan_phase1(s1394_hal_t *hal)
 920 {
 921         uint32_t number_of_nodes;
 922         int ret;
 923         int node;
 924         int wait_in_gen;
 925         int wait_for_cbs;
 926         uint_t hal_node_num;
 927         uint_t hal_node_num_old;
 928         s1394_node_t *nnode, *onode;
 929         s1394_selfid_pkt_t *selfid_pkt;
 930         s1394_status_t status;
 931 
 932         TNF_PROBE_0_DEBUG(s1394_cfgrom_scan_phase1_enter,
 933             S1394_TNF_SL_HOTPLUG_STACK, "");
 934 
 935         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
 936 
 937         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
 938                 TNF_PROBE_0_DEBUG(s1394_cfgrom_scan_phase1_exit,
 939                     S1394_TNF_SL_HOTPLUG_STACK, "");
 940                 return (DDI_FAILURE);
 941         }
 942         wait_for_cbs = 0;
 943         number_of_nodes = hal->number_of_nodes;
 944         hal->cfgroms_being_read = 0;
 945         hal_node_num = IEEE1394_NODE_NUM(hal->node_id);
 946         hal_node_num_old = IEEE1394_NODE_NUM(hal->old_node_id);
 947         s1394_unlock_tree(hal);
 948 
 949         ret = DDI_SUCCESS;
 950 
 951         /* Send requests for all new node config ROM 0 */
 952         for (node = 0; node < number_of_nodes; node++) {
 953 
 954                 status = S1394_UNKNOWN;
 955 
 956                 if (s1394_lock_tree(hal) != DDI_SUCCESS) {
 957                         status = S1394_LOCK_FAILED;
 958                         break;
 959                 }
 960 
 961                 nnode = &hal->topology_tree[node];
 962                 onode = nnode->old_node;
 963                 /* if node matched, onode should be non NULL */
 964                 ASSERT(NODE_MATCHED(nnode) == B_FALSE || (NODE_MATCHED(nnode) ==
 965                     B_TRUE && onode != NULL));
 966 
 967                 /*
 968                  * Read bus info block if it is a brand new node (MATCHED is 0)
 969                  * or if matched but link was off in previous generations or
 970                  * or if matched but had invalid cfgrom in last generation
 971                  * or if matched but config rom generation > 1 (this is to
 972                  * check if config rom generation changed between bus resets).
 973                  */
 974                 if ((node != hal_node_num) &&
 975                     ((NODE_MATCHED(nnode) == B_FALSE) ||
 976                     (NODE_MATCHED(nnode) == B_TRUE && LINK_ACTIVE(onode) ==
 977                     B_FALSE) || (NODE_MATCHED(nnode) == B_TRUE &&
 978                     (onode->cfgrom == NULL || CFGROM_VALID(onode) ==
 979                     B_FALSE)) || (NODE_MATCHED(nnode) == B_TRUE &&
 980                     nnode->cfgrom != NULL && CONFIG_ROM_GEN(nnode->cfgrom) >
 981                     1))) {
 982 
 983                         SET_NODE_VISITED(nnode);
 984                         selfid_pkt = nnode->selfid_packet;
 985                         if (IEEE1394_SELFID_ISLINKON(selfid_pkt)) {
 986 
 987                                 SET_LINK_ACTIVE(nnode);
 988 
 989                                 status = S1394_UNKNOWN;
 990 
 991                                 if (s1394_read_bus_info_blk(hal, nnode,
 992                                     &status) != DDI_SUCCESS) {
 993                                         if ((status & S1394_LOCK_FAILED) != 0)
 994                                                 break;
 995                                 } else {
 996                                         wait_for_cbs++;
 997                                         wait_in_gen = hal->br_cfgrom_read_gen;
 998                                 }
 999                         } else {
1000                                 /*
1001                                  * Special case: if link was active last
1002                                  * time around, this should be treated as
1003                                  * node going away.
1004                                  */
1005                                 CLEAR_LINK_ACTIVE(nnode);
1006                                 if (NODE_MATCHED(nnode) == B_TRUE &&
1007                                     LINK_ACTIVE(onode) == B_TRUE) {
1008                                         CLEAR_CFGROM_STATE(nnode);
1009                                         TNF_PROBE_3(s1394_cfgrom_scan_phase1,
1010                                             S1394_TNF_SL_HOTPLUG_ERROR,
1011                                             "", tnf_string, msg,
1012                                             "link lost power", tnf_int, node,
1013                                             node, tnf_int, onode,
1014                                             onode->node_num);
1015                                 }
1016                         }
1017                 } else {
1018                         if (node == hal_node_num) {
1019                                 onode = &hal->old_tree[hal_node_num_old];
1020                                 /* Set up the local matched nodes */
1021                                 if (onode) {
1022                                         nnode->old_node = onode;
1023                                         SET_NODE_MATCHED(nnode);
1024                                         SET_NODE_MATCHED(onode);
1025                                         s1394_copy_cfgrom(nnode, onode);
1026                                 }
1027                         }
1028                 }
1029                 s1394_unlock_tree(hal);
1030         }
1031 
1032         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
1033 
1034         if ((status & S1394_LOCK_FAILED) != 0) {
1035                 TNF_PROBE_1(s1394_cfrom_scan_phase1_exit,
1036                     S1394_TNF_SL_HOTPLUG_STACK, "",
1037                     tnf_string, msg, "Generations changed");
1038                 return (DDI_FAILURE);
1039         }
1040 
1041         /*
1042          * If we started any reads, wait for completion callbacks
1043          */
1044         if (wait_for_cbs != 0) {
1045                 ret = s1394_wait_for_cfgrom_callbacks(hal, wait_in_gen,
1046                     s1394_br_thread_handle_cmd_phase1);
1047         }
1048 
1049         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
1050 
1051         TNF_PROBE_0_DEBUG(s1394_cfrom_scan_phase1_exit,
1052             S1394_TNF_SL_HOTPLUG_STACK, "");
1053 
1054         return (ret);
1055 }
1056 
1057 /*
1058  * s1394_br_thread_handle_cmd_phase1()
1059  *    Process the cmd completion for phase 1 config rom reads. If we
1060  *    successfully read IEEE1212_NODE_CAP_QUAD quadlet and config rom gen
1061  *    did not change, move targets hanging off the old node to the current
1062  *    node. If config rom generations change, alloc new config rom and start
1063  *    re-reading the new config rom. If all of bus info block is read (as
1064  *    required), mark the node as CFGROM_BIB_READ. If config rom read fails
1065  *    retry if not too many failures. Topology tree mutex is dropped and
1066  *    reacquired in this routine. If reacquiring fails, returns
1067  *    S1394_HCMD_LOCK_FAILED. If the entire bus info block is read, returns
1068  *    S1394_HCMD_NODE_DONE, else returns S1394_HCMD_NODE_EXPECT_MORE (to
1069  *    indicate not done with the node yet).
1070  *
1071  *    If we cannot read any of the quadlets in the bus info block, cfgrom
1072  *    is marked invalid in this generation (a side effect of calling
1073  *    s1394_free_cfgrom()). We free cfgrom in this routine only if the failure
1074  *    is not due to bus generations changing.
1075  */
1076 static hcmd_ret_t
1077 s1394_br_thread_handle_cmd_phase1(s1394_hal_t *hal, cmd1394_cmd_t *cmd)
1078 {
1079         s1394_target_t *t;
1080         s1394_node_t *node, *onode;
1081         uint32_t node_num, quadlet, data;
1082         int freecmd, done, locked;
1083         hcmd_ret_t cmdret;
1084         uchar_t readdelay;
1085         s1394_status_t status;
1086 
1087         s1394_get_quad_info(cmd, &node_num, &quadlet, &data);
1088         ASSERT(quadlet == 0 || quadlet < IEEE1394_BIB_QUAD_SZ);
1089 
1090         TNF_PROBE_0_DEBUG(s1394_br_thread_handle_cmd_phase1_enter,
1091             S1394_TNF_SL_HOTPLUG_STACK, "");
1092 
1093         cmdret = S1394_HCMD_NODE_EXPECT_MORE;
1094 
1095         locked = 1;
1096         freecmd = 1;
1097 
1098         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
1099                 TNF_PROBE_1(s1394_br_thread_handle_cmd_phase1,
1100                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string, msg,
1101                     "unable to lock tree");
1102                 locked = 0;
1103                 goto bail;
1104         }
1105 
1106         node = &hal->topology_tree[node_num];
1107 
1108         if (cmd->cmd_result == CMD1394_CMDSUCCESS) {
1109 
1110                 int reread = 0;
1111 
1112                 done = 0;
1113 
1114                 if (quadlet == IEEE1212_NODE_CAP_QUAD &&
1115                     CFGROM_BIB_READ(node)) {
1116 
1117                         int cur_gen = ((data & IEEE1394_BIB_GEN_MASK) >>
1118                             IEEE1394_BIB_GEN_SHIFT);
1119 
1120                         /*
1121                          * node->old_node can be NULL if this is a new node &
1122                          * we are doing a rescan
1123                          */
1124                         onode = node->old_node;
1125                         if (CONFIG_ROM_GEN(node->cfgrom) == cur_gen) {
1126 
1127                                 if (CFGROM_PARSED(node) == B_TRUE) {
1128                                         rw_enter(&hal->target_list_rwlock,
1129                                             RW_WRITER);
1130                                         /* Update the target list, if any */
1131                                         if (onode != NULL &&
1132                                             (t = onode->target_list) != NULL) {
1133                                                 node->target_list = t;
1134                                                 while (t != NULL) {
1135                                                         t->on_node = node;
1136                                                         t = t->target_sibling;
1137                                                 }
1138                                         }
1139                                         rw_exit(&hal->target_list_rwlock);
1140                                 }
1141                                 SET_NODE_MATCHED(node);
1142                                 if (onode)
1143                                         SET_NODE_MATCHED(onode);
1144                                 node->cfgrom_quad_to_read =
1145                                     IEEE1394_BIB_QUAD_SZ;
1146                                 done++;
1147                         } else {
1148 
1149                                 TNF_PROBE_4(s1394_br_thread_handle_cmd_phase1,
1150                                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string,
1151                                     msg, "config rom generation changed",
1152                                     tnf_int, node_num, node_num,
1153                                     tnf_int, cur_gen, cur_gen, tnf_int, old_gen,
1154                                     CONFIG_ROM_GEN(node->cfgrom));
1155 
1156                                 SET_CFGROM_GEN_CHANGED(node);
1157                                 if (onode != NULL)
1158                                         SET_CFGROM_GEN_CHANGED(onode);
1159                                 /*
1160                                  * Reset BIB_READ flag and start reading entire
1161                                  * config rom.
1162                                  */
1163                                 CLEAR_CFGROM_BIB_READ(node);
1164                                 reread = 1;
1165 
1166                                 /*
1167                                  * if generations changed, allocate cfgrom for
1168                                  * the new generation. s1394_match_GUID() will
1169                                  * free up the cfgrom from the old generation.
1170                                  */
1171                                 if (s1394_alloc_cfgrom(hal, node, &status) !=
1172                                     DDI_SUCCESS) {
1173                                         ASSERT((status & S1394_LOCK_FAILED) !=
1174                                             0);
1175                                         ASSERT(MUTEX_NOT_HELD(&hal->
1176                                             topology_tree_mutex));
1177                                         locked = 0;
1178                                         /* we failed to relock the tree */
1179                                         goto bail;
1180                                 }
1181                         }
1182                 }
1183 
1184                 /*
1185                  * we end up here if we don't have bus_info_blk for this
1186                  * node or if config rom generation changed.
1187                  */
1188 
1189                 /*
1190                  * Pass1 Rio bug workaround. Due to this bug, if we read
1191                  * past quadlet 5 of the config rom, the PCI bus gets wedged.
1192                  * Avoid the hang by not reading past quadlet 5.
1193                  * We identify a remote Rio by the node vendor id part of
1194                  * quad 3 (which is == SUNW == S1394_SUNW_OUI (0x80020)).
1195                  */
1196                 if (s1394_enable_rio_pass1_workarounds != 0) {
1197                         if ((quadlet == 3) && ((data >> 8) == S1394_SUNW_OUI)) {
1198                                 node->cfgrom_size = IEEE1394_BIB_QUAD_SZ;
1199                                 node->cfgrom_valid_size = IEEE1394_BIB_QUAD_SZ;
1200                         }
1201                 }
1202 
1203                 if (!done) {
1204 
1205                         if (reread)
1206                                 quadlet = 0;
1207                         else
1208                                 node->cfgrom[quadlet++] = data;
1209 
1210                         /* if we don't have the entire bus_info_blk... */
1211                         if (quadlet < IEEE1394_BIB_QUAD_SZ) {
1212 
1213                                 CFGROM_GET_READ_DELAY(node, readdelay);
1214                                 SETUP_QUAD_READ(node, 1, quadlet, 1);
1215                                 s1394_unlock_tree(hal);
1216                                 CFGROM_READ_PAUSE(readdelay);
1217                                 /* get next quadlet */
1218                                 if (s1394_lock_tree(hal) != DDI_SUCCESS) {
1219                                         TNF_PROBE_3(
1220                                             s1394_br_thread_handle_cmd_phase1,
1221                                             S1394_TNF_SL_HOTPLUG_STACK, "",
1222                                             tnf_string, msg,
1223                                             "unable to relock tree", tnf_uint,
1224                                             node_num, node_num, tnf_int,
1225                                             quad_to_read, quadlet);
1226                                         locked = 0;
1227                                 } else if (s1394_read_config_quadlet(hal, cmd,
1228                                     &status) != DDI_SUCCESS) {
1229                                         /*
1230                                          * Failed to get going. If command was
1231                                          * successfully handed over to the HAL,
1232                                          * don't free it (it will get freed
1233                                          * later in the callback).
1234                                          */
1235                                         TNF_PROBE_3(
1236                                             s1394_br_thread_handle_cmd_phase1,
1237                                             S1394_TNF_SL_HOTPLUG_STACK, "",
1238                                             tnf_string, msg,
1239                                             "unable to read", tnf_uint,
1240                                             node_num, node_num, tnf_int,
1241                                             quad_to_read, quadlet);
1242                                         if ((status & S1394_CMD_INFLIGHT) !=
1243                                             0) {
1244                                                 freecmd = 0;
1245                                         }
1246                                         if ((status & S1394_LOCK_FAILED) != 0) {
1247                                                 locked = 0;
1248                                         } else {
1249                                                 if (CFGROM_NEW_ALLOC(node) ==
1250                                                     B_TRUE) {
1251                                                         s1394_free_cfgrom(hal,
1252                                                             node,
1253                                                         S1394_FREE_CFGROM_NEW);
1254                                                 } else {
1255                                                         CLEAR_CFGROM_STATE(
1256                                                             node);
1257                                                 }
1258                                         }
1259                                         done++;
1260                                 } else {
1261                                         freecmd = 0;
1262                                 }
1263                         } else {
1264                                 /* got all of bus_info_blk */
1265                                 SET_CFGROM_BIB_READ(node);
1266                                 if (node->cfgrom_size == IEEE1394_BIB_QUAD_SZ)
1267                                     SET_CFGROM_ALL_READ(node);
1268                                 node->cfgrom_quad_to_read = quadlet;
1269                                 done++;
1270                                 TNF_PROBE_3_DEBUG(
1271                                     s1394_br_thread_handle_cmd_phase1,
1272                                     S1394_TNF_SL_HOTPLUG_STACK,
1273                                     "", tnf_string, msg, "read bus info blk",
1274                                     tnf_int, node_num, node->node_num,
1275                                     tnf_opaque, cfgrom, node->cfgrom);
1276                         }
1277                 }
1278         } else {
1279                 done = 1;
1280                 node->cfgrom_read_fails++;
1281                 BUMP_CFGROM_READ_DELAY(node);
1282 
1283                 /* retry if not too many failures */
1284                 if (node->cfgrom_read_fails < s1394_cfgrom_read_retry_cnt) {
1285                         CFGROM_GET_READ_DELAY(node, readdelay);
1286                         SETUP_QUAD_READ(node, 0, quadlet, 1);
1287                         s1394_unlock_tree(hal);
1288                         CFGROM_READ_PAUSE(readdelay);
1289                         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
1290                                 TNF_PROBE_3(
1291                                     s1394_br_thread_handle_cmd_phase1,
1292                                     S1394_TNF_SL_HOTPLUG_ERROR, "",
1293                                     tnf_string, msg,
1294                                     "unable to relock tree", tnf_uint,
1295                                     node_num, node_num, tnf_int,
1296                                     quad_to_read, quadlet);
1297                                 locked = 0;
1298                         } else if (s1394_read_config_quadlet(hal, cmd,
1299                             &status) != DDI_SUCCESS) {
1300                                 /*
1301                                  * Failed to get going. If command was
1302                                  * successfully handed over to the HAL,
1303                                  * don't free it (it will get freed
1304                                  * later in the callback).
1305                                  */
1306                                 TNF_PROBE_3(
1307                                     s1394_br_thread_handle_cmd_phase1,
1308                                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string,
1309                                     msg, "unable to re-read", tnf_uint,
1310                                     node_num, node_num, tnf_int, quad_to_read,
1311                                     quadlet);
1312                                 if ((status & S1394_CMD_INFLIGHT) != 0) {
1313                                         freecmd = 0;
1314                                 }
1315                                 if ((status & S1394_LOCK_FAILED) != 0) {
1316                                         locked = 0;
1317                                 } else {
1318                                         if (CFGROM_NEW_ALLOC(node) == B_TRUE) {
1319                                                 s1394_free_cfgrom(hal, node,
1320                                                     S1394_FREE_CFGROM_NEW);
1321                                         } else {
1322                                                 CLEAR_CFGROM_STATE(node);
1323                                         }
1324                                 }
1325                         } else {
1326                                 done = 0;
1327                                 freecmd = 0;
1328                         }
1329                 } else {
1330                         TNF_PROBE_4(s1394_br_thread_handle_cmd_phase1,
1331                             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string, msg,
1332                             "retries exceeded", tnf_int, node_num, node_num,
1333                             tnf_int, quadlet, quadlet, tnf_opaque, cfgrom,
1334                             node->cfgrom);
1335                         if (CFGROM_NEW_ALLOC(node) == B_TRUE) {
1336                                 s1394_free_cfgrom(hal, node,
1337                                     S1394_FREE_CFGROM_NEW);
1338                         } else {
1339                                 CLEAR_CFGROM_STATE(node);
1340                         }
1341                 }
1342         }
1343 bail:
1344         if (freecmd) {
1345                 (void) s1394_free_cmd(hal, &cmd);
1346         }
1347 
1348         if (done) {
1349                 cmdret = S1394_HCMD_NODE_DONE;
1350                 TNF_PROBE_2_DEBUG(s1394_br_thread_handle_cmd_phase1,
1351                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string, msg,
1352                     "done with node", tnf_int, node_num, node_num);
1353         }
1354 
1355         /* if we are bailing out because locking failed, locked == 0 */
1356         if (locked == 0)
1357                 cmdret = S1394_HCMD_LOCK_FAILED;
1358         else
1359                 s1394_unlock_tree(hal);
1360 
1361         TNF_PROBE_0_DEBUG(s1394_br_thread_handle_cmd_phase1_exit,
1362             S1394_TNF_SL_HOTPLUG_STACK, "");
1363 
1364         return (cmdret);
1365 }
1366 
1367 /*
1368  * s1394_cfgrom_scan_phase2()
1369  *    Handles phase 2 of bus reset processing. Matches GUIDs between old
1370  *    and new topology trees to identify which node moved where. Processes
1371  *    the old topology tree (involves offlining any nodes that got unplugged
1372  *    between the last generation and the current generation). Updates speed
1373  *    map, sets up physical AR request filer and does isoch resource
1374  *    realloc failure notification and bus reset notifications. Then resends
1375  *    any commands that were issued by targets while the reset was being
1376  *    processed. Finally, the current topology tree is processed. This involves
1377  *    reading config rom past the bus info block for new nodes and parsing
1378  *    the config rom, creating a devinfo for each unit directory found in the
1379  *    config rom.
1380  *    Returns DDI_FAILURE if there was bus reset during any of the function
1381  *    calls (as indicated by lock failures) or if any of the routines callees
1382  *    return failure, else returns DDI_SUCCESS.
1383  */
1384 static int
1385 s1394_cfgrom_scan_phase2(s1394_hal_t *hal)
1386 {
1387         int ret;
1388         uint_t wait_gen;
1389         int wait_for_cbs = 0;
1390         t1394_localinfo_t localinfo;
1391 
1392         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
1393 
1394         TNF_PROBE_0_DEBUG(s1394_cfgrom_scan_phase2_enter,
1395             S1394_TNF_SL_HOTPLUG_STACK, "");
1396 
1397         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
1398                 TNF_PROBE_0_DEBUG(s1394_cfgrom_scan_phase2_exit,
1399                     S1394_TNF_SL_HOTPLUG_STACK, "");
1400                 return (DDI_FAILURE);
1401         }
1402 
1403         if (s1394_match_all_GUIDs(hal) == DDI_SUCCESS) {
1404                 s1394_unlock_tree(hal);
1405         }
1406 
1407         if (s1394_process_old_tree(hal) != DDI_SUCCESS) {
1408                 ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
1409                 TNF_PROBE_1(s1394_cfgrom_scan_phase2,
1410                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
1411                     "non-success return from process_old_tree");
1412                 TNF_PROBE_0_DEBUG(s1394_cfgrom_scan_phase2_exit,
1413                     S1394_TNF_SL_HOTPLUG_STACK, "");
1414                 return (DDI_FAILURE);
1415         }
1416 
1417         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
1418                 TNF_PROBE_1(s1394_cfgrom_scan_phase2,
1419                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
1420                     "unable to relock the tree");
1421                 TNF_PROBE_0_DEBUG(s1394_cfgrom_scan_phase2_exit,
1422                     S1394_TNF_SL_HOTPLUG_STACK, "");
1423                 return (DDI_FAILURE);
1424         }
1425 
1426         s1394_update_speed_map_link_speeds(hal);
1427         s1394_unlock_tree(hal);
1428 
1429         /* Setup physical AR request filters */
1430         s1394_physical_arreq_setup_all(hal);
1431 
1432         /* Notify targets of isoch resource realloc failures */
1433         s1394_isoch_rsrc_realloc_notify(hal);
1434 
1435         /* Notify targets of the end of bus reset processing */
1436         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
1437                 TNF_PROBE_1(s1394_cfgrom_scan_phase2,
1438                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
1439                     "unable to relock the tree after isoch notify");
1440                 TNF_PROBE_0_DEBUG(s1394_cfgrom_scan_phase2_exit,
1441                     S1394_TNF_SL_HOTPLUG_STACK, "");
1442                 return (DDI_FAILURE);
1443         }
1444 
1445         localinfo.bus_generation = hal->generation_count;
1446         localinfo.local_nodeID = hal->node_id;
1447 
1448         s1394_unlock_tree(hal);
1449         s1394_target_bus_reset_notifies(hal, &localinfo);
1450         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
1451                 TNF_PROBE_1(s1394_cfgrom_scan_phase2,
1452                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
1453                     "unable to relock the tree after reset notify");
1454                 TNF_PROBE_0_DEBUG(s1394_cfgrom_scan_phase2_exit,
1455                     S1394_TNF_SL_HOTPLUG_STACK, "");
1456                 return (DDI_FAILURE);
1457         }
1458 
1459         /* Set HAL state to normal */
1460         if (hal->disable_requests_bit == 0)
1461                 hal->hal_state = S1394_HAL_NORMAL;
1462         else
1463                 hal->hal_state = S1394_HAL_DREQ;
1464 
1465         s1394_unlock_tree(hal);
1466 
1467         /* Flush the pending Q */
1468         s1394_resend_pending_cmds(hal);
1469 
1470         if (s1394_process_topology_tree(hal, &wait_for_cbs, &wait_gen)) {
1471                 TNF_PROBE_1(s1394_cfgrom_scan_phase2,
1472                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
1473                     "non-success return from process_topology_tree");
1474                 TNF_PROBE_0_DEBUG(s1394_cfgrom_scan_phase2_exit,
1475                     S1394_TNF_SL_HOTPLUG_STACK, "");
1476                 ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
1477                 return (DDI_FAILURE);
1478         }
1479 
1480         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
1481                 TNF_PROBE_1(s1394_cfgrom_scan_phase2,
1482                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
1483                     "unable to relock after processing topology tree");
1484                 TNF_PROBE_0_DEBUG(s1394_cfgrom_scan_phase2_exit,
1485                     S1394_TNF_SL_HOTPLUG_STACK, "");
1486                 return (DDI_FAILURE);
1487         }
1488 
1489         s1394_print_node_info(hal);
1490 
1491         s1394_unlock_tree(hal);
1492 
1493         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
1494 
1495         ret = DDI_SUCCESS;
1496 
1497         /*
1498          * If we started any reads, wait for completion callbacks
1499          */
1500         if (wait_for_cbs != 0) {
1501                 ret = s1394_wait_for_cfgrom_callbacks(hal, wait_gen,
1502                     s1394_br_thread_handle_cmd_phase2);
1503 
1504                 TNF_PROBE_2_DEBUG(s1394_cfgrom_scan_phase2,
1505                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string, msg,
1506                     "returned from waiting for cfgrom callbacks", tnf_int, ret,
1507                     ret);
1508         }
1509 
1510         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
1511 
1512         TNF_PROBE_0_DEBUG(s1394_cfgrom_scan_phase2_exit,
1513             S1394_TNF_SL_HOTPLUG_STACK, "");
1514 
1515         return (ret);
1516 }
1517 
1518 /*
1519  * s1394_br_thread_handle_cmd_phase2()
1520  *    Process the cmd completion for phase 2 config rom reads. If all the
1521  *    needed quads are read, validates the config rom; if config rom is
1522  *    invalid (crc failures), frees the config rom, else marks the config rom
1523  *    valid and calls s1394_update_devinfo_tree() to parse the config rom.
1524  *    If need to get more quadlets, attempts to kick off the read and returns
1525  *    S1394_HCMD_NODE_EXPECT_MORE if successfully started the read. If a bus
1526  *    reset is seen while in this routine, returns S1394_HCMD_LOCK_FAILED. If
1527  *    done with the node (with or withoug crc errors), returns
1528  *    S1394_HCMD_NODE_DONE, else returns S1394_HCMD_NODE_EXPECT_MORE (to
1529  *    indicate not done with the node yet).
1530  */
1531 static hcmd_ret_t
1532 s1394_br_thread_handle_cmd_phase2(s1394_hal_t *hal, cmd1394_cmd_t *cmd)
1533 {
1534         s1394_node_t *node;
1535         uint32_t node_num, quadlet, data;
1536         int update_devinfo, locked, freecmd, done;
1537         hcmd_ret_t cmdret;
1538         uchar_t readdelay;
1539         s1394_status_t status;
1540 
1541         TNF_PROBE_0_DEBUG(s1394_br_thread_handle_cmd_phase2_enter,
1542             S1394_TNF_SL_HOTPLUG_STACK, "");
1543 
1544         /*
1545          * we end up here if this is a brand new node or if it is a known node
1546          * but the config ROM changed (and triggered a re-read).
1547          */
1548         s1394_get_quad_info(cmd, &node_num, &quadlet, &data);
1549         ASSERT(quadlet == IEEE1394_BIB_QUAD_SZ || quadlet <
1550             IEEE1394_CONFIG_ROM_QUAD_SZ);
1551 
1552         locked = freecmd = done = 1;
1553         cmdret = S1394_HCMD_NODE_EXPECT_MORE;
1554 
1555         update_devinfo = 0;
1556 
1557         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
1558                 TNF_PROBE_3(s1394_br_thread_handle_cmd_phase2,
1559                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
1560                     "unable to lock tree", tnf_int, node_num, node_num,
1561                     tnf_int, quadlet, quadlet);
1562                 locked = 0;
1563                 goto bail;
1564         }
1565 
1566         node = &hal->topology_tree[node_num];
1567 
1568         if (cmd->cmd_result == CMD1394_CMDSUCCESS) {
1569 
1570                 ASSERT(CFGROM_BIB_READ(node) == B_TRUE);
1571 
1572                 node->cfgrom[quadlet] = data;
1573 
1574                 if (s1394_calc_next_quad(hal, node, quadlet, &quadlet) != 0) {
1575                         /*
1576                          * Done with this node. Mark config rom valid and
1577                          * update the devinfo tree for this node.
1578                          */
1579                         TNF_PROBE_4_DEBUG(s1394_br_thread_handle_cmd_phase2,
1580                             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string, msg,
1581                             "all read", tnf_int, node_num, node->node_num,
1582                             tnf_opaque, cfgrom, node->cfgrom, tnf_int, quadlet,
1583                             quadlet);
1584 
1585                         node->cfgrom_valid_size = quadlet + 1;
1586                         if (s1394_valid_cfgrom(hal, node) == B_TRUE) {
1587                                 SET_CFGROM_ALL_READ(node);
1588                                 update_devinfo++;
1589                         } else {
1590                                 s1394_free_cfgrom(hal, node,
1591                                     S1394_FREE_CFGROM_BOTH);
1592                         }
1593                 } else {
1594                         CFGROM_GET_READ_DELAY(node, readdelay);
1595                         SETUP_QUAD_READ(node, 1, quadlet, 1);
1596                         s1394_unlock_tree(hal);
1597                         CFGROM_READ_PAUSE(readdelay);
1598                         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
1599                                 locked = 0;
1600                                 TNF_PROBE_3(s1394_br_thread_handle_cmd_phase2,
1601                                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string,
1602                                     msg, "unable to relock the tree",
1603                                     tnf_int, node_num, node->node_num,
1604                                     tnf_int, quadlet, quadlet);
1605                         } else if (s1394_read_config_quadlet(hal, cmd,
1606                             &status) != DDI_SUCCESS) {
1607                                 /* give up on this guy */
1608                                 TNF_PROBE_3(s1394_br_thread_handle_cmd_phase2,
1609                                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string,
1610                                     msg, "cannot start quadlet read", tnf_int,
1611                                     node_num, node_num, tnf_int, quadlet,
1612                                     quadlet);
1613 
1614                                 if ((status & S1394_CMD_INFLIGHT) != 0) {
1615                                         freecmd = 0;
1616                                 }
1617                                 if ((status & S1394_LOCK_FAILED) != 0) {
1618                                         locked = 0;
1619                                 } else {
1620                                         node->cfgrom_valid_size = quadlet;
1621                                         if (s1394_valid_cfgrom(hal, node) ==
1622                                             B_TRUE) {
1623                                                 SET_CFGROM_ALL_READ(node);
1624                                                 update_devinfo++;
1625                                         } else {
1626                                                 s1394_free_cfgrom(hal, node,
1627                                                     S1394_FREE_CFGROM_BOTH);
1628                                         }
1629                                 }
1630                         } else {
1631                                 /* successfully started next read */
1632                                 done = 0;
1633                                 freecmd = 0;
1634                         }
1635                 }
1636         } else {
1637                 node->cfgrom_read_fails++;
1638                 BUMP_CFGROM_READ_DELAY(node);
1639 
1640                 /* retry if not too many failures */
1641                 if (node->cfgrom_read_fails < s1394_cfgrom_read_retry_cnt) {
1642                         CFGROM_GET_READ_DELAY(node, readdelay);
1643                         s1394_unlock_tree(hal);
1644                         SETUP_QUAD_READ(node, 0, quadlet, 1);
1645                         CFGROM_READ_PAUSE(readdelay);
1646                         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
1647                                 locked = 0;
1648                                 TNF_PROBE_3(s1394_br_thread_handle_cmd_phase2,
1649                                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string,
1650                                     msg, "unable to relock for reread",
1651                                     tnf_int, node_num, node->node_num,
1652                                     tnf_int, quadlet, quadlet);
1653                         } else if (s1394_read_config_quadlet(hal, cmd,
1654                             &status) != DDI_SUCCESS) {
1655                                 if ((status & S1394_CMD_INFLIGHT) != 0) {
1656                                         freecmd = 0;
1657                                 }
1658                                 if ((status & S1394_LOCK_FAILED) != 0) {
1659                                         locked = 0;
1660                                 } else {
1661                                         /* stop further reads */
1662                                         TNF_PROBE_4(
1663                                             s1394_br_thread_handle_cmd_phase2,
1664                                             S1394_TNF_SL_HOTPLUG_ERROR, "",
1665                                             tnf_string, msg, "unable to retry",
1666                                             tnf_int, node_num, node->node_num,
1667                                             tnf_int, quadlet, quadlet,
1668                                             tnf_opaque, cfgrom, node->cfgrom);
1669                                         node->cfgrom_valid_size = quadlet + 1;
1670                                         if (s1394_valid_cfgrom(hal, node) ==
1671                                             B_TRUE) {
1672                                                 SET_CFGROM_ALL_READ(node);
1673                                                 update_devinfo++;
1674                                         } else {
1675                                                 s1394_free_cfgrom(hal, node,
1676                                                     S1394_FREE_CFGROM_BOTH);
1677                                         }
1678                                 }
1679                         } else {
1680                                 /* successfully started next read */
1681                                 done = 0;
1682                                 freecmd = 0;
1683                         }
1684                 } else {
1685 
1686                         TNF_PROBE_4(s1394_br_thread_handle_cmd_phase2,
1687                             S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
1688                             "retries exceeded", tnf_int, node_num, node_num,
1689                             tnf_int, quadlet, quadlet, tnf_opaque, cfgrom,
1690                             node->cfgrom);
1691 
1692                         node->cfgrom_valid_size = quadlet + 1;
1693                         if (s1394_valid_cfgrom(hal, node) == B_TRUE) {
1694                                 SET_CFGROM_ALL_READ(node);
1695                                 update_devinfo++;
1696                         } else {
1697                                 s1394_free_cfgrom(hal, node,
1698                                     S1394_FREE_CFGROM_BOTH);
1699                         }
1700                 }
1701         }
1702 bail:
1703         if (freecmd) {
1704                 (void) s1394_free_cmd(hal, &cmd);
1705         }
1706 
1707         if (done) {
1708                 cmdret = S1394_HCMD_NODE_DONE;
1709                 TNF_PROBE_2_DEBUG(s1394_br_thread_handle_cmd_phase2,
1710                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string, msg,
1711                     "done with a node", tnf_int, node_num, node_num);
1712         }
1713 
1714         if (update_devinfo) {
1715                 ASSERT(locked);
1716                 /*
1717                  * s1394_update_devinfo_tree() drops and reacquires the
1718                  * topology_tree_mutex. If tree lock fails, it returns
1719                  * a DDI_FAILURE. Set locked to 0 so in this case so that
1720                  * we will return S1394_HCMD_LOCK_FAILED below
1721                  */
1722                 if (s1394_update_devinfo_tree(hal, node) != DDI_SUCCESS) {
1723                         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
1724                         locked = 0;
1725                         TNF_PROBE_2(s1394_br_thread_handle_cmd_phase2,
1726                             S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
1727                             "update devinfo returned failure", tnf_int,
1728                             node_num, node_num);
1729                 }
1730         }
1731 
1732         /* if we are bailing out because locking failed, locked == 0 */
1733         if (locked == 0)
1734                 cmdret = S1394_HCMD_LOCK_FAILED;
1735         else
1736                 s1394_unlock_tree(hal);
1737 
1738         TNF_PROBE_1_DEBUG(s1394_br_thread_handle_cmd_phase2_exit,
1739             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_int, cmdret, (int)cmdret);
1740 
1741         return (cmdret);
1742 }
1743 
1744 /*
1745  * s1394_read_config_quadlet()
1746  *    Starts the reads of a config quadlet (deduced cmd_addr).  Returns
1747  *    DDI_SUCCESS if the read was started with no errors, else DDI_FAILURE
1748  *    is returned, with status indicating the reason for the failure(s).
1749  */
1750 static int
1751 s1394_read_config_quadlet(s1394_hal_t *hal, cmd1394_cmd_t *cmd,
1752     s1394_status_t *status)
1753 {
1754         s1394_node_t *node;
1755         int ret, err, node_num, quadlet;
1756 
1757         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
1758         node_num = IEEE1394_ADDR_PHY_ID(cmd->cmd_addr);
1759         node = &hal->topology_tree[node_num];
1760         quadlet = node->cfgrom_quad_to_read;
1761 
1762         TNF_PROBE_2_DEBUG(s1394_read_config_quadlet_enter,
1763             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_uint, node_num, node_num,
1764             tnf_uint, quadlet, quadlet);
1765 
1766         /* Calculate the 64-bit address */
1767         QUAD_TO_CFGROM_ADDR(IEEE1394_LOCAL_BUS, node_num, quadlet,
1768             cmd->cmd_addr);
1769 
1770         *status = S1394_NOSTATUS;
1771 
1772         ret = s1394_setup_asynch_command(hal, NULL, cmd, S1394_CMD_READ, &err);
1773 
1774         if (ret != DDI_SUCCESS) {
1775                 *status |= S1394_UNKNOWN;
1776                 ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
1777                 TNF_PROBE_3(s1394_read_config_quadlet,
1778                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
1779                     "failure from setup asynch command", tnf_uint, node_num,
1780                     node_num, tnf_uint, quadlet, quadlet);
1781                 TNF_PROBE_0_DEBUG(s1394_read_config_quadlet_exit,
1782                     S1394_TNF_SL_HOTPLUG_STACK, "");
1783                 return (DDI_FAILURE);
1784         }
1785 
1786         s1394_unlock_tree(hal);
1787         ret = DDI_SUCCESS;
1788         /* Send the command out */
1789         if (s1394_xfer_asynch_command(hal, cmd, &err) == DDI_SUCCESS) {
1790                 /* Callers can expect a callback now */
1791                 *status |= S1394_CMD_INFLIGHT;
1792         } else {
1793 
1794                 s1394_cmd_priv_t *s_priv;
1795 
1796                 TNF_PROBE_3(s1394_read_config_quadlet,
1797                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
1798                     "failure from xfer asynch command",
1799                     tnf_int, quadlet, quadlet, tnf_int, node_num, node_num);
1800 
1801                 /* Remove from queue */
1802                 s1394_remove_q_asynch_cmd(hal, cmd);
1803                 s_priv = S1394_GET_CMD_PRIV(cmd);
1804 
1805                 s_priv->cmd_in_use = B_FALSE;
1806 
1807                 *status |= S1394_XFER_FAILED;
1808                 ret = DDI_FAILURE;
1809         }
1810 
1811         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
1812                 *status |= S1394_LOCK_FAILED;
1813                 ret = DDI_FAILURE;
1814                 TNF_PROBE_1(s1394_read_config_quadlet,
1815                     S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
1816                     "unable to relock the tree");
1817         }
1818 
1819         TNF_PROBE_0_DEBUG(s1394_read_config_quadlet_exit,
1820             S1394_TNF_SL_HOTPLUG_STACK, "");
1821 
1822         return (ret);
1823 }
1824 
1825 /*
1826  * s1394_cfgrom_read_callback()
1827  *    callback routine for config rom reads. Frees the command if it failed
1828  *    due to bus reset else appends the command to the completion queue
1829  *    and signals the completion queue cv.
1830  */
1831 static void
1832 s1394_cfgrom_read_callback(cmd1394_cmd_t *cmd)
1833 {
1834         cmd1394_cmd_t *tcmd;
1835         s1394_cmd_priv_t *s_priv;
1836         s1394_hal_t *hal;
1837 
1838 #if defined(DEBUG)
1839         uint32_t node_num, quadlet, data;
1840 #endif
1841 
1842         TNF_PROBE_0_DEBUG(s1394_cfgrom_read_callback_enter,
1843             S1394_TNF_SL_HOTPLUG_STACK, "");
1844 
1845         /* Get the Services Layer private area */
1846         s_priv = S1394_GET_CMD_PRIV(cmd);
1847 
1848         hal = (s1394_hal_t *)s_priv->sent_on_hal;
1849 
1850 #if defined(DEBUG)
1851 
1852         s1394_get_quad_info(cmd, &node_num, &quadlet, &data);
1853 
1854         TNF_PROBE_5_DEBUG(s1394_cfgrom_read_callback,
1855             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_uint, gen, cmd->bus_generation,
1856             tnf_int, quadlet, quadlet,
1857             tnf_int, node_num, node_num,
1858             tnf_int, data, data, tnf_int, result, cmd->cmd_result);
1859 #endif
1860 
1861         if (cmd->cmd_result == CMD1394_EBUSRESET) {
1862                 (void) s1394_free_cmd(hal, (cmd1394_cmd_t **)&cmd);
1863         } else {
1864                 mutex_enter(&hal->br_cmplq_mutex);
1865 
1866                 /* Put the command on completion queue */
1867                 s_priv->cmd_priv_next = NULL;
1868                 if ((tcmd = hal->br_cmplq_tail) != NULL) {
1869                         s_priv = S1394_GET_CMD_PRIV(tcmd);
1870 
1871                         s_priv->cmd_priv_next = cmd;
1872                 }
1873 
1874                 hal->br_cmplq_tail = cmd;
1875 
1876                 if (hal->br_cmplq_head == NULL)
1877                         hal->br_cmplq_head = cmd;
1878 
1879                 cv_signal(&hal->br_cmplq_cv);
1880                 mutex_exit(&hal->br_cmplq_mutex);
1881         }
1882 
1883         TNF_PROBE_0_DEBUG(s1394_cfgrom_read_callback_exit,
1884             S1394_TNF_SL_HOTPLUG_STACK, "");
1885 }
1886 
1887 /*
1888  * s1394_cfgrom_parse_unit_dir()
1889  *    Parses the unit directory passed in and returns reg[2...5] of reg
1890  *    property (see 1275 binding for reg property defintion). Currently,
1891  *    returns 0 for all the values since none of the existing devices implement
1892  *    this and future devices, per P1212r, need a binding change.
1893  */
1894 /* ARGSUSED */
1895 void
1896 s1394_cfgrom_parse_unit_dir(uint32_t *unit_dir, uint32_t *addr_hi,
1897     uint32_t *addr_lo, uint32_t *size_hi, uint32_t *size_lo)
1898 {
1899         TNF_PROBE_0_DEBUG(s1394_cfgrom_parse_unit_dir_enter,
1900             S1394_TNF_SL_HOTPLUG_STACK, "");
1901         *addr_hi = *addr_lo = *size_hi = *size_lo = 0;
1902         TNF_PROBE_0_DEBUG(s1394_cfgrom_parse_unit_dir_exit,
1903             S1394_TNF_SL_HOTPLUG_STACK, "");
1904 }
1905 
1906 /*
1907  * s1394_get_quad_info()
1908  *    Helper routine that picks apart the various fields of a 1394 address
1909  */
1910 static void
1911 s1394_get_quad_info(cmd1394_cmd_t *cmd, uint32_t *node_num, uint32_t *quadlet,
1912     uint32_t *data)
1913 {
1914         uint64_t addr;
1915 
1916         TNF_PROBE_0_DEBUG(s1394_get_quad_info_enter,
1917             S1394_TNF_SL_HOTPLUG_STACK, "");
1918 
1919         addr = cmd->cmd_addr;
1920         *node_num = IEEE1394_ADDR_PHY_ID(addr);
1921         *quadlet = ((addr & IEEE1394_ADDR_OFFSET_MASK) -
1922             IEEE1394_CONFIG_ROM_ADDR);
1923         *quadlet = (*quadlet >> 2);
1924         *data = T1394_DATA32(cmd->cmd_u.q.quadlet_data);
1925 
1926         TNF_PROBE_0_DEBUG(s1394_get_quad_info_exit,
1927             S1394_TNF_SL_HOTPLUG_STACK, "");
1928 }
1929 
1930 /*
1931  * s1394_match_GUID()
1932  *    attempts to match nnode (which is in the current topology tree) with
1933  *    a node in the old topology tree by comparing GUIDs. If a match is found
1934  *    the old_node field of the current node and cur_node field of the old
1935  *    are set point to each other. Also, this routine makes both the nodes
1936  *    point at the same config rom.  If unable to relock the tree, returns
1937  *    DDI_FAILURE, else returns DDI_SUCCESS.
1938  */
1939 static int
1940 s1394_match_GUID(s1394_hal_t *hal, s1394_node_t *nnode)
1941 {
1942         int old_node;
1943         int gen_changed;
1944         uint32_t old_a, old_b;
1945         uint32_t new_a, new_b;
1946         s1394_node_t *onode;
1947         s1394_target_t *t;
1948         int     ret = DDI_SUCCESS;
1949 
1950         TNF_PROBE_0_DEBUG(s1394_match_GUID_enter, S1394_TNF_SL_HOTPLUG_STACK,
1951             "");
1952 
1953         ASSERT(nnode->cfgrom != NULL);
1954         ASSERT(CFGROM_BIB_READ(nnode));
1955 
1956         new_a = nnode->node_guid_hi;
1957         new_b = nnode->node_guid_lo;
1958 
1959         for (old_node = 0; old_node < hal->old_number_of_nodes; old_node++) {
1960 
1961                 onode = &hal->old_tree[old_node];
1962                 if (onode->cfgrom == NULL || CFGROM_BIB_READ(onode) == B_FALSE)
1963                         continue;
1964 
1965                 old_a = onode->node_guid_hi;
1966                 old_b = onode->node_guid_lo;
1967 
1968                 if ((old_a == new_a) && (old_b == new_b)) {
1969 
1970                         if (NODE_MATCHED(onode) == B_TRUE) {
1971                                 TNF_PROBE_4(s1394_match_GUID_duplicate,
1972                                     S1394_TNF_SL_HOTPLUG_ERROR, "",
1973                                     tnf_uint, guid_hi, old_a,
1974                                     tnf_uint, guid_lo, old_b,
1975                                     tnf_uint, old_node_num, old_node,
1976                                     tnf_uint, node_num, nnode->node_num);
1977                                 cmn_err(CE_NOTE, "!Duplicate GUIDs: %08x%08x",
1978                                     old_a, old_b);
1979                                 /* offline the new node that last matched */
1980                                 ret = s1394_offline_node(hal, onode->cur_node);
1981                                 /* and make the current new node invalid */
1982                                 ASSERT(CFGROM_NEW_ALLOC(nnode) == B_TRUE);
1983                                 s1394_free_cfgrom(hal, nnode,
1984                                     S1394_FREE_CFGROM_NEW);
1985                                 break;
1986                         }
1987 
1988                         /*
1989                          * If there is indeed a cfgrom gen change,
1990                          * CFGROM_GEN_CHANGED() will be set iff we are matching
1991                          * tree nodes. Otherwise, CONFIG_ROM_GEN(old) !=
1992                          * CONFIG_ROM_GEN(new).
1993                          */
1994                         if (CFGROM_GEN_CHANGED(nnode) == B_TRUE ||
1995                             (CONFIG_ROM_GEN(onode->cfgrom) !=
1996                             CONFIG_ROM_GEN(nnode->cfgrom))) {
1997                                 gen_changed = 1;
1998                                 TNF_PROBE_4_DEBUG(s1394_match_GUID_gen_change,
1999                                     S1394_TNF_SL_HOTPLUG_STACK, "",
2000                                     tnf_opaque, old_cfgrom, onode->cfgrom,
2001                                     tnf_int, old_gen,
2002                                     CONFIG_ROM_GEN(onode->cfgrom), tnf_opaque,
2003                                     cfgrom, nnode->cfgrom, tnf_int, new_gen,
2004                                     CONFIG_ROM_GEN(nnode->cfgrom));
2005                         } else {
2006                                 gen_changed = 0;
2007                         }
2008 
2009                         onode->cur_node = nnode;
2010                         nnode->old_node = onode;
2011                         nnode->node_state = onode->node_state;
2012                         SET_NODE_VISITED(onode);
2013                         SET_NODE_MATCHED(onode);
2014                         SET_NODE_MATCHED(nnode);
2015                         /*
2016                          * If generations changed, need to offline any targets
2017                          * hanging off the old node, prior to freeing up old
2018                          * cfgrom. If the generations didn't change, we can
2019                          * free up the new config rom and copy all info from
2020                          * the old node (this helps in picking up further
2021                          * reads from where the last generation left off).
2022                          */
2023                         if (gen_changed == 1) {
2024                                 if (s1394_offline_node(hal, onode)) {
2025                                         ret = DDI_FAILURE;
2026                                         break;
2027                                 }
2028                                 TNF_PROBE_2(s1394_match_GUID_gen_freecfg,
2029                                     S1394_TNF_SL_HOTPLUG_STACK, "",
2030                                     tnf_opaque, old_cfgrom, onode->cfgrom,
2031                                     tnf_opaque, new_cfgrom, nnode->cfgrom);
2032                                 s1394_free_cfgrom(hal, onode,
2033                                     S1394_FREE_CFGROM_OLD);
2034                                 CLEAR_CFGROM_PARSED(nnode);
2035                                 CLEAR_CFGROM_NEW_ALLOC(nnode);
2036                                 CLEAR_CFGROM_NEW_ALLOC(onode);
2037                                 onode->cfgrom = nnode->cfgrom;
2038                                 /* done */
2039                                 break;
2040                         }
2041 
2042                         /*
2043                          * Free up cfgrom memory in the new_node and
2044                          * point it at the same config rom as the old one.
2045                          */
2046                         if (onode->cfgrom != nnode->cfgrom) {
2047 
2048                                 TNF_PROBE_5_DEBUG(s1394_match_GUID,
2049                                     S1394_TNF_SL_HOTPLUG_STACK, "",
2050                                     tnf_int, node_num, nnode->node_num,
2051                                     tnf_opaque, cfgrom, nnode->cfgrom,
2052                                     tnf_int, old_node_num, old_node,
2053                                     tnf_opaque, old_cfgrom, onode->cfgrom,
2054                                     tnf_uint, cfgrom_state,
2055                                     nnode->cfgrom_state);
2056 
2057                                 ASSERT(CFGROM_NEW_ALLOC(nnode) == B_TRUE);
2058                                 s1394_free_cfgrom(hal, nnode,
2059                                     S1394_FREE_CFGROM_NEW);
2060                         }
2061                         nnode->cfgrom = onode->cfgrom;
2062                         nnode->cfgrom_state = onode->cfgrom_state;
2063                         nnode->cfgrom_valid_size = onode->cfgrom_valid_size;
2064                         nnode->cfgrom_size = onode->cfgrom_size;
2065                         nnode->cfgrom_quad_to_read = onode->cfgrom_quad_to_read;
2066                         bcopy(onode->dir_stack, nnode->dir_stack,
2067                             offsetof(s1394_node_t, cfgrom_quad_to_read) -
2068                             offsetof(s1394_node_t, dir_stack));
2069                         CLEAR_CFGROM_NEW_ALLOC(nnode);
2070                         CLEAR_CFGROM_NEW_ALLOC(onode);
2071 
2072                         if (CFGROM_PARSED(nnode) == B_TRUE) {
2073                                 rw_enter(&hal->target_list_rwlock, RW_WRITER);
2074                                 /* Update the target list */
2075                                 if ((t = onode->target_list) != NULL) {
2076                                         nnode->target_list = t;
2077                                         while (t != NULL) {
2078                                                 t->on_node = nnode;
2079                                                 t = t->target_sibling;
2080                                         }
2081                                 }
2082                                 rw_exit(&hal->target_list_rwlock);
2083                         }
2084                         break;
2085                 }
2086         }
2087 
2088         TNF_PROBE_0_DEBUG(s1394_match_GUID_exit, S1394_TNF_SL_HOTPLUG_STACK,
2089             "");
2090 
2091         return (ret);
2092 }
2093 
2094 /*
2095  * s1394_match_all_GUIDs()
2096  *    attempt to match each node in the current topology tree with the a
2097  *    node in the old topology tree.  If unable to relock the tree, returns
2098  *    DDI_FAILURE, else returns DDI_SUCCESS.
2099  */
2100 static int
2101 s1394_match_all_GUIDs(s1394_hal_t *hal)
2102 {
2103         int node;
2104         int ret = DDI_SUCCESS;
2105         s1394_node_t *nnode;
2106 
2107         TNF_PROBE_0_DEBUG(s1394_match_all_GUIDs_enter,
2108             S1394_TNF_SL_HOTPLUG_STACK, "");
2109 
2110         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
2111 
2112         for (node = 0; node < hal->number_of_nodes; node++) {
2113                 nnode = &hal->topology_tree[node];
2114                 if (LINK_ACTIVE(nnode) == B_FALSE || CFGROM_BIB_READ(nnode) ==
2115                     B_FALSE)
2116                         continue;
2117                 if (NODE_MATCHED(nnode)) {
2118                         /*
2119                          * Skip if node matched. If config rom generations
2120                          * changed, we want to call s1394_match_GUID() even
2121                          * if the nodes matched.
2122                          */
2123                         int gen_changed;
2124                         s1394_node_t *onode = nnode->old_node;
2125 
2126                         gen_changed = (onode && onode->cfgrom &&
2127                             CONFIG_ROM_GEN(onode->cfgrom) != CONFIG_ROM_GEN(
2128                             nnode->cfgrom)) ? 1 : 0;
2129 
2130                         if (CFGROM_GEN_CHANGED(nnode) == 0 && gen_changed == 0)
2131                                 continue;
2132                 }
2133 
2134                 if (s1394_match_GUID(hal, nnode) == DDI_FAILURE) {
2135                         ret = DDI_FAILURE;
2136                 }
2137         }
2138 
2139         TNF_PROBE_0_DEBUG(s1394_match_all_GUIDs_exit,
2140             S1394_TNF_SL_HOTPLUG_STACK, "");
2141 
2142         return (ret);
2143 }
2144 
2145 /*
2146  * s1394_valid_cfgrom()
2147  *    Performs crc check on the config rom. Returns B_TRUE if config rom has
2148  *    good CRC else returns B_FALSE.
2149  */
2150 /* ARGSUSED */
2151 boolean_t
2152 s1394_valid_cfgrom(s1394_hal_t *hal, s1394_node_t *node)
2153 {
2154         uint32_t crc_len, crc_value, CRC, CRC_old, quad0;
2155 
2156         TNF_PROBE_0_DEBUG(s1394_valid_cfgrom_enter, S1394_TNF_SL_HOTPLUG_STACK,
2157             "");
2158 
2159         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
2160         ASSERT(node->cfgrom);
2161 
2162         if (s1394_enable_crc_validation == 0) {
2163                 TNF_PROBE_1_DEBUG(s1394_valid_cfgrom_exit,
2164                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string, msg,
2165                     "validation turned off");
2166                 return (B_TRUE);
2167         }
2168 
2169         quad0 = node->cfgrom[0];
2170         crc_len = (quad0 >> IEEE1394_CFG_ROM_CRC_LEN_SHIFT) &
2171             IEEE1394_CFG_ROM_CRC_LEN_MASK;
2172         crc_value = quad0 & IEEE1394_CFG_ROM_CRC_VALUE_MASK;
2173 
2174         if (node->cfgrom_valid_size < crc_len + 1) {
2175                 TNF_PROBE_4(s1394_valid_cfgrom_not_enough,
2176                     S1394_TNF_SL_HOTPLUG_ERROR, "",
2177                     tnf_uint, node_guid_hi, node->node_guid_hi,
2178                     tnf_uint, node_guid_lo, node->node_guid_lo,
2179                     tnf_uint, crc_len, crc_len,
2180                     tnf_uint, valid_size, node->cfgrom_valid_size);
2181                 TNF_PROBE_0_DEBUG(s1394_valid_cfgrom_exit,
2182                     S1394_TNF_SL_HOTPLUG_STACK, "");
2183                 return (B_FALSE);
2184         }
2185 
2186         CRC = s1394_CRC16(&node->cfgrom[1], crc_len);
2187 
2188         if (CRC != crc_value) {
2189                 CRC_old = s1394_CRC16_old(&node->cfgrom[1], crc_len);
2190                 if (CRC_old == crc_value) {
2191                         TNF_PROBE_4_DEBUG(s1394_valid_cfgrom_busted_crc,
2192                             S1394_TNF_SL_HOTPLUG_ERROR, "",
2193                             tnf_uint, node_guid_hi, node->node_guid_hi,
2194                             tnf_uint, node_guid_lo, node->node_guid_lo,
2195                             tnf_uint, node_num, node->node_num,
2196                             tnf_uint, crc_len, crc_len);
2197                         TNF_PROBE_0_DEBUG(s1394_valid_cfgrom_exit,
2198                             S1394_TNF_SL_HOTPLUG_STACK, "");
2199                         return (B_TRUE);
2200                 }
2201 
2202                 cmn_err(CE_NOTE,
2203                     "!Bad CRC in config rom (node's GUID %08x%08x)",
2204                     node->node_guid_hi, node->node_guid_lo);
2205 
2206                 TNF_PROBE_5(s1394_valid_cfgrom_bad_crc,
2207                     S1394_TNF_SL_HOTPLUG_ERROR, "",
2208                     tnf_uint, node_guid_hi, node->node_guid_hi,
2209                     tnf_uint, node_guid_lo, node->node_guid_lo,
2210                     tnf_uint, crc_len, crc_len,
2211                     tnf_uint, crc, crc_value, tnf_uint, crc_computed, CRC);
2212                 TNF_PROBE_0_DEBUG(s1394_valid_cfgrom_exit,
2213                     S1394_TNF_SL_HOTPLUG_STACK, "");
2214                 return (B_FALSE);
2215         }
2216 
2217         TNF_PROBE_3_DEBUG(s1394_valid_cfgrom_exit, S1394_TNF_SL_HOTPLUG_STACK,
2218             "", tnf_uint, node_num, node->node_num, tnf_uint, crc_len, crc_len,
2219             tnf_uint, crc, crc_value);
2220 
2221         return (B_TRUE);
2222 }
2223 
2224 /*
2225  * s1394_valid_dir()
2226  *    Performs crc check on a directory.  Returns B_TRUE if dir has good CRC
2227  *    else returns B_FALSE.
2228  */
2229 /*ARGSUSED*/
2230 boolean_t
2231 s1394_valid_dir(s1394_hal_t *hal, s1394_node_t *node,
2232     uint32_t key, uint32_t *dir)
2233 {
2234         uint32_t dir_len, crc_value, CRC, CRC_old, quad0;
2235 
2236         TNF_PROBE_0_DEBUG(s1394_valid_dir_enter, S1394_TNF_SL_HOTPLUG_STACK,
2237             "");
2238 
2239         /*
2240          * Ideally, we would like to do crc validations for the entire cfgrom
2241          * as well as the individual directories. However, we have seen devices
2242          * that have valid directories but busted cfgrom crc and devices that
2243          * have bad crcs in directories as well as for the entire cfgrom. This
2244          * is sad, but unfortunately, real world!
2245          */
2246         if (s1394_enable_crc_validation == 0) {
2247                 TNF_PROBE_1_DEBUG(s1394_valid_dir_exit,
2248                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string, msg,
2249                     "validation turned off");
2250                 return (B_TRUE);
2251         }
2252 
2253         quad0 = dir[0];
2254 
2255         dir_len = IEEE1212_DIR_LEN(quad0);
2256         crc_value = IEEE1212_DIR_CRC(quad0);
2257 
2258         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
2259 
2260         CRC = s1394_CRC16(&dir[1], dir_len);
2261 
2262         if (CRC != crc_value) {
2263                 CRC_old = s1394_CRC16_old(&dir[1], dir_len);
2264                 if (CRC_old == crc_value) {
2265                         TNF_PROBE_5_DEBUG(s1394_valid_dir_crc_old,
2266                             S1394_TNF_SL_HOTPLUG_STACK, "",
2267                             tnf_uint, node_guid_hi, node->node_guid_hi,
2268                             tnf_uint, node_guid_lo, node->node_guid_lo,
2269                             tnf_uint, node_num, node->node_num,
2270                             tnf_uint, key, key, tnf_uint, dir_len, dir_len);
2271                         TNF_PROBE_0_DEBUG(s1394_valid_dir_exit,
2272                             S1394_TNF_SL_HOTPLUG_STACK, "");
2273                         return (B_TRUE);
2274                 }
2275 
2276                 TNF_PROBE_5(s1394_valid_dir_bad_crc,
2277                     S1394_TNF_SL_HOTPLUG_STACK, "",
2278                     tnf_uint, node_guid_hi, node->node_guid_hi,
2279                     tnf_uint, node_guid_lo, node->node_guid_lo,
2280                     tnf_uint, node_num, node->node_num,
2281                     tnf_uint, key, key, tnf_uint, dir_len, dir_len);
2282 
2283                 TNF_PROBE_0_DEBUG(s1394_valid_dir_exit,
2284                             S1394_TNF_SL_HOTPLUG_STACK, "");
2285                 return (B_FALSE);
2286         }
2287 
2288         TNF_PROBE_4_DEBUG(s1394_valid_dir,
2289             S1394_TNF_SL_HOTPLUG_STACK, "",
2290             tnf_uint, node_guid_hi, node->node_guid_hi,
2291             tnf_uint, node_guid_lo, node->node_guid_lo,
2292             tnf_uint, node_num, node->node_num, tnf_uint, key, key);
2293 
2294         return (B_TRUE);
2295 }
2296 
2297 /*
2298  * s1394_become_bus_mgr()
2299  *    is a callback from a timeout() setup by the main br_thread.  After
2300  *    a bus reset, depending on the Bus Manager's incumbancy and the state
2301  *    of its abdicate bit, a timer of a certain length is set.  After this
2302  *    time expires, the local host may attempt to become the Bus Manager.
2303  *    This is done by sending a request to the current IRM on the bus.  The
2304  *    IRM holds the BUS_MANAGER_ID register.  Depending on whether or not
2305  *    the local host is already the IRM, we will send a request onto the
2306  *    1394 bus or call into the HAL.
2307  */
2308 static void
2309 s1394_become_bus_mgr(void *arg)
2310 {
2311         s1394_hal_t      *hal;
2312         s1394_cmd_priv_t *s_priv;
2313         cmd1394_cmd_t    *cmd;
2314         uint64_t         Bus_Mgr_ID_addr;
2315         uint32_t         hal_node_num;
2316         uint32_t         old_value;
2317         uint32_t         generation;
2318         uint_t           curr_bus_mgr;
2319         uint_t           bm_node;
2320         uint_t           IRM_node;
2321         int              err;
2322         int              ret;
2323 
2324         TNF_PROBE_0_DEBUG(s1394_become_bus_mgr_enter, S1394_TNF_SL_BR_STACK,
2325             "");
2326 
2327         hal = (s1394_hal_t *)arg;
2328 
2329         /* Lock the topology tree */
2330         mutex_enter(&hal->topology_tree_mutex);
2331 
2332         hal_node_num = IEEE1394_NODE_NUM(hal->node_id);
2333         generation   = hal->generation_count;
2334         IRM_node = hal->IRM_node;
2335 
2336         mutex_enter(&hal->bus_mgr_node_mutex);
2337         bm_node = hal->bus_mgr_node;
2338         mutex_exit(&hal->bus_mgr_node_mutex);
2339 
2340         /* Unlock the topology tree */
2341         mutex_exit(&hal->topology_tree_mutex);
2342 
2343         /* Make sure we aren't already the Bus Manager */
2344         if (bm_node != -1) {
2345                 TNF_PROBE_0_DEBUG(s1394_become_bus_mgr_exit,
2346                     S1394_TNF_SL_BR_STACK, "");
2347                 return;
2348         }
2349 
2350         /* Send compare-swap to BUS_MANAGER_ID */
2351         /* register on the Isoch Rsrc Mgr */
2352         if (IRM_node == hal_node_num) {
2353                 /* Local */
2354                 ret = HAL_CALL(hal).csr_cswap32(hal->halinfo.hal_private,
2355                     generation, (IEEE1394_SCSR_BUSMGR_ID &
2356                     IEEE1394_CSR_OFFSET_MASK), S1394_INVALID_NODE_NUM,
2357                     hal_node_num, &old_value);
2358                 if (ret != DDI_SUCCESS) {
2359                         TNF_PROBE_1(s1394_become_bus_mgr_error,
2360                             S1394_TNF_SL_BR_ERROR, "", tnf_string, msg,
2361                             "Error in cswap32");
2362                         TNF_PROBE_0_DEBUG(s1394_become_bus_mgr_exit,
2363                             S1394_TNF_SL_BR_STACK, "");
2364                         return;
2365                 }
2366                 curr_bus_mgr = IEEE1394_NODE_NUM(old_value);
2367 
2368                 mutex_enter(&hal->bus_mgr_node_mutex);
2369                 if ((curr_bus_mgr == S1394_INVALID_NODE_NUM) ||
2370                     (curr_bus_mgr == hal_node_num)) {
2371                         hal->bus_mgr_node = hal_node_num;
2372                         hal->incumbent_bus_mgr = B_TRUE;
2373                 } else {
2374                         hal->bus_mgr_node = curr_bus_mgr;
2375                         hal->incumbent_bus_mgr = B_FALSE;
2376                 }
2377                 cv_signal(&hal->bus_mgr_node_cv);
2378                 mutex_exit(&hal->bus_mgr_node_mutex);
2379 
2380         } else {
2381                 /* Remote */
2382                 if (s1394_alloc_cmd(hal, T1394_ALLOC_CMD_NOSLEEP, &cmd) !=
2383                     DDI_SUCCESS) {
2384                         TNF_PROBE_1(s1394_become_bus_mgr_error,
2385                             S1394_TNF_SL_BR_ERROR, "", tnf_string, msg,
2386                             "Error in s1394_alloc_cmd()");
2387                         TNF_PROBE_0_DEBUG(s1394_become_bus_mgr_exit,
2388                             S1394_TNF_SL_BR_STACK, "");
2389                         return;
2390                 }
2391 
2392                 cmd->cmd_options        = (CMD1394_CANCEL_ON_BUS_RESET |
2393                     CMD1394_OVERRIDE_ADDR);
2394                 cmd->cmd_type                   = CMD1394_ASYNCH_LOCK_32;
2395                 cmd->completion_callback   = s1394_become_bus_mgr_callback;
2396                 Bus_Mgr_ID_addr            = (IEEE1394_ADDR_BUS_ID_MASK |
2397                     IEEE1394_SCSR_BUSMGR_ID) |
2398                     (((uint64_t)hal->IRM_node) << IEEE1394_ADDR_PHY_ID_SHIFT);
2399                 cmd->cmd_addr                   = Bus_Mgr_ID_addr;
2400                 cmd->bus_generation     = generation;
2401                 cmd->cmd_u.l32.arg_value   = T1394_DATA32(
2402                     S1394_INVALID_NODE_NUM);
2403                 cmd->cmd_u.l32.data_value  = T1394_DATA32(hal_node_num);
2404                 cmd->cmd_u.l32.num_retries = 0;
2405                 cmd->cmd_u.l32.lock_type   = CMD1394_LOCK_COMPARE_SWAP;
2406 
2407                 /* Get the Services Layer private area */
2408                 s_priv = S1394_GET_CMD_PRIV(cmd);
2409 
2410                 /* Lock the topology tree */
2411                 mutex_enter(&hal->topology_tree_mutex);
2412 
2413                 ret = s1394_setup_asynch_command(hal, NULL, cmd,
2414                     S1394_CMD_LOCK, &err);
2415 
2416                 /* Unlock the topology tree */
2417                 mutex_exit(&hal->topology_tree_mutex);
2418 
2419                 /* Command has now been put onto the queue! */
2420                 if (ret != DDI_SUCCESS) {
2421                         /* Need to free the command */
2422                         (void) s1394_free_cmd(hal, (cmd1394_cmd_t **)&cmd);
2423                         TNF_PROBE_1(s1394_become_bus_mgr_error,
2424                             S1394_TNF_SL_BR_ERROR, "", tnf_string, msg,
2425                             "Error in s1394_setup_asynch_command()");
2426                         TNF_PROBE_0_DEBUG(s1394_become_bus_mgr_exit,
2427                             S1394_TNF_SL_BR_STACK, "");
2428                         return;
2429                 }
2430 
2431                 /* Send the command out */
2432                 ret = s1394_xfer_asynch_command(hal, cmd, &err);
2433 
2434                 if (ret != DDI_SUCCESS) {
2435                         /* Remove cmd outstanding request Q */
2436                         s1394_remove_q_asynch_cmd(hal, cmd);
2437 
2438                         s_priv->cmd_in_use = B_FALSE;
2439 
2440                         mutex_enter(&hal->bus_mgr_node_mutex);
2441 
2442                         /* Don't know who the bus_mgr is */
2443                         hal->bus_mgr_node = S1394_INVALID_NODE_NUM;
2444                         hal->incumbent_bus_mgr = B_FALSE;
2445 
2446                         cv_signal(&hal->bus_mgr_node_cv);
2447                         mutex_exit(&hal->bus_mgr_node_mutex);
2448 
2449                         /* Need to free the command */
2450                         (void) s1394_free_cmd(hal, (cmd1394_cmd_t **)&cmd);
2451                 }
2452         }
2453 
2454         TNF_PROBE_0_DEBUG(s1394_become_bus_mgr_exit, S1394_TNF_SL_BR_STACK,
2455             "");
2456 }
2457 
2458 /*
2459  * s1394_become_bus_mgr_callback()
2460  *    is the callback used by s1394_become_bus_mgr() when it is necessary
2461  *    to send the Bus Manager request to a remote IRM.  After the completion
2462  *    of the compare-swap request, this routine looks at the "old_value"
2463  *    in the request to determine whether or not it has become the Bus
2464  *    Manager for the current generation.  It sets the bus_mgr_node and
2465  *    incumbent_bus_mgr fields to their appropriate values.
2466  */
2467 static void
2468 s1394_become_bus_mgr_callback(cmd1394_cmd_t *cmd)
2469 {
2470         s1394_cmd_priv_t *s_priv;
2471         s1394_hal_t *hal;
2472         uint32_t hal_node_num;
2473         uint32_t temp;
2474         uint_t curr_bus_mgr;
2475 
2476         TNF_PROBE_0_DEBUG(s1394_become_bus_mgr_callback_enter,
2477             S1394_TNF_SL_BR_STACK, "");
2478 
2479         /* Get the Services Layer private area */
2480         s_priv = S1394_GET_CMD_PRIV(cmd);
2481 
2482         hal = (s1394_hal_t *)s_priv->sent_on_hal;
2483 
2484         /* Lock the topology tree */
2485         mutex_enter(&hal->topology_tree_mutex);
2486 
2487         hal_node_num = IEEE1394_NODE_NUM(hal->node_id);
2488 
2489         /* Was the command successful? */
2490         if (cmd->cmd_result == CMD1394_CMDSUCCESS) {
2491                 temp = T1394_DATA32(cmd->cmd_u.l32.old_value);
2492                 curr_bus_mgr = IEEE1394_NODE_NUM(temp);
2493                 mutex_enter(&hal->bus_mgr_node_mutex);
2494                 if ((curr_bus_mgr == S1394_INVALID_NODE_NUM) ||
2495                     (curr_bus_mgr == hal_node_num)) {
2496 
2497                         hal->bus_mgr_node = hal_node_num;
2498                         hal->incumbent_bus_mgr = B_TRUE;
2499 
2500                 } else {
2501                         hal->bus_mgr_node = curr_bus_mgr;
2502                         hal->incumbent_bus_mgr = B_FALSE;
2503                 }
2504                 cv_signal(&hal->bus_mgr_node_cv);
2505                 mutex_exit(&hal->bus_mgr_node_mutex);
2506 
2507         } else {
2508                 TNF_PROBE_2(s1394_become_bus_mgr_callback_error,
2509                     S1394_TNF_SL_BR_ERROR, "", tnf_string, msg,
2510                     "Error while attempting to become bus manager",
2511                     tnf_uint, status, cmd->cmd_result);
2512 
2513                 mutex_enter(&hal->bus_mgr_node_mutex);
2514 
2515                 /* Don't know who the bus_mgr is */
2516                 hal->bus_mgr_node = S1394_INVALID_NODE_NUM;
2517                 hal->incumbent_bus_mgr = B_FALSE;
2518 
2519                 cv_signal(&hal->bus_mgr_node_cv);
2520                 mutex_exit(&hal->bus_mgr_node_mutex);
2521         }
2522 
2523         /* Need to free the command */
2524         (void) s1394_free_cmd(hal, (cmd1394_cmd_t **)&cmd);
2525 
2526         /* Unlock the topology tree */
2527         mutex_exit(&hal->topology_tree_mutex);
2528 
2529         TNF_PROBE_0_DEBUG(s1394_become_bus_mgr_callback_exit,
2530             S1394_TNF_SL_BR_STACK, "");
2531 }
2532 
2533 /*
2534  * s1394_bus_mgr_processing()
2535  *    is called following "phase1" completion of reading Bus_Info_Blocks.
2536  *    Its purpose is to determine whether the local node is capable of
2537  *    becoming the Bus Manager (has the IRMC bit set) and if so to call
2538  *    the s1394_do_bus_mgr_processing() routine.
2539  *    NOTE: we overload DDI_FAILURE return value to mean jump back to
2540  *    the start of bus reset processing.
2541  */
2542 static int
2543 s1394_bus_mgr_processing(s1394_hal_t *hal)
2544 {
2545         int ret;
2546         int IRM_node_num;
2547 
2548         TNF_PROBE_0_DEBUG(s1394_bus_mgr_processing_enter,
2549             S1394_TNF_SL_BR_STACK, "");
2550 
2551         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
2552 
2553         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
2554                 return (DDI_FAILURE);
2555         }
2556         IRM_node_num = hal->IRM_node;
2557         s1394_unlock_tree(hal);
2558 
2559         ret = DDI_SUCCESS;
2560 
2561         /* If we are IRM capable, then do bus_mgr stuff... */
2562         if (hal->halinfo.bus_capabilities & IEEE1394_BIB_IRMC_MASK) {
2563                 /* If there is an IRM, then do bus_mgr stuff */
2564                 if (IRM_node_num != -1) {
2565                         if (s1394_do_bus_mgr_processing(hal))
2566                                 ret = DDI_FAILURE;
2567                 }
2568         }
2569 
2570         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
2571 
2572         TNF_PROBE_0_DEBUG(s1394_bus_mgr_processing_exit,
2573             S1394_TNF_SL_BR_STACK, "");
2574         return (ret);
2575 }
2576 
2577 /*
2578  * s1394_do_bus_mgr_processing()
2579  *    is used to perform those operations expected of the Bus Manager.
2580  *    After being called, s1394_do_bus_mgr_processing() looks at the value
2581  *    in bus_mgr_node and waits if it is -1 (Bus Manager has not been
2582  *    chosen yet).  Then, if there is more than one node on the 1394 bus,
2583  *    and we are either the Bus Manager or (if there is no Bus Manager)
2584  *    the IRM, it optimizes the gap_count and/or sets the cycle master's
2585  *    root holdoff bit (to ensure that the cycle master is/stays root).
2586  *
2587  *    NOTE: we overload DDI_FAILURE return value to mean jump back to
2588  *    the start of bus reset processing.
2589  */
2590 static int
2591 s1394_do_bus_mgr_processing(s1394_hal_t *hal)
2592 {
2593         int     ret;
2594         int     IRM_flags, hal_bus_mgr_node;
2595         int     IRM_node_num;
2596         uint_t  hal_node_num, number_of_nodes;
2597         int     new_root, new_gap_cnt;
2598 
2599         TNF_PROBE_0_DEBUG(s1394_do_bus_mgr_processing_enter,
2600             S1394_TNF_SL_BR_STACK, "");
2601 
2602         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
2603 
2604         /* Wait for Bus Manager to be determined */
2605         /* or a Bus Reset to happen */
2606         mutex_enter(&hal->bus_mgr_node_mutex);
2607         if (hal->bus_mgr_node == -1)
2608                 cv_wait(&hal->bus_mgr_node_cv, &hal->bus_mgr_node_mutex);
2609 
2610         /* Check if a BUS RESET has come while we've been waiting */
2611         mutex_enter(&hal->br_thread_mutex);
2612         if (hal->br_thread_ev_type & (BR_THR_CFGROM_SCAN | BR_THR_GO_AWAY)) {
2613 
2614                 mutex_exit(&hal->br_thread_mutex);
2615                 mutex_exit(&hal->bus_mgr_node_mutex);
2616 
2617                 TNF_PROBE_0_DEBUG(s1394_do_bus_mgr_processing_exit,
2618                     S1394_TNF_SL_BR_STACK, "");
2619                 return (1);
2620         }
2621         mutex_exit(&hal->br_thread_mutex);
2622 
2623         hal_bus_mgr_node = hal->bus_mgr_node;
2624         mutex_exit(&hal->bus_mgr_node_mutex);
2625 
2626         if (s1394_lock_tree(hal) != DDI_SUCCESS) {
2627                 return (1);
2628         }
2629         hal_node_num = IEEE1394_NODE_NUM(hal->node_id);
2630         IRM_node_num = hal->IRM_node;
2631         number_of_nodes = hal->number_of_nodes;
2632 
2633         ret = 0;
2634 
2635         /* If we are the bus_mgr or if there is no bus_mgr */
2636         /* the IRM and there is > 1 nodes on the bus */
2637         if ((number_of_nodes > 1) &&
2638             ((hal_bus_mgr_node == (int)hal_node_num) ||
2639                 ((hal_bus_mgr_node == S1394_INVALID_NODE_NUM) &&
2640                     (IRM_node_num == (int)hal_node_num)))) {
2641 
2642                 IRM_flags = 0;
2643 
2644                 /* Make sure the root node is cycle master capable */
2645                 if (!s1394_cycle_master_capable(hal)) {
2646                         /* Make the local node root */
2647                         new_root = hal_node_num;
2648                         IRM_flags = IRM_flags | ROOT_HOLDOFF;
2649 
2650                         /* If setting root, then optimize gap_count */
2651                         new_gap_cnt = hal->optimum_gap_count;
2652                         IRM_flags = IRM_flags | GAP_COUNT;
2653 
2654                 } else {
2655                         /* Make sure root's ROOT_HOLDOFF bit is set */
2656                         new_root = (number_of_nodes - 1);
2657                         IRM_flags = IRM_flags | ROOT_HOLDOFF;
2658                 }
2659                 if (hal->gap_count > hal->optimum_gap_count) {
2660                         /* Set the gap_count to optimum */
2661                         new_gap_cnt = hal->optimum_gap_count;
2662                         IRM_flags = IRM_flags | GAP_COUNT;
2663 
2664                 }
2665 
2666                 s1394_unlock_tree(hal);
2667 
2668                 if (IRM_flags) {
2669                         ret = s1394_do_phy_config_pkt(hal, new_root,
2670                             new_gap_cnt, IRM_flags);
2671                 }
2672                 TNF_PROBE_0_DEBUG(s1394_do_bus_mgr_processing_exit,
2673                     S1394_TNF_SL_BR_STACK, "");
2674                 return (ret);
2675         }
2676 
2677         s1394_unlock_tree(hal);
2678 
2679         TNF_PROBE_0_DEBUG(s1394_do_bus_mgr_processing_exit,
2680             S1394_TNF_SL_BR_STACK, "");
2681         return (ret);
2682 }
2683 
2684 /*
2685  * s1394_bus_mgr_timers_stop()
2686  *    Cancels bus manager timeouts
2687  */
2688 /*ARGSUSED*/
2689 static void
2690 s1394_bus_mgr_timers_stop(s1394_hal_t *hal, timeout_id_t *bus_mgr_query_tid,
2691     timeout_id_t *bus_mgr_tid)
2692 {
2693         TNF_PROBE_0_DEBUG(s1394_bus_mgr_timers_stop_enter,
2694             S1394_TNF_SL_BR_STACK, "");
2695 
2696         /* Cancel the Bus Mgr timeouts (if necessary) */
2697         if (*bus_mgr_tid != 0) {
2698                 (void) untimeout(*bus_mgr_tid);
2699                 *bus_mgr_tid = 0;
2700         }
2701         if (*bus_mgr_query_tid != 0) {
2702                 (void) untimeout(*bus_mgr_query_tid);
2703                 *bus_mgr_query_tid = 0;
2704         }
2705 
2706         TNF_PROBE_0_DEBUG(s1394_bus_mgr_timers_stop_exit,
2707             S1394_TNF_SL_BR_STACK, "");
2708 }
2709 
2710 /*
2711  * s1394_bus_mgr_timers_start()
2712  *    Starts bus manager timeouts if the hal is IRM capable.
2713  */
2714 static void
2715 s1394_bus_mgr_timers_start(s1394_hal_t *hal, timeout_id_t *bus_mgr_query_tid,
2716     timeout_id_t *bus_mgr_tid)
2717 {
2718         boolean_t incumbant;
2719         uint_t    hal_node_num;
2720         int       IRM_node_num;
2721 
2722         TNF_PROBE_0_DEBUG(s1394_bus_mgr_timers_start_enter,
2723             S1394_TNF_SL_BR_STACK, "");
2724 
2725         mutex_enter(&hal->topology_tree_mutex);
2726 
2727         IRM_node_num = hal->IRM_node;
2728         hal_node_num = hal->node_id;
2729 
2730         mutex_enter(&hal->bus_mgr_node_mutex);
2731         incumbant = hal->incumbent_bus_mgr;
2732         mutex_exit(&hal->bus_mgr_node_mutex);
2733 
2734         /* If we are IRM capable, then do bus_mgr stuff... */
2735         if (hal->halinfo.bus_capabilities & IEEE1394_BIB_IRMC_MASK) {
2736                 /*
2737                  * If we are the IRM, then wait 625ms
2738                  * before checking BUS_MANAGER_ID register
2739                  */
2740                 if (IRM_node_num == IEEE1394_NODE_NUM(hal_node_num)) {
2741 
2742                         TNF_PROBE_0_DEBUG(s1394_bus_mgr_timers_625ms,
2743                             S1394_TNF_SL_BR_STACK, "");
2744 
2745                         mutex_exit(&hal->topology_tree_mutex);
2746 
2747                         /* Wait 625ms, then check bus manager */
2748                         *bus_mgr_query_tid = timeout(s1394_become_bus_mgr,
2749                             hal, drv_usectohz(IEEE1394_BM_IRM_TIMEOUT));
2750 
2751                         mutex_enter(&hal->topology_tree_mutex);
2752                 }
2753 
2754                 /* If there is an IRM on the bus */
2755                 if (IRM_node_num != -1) {
2756                         if ((incumbant == B_TRUE) &&
2757                             (hal->abdicate_bus_mgr_bit == 0)) {
2758                                 mutex_exit(&hal->topology_tree_mutex);
2759 
2760                                 /* Try to become bus manager */
2761                                 s1394_become_bus_mgr(hal);
2762 
2763                                 mutex_enter(&hal->topology_tree_mutex);
2764                         } else {
2765                                 hal->abdicate_bus_mgr_bit = 0;
2766 
2767                                 TNF_PROBE_0_DEBUG(s1394_bus_mgr_timers_125ms,
2768                                     S1394_TNF_SL_BR_STACK, "");
2769 
2770                                 mutex_exit(&hal->topology_tree_mutex);
2771 
2772                                 /* Wait 125ms, then try to become bus manager */
2773                                 *bus_mgr_tid = timeout(s1394_become_bus_mgr,
2774                                     hal, drv_usectohz(
2775                                         IEEE1394_BM_INCUMBENT_TIMEOUT));
2776 
2777                                 mutex_enter(&hal->topology_tree_mutex);
2778                         }
2779                 } else {
2780                         mutex_enter(&hal->bus_mgr_node_mutex);
2781                         hal->incumbent_bus_mgr = B_FALSE;
2782                         mutex_exit(&hal->bus_mgr_node_mutex);
2783                 }
2784         }
2785 
2786         mutex_exit(&hal->topology_tree_mutex);
2787 
2788         TNF_PROBE_0_DEBUG(s1394_bus_mgr_timers_start_exit,
2789             S1394_TNF_SL_BR_STACK, "");
2790 }
2791 
2792 /*
2793  * s1394_get_maxpayload()
2794  *    is used to determine a device's maximum payload size.  That is to
2795  *    say, the largest packet that can be transmitted or received by the
2796  *    the target device given the current topological (speed) constraints
2797  *    and the constraints specified in the local host's and remote device's
2798  *    Config ROM (max_rec).  Caller must hold the topology_tree_mutex and
2799  *    the target_list_rwlock as an RW_READER (at least).
2800  */
2801 /*ARGSUSED*/
2802 void
2803 s1394_get_maxpayload(s1394_target_t *target, uint_t *dev_max_payload,
2804     uint_t *current_max_payload)
2805 {
2806         s1394_hal_t *hal;
2807         uint32_t bus_capabilities;
2808         uint32_t from_node;
2809         uint32_t to_node;
2810         uint_t local_max_rec;
2811         uint_t local_max_blk;
2812         uint_t max_rec;
2813         uint_t max_blk;
2814         uint_t curr_speed;
2815         uint_t speed_max_blk;
2816         uint_t temp;
2817 
2818         TNF_PROBE_0_DEBUG(s1394_get_maxpayload_enter,
2819             S1394_TNF_SL_HOTPLUG_STACK, "");
2820 
2821         /* Find the HAL this target resides on */
2822         hal = target->on_hal;
2823 
2824         /* Make sure we're holding the topology_tree_mutex */
2825         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
2826 
2827         /* Set dev_max_payload to local (HAL's) size */
2828         bus_capabilities = target->on_hal->halinfo.bus_capabilities;
2829         local_max_rec = (bus_capabilities & IEEE1394_BIB_MAXREC_MASK) >>
2830             IEEE1394_BIB_MAXREC_SHIFT;
2831         if ((local_max_rec > 0) && (local_max_rec < 14)) {
2832                 local_max_blk = 1 << (local_max_rec + 1);
2833         } else {
2834                 /* These are either unspecified or reserved */
2835                 local_max_blk = 4;
2836         }
2837 
2838         /* Is this target on a node? */
2839         if ((target->target_state & S1394_TARG_GONE) == 0 &&
2840             (target->on_node != NULL)) {
2841                 ASSERT(target->on_node->cfgrom != NULL);
2842 
2843                 bus_capabilities =
2844                     target->on_node->cfgrom[IEEE1212_NODE_CAP_QUAD];
2845                 max_rec = (bus_capabilities & IEEE1394_BIB_MAXREC_MASK) >>
2846                     IEEE1394_BIB_MAXREC_SHIFT;
2847 
2848                 if ((max_rec > 0) && (max_rec < 14)) {
2849                         max_blk = 1 << (max_rec + 1);
2850                 } else {
2851                         /* These are either unspecified or reserved */
2852                         max_blk = 4;
2853                 }
2854                 (*dev_max_payload) = max_blk;
2855 
2856                 from_node = IEEE1394_NODE_NUM(target->on_hal->node_id);
2857                 to_node = (target->on_node->node_num);
2858 
2859                 /* Speed is to be filled in from speed map */
2860                 curr_speed = (uint_t)s1394_speed_map_get(target->on_hal,
2861                     from_node, to_node);
2862                 speed_max_blk = 512 << curr_speed;
2863                 temp = (local_max_blk < max_blk) ? local_max_blk : max_blk;
2864                 (*current_max_payload) = (temp < speed_max_blk) ? temp :
2865                     speed_max_blk;
2866         } else {
2867                 /* Set dev_max_payload to local (HAL's) size */
2868                 (*dev_max_payload) = local_max_blk;
2869                 (*current_max_payload) = local_max_blk;
2870         }
2871 
2872         TNF_PROBE_0_DEBUG(s1394_get_maxpayload_exit,
2873             S1394_TNF_SL_HOTPLUG_STACK, "");
2874 }
2875 
2876 /*
2877  * s1394_cycle_master_capable()
2878  *    is used to determine whether or not the current root node on the
2879  *    1394 bus has its CMC-bit set in it Config ROM.  If not, then it
2880  *    is not capable of being cycle master and a new root node must be
2881  *    selected.
2882  */
2883 static int
2884 s1394_cycle_master_capable(s1394_hal_t *hal)
2885 {
2886         s1394_node_t    *root;
2887         int             cycle_master_capable;
2888         uint_t          hal_node_num;
2889 
2890         TNF_PROBE_0_DEBUG(s1394_cycle_master_capable_enter,
2891             S1394_TNF_SL_HOTPLUG_STACK, "");
2892 
2893         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
2894 
2895         hal_node_num = IEEE1394_NODE_NUM(hal->node_id);
2896 
2897         /* Get a pointer to the root node */
2898         root = s1394_topology_tree_get_root_node(hal);
2899 
2900         /* Ignore, if we are already root */
2901         if (root == &hal->topology_tree[hal_node_num]) {
2902                 TNF_PROBE_2_DEBUG(s1394_cmstr_capable_hal,
2903                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_int,
2904                     node_num, hal_node_num, tnf_int, ret, 1);
2905                 return (1);
2906         }
2907 
2908         /*
2909          * We want to pick a new root if link is off or we don't have
2910          * valid config rom
2911          */
2912         if (LINK_ACTIVE(root) == B_FALSE || root->cfgrom == NULL ||
2913             CFGROM_BIB_READ(root) == 0) {
2914 
2915                 TNF_PROBE_4_DEBUG(s1394_cmstr_capable_not_hal,
2916                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_int,
2917                     root, root->node_num, tnf_int, link_active,
2918                     LINK_ACTIVE(root), tnf_opaque, cfgrom, root->cfgrom,
2919                     tnf_int, bib, CFGROM_BIB_READ(root));
2920 
2921                 return (0);
2922         }
2923 
2924         /* Check the Cycle Master bit in the Bus Info Block */
2925         cycle_master_capable = root->cfgrom[IEEE1212_NODE_CAP_QUAD] &
2926             IEEE1394_BIB_CMC_MASK;
2927 
2928         if (cycle_master_capable) {
2929                 TNF_PROBE_1_DEBUG(s1394_cmstr_capable_root,
2930                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_int,
2931                     root, root->node_num);
2932                 return (1);
2933         } else {
2934                 TNF_PROBE_1(s1394_cmstr_not_capable_root,
2935                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_int,
2936                     root, root->node_num);
2937                 return (0);
2938         }
2939 }
2940 
2941 /*
2942  * s1394_do_phy_config_pkt()
2943  *    is called by s1394_do_bus_mgr_processing() to setup and send out
2944  *    a PHY configuration packet onto the 1394 bus.  Depending on the
2945  *    values in IRM_flags, the gap_count and root_holdoff bits on the
2946  *    bus will be affected by this packet.
2947  *
2948  *    NOTE: we overload DDI_FAILURE return value to mean jump back to
2949  *    the start of bus reset processing.
2950  */
2951 static int
2952 s1394_do_phy_config_pkt(s1394_hal_t *hal, int new_root, int new_gap_cnt,
2953     uint32_t IRM_flags)
2954 {
2955         cmd1394_cmd_t    *cmd;
2956         s1394_cmd_priv_t *s_priv;
2957         h1394_cmd_priv_t *h_priv;
2958         uint32_t         pkt_data = 0;
2959         uint32_t         gap_cnt = 0;
2960         uint32_t         root = 0;
2961         int              ret, result;
2962         uint_t           flags = 0;
2963 
2964         TNF_PROBE_0_DEBUG(s1394_do_phy_config_pkt_enter,
2965             S1394_TNF_SL_HOTPLUG_STACK, "");
2966 
2967         /* Gap count needs to be optimized */
2968         if (IRM_flags & GAP_COUNT) {
2969 
2970                 pkt_data = pkt_data | IEEE1394_PHY_CONFIG_T_BIT_MASK;
2971                 gap_cnt = ((uint32_t)new_gap_cnt) <<
2972                     IEEE1394_PHY_CONFIG_GAP_CNT_SHIFT;
2973                 gap_cnt = gap_cnt & IEEE1394_PHY_CONFIG_GAP_CNT_MASK;
2974                 pkt_data = pkt_data | gap_cnt;
2975 
2976                 (void) HAL_CALL(hal).set_gap_count(hal->halinfo.hal_private,
2977                     (uint_t)new_gap_cnt);
2978         }
2979 
2980         /* Root node needs to be changed */
2981         if (IRM_flags & ROOT_HOLDOFF) {
2982 
2983                 pkt_data = pkt_data | IEEE1394_PHY_CONFIG_R_BIT_MASK;
2984                 root = ((uint32_t)new_root) <<
2985                     IEEE1394_PHY_CONFIG_ROOT_HOLD_SHIFT;
2986                 root = root & IEEE1394_PHY_CONFIG_ROOT_HOLD_MASK;
2987                 pkt_data = pkt_data | root;
2988 
2989                 (void) HAL_CALL(hal).set_root_holdoff_bit(
2990                     hal->halinfo.hal_private);
2991         }
2992 
2993 
2994         if (IRM_flags) {
2995                 if (s1394_alloc_cmd(hal, flags, &cmd) != DDI_SUCCESS) {
2996                         TNF_PROBE_1_DEBUG(s1394_do_phy_config_pkt_error,
2997                             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string, msg,
2998                             "Unable to allocate PHY config packet");
2999                         TNF_PROBE_0_DEBUG(s1394_do_phy_config_pkt_exit,
3000                             S1394_TNF_SL_HOTPLUG_STACK, "");
3001                         return (0);
3002                 }
3003 
3004                 if (s1394_lock_tree(hal) != DDI_SUCCESS) {
3005                         /* lock tree failure indicates a bus gen change */
3006                         (void) s1394_free_cmd(hal, (cmd1394_cmd_t **)&cmd);
3007                         TNF_PROBE_0_DEBUG(s1394_do_phy_config_pkt_exit,
3008                             S1394_TNF_SL_HOTPLUG_STACK, "");
3009                         return (1);
3010                 }
3011 
3012                 /* Setup the callback routine */
3013                 cmd->completion_callback  = s1394_phy_config_callback;
3014                 cmd->cmd_callback_arg          = (void *)(uintptr_t)IRM_flags;
3015                 cmd->bus_generation    = hal->generation_count;
3016                 cmd->cmd_options       = CMD1394_OVERRIDE_ADDR;
3017                 cmd->cmd_type                  = CMD1394_ASYNCH_WR_QUAD;
3018                 cmd->cmd_u.q.quadlet_data = pkt_data;
3019 
3020                 /* Get the Services Layer private area */
3021                 s_priv = S1394_GET_CMD_PRIV(cmd);
3022 
3023                 /* Get a pointer to the HAL private struct */
3024                 h_priv = (h1394_cmd_priv_t *)&s_priv->hal_cmd_private;
3025 
3026                 s_priv->sent_by_target       = (s1394_target_t *)NULL;
3027                 s_priv->sent_on_hal  = (s1394_hal_t *)hal;
3028 
3029                 h_priv->bus_generation       = cmd->bus_generation;
3030 
3031                 /* Speed must be IEEE1394_S100 on PHY config packets */
3032                 s_priv->hal_cmd_private.speed = IEEE1394_S100;
3033 
3034                 /* Mark command as being used */
3035                 s_priv->cmd_in_use = B_TRUE;
3036 
3037                 s1394_unlock_tree(hal);
3038 
3039                 /* Put command on the HAL's outstanding request Q */
3040                 s1394_insert_q_asynch_cmd(hal, cmd);
3041 
3042                 ret = HAL_CALL(hal).send_phy_configuration_packet(
3043                     hal->halinfo.hal_private, (cmd1394_cmd_t *)cmd,
3044                     (h1394_cmd_priv_t *)&s_priv->hal_cmd_private, &result);
3045 
3046                 if (ret != DDI_SUCCESS) {
3047                         TNF_PROBE_2_DEBUG(s1394_do_phy_config_pkt_error,
3048                             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string, msg,
3049                             "Unable to send PHY config packet",
3050                             tnf_int, result, result);
3051 
3052                         (void) s1394_free_cmd(hal, (cmd1394_cmd_t **)&cmd);
3053 
3054                         TNF_PROBE_0_DEBUG(s1394_do_phy_config_pkt_exit,
3055                             S1394_TNF_SL_HOTPLUG_STACK, "");
3056                         return (0);
3057 
3058                 } else {
3059                         /*
3060                          * There will be a bus reset only if GAP_COUNT changed
3061                          */
3062                         if (IRM_flags & GAP_COUNT) {
3063                                 return (1);
3064                         }
3065                 }
3066         }
3067 
3068         TNF_PROBE_0_DEBUG(s1394_do_phy_config_pkt_exit,
3069             S1394_TNF_SL_HOTPLUG_STACK, "");
3070         return (0);
3071 }
3072 
3073 /*
3074  * s1394_phy_config_callback()
3075  *    is the callback called after the PHY configuration packet has been
3076  *    sent out onto the 1394 bus.  Depending on the values in IRM_flags,
3077  *    (specifically if the gap_count has been changed) this routine may
3078  *    initiate a bus reset.
3079  */
3080 static void
3081 s1394_phy_config_callback(cmd1394_cmd_t *cmd)
3082 {
3083         s1394_cmd_priv_t *s_priv;
3084         s1394_hal_t *hal;
3085         uint32_t IRM_flags;
3086 
3087         TNF_PROBE_0_DEBUG(s1394_phy_config_callback_enter,
3088             S1394_TNF_SL_HOTPLUG_STACK, "");
3089 
3090         /* Get the Services Layer private area */
3091         s_priv = S1394_GET_CMD_PRIV(cmd);
3092 
3093         hal = (s1394_hal_t *)s_priv->sent_on_hal;
3094 
3095         IRM_flags = (uint32_t)(uintptr_t)cmd->cmd_callback_arg;
3096 
3097         if (cmd->cmd_result != CMD1394_CMDSUCCESS) {
3098                 TNF_PROBE_2_DEBUG(s1394_do_phy_config_pkt_error,
3099                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string, msg,
3100                     "Error sending PHY config packet",
3101                     tnf_int, result, cmd->cmd_result);
3102                 (void) s1394_free_cmd(hal, &cmd);
3103         } else {
3104                 (void) s1394_free_cmd(hal, &cmd);
3105 
3106                 /* Only need a bus reset if we changed GAP_COUNT */
3107                 if (IRM_flags & GAP_COUNT) {
3108                         s1394_initiate_hal_reset(hal, NON_CRITICAL);
3109                 }
3110         }
3111 
3112         TNF_PROBE_0_DEBUG(s1394_phy_config_callback_exit,
3113             S1394_TNF_SL_HOTPLUG_STACK, "");
3114 }
3115 
3116 /*
3117  * s1394_lock_tree()
3118  *    Attempts to lock the topology tree. Returns DDI_FAILURE if generations
3119  *    changed or if the services layer signals the bus reset thread to go
3120  *    away. Otherwise, returns DDI_SUCCESS.
3121  */
3122 int
3123 s1394_lock_tree(s1394_hal_t *hal)
3124 {
3125         int     circular;
3126 
3127         ASSERT(MUTEX_NOT_HELD(&hal->br_thread_mutex));
3128         ASSERT(MUTEX_NOT_HELD(&hal->topology_tree_mutex));
3129 
3130         TNF_PROBE_0_DEBUG(s1394_lock_tree_enter, S1394_TNF_SL_HOTPLUG_STACK,
3131             "");
3132 
3133         mutex_enter(&hal->br_thread_mutex);
3134         ndi_devi_enter(hal->halinfo.dip, &circular);
3135         mutex_enter(&hal->topology_tree_mutex);
3136 
3137         if ((hal->br_thread_ev_type & BR_THR_GO_AWAY) != 0) {
3138                 TNF_PROBE_2(s1394_lock_tree_go_away,
3139                     S1394_TNF_SL_HOTPLUG_STACK, "",
3140                     tnf_int, hal_generation, hal->generation_count,
3141                     tnf_int, br_thread_gen, hal->br_cfgrom_read_gen);
3142                 TNF_PROBE_0_DEBUG(s1394_lock_tree_exit,
3143                     S1394_TNF_SL_HOTPLUG_STACK, "");
3144                 mutex_exit(&hal->br_thread_mutex);
3145                 mutex_exit(&hal->topology_tree_mutex);
3146                 ndi_devi_exit(hal->halinfo.dip, circular);
3147                 return (DDI_FAILURE);
3148         } else if (hal->br_cfgrom_read_gen != hal->generation_count) {
3149                 TNF_PROBE_2(s1394_lock_tree_gen_changed,
3150                     S1394_TNF_SL_HOTPLUG_STACK, "",
3151                     tnf_int, hal_generation, hal->generation_count,
3152                     tnf_int, br_thread_gen, hal->br_cfgrom_read_gen);
3153 
3154                 TNF_PROBE_0_DEBUG(s1394_lock_tree_exit,
3155                     S1394_TNF_SL_HOTPLUG_STACK, "");
3156                 mutex_exit(&hal->br_thread_mutex);
3157                 mutex_exit(&hal->topology_tree_mutex);
3158                 ndi_devi_exit(hal->halinfo.dip, circular);
3159                 return (DDI_FAILURE);
3160         }
3161 
3162         mutex_exit(&hal->br_thread_mutex);
3163 
3164         TNF_PROBE_0_DEBUG(s1394_lock_tree_exit, S1394_TNF_SL_HOTPLUG_STACK, "");
3165 
3166         return (DDI_SUCCESS);
3167 }
3168 
3169 /*
3170  * s1394_unlock_tree()
3171  *    Unlocks the topology tree
3172  */
3173 void
3174 s1394_unlock_tree(s1394_hal_t *hal)
3175 {
3176         TNF_PROBE_0_DEBUG(s1394_unlock_tree_enter, S1394_TNF_SL_HOTPLUG_STACK,
3177             "");
3178 
3179         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
3180         mutex_exit(&hal->topology_tree_mutex);
3181         ndi_devi_exit(hal->halinfo.dip, 0);
3182 
3183         TNF_PROBE_0_DEBUG(s1394_unlock_tree_exit, S1394_TNF_SL_HOTPLUG_STACK,
3184             "");
3185 }
3186 
3187 /*
3188  * s1394_calc_next_quad()
3189  *    figures out the next quadlet to read. This maintains a stack of
3190  *    directories in the node. When the first quad of a directory (the
3191  *    first directory would be the root directory) is read, it is pushed on
3192  *    the this stack. When the directory is all read, it scans the directory
3193  *    looking for indirect entries. If any indirect directory entry is found,
3194  *    it is pushed on stack and that directory is read. If we are done dealing
3195  *    with all entries in the current dir, the directory is popped off the
3196  *    stack. If the stack is empty, we are back at the root directory level
3197  *    and essentially read the entire directory hierarchy.
3198  *    Returns 0 is more quads to read, else returns non-zero.
3199  */
3200 static int
3201 s1394_calc_next_quad(s1394_hal_t *hal, s1394_node_t *node, uint32_t quadlet,
3202     uint32_t *nextquadp)
3203 {
3204         uint32_t data, type, key, value, *ptr;
3205 
3206         ASSERT(MUTEX_HELD(&hal->topology_tree_mutex));
3207 
3208         TNF_PROBE_4_DEBUG(s1394_calc_next_quad_enter,
3209             S1394_TNF_SL_HOTPLUG_STACK, "", tnf_uint, node_num, node->node_num,
3210             tnf_uint, quadlet, quadlet, tnf_int, cfgrom_size, node->cfgrom_size,
3211             tnf_uint, hal_gen, hal->generation_count);
3212 
3213         if (((quadlet + 1) >= node->cfgrom_size) ||
3214             (CFGROM_SIZE_IS_CRCSIZE(node) == B_TRUE && (quadlet + 1) >=
3215                 node->cfgrom_valid_size)) {
3216                 TNF_PROBE_0_DEBUG(s1394_calc_next_quad_exit,
3217                     S1394_TNF_SL_HOTPLUG_STACK, "");
3218                 return (1);
3219         }
3220 
3221         if (s1394_turn_off_dir_stack != 0 || CFGROM_DIR_STACK_OFF(node) ==
3222             B_TRUE) {
3223                 quadlet++;
3224                 *nextquadp = quadlet;
3225                 TNF_PROBE_3_DEBUG(s1394_calc_next_quad_exit,
3226                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string, msg,
3227                     "dir stack turned off", tnf_uint, quadlet, quadlet,
3228                     tnf_opaque, cfgrom, node->cfgrom);
3229                 return (0);
3230         }
3231 
3232         data = node->cfgrom[quadlet];
3233 
3234         if (quadlet == IEEE1212_ROOT_DIR_QUAD) {
3235                 node->dir_stack_top = -1;
3236                 node->expected_dir_quad = quadlet;
3237                 node->expected_type = IEEE1212_IMMEDIATE_TYPE;
3238         }
3239 
3240         CFGROM_TYPE_KEY_VALUE(data, type, key, value);
3241 
3242         /*
3243          * check to make sure we are looking at a dir. If the config rom
3244          * is broken, then revert to normal scanning of the config rom
3245          */
3246         if (node->expected_dir_quad == quadlet) {
3247                 if (type != 0 || key != 0) {
3248                         TNF_PROBE_3_DEBUG(s1394_calc_next_quad,
3249                             S1394_TNF_SL_HOTPLUG_ERROR, "", tnf_string, msg,
3250                             "bad directory turning off stack", tnf_uint,
3251                             quadlet, quadlet, tnf_uint, data, data);
3252                         SET_CFGROM_DIR_STACK_OFF(node);
3253                         quadlet = IEEE1212_ROOT_DIR_QUAD;
3254                 } else {
3255                         node->cur_dir_start = quadlet;
3256                         node->cur_dir_size = IEEE1212_DIR_LEN(data);
3257                         node->expected_dir_quad = 0;
3258                         /* get the next quad */
3259                         quadlet++;
3260                 }
3261         } else {
3262                 /*
3263                  * If we read all quads in cur dir and the cur dir is not
3264                  * a leaf, scan for offsets (if the directory's CRC checks
3265                  * out OK). If we have a directory or a leaf, we save the
3266                  * current location on the stack and start reading that
3267                  * directory. So, we will end up with a depth first read of
3268                  * the entire config rom. If we are done with the current
3269                  * directory, pop it off the stack and continue the scanning
3270                  * as appropriate.
3271                  */
3272                 if (quadlet == node->cur_dir_start + node->cur_dir_size) {
3273 
3274                         int i, top;
3275                         boolean_t done_with_cur_dir = B_FALSE;
3276 
3277                         if (node->expected_type == IEEE1212_LEAF_TYPE) {
3278                                 node->expected_type = IEEE1212_IMMEDIATE_TYPE;
3279                                 done_with_cur_dir = B_TRUE;
3280                                 TNF_PROBE_2_DEBUG(s1394_calc_next_quad,
3281                                     S1394_TNF_SL_HOTPLUG_STACK, "",
3282                                     tnf_string, msg, "done with a leaf",
3283                                     tnf_uint, quadlet, quadlet);
3284                                 goto donewithcurdir;
3285                         }
3286 
3287                         ptr = &node->cfgrom[node->cur_dir_start];
3288                         CFGROM_TYPE_KEY_VALUE(*ptr, type, key, value);
3289 
3290                         /*
3291                          * If CRC for this directory is invalid, turn off
3292                          * dir stack and start re-reading from root dir.
3293                          * This wastes the work done thus far, but CRC
3294                          * errors in directories should be rather rare.
3295                          * if s1394_crcsz_is_cfgsz is set, then set
3296                          * cfgrom_valid_size to the len specfied as crc len
3297                          * in quadlet 0.
3298                          */
3299                         if (s1394_valid_dir(hal, node, key, ptr) == B_FALSE) {
3300                                 SET_CFGROM_DIR_STACK_OFF(node);
3301                                 if (s1394_crcsz_is_cfgsz != 0) {
3302                                         SET_CFGROM_SIZE_IS_CRCSIZE(node);
3303                                         node->cfgrom_valid_size =
3304                                             ((node->cfgrom[0] >>
3305                                             IEEE1394_CFG_ROM_CRC_LEN_SHIFT) &
3306                                             IEEE1394_CFG_ROM_CRC_LEN_MASK);
3307                                         TNF_PROBE_2(s1394_calc_next_quad,
3308                                             S1394_TNF_SL_HOTPLUG_ERROR, "",
3309                                             tnf_string, msg, "crc sz is cfg sz",
3310                                             tnf_uint, size,
3311                                             node->cfgrom_valid_size);
3312                                 }
3313                                 TNF_PROBE_2_DEBUG(s1394_calc_next_quad_exit,
3314                                     S1394_TNF_SL_HOTPLUG_STACK, "", tnf_string,
3315                                     msg, "crc error", tnf_uint, quadlet,
3316                                     quadlet);
3317                                 *nextquadp = IEEE1212_ROOT_DIR_QUAD;
3318                                 return (0);
3319                         }
3320                         i = node->cur_dir_start + 1;
3321                 rescan:
3322                         for (done_with_cur_dir = B_FALSE; i <=
3323                             node->cur_dir_start + node->cur_dir_size; i++) {
3324                                 data = node->cfgrom[i];
3325                                 CFGROM_TYPE_KEY_VALUE(data, type, key, value);
3326                                 /* read leaf type and directory types only */
3327                                 if (type == IEEE1212_LEAF_TYPE || type ==
3328                                     IEEE1212_DIRECTORY_TYPE) {
3329 
3330                                         /*
3331                                          * push current dir on stack; if the
3332                                          * stack is overflowing, ie, too many
3333                                          * directory level nestings, turn off
3334                                          * dir stack and fall back to serial
3335                                          * scanning, starting at root dir. This
3336                                          * wastes all the work we have done
3337                                          * thus far, but more than 16 levels
3338                                          * of directories is rather odd...
3339                                          */
3340                                         top = ++node->dir_stack_top;
3341                                         if (top == S1394_DIR_STACK_SIZE) {
3342 
3343                                                 TNF_PROBE_2_DEBUG(
3344                                                     s1394_calc_next_quad_exit,
3345                                                     S1394_TNF_SL_HOTPLUG_STACK,
3346                                                     "", tnf_string, msg,
3347                                                     "dir stack overflow",
3348                                                     tnf_uint, quadlet, quadlet);
3349                                                 SET_CFGROM_DIR_STACK_OFF(node);
3350                                                 *nextquadp =
3351                                                     IEEE1212_ROOT_DIR_QUAD;
3352                                                 return (0);
3353                                         }
3354 
3355                                         TNF_PROBE_3_DEBUG(
3356                                             s1394_calc_next_quad,
3357                                             S1394_TNF_SL_HOTPLUG_STACK, "",
3358                                             tnf_string, msg, "push dir stack",
3359                                             tnf_uint, quadlet, quadlet,
3360                                             tnf_int, top, top);
3361 
3362                                         node->dir_stack[top].dir_start =
3363                                             node->cur_dir_start;
3364                                         node->dir_stack[top].dir_size =
3365                                             node->cur_dir_size;
3366                                         node->dir_stack[top].dir_next_quad =
3367                                             i + 1;
3368                                         /* and set the next quadlet to read */
3369                                         quadlet = i + value;
3370                                         node->expected_dir_quad = quadlet;
3371                                         node->expected_type = type;
3372                                         break;
3373                                 }
3374                         }
3375 
3376                 donewithcurdir:
3377 
3378                         if ((i > node->cur_dir_start + node->cur_dir_size) ||
3379                                 done_with_cur_dir == B_TRUE) {
3380 
3381                                 /*
3382                                  * all done with cur dir; pop it off the stack
3383                                  */
3384                                 if (node->dir_stack_top >= 0) {
3385                                         TNF_PROBE_3_DEBUG(
3386                                             s1394_calc_next_quad_exit,
3387                                             S1394_TNF_SL_HOTPLUG_STACK, "",
3388                                             tnf_string, msg, "pop dir stack",
3389                                             tnf_uint, quadlet, quadlet,
3390                                             tnf_int, top, node->dir_stack_top);
3391                                         top = node->dir_stack_top--;
3392                                         node->cur_dir_start =
3393                                             node->dir_stack[top].dir_start;
3394                                         node->cur_dir_size =
3395                                             node->dir_stack[top].dir_size;
3396                                         i = node->dir_stack[top].dir_next_quad;
3397                                         goto rescan;
3398                                 } else {
3399                                         /*
3400                                          * if empty stack, we are at the top
3401                                          * level; declare done.
3402                                          */
3403                                         TNF_PROBE_1_DEBUG(
3404                                             s1394_calc_next_quad_exit,
3405                                             S1394_TNF_SL_HOTPLUG_STACK, "",
3406                                             tnf_string, msg, "all done");
3407                                         return (1);
3408                                 }
3409                         }
3410                 } else {
3411                         /* get the next quadlet */
3412                         quadlet++;
3413                 }
3414         }
3415         *nextquadp = quadlet;
3416 
3417         TNF_PROBE_1_DEBUG(s1394_calc_next_quad_exit, S1394_TNF_SL_HOTPLUG_STACK,
3418             "", tnf_uint, next_quad, quadlet);
3419 
3420         return (0);
3421 }