code: func (w *wallet) Open(passphrase string) error {
  	w.stateLock.Lock() // State lock is enough since there's no connection yet at this point
  	defer w.stateLock.Unlock()
  
  	// If the device was already opened once, refuse to try again
  	if w.paths != nil {
  		return accounts.ErrWalletAlreadyOpen
  	}
  	// Make sure the actual device connection is done only once
  	if w.device == nil {
  		device, err := w.info.Open()
  		if err != nil {
  			return err
  		}
  		w.device = device
  		w.commsLock = make(chan struct{}, 1)
  		w.commsLock <- struct{}{} // Enable lock
  	}
  	// Delegate device initialization to the underlying driver
  	if err := w.driver.Open(w.device, passphrase); err != nil {
  		return err
  	}
  	// Connection successful, start life-cycle management
  	w.paths = make(map[common.Address]accounts.DerivationPath)
  
  	w.deriveReq = make(chan chan struct{})
  	w.deriveQuit = make(chan chan error)
  	w.healthQuit = make(chan chan error)
  
  	go w.heartbeat()
  	go w.selfDerive()
  
  	// Notify anyone listening for wallet events that a new device is accessible
  	go w.hub.updateFeed.Send(accounts.WalletEvent{Wallet: w, Kind: accounts.WalletOpened})
  
  	return nil
  }
docs: // Open implements accounts.Wallet, attempting to open a USB connection to the
  // hardware wallet.