URI: 
       tMerge pull request #3842 from SomberNight/ledger_3508 - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 1821d9ebc67ae1aec679e5af759541c15ace1740
   DIR parent 42ed4bc3d6132f65d0028c8b5be11a9b0c48c36c
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Mon,  5 Feb 2018 09:05:20 +0100
       
       Merge pull request #3842 from SomberNight/ledger_3508
       
       attempt at fixing ledger 'read error'
       Diffstat:
         M lib/base_wizard.py                  |       9 +++++++++
         M lib/plugins.py                      |      13 +++++++++----
         M plugins/ledger/ledger.py            |       4 ++++
       
       3 files changed, 22 insertions(+), 4 deletions(-)
       ---
   DIR diff --git a/lib/base_wizard.py b/lib/base_wizard.py
       t@@ -234,6 +234,15 @@ class BaseWizard(object):
                self.plugin = self.plugins.get_plugin(name)
                try:
                    self.plugin.setup_device(device_info, self, purpose)
       +        except OSError as e:
       +            self.show_error(_('We encountered an error while connecting to your device:')
       +                            + '\n' + str(e) + '\n'
       +                            + _('To try to fix this, we will now re-pair with your device.') + '\n'
       +                            + _('Please try again.'))
       +            devmgr = self.plugins.device_manager
       +            devmgr.unpair_id(device_info.device.id_)
       +            self.choose_hw_device(purpose)
       +            return
                except BaseException as e:
                    self.show_error(str(e))
                    self.choose_hw_device(purpose)
   DIR diff --git a/lib/plugins.py b/lib/plugins.py
       t@@ -362,15 +362,20 @@ class DeviceMgr(ThreadJob, PrintError):
                    if not xpub in self.xpub_ids:
                        return
                    _id = self.xpub_ids.pop(xpub)
       -        client = self.client_lookup(_id)
       -        self.clients.pop(client, None)
       -        if client:
       -            client.close()
       +            self._close_client(_id)
        
            def unpair_id(self, id_):
                xpub = self.xpub_by_id(id_)
                if xpub:
                    self.unpair_xpub(xpub)
       +        else:
       +            self._close_client(id_)
       +
       +    def _close_client(self, id_):
       +        client = self.client_lookup(id_)
       +        self.clients.pop(client, None)
       +        if client:
       +            client.close()
        
            def pair_xpub(self, xpub, id_):
                with self.lock:
   DIR diff --git a/plugins/ledger/ledger.py b/plugins/ledger/ledger.py
       t@@ -172,6 +172,10 @@ class Ledger_Client():
                        raise Exception("Dongle is temporarily locked - please unplug it and replug it again")
                    if ((e.sw & 0xFFF0) == 0x63c0):
                        raise Exception("Invalid PIN - please unplug the dongle and plug it again before retrying")
       +            if e.sw == 0x6f00 and e.message == 'Invalid channel':
       +                # based on docs 0x6f00 might be a more general error, hence we also compare message to be sure
       +                raise Exception("Invalid channel.\n"
       +                                "Please make sure that 'Browser support' is disabled on your device.")
                    raise e
        
            def checkDevice(self):