From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v2] USB:serial:pl2303:Add new PID to support PL2303HXN (TYPE_HXN) From: Charles Yeh Message-Id: <20190429121237.13136-1-charlesyeh522@gmail.com> Date: Mon, 29 Apr 2019 20:12:37 +0800 To: gregkh@linuxfoundation.org, johan@kernel.org, linux-usb@vger.kernel.org Cc: charles-yeh@prolific.com.tw, Charles Yeh List-ID: UHJvbGlmaWMgaGFzIGRldmVsb3BlZCBhIG5ldyBVU0IgdG8gVUFSVCBjaGlwOiBQTDIzMDNIWE4K UEwyMzAzSFhOIDogUEwyMzAzR0MvUEwyMzAzR1MvUEwyMzAzR1QvUEwyMzAzR0wvUEwyMzAzR0Uv UEwyMzAzR0IKVGhlIFZlbmRvciByZXF1ZXN0IHVzZWQgYnkgdGhlIFBMMjMwM0hYTiAoVFlQRV9I WE4pIGlzIGRpZmZlcmVudCBmcm9tCnRoZSBleGlzdGluZyBQTDIzMDMgc2VyaWVzIChUWVBFX0hY ICYgVFlQRV8wMSkuClRoZXJlZm9yZSwgZGlmZmVyZW50IFZlbmRvciByZXF1ZXN0cyBhcmUgdXNl ZCB0byBpc3N1ZSByZWxhdGVkIGNvbW1hbmRzLgoKMS4gQWRkZWQgYSBuZXcgVFlQRV9IWE4gdHlw ZSBpbiBwbDIzMDNfdHlwZV9kYXRhLCBhbmQgdGhlbiBleGVjdXRlcwogICBuZXcgVmVuZG9yIHJl cXVlc3QsbmV3IGZsb3cgY29udHJvbCBhbmQgb3RoZXIgcmVsYXRlZCBpbnN0cnVjdGlvbnMKICAg aWYgVFlQRV9IWE4gaXMgcmVjb2duaXplZC4KCjIuIEJlY2F1c2UgdGhlIG5ldyBQTDIzMDNIWE4g b25seSBhY2NlcHQgdGhlIG5ldyBWZW5kb3IgcmVxdWVzdCwKICAgdGhlIG9sZCBWZW5kb3IgcmVx dWVzdCBjYW5ub3QgYmUgYWNjZXB0ZWQgKHRoZSBlcnJvciBtZXNzYWdlCiAgIHdpbGwgYmUgcmV0 dXJuZWQpCiAgIFNvIGZpcnN0IGRldGVybWluZSB0aGUgVFlQRV9IWCBvciBUWVBFX0hYTiB0aHJv dWdoCiAgIFBMMjMwM19SRUFEX1RZUEVfSFhfU1RBVFVTIGluIHBsMjMwM19zdGFydHVwLgoKICAy LjEgSWYgdGhlIHJldHVybiBtZXNzYWdlIGlzICIxIiwgdGhlbiB0aGUgUEwyMzAzIGlzIHRoZSBl eGlzdGluZwogICAgICBUWVBFX0hYLyBUWVBFXzAxIHNlcmllcy4KICAgICAgVGhlIG90aGVyIHNl dHRpbmdzIGluIHBsMjMwM19zdGFydHVwIGFyZSB0byBjb250aW51ZSBleGVjdXRpb24uCiAgMi4y IElmIHRoZSByZXR1cm4gbWVzc2FnZSBpcyAibm90IDEiLCB0aGVuIHRoZSBQTDIzMDMgaXMgdGhl IG5ldwogICAgICBUWVBFX0hYTiBzZXJpZXMuCiAgICAgIFRoZSBvdGhlciBzZXR0aW5ncyBpbiBw bDIzMDNfc3RhcnR1cCBhcmUgaWdub3JlZC4KICAgICAgKFBMMjMwM0hYTiB3aWxsIGRpcmVjdGx5 IHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgaGFyZHdhcmUsCiAgICAgICBubyBuZWVkIHRv IGFkZCBhZGRpdGlvbmFsIHNldHRpbmdzIHRocm91Z2ggdGhlIHNvZnR3YXJlKQoKMy4gSW4gcGwy MzAzX29wZW46IEJlY2F1c2UgVFlQRV9IWE4gaXMgZGlmZmVyZW50IGZyb20gdGhlIGluc3RydWN0 aW9uIG9mIHJlc2V0CiAgIGRvd24vdXAgc3RyZWFtIHVzZWQgYnkgVFlQRV9IWC4KICAgVGhlcmVm b3JlLCB3ZSB3aWxsIGFsc28gZXhlY3V0ZSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb25zIGhlcmUuCgo0 LiBJbiBwbDIzMDNfc2V0X3Rlcm1pb3M6IFRoZSBVQVJUIGZsb3cgY29udHJvbCBpbnN0cnVjdGlv bnMgdXNlZCBieQogICBUWVBFX0hYTi9UWVBFX0hYL1RZUEVfMDEgYXJlIGRpZmZlcmVudC4KICAg VGhlcmVmb3JlLCB3ZSB3aWxsIGFsc28gZXhlY3V0ZSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb25zIGhl cmUuCgo1LiBJbiBwbDIzMDNfdmVuZG9yX3JlYWQgJiBwbDIzMDNfdmVuZG9yX3dyaXRlLCBzaW5j ZSBUWVBFX0hYTiBpcyBkaWZmZXJlbnQKICAgZnJvbSB0aGUgdmVuZG9yIHJlcXVlc3QgaW5zdHJ1 Y3Rpb24gdXNlZCBieSBUWVBFX0hYL1RZUEVfMDEsCiAgIGl0IHdpbGwgYWxzbyBleGVjdXRlIGRp ZmZlcmVudCBpbnN0cnVjdGlvbnMgaGVyZS4KClNpZ25lZC1vZmYtYnk6IENoYXJsZXMgWWVoIDxj aGFybGVzeWVoNTIyQGdtYWlsLmNvbT4KLS0tCiBkcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMg fCAxMDcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tCiBkcml2ZXJzL3VzYi9z ZXJpYWwvcGwyMzAzLmggfCAgIDYgKysKIDIgZmlsZXMgY2hhbmdlZCwgOTIgaW5zZXJ0aW9ucygr KSwgMjEgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMw My5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCmluZGV4IGJiM2Y5YWE0YTkwOS4uZDkz ODA5MWJhNGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKKysrIGIv ZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCkBAIC00Nyw2ICs0NywxMiBAQCBzdGF0aWMgY29u c3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoUEwy MzAzX1ZFTkRPUl9JRCwgUEwyMzAzX1BST0RVQ1RfSURfTU9UT1JPTEEpIH0sCiAJeyBVU0JfREVW SUNFKFBMMjMwM19WRU5ET1JfSUQsIFBMMjMwM19QUk9EVUNUX0lEX1pURUspIH0sCiAJeyBVU0Jf REVWSUNFKFBMMjMwM19WRU5ET1JfSUQsIFBMMjMwM19QUk9EVUNUX0lEX1RCKSB9LAorCXsgVVNC X0RFVklDRShQTDIzMDNfVkVORE9SX0lELCBQTDIzMDNfUFJPRFVDVF9JRF9HQykgfSwKKwl7IFVT Ql9ERVZJQ0UoUEwyMzAzX1ZFTkRPUl9JRCwgUEwyMzAzX1BST0RVQ1RfSURfR0IpIH0sCisJeyBV U0JfREVWSUNFKFBMMjMwM19WRU5ET1JfSUQsIFBMMjMwM19QUk9EVUNUX0lEX0dUKSB9LAorCXsg VVNCX0RFVklDRShQTDIzMDNfVkVORE9SX0lELCBQTDIzMDNfUFJPRFVDVF9JRF9HTCkgfSwKKwl7 IFVTQl9ERVZJQ0UoUEwyMzAzX1ZFTkRPUl9JRCwgUEwyMzAzX1BST0RVQ1RfSURfR0UpIH0sCisJ eyBVU0JfREVWSUNFKFBMMjMwM19WRU5ET1JfSUQsIFBMMjMwM19QUk9EVUNUX0lEX0dTKSB9LAog CXsgVVNCX0RFVklDRShJT0RBVEFfVkVORE9SX0lELCBJT0RBVEFfUFJPRFVDVF9JRCkgfSwKIAl7 IFVTQl9ERVZJQ0UoSU9EQVRBX1ZFTkRPUl9JRCwgSU9EQVRBX1BST0RVQ1RfSURfUlNBUTUpIH0s CiAJeyBVU0JfREVWSUNFKEFURU5fVkVORE9SX0lELCBBVEVOX1BST0RVQ1RfSUQpLApAQCAtMTI5 LDkgKzEzNSwxMSBAQCBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWRfdGFibGUpOwogCiAjZGVm aW5lIFZFTkRPUl9XUklURV9SRVFVRVNUX1RZUEUJMHg0MAogI2RlZmluZSBWRU5ET1JfV1JJVEVf UkVRVUVTVAkJMHgwMQorI2RlZmluZSBWRU5ET1JfV1JJVEVfTlJFUVVFU1QJCTB4ODAKIAogI2Rl ZmluZSBWRU5ET1JfUkVBRF9SRVFVRVNUX1RZUEUJMHhjMAogI2RlZmluZSBWRU5ET1JfUkVBRF9S RVFVRVNUCQkweDAxCisjZGVmaW5lIFZFTkRPUl9SRUFEX05SRVFVRVNUCQkweDgxCiAKICNkZWZp bmUgVUFSVF9TVEFURV9JTkRFWAkJOAogI2RlZmluZSBVQVJUX1NUQVRFX01TUl9NQVNLCQkweDhi CkBAIC0xNDUsMTEgKzE1MywxOSBAQCBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWRfdGFibGUp OwogI2RlZmluZSBVQVJUX09WRVJSVU5fRVJST1IJCTB4NDAKICNkZWZpbmUgVUFSVF9DVFMJCQkw eDgwCiAKKyNkZWZpbmUgUEwyMzAzX1JFQURfVFlQRV9IWF9TVEFUVVMJMHg4MDgwCisjZGVmaW5l IFBMMjMwM19UWVBFX0hYTl9GTE9XX0NUUkwJMHgwQQorI2RlZmluZSBQTDIzMDNfVFlQRV9IWE5f Q1RSTF9SVFNfQ1RTCTB4RkEKKyNkZWZpbmUgUEwyMzAzX1RZUEVfSFhOX0NUUkxfWE9OX1hPRkYJ MHhFRQorI2RlZmluZSBQTDIzMDNfVFlQRV9IWE5fTk9ORV9GTE9XCTB4RkYKKyNkZWZpbmUgUEwy MzAzX1RZUEVfSFhOX1JFU0VUX0RPV05fVVBTVFJFQU0JMHgwNworCiBzdGF0aWMgdm9pZCBwbDIz MDNfc2V0X2JyZWFrKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGJvb2wgZW5hYmxlKTsK IAogZW51bSBwbDIzMDNfdHlwZSB7CiAJVFlQRV8wMSwJLyogVHlwZSAwIGFuZCAxIChkaWZmZXJl bmNlIHVua25vd24pICovCiAJVFlQRV9IWCwJLyogSFggdmVyc2lvbiBvZiB0aGUgcGwyMzAzIGNo aXAgKi8KKwlUWVBFX0hYTiwJLyogSFhOIHZlcnNpb24gb2YgdGhlIHBsMjMwMyBjaGlwICovCiAJ VFlQRV9DT1VOVAogfTsKIApAQCAtMTc5LDE2ICsxOTUsMjYgQEAgc3RhdGljIGNvbnN0IHN0cnVj dCBwbDIzMDNfdHlwZV9kYXRhIHBsMjMwM190eXBlX2RhdGFbVFlQRV9DT1VOVF0gPSB7CiAJW1RZ UEVfSFhdID0gewogCQkubWF4X2JhdWRfcmF0ZSA9CTEyMDAwMDAwLAogCX0sCisJW1RZUEVfSFhO XSA9IHsKKwkJLm1heF9iYXVkX3JhdGUgPQkxMjAwMDAwMCwKKwl9LAogfTsKIAogc3RhdGljIGlu dCBwbDIzMDNfdmVuZG9yX3JlYWQoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgdTE2IHZhbHVl LAogCQkJCQkJCXVuc2lnbmVkIGNoYXIgYnVmWzFdKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9 ICZzZXJpYWwtPmludGVyZmFjZS0+ZGV2OworCXN0cnVjdCBwbDIzMDNfc2VyaWFsX3ByaXZhdGUg KnNwcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOwogCWludCByZXM7CisJdTggcmVx dWVzdDsKKworCWlmIChzcHJpdi0+dHlwZSA9PSAmcGwyMzAzX3R5cGVfZGF0YVtUWVBFX0hYTl0p CisJCXJlcXVlc3QgPSBWRU5ET1JfUkVBRF9OUkVRVUVTVDsKKwllbHNlCisJCXJlcXVlc3QgPSBW RU5ET1JfUkVBRF9SRVFVRVNUOwogCiAJcmVzID0gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2 LCB1c2JfcmN2Y3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAotCQkJVkVORE9SX1JFQURfUkVRVUVT VCwgVkVORE9SX1JFQURfUkVRVUVTVF9UWVBFLAorCQkJcmVxdWVzdCwgVkVORE9SX1JFQURfUkVR VUVTVF9UWVBFLAogCQkJdmFsdWUsIDAsIGJ1ZiwgMSwgMTAwKTsKIAlpZiAocmVzICE9IDEpIHsK IAkJZGV2X2VycihkZXYsICIlcyAtIGZhaWxlZCB0byByZWFkIFslMDR4XTogJWRcbiIsIF9fZnVu Y19fLApAQCAtMjA3LDEyICsyMzMsMTkgQEAgc3RhdGljIGludCBwbDIzMDNfdmVuZG9yX3JlYWQo c3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgdTE2IHZhbHVlLAogc3RhdGljIGludCBwbDIzMDNf dmVuZG9yX3dyaXRlKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIHUxNiB2YWx1ZSwgdTE2IGlu ZGV4KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzZXJpYWwtPmludGVyZmFjZS0+ZGV2Owor CXN0cnVjdCBwbDIzMDNfc2VyaWFsX3ByaXZhdGUgKnNwcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0 YShzZXJpYWwpOwogCWludCByZXM7CisJdTggcmVxdWVzdDsKIAogCWRldl9kYmcoZGV2LCAiJXMg LSBbJTA0eF0gPSAlMDJ4XG4iLCBfX2Z1bmNfXywgdmFsdWUsIGluZGV4KTsKIAorCWlmIChzcHJp di0+dHlwZSA9PSAmcGwyMzAzX3R5cGVfZGF0YVtUWVBFX0hYTl0pCisJCXJlcXVlc3QgPSBWRU5E T1JfV1JJVEVfTlJFUVVFU1Q7CisJZWxzZQorCQlyZXF1ZXN0ID0gVkVORE9SX1dSSVRFX1JFUVVF U1Q7CisKIAlyZXMgPSB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsIHVzYl9zbmRjdHJscGlw ZShzZXJpYWwtPmRldiwgMCksCi0JCQlWRU5ET1JfV1JJVEVfUkVRVUVTVCwgVkVORE9SX1dSSVRF X1JFUVVFU1RfVFlQRSwKKwkJCXJlcXVlc3QsIFZFTkRPUl9XUklURV9SRVFVRVNUX1RZUEUsCiAJ CQl2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDEwMCk7CiAJaWYgKHJlcykgewogCQlkZXZfZXJyKGRl diwgIiVzIC0gZmFpbGVkIHRvIHdyaXRlIFslMDR4XTogJWRcbiIsIF9fZnVuY19fLApAQCAtMjky LDYgKzMyNSw3IEBAIHN0YXRpYyBpbnQgcGwyMzAzX3N0YXJ0dXAoc3RydWN0IHVzYl9zZXJpYWwg KnNlcmlhbCkKIAlzdHJ1Y3QgcGwyMzAzX3NlcmlhbF9wcml2YXRlICpzcHJpdjsKIAllbnVtIHBs MjMwM190eXBlIHR5cGUgPSBUWVBFXzAxOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgcmVz OwogCiAJc3ByaXYgPSBremFsbG9jKHNpemVvZigqc3ByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAo IXNwcml2KQpAQCAtMzEzLDI2ICszNDcsMzcgQEAgc3RhdGljIGludCBwbDIzMDNfc3RhcnR1cChz dHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogCQl0eXBlID0gVFlQRV8wMTsJCS8qIHR5cGUgMSAq LwogCWRldl9kYmcoJnNlcmlhbC0+aW50ZXJmYWNlLT5kZXYsICJkZXZpY2UgdHlwZTogJWRcbiIs IHR5cGUpOwogCisJaWYgKHR5cGUgPT0gVFlQRV9IWCkgeworCQlyZXMgPSB1c2JfY29udHJvbF9t c2coc2VyaWFsLT5kZXYsCisJCQl1c2JfcmN2Y3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAorCQkJ VkVORE9SX1JFQURfUkVRVUVTVCwgVkVORE9SX1JFQURfUkVRVUVTVF9UWVBFLAorCQkJUEwyMzAz X1JFQURfVFlQRV9IWF9TVEFUVVMsIDAsIGJ1ZiwgMSwgMTAwKTsKKwkJaWYgKHJlcyAhPSAxKQor CQkJdHlwZSA9IFRZUEVfSFhOOworCX0KKwogCXNwcml2LT50eXBlID0gJnBsMjMwM190eXBlX2Rh dGFbdHlwZV07CiAJc3ByaXYtPnF1aXJrcyA9ICh1bnNpZ25lZCBsb25nKXVzYl9nZXRfc2VyaWFs X2RhdGEoc2VyaWFsKTsKIAlzcHJpdi0+cXVpcmtzIHw9IHNwcml2LT50eXBlLT5xdWlya3M7CiAK IAl1c2Jfc2V0X3NlcmlhbF9kYXRhKHNlcmlhbCwgc3ByaXYpOwogCi0JcGwyMzAzX3ZlbmRvcl9y ZWFkKHNlcmlhbCwgMHg4NDg0LCBidWYpOwotCXBsMjMwM192ZW5kb3Jfd3JpdGUoc2VyaWFsLCAw eDA0MDQsIDApOwotCXBsMjMwM192ZW5kb3JfcmVhZChzZXJpYWwsIDB4ODQ4NCwgYnVmKTsKLQlw bDIzMDNfdmVuZG9yX3JlYWQoc2VyaWFsLCAweDgzODMsIGJ1Zik7Ci0JcGwyMzAzX3ZlbmRvcl9y ZWFkKHNlcmlhbCwgMHg4NDg0LCBidWYpOwotCXBsMjMwM192ZW5kb3Jfd3JpdGUoc2VyaWFsLCAw eDA0MDQsIDEpOwotCXBsMjMwM192ZW5kb3JfcmVhZChzZXJpYWwsIDB4ODQ4NCwgYnVmKTsKLQlw bDIzMDNfdmVuZG9yX3JlYWQoc2VyaWFsLCAweDgzODMsIGJ1Zik7Ci0JcGwyMzAzX3ZlbmRvcl93 cml0ZShzZXJpYWwsIDAsIDEpOwotCXBsMjMwM192ZW5kb3Jfd3JpdGUoc2VyaWFsLCAxLCAwKTsK LQlpZiAoc3ByaXYtPnF1aXJrcyAmIFBMMjMwM19RVUlSS19MRUdBQ1kpCi0JCXBsMjMwM192ZW5k b3Jfd3JpdGUoc2VyaWFsLCAyLCAweDI0KTsKLQllbHNlCi0JCXBsMjMwM192ZW5kb3Jfd3JpdGUo c2VyaWFsLCAyLCAweDQ0KTsKKwlpZiAodHlwZSAhPSBUWVBFX0hYTikgeworCQlwbDIzMDNfdmVu ZG9yX3JlYWQoc2VyaWFsLCAweDg0ODQsIGJ1Zik7CisJCXBsMjMwM192ZW5kb3Jfd3JpdGUoc2Vy aWFsLCAweDA0MDQsIDApOworCQlwbDIzMDNfdmVuZG9yX3JlYWQoc2VyaWFsLCAweDg0ODQsIGJ1 Zik7CisJCXBsMjMwM192ZW5kb3JfcmVhZChzZXJpYWwsIDB4ODM4MywgYnVmKTsKKwkJcGwyMzAz X3ZlbmRvcl9yZWFkKHNlcmlhbCwgMHg4NDg0LCBidWYpOworCQlwbDIzMDNfdmVuZG9yX3dyaXRl KHNlcmlhbCwgMHgwNDA0LCAxKTsKKwkJcGwyMzAzX3ZlbmRvcl9yZWFkKHNlcmlhbCwgMHg4NDg0 LCBidWYpOworCQlwbDIzMDNfdmVuZG9yX3JlYWQoc2VyaWFsLCAweDgzODMsIGJ1Zik7CisJCXBs MjMwM192ZW5kb3Jfd3JpdGUoc2VyaWFsLCAwLCAxKTsKKwkJcGwyMzAzX3ZlbmRvcl93cml0ZShz ZXJpYWwsIDEsIDApOworCQlpZiAoc3ByaXYtPnF1aXJrcyAmIFBMMjMwM19RVUlSS19MRUdBQ1kp CisJCQlwbDIzMDNfdmVuZG9yX3dyaXRlKHNlcmlhbCwgMiwgMHgyNCk7CisJCWVsc2UKKwkJCXBs MjMwM192ZW5kb3Jfd3JpdGUoc2VyaWFsLCAyLCAweDQ0KTsKKwl9CiAKIAlrZnJlZShidWYpOwog CkBAIC02NzksMTMgKzcyNCwyNyBAQCBzdGF0aWMgdm9pZCBwbDIzMDNfc2V0X3Rlcm1pb3Moc3Ry dWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAlpZiAoQ19DUlRTQ1RTKHR0eSkpIHsKIAkJaWYgKHNwcml2 LT5xdWlya3MgJiBQTDIzMDNfUVVJUktfTEVHQUNZKQogCQkJcGwyMzAzX3ZlbmRvcl93cml0ZShz ZXJpYWwsIDB4MCwgMHg0MSk7Ci0JCWVsc2UKKwkJZWxzZSBpZiAoc3ByaXYtPnR5cGUgPT0gJnBs MjMwM190eXBlX2RhdGFbVFlQRV9IWE5dKSB7CisJCQlwbDIzMDNfdmVuZG9yX3dyaXRlKHNlcmlh bCwgUEwyMzAzX1RZUEVfSFhOX0ZMT1dfQ1RSTCwKKwkJCQkJCVBMMjMwM19UWVBFX0hYTl9DVFJM X1JUU19DVFMpOworCQl9IGVsc2UgewogCQkJcGwyMzAzX3ZlbmRvcl93cml0ZShzZXJpYWwsIDB4 MCwgMHg2MSk7CisJCX0KIAl9IGVsc2UgaWYgKElfSVhPTih0dHkpICYmICFJX0lYQU5ZKHR0eSkg JiYgU1RBUlRfQ0hBUih0dHkpID09IDB4MTEgJiYKIAkJCVNUT1BfQ0hBUih0dHkpID09IDB4MTMp IHsKLQkJcGwyMzAzX3ZlbmRvcl93cml0ZShzZXJpYWwsIDB4MCwgMHhjMCk7CisJCWlmIChzcHJp di0+dHlwZSA9PSAmcGwyMzAzX3R5cGVfZGF0YVtUWVBFX0hYTl0pIHsKKwkJCXBsMjMwM192ZW5k b3Jfd3JpdGUoc2VyaWFsLCBQTDIzMDNfVFlQRV9IWE5fRkxPV19DVFJMLAorCQkJCQkJUEwyMzAz X1RZUEVfSFhOX0NUUkxfWE9OX1hPRkYpOworCQl9IGVsc2UgeworCQkJcGwyMzAzX3ZlbmRvcl93 cml0ZShzZXJpYWwsIDB4MCwgMHhjMCk7CisJCX0KIAl9IGVsc2UgewotCQlwbDIzMDNfdmVuZG9y X3dyaXRlKHNlcmlhbCwgMHgwLCAweDApOworCQlpZiAoc3ByaXYtPnR5cGUgPT0gJnBsMjMwM190 eXBlX2RhdGFbVFlQRV9IWE5dKSB7CisJCQlwbDIzMDNfdmVuZG9yX3dyaXRlKHNlcmlhbCwgUEwy MzAzX1RZUEVfSFhOX0ZMT1dfQ1RSTCwKKwkJCQkJCVBMMjMwM19UWVBFX0hYTl9OT05FX0ZMT1cp OworCQl9IGVsc2UgeworCQkJcGwyMzAzX3ZlbmRvcl93cml0ZShzZXJpYWwsIDB4MCwgMHgwKTsK KwkJfQogCX0KIAogCWtmcmVlKGJ1Zik7CkBAIC03MjYsOCArNzg1LDE0IEBAIHN0YXRpYyBpbnQg cGwyMzAzX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9y dCAqcG9ydCkKIAkJdXNiX2NsZWFyX2hhbHQoc2VyaWFsLT5kZXYsIHBvcnQtPnJlYWRfdXJiLT5w aXBlKTsKIAl9IGVsc2UgewogCQkvKiByZXNldCB1cHN0cmVhbSBkYXRhIHBpcGVzICovCi0JCXBs MjMwM192ZW5kb3Jfd3JpdGUoc2VyaWFsLCA4LCAwKTsKLQkJcGwyMzAzX3ZlbmRvcl93cml0ZShz ZXJpYWwsIDksIDApOworCQlpZiAoc3ByaXYtPnR5cGUgPT0gJnBsMjMwM190eXBlX2RhdGFbVFlQ RV9IWE5dKSB7CisJCQlwbDIzMDNfdmVuZG9yX3dyaXRlKHNlcmlhbCwKKwkJCQkJUEwyMzAzX1RZ UEVfSFhOX1JFU0VUX0RPV05fVVBTVFJFQU0sCisJCQkJCSAwKTsKKwkJfSBlbHNlIHsKKwkJCXBs MjMwM192ZW5kb3Jfd3JpdGUoc2VyaWFsLCA4LCAwKTsKKwkJCXBsMjMwM192ZW5kb3Jfd3JpdGUo c2VyaWFsLCA5LCAwKTsKKwkJfQogCX0KIAogCS8qIFNldHVwIHRlcm1pb3MgKi8KZGlmZiAtLWdp dCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIz MDMuaAppbmRleCA1NTk5NDFjYTg4NGQuLmZiOWRkMmJhNDQ1NiAxMDA2NDQKLS0tIGEvZHJpdmVy cy91c2Ivc2VyaWFsL3BsMjMwMy5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuaApA QCAtMjAsNiArMjAsMTIgQEAKICNkZWZpbmUgUEwyMzAzX1BST0RVQ1RfSURfSENSMzMxCTB4MzMx YQogI2RlZmluZSBQTDIzMDNfUFJPRFVDVF9JRF9NT1RPUk9MQQkweDAzMDcKICNkZWZpbmUgUEwy MzAzX1BST0RVQ1RfSURfWlRFSwkJMHhlMWYxCisjZGVmaW5lIFBMMjMwM19QUk9EVUNUX0lEX0dD CQkweDIzQTMKKyNkZWZpbmUgUEwyMzAzX1BST0RVQ1RfSURfR0IJCTB4MjNCMworI2RlZmluZSBQ TDIzMDNfUFJPRFVDVF9JRF9HVAkJMHgyM0MzCisjZGVmaW5lIFBMMjMwM19QUk9EVUNUX0lEX0dM CQkweDIzRDMKKyNkZWZpbmUgUEwyMzAzX1BST0RVQ1RfSURfR0UJCTB4MjNFMworI2RlZmluZSBQ TDIzMDNfUFJPRFVDVF9JRF9HUwkJMHgyM0YzCiAKIAogI2RlZmluZSBBVEVOX1ZFTkRPUl9JRAkJ MHgwNTU3Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 99A44C43219 for ; Mon, 29 Apr 2019 12:13:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4FE8E20578 for ; Mon, 29 Apr 2019 12:13:01 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LzlIWvcG" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727936AbfD2MNA (ORCPT ); Mon, 29 Apr 2019 08:13:00 -0400 Received: from mail-pl1-f193.google.com ([209.85.214.193]:40061 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727913AbfD2MNA (ORCPT ); Mon, 29 Apr 2019 08:13:00 -0400 Received: by mail-pl1-f193.google.com with SMTP id b3so4985780plr.7 for ; Mon, 29 Apr 2019 05:13:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=VKyjEr/Rfjfh0O04poPnaaNgITAAHAf6lPMgH9siAVU=; b=LzlIWvcGbYmx2nUcOL1hUxDzKluSvNRPNX+4PqCvlqSWAeCEBWlaZmCuQh1jwQsgZc MgG56Pa/GEDl8DkzH3xnEDU3F3f0/+wqZrOEQ/tAqPkVtWj5ipT45ReTBB7yq5xWy/yZ fQT49Hpc6241hQIwANTz1P/f/WekEU4iiO5iCtNqk/Yk8+krZ5XAWFVkcuchm3SvaM6S EoU1AZJrsNp8UG89n2iTnJ0PygRTsKymQ63qWTVQIGWqlfxufKygMvJze2cl0+2rQXM0 YFsO0i2xYOT+6lI3bC8yWjQMvSJnQlK1x8U+KDKSEq84pZEiz+G4pgrrM/8Hlm4lQF52 TsLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=VKyjEr/Rfjfh0O04poPnaaNgITAAHAf6lPMgH9siAVU=; b=SLLPKfwST6dzMQVTshSHz9mXu9hwss9/xoGH9wVOqKCcwcde/Bt7HKx0sQewgIGlk/ lFQLxVEwEdyoHJYOVKZ2OIRFP0LrLV2cQajSbu1moZdhwfsXz8aDe3de4T+5YuiUt8b6 ynDqt90GKndZbNnOyaqxRVbNABtCDGFIPfDKw/jQUR2Uau82Q02R4LmaUKNQTlwghuWS 3Osle6lChtkRn66Dx3kxKFmn62CnTgYZsAeONi7YteiF1CpJVdRO88eRnMal0QotxrDB c5x8VQZ/moUifsNJ09AOE/cyYm0IUTH99KOD5PK1ckAKPVSe9Nd46ZUsS5xJWVUglqjG xy6Q== X-Gm-Message-State: APjAAAUxoRZfWYth/aV69W0Sw9v2noElVdDA7DvkrJH+UFeidzJrtHJw YFhs5PogNO7RCiGoX0BQPeY= X-Google-Smtp-Source: APXvYqzOD/ywPO7aJaEMeOKX2Q6LrcPLJ/qFakyRzTNLuGn+jwLdB6oq5ftlsImUgie/7a6AQTXPFg== X-Received: by 2002:a17:902:e402:: with SMTP id ci2mr26351096plb.154.1556539979065; Mon, 29 Apr 2019 05:12:59 -0700 (PDT) Received: from localhost.localdomain (111-249-15-202.dynamic-ip.hinet.net. [111.249.15.202]) by smtp.gmail.com with ESMTPSA id i3sm47312810pfa.90.2019.04.29.05.12.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 29 Apr 2019 05:12:58 -0700 (PDT) From: Charles Yeh To: gregkh@linuxfoundation.org, johan@kernel.org, linux-usb@vger.kernel.org Cc: charles-yeh@prolific.com.tw, Charles Yeh Subject: [PATCH] [PATCH v2] USB:serial:pl2303:Add new PID to support PL2303HXN (TYPE_HXN) Date: Mon, 29 Apr 2019 20:12:37 +0800 Message-Id: <20190429121237.13136-1-charlesyeh522@gmail.com> X-Mailer: git-send-email 2.21.0.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Message-ID: <20190429121237.j97t1RrPnZSvENkVaaYXF63Ye5HO6wPzWuqKs6fKtho@z> Prolific has developed a new USB to UART chip: PL2303HXN PL2303HXN : PL2303GC/PL2303GS/PL2303GT/PL2303GL/PL2303GE/PL2303GB The Vendor request used by the PL2303HXN (TYPE_HXN) is different from the existing PL2303 series (TYPE_HX & TYPE_01). Therefore, different Vendor requests are used to issue related commands. 1. Added a new TYPE_HXN type in pl2303_type_data, and then executes new Vendor request,new flow control and other related instructions if TYPE_HXN is recognized. 2. Because the new PL2303HXN only accept the new Vendor request, the old Vendor request cannot be accepted (the error message will be returned) So first determine the TYPE_HX or TYPE_HXN through PL2303_READ_TYPE_HX_STATUS in pl2303_startup. 2.1 If the return message is "1", then the PL2303 is the existing TYPE_HX/ TYPE_01 series. The other settings in pl2303_startup are to continue execution. 2.2 If the return message is "not 1", then the PL2303 is the new TYPE_HXN series. The other settings in pl2303_startup are ignored. (PL2303HXN will directly use the default value in the hardware, no need to add additional settings through the software) 3. In pl2303_open: Because TYPE_HXN is different from the instruction of reset down/up stream used by TYPE_HX. Therefore, we will also execute different instructions here. 4. In pl2303_set_termios: The UART flow control instructions used by TYPE_HXN/TYPE_HX/TYPE_01 are different. Therefore, we will also execute different instructions here. 5. In pl2303_vendor_read & pl2303_vendor_write, since TYPE_HXN is different from the vendor request instruction used by TYPE_HX/TYPE_01, it will also execute different instructions here. Signed-off-by: Charles Yeh --- drivers/usb/serial/pl2303.c | 107 +++++++++++++++++++++++++++++------- drivers/usb/serial/pl2303.h | 6 ++ 2 files changed, 92 insertions(+), 21 deletions(-) diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index bb3f9aa4a909..d938091ba4cc 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c @@ -47,6 +47,12 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) }, { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ZTEK) }, { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_TB) }, + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GC) }, + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GB) }, + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GT) }, + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GL) }, + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GE) }, + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GS) }, { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID), @@ -129,9 +135,11 @@ MODULE_DEVICE_TABLE(usb, id_table); #define VENDOR_WRITE_REQUEST_TYPE 0x40 #define VENDOR_WRITE_REQUEST 0x01 +#define VENDOR_WRITE_NREQUEST 0x80 #define VENDOR_READ_REQUEST_TYPE 0xc0 #define VENDOR_READ_REQUEST 0x01 +#define VENDOR_READ_NREQUEST 0x81 #define UART_STATE_INDEX 8 #define UART_STATE_MSR_MASK 0x8b @@ -145,11 +153,19 @@ MODULE_DEVICE_TABLE(usb, id_table); #define UART_OVERRUN_ERROR 0x40 #define UART_CTS 0x80 +#define PL2303_READ_TYPE_HX_STATUS 0x8080 +#define PL2303_TYPE_HXN_FLOW_CTRL 0x0A +#define PL2303_TYPE_HXN_CTRL_RTS_CTS 0xFA +#define PL2303_TYPE_HXN_CTRL_XON_XOFF 0xEE +#define PL2303_TYPE_HXN_NONE_FLOW 0xFF +#define PL2303_TYPE_HXN_RESET_DOWN_UPSTREAM 0x07 + static void pl2303_set_break(struct usb_serial_port *port, bool enable); enum pl2303_type { TYPE_01, /* Type 0 and 1 (difference unknown) */ TYPE_HX, /* HX version of the pl2303 chip */ + TYPE_HXN, /* HXN version of the pl2303 chip */ TYPE_COUNT }; @@ -179,16 +195,26 @@ static const struct pl2303_type_data pl2303_type_data[TYPE_COUNT] = { [TYPE_HX] = { .max_baud_rate = 12000000, }, + [TYPE_HXN] = { + .max_baud_rate = 12000000, + }, }; static int pl2303_vendor_read(struct usb_serial *serial, u16 value, unsigned char buf[1]) { struct device *dev = &serial->interface->dev; + struct pl2303_serial_private *spriv = usb_get_serial_data(serial); int res; + u8 request; + + if (spriv->type == &pl2303_type_data[TYPE_HXN]) + request = VENDOR_READ_NREQUEST; + else + request = VENDOR_READ_REQUEST; res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), - VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE, + request, VENDOR_READ_REQUEST_TYPE, value, 0, buf, 1, 100); if (res != 1) { dev_err(dev, "%s - failed to read [%04x]: %d\n", __func__, @@ -207,12 +233,19 @@ static int pl2303_vendor_read(struct usb_serial *serial, u16 value, static int pl2303_vendor_write(struct usb_serial *serial, u16 value, u16 index) { struct device *dev = &serial->interface->dev; + struct pl2303_serial_private *spriv = usb_get_serial_data(serial); int res; + u8 request; dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, index); + if (spriv->type == &pl2303_type_data[TYPE_HXN]) + request = VENDOR_WRITE_NREQUEST; + else + request = VENDOR_WRITE_REQUEST; + res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), - VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE, + request, VENDOR_WRITE_REQUEST_TYPE, value, index, NULL, 0, 100); if (res) { dev_err(dev, "%s - failed to write [%04x]: %d\n", __func__, @@ -292,6 +325,7 @@ static int pl2303_startup(struct usb_serial *serial) struct pl2303_serial_private *spriv; enum pl2303_type type = TYPE_01; unsigned char *buf; + int res; spriv = kzalloc(sizeof(*spriv), GFP_KERNEL); if (!spriv) @@ -313,26 +347,37 @@ static int pl2303_startup(struct usb_serial *serial) type = TYPE_01; /* type 1 */ dev_dbg(&serial->interface->dev, "device type: %d\n", type); + if (type == TYPE_HX) { + res = usb_control_msg(serial->dev, + usb_rcvctrlpipe(serial->dev, 0), + VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE, + PL2303_READ_TYPE_HX_STATUS, 0, buf, 1, 100); + if (res != 1) + type = TYPE_HXN; + } + spriv->type = &pl2303_type_data[type]; spriv->quirks = (unsigned long)usb_get_serial_data(serial); spriv->quirks |= spriv->type->quirks; usb_set_serial_data(serial, spriv); - pl2303_vendor_read(serial, 0x8484, buf); - pl2303_vendor_write(serial, 0x0404, 0); - pl2303_vendor_read(serial, 0x8484, buf); - pl2303_vendor_read(serial, 0x8383, buf); - pl2303_vendor_read(serial, 0x8484, buf); - pl2303_vendor_write(serial, 0x0404, 1); - pl2303_vendor_read(serial, 0x8484, buf); - pl2303_vendor_read(serial, 0x8383, buf); - pl2303_vendor_write(serial, 0, 1); - pl2303_vendor_write(serial, 1, 0); - if (spriv->quirks & PL2303_QUIRK_LEGACY) - pl2303_vendor_write(serial, 2, 0x24); - else - pl2303_vendor_write(serial, 2, 0x44); + if (type != TYPE_HXN) { + pl2303_vendor_read(serial, 0x8484, buf); + pl2303_vendor_write(serial, 0x0404, 0); + pl2303_vendor_read(serial, 0x8484, buf); + pl2303_vendor_read(serial, 0x8383, buf); + pl2303_vendor_read(serial, 0x8484, buf); + pl2303_vendor_write(serial, 0x0404, 1); + pl2303_vendor_read(serial, 0x8484, buf); + pl2303_vendor_read(serial, 0x8383, buf); + pl2303_vendor_write(serial, 0, 1); + pl2303_vendor_write(serial, 1, 0); + if (spriv->quirks & PL2303_QUIRK_LEGACY) + pl2303_vendor_write(serial, 2, 0x24); + else + pl2303_vendor_write(serial, 2, 0x44); + } kfree(buf); @@ -679,13 +724,27 @@ static void pl2303_set_termios(struct tty_struct *tty, if (C_CRTSCTS(tty)) { if (spriv->quirks & PL2303_QUIRK_LEGACY) pl2303_vendor_write(serial, 0x0, 0x41); - else + else if (spriv->type == &pl2303_type_data[TYPE_HXN]) { + pl2303_vendor_write(serial, PL2303_TYPE_HXN_FLOW_CTRL, + PL2303_TYPE_HXN_CTRL_RTS_CTS); + } else { pl2303_vendor_write(serial, 0x0, 0x61); + } } else if (I_IXON(tty) && !I_IXANY(tty) && START_CHAR(tty) == 0x11 && STOP_CHAR(tty) == 0x13) { - pl2303_vendor_write(serial, 0x0, 0xc0); + if (spriv->type == &pl2303_type_data[TYPE_HXN]) { + pl2303_vendor_write(serial, PL2303_TYPE_HXN_FLOW_CTRL, + PL2303_TYPE_HXN_CTRL_XON_XOFF); + } else { + pl2303_vendor_write(serial, 0x0, 0xc0); + } } else { - pl2303_vendor_write(serial, 0x0, 0x0); + if (spriv->type == &pl2303_type_data[TYPE_HXN]) { + pl2303_vendor_write(serial, PL2303_TYPE_HXN_FLOW_CTRL, + PL2303_TYPE_HXN_NONE_FLOW); + } else { + pl2303_vendor_write(serial, 0x0, 0x0); + } } kfree(buf); @@ -726,8 +785,14 @@ static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port) usb_clear_halt(serial->dev, port->read_urb->pipe); } else { /* reset upstream data pipes */ - pl2303_vendor_write(serial, 8, 0); - pl2303_vendor_write(serial, 9, 0); + if (spriv->type == &pl2303_type_data[TYPE_HXN]) { + pl2303_vendor_write(serial, + PL2303_TYPE_HXN_RESET_DOWN_UPSTREAM, + 0); + } else { + pl2303_vendor_write(serial, 8, 0); + pl2303_vendor_write(serial, 9, 0); + } } /* Setup termios */ diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h index 559941ca884d..fb9dd2ba4456 100644 --- a/drivers/usb/serial/pl2303.h +++ b/drivers/usb/serial/pl2303.h @@ -20,6 +20,12 @@ #define PL2303_PRODUCT_ID_HCR331 0x331a #define PL2303_PRODUCT_ID_MOTOROLA 0x0307 #define PL2303_PRODUCT_ID_ZTEK 0xe1f1 +#define PL2303_PRODUCT_ID_GC 0x23A3 +#define PL2303_PRODUCT_ID_GB 0x23B3 +#define PL2303_PRODUCT_ID_GT 0x23C3 +#define PL2303_PRODUCT_ID_GL 0x23D3 +#define PL2303_PRODUCT_ID_GE 0x23E3 +#define PL2303_PRODUCT_ID_GS 0x23F3 #define ATEN_VENDOR_ID 0x0557 -- 2.20.1