        while sm.rcv_frame['pandaStates'] < 1 and len(sm['pandaStates']) == 0:
          sm.update(1000)
  
      num_pandas = len(sm['pandaStates'])
      if TICI:
        self.assertGreater(num_pandas, 1, "connect another panda for multipanda tests")
  
      # boardd blocks on CarVin and CarParams
      cp = car.CarParams.new_message()
  
      safety_config = car.CarParams.SafetyConfig.new_message()
 
</s> remove   def _wait_for_boardd(self):
 </s> add   def _wait_for_boardd(self, timeout=30):
    expected_pandas = 2 if TICI and "SINGLE_PANDA" not in os.environ else 1
    self.assertEqual(num_pandas, expected_pandas, "connected pandas ({num_pandas}) doesn't match expected panda count ({expected_pandas}). \
                                                   connect another panda for multipanda tests.")
        while sm.rcv_frame['pandaStates'] < 1 and len(sm['pandaStates']) == 0:
          sm.update(1000)
  
      num_pandas = len(sm['pandaStates'])
    expected_pandas = 2 if TICI and "SINGLE_PANDA" not in os.environ else 1
    self.assertEqual(num_pandas, expected_pandas, "connected pandas ({num_pandas}) doesn't match expected panda count ({expected_pandas}). \
                                                   connect another panda for multipanda tests.")
    expected_pandas = 2 if TICI and "SINGLE_PANDA" not in os.environ else 1
    self.assertEqual(num_pandas, expected_pandas, "connected pandas ({num_pandas}) doesn't match expected panda count ({expected_pandas}). \
                                                   connect another panda for multipanda tests.")
  
      # boardd blocks on CarVin and CarParams
      cp = car.CarParams.new_message()
  
      safety_config = car.CarParams.SafetyConfig.new_message()
keep keep keep keep replace replace keep keep keep keep keep
 tizi tests in jenkins (#27810)

* add

* mv there for now

* mv

* single panda

* move into parallel

* longer timeout for dfu

---------

Co-authored-by: Comma Device <device@comma.ai> 
selfdrive/boardd/tests/test_boardd_loopback.py