From owner-freebsd-wireless@freebsd.org Sun Jun 3 21:01:20 2018 Return-Path: Delivered-To: freebsd-wireless@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 12E2BFD5687 for ; Sun, 3 Jun 2018 21:01:20 +0000 (UTC) (envelope-from bugzilla-noreply@FreeBSD.org) Received: from mailman.ysv.freebsd.org (mailman.ysv.freebsd.org [IPv6:2001:1900:2254:206a::50:5]) by mx1.freebsd.org (Postfix) with ESMTP id 79E0E7C696 for ; Sun, 3 Jun 2018 21:01:19 +0000 (UTC) (envelope-from bugzilla-noreply@FreeBSD.org) Received: by mailman.ysv.freebsd.org (Postfix) id 394B4FD5638; Sun, 3 Jun 2018 21:01:19 +0000 (UTC) Delivered-To: wireless@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id ECC44FD5632 for ; Sun, 3 Jun 2018 21:01:18 +0000 (UTC) (envelope-from bugzilla-noreply@FreeBSD.org) Received: from mxrelay.ysv.freebsd.org (mxrelay.ysv.freebsd.org [IPv6:2001:1900:2254:206a::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.ysv.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 329D27C680 for ; Sun, 3 Jun 2018 21:01:18 +0000 (UTC) (envelope-from bugzilla-noreply@FreeBSD.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.ysv.freebsd.org (Postfix) with ESMTPS id 582552CE29 for ; Sun, 3 Jun 2018 21:01:17 +0000 (UTC) (envelope-from bugzilla-noreply@FreeBSD.org) Received: from kenobi.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id w53L1HUO001962 for ; Sun, 3 Jun 2018 21:01:17 GMT (envelope-from bugzilla-noreply@FreeBSD.org) Received: (from bugzilla@localhost) by kenobi.freebsd.org (8.15.2/8.15.2/Submit) id w53L1HoA001952 for wireless@FreeBSD.org; Sun, 3 Jun 2018 21:01:17 GMT (envelope-from bugzilla-noreply@FreeBSD.org) Message-Id: <201806032101.w53L1HoA001952@kenobi.freebsd.org> X-Authentication-Warning: kenobi.freebsd.org: bugzilla set sender to bugzilla-noreply@FreeBSD.org using -f From: bugzilla-noreply@FreeBSD.org To: wireless@FreeBSD.org Subject: Problem reports for wireless@FreeBSD.org that need special attention Date: Sun, 3 Jun 2018 21:01:17 +0000 MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.26 X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 03 Jun 2018 21:01:20 -0000 To view an individual PR, use: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=(Bug Id). The following is a listing of current problems submitted by FreeBSD users, which need special attention. These represent problem reports covering all versions including experimental development code and obsolete releases. Status | Bug Id | Description ------------+-----------+--------------------------------------------------- New | 206801 | iwn(4) page fault on netif restart Open | 154598 | [ath] Atheros 5424/2424 can't connect to WPA netw Open | 163312 | [panic] [ath] kernel panic: page fault with ath0 Open | 166190 | [ath] TX hangs and frames stuck in TX queue Open | 166357 | [ath] 802.11n TX stall when the first frame in th Open | 169362 | [ath] AR5416: radar pulse PHY errors sometimes in Open | 169433 | [iwn] iwn(4) doesn't support 6235 chip. Open | 211689 | panic with lagg failover wireless ath and iwm 8 problems total for which you should take action. From owner-freebsd-wireless@freebsd.org Thu Jun 7 00:12:16 2018 Return-Path: Delivered-To: freebsd-wireless@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id DF8F4FE869B for ; Thu, 7 Jun 2018 00:12:15 +0000 (UTC) (envelope-from khanzf@gmail.com) Received: from mail-it0-x22f.google.com (mail-it0-x22f.google.com [IPv6:2607:f8b0:4001:c0b::22f]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 6E77072EFA for ; Thu, 7 Jun 2018 00:12:15 +0000 (UTC) (envelope-from khanzf@gmail.com) Received: by mail-it0-x22f.google.com with SMTP id a195-v6so10565963itd.3 for ; Wed, 06 Jun 2018 17:12:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=p6+MbiXn4rXBmhEbu53G9klW/tSZm0tswvDeBXNHCUg=; b=ShIjbLcHIr54E6RUK2lD9b7T8GCb6zQkQf1OCWqIjDPd+b3YxfRKglzU+AQUXnJ0MO PfxigfaWC9h5OBXOO76Gze21bDbAicEfEaudJacL9k5Ym2U0exsDDO8y2KNOp/+yUXWt rN4t6GENB4JuHSmjup/aH0JznJ3gcAJaMgUM2sWzzIlgefvfefTiOuF4I+iDf34OQTWz J0vqAA778XZ41szjYPWaHSYjgFnOLkqJjiQrN62kiZsAELb1xAERxtjFLv/S5mgIWElH ABpoWq1nyZscgGXaVqmyFHngkroEdMqg2G8sL2sXhyI8QDXH2Kiku146xdgnp/dcx7mA l5nQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=p6+MbiXn4rXBmhEbu53G9klW/tSZm0tswvDeBXNHCUg=; b=Di2Pw6v9L8+HXljNpUblwVJXegojdygsDOezzdyX9Eh2vk8HuoJC7OlpqwsjKzkrPz X/yRl+X7sc/+i4H4zlikmgBYkU/BZpqWtEygSSbNAlD26UA1vD5lrkM49OKw49OJHguF nhgXCLp7S2H0i+dnRjmyvCfvXindjcSd8/BR9LLB9NZQbp0eNGZgRQu60arzgTNp0zWu ZNA3fBCGRUFS2k0eOsydHMmekFkrtcIS2tvkqT56G5sGwP9/gCP+1qElHwh4pV4LD/BD QxJIMyUJXOtYB18AL9WwO5Ocst/EavaCqQY9KJ26ITQO5hZmpxZpzWHmYfLFzFPOJF6q xhIw== X-Gm-Message-State: APt69E1uqcCXKTsQxFoclyvrKN+0hrekkdydzhc0/IqGEWW/Dvw1GmZP r93CKejDtTogbVghgp9UGlDs81h/wmzCjttE8zv+A8Bv X-Google-Smtp-Source: ADUXVKIX73vbhsCQecGllfvGnkEDSnMFfgaIRDiEeJC/fuLnfvTK8DyCoYgaSfXDC6IFaxaNyknDFcjMBD4qQLiVNfY= X-Received: by 2002:a24:3c42:: with SMTP id m63-v6mr40207ita.138.1528330334557; Wed, 06 Jun 2018 17:12:14 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:ac0:a148:0:0:0:0:0 with HTTP; Wed, 6 Jun 2018 17:11:53 -0700 (PDT) From: Farhan Khan Date: Wed, 6 Jun 2018 20:11:53 -0400 Message-ID: Subject: RTL8188EE monitor mode patch To: freebsd-wireless@freebsd.org Content-Type: multipart/mixed; boundary="000000000000b10597056e022282" X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 07 Jun 2018 00:12:16 -0000 --000000000000b10597056e022282 Content-Type: text/plain; charset="UTF-8" Hi all, First ever patch submission, quite nervous. I have attached the diff to this email. This is for the Realtek rtl8188ee PCI driver. Currently only works in monitor mode and will receive wireless frames. I am very interested in moving forward with getting read/write working. Known bugs: * Unloading the driver without bringing it down will result in a kernel panic. This appears to be an issue with the firmware running C2H code, and then attempting to write back to memory that was freed by the kernel. * Bringing the interface down, then back up will cause frames to arrive in spurts or not at all. This behavior only seemed to start after git commit 960c0f3d880f9767027c05614f2184ce4b93fa99. One solution is to revert sys/dev/rtwn/pci/* to the previous state and the issue appears to stop. You will notice what appear to be a lot of hard-coded register values. This is because I am basing this off of the Linux driver, and Realtek does not provide any documentation on how their driver works. My git repository is here: https://github.com/khanzf/freebsd Please let me know if there are any bugs or problems that need to be remediated. Thank you, -- Farhan Khan PGP Fingerprint: B28D 2726 E2BC A97E 3854 5ABE 9A9F 00BC D525 16EE --000000000000b10597056e022282 Content-Type: text/x-patch; charset="US-ASCII"; name="patch_rtl8188ee.diff" Content-Disposition: attachment; filename="patch_rtl8188ee.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ji3s12na0 ZGlmZiAtLWdpdCBhL3N5cy9jb250cmliL2Rldi9ydHduL3J0d24tcnRsODE4OGVlZncuZncudXUg Yi9zeXMvY29udHJpYi9kZXYvcnR3bi9ydHduLXJ0bDgxODhlZWZ3LmZ3LnV1Cm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi42OGRmNDNjYTk5ZAotLS0gL2Rldi9udWxsCisr KyBiL3N5cy9jb250cmliL2Rldi9ydHduL3J0d24tcnRsODE4OGVlZncuZncudXUKQEAgLTAsMCAr MSwyNTMgQEAKK2JlZ2luIDY0NCBydHduLXJ0bDgxODhlZWZ3LmZ3CitNWDhAMGBgQGBgYGAwKTIl NkwiTGBgKigkYGBgYGBgYGBgYGBgYGBgYGBgYCIxMzRgYGBgYGBgYGBgYGBgCitNYGBgYGBgYGBQ NThgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCitNYGBg YGBgYGBgYGBgSDxUYGBgYGBgYCNBX2BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg CitNYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg YGBgYGBgCitNYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg YGBgYGBgYGBgYGBgCitNYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg YGBgYGBgYGBgYGBgYGBgYGBgCitNYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCitNYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCitNYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBg YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCitNYGBgYGBgYGBgYGBgYGBgYGBg YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCitNYGBgYGBgYGBgYGBg YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCitNYGBgYGBg YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCitN YGBgYGAsKk9AL1hSJEQoJEE9YCs9PWAoSk4jIkMuNiopJj9VQk42LC0nR1VDLSosWyIyKV4uOlxg UClUCitNX1wuNUA7MWBgJCMuPjAxWEAhO0YiJ2ArUEpfRiwuJCMxIUNWVEpcKFY+V0pCXWBCWTBT XyhSMiFeYFwoCitNIitcJCEnXGA+KCdGLC4zUmAuNCxQWV0wKGA0LD0oQEUjL0NGXzo6ISIuOk4j K1gjYEczX1M/Q0g7NiNACitNIi47YFgoI1ZZMFMzR1RgR1kwUERCP0NGS0BSXmBQKVRfX1Q4WUxX WFk4JU04YDswWC84OEAvN0UjIjIoCitNUi84NSMoIzNZMFBDKSgnWD9QMyJLXjhQWGAsMFhAUV9g IyNBIVMjQyEnXCg1LzE0Pyw7MktVMmAwQDxCCitNPihCRkA3MCM4YDtfIic7X1dfTV8hLjFYQC84 KF1AQz9eR0IhPUMiMDE8NVRgOS9gWC4yM1AuISNCMCVVCitNQkYhVUMnRzJDLSpPKEAvT1RZMCMw YC1fX1IpVEAyXE9eLjhAWT8zIkteOSQsLzsyS1pYLFtMLj80IiQuCitNPShATl4uO1kiLjg4T0As Ij0vX11bNkVAIjBHRyYxR1ciMEZgXFE4NkAtS05UWV1gIWA2ISE4J05UWV1gCitNKEcyKCtPQChZ T0dOTTBQIko4JDghQDtGXz5VSThgRDkmPjwpIj88OUAvLD5ALUdPKShDWFlAM1hbUlwkCitNRCQ3 JURfOChbUl4zXUdcYChOXzNFYC1gYFdfXyhOXEMpKCdYWUMjRV0sKk9ZRTIsXU0qT1kwUlUhUElU CitNQiJfWFlPNiFgRCktNCJZVEIyX1hZS1wjYEczX18xQ0ZeNzIoK19DW1lPU0k7JmAoSmA3R11B VDlALzJICitNYFo4JSdeNCxNMD9DP1BgQj0oRE9eLjtdJig4ISNXMigrX0JGYDBCJiEuNCxNMDwi SygnTTsmYCgjMEZICitNIT47V0AvM0UjKzQnV0hGIT9QYEJbXS40YFRgIz9fXEJbUixEQD9DIkte OFBZMDRQWGArMlktK0JRTSpPCitNP1BgUFhAJC9gRCksQ18jRF9fW0UjIixEQC9DIkozI1cjN1wo WUZgKys/OUAsJWBOQGA8UFwwO01dRmBFCitNP0AoKCwvYDBQSl9GJC48QyNDI0IjLSpPP1AyYCRM Kk9ZQSNHJFUzTDNPOzJLUCkiMzdcKCIuXSRAXzMiCitNS1U7JlRKXTRAJF9fKEw3UF4qL0AqLyMl XC9DRUBBNiI8YCg1QF5gWFwiK082X19ONk9bTTY/V0w2L1BCCitNW1RPX1tES15bNEddWyRDXChO I1xIXiNdSF4jXkheI18oTiNYSF4jWUheI1pIXiNbKEowRUBPNiJZP2BVCitNQF82IyhOI1tIXiNa SF4jWShOT1BIXktQSF5HUChNIiNUKCtYWSktUCRHMCFEV2AtSFouM14nMCFEXzYiCitNQigvRDxX MCJEVkFAW1ouQ0hYIz9gRDVTYEQrPVkpLkNeLjIzSFRgI11IYCFcQEM/XShgSVkpLkNeJTAnCitN KWBTKFBTLyQ1YF0kKCxCIzBgM1Q1SGAhMU87P1koYCtgMCgkIiFgQDAoIjAxO0NEP0AmMzgrUkNf VTBfCitNLC40KTUhX15ZKS5DOGAkLlNVM2ApPiFASiQiWFkpLkNeTjIzSF9DRERaLyhROCsoUkw2 I1JPIkNSLDYiCitNUixLJUBcSz9aPVtHQCtYYDA4JjdgJCYhRmAhIUA6MGA0MzE3MkU8VjYiR2BY LCNQUCgvYEBMIzA9PWBgCitNUGAjYGA8YCJQYC9gISxgJVBgO2AhWWAhUSczLVwnMSVIXyMxJycz LSEpYCFRLyFUMTovUFRgPzAhTWAlCitNVGAzMGBdYCJUYCcwYC0jMFQoKzBAXSNQVC5gUkRgITRY JTRVXTNGQ1glNFZdM0pDWCU0V10zTkNYJTRYCitNXTNSTS43XTQkQyg+SzNJXzUxKFInSlRbP1U4 MixBWk0vJ103JEMoPjRZJ08oTCNAUC8jYEBcIiJQLSFVCitNVGAjYGAsYCFQYCtgYFxgJFBgN2Ah TGAnRGAnJD0lO1A9JDpDXCEpQyhONSEsLjAkP1AqMSleNSMsLmAiCitNVD8zRTBTI0FgUSktTl41 IywuKCMkRFgqWTQsUFhQLDI4V19FMFMjRGBPJlBZNCxQWTArUVdONSMsLjgiCitNXDhPRTEjI0Fg TSdKPSU4JERgJyRcJzEmSF8jMCFdYCZUYDcwIS1gI1RgKzBgPWBgVC0jMEBNIiNULyMwCitNWCMq MEAuP0A4YCwyM0gwQkQoJCpYJmAvWS8iMCE1L0AxYCtQRGA3XFhgM1BZL14wQC4/QDgnRjBAKi9A CitNOWAlUDw5ImBZTiMkNWBdQCkiM144YCwkPCFeMEAuW0AlLyNAX0ZgJkQoI1BYJmAvW0dgJkQo I01YKi9QCitNP1AmYGBHXCFbVmBfRCgjS1gkMDBcKSJgXC4hQGBbMCEiPjNVJzkiYFwuImAjPjNV JzkiYFwuIVVcYC5ECitNKS9bX0QoI09YIlwyM08uMGA1PVQhPyIwQC5LQCguKCMkREtgKEkiYEhe IlRgMS4wQC4/QDhgVjBALk9ACitNNS9bUDVgPVBgTyZGKEkiYFo+I18/MCQiMkwyMEAqL0A5YCVQ KTkiYFleIUAnWWAhNV4zUERgJFw9YCtQCitNRCgjRFglM1tcKSJgWl4hNF8/ITQhV2AiXDo4QkQo IkNYKzAhJUkiYFleIUAkKSJgWU4hNCNWMCI4YCwiCitNOkRIMjNDVEJQLiNgXCwiI1AoK2BUJzcw YCxgYFBgJ2BgTGAjUGAzYCE8YCZQYD4wYDwxVF8vIVQxWi9QCitNJEYtL1k0RFBYMCgxRS41KSwu KCMkRi5BWTREUFhQLDI4XVdFMkMjQGBRKUQmPjUqLC4wIyRGMlhZNFBQCitNWDA1X2BRKSQpXjUs LC4wIiQ5W0UzIyNFYFEpRFNONSwsLjgjJEY1RD0vUCREYCckXCcxJ0hfIzAhXWAmCitNVGA3MCEt YCNUYCswYD1gYFQtIzBATSIjVC8jMFgjKjBALj9AOGAsMjpPTEJMMkowQC5XQCUpYCU8XyFdCitN YEdcIjQ2LjBAMCdALC5gTUQoIkNYKzAhKUkiIUkuYCRcLiJUIkBOMEAwL0AhLyNERCgmRFwpIiFg XiNfCitNRCgkIlgrNCchPjJDXCEnRChOM19DVS4wISFXQDghQjAhMitAXTU5VF9fI1FcO1whYEMl PERgNEJZNTtQCitNQGAoUTcpYCQnVzBAXCdcIShHMD8rPzYiWSMzXF04L0A1I19QW1ZgPT0iJE1d OCtELS9TVUBeISQkLyFUCitNJ1JXVUBOMFRfLzYjWCQyYFwiKVQoMldVQE4wVF8vNiNYJTNPXCcw Pys/NiJZIzNcXTgvQDEkI1AoSSJgCitNIS4jXz8wJFFeOFk0Q1U2TTU6UTRLVSxRJDpdNUtFMjAh KCNANWBfXUtgPVQkMlNVQE4wVF8vNiNYJDAhCitNXCcwMSsvNiJZIzNcXTgvQDUvT1BLYD1UJUJT VUBOMFRfLzYjWCQzWlwnMDUrLzYiWSMzXF04L0AxIV9QCitNS2A9VCFCU1VATjBUXy82I1gkMC9c KWAkNF4zUERgMTJcKWAkNDczX1wpYCQ0JzNdXCcwNCsvNiJZIzNcCitNXTgvQDUsIS1fNzA0K182 IlkjM1xdOC9NXCIrMyQqXCFQXCMwRCgmPFs/IjBAOU9PXC4zXV8hKUs2N1BgCitNSzA+MEA5T0BE YDBFXCkiIUcuIUAjRzAvK182IlkjM1xdOC9AMSgjUEtQNVQiIl9VQE4wVF8vNiNZLyFUCitNIjJf VUBOMFRfLzYjWCUzUFwnMEErPzYiWSMzXF04L0A1Lz9QS0AyTyE9IzBESlxCPSNUT14uOS1fTzlU CitNLCJfVUBOMFRgPzYjW09gQkRgJFY9J0NQSFcwIlwnVVhfVSVDPzApX2BVJUNEYDgqWCQwJ1wp ImBcSi9ACitNRGA1OFwpImBIXiJUYDEyMEAuN0A1L09QRCgjSlgiI0IjN1QhP1AyYCMpImBZPiEk IS9gQj8wJV8hLSwwCitNS1AnI1AtIjBAOidNXCkiYFpOIjBAOitQRCgjRFgvWyQkUS00YFMjQGBI JDZbTDAzJFEtNGAzI0BgSCQ2CitNRCgmQlgvWU88YCohJU5dUGBGJi0pL1lQYEYnJikvWUAyMjNc PGAqIWAyM1w4YCohJU5aVCNAKjFFSSIhCitNSE4hUCEnXCFEO1owQDorQE1gOCJENyIwQDorQE1g MC5EKCZBWC9dQCExKUlASGAiXDU+MEA6K0A5YEFACitNYEgkNiRGOidAMTowQDorQDxgMV9gOSZe RCgmQlgrMCZgSSVQRCgmQlgrMC4hWSQ7T1AkIkQ5OjBAOitACitNOWBRQGBIJDZEMU9POWAlQGBI JDZEPUIhJUkiIUhOIlQjQD4xJltcIWBJJjZEKCZCWCswJmBJJVBEKCZCCitNWCswLCFZJDtPUCQi RD1CMEA6K0A5YDFQNyEpSFUuXURgNyE0TDBaYDQpIiFITiJUI0A+MSZbXCFgSSY2CitNRCgmQlgr MCZgSSVQRCgmQlgrMCwhWSQ7T1AkIkQ9QjBAOitAPGAxX2A5Jl5EKCZCWCswJCZBKUlRKGA1CitN RCgmQlgrMCwjSSJgWT4jXyRRLTQvUyNAYE8nR1QtIjJLUitROk5dRGA2YChEYCZYPWAnUEAjVjBA LjNACitNX1EsMyRVMD8sLmAoRGAmWD1gK1BAIkNPUSUwLywuYChEYCZYPWAzUEAhRjBALkdAVFkw JDBgQjBgO0FUCitNIi8iYCIpYCFOLjNQP1AkQkRgJlk9YCtQP1BgQkQoI0VYKWAmISIjQCMuISQw LyIwQC5JVCEvImAiTiE0CitNP18iMEAuSVQjLyIwITIrRFwiKjBALjdAUFEsQFhgQjBALklUIy8i YCQ5YCYhLiEkMC8jQDEoI1BEKCNKCitNPWAzUERgNEJZL2BCRCgmQ1tfYDI5QFIwQDovQDhgNjAh MitEXCkiYFpHMCRcIiowQCovQDlgJVArOSJgCitNWT4hNF8/IjAhMilUO18hX2AxJ0ZPUCQuRCgj RFgkMmBcKSJgWkcwLlwiKjBgO0VUYD8iMGA7QCRcIiowCitNITIpVF9fI1FcOWAhLVcwIlwvVV9g VSVDJEY6MFkpImBaT2BCRCgjR1gmYE1EKCJDWCYwITwiNjBALltQCitNISZgPkQoI0tYJDAwXC4z VSc5ImBbXSdSRGAlNz1gN1BEKCNKWCIjQmBFJ2AoTl1QLUdVWD9QKlFIV1QiCitNP1AuUUhXVyg/ UCgyOVZaMGA1P0RcKWAhLycwIlwnVCE/UFExUSkiYFkuITRdXyE0W18iMCFAS0A1L0NQCitNKEQl WD8wKV9gSyZDPzAlX2BHMF0rX0NGX05XVDdPW1Y9I2BPXTgrRC1gJ1VAXltQKEkiYFleIUAxOSJg CitNWT4jXyRRLDM1IVxQWCEqMGAzT0AsLjArTDlGMEAuV0AlKWAlPF8iMEA5R0Q9P2AhJEQySVBZ IiFGTiI0CitNQCkiIUY+IURAKTJgMGBOMGA5Q0A1L1tQWCQwIVwvJlNgOl4wQC5LQDlgKUAqQSlK OTkiYFk+YDMkUS00CitNJ1MjQCU5ImBbPiNfSF4hTzxgTDI5VEpRRjkiYFtOYDRcKWAhWU5gJFwi KjBgNV9EXClgIS8nMChcLjNVCitNJzkiYF5OIyMkVTFfXTFbRF5fVV83J1ghVD9SMGA1XVQhPyIw IUkpVGBPIjBALjNAMSEjUEQoI0pYJjAsCitNOGBLRF83XCw0PDNEX1EnRihJImBZXiFEYDchPkQo I0ZYJTAvOCRaMEAuS0A8YC9fRDtaMEAuS0A5YFFACitNYE8lN0RgJTtZLyIwYDNRVCEvI1E6Tl1E YDdgUV0xVjBAL0tAUFEtND9fND5ZL09dP1VBXmA9J1xEYCU7CitNPWA3UERgOjI9YCdQRCgjRFgk MChcIiowQC5LQDxgKTFQIitQWS80PUQoI1lYLzQ+WS9PXT9VMV5gOFg5CitNQ1FLRSdFMCdRIy00 WCg0OUBYNDpATyNFJzUwJ1EjLTRYL19FJ0EsMyRVMD8zWi9QWlUwJ1EjLTRYL19FCitNJzEsMyRV MD8zWDQ6QEg0OUBaLkNcK1QhIyg0OkBIWiNIWi5DPWAvUChINDpASDQ5QFouQ0hXMCFcIiowCitN IUAzQDUnX1BEYDRCWS8iMEAuSVQjL2BCRGAwOlgvMUBgV1xgKElgJCZeITQhVjAnP1AlQGBHXGAo SSIhCitNPiEpJSFBKUhESSJgWV4jX0w1WjBALj9AOCFGMEA3QDIxL1YwYGAkMidbVTQjX14wYGAo MidbV10kRkJDCitNKEkiISEuYFBYIlIwQDA/QCEvI0BfWSIhIT4iVSFRVjAhSStANSFRUCJBJ0RE KCQoWGAzUEBgOjAhSSlUCitNJy8jREQoJCdcIigyOUkiMEAuSVQiL2BCWSkiIUc/IkNcKWAlXi4h UCNaL0A8YE5DWCdgJ0heIVBgV1whCitNKE0uMEA5W0BFLkIwQDlXQEVgLWAiSWAhUC4hJCgvIV9g IilfLEdYYCRDKkpEKCY9WSc3UGAxKSRKOCJfCitNRGAjV1giI0ciPiFfYDIjRiMnXCIoSWBgXV5g UFlAKV9gUigxLjkiYGA+X1AkNjYwYDYxVGA/YCIrOjwxCitNVFMkIyQ5KDFMPjNVLT80Vl0zP1Uu KlRVP1VgMixBWk0tR10xJEMoPkszPV80QShSJ0pUWD9VLCIsQVlVCitNLzEjRF0zWVUvUD1VMGAq MGAzI0UvPyJDWTNbUEheNF9cKi9FMC9gQj00NC49NDghMFQ4MD00PCM9NEFCCitNRGAkWFk0N1BI XjUmXCovRTFfIkNZNENQKElgISwuM1BIXyJDXCovUERgJFhcKi9QSF8iQ1wvVV80IShSCitNJ04z XT9VJDIsQVtEXzddMiRDKD5ZL1VfNFAoUidJYCEtJzNfXCovUEhfIkNcKWAhLy8iQ1wqL1BIXyNd CitNP1UwMixBWV1fV101JEMoPj8/XV81QShSJ0dXXz9VPCIsQVowYCgjQDEoI10/WGAyLEFaMF8w I0A1K19QCitNLDxgMixHPVE+UyZHP1AkMjBRNjBAMCFUYE8jXyRELDVEKCRgWGAzUD9QLDIwUTYw QDAjQCEvYDE0UyYsCitNRGAiYFgkMWBfN15gJEMoPj0yI18sOyYxPD4zX2BELj4sOkxRTislIyw8 QjBAMDNANS9bUEhXMCNcKi9QCitNWSovUEhfYEJZLzUtKE4yMEAqL1AoRzdIYFc2SEEiK0REKCI9 XCovUChJYCFFLiEkYD9gQkQoJCFYJTNeCitNXCUxX1wqLVQiTyNESF9gQiw5MDInWjNfNWAnXkQo JCRYJTNeM08jT1BRLFBYITIwYGAkMidbVjBAMDdQCitNRGBgIiRBXl1EKCQmXCIqMEA3NDIxMDtP JEQ0LzRDKGA0Q0ghNEQoIjRESCM0RSgkNEVIQDRGKEE0RkhDCitNNEcoRTRHS2BgYCEyQEkiIT0x KSRfOCRJRCglVSREM11AJEIwQDc0MjEvVUFKWSIhPTEpJF82JTtEKCVVCitNJEQzXUAoIjBANzQy MS9WIVFZIiE9MSkkXzYnQ0QoJVUkRDNdODMmMEA3NDIxL1VBLjkiIT0xKSRfNiUpCitNRGAnYFgk MCFcIiowQDdAMjEwOjBgYCQyJ1tXX19BKD9JL1cjJFMjQCRJIiE+ISkkXzlgYGBBKD9POSIhCitN Py8iYCE5IiE/Ll9QRCglW1tPIjBAN1NAX0kiIT5eI19UWVkwLikiIT4hKSRfMSg/SSUwIV9HMkMr XzYiCitNWSMyYF04L05cJzJDK182IlkjMmBdOC9APGAxUSwoYCdEKCVbWC9dUStZIiE+XmAkXCgi WkQoIkNYJ2BFCitNRCgjSlgnYCRfUSksT0kiYFpOIUQjJmAjJERdN0QoI0RYJTNXXCUzT1wlMl9c JTFfXCIoQihBKD9JKSJgCitNXD9gQiRBXkREKCNfXCkiYF9eIjBgPj9QKEEoP0kpIiEiPyIwYGAk MidbVjBAMEtQKEEoP0kvXTRgP1owCitNQDAnQDUvWS5cLl8jJFMjQCJJYGBgMSg/TzkiIWBPYEJE YCQhWCQwJFwpYCFHJzFeXCotVERPIkM9KiNQCitNSFcwRFwpYCFGVzEpXClgIUZHM0BcKWAhRj4z UERgJjghL2BCVFEiT2A8L2BUISg/SS9eMEAuL1BPUCQyCitNRGBgISRBXl05YCVAJVlgJShHMU9c KGAvRGBgISRBXl05YCVAITlgJShOM1BULSIyS1IqMGBgKDInW1dfCitNLC5gRiRBXkREKCNYXClg YGAxKD9POSJgXj8jTzUvW19IXiE0YDRfUERgYCMkQV5dRCgjW1wiKjBAL0FUCitNYD8iQz1gP1BI XiE0YDQwSFwqLVQhP2BCRGAoKVgvVDInWjNeS1A3TStJImBgTyIwYGAkMidbV19bMl4wCitNQGAv UERgYCIkQV5dX15UT0QoYCRcKWBgYFEoP08/X00rWSJgIT8iMGBgMDInW1dfS0A3TStZImAhT2BC CitNWSkiISQvIkNcKWAhRi4hX2AjI0RgR1whW1YwITgjWyNEKCQxWCkyKEQoJDBYKTAzMGBCMGA8 J0AxISNQCitNKEkiISQuMVVcYCQyMSpFXyUnWGAkQypKVFkiISQ+IjQsSSIhJC4iNGAkIllEYCcm WCMjQ0xCKDInWjNfCitNNSdeMEAuP1BbXDAzJFEtNGA6L1BEYGAhJEFeXV9VM1BRJTAvX0kiYFlO ITRcJFtQRGBgIyRBXl01YCRFCitNWC9aMEAuM0A1L1UuXC5dNCNcMTRcL14wQC47QDVgXS9cKWBg ISEoP085ImBaP2AyM1guMGA7RVRgPyIwCitNYDtDUEQoI0dYKWAhTk8iMEAuR0BEYCZbXCkiYFlO ITQjWWAhT09gQlkpImBZXyJDXCkiYFlOITQjXyE0CitNXC8iMEAuM0A1L1dQNS8/UDUuX1BEKCNN PWAnUEhfIjBALjNANS9PUEheITReXyNERCgjUFwpImBbVzAnCitNXCkiYFxOM1BIVzAiXC4yMEAu T1BEKCNEWCUzXlwpImBaNzAsXCkiYFkuITRXXyIwQC5JVCMvIjBALjNACitNNStfUDUnX1BIXiE0 X08hNF8/ITRdXyIwQC8wMigtSGBgYGBgRChgIVgrMCEiKSJgXDcyOVwoYDJEKGAhCitNWCkiYFw7 MCMhNzIwXChgIz0kI1BEKCNYPWAnUEhXMCdcKi9ANWAlJCovIkM9YDdQWSovUEhfIkNcKi9QCitN KE0sMEtQJyNQLSIwYDxTQDVgXjBANk9QRCglS1gvVVBgTiRRRCgmN1gvXVRgN1hgSmA8KEBgNyMs XFhTCitNU01DWV9eXT08YCtBKkkiIUVeIVVcYDIwYD1gMjEvJ0BEKCVMXCc0M2A3NDRANzQ1Oyc0 NmA3TCE+SCVZCitNOzEoS1s5IiFFXiFVXGAyMGA9JDIxLydARCglTlwpIiFFXiFVXGAyMGA9KDIx LydARCglT1wpIiFFXiFVCitNXGAyMGA9LDIxLydARCglUFwpIiFFXiFVXGAyMGA/YDIxLydARCgl UVwpIiFFXiFVXGAyMGA/JDIxLydACitNRCglUlwpIiFFXiFVXGAyMGA/KDIxLydARCglU1wpIiFF XiFVXGAyMGA/LDIxLydARCglVFwpIiE6XiNfCitNRCgmN1gvWVRgOkAmIihgIlBTLzhfLzE/RCgl S1wpIiFFXiNfPWAmSCFQQmBgTCxTVi9SMGA8U1BEKCVNCitNWC9dW2A3SiE+NlkxIUkiIUVeYCRc LiE0YF8jISYpYCFQLiEkYE8jMFQpKk8oTjNbXk9VX2AxKSQzSSIhCitNOk5fUDgvIzEhWCNMWSki ISRPIjBAMStAOWAnUCkkSjBgPDNQPSU+Q1wpImBaTiNfRCgjSVgmXUBgUSknCitNSUEpQl5bXCFg TyYlJEMqPk9QJCMkRVkmJEQpLUAsSzMkKlwhUFwjMEQoI0RYIyNAYE8mOlQtIjJLUiowCitNQC5L QDxgWDI6NTJfYDBDUUtZYCFZPmAkXCIrMyQqXCFQXCMwJEY8JFw8IzBUKSpPKEEpRl8pYGAiLiE0 CitNW19VXyIhKFInTjNfQ1UjREQoJDNcKi9QRGAkKVgnXGAsLjwiP1AnTzk1IUAvTC4wQDEzQEUo QjBAMS9ACitNRSEtYCIpYCFQLiEkJC9gQkQoJDNZJzdQYDEpJEo3XDQ/QGAyLEpLM0QoJDRYKTBS RCgkM1gpMGAwK0YwCitNYDw7QCwuIlIoTjNbXk9VX2AxKSQzSSIhPz5fUDgvYDEvOCNMVFEiT2A8 L2BULjNfRCgiPlgvWjBAKVdACitNXzs0JiEnWCFAYCleYC5ZRGA2YFJEYCZPWCdgM1s3N1AjWjBE IV9FVEAjN1BeR0whJDk1X2A+XUAlSSJgCitNRz5gJFwuIV9gKzAqYEdcIVtWYCVZKSJgRz8jMFQp Kk8oTSwwS1AnI1AtIjBAN1gyMTA6MEA5Q0BfUDNQCitNRGBgIVtRKD9fJ15PP0AkMV4uXUAuSSIh P0EpJF84TDNCQTIpJTlgYCNBKD9PMjAiXTE5W2A3SCE+OmAyCitNKl5WMEA3WDIxL1YwYGBYMidb VjBgOltQSFczX1wpYCFSXiFEQC8jMFQpKk8oTSwwS1AnI1AtIjBAOE9OCitNXCovT1wuMkNcKi9Q RCgmK1gvWkNYLzYiQ0gvQDgiVyNEKCYuWCkzSEQoJi1YKTAjMGBOMGA8I0AxKCNQCitNP1AiYCU5 IiFDPjFVXGAkMjEqRV8iR1hgJEMqSkAsNV9gPSMwREpcQkQoJSVbXyJDWz8iQyRCIzpgYGBgCitN YC4yMEA1L1A/UjFeIiEoTTcpIiEyUShAU0kiITE+I1s8YEIwQDRMMjEtRmAlTk1VXGBCRCkmK1VA TjBUCitNQV82I1gvWkNYL1wyKzVSMEA0XDIoLFowQDQ7QF9eM1xfP1lYJVEoQE5aQCRKMDZKIUpM J0QoJS8kRDM5CitNWzUxX18+UTRAL1AyMSxTTDEoI1xEKCUvJEIjLkQoJSskRDM5WyUxX18pIiVO UShAU0dcRD9AQDIrSiowCitNQDQ3QD0/YChJIjFCXTgrRC0oP1VAXiNeSF4jX1BgO2AhWSIhM1Ep JFY5IiVOUShAU01gJ1RgODIrSiowCitNQDRMMjEtR0wxKCNcRCg2WyRCIy4/UjFeIiEoTkhJIiEx PiFQISdcQEBgRjBANDdATWAkNj9SQV4iIShNCitNNydAKCRCIkhbVTAhX14yMEA1L09cKSIhNF4i MEA0NUAjTiFVXGBCRCkmO1VATjBUQVhgLFgnN1AiKjBECitNOS82IlkjMiddOC9AX0ovQF9RKE03 LlU0I19XRF8pIiExUShAU0kiITFQKSRWPSwwS1AnI1AtYFEzTSMwCitNREpcQkQoJEUkRDQmJEFe REQoJElcKWBgYDEoP085IiEqLyIwYGAoMidbVjBAM09QRGBgIyRBXl1EKCRcCitNXCkiISkxKSRf PkREIS9HRC5ITDNdMTIpJTc0NiEnTCE+SCVZLzEoS1s5IiEpMSkkXz5ERCIvR0QuSEwzCitNXTEy KSU3NDYhJ0whPkglWTAxKEtbOSIhKj5gRF4mIVkpL1FAPTIwKDhgKiFXKSIhKi4iVGAwNDIqPDYh CitNV1kiISouIlRgQDQyJDtWIVdZIiEqLiJUYFA0MiFOTiFXWSIhKi4iVCQhRjBAM1NAX0kiIS5e I11bP14wCitNQDJLTlwqL09cIShSSkgnP0QoJEhYKzAxJjkiIS8uI15EKCRbWC9XTV9ZIiEqTltQ SF5fUCRDKCZAPV4wCitNQDJDQF0mYCJAPV9fKEkiISo+IlQjYEIwQDNJVGA/ImAhPjIwQDNLUEQo JEhYJjAnOGAqIUtZIiEuXiIwCitNQDNDUEQoJFxYKSIhLj8iMEAzW0BfXjNcXz9ZWCIhKEBOWkAk SjA2SiFKTCdEKCRdWC9fRF8vV14kRDMsCitNUGAzYCE8YCZQYD4wQDNfQF9eM1xfP1lYJCEoQE5d YCNUYCswYD1gYCREMyxEKCRMJEIjLkQoJFlYL14wCitNQDNDQF81Ji1EKCRQJEIjLkQoJFpYJ2Ai QDk+MEA0K0BfXjNcXz9ZWCIhKEBOWkAkSjA2SiFKTCdEKCUhCitNWC9fRF8vV14kRDMsUGAzYCE8 YCZQYD4wQDQvQF9eM1xfP1lYJCEoQE5dYCNUYCswYD1gYCREMyxEKCRUCitNJEIjLkQoJFQkRDM5 JEIiO0QoJFAkRDNFJEQyX1BgM2AhPGAmUGA+MEAyUDIxLUYwQDMwMjEuNDIxK18wCitNYF1gIlRg JzBgISkkUykiISshKEBTSSIhKyEpJFY5IiExUShAU0kiIS4uI11IXiNfRD4qYCwpIiEuXiNfCitN SF4jXUQoJFpYKSIhMi8hW2A3SiE+M1ZDJEQ0Jj5IJVkwOSIhMyEpJSFJIiEqLiNbXDkuYGBXXCIo R1whCitNKE0sMEtQJyNQLSNgIVxgJUQoJSckRDM5RCglLSRCIy5UYDcwIVskJFQtIjJLUiowQDRP T1wqTCVEKCUxCitNJEIjOmBgYGBgKlwjWS9TXV9HQDQkQiJbSmAySSE6SCZKUD4wQDRUMjEtR001 YF9dWS9QMjEsU0w1YF9cCitNRCglMSRCIy5EKCUrWCc3UCIqMEQ4LzYiWSMyJ104L0BfSi9AX1xg JlBgPjBANSQyMS1GMEE7TDIoLFswCitNIV1gJmBCWkJEYCgpWCkiISRfIkM9IiNQRCgkM1gvXFBY YDZDWCIyYFwuXyMkWSNdJC8jREQoJERcKSIhCitNJS5gRGAvNiJZIzNcXTgvQEQoJDZcKSIhKS4h RGA/YEQ7SWAhUS8hVDc6L1BEKCQ2WC9dRCEmYCpbVjAoCitNOGA3TzlgUVA+TjIwQDE3UEQoJDZY L14wQDE3QF9MLj80I19AX1kiISUuI10rUjBgXTgrRC0vU1VAXiNcCitNPSE8T104K0QtKCdVQF5T UFtPX00rX19ELF9bT10kWVAiWSNdJC5gJFwuMjBAMTNQRCgkNVhgM1BAKy1bCitNYDdKIT4xPTFG WSIhKF5fUFBZMCI0ITowQDIvQDhgVjBAMTdAX1kiISUuYE9cKiYzP1AkQj9QYEIkQlZHCitNWS81 MiRDKj5bViFSOFUoIVk1KEQxSWAhUS8hVDdKL1BEYCIoWC81MF01JTQjViM/WTVgUFhgTEBZYCwy CitNKjw1MzQ+WmAvTjUwLC4kNiguNC4kQSZdW1dgIzBVJEBEYCQmWS8hMzQ/VmAoXjUwLC4oKygu OCMkQDtLCitNNFUnW0AhL0U0IyNDI0IjRyIrJU5bV2AjMFUmYDRVJ1dLNSVfQiEoUidIIigoSSIh QD5fUEheV1BLMC5MCitNYE4yMEA4R1BIXyIwYDwxVFE/IVQ3Si9QWyUwX18pYCEwLldQS0AzTkhf IjBAOCdAKSglQC0iMzo4IVBECitNLychIUQoJiJYLDBTLFMtNEApIiFBTyJDPSZHUEhXMmBcKGBM RCgmIlglMCFEKCYmXCotVEk/IkM9YCdQCitNQCFCMEA4K0BRJTAwRCgmJlwqLVQ/XyJDPSEjUEBg LV9gIiowQDg/QERgJCZcKSIhQU4hQCNJYCEwTyIwCitNQDg3QERgJSNcKGAtRGAlI1kvIjBAODtA RGAlIlwpIiFCLiNfRGAlIlglX19EKCYmWCZdQFtHMyUhKWAhCitNUS8hVDdKL1BEYCUjWS8hX2Ay KEJEKCUlW18iQ1s/IkNaXyIwQDREMjEvViskWEg0QjE1VSVAMVtgN0ohCitNPjYoMipeVjBANFAy MS9WKyRYSDRCMTVVJUAxW2A3SiE+NjgyKl5WMEA0O0BfSSIhMT4jXVs/XjBANF9OCitNXCovT1wp IiExXiNfTWAwKEQoJTI9YCdQQGBfT0QoJTJNYDQlPWArUEBgLVQhLyMzRCglMFgpM19EKCUvCitN WCkwYDBgKCFETjIwQDUnUEQoJTJYL14wQDUnQF9MLj8wYCkhXScxQitPNiJZIzIhXTgvQEQoJTNc LltfCitNRCglMFgiX19EKCUvWCMwYENYK1VAXiIwQDUzUEQoJShYJmBFRCglMVgiMUZdOCtELSgn VUBeIjBANVdQCitNWC9fVF9JIiE1LiE+X0kiITReI11bVVUuXCkiITNaL0BfWi9AK19eMEA1L0Bf MShSJ0kiITQ+YCRcKCIlCitNVFkiITQuIjRfWSIhM14iNCFVIVhZKSIhND8iMEA1K0BfWSIhND4j XlBZXWBgRCdUPSYoTl04K0QtKCdVCitNQF4iMEA1L1BbT14wQDUjQCtfTjBANF9ALWAjWkJYK1VA XiIwQDUzUEQoJShYJmBFRCglMVgiMUZdOCtECitNLSgnVUBeIjBANVdQWC9fVF9JIiE1LiE+X0ki ITReI11bVVUuXCkiITReIitASEojXCkiITQ+YCRcKCItCitNWSkiITRfIjBANVgyKC1IYGBgYGBE KCU1JEIjOmBgYGBgKSIhMi4hQCQ5IiEzXiNeSF4jXyRCVTxEKCU5CitNJEIjLlkpIiE0PyIwQDUr QF9ZIiE0PiNeUFldYGBEJD89JihOXTgrRC0oJ1VAXiIwQDUvUEQoJShYJiFXCitNRCglMVgvTEQ5 TzYiWSMyIV04L0BEKCU9XCkiITYxKSRWPk1VXGBCRF4/QDIoKkIwQDVXQF9PMT9fWSIhCitNNF4j XVtFVS9cKSIhN0EpJFk8YGBQYCdgYExgI0QoJT1YL11eYCkiITQ+IVVcYEJEXz5eSCEwQmAhPCxT CitNU0MvLlYvR19bQy41WC9XXFRgLzBgTWAhVGBgMjEsUjBANVgyKCxaMEA1NDIxLjdgYCxgIUQo JTNYL19ECitNXy9XXkQoJTFYJzdQIiozWV4hKEBOXWAhVGBgMjEsUjBANTQyKCxaMEA1J0AhL2BB M0kiITIuIUAuSSIhCitNN0EpJFYxKEBGWSIhNjEpJFkxKSRPXGAkUGA3YCFMYCdEKCU1JEQzOUQo JT4kRDNFJEQyX1RgLzBgTWAhCitNVGBgMjEsUjBANTQyKCxaMEA1NDIxLUYwQTtMMigsWjBANF9A X0ovQF9RKE5ISSIhMV4iMGA6I1BEKCUyCitNWClgIUg/IjBANENARGAmQlwpIiEyMSkkXzEoP0kp YCFJLyIwYGAkMidbVjBgOjdQRGBgIiRBXl1EYCZGCitNXClgYGBRKD9POWAhSV8iMEA1NDIxLUYw YDpDT1wpIiE1MSkkVjdAKCRCIkhEYCZJW18iMEA1NDIxLUVYCitNJCEoQEopYCFKTl9QRCglNSRE Mzk+IUAyKCpCMGA6T09cIiovIzIqLyNCKV9gSSIhYC4jXltcLj40IUNPCitNKT5gREA/Q0YsLjAr RGAmWD1gQ1BIXyFfYCIoL0AtWV9gMiowYDMzQDUzV1UwOi9ANTNbVTBKL0A1M19VCitNMFovQDU0 I1UxKWAhLS41IVwqL0UwTyJDWTQvUEheNSRcIiowYDNTQDU0N1UyOi9ANTQ7VTJKL0A1ND9VCitN MlovQDU0Q1UzKWAhLy41KVwqL0UyTyJDWTRPUEheNSxcJS4xV1IqMEAqL0A5YCVQJjkiYFleIUAk WWAhCitNNV4zUERgJFw9YCgyM05OMGA1PVQhP2BCRCgjR1gmYFVEYDoyWCMjQCkuM1UnOSJgXk4j IyRVMV9dMVtECitNXl9VXzYnWCEkRFtcRGAlOz1gN1BEYDoyPWAnUChJImBZLiE0XV9gMjFaOEJE KCNHWCZgVURgOjJYIyNBCitNKS4zVSc5ImBeTiMjJFUxX10xW0ReX1VfNydYISREW1xEYCU/PWA3 UERgOjI9YCtQKEkiYFkuITRbX2AyCitNMVo4QkQ3JjBAMFNPXCkiYFkjI0AhTiEkYD8iYCEuITRf TyIwQDBTQCwuODFEYCRPWCMjRyEuM1BAYDowCitNYDJdVEAvIjBALjNALC5gOkQoI1JZLyJDPWA/ UEQoI1JIXiIwITVDUERgM0xYJTM9XCIqMCEuU0AxIitQCitNKE4yMEAwV1BIXyJDXClgYEBeIjBA MFdQRGAiI1gvWjBAMFdAX1s0JmAyKyNEKCQvWCkxREQoJC5YKTBgCitNMGBWMGA8I0AxJCNQRCgk LVgvXEJEKCQuWSc3UGAxKSRKOCMiRCgkKVgmYC9ZLyIwITUvQDFgJ1BEYDddCitNWGAzUChJImBZ LiNfUSEsMzVgLFBYIj9PNStfUERgM0BYKSJgWTMjQCFOISRgPyJgJC4hNF9PIjBgO0VUCitNYD8i MGA7QVQhL2AyMVo7RF9ZIiEhLmBQWCRCMEAwQ0BfNiEhPWAlXmAqQCciKGAlUFMvLixcWzheP14w CitNIS4jQF5eXTs4YDtERCgkKFwiKjBAMDtAVFlVMCQpYCFRVzAwXCslNEQoJCRYJTNeXCIoMjIu MjBAMENACitNIS9gQkQoYCFYJjAiOGA+MCFJI0AxYCdQKEkiYFkuI19RISwzJFUwISwuYExbVTFf XClgJFguIjBALjRQCitNWDA7QDFgK1BAYF9ANS9XUERgJlk9YCdQRGAmWCEvIjBALj9AOGAsMjFa OV9gOiQkVFEiT2A8L2BUKWAkCitNJz4hQCZJYCUoTiE0RCZgJ0RgJ2BYJDAoXClgIVFOYFBYPjFf YChgIj9QJzBUKSpPKEwvTkVgJWAiQFdNCitNJFkjXSQvI0QrX1xCUF5aNGA0YEREL1QxWCZVUCZJ YCElXiJVITBWMGA+MVQ9XyIwXzEnRFwoYCZbMDIwCitNXzEnUFkiX18oTSwwS1AnI1AtIjBgMCdA MWArUERgJGA9L19QRGA6Vz1gR1BEYDpUPSg7UD9XUV4iIShNCitNNy5RND9fUjBAOFwyKCxaMEA4 XDIxLUYwQTtMMigsWV8/J1goJEJaQkQoNlskQiM6UyxgYFAnXiw/QEAyCitNK0oqMEE7TDIoLUhg UGBgND9XIV4jQShOSEkiJUVBKEBWQGAjL0YjRF8/XDIsNFcwVCkqTyhNJCxEKCNKCitNPWBTUChB KS9cOSIlTlEoQFZMU1BgLCFfQydYKCRCWkJEKDZbJEIjOmBgYGAlJ11QP0BYMitKKjBBOTgyCitN KC1IYGBgYGBZL1dfJEMlLT9XUV4iIShNNy5RJEAvUjBAOSwyKCxaMEA5LDIxLUYwQTtMMigsWV8/ J1goCitNJEJaQkRgJGA9I19QSF4hNF8/IjAhNS9AMSIjUChJYGBELmBAWC9EQkQoI1FYL1VfRFEo UidJImBaLiFACitNJElgISteYFBZUDVUJC8iYCFJYCErVzIwXClgYCIuISQkL1VfIiEoUidHXCEk RT8xRGAiMFgkMCFfN14wCitNJEMoPj9RMV5gYChSSk5cNERgNVNcKWAhL1cwMFwvVV9gVzElK19D RjM/W1Y9I0BPXTgrRC1gJ1VAXltQCitNKEcxJStfQ0ZfTldUN09bVj0jQE9dOCtELWAnVUBeW1Ao TSwwS1AnI1AtIjBAOiNNXCkiIUdeX1BUWTAnCitNNCcjQF9XMCFKYDwoQGArIyxdQ1xdL14wYCQ/ QDdfVV8xUShSJ0kiIUdeI189YCZIIVBCYGBMLFNWL1NfCitNRGAhJlgkX10/VDgyLEFaMEA6I0A4 IUIwQDlfQF9XMCFKYDwoQGArIyxdQ1xfWWBgMT4hL0AhPjBAOV9ACitNX1cwIUpgPChAYCsjLF1D XF0vXjBgJDdAN19VXzE4IV5EKCY/WCIzWFwuYEQhL11UYDpAJyIoYCJQUy84CitNXy8zX0RgISNY JV9dP1QsMixBWjBAOV9AX1cwIUpgPChAYCsjLF1DXF9ZYGAwXiEvXzddIyRDKD5EKCZACitNWCZg PUQoJj9YIjAkX1cwIUpgPChAYCsjLF1DXF9ZYGAwTiEvXzddIkAhUjBAOV9AKWAzXz1gJkghUEJg CitNYEwsU1YvU1RfWWBgME4hP183XSIkQyg+VC0iMktSKjBALjNANS9PUFkpImBcLyIwQC5PUChO XERfRmAsCitNISdgSEQoI009YCdQSF9gQls3YCpEKCNbWCkiYFs/ImAhOSJgWz5XUEQoI01YKi9Q RCgjRVgkMChcIigyCitNM1ZLTzlgJUAiKWAhTicwIVwoIUdEKCNLWC9dNGBWYChEYCZYPWArUEAl OjBALkdAX04zI0dFYChEYCZYCitNPWAzUEAkM08sLigoRGAmWD1gQ1BAI0IwQC5PQCwuMChEYCZY PSEjUEAiRjBALjdAJFEtNC9SI0AiKWAhCitNTicwQFwoYDZEKCNfWCZgKERgJlg9KCNQQGBCMGA7 Q0RcJ1whKElgIU43MCRcJ1xgKElgIkFeIUAiKWAhCitNTicwIVwoYDdEYComWCIjQSIpYCFOJzAk XChgKERgJlhZLyFfYDIqMGA7RVQiLyFfYCIrTzgjWjBAKi9ACitNOWAlUC1JImBZPiE0X08iMCEy KVQjXyIwIUAzQDUrX1BZL1wyMi46X2AwWjBALjNAMSQjUEQoI0o9YDtQCitNKElgIU43MCFcKWAh TicwKFwiKjAhMilUO18iMCEyP0A1K19QRCgjSj1gK1AoTjIwQDBPUERgOklYKSIhCitNIl8jQDUs IVAjOSJgWl4hNF9PITRfP2AiMVo6MEAwT0AsLjhCRCgjR1gmMCE8IiYwQC5PQDFgJ1BEKCNGCitN WCUwLzlgKUAhJSUqQGBQMjNDVmAhWSJgWl4hNF9PIjBAME9ARCgjSywuPDRYJDAiJERbS0RgJTc9 YDdQCitNRCgjRFgkMCRcIitANS9XUChJYCQnPiFQJSkiYGBeI19ZL1QyMj9GLjNIXS9EYDA/PSIj UChJImBIXiFECitNYDZgIjA/SjBALj9APGApIV5JImBZTiMkNWBdRGA3YEJEYDpLWCkiYFtPIjAh SktARCgjTVwqL0BfV2AoCitNRCgjTVgvW19AYCIwQC5bT1wpImBZPiEkIS8jREQoI1BcKSJgXEov QERgNThcKWAhNV4zUERgJFw9YCtQCitNRCgjS1glM11cJTNPXCkiYFlOI19RJTAvKS9VMGBIYCIs PUIwQC43QCRRLDM1IVxQWCEiMEAuV0BfWi9ACitNTTA8JiRGPSokRFY/KEkiYFkuI18kUS00L1Mj QCQ+XTReXyIwQC5PQDUvV1A1YD1QMEhgXUQoI1BYYDNQCitNRCgjS1glM09cKSJgXC4jX01gJCJA YDNPTWAoJkRgNThYYDNQRCgjWFgvXjBALyNAVFldYCNZImBIXiJUCitNYDBOMEAuN0A1L09QKEEp J0lCK0RfTl8jJF9XTywuYCRbQjJgX0kjXSQuV1BLUDhCSlA+SiFOVEteXjBaCitNXkwuMEAqI0BG WSJgR14iOjQhLkNYIjAhX1kiYEdeYFRgL1sjWllfW1pJW1paSSNdJD8iT2BXMGArXzYiCisrWSMz W104L0BfUihgLEBAYAorYAorZW5kCmRpZmYgLS1naXQgYS9zeXMvZGV2L3J0d24vcGNpL3J0d25f cGNpX2F0dGFjaC5oIGIvc3lzL2Rldi9ydHduL3BjaS9ydHduX3BjaV9hdHRhY2guaAppbmRleCA2 ZGY1ODEyZTRjZC4uMzg5ZDUyZmZmOTUgMTAwNjQ0Ci0tLSBhL3N5cy9kZXYvcnR3bi9wY2kvcnR3 bl9wY2lfYXR0YWNoLmgKKysrIGIvc3lzL2Rldi9ydHduL3BjaS9ydHduX3BjaV9hdHRhY2guaApA QCAtMTcsOSArMTcsMTEgQEAKICAqLwogCiB2b2lkCXI5MmNlX2F0dGFjaChzdHJ1Y3QgcnR3bl9w Y2lfc29mdGMgKik7Cit2b2lkCXI4OGVlX2F0dGFjaChzdHJ1Y3QgcnR3bl9wY2lfc29mdGMgKik7 CiAKIGVudW0gewogCVJUV05fQ0hJUF9SVEw4MTkyQ0UsCisJUlRXTl9DSElQX1JUTDgxODhFRSwK IAlSVFdOX0NISVBfTUFYX1BDSQogfTsKIApAQCAtMzIsMTMgKzM0LDE1IEBAIHN0cnVjdCBydHdu X3BjaV9pZGVudCB7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnR3bl9wY2lfaWRlbnQgcnR3bl9w Y2lfaWRlbnRfdGFibGVbXSA9IHsKIAl7IDB4MTBlYywgMHg4MTc2LCAiUmVhbHRlayBSVEw4MTg4 Q0UiLCBSVFdOX0NISVBfUlRMODE5MkNFIH0sCisJeyAweDEwZWMsIDB4ODE3OSwgIlJlYWx0ZWsg UlRMODE4OEVFIiwgUlRXTl9DSElQX1JUTDgxODhFRSB9LAogCXsgMCwgMCwgTlVMTCwgUlRXTl9D SElQX01BWF9QQ0kgfQogfTsKIAogdHlwZWRlZiB2b2lkCSgqY2hpcF9wY2lfYXR0YWNoKShzdHJ1 Y3QgcnR3bl9wY2lfc29mdGMgKik7CiAKIHN0YXRpYyBjb25zdCBjaGlwX3BjaV9hdHRhY2ggcnR3 bl9jaGlwX3BjaV9hdHRhY2hbUlRXTl9DSElQX01BWF9QQ0ldID0gewotCVtSVFdOX0NISVBfUlRM ODE5MkNFXSA9IHI5MmNlX2F0dGFjaAorCVtSVFdOX0NISVBfUlRMODE5MkNFXSA9IHI5MmNlX2F0 dGFjaCwKKwlbUlRXTl9DSElQX1JUTDgxODhFRV0gPSByODhlZV9hdHRhY2gKIH07CiAKIHN0YXRp YyBfX2lubGluZSB2b2lkCmRpZmYgLS1naXQgYS9zeXMvZGV2L3J0d24vcnRsODE4OGUvcGNpL3I4 OGVlLmggYi9zeXMvZGV2L3J0d24vcnRsODE4OGUvcGNpL3I4OGVlLmgKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjM1MzRjYjNhODZkCi0tLSAvZGV2L251bGwKKysrIGIv c3lzL2Rldi9ydHduL3J0bDgxODhlL3BjaS9yODhlZS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qLQor ICogQ29weXJpZ2h0IChjKSAyMDE4IEZhcmhhbiBLaGFuIDxraGFuemZAZ21haWwuY29tPgorICoK KyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMg c29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVi eSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBh bmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBU SEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMg QUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5H IEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT Uy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BF Q0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBE QU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9S IFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5D RSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05O RUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICog CisgKiAkRnJlZUJTRCQKKyAqLworCisjaWZuZGVmIFJUTDgxODhFRV9ICisjZGVmaW5lIFJUTDgx ODhFRV9ICisKKyNpbmNsdWRlIDxkZXYvcnR3bi9ydGw4MTg4ZS9yODhlLmg+CisKKworLyoKKyAq IEdsb2JhbCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBSODhFRV9QVUJRX05QQUdFUwkxNzYK KyNkZWZpbmUgUjg4RUVfSFBRX05QQUdFUwk0MQorI2RlZmluZSBSODhFRV9MUFFfTlBBR0VTCTI4 CisjZGVmaW5lIFI4OEVFX1RYX1BBR0VfQ09VTlQJXAorCShSODhFRV9QVUJRX05QQUdFUyArIFI4 OEVFX0hQUV9OUEFHRVMgKyBSODhFRV9MUFFfTlBBR0VTKQorCisKKy8qCisgKiBGdW5jdGlvbiBk ZWNsYXJhdGlvbnMuCisgKi8KKy8qIHI4OGVlX2NhbGliLmMgKi8KK3ZvaWQJcjg4ZWVfaXFfY2Fs aWIoc3RydWN0IHJ0d25fc29mdGMgKik7CisKKy8qIHI4OGVlX2Z3LmMgKi8KKyNpZm5kZWYgUlRX Tl9XSVRIT1VUX1VDT0RFCit2b2lkCXI4OGVlX2Z3X3Jlc2V0KHN0cnVjdCBydHduX3NvZnRjICos IGludCk7CisjZW5kaWYKKworLyogcjg4ZWVfaW5pdC5jICovCit2b2lkCXI4OGVlX2luaXRfaW50 cihzdHJ1Y3QgcnR3bl9zb2Z0YyAqKTsKK3ZvaWQJcjg4ZWVfaW5pdF9lZGNhKHN0cnVjdCBydHdu X3NvZnRjICopOworaW50CXI4OGVlX3Bvd2VyX29uKHN0cnVjdCBydHduX3NvZnRjICopOwordm9p ZAlyODhlZV9wb3dlcl9vZmYoc3RydWN0IHJ0d25fc29mdGMgKik7Cit2b2lkCXI4OGVlX2luaXRf YW1wZHUoc3RydWN0IHJ0d25fc29mdGMgKik7Cit2b2lkCXI4OGVlX3Bvc3RfaW5pdChzdHJ1Y3Qg cnR3bl9zb2Z0YyAqKTsKK3ZvaWQJcjg4ZWVfaW5pdF9yeF9hZ2coc3RydWN0IHJ0d25fc29mdGMg Kik7Cit2b2lkCXI4OGVlX2luaXRfcmYoc3RydWN0IHJ0d25fc29mdGMgKik7CisKKy8qIHI4OGVl X2xlZC5jICovCit2b2lkCXI4OGVlX3NldF9sZWQoc3RydWN0IHJ0d25fc29mdGMgKiwgaW50LCBp bnQpOworCisvKiByODhlZV9yeC5jICovCitpbnQJcjg4ZWVfY2xhc3NpZnlfaW50cihzdHJ1Y3Qg cnR3bl9zb2Z0YyAqLCB2b2lkICosIGludCk7Cit2b2lkCXI4OGVlX2VuYWJsZV9pbnRyKHN0cnVj dCBydHduX3BjaV9zb2Z0YyAqKTsKK3ZvaWQJcjg4ZWVfc3RhcnRfeGZlcnMoc3RydWN0IHJ0d25f c29mdGMgKik7CisKKy8qIHI4OGVlX3R4LmMgKi8KK3ZvaWQJcjg4ZWVfc2V0dXBfdHhfZGVzYyhz dHJ1Y3QgcnR3bl9wY2lfc29mdGMgKiwgdm9pZCAqLCB1aW50MzJfdCk7Cit2b2lkCXI4OGVlX3R4 X3Bvc3RzZXR1cChzdHJ1Y3QgcnR3bl9wY2lfc29mdGMgKiwgdm9pZCAqLAorCSAgICBidXNfZG1h X3NlZ21lbnRfdFtdKTsKK3ZvaWQJcjg4ZWVfY29weV90eF9kZXNjKHZvaWQgKiwgY29uc3Qgdm9p ZCAqKTsKK3ZvaWQJcjg4ZWVfZHVtcF90eF9kZXNjKHN0cnVjdCBydHduX3NvZnRjICosIGNvbnN0 IHZvaWQgKik7CisKKy8qIHI4OGVlX3JmLmMgKi8KK3VpbnQzMl90CXI4OGVlX3JmX3JlYWQoc3Ry dWN0IHJ0d25fc29mdGMgKiwgaW50LCB1aW50OF90KTsKK3ZvaWQJcjg4ZWVfcmZfd3JpdGUoc3Ry dWN0IHJ0d25fc29mdGMgKiwgaW50LCB1aW50OF90LCB1aW50MzJfdCk7CisKKyNlbmRpZgkvKiBS VEw4MTg4RUVfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzL2Rldi9ydHduL3J0bDgxODhlL3BjaS9yODhl ZV9hdHRhY2guYyBiL3N5cy9kZXYvcnR3bi9ydGw4MTg4ZS9wY2kvcjg4ZWVfYXR0YWNoLmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmEzZTMxMGU4ZmRiCi0tLSAvZGV2 L251bGwKKysrIGIvc3lzL2Rldi9ydHduL3J0bDgxODhlL3BjaS9yODhlZV9hdHRhY2guYwpAQCAt MCwwICsxLDI2NCBAQAorLyoJJE9wZW5CU0Q6IGlmX3J0d24uYyx2IDEuNiAyMDE1LzA4LzI4IDAw OjAzOjUzIGRlcmFhZHQgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgRGFt aWVuIEJlcmdhbWluaSA8ZGFtaWVuLmJlcmdhbWluaUBmcmVlLmZyPgorICogQ29weXJpZ2h0IChj KSAyMDE1IFN0ZWZhbiBTcGVybGluZyA8c3RzcEBvcGVuYnNkLm9yZz4KKyAqIENvcHlyaWdodCAo YykgMjAxNiBBbmRyaXkgVm9za29ib2lueWsgPGF2b3NARnJlZUJTRC5vcmc+CisgKiBDb3B5cmln aHQgKGMpIDIwMTggRmFyaGFuIEtoYW4gPGtoYW56ZkBnbWFpbC5jb20+CisgKgorICogUGVybWlz c2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBm b3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQs IHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBl cm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FS RSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFO VElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJ RUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBF VkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJF Q1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAq IFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywg V0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVS IFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lU SCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1 ZGUgPHN5cy9jZGVmcy5oPgorX19GQlNESUQoIiRGcmVlQlNEJCIpOworCisjaW5jbHVkZSAib3B0 X3dsYW4uaCIKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9sb2NrLmg+ CisjaW5jbHVkZSA8c3lzL211dGV4Lmg+CisjaW5jbHVkZSA8c3lzL21idWYuaD4KKyNpbmNsdWRl IDxzeXMva2VybmVsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9z eXN0bS5oPgorI2luY2x1ZGUgPHN5cy9tYWxsb2MuaD4KKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4K KyNpbmNsdWRlIDxzeXMvdGFza3F1ZXVlLmg+CisjaW5jbHVkZSA8c3lzL2J1cy5oPgorI2luY2x1 ZGUgPHN5cy9lbmRpYW4uaD4KKyNpbmNsdWRlIDxzeXMvbGlua2VyLmg+CisKKyNpbmNsdWRlIDxt YWNoaW5lL2J1cy5oPgorI2luY2x1ZGUgPG1hY2hpbmUvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxz eXMvcm1hbi5oPgorCisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2V0aGVybmV0 Lmg+CisjaW5jbHVkZSA8bmV0L2lmX21lZGlhLmg+CisKKyNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVl ODAyMTFfdmFyLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhZGlvdGFwLmg+CisK KyNpbmNsdWRlIDxkZXYvcnR3bi9pZl9ydHducmVnLmg+CisjaW5jbHVkZSA8ZGV2L3J0d24vaWZf cnR3bnZhci5oPgorI2luY2x1ZGUgPGRldi9ydHduL2lmX3J0d25fbm9wLmg+CisKKyNpbmNsdWRl IDxkZXYvcnR3bi9ydGw4MTg4ZS9yODhlX3ByaXYuaD4KKyNpbmNsdWRlIDxkZXYvcnR3bi9wY2kv cnR3bl9wY2lfdmFyLmg+CisjaW5jbHVkZSA8ZGV2L3J0d24vcnRsODE5MmMvcjkyYy5oPgorI2lu Y2x1ZGUgPGRldi9ydHduL3J0bDgxOTJjL3I5MmNfdmFyLmg+CisjaW5jbHVkZSA8ZGV2L3J0d24v cnRsODE5MmMvcGNpL3I5MmNlLmg+CisKKyNpbmNsdWRlIDxkZXYvcnR3bi9ydGw4MTkyYy9yOTJj X3Zhci5oPgorI2luY2x1ZGUgPGRldi9ydHduL3J0bDgxOTJjL3BjaS9yOTJjZS5oPgorI2luY2x1 ZGUgPGRldi9ydHduL3J0bDgxOTJjL3BjaS9yOTJjZV9wcml2Lmg+CisjaW5jbHVkZSA8ZGV2L3J0 d24vcnRsODE5MmMvcGNpL3I5MmNlX3JlZy5oPgorI2luY2x1ZGUgPGRldi9ydHduL3J0bDgxOTJj L3BjaS9yOTJjZV90eF9kZXNjLmg+CisjaW5jbHVkZSA8ZGV2L3J0d24vcnRsODE5MmMvcjkyYy5o PgorCisjaW5jbHVkZSA8ZGV2L3J0d24vcnRsODE4OGUvcGNpL3I4OGVlLmg+CisjaW5jbHVkZSA8 ZGV2L3J0d24vcnRsODE4OGUvcGNpL3I4OGVlX3ByaXYuaD4KKyNpbmNsdWRlIDxkZXYvcnR3bi9y dGw4MTg4ZS9wY2kvcjg4ZWVfcmVnLmg+CisjaW5jbHVkZSA8ZGV2L3J0d24vcnRsODE4OGUvcGNp L3I4OGVlX3R4X2Rlc2MuaD4KKyNpbmNsdWRlIDxkZXYvcnR3bi9ydGw4MTg4ZS91c2Ivcjg4ZXUu aD4KKyNpbmNsdWRlIDxkZXYvcnR3bi9ydGw4MTkyZS9yOTJlLmg+CisKK3N0YXRpYyBzdHJ1Y3Qg cnR3bl9yOTJjX3R4cHdyIHI4OGVlX3R4cHdyOworCit2b2lkCXI4OGVlX2F0dGFjaChzdHJ1Y3Qg cnR3bl9wY2lfc29mdGMgKik7CisKK3N0YXRpYyB2b2lkCityODhlZV9wb3N0YXR0YWNoKHN0cnVj dCBydHduX3NvZnRjICpzYykKK3sKKwlzdHJ1Y3QgcjkyY19zb2Z0YyAqcnMgPSBzYy0+c2NfcHJp djsKKwlzdHJ1Y3QgaWVlZTgwMjExY29tICppYyA9ICZzYy0+c2NfaWM7CisJc2MtPmZ3bmFtZSA9 ICJydHduLXJ0bDgxODhlZWZ3IjsKKwlzYy0+ZndzaWcgPSAweDg4RTsKKworCXJzLT5yc19zY2Fu X3N0YXJ0ID0gaWMtPmljX3NjYW5fc3RhcnQ7CisJaWMtPmljX3NjYW5fc3RhcnQgPSByOTJjX3Nj YW5fc3RhcnQ7CisJcnMtPnJzX3NjYW5fZW5kID0gaWMtPmljX3NjYW5fZW5kOworCWljLT5pY19z Y2FuX2VuZCA9IHI5MmNfc2Nhbl9lbmQ7Cit9CisKK3N0YXRpYyB2b2lkCityODhlZV9zZXRfbmFt ZShzdHJ1Y3QgcnR3bl9zb2Z0YyAqc2MpCit7CisJc2MtPm5hbWUgPSAiUlRMODE4OEVFIjsKK30K Kworc3RhdGljIHZvaWQKK3I4OGVlX2F0dGFjaF9wcml2YXRlKHN0cnVjdCBydHduX3NvZnRjICpz YykKK3sKKwlzdHJ1Y3QgcjkyY19zb2Z0YyAqcnM7CisKKwlycyA9IG1hbGxvYyhzaXplb2Yoc3Ry dWN0IHI5MmNfc29mdGMpLCBNX1JUV05fUFJJViwgTV9XQUlUT0sgfCBNX1pFUk8pOworCisJcnMt PnJzX3R4cHdyCQkJPSAmcjg4ZWVfdHhwd3I7CisKKwlycy0+cnNfc2V0X2J3MjAJCQk9IHI4OGVf c2V0X2J3MjA7CisJcnMtPnJzX2dldF90eHBvd2VyCQk9IHI4OGVfZ2V0X3R4cG93ZXI7CisJcnMt PnJzX3NldF9nYWluCQkJPSByODhlX3NldF9nYWluOworCXJzLT5yc190eF9lbmFibGVfYW1wZHUJ CT0gcjg4ZV90eF9lbmFibGVfYW1wZHU7CisJcnMtPnJzX3R4X3NldHVwX2h3c2VxCQk9IHI4OGVf dHhfc2V0dXBfaHdzZXE7CisJcnMtPnJzX3R4X3NldHVwX21hY2lkCQk9IHI4OGVfdHhfc2V0dXBf bWFjaWQ7CisJcnMtPnJzX3NldF9uYW1lCQkJPSByODhlZV9zZXRfbmFtZTsKKworCS8qIFhYWCBU T0RPOiB0ZXN0IHdpdGggbmV0ODAyMTEgcmF0ZWN0bCEgKi8KKyNpZm5kZWYgUlRXTl9XSVRIT1VU X1VDT0RFCisJcnMtPnJzX2MyaF90aW1lb3V0CQk9IGh6OworCisJY2FsbG91dF9pbml0X210eCgm cnMtPnJzX2MyaF9yZXBvcnQsICZzYy0+c2NfbXR4LCAwKTsKKyNlbmRpZgorCisJcnMtPnJmX3Jl YWRfZGVsYXlbMF0JCT0gMTAwMDsKKwlycy0+cmZfcmVhZF9kZWxheVsxXQkJPSAxMDAwOworCXJz LT5yZl9yZWFkX2RlbGF5WzJdCQk9IDEwMDA7CisKKwlzYy0+c2NfcHJpdiA9IHJzOworCit9CisK K3N0YXRpYyB2b2lkCityODhlZV9hZGpfZGV2Y2FwcyhzdHJ1Y3QgcnR3bl9zb2Z0YyAqc2MpCit7 CisJc3RydWN0IGllZWU4MDIxMWNvbSAqaWMgPSAmc2MtPnNjX2ljOworCisJLyoKKwkgKiBYWFgg ZG8gTk9UIGVuYWJsZSBQTUdUIHVudGlsIFJTVkRfUEFHRSBjb21tYW5kCisJICogd2lsbCBub3Qg YmUgdGVzdGVkIC8gZml4ZWQgKyBIUlBXTSByZWdpc3RlciBtdXN0IGJlIHNldCB0b28uCisJICov CisJaWMtPmljX2NhcHMgJj0gfklFRUU4MDIxMV9DX1BNR1Q7Cit9CisKK3ZvaWQKK3I4OGVlX2F0 dGFjaChzdHJ1Y3QgcnR3bl9wY2lfc29mdGMgKnBjKQoreworCXN0cnVjdCBydHduX3NvZnRjICpz YwkJPSAmcGMtPnBjX3NjOworCisJLyogUENJZSBwYXJ0LiAqLworCXBjLT5wY19zZXR1cF90eF9k ZXNjCQk9IHI4OGVlX3NldHVwX3R4X2Rlc2M7CisJcGMtPnBjX3R4X3Bvc3RzZXR1cAkJPSByOTJj ZV90eF9wb3N0c2V0dXA7CisJcGMtPnBjX2NvcHlfdHhfZGVzYwkJPSByODhlZV9jb3B5X3R4X2Rl c2M7CisJcGMtPnBjX2VuYWJsZV9pbnRyCQk9IHI4OGVlX2VuYWJsZV9pbnRyOworCisJcGMtPnBj X3FtYXAJCQk9IDB4ZTc3MTsKKwlwYy0+dGNyCQkJCT0gMHg4MjAwOworCisJLyogQ29tbW9uIHBh cnQuICovCisJLyogUlRMODE5MkMqIGNhbm5vdCB1c2UgcGFpcndpc2Uga2V5cyBmcm9tIGZpcnN0 IDQgc2xvdHMgKi8KKwlzYy0+c2NfZmxhZ3MJCQk9IFJUV05fRkxBR19FWFRfSERSOyAvL1JUV05f RkxBR19DQU1fRklYRUQ7CisKKwlzYy0+c2Nfc3RhcnRfeGZlcnMJCT0gcjg4ZWVfc3RhcnRfeGZl cnM7CisJc2MtPnNjX3NldF9jaGFuCQkJPSByOTJjX3NldF9jaGFuOworCXNjLT5zY19maWxsX3R4 X2Rlc2MJCT0gcjkyY19maWxsX3R4X2Rlc2M7CisJc2MtPnNjX2ZpbGxfdHhfZGVzY19yYXcJCT0g cjkyY19maWxsX3R4X2Rlc2NfcmF3OworCXNjLT5zY19maWxsX3R4X2Rlc2NfbnVsbAk9IHI5MmNf ZmlsbF90eF9kZXNjX251bGw7IC8qIFhYWCByZWNoZWNrICovCisJc2MtPnNjX2R1bXBfdHhfZGVz YwkJPSByODhlZV9kdW1wX3R4X2Rlc2M7CisJc2MtPnNjX3R4X3JhZGlvdGFwX2ZsYWdzCT0gcjky Y190eF9yYWRpb3RhcF9mbGFnczsKKwlzYy0+c2NfcnhfcmFkaW90YXBfZmxhZ3MJPSByOTJjX3J4 X3JhZGlvdGFwX2ZsYWdzOworCXNjLT5zY19nZXRfcnNzaV9jY2sJCT0gcjg4ZV9nZXRfcnNzaV9j Y2s7CisJc2MtPnNjX2dldF9yc3NpX29mZG0JCT0gcjg4ZV9nZXRfcnNzaV9vZmRtOworCXNjLT5z Y19jbGFzc2lmeV9pbnRyCQk9IHI4OGVlX2NsYXNzaWZ5X2ludHI7CisJc2MtPnNjX2hhbmRsZV90 eF9yZXBvcnQJCT0gcnR3bl9ub3Bfc29mdGNfdWludDhfaW50OworCXNjLT5zY19oYW5kbGVfYzJo X3JlcG9ydAk9IHJ0d25fbm9wX3NvZnRjX3VpbnQ4X2ludDsKKwlzYy0+c2NfY2hlY2tfZnJhbWUJ CT0gcnR3bl9ub3BfaW50X3NvZnRjX21idWY7CisJc2MtPnNjX3JmX3JlYWQJCQk9IHI5MmNfcmZf cmVhZDsKKwlzYy0+c2NfcmZfd3JpdGUJCQk9IHI4OGVfcmZfd3JpdGU7CisJc2MtPnNjX2NoZWNr X2NvbmRpdGlvbgkJPSByOTJjX2NoZWNrX2NvbmRpdGlvbjsKKwlzYy0+c2NfZWZ1c2VfcG9zdHJl YWQJCT0gcjkyY19lZnVzZV9wb3N0cmVhZDsKKwlzYy0+c2NfcGFyc2Vfcm9tCQk9IHI4OGVlX3Bh cnNlX3JvbTsKKwlzYy0+c2Nfc2V0X2xlZAkJCT0gcjg4ZV9zZXRfbGVkOworCXNjLT5zY19wb3dl cl9vbgkJCT0gcjg4ZWVfcG93ZXJfb247CisJc2MtPnNjX3Bvd2VyX29mZgkJPSByODhlZV9wb3dl cl9vZmY7CisjaWZuZGVmIFJUV05fV0lUSE9VVF9VQ09ERQorCXNjLT5zY19md19yZXNldAkJCT0g cjg4ZV9md19yZXNldDsKKwlzYy0+c2NfZndfZG93bmxvYWRfZW5hYmxlCT0gcjg4ZWVfZndfZG93 bmxvYWRfZW5hYmxlOworI2VuZGlmCisJc2MtPnNjX3NldF9wYWdlX3NpemUJCT0gcjkyY19zZXRf cGFnZV9zaXplOworCXNjLT5zY19sY19jYWxpYgkJCT0gcjkyY19sY19jYWxpYjsKKwlzYy0+c2Nf aXFfY2FsaWIJCQk9IHI4OGVfaXFfY2FsaWI7CisJc2MtPnNjX3JlYWRfY2hpcGlkX3ZlbmRvcgk9 IHJ0d25fbm9wX3NvZnRjX3VpbnQzMjsKKwlzYy0+c2NfYWRqX2RldmNhcHMJCT0gcjg4ZWVfYWRq X2RldmNhcHM7CisJc2MtPnNjX3ZhcF9wcmVhdHRhY2gJCT0gcnR3bl9ub3Bfc29mdGNfdmFwOwor CXNjLT5zY19wb3N0YXR0YWNoCQk9IHI4OGVlX3Bvc3RhdHRhY2g7CisJc2MtPnNjX2RldGFjaF9w cml2YXRlCQk9IHI5MmNfZGV0YWNoX3ByaXZhdGU7CisJc2MtPnNjX3NldF9tZWRpYV9zdGF0dXMJ CT0gcjg4ZV9zZXRfbWVkaWFfc3RhdHVzOworI2lmbmRlZiBSVFdOX1dJVEhPVVRfVUNPREUKKwlz Yy0+c2Nfc2V0X3JzdmRfcGFnZQkJPSByODhlX3NldF9yc3ZkX3BhZ2U7CisJc2MtPnNjX3NldF9w d3Jtb2RlCQk9IHI4OGVfc2V0X3B3cm1vZGU7CisJc2MtPnNjX3NldF9yc3NpCQkJPSByOTJjX3Nl dF9yc3NpOworI2VuZGlmCisJc2MtPnNjX2JlYWNvbl9pbml0CQk9IHI5MmNfYmVhY29uX2luaXQ7 CisJc2MtPnNjX2JlYWNvbl9lbmFibGUJCT0gcjg4ZV9iZWFjb25fZW5hYmxlOworCXNjLT5zY19i ZWFjb25fc2V0X3JhdGUJCT0gcnR3bl9ub3Bfdm9pZF9pbnQ7CisJc2MtPnNjX2JlYWNvbl9zZWxl Y3QJCT0gcnR3bl9ub3Bfc29mdGNfaW50OworCXNjLT5zY190ZW1wX21lYXN1cmUJCT0gcjg4ZV90 ZW1wX21lYXN1cmU7CisJc2MtPnNjX3RlbXBfcmVhZAkJPSByODhlX3RlbXBfcmVhZDsKKwlzYy0+ c2NfaW5pdF90eF9hZ2cJCT0gcnR3bl9ub3Bfc29mdGM7CisJc2MtPnNjX2luaXRfcnhfYWdnCQk9 IHJ0d25fbm9wX3NvZnRjOworCXNjLT5zY19pbml0X2FtcGR1CQk9IHI5MmNlX2luaXRfYW1wZHU7 CisJc2MtPnNjX2luaXRfaW50cgkJPSByODhlZV9pbml0X2ludHI7CisJc2MtPnNjX2luaXRfZWRj YQkJPSByOTJjZV9pbml0X2VkY2E7CisJc2MtPnNjX2luaXRfYmIJCQk9IHI4OGVlX2luaXRfYmI7 CisJc2MtPnNjX2luaXRfcmYJCQk9IHI5MmNfaW5pdF9yZjsKKwlzYy0+c2NfaW5pdF9hbnRzZWwJ CT0gcnR3bl9ub3Bfc29mdGM7CisJc2MtPnNjX3Bvc3RfaW5pdAkJPSByODhlZV9wb3N0X2luaXQ7 CisJc2MtPnNjX2luaXRfYmNucTFfYm91bmRhcnkJPSBydHduX25vcF9pbnRfc29mdGM7CisKKwlz Yy0+bWFjX3Byb2cJCQk9ICZydGw4MTg4ZWVfbWFjWzBdOworCXNjLT5tYWNfc2l6ZQkJCT0gbml0 ZW1zKHJ0bDgxODhlZV9tYWMpOworCXNjLT5iYl9wcm9nCQkJPSAmcnRsODE4OGVlX2JiWzBdOwor CXNjLT5iYl9zaXplCQkJPSBuaXRlbXMocnRsODE4OGVlX2JiKTsKKwlzYy0+YWdjX3Byb2cJCQk9 ICZydGw4MTg4ZWVfYWdjWzBdOworCXNjLT5hZ2Nfc2l6ZQkJCT0gbml0ZW1zKHJ0bDgxODhlZV9h Z2MpOworCXNjLT5yZl9wcm9nCQkJPSAmcnRsODE4OGVlX3JmWzBdOworCisJc2MtPnBhZ2VfY291 bnQJCQk9IDB4QUY7CisJc2MtPnBrdGJ1Zl9jb3VudAkJPSAweEFCOworCisJc2MtPmFja3RvCQkJ PSAweDQwOworCXNjLT5ucHVicXBhZ2VzCQkJPSAxMTU7CisJc2MtPm5ocXBhZ2VzCQkJPSBSOTJD RV9IUFFfTlBBR0VTOworCXNjLT5ubnFwYWdlcwkJCT0gMTsKKwlzYy0+bmxxcGFnZXMJCQk9IDEz OworCXNjLT5wYWdlX3NpemUJCQk9IFI5MkNfVFhfUEFHRV9TSVpFOworCisJc2MtPnR4ZGVzY19s ZW4JCQk9IHNpemVvZihzdHJ1Y3Qgcjg4ZWVfdHhfZGVzYyk7CisJc2MtPmVmdXNlX21heGxlbgkJ PSBSODhFX0VGVVNFX01BWF9MRU47CisJc2MtPmVmdXNlX21hcGxlbgkJPSBSODhFX0VGVVNFX01B UF9MRU47CisJc2MtPnJ4X2RtYV9zaXplCQkJPSBSODhFX1JYX0RNQV9CVUZGRVJfU0laRTsKKwor CXNjLT5tYWNpZF9saW1pdAkJCT0gUjg4RV9NQUNJRF9NQVggKyAxOworCXNjLT5jYW1fZW50cnlf bGltaXQJCT0gUjkyQ19DQU1fRU5UUllfQ09VTlQ7CisJc2MtPmZ3c2l6ZV9saW1pdAkJPSA3Nzg5 NTsKKwlzYy0+dGVtcF9kZWx0YQkJCT0gUjg4RV9DQUxJQl9USFJFU0hPTEQ7CisKKwlzYy0+YmNu X3N0YXR1c19yZWdbMF0JCT0gUjkyQ19UREVDVFJMOworCS8qCisJICogVE9ETzogc29tZSBhZGRp dGlvbmFsIHNldHVwIGlzIHJlcXVpcmVkCisJICogdG8gbWFpbnRhaW4gZmV3IGJlYWNvbnMgYXQg dGhlIHNhbWUgdGltZS4KKwkgKgorCSAqIFhYWCBCQ05RMSBtZWNoYW5pc20gaXMgbm90IG5lZWRl ZCBoZXJlOyBtb3ZlIGl0IHRvIHRoZSBVU0IgbW9kdWxlLgorCSAqLworCXNjLT5iY25fc3RhdHVz X3JlZ1sxXQkJPSBSOTJDX1RERUNUUkw7CisJc2MtPnJjcgkJCQk9IDB4ZjAwMDc4MGU7CisKKwlz Yy0+c2NfbGx0X2luaXQJCQk9IHI4OGVlX2xsdF9pbml0OworCXNjLT5zY19nZXRfcnhfc3RhdHMJ CT0gcjg4ZV9nZXRfcnhfc3RhdHM7CisKKwlzYy0+bnR4Y2hhaW5zCQkJPSAxOworCXNjLT5ucnhj aGFpbnMJCQk9IDE7CisKKwlyODhlZV9hdHRhY2hfcHJpdmF0ZShzYyk7Cit9CmRpZmYgLS1naXQg YS9zeXMvZGV2L3J0d24vcnRsODE4OGUvcGNpL3I4OGVlX2NhbGliLmMgYi9zeXMvZGV2L3J0d24v cnRsODE4OGUvcGNpL3I4OGVlX2NhbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAuLjNjZDc1ZDFjMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2Rldi9ydHduL3J0 bDgxODhlL3BjaS9yODhlZV9jYWxpYi5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCSRPcGVuQlNEOiBp Zl9ydHduLmMsdiAxLjYgMjAxNS8wOC8yOCAwMDowMzo1MyBkZXJhYWR0IEV4cCAkCSovCisKKy8q LQorICogQ29weXJpZ2h0IChjKSAyMDE4IEZhcmhhbiBLaGFuIDxraGFuemZAZ21haWwuY29tPgor ICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRo aXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhl cmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj ZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisg KiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJ TVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVE SU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU TkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkg U1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFO WSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRB IE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElH RU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBD T05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgor ICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJlZUJTRCQiKTsKKwor I2luY2x1ZGUgIm9wdF93bGFuLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRl IDxzeXMvbG9jay5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgorI2luY2x1ZGUgPHN5cy9tYnVm Lmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNp bmNsdWRlIDxzeXMvc3lzdG0uaD4KKyNpbmNsdWRlIDxzeXMvbWFsbG9jLmg+CisjaW5jbHVkZSA8 c3lzL3F1ZXVlLmg+CisjaW5jbHVkZSA8c3lzL3Rhc2txdWV1ZS5oPgorI2luY2x1ZGUgPHN5cy9i dXMuaD4KKyNpbmNsdWRlIDxzeXMvZW5kaWFuLmg+CisjaW5jbHVkZSA8c3lzL2xpbmtlci5oPgor CisjaW5jbHVkZSA8bWFjaGluZS9idXMuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3Jlc291cmNlLmg+ CisjaW5jbHVkZSA8c3lzL3JtYW4uaD4KKworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUg PG5ldC9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPG5ldC9pZl9tZWRpYS5oPgorCisjaW5jbHVkZSA8 bmV0ODAyMTEvaWVlZTgwMjExX3Zhci5oPgorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9y YWRpb3RhcC5oPgorCisjaW5jbHVkZSA8ZGV2L3J0d24vaWZfcnR3bnJlZy5oPgorI2luY2x1ZGUg PGRldi9ydHduL2lmX3J0d252YXIuaD4KKyNpbmNsdWRlIDxkZXYvcnR3bi9pZl9ydHduX2RlYnVn Lmg+CisKKyNpbmNsdWRlIDxkZXYvcnR3bi9wY2kvcnR3bl9wY2lfdmFyLmg+CisKKyNpbmNsdWRl IDxkZXYvcnR3bi9ydGw4MTg4ZS9wY2kvcjg4ZWUuaD4KKyNpbmNsdWRlIDxkZXYvcnR3bi9ydGw4 MTg4ZS9wY2kvcjg4ZWVfcmVnLmg+CisKKworI2RlZmluZSBSVFdOX0lRX0NBTF9OUlVOCTMKK3Zv aWQKK3I4OGVlX2lxX2NhbGliKHN0cnVjdCBydHduX3NvZnRjICpzYykKK3sKKwkvKiBDdXJyZW50 bHkgdW5pbXBsZW1lbnRlZCAqLworfQorI3VuZGVmIFJUV05fSVFfQ0FMX05SVU4KZGlmZiAtLWdp dCBhL3N5cy9kZXYvcnR3bi9ydGw4MTg4ZS9wY2kvcjg4ZWVfaW5pdC5jIGIvc3lzL2Rldi9ydHdu L3J0bDgxODhlL3BjaS9yODhlZV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAuLjQxMmE3MTQ5NTU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2Rldi9ydHduL3J0 bDgxODhlL3BjaS9yODhlZV9pbml0LmMKQEAgLTAsMCArMSwyNTYgQEAKKy8qLQorICogQ29weXJp Z2h0IChjKSAyMDE3IEZhcmhhbiBLaGFuIDxraGFuemZAZ21haWwuY29tPgorICoKKyAqIFBlcm1p c3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUg Zm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVk LCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBw ZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdB UkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJB TlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBM SUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8g RVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElS RUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisg KiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMs IFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhF UiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJ VEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNs dWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJlZUJTRCQiKTsKKworI2luY2x1ZGUgIm9w dF93bGFuLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvbG9jay5o PgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgorI2luY2x1ZGUgPHN5cy9tYnVmLmg+CisjaW5jbHVk ZSA8c3lzL2tlcm5lbC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMv c3lzdG0uaD4KKyNpbmNsdWRlIDxzeXMvbWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzL3F1ZXVlLmg+ CisjaW5jbHVkZSA8c3lzL3Rhc2txdWV1ZS5oPgorI2luY2x1ZGUgPHN5cy9idXMuaD4KKyNpbmNs dWRlIDxzeXMvZW5kaWFuLmg+CisjaW5jbHVkZSA8c3lzL2xpbmtlci5oPgorCisjaW5jbHVkZSA8 bWFjaGluZS9idXMuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8 c3lzL3JtYW4uaD4KKworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldC9ldGhlcm5l dC5oPgorI2luY2x1ZGUgPG5ldC9pZl9tZWRpYS5oPgorCisjaW5jbHVkZSA8bmV0ODAyMTEvaWVl ZTgwMjExX3Zhci5oPgorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9yYWRpb3RhcC5oPgor CisjaW5jbHVkZSA8ZGV2L3J0d24vaWZfcnR3bnZhci5oPgorCisjaW5jbHVkZSA8ZGV2L3J0d24v cGNpL3J0d25fcGNpX3Zhci5oPgorI2luY2x1ZGUgPGRldi9ydHduL3J0bDgxODhlL3I4OGVfcmVn Lmg+CisjaW5jbHVkZSA8ZGV2L3J0d24vcnRsODE5MmMvcjkyYy5oPgorI2luY2x1ZGUgPGRldi9y dHduL3J0bDgxOTJjL3BjaS9yOTJjZV9yZWcuaD4KKyNpbmNsdWRlIDxkZXYvcnR3bi9ydGw4MTky Yy9wY2kvcjkyY2UuaD4KKworI2luY2x1ZGUgPGRldi9ydHduL3J0bDgxODhlL3BjaS9yODhlZS5o PgorI2luY2x1ZGUgPGRldi9ydHduL3J0bDgxODhlL3BjaS9yODhlZV9yZWcuaD4KKyNpbmNsdWRl IDxkZXYvcnR3bi9ydGw4MTg4ZS9wY2kvcjg4ZWVfcHdyc2VxLmg+CisjaW5jbHVkZSA8ZGV2L3J0 d24vcnRsODE5MmMvcjkyY192YXIuaD4KKwordm9pZAorcjg4ZWVfaW5pdF9pbnRyKHN0cnVjdCBy dHduX3NvZnRjICpzYykKK3sKKwkvKiBEaXNhYmxlIGludGVycnVwdHMuICovCisJcnR3bl93cml0 ZV80KHNjLCAweGIwLCAweDIwMDA4NGZmKTsKKwlydHduX3dyaXRlXzQoc2MsIDB4YjgsIDB4MTAw KTsKKwlydHduX3dyaXRlXzEoc2MsIDB4MDFBRiwgMHgwKTsKKwlydHduX3dyaXRlXzQoc2MsIDB4 MDA1OCwgMHhjMCk7IAorfQorCit2b2lkCityODhlZV9pbml0X2VkY2Eoc3RydWN0IHJ0d25fc29m dGMgKnNjKQoreworCXJ0d25fd3JpdGVfMShzYywgUjg4RUVfU0lGU19UUlggKyAxLCAweDBhKTsK KwlydHduX3dyaXRlXzEoc2MsIFI4OEVFX1NJRlNfU1BFQyArIDEsIDB4MGEpOworCXJ0d25fd3Jp dGVfMShzYywgUjg4RUVfU0lGU19TUEVDX01BQyArIDEsIDB4MGEpOworCXJ0d25fd3JpdGVfMihz YywgUjg4RUVfU0lGU19SRVNQX09GRE0sIDB4MGUwZSk7Cit9CisKK2ludAorcjg4ZWVfcG93ZXJf b24oc3RydWN0IHJ0d25fc29mdGMgKnNjKQoreworCXVpbnQ4X3QgYnl0ZXRtcDsKKworCWJ5dGV0 bXAgPSBydHduX3JlYWRfMShzYywgUjkyQ19BUFNfRlNNQ08gKyAxKSAmICh+MHg4MCk7CisJcnR3 bl93cml0ZV8xKHNjLCBSOTJDX0FQU19GU01DTyArIDEsIGJ5dGV0bXApOworCisJcnR3bl93cml0 ZV8xKHNjLCBSOTJDX1JTVl9DVFJMLCAweDAwKTsKKworCS8qIFBvd2VyIHNlcXVlbmNlOiBOSUMg ZW5hYmxlIGZsb3cgKi8KKwlydHduX3NldGJpdHNfMShzYywgMHg1LCAweDE4LCAweDApOworCWlm ICghcjg4ZWVfcHdyc2VxX3BvbGxpbmcoc2MsIDB4NiwgMHgyLCAweDIpKQorCQlyZXR1cm4gZmFs c2U7CisJcnR3bl9zZXRiaXRzXzEoc2MsIDB4MiwgMHgzLCAweDApOworCXJ0d25fc2V0Yml0c18x KHNjLCAweDI2LCAweDgwLCAweDgwKTsKKwlydHduX3NldGJpdHNfMShzYywgMHg1LCAweDgwLCAw eDApOworCXJ0d25fc2V0Yml0c18xKHNjLCAweDUsIDB4MTgsIDB4MCk7CisJcnR3bl9zZXRiaXRz XzEoc2MsIDB4NSwgMHgxLCAweDEpOworCWlmICghcjg4ZWVfcHdyc2VxX3BvbGxpbmcoc2MsIDB4 NSwgMHgxLCAweDApKQorCQlyZXR1cm4gZmFsc2U7CisJLyogRW5kIG9mIHBvd2VyIHNlcXVlbmNl ICovCisKKwlieXRldG1wID0gcnR3bl9yZWFkXzEoc2MsIFI5MkNfU1lTX0NMS1IpOworCisJcnR3 bl93cml0ZV8xKHNjLCBSOTJDX1NZU19DTEtSLCBieXRldG1wIHwgMHgwOCk7CisJYnl0ZXRtcCA9 IHJ0d25fcmVhZF8xKHNjLCBSOTJDX0dQSU9fTVVYQ0ZHKzEpOworCXJ0d25fd3JpdGVfMShzYywg UjkyQ19HUElPX01VWENGRysxLCAoYnl0ZXRtcCAmICh+MHgxMCkpKTsKKwlydHduX3dyaXRlXzEo c2MsIDB4MzY3LCAweDgwKTsKKworCXJ0d25fd3JpdGVfMihzYywgUjkyQ19DUiwgMHgyZmYpOwor CXJ0d25fd3JpdGVfMShzYywgUjkyQ19DUisxLCAweDA2KTsKKwlydHduX3dyaXRlXzEoc2MsIFI5 MkNfTVNSLCAweDAwKTsKKworCXJ0d25fd3JpdGVfNChzYywgUjkyQ19JTlRfTUlHLCAwKTsKKwor CXJ0d25fd3JpdGVfMShzYywgUjkyQ19QQ0lFX0NUUkxfUkVHKzEsIDApOyAvKiBFbmFibGUgUlgg RE1BICovCisKKwlydHduX3dyaXRlXzEoc2MsIDB4MDRDQSwgMHgwQik7CisJcnR3bl93cml0ZV80 KHNjLCBSOTJDX1JDUiwgc2MtPnJjcik7CisKKwlydHduX3dyaXRlXzQoc2MsIFI5MkNfTUNVVFNU XzEsIDB4MCk7CisKKwlyZXR1cm4oMCk7CisKK30KKwordm9pZAorcjg4ZWVfcG93ZXJfb2ZmKHN0 cnVjdCBydHduX3NvZnRjICpzYykKK3sKKwl1aW50MzJfdCBjb3VudCA9IDA7CisJdWludDhfdCB0 bXA7CisKKwl0bXAgPSBydHduX3JlYWRfMShzYywgUjg4RV9UWF9SUFRfQ1RSTCk7CisJcnR3bl93 cml0ZV8xKHNjLCBSODhFX1RYX1JQVF9DVFJMLCB0bXAgJiAofjB4MDIpKTsKKworCXRtcCA9IHJ0 d25fcmVhZF8xKHNjLCBSODhFRV9SWERNQV9DT05UUk9MKTsKKworCXdoaWxlICghKHRtcCAmIDB4 MDIpICYmIChjb3VudCsrIDwgMTAwKSkgeworCQlydHduX2RlbGF5KHNjLCAxMCk7CisJCXRtcCA9 IHJ0d25fcmVhZF8xKHNjLCBSODhFRV9SWERNQV9DT05UUk9MKTsKKwkJY291bnQrKzsKKwl9CisK KwlydHduX3dyaXRlXzEoc2MsIFI5MkNfUENJRV9DVFJMX1JFRysxLCAweEZGKTsKKworCS8qIFBv d2VyIHNlcXVlbmNlOiBEaXNhYmxlIE5JQyBMUFMgZW5hYmxlIEZsb3cgKi8KKwlydHduX3NldGJp dHNfMShzYywgMHg1MjIsIDB4ZmYsIDB4N2YpOworCXI4OGVlX3B3cnNlcV9wb2xsaW5nKHNjLCAw eDVmOCwgMHhmZiwgMHgwKTsKKwlyODhlZV9wd3JzZXFfcG9sbGluZyhzYywgMHg1ZjksIDB4ZmYs IDB4MCk7CisJcjg4ZWVfcHdyc2VxX3BvbGxpbmcoc2MsIDB4NWZhLCAweGZmLCAweDApOworCXI4 OGVlX3B3cnNlcV9wb2xsaW5nKHNjLCAweDVmYiwgMHhmZiwgMHgwKTsKKwlydHduX3NldGJpdHNf MShzYywgMHgyLCAweDEsIDB4MCk7CisJcnR3bl9zZXRiaXRzXzEoc2MsIDB4MTAwLCAweGZmLCAw eDNmKTsKKwlydHduX3NldGJpdHNfMShzYywgMHgxMDEsIDB4MiwgMHgwKTsKKwlydHduX3NldGJp dHNfMShzYywgMHg1NTMsIDB4MjAsIDB4MjApOworCS8qIEVuZCBvZiBwb3dlciBzZXF1ZW5jZSAq LworCisJcnR3bl93cml0ZV8xKHNjLCBSOTJDX1JGX0NUUkwsIDB4MDApOworCisJdG1wID0gcnR3 bl9yZWFkXzEoc2MsIFI5MkNfU1lTX0ZVTkNfRU4rMSk7CisJcnR3bl93cml0ZV8xKHNjLCBSOTJD X1NZU19GVU5DX0VOKzEsICh0bXAgJiAofjB4MDQpKSk7CisJcnR3bl93cml0ZV8xKHNjLCBSOTJD X1NZU19GVU5DX0VOKzEsICh0bXAgfCAweDA0KSk7CisKKwl0bXAgPSBydHduX3JlYWRfMShzYywg UjkyQ19TWVNfRlVOQ19FTisxKTsKKwlydHduX3dyaXRlXzEoc2MsIFI5MkNfU1lTX0ZVTkNfRU4g KyAxLCAodG1wICYgKH4weDA0KSkpOworCXJ0d25fd3JpdGVfMShzYywgUjkyQ19NQ1VGV0RMLCAw eDAwKTsKKworCXRtcCA9IHJ0d25fcmVhZF8xKHNjLCBSODhFXzMyS19DVFJMKTsKKwlydHduX3dy aXRlXzEoc2MsIFI4OEVfMzJLX0NUUkwsICh0bXAgJiAofjB4MDEpKSk7CisKKwkvKiBQb3dlciBz ZXF1ZW5jZTogTklDIERpc2FibGUgZmxvdyAqLworCXJ0d25fc2V0Yml0c18xKHNjLCAweDFmLCAw eGZmLCAweDApOworCXJ0d25fc2V0Yml0c18xKHNjLCAweDIzLCAweDEwLCAweDEwKTsKKwlydHdu X3NldGJpdHNfMShzYywgMHg1LCAweDIsIDB4Mik7CisJcjg4ZWVfcHdyc2VxX3BvbGxpbmcoc2Ms IDB4NSwgMHgyLCAweDApOworCXJ0d25fc2V0Yml0c18xKHNjLCAweDI2LCAweDgwLCAweDgwKTsK KwkvKiBFbmQgb2YgcG93ZXIgc2VxdWVuY2UgKi8KKworCXRtcCA9IHJ0d25fcmVhZF8xKHNjLCBS OTJDX1JTVl9DVFJMKzEpOworCXJ0d25fd3JpdGVfMShzYywgUjkyQ19SU1ZfQ1RSTCsxLCAodG1w ICYgKH4weDA4KSkpOworCXRtcCA9IHJ0d25fcmVhZF8xKHNjLCBSOTJDX1JTVl9DVFJMKzEpOwor CXJ0d25fd3JpdGVfMShzYywgUjkyQ19SU1ZfQ1RSTCsxLCAodG1wIHwgMHgwOCkpOworCisJcnR3 bl93cml0ZV8xKHNjLCBSOTJDX1JTVl9DVFJMLCAweDBFKTsKKworCXRtcCA9IHJ0d25fcmVhZF8x KHNjLCBSOTJDX0dQSU9fSU4pOworCXJ0d25fd3JpdGVfMShzYywgUjkyQ19HUElPX09VVCwgdG1w KTsKKwlydHduX3dyaXRlXzEoc2MsIFI5MkNfR1BJT19JT19TRUwsIDB4N0YpOworCisJdG1wID0g cnR3bl9yZWFkXzEoc2MsIFI5MkNfR1BJT19JT19TRUwpOworCXJ0d25fd3JpdGVfMShzYywgUjky Q19HUElPX0lPX1NFTCwgKHRtcCA8PCA0KSB8IHRtcCk7CisJdG1wID0gcnR3bl9yZWFkXzEoc2Ms IFI5MkNfR1BJT19JT19TRUwrMSk7CisJcnR3bl93cml0ZV8xKHNjLCBSOTJDX0dQSU9fSU9fU0VM KzEsIHRtcCB8IDB4MEYpOworCisJcnR3bl93cml0ZV80KHNjLCBSODhFRV9HUElPX0lPX1NFTF8y KzIsIDB4MDAwODA4MDgpOworfQorCit2b2lkCityODhlZV9pbml0X2FtcGR1KHN0cnVjdCBydHdu X3NvZnRjICpzYykKK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgKi8KK30KKwordm9pZAorcjg4ZWVf cG9zdF9pbml0KHN0cnVjdCBydHduX3NvZnRjICpzYykKK3sKKyAgICAgcnR3bl93cml0ZV8yKHNj LCBSOTJDX0ZXSFdfVFhRX0NUUkwsCisgICAgICAgICAweDFmMDAgfCBSOTJDX0ZXSFdfVFhRX0NU UkxfQU1QRFVfUlRZX05FVyk7CisKKyAgICAgcnR3bl93cml0ZV8xKHNjLCBSOTJDX0JDTl9NQVhf RVJSLCAweGZmKTsKKworICAgICAvKiBQZXJmb3JtIExPIGFuZCBJUSBjYWxpYnJhdGlvbnMuICov CisgICAgIHJ0d25faXFfY2FsaWIoc2MpOworICAgICAvKiBQZXJmb3JtIExDIGNhbGlicmF0aW9u LiAqLworICAgICBydHduX2xjX2NhbGliKHNjKTsKKworICAgICByOTJjX3BhX2JpYXNfaW5pdChz Yyk7CisKKyAgICAgLyogRml4IGZvciBsb3dlciB0ZW1wZXJhdHVyZS4gKi8KKyAgICAgcnR3bl93 cml0ZV8xKHNjLCAweDE1LCAweGU5KTsKKworI2lmbmRlZiBSVFdOX1dJVEhPVVRfVUNPREUKKyAg ICAgaWYgKHNjLT5zY19mbGFncyAmIFJUV05fRldfTE9BREVEKSB7CisgICAgICAgICAgc3RydWN0 IHI5MmNfc29mdGMgKnJzID0gc2MtPnNjX3ByaXY7CisKKyAgICAgICAgICBpZiAoc2MtPnNjX3Jh dGVjdGxfc3lzY3RsID09IFJUV05fUkFURUNUTF9GVykgeworICAgICAgICAgICAgICAgLyogWFhY IFRPRE86IGZpeCAoc2VlIGNvbW1lbnQgaW4gcjkyY3VfaW5pdC5jKSAqLworICAgICAgICAgICAg ICAgc2MtPnNjX3JhdGVjdGwgPSBSVFdOX1JBVEVDVExfTkVUODAyMTE7CisgICAgICAgICAgfSBl bHNlCisgICAgICAgICAgICAgICBzYy0+c2NfcmF0ZWN0bCA9IHNjLT5zY19yYXRlY3RsX3N5c2N0 bDsKKworICAgICAgICAgIC8qIFN0YXJ0IEMySCBldmVudCBoYW5kbGluZy4gKi8KKyAgICAgICAg ICBjYWxsb3V0X3Jlc2V0KCZycy0+cnNfYzJoX3JlcG9ydCwgcnMtPnJzX2MyaF90aW1lb3V0LAor ICAgICAgICAgICAgICByOTJjX2hhbmRsZV9jMmhfcmVwb3J0LCBzYyk7CisgICAgIH0gZWxzZQor I2VuZGlmCisgICAgICAgICAgc2MtPnNjX3JhdGVjdGwgPSBSVFdOX1JBVEVDVExfTk9ORTsKK30K Kwordm9pZAorcjg4ZWVfaW5pdF9yeF9hZ2coc3RydWN0IHJ0d25fc29mdGMgKnNjKSB7CisJc3Ry dWN0IHJ0d25fcGNpX3NvZnRjICpwYyA9IHNjLT5zY19wcml2OworCisJdWludDE2X3QgdG1wOwor CisJdG1wID0gcnR3bl9yZWFkXzIoc2MsIFI4OEVFX1RSWERNQV9DVFJMKTsKKwl0bXAgJj0gMHhm OworCXRtcCB8PSAweEU3NzE7CisJcnR3bl93cml0ZV8yKHNjLCBSODhFRV9UUlhETUFfQ1RSTCwg dG1wKTsKKworCXJ0d25fd3JpdGVfNChzYywgUjkyQ19SQ1IsIHNjLT5yY3IpOworCXJ0d25fd3Jp dGVfMihzYywgUjkyQ19SWEZMVE1BUDIsIDB4ZmZmZik7CisJcnR3bl93cml0ZV80KHNjLCBSOTJD X1RDUiwgcGMtPnRjcik7CisKKwlydHduX3dyaXRlXzEoc2MsIFI5MkNfUENJRV9DVFJMX1JFRysx LCAwKTsKKworfQpkaWZmIC0tZ2l0IGEvc3lzL2Rldi9ydHduL3J0bDgxODhlL3BjaS9yODhlZV9w cml2LmggYi9zeXMvZGV2L3J0d24vcnRsODE4OGUvcGNpL3I4OGVlX3ByaXYuaApuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYjk0MTUwNjU4YTQKLS0tIC9kZXYvbnVsbAor KysgYi9zeXMvZGV2L3J0d24vcnRsODE4OGUvcGNpL3I4OGVlX3ByaXYuaApAQCAtMCwwICsxLDIz NiBAQAorLyoJJE9wZW5CU0Q6IGlmX3J0d25yZWcuaCx2IDEuMyAyMDE1LzA2LzE0IDA4OjAyOjQ3 IHN0c3AgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggRmFyaGFuIEtoYW4g PGtoYW56ZkBnbWFpbC5jb20+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlm eSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGgg b3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3Zl CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBp biBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFO RCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8g VEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVS Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJF IExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFV RU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZS T00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9O IE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lO RyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNF IE9GIFRISVMgU09GVFdBUkUuCisgKiAKKyAqICRGcmVlQlNEJAorICovCisKKyNpZm5kZWYgUjg4 RUVfUFJJVl9ICisjZGVmaW5lIFI4OEVFX1BSSVZfSAorCisjaW5jbHVkZSA8ZGV2L3J0d24vcnRs ODE4OGUvcjg4ZV9wcml2Lmg+CisKKy8qCisgKiBSRiBpbml0aWFsaXphdGlvbiB2YWx1ZXMuCisg Ki8KK3N0YXRpYyBjb25zdCB1aW50OF90IHJ0bDgxODhlZV9yZl9yZWdzMFtdID0geworCTB4MDAw LCAweDAwOCwgMHgwMTgsIDB4MDE5LCAweDAxRSwKKwkweDAxRiwgMHgwMkYsIDB4MDNGLCAweDA0 MiwgMHgwNTcsCisJMHgwNTgsIDB4MDY3LCAweDA4MywgMHgwQjAsIDB4MEIxLAorCTB4MEIyLCAw eDBCNCwgMHgwQjYsIDB4MEI3LCAweDBCOCwKKwkweDBCOSwgMHgwQkEsIDB4MEJCLCAweDBCRiwg MHgwQzIsCisJMHgwQzMsIDB4MEM0LCAweDBDNSwgMHgwQzYsIDB4MEM3LAorCTB4MEM4LCAweDBD OSwgMHgwQ0EsIDB4MERGLCAweDBFRiwKKwkweDA1MSwgMHgwNTIsIDB4MDUzLCAweDA1NiwgMHgw MzUsCisJMHgwMzUsIDB4MDM1LCAweDAzNiwgMHgwMzYsIDB4MDM2LAorCTB4MDM2LCAweDBCNiwg MHgwMTgsIDB4MDVBLCAweDAxOSwKKwkweDAzNCwgMHgwMzQsIDB4MDM0LCAweDAzNCwgMHgwMzQs CisJMHgwMzQsIDB4MDM0LCAweDAzNCwgMHgwMzQsIDB4MDM0LAorCTB4MDM0LCAweDAwMCwgMHgw ODQsIDB4MDg2LCAweDA4NywKKwkweDA4RSwgMHgwOEYsIDB4MEVGLCAweDAzQiwgMHgwM0IsCisJ MHgwM0IsIDB4MDNCLCAweDAzQiwgMHgwM0IsIDB4MDNCLAorCTB4MDNCLCAweDAzQiwgMHgwM0Is IDB4MDNCLCAweDAzQiwKKworCTB4MDNCLCAweDAzQiwgMHgwM0IsIDB4MDNCLCAweDBFRiwKKwkw eDAwMCwgMHgwMTgsIDB4MEY5LCAweDBGOSwgMHgwMUUsCisJMHgwRjksIDB4MEY5LCAweDAxRSwg MHgwMUYsIDB4MDAwCisKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBydGw4MTg4ZWVfcmZf dmFsczBbXSA9IHsKKwkweDAwMDMwMDAwLCAweDAwMDg0MDAwLCAweDAwMDAwNDA3LCAweDAwMDAw MDEyLCAweDAwMDgwMDA5LAorCTB4MDAwMDA4ODAsIDB4MDAwMUEwNjAsIDB4MDAwMDAwMDAsIDB4 MDAwMDYwQzAsIDB4MDAwRDAwMDAsCisJMHgwMDBCRTE4MCwgMHgwMDAwMTU1MiwgMHgwMDAwMDAw MCwgMHgwMDBGRjhGQywgMHgwMDA1NDQwMCwKKwkweDAwMENDQzE5LCAweDAwMDQzMDAzLCAweDAw MDQ5NTNFLCAweDAwMDFDNzE4LCAweDAwMDA2MEZGLAorCTB4MDAwODAwMDEsIDB4MDAwNDAwMDAs IDB4MDAwMDA0MDAsIDB4MDAwQzAwMDAsIDB4MDAwMDI0MDAsCisJMHgwMDAwMDAwOSwgMHgwMDA0 MEM5MSwgMHgwMDA5OTk5OSwgMHgwMDAwMDBBMywgMHgwMDA4ODgyMCwKKwkweDAwMDc2QzA2LCAw eDAwMDAwMDAwLCAweDAwMDgwMDAwLCAweDAwMDAwMTgwLCAweDAwMDAwMUEwLAorCTB4MDAwNkIy N0QsIDB4MDAwN0U0OUQsIDB4MDAwMDAwNzMsIDB4MDAwNTFGRjMsIDB4MDAwMDAwODYsCisJMHgw MDAwMDE4NiwgMHgwMDAwMDI4NiwgMHgwMDAwMUMyNSwgMHgwMDAwOUMyNSwgMHgwMDAxMUMyNSwK KwkweDAwMDE5QzI1LCAweDAwMDQ4NTM4LCAweDAwMDAwQzA3LCAweDAwMDRCRDAwLCAweDAwMDcz OUQwLAorCTB4MDAwMEFERjMsIDB4MDAwMDlERjAsIDB4MDAwMDhERUQsIDB4MDAwMDdERUEsIDB4 MDAwMDZERTcsCisJMHgwMDAwNTRFRSwgMHgwMDAwNDRFQiwgMHgwMDAwMzRFOCwgMHgwMDAwMjQ2 QiwgMHgwMDAwMTQ2OCwKKwkweDAwMDAwMDZELCAweDAwMDMwMTU5LCAweDAwMDY4MjAwLCAweDAw MDAwMENFLCAweDAwMDQ4QTAwLAorCTB4MDAwNjU1NDAsIDB4MDAwODgwMDAsIDB4MDAwMDIwQTAs IDB4MDAwRjAyQjAsIDB4MDAwRUY3QjAsCisJMHgwMDBENEZCMCwgMHgwMDBDRjA2MCwgMHgwMDBC MDA5MCwgMHgwMDBBMDA4MCwgMHgwMDA5MDA4MCwKKwkweDAwMDhGNzgwLCAweDAwMDcyMkIwLCAw eDAwMDZGN0IwLCAweDAwMDU0RkIwLCAweDAwMDRGMDYwLAorCTB4MDAwMzAwOTAsIDB4MDAwMjAw ODAsIDB4MDAwMTAwODAsIDB4MDAwMEY3ODAsIDB4MDAwMDAwQTAsCisKKwkweDAwMDEwMTU5LCAw eDAwMDBGNDA3LCAweDAwMDBDMzUwLCAweDAwMDBDMzUwLCAweDAwMDgwMDAzLAorCTB4MDAwMEMz NTAsIDB4MDAwMEMzNTAsIDB4MDAwMDAwMDEsIDB4MDAwODAwMDAsIDB4MDAwMzNlNjAKK307CisK K19TdGF0aWNfYXNzZXJ0KG5pdGVtcyhydGw4MTg4ZWVfcmZfcmVnczApID09IG5pdGVtcyhydGw4 MTg4ZWVfcmZfdmFsczApLAorICAgICJydGw4MTg4ZWVfcmZfcmVnczAgYW5kIHJ0bDgxODhlZV9y Zl92YWxzMCBtdXN0IGJlIHRoZSBzYW1lIHNpemUhIik7CisKKworc3RhdGljIGNvbnN0IHN0cnVj dCBydHduX3JmX3Byb2cgcnRsODE4OGVlX3JmW10gPSB7CisJeworCQluaXRlbXMocnRsODE4OGVl X3JmX3JlZ3MwKSwKKwkJcnRsODE4OGVlX3JmX3JlZ3MwLAorCQlydGw4MTg4ZWVfcmZfdmFsczAs CisJCXsgMHgwIH0sCisJCU5VTEwsCisJfSwKKwl7IDAsIE5VTEwsIE5VTEwsIHsgMCB9LCBOVUxM IH0KK307CisKKy8qCisgKiBNQUMgaW5pdGlhbGl6YXRpb24gdmFsdWVzLgorICovCitzdGF0aWMg Y29uc3Qgc3RydWN0IHJ0d25fbWFjX3Byb2cgcnRsODE4OGVlX21hY1tdID0geworCXsgMHgwMjYs IDB4NDEgfSwgeyAweDAyNywgMHgzNSB9LCB7IDB4NDI4LCAweDBBIH0sIHsgMHg0MjksIDB4MTAg fSwKKwl7IDB4NDMwLCAweDAwIH0sIHsgMHg0MzEsIDB4MDEgfSwgeyAweDQzMiwgMHgwMiB9LCB7 IDB4NDMzLCAweDA0IH0sCisJeyAweDQzNCwgMHgwNSB9LCB7IDB4NDM1LCAweDA2IH0sIHsgMHg0 MzYsIDB4MDcgfSwgeyAweDQzNywgMHgwOCB9LAorCXsgMHg0MzgsIDB4MDAgfSwgeyAweDQzOSwg MHgwMCB9LCB7IDB4NDNBLCAweDAxIH0sIHsgMHg0M0IsIDB4MDIgfSwKKwl7IDB4NDNDLCAweDA0 IH0sIHsgMHg0M0QsIDB4MDUgfSwgeyAweDQzRSwgMHgwNiB9LCB7IDB4NDNGLCAweDA3IH0sCisJ eyAweDQ0MCwgMHg1RCB9LCB7IDB4NDQxLCAweDAxIH0sIHsgMHg0NDIsIDB4MDAgfSwgeyAweDQ0 NCwgMHgxNSB9LAorCXsgMHg0NDUsIDB4RjAgfSwgeyAweDQ0NiwgMHgwRiB9LCB7IDB4NDQ3LCAw eDAwIH0sIHsgMHg0NTgsIDB4NDEgfSwKKwl7IDB4NDU5LCAweEE4IH0sIHsgMHg0NUEsIDB4NzIg fSwgeyAweDQ1QiwgMHhCOSB9LCB7IDB4NDYwLCAweDY2IH0sCisJeyAweDQ2MSwgMHg2NiB9LCB7 IDB4NDgwLCAweDA4IH0sIHsgMHg0QzgsIDB4RkYgfSwgeyAweDRDOSwgMHgwOCB9LAorCXsgMHg0 Q0MsIDB4RkYgfSwgeyAweDRDRCwgMHhGRiB9LCB7IDB4NENFLCAweDAxIH0sIHsgMHg0RDMsIDB4 MDEgfSwKKwl7IDB4NTAwLCAweDI2IH0sIHsgMHg1MDEsIDB4QTIgfSwgeyAweDUwMiwgMHgyRiB9 LCB7IDB4NTAzLCAweDAwIH0sCisJeyAweDUwNCwgMHgyOCB9LCB7IDB4NTA1LCAweEEzIH0sIHsg MHg1MDYsIDB4NUUgfSwgeyAweDUwNywgMHgwMCB9LAorCXsgMHg1MDgsIDB4MkIgfSwgeyAweDUw OSwgMHhBNCB9LCB7IDB4NTBBLCAweDVFIH0sIHsgMHg1MEIsIDB4MDAgfSwKKwl7IDB4NTBDLCAw eDRGIH0sIHsgMHg1MEQsIDB4QTQgfSwgeyAweDUwRSwgMHgwMCB9LCB7IDB4NTBGLCAweDAwIH0s CisJeyAweDUxMiwgMHgxQyB9LCB7IDB4NTE0LCAweDBBIH0sIHsgMHg1MTYsIDB4MEEgfSwgeyAw eDUyNSwgMHg0RiB9LAorCXsgMHg1NTAsIDB4MTAgfSwgeyAweDU1MSwgMHgxMCB9LCB7IDB4NTU5 LCAweDAyIH0sIHsgMHg1NUQsIDB4RkYgfSwKKwl7IDB4NjA1LCAweDMwIH0sIHsgMHg2MDgsIDB4 MEUgfSwgeyAweDYwOSwgMHgyQSB9LCB7IDB4NjIwLCAweEZGIH0sCisJeyAweDYyMSwgMHhGRiB9 LCB7IDB4NjIyLCAweEZGIH0sIHsgMHg2MjMsIDB4RkYgfSwgeyAweDYyNCwgMHhGRiB9LAorCXsg MHg2MjUsIDB4RkYgfSwgeyAweDYyNiwgMHhGRiB9LCB7IDB4NjI3LCAweEZGIH0sIHsgMHg2NTIs IDB4MjAgfSwKKwl7IDB4NjNDLCAweDBBIH0sIHsgMHg2M0QsIDB4MEEgfSwgeyAweDYzRSwgMHgw RSB9LCB7IDB4NjNGLCAweDBFIH0sCisJeyAweDY0MCwgMHg0MCB9LCB7IDB4NjZFLCAweDA1IH0s IHsgMHg3MDAsIDB4MjEgfSwgeyAweDcwMSwgMHg0MyB9LAorCXsgMHg3MDIsIDB4NjUgfSwgeyAw eDcwMywgMHg4NyB9LCB7IDB4NzA4LCAweDIxIH0sIHsgMHg3MDksIDB4NDMgfSwKKwl7IDB4NzBB LCAweDY1IH0sIHsgMHg3MEIsIDB4ODcgfQorfTsKKworLyoKKyAqIEJhc2ViYW5kIGluaXRpYWxp emF0aW9uIHZhbHVlcy4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IHJ0bDgxODhlZV9iYl9w aHlfcmVnczBbXSA9IHsKKwkweDgwMCwgMHg4MDQsIDB4ODA4LCAweDgwQywgMHg4MTAsIDB4ODE0 LCAweDgxOCwgMHg4MUMsIDB4ODIwLAorCTB4ODI0LCAweDgyOCwgMHg4MkMsIDB4ODMwLCAweDgz NCwgMHg4MzgsIDB4ODNDLCAweDg0MCwgMHg4NDQsCisJMHg4NDgsIDB4ODRDLCAweDg1MCwgMHg4 NTQsIDB4ODU4LCAweDg1QywgMHg4NjAsIDB4ODY0LCAweDg2OCwKKwkweDg2QywgMHg4NzAsIDB4 ODc0LCAweDg3OCwgMHg4N0MsIDB4ODgwLCAweDg4NCwgMHg4ODgsIDB4ODhDLAorCTB4ODkwLCAw eDg5NCwgMHg4OTgsIDB4ODlDLCAweDkwMCwgMHg5MDQsIDB4OTA4LCAweDkwQywgMHg5MTAsCisJ MHg5MTQsIDB4QTAwLCAweEEwNCwgMHhBMDgsIDB4QTBDLCAweEExMCwgMHhBMTQsIDB4QTE4LCAw eEExQywKKwkweEEyMCwgMHhBMjQsIDB4QTI4LCAweEEyQywgMHhBNzAsIDB4QTc0LCAweEE3OCwg MHhBN0MsIDB4QTgwLAorCTB4QjJDLCAweEMwMCwgMHhDMDQsIDB4QzA4LCAweEMwQywgMHhDMTAs IDB4QzE0LCAweEMxOCwgMHhDMUMsCisJMHhDMjAsIDB4QzI0LCAweEMyOCwgMHhDMkMsIDB4QzMw LCAweEMzNCwgMHhDMzgsIDB4QzNDLCAweEM0MCwKKwkweEM0NCwgMHhDNDgsIDB4QzRDLCAweEM1 MCwgMHhDNTQsIDB4QzU4LCAweEM1QywgMHhDNjAsIDB4QzY0LAorCTB4QzY4LCAweEM2QywgMHhD NzAsIDB4Qzc0LCAweEM3OCwgMHhDN0MsIDB4QzgwLCAweEM4NCwgMHhDODgsCisJMHhDOEMsIDB4 QzkwLCAweEM5NCwgMHhDOTgsIDB4QzlDLCAweENBMCwgMHhDQTQsIDB4Q0E4LCAweENBQywKKwkw eENCMCwgMHhDQjQsIDB4Q0I4LCAweENCQywgMHhDQzAsIDB4Q0M0LCAweENDOCwgMHhDQ0MsIDB4 Q0QwLAorCTB4Q0Q0LCAweENEOCwgMHhDREMsIDB4Q0UwLCAweENFNCwgMHhDRTgsIDB4Q0VDLCAw eEQwMCwgMHhEMDQsCisJMHhEMDgsIDB4RDBDLCAweEQxMCwgMHhEMTQsIDB4RDE4LCAweEQyQywg MHhEMzAsIDB4RDM0LCAweEQzOCwKKwkweEQzQywgMHhENDAsIDB4RDQ0LCAweEQ0OCwgMHhENEMs IDB4RDUwLCAweEQ1NCwgMHhENTgsIDB4RDVDLAorCTB4RDYwLCAweEQ2NCwgMHhENjgsIDB4RDZD LCAweEQ3MCwgMHhENzQsIDB4RDc4LCAweEUwMCwgMHhFMDQsCisJMHhFMDgsIDB4RTEwLCAweEUx NCwgMHhFMTgsIDB4RTFDLCAweEUyOCwgMHhFMzAsIDB4RTM0LCAweEUzOCwKKwkweEUzQywgMHhF NDAsIDB4RTQ0LCAweEU0OCwgMHhFNEMsIDB4RTUwLCAweEU1NCwgMHhFNTgsIDB4RTVDLAorCTB4 RTYwLCAweEU2OCwgMHhFNkMsIDB4RTcwLCAweEU3NCwgMHhFNzgsIDB4RTdDLCAweEU4MCwgMHhF ODQsCisJMHhFODgsIDB4RThDLCAweEVEMCwgMHhFRDQsIDB4RUQ4LCAweEVEQywgMHhFRTAsIDB4 RUVDLCAweEYxNCwKKwkweEY0QywgMHhGMDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBy dGw4MTg4ZWVfYmJfcGh5X3ZhbHMwW10gPSB7CisJMHg4MDA0MDAwMCwgMHgwMDAwMDAwMywgMHgw MDAwRkMwMCwgMHgwMDAwMDAwQSwgMHgxMDAwMTMzMSwKKwkweDAyMEMzRDEwLCAweDAyMjAwMzg1 LCAweDAwMDAwMDAwLCAweDAxMDAwMTAwLCAweDAwMzkwMjA0LAorCTB4MDAwMDAwMDAsIDB4MDAw MDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwg MHgwMDAxMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAw MDAwLCAweDAwMDAwMDAwLCAweDU2OUExMUE5LCAweDAxMDAwMDE0LCAweDY2RjYwMTEwLAorCTB4 MDYxRjA2NDksIDB4MDAwMDAwMDAsIDB4MjcyNzI3MDAsIDB4MDcwMDA3NjAsIDB4MjUwMDQwMDAs CisJMHgwMDAwMDgwOCwgMHgwMDAwMDAwMCwgMHhCMDAwMEMxQywgMHgwMDAwMDAwMSwgMHgwMDAw MDAwMCwKKwkweENDQzAwMEMwLCAweDAwMDAwODAwLCAweEZGRkZGRkZFLCAweDQwMzAyMDEwLCAw eDAwNzA2MDUwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMDAsIDB4ODExMjEx MTEsIDB4MDAwMDAwMDIsCisJMHgwMDAwMDIwMSwgMHgwMEQwNDdDOCwgMHg4MEZGMDAwQywgMHg4 QzgzODMwMCwgMHgyRTdGMTIwRiwKKwkweDk1MDBCQjc4LCAweDExMTREMDI4LCAweDAwODgxMTE3 LCAweDg5MTQwRjAwLCAweDFBMUIwMDAwLAorCTB4MDkwRTEzMTcsIDB4MDAwMDAyMDQsIDB4MDBE MzAwMDAsIDB4MTAxRkJGMDAsIDB4MDAwMDAwMDcsCisJMHgwMDAwMDkwMCwgMHgyMjVCMDYwNiwg MHgyMTgwNzVCMSwgMHg4MDAwMDAwMCwgMHg0ODA3MUQ0MCwKKwkweDAzQTA1NjExLCAweDAwMDAw MEU0LCAweDZDNkM2QzZDLCAweDA4ODAwMDAwLCAweDQwMDAwMTAwLAorCTB4MDg4MDAwMDAsIDB4 NDAwMDAxMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAw MCwgMHg2OUU5QUM0NywgMHg0Njk2NTJBRiwgMHg0OTc5NTk5NCwgMHgwQTk3OTcxQywKKwkweDFG N0M0MDNGLCAweDAwMDEwMEI3LCAweEVDMDIwMTA3LCAweDAwN0YwMzdGLCAweDY5NTUzNDIwLAor CTB4NDNCQzAwOTQsIDB4MDAwMTMxNjksIDB4MDAyNTA0OTIsIDB4MDAwMDAwMDAsIDB4NzExMjg0 OEIsCisJMHg0N0MwMEJGRiwgMHgwMDAwMDAzNiwgMHgyQzdGMDAwRCwgMHgwMjA2MTBEQiwgMHgw MDAwMDAxRiwKKwkweDAwQjkxNjEyLCAweDM5MDAwMEU0LCAweDIwRjYwMDAwLCAweDQwMDAwMTAw LCAweDIwMjAwMDAwLAorCTB4MDAwOTE1MjEsIDB4MDAwMDAwMDAsIDB4MDAxMjE4MjAsIDB4MDAw MDdGN0YsIDB4MDAwMDAwMDAsCisJMHgwMDAzMDBBMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwg MHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDI4MDAwMDAwLCAweDAwMDAw MDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4 MDAwMDAwMDAsIDB4NjRCMjI0MjcsIDB4MDA3NjY5MzIsCisJMHgwMDIyMjIyMiwgMHgwMDAwMDAw MCwgMHgzNzY0NDMwMiwgMHgyRjk3RDQwQywgMHgwMDAwMDc0MCwKKwkweDAwMDIwNDAxLCAweDAw MDA5MDdGLCAweDIwMDEwMjAxLCAweEEwNjMzMzMzLCAweDMzMzNCQzQzLAorCTB4N0E4RjVCNkYs IDB4Q0M5Nzk5NzUsIDB4MDAwMDAwMDAsIDB4ODA2MDgwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDEy NzM1MywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkw eDY0MzcxNDBBLCAweDAwMDAwMDAwLCAweDAwMDAwMjgyLCAweDMwMDMyMDY0LCAweDQ2NTNERTY4 LAorCTB4MDQ1MThBM0MsIDB4MDAwMDIxMDEsIDB4MkEyMDFDMTYsIDB4MTgxMjM2MkUsIDB4MzIy QzIyMjAsCisJMHgwMDBFM0MyNCwgMHgyRDJEMkQyRCwgMHgyRDJEMkQyRCwgMHgwMzkwMjcyRCwg MHgyRDJEMkQyRCwKKwkweDJEMkQyRDJELCAweDJEMkQyRDJELCAweDJEMkQyRDJELCAweDAwMDAw MDAwLCAweDEwMDBEQzFGLAorCTB4MTAwMDhDMUYsIDB4MDIxNDAxMDIsIDB4NjgxNjA0QzIsIDB4 MDEwMDdDMDAsIDB4MDEwMDQ4MDAsCisJMHhGQjAwMDAwMCwgMHgwMDAwMjhEMSwgMHgxMDAwREMx RiwgMHgxMDAwOEMxRiwgMHgwMjE0MDEwMiwKKwkweDI4MTYwRDA1LCAweDAwMDAwMDA4LCAweDAw MUIyNUE0LCAweDAwQzAwMDE0LCAweDAwQzAwMDE0LAorCTB4MDEwMDAwMTQsIDB4MDEwMDAwMTQs IDB4MDEwMDAwMTQsIDB4MDEwMDAwMTQsIDB4MDBDMDAwMTQsCisJMHgwMTAwMDAxNCwgMHgwMEMw MDAxNCwgMHgwMEMwMDAxNCwgMHgwMEMwMDAxNCwgMHgwMEMwMDAxNCwKKwkweDAwMDAwMDE0LCAw eDAwMDAwMDE0LCAweDAxQzAwMDE0LCAweDAwMDAwMDAzLCAweDAwMDAwMDAwLAorCTB4MDAwMDAz MDAKK30sIHJ0bDgxODhlZV9iYl9hZ2NfdmFsczBbXSA9IHsKKwkweEZCMDAwMDAxLCAweEZCMDEw MDAxLCAweEZCMDIwMDAxLCAweEZCMDMwMDAxLCAweEZCMDQwMDAxLAorCTB4RkIwNTAwMDEsIDB4 RkEwNjAwMDEsIDB4RjkwNzAwMDEsIDB4RjgwODAwMDEsIDB4RjcwOTAwMDEsCisJMHhGNjBBMDAw MSwgMHhGNTBCMDAwMSwgMHhGNDBDMDAwMSwgMHhGMzBEMDAwMSwgMHhGMjBFMDAwMSwKKwkweEYx MEYwMDAxLCAweEYwMTAwMDAxLCAweEVGMTEwMDAxLCAweEVFMTIwMDAxLCAweEVEMTMwMDAxLAor CTB4RUMxNDAwMDEsIDB4RUIxNTAwMDEsIDB4RUExNjAwMDEsIDB4RTkxNzAwMDEsIDB4RTgxODAw MDEsCisJMHhFNzE5MDAwMSwgMHhFNjFBMDAwMSwgMHhFNTFCMDAwMSwgMHhFNDFDMDAwMSwgMHhF MzFEMDAwMSwKKwkweEUyMUUwMDAxLCAweEUxMUYwMDAxLCAweDhBMjAwMDAxLCAweDg5MjEwMDAx LCAweDg4MjIwMDAxLAorCTB4ODcyMzAwMDEsIDB4ODYyNDAwMDEsIDB4ODUyNTAwMDEsIDB4ODQy NjAwMDEsIDB4ODMyNzAwMDEsCisJMHg4MjI4MDAwMSwgMHg2QjI5MDAwMSwgMHg2QTJBMDAwMSwg MHg2OTJCMDAwMSwgMHg2ODJDMDAwMSwKKwkweDY3MkQwMDAxLCAweDY2MkUwMDAxLCAweDY1MkYw MDAxLCAweDY0MzAwMDAxLCAweDYzMzEwMDAxLAorCTB4NjIzMjAwMDEsIDB4NjEzMzAwMDEsIDB4 NDYzNDAwMDEsIDB4NDUzNTAwMDEsIDB4NDQzNjAwMDEsCisJMHg0MzM3MDAwMSwgMHg0MjM4MDAw MSwgMHg0MTM5MDAwMSwgMHg0MDNBMDAwMSwgMHg0MDNCMDAwMSwKKwkweDQwM0MwMDAxLCAweDQw M0QwMDAxLCAweDQwM0UwMDAxLCAweDQwM0YwMDAxLCAweEZCNDAwMDAxLAorCTB4RkI0MTAwMDEs IDB4RkI0MjAwMDEsIDB4RkI0MzAwMDEsIDB4RkI0NDAwMDEsIDB4RkI0NTAwMDEsCisJMHhGQjQ2 MDAwMSwgMHhGQjQ3MDAwMSwgMHhGQjQ4MDAwMSwgMHhGQTQ5MDAwMSwgMHhGOTRBMDAwMSwKKwkw eEY4NEIwMDAxLCAweEY3NEMwMDAxLCAweEY2NEQwMDAxLCAweEY1NEUwMDAxLCAweEY0NEYwMDAx LAorCTB4RjM1MDAwMDEsIDB4RjI1MTAwMDEsIDB4RjE1MjAwMDEsIDB4RjA1MzAwMDEsIDB4RUY1 NDAwMDEsCisJMHhFRTU1MDAwMSwgMHhFRDU2MDAwMSwgMHhFQzU3MDAwMSwgMHhFQjU4MDAwMSwg MHhFQTU5MDAwMSwKKwkweEU5NUEwMDAxLCAweEU4NUIwMDAxLCAweEU3NUMwMDAxLCAweEU2NUQw MDAxLCAweEU1NUUwMDAxLAorCTB4RTQ1RjAwMDEsIDB4RTM2MDAwMDEsIDB4RTI2MTAwMDEsIDB4 QzM2MjAwMDEsIDB4QzI2MzAwMDEsCisJMHhDMTY0MDAwMSwgMHg4QjY1MDAwMSwgMHg4QTY2MDAw MSwgMHg4OTY3MDAwMSwgMHg4ODY4MDAwMSwKKwkweDg3NjkwMDAxLCAweDg2NkEwMDAxLCAweDg1 NkIwMDAxLCAweDg0NkMwMDAxLCAweDY3NkQwMDAxLAorCTB4NjY2RTAwMDEsIDB4NjU2RjAwMDEs IDB4NjQ3MDAwMDEsIDB4NjM3MTAwMDEsIDB4NjI3MjAwMDEsCisJMHg2MTczMDAwMSwgMHg2MDc0 MDAwMSwgMHg0Njc1MDAwMSwgMHg0NTc2MDAwMSwgMHg0NDc3MDAwMSwKKwkweDQzNzgwMDAxLCAw eDQyNzkwMDAxLCAweDQxN0EwMDAxLCAweDQwN0IwMDAxLCAweDQwN0MwMDAxLAorCTB4NDA3RDAw MDEsIDB4NDA3RTAwMDEsIDB4NDA3RjAwMDEKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnR3 bl9iYl9wcm9nIHJ0bDgxODhlZV9iYltdID0geworCXsKKwkJbml0ZW1zKHJ0bDgxODhlZV9iYl9w aHlfcmVnczApLAorCQlydGw4MTg4ZWVfYmJfcGh5X3JlZ3MwLAorCQlydGw4MTg4ZWVfYmJfcGh5 X3ZhbHMwLAorCQl7ICgweDAxIHwgMHgwMikgfSwKKwkJTlVMTAorCX0KK307CisKK3N0YXRpYyBj b25zdCBzdHJ1Y3QgcnR3bl9hZ2NfcHJvZyBydGw4MTg4ZWVfYWdjW10gPSB7CisJeworCQluaXRl bXMocnRsODE4OGVlX2JiX2FnY192YWxzMCksCisJCXJ0bDgxODhlZV9iYl9hZ2NfdmFsczAsCisJ CXsgMCB9LAorCQlOVUxMCisJfQorfTsKKworI2VuZGlmCS8qIFI4OEVFX1BSSVZfSCAqLwpkaWZm IC0tZ2l0IGEvc3lzL2Rldi9ydHduL3J0bDgxODhlL3BjaS9yODhlZV9wd3JzZXEuYyBiL3N5cy9k ZXYvcnR3bi9ydGw4MTg4ZS9wY2kvcjg4ZWVfcHdyc2VxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAuLjAxZDE2ZjZmYzI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2Rl di9ydHduL3J0bDgxODhlL3BjaS9yODhlZV9wd3JzZXEuYwpAQCAtMCwwICsxLDQ0IEBACisvKi0K KyAqIENvcHlyaWdodCAoYykgMjAxOCBGYXJoYW4gS2hhbiA8a2hhbnpmQGdtYWlsLmNvbT4KKyAq CisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlz IHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJl YnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2Ug YW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICog VEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1T IEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElO RyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F U1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQ RUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkg REFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBP UiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VO Q0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09O TkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAq IAorICogJEZyZWVCU0QkCisgKi8KKworI2luY2x1ZGUgPGRldi9ydHduL3J0bDgxODhlL3BjaS9y ODhlZV9wd3JzZXEuaD4KKworaW50IHI4OGVlX3B3cnNlcV9wb2xsaW5nKHN0cnVjdCBydHduX3Nv ZnRjICpzYywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBtc2ssIHVpbnQ4X3QgdmFsdWUpCit7 CisJdWludDhfdCByZWc7CisJdWludDMyX3QgcG9sbGluZzsKKwlmb3IocG9sbGluZz0wO3BvbGxp bmc8NTAwMDtwb2xsaW5nKyspIHsKKwkJcmVnID0gcnR3bl9yZWFkXzEoc2MsIG9mZnNldCk7CisJ CXJlZyAmPSBtc2s7CisJCWlmIChyZWcgPT0gKHZhbHVlICYgbXNrKSkKKwkJCWJyZWFrOworCQll bHNlCisJCQlydHduX2RlbGF5KHNjLCAxMCk7CisJfQorCisJaWYgKHBvbGxpbmcgPiA1MDAwKQor CQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIHZvaWQgcjg4ZWVf cHdyc2VxX2RlbGF5KHN0cnVjdCBydHduX3NvZnRjICpzYywgdWludDMyX3Qgb2Zmc2V0KQorewor CXJ0d25fZGVsYXkoc2MsIG9mZnNldCAqIDEwMDApOworfQorCmRpZmYgLS1naXQgYS9zeXMvZGV2 L3J0d24vcnRsODE4OGUvcGNpL3I4OGVlX3B3cnNlcS5oIGIvc3lzL2Rldi9ydHduL3J0bDgxODhl L3BjaS9yODhlZV9wd3JzZXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MC4uNGE5MjAzMzc2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZGV2L3J0d24vcnRsODE4OGUv cGNpL3I4OGVlX3B3cnNlcS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qLQorICogQ29weXJpZ2h0IChj KSAyMDE4IEZhcmhhbiBLaGFuIDxraGFuemZAZ21haWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24g dG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFu eQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92 aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNz aW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMg UFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMK KyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdB UlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQg U0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJ TkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFU U09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRI RVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JU SU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhF IFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICogCisgKiAkRnJlZUJTRCQK KyAqLworCisjaWZuZGVmIFJUTDg4RUVfUFdSU0VRX0gKKyNkZWZpbmUgUlRMODhFRV9QV1JTRVFf SAorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2xvY2suaD4KKyNpbmNs dWRlIDxzeXMvbXV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvbWJ1Zi5oPgorI2luY2x1ZGUgPHN5cy9r ZXJuZWwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N5c3RtLmg+ CisjaW5jbHVkZSA8c3lzL21hbGxvYy5oPgorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2luY2x1 ZGUgPHN5cy90YXNrcXVldWUuaD4KKyNpbmNsdWRlIDxzeXMvYnVzLmg+CisjaW5jbHVkZSA8c3lz L2VuZGlhbi5oPgorCisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX3Zhci5o PgorI2luY2x1ZGUgPG5ldC9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPG5ldC9pZl9tZWRpYS5oPgor CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Zhci5oPgorI2luY2x1ZGUgPG5ldDgwMjEx L2llZWU4MDIxMV9yYWRpb3RhcC5oPgorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9yYXRl Y3RsLmg+CisjaWZkZWYgIElFRUU4MDIxMV9TVVBQT1JUX1NVUEVSRworI2luY2x1ZGUgPG5ldDgw MjExL2llZWU4MDIxMV9zdXBlcmcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGV2L3J0d24vaWZf cnR3bnJlZy5oPgorI2luY2x1ZGUgPGRldi9ydHduL2lmX3J0d252YXIuaD4KKworaW50IHI4OGVl X3B3cnNlcV9wb2xsaW5nKHN0cnVjdCBydHduX3NvZnRjICpzYywgdWludDMyX3Qgb2Zmc2V0LCB1 aW50MzJfdCBtc2ssIHVpbnQ4X3QgdmFsdWUpOworaW5saW5lIHZvaWQgcjg4ZWVfcHdyc2VxX2Rl bGF5KHN0cnVjdCBydHduX3NvZnRjICpzYywgdWludDMyX3Qgb2Zmc2V0KTsKKworI2VuZGlmCmRp ZmYgLS1naXQgYS9zeXMvZGV2L3J0d24vcnRsODE4OGUvcGNpL3I4OGVlX3JlZy5oIGIvc3lzL2Rl di9ydHduL3J0bDgxODhlL3BjaS9yODhlZV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMC4uZDU4NWY2Mjg0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZGV2L3J0 d24vcnRsODE4OGUvcGNpL3I4OGVlX3JlZy5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgkkT3BlbkJT RDogaWZfcnR3bnJlZy5oLHYgMS4zIDIwMTUvMDYvMTQgMDg6MDI6NDcgc3RzcCBFeHAgJAkqLwor CisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAxMCBEYW1pZW4gQmVyZ2FtaW5pIDxkYW1pZW4uYmVy Z2FtaW5pQGZyZWUuZnI+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgU3RlZmFuIFNwZXJsaW5nIDxz dHNwQG9wZW5ic2Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDE2IEFuZHJpeSBWb3Nrb2JvaW55 ayA8YXZvc0BGcmVlQlNELm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxOCBGYXJoYW4gS2hhbiA8 a2hhbnpmQGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5 LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBv ciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUK KyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGlu IGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5E IFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBU SElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJD SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUg TElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVF TlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJP TSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04g T0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5H IE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0Ug T0YgVEhJUyBTT0ZUV0FSRS4KKyAqIAorICogJEZyZWVCU0QkCisgKi8KKworI2lmbmRlZiBSODhF RUVfUkVHX0gKKyNkZWZpbmUgUjg4RUVFX1JFR19ICisKKyNpbmNsdWRlIDxkZXYvcnR3bi9ydGw4 MTkyYy9yOTJjX3JlZy5oPgorCisjZGVmaW5lIFI4OEVFX01BWF9DSEFJTlMJCTQKKworLyoKKyAq IE1BQyByZWdpc3RlcnMuCisgKi8KKy8qIFN5c3RlbSBDb25maWd1cmF0aW9uLiAqLworI2RlZmlu ZSBSODhFRV9QQ0lFX01JT19JTlRGCQkweDBlNAorI2RlZmluZSBSODhFRV9QQ0lFX01JT19JTlRE CQkweDBlOAorLyogUENJZSBDb25maWd1cmF0aW9uLiAqLworI2RlZmluZSBSODhFRV9QQ0lFX0NU UkxfUkVHCQkweDMwMAorI2RlZmluZSBSODhFRV9JTlRfTUlHCQkJMHgzMDQKKyNkZWZpbmUgUjg4 RUVfQkNOUV9ERVNBCQkJMHgzMDgKKyNkZWZpbmUgUjg4RUVfSFFfREVTQQkJCTB4MzEwCisjZGVm aW5lIFI4OEVFX01HUV9ERVNBCQkJMHgzMTgKKyNkZWZpbmUgUjg4RUVfVk9RX0RFU0EJCQkweDMy MAorI2RlZmluZSBSODhFRV9WSVFfREVTQQkJCTB4MzI4CisjZGVmaW5lIFI4OEVFX0JFUV9ERVNB CQkJMHgzMzAKKyNkZWZpbmUgUjg4RUVfQktRX0RFU0EJCQkweDMzOAorI2RlZmluZSBSODhFRV9S WF9ERVNBCQkJMHgzNDAKKyNkZWZpbmUgUjg4RUVfREJJCQkJMHgzNDgKKyNkZWZpbmUgUjg4RUVf TURJTwkJCTB4MzU0CisjZGVmaW5lIFI4OEVFX0RCR19TRUwJCQkweDM2MAorI2RlZmluZSBSODhF RV9QQ0lFX0hSUFdNCQkJMHgzNjEKKyNkZWZpbmUgUjg4RUVfUENJRV9IQ1BXTQkJCTB4MzYzCisj ZGVmaW5lIFI4OEVFX1VBUlRfQ1RSTAkJCTB4MzY0CisjZGVmaW5lIFI4OEVFX1VBUlRfVFhfREVT CQkweDM3MAorI2RlZmluZSBSODhFRV9VQVJUX1JYX0RFUwkJMHgzNzgKKworLyogRURDQSBSZWdp c3RlcnMgKi8KKyNkZWZpbmUgUjg4RUVfU0lGU19DVFgJCQkweDA1MTQKKyNkZWZpbmUgUjg4RUVf U0lGU19UUlgJCQkweDA1MTYKKyNkZWZpbmUgUjg4RUVfU0lGU19TUEVDCQkJMHgwNDI4CisjZGVm aW5lIFI4OEVFX1NJRlNfU1BFQ19NQUMJCTB4MDYzQQorI2RlZmluZSBSODhFRV9TSUZTX1JFU1Bf T0ZETQkJMHgwNjNFCisKKy8qIEJpdHMgZm9yIFI4OEVFX0dQSU9fTVVYQ0ZHLiAqLworI2RlZmlu ZSBSODhFRV9HUElPX01VWENGR19SRktJTEwJCTB4MDAwOAorCisvKiBCaXRzIGZvciBSODhFRV9H UElPX0lPX1NFTC4gKi8KKyNkZWZpbmUgUjg4RUVfR1BJT19JT19TRUxfMiAgICAgICAgICAgICAg ICAgICAgIDB4MDA2MgorI2RlZmluZSBSODhFRV9HUElPX0lPX1NFTF9SRktJTEwJCTB4MDAwOAor CisvKiBCaXRzIGZvciBSODhFRV9MRURDRkcyLiAqLworI2RlZmluZSBSODhFRV9MRURDRkcyX0VO CQkJMHg2MAorI2RlZmluZSBSODhFRV9MRURDRkcyX0RJUwkJCTB4NjgKKworLyogQml0cyBmb3Ig Ujg4RUVfSElNUi4gKi8KKyNkZWZpbmUgUjg4RUVfSU1SX1JPSwkJMHgwMDAwMDAwMQkvKiByZWNl aXZlIERNQSBPSyAqLworI2RlZmluZSBSODhFRV9JTVJfVk9ET0sJCTB4MDAwMDAwMDIJLyogQUNf Vk8gRE1BIE9LICovCisjZGVmaW5lIFI4OEVFX0lNUl9WSURPSwkJMHgwMDAwMDAwNAkvKiBBQ19W SSBETUEgT0sgKi8KKyNkZWZpbmUgUjg4RUVfSU1SX0JFRE9LCQkweDAwMDAwMDA4CS8qIEFDX0JF IERNQSBPSyAqLworI2RlZmluZSBSODhFRV9JTVJfQktET0sJCTB4MDAwMDAwMTAJLyogQUNfQksg RE1BIE9LICovCisjZGVmaW5lIFI4OEVFX0lNUl9UWEJERVIJMHgwMDAwMDAyMAkvKiBiZWFjb24g dHJhbnNtaXQgZXJyb3IgKi8KKyNkZWZpbmUgUjg4RUVfSU1SX01HTlRET0sJMHgwMDAwMDA0MAkv KiBtYW5hZ2VtZW50IHF1ZXVlIERNQSBPSyAqLworI2RlZmluZSBSODhFRV9JTVJfVEJET0sJCTB4 MDAwMDAwODAJLyogYmVhY29uIHRyYW5zbWl0IE9LICovCisjZGVmaW5lIFI4OEVFX0lNUl9ISUdI RE9LCTB4MDAwMDAxMDAJLyogaGlnaCBxdWV1ZSBETUEgT0sgKi8KKyNkZWZpbmUgUjg4RUVfSU1S X0JET0sJCTB4MDAwMDAyMDAJLyogYmVhY29uIHF1ZXVlIERNQSBPSyAqLworI2RlZmluZSBSODhF RV9JTVJfQVRJTUVORAkweDAwMDAwNDAwCS8qIEFUSU0gd2luZG93IGVuZCBpbnRlcnJ1cHQgKi8K KyNkZWZpbmUgUjg4RUVfSU1SX1JEVQkJMHgwMDAwMDgwMAkvKiBSeCBkZXNjcmlwdG9yIHVuYXZh aWxhYmxlICovCisjZGVmaW5lIFI4OEVFX0lNUl9SWEZPVlcJMHgwMDAwMTAwMAkvKiByZWNlaXZl IEZJRk8gb3ZlcmZsb3cgKi8KKyNkZWZpbmUgUjg4RUVfSU1SX0JDTklOVAkweDAwMDAyMDAwCS8q IGJlYWNvbiBETUEgaW50ZXJydXB0IDAgKi8KKyNkZWZpbmUgUjg4RUVfSU1SX1BTVElNRU9VVAkw eDAwMDA0MDAwCS8qIHBvd2Vyc2F2ZSB0aW1lb3V0ICovCisjZGVmaW5lIFI4OEVFX0lNUl9UWEZP VlcJMHgwMDAwODAwMAkvKiB0cmFuc21pdCBGSUZPIG92ZXJmbG93ICovCisjZGVmaW5lIFI4OEVF X0lNUl9USU1FT1VUMQkweDAwMDEwMDAwCS8qIHRpbWVvdXQgaW50ZXJydXB0IDEgKi8KKyNkZWZp bmUgUjg4RUVfSU1SX1RJTUVPVVQyCTB4MDAwMjAwMDAJLyogdGltZW91dCBpbnRlcnJ1cHQgMiAq LworI2RlZmluZSBSODhFRV9JTVJfQkNORE9LMQkweDAwMDQwMDAwCS8qIGJlYWNvbiBxdWV1ZSBE TUEgT0sgKDEpICovCisjZGVmaW5lIFI4OEVFX0lNUl9CQ05ET0syCTB4MDAwODAwMDAJLyogYmVh Y29uIHF1ZXVlIERNQSBPSyAoMikgKi8KKyNkZWZpbmUgUjg4RUVfSU1SX0JDTkRPSzMJMHgwMDEw MDAwMAkvKiBiZWFjb24gcXVldWUgRE1BIE9LICgzKSAqLworI2RlZmluZSBSODhFRV9JTVJfQkNO RE9LNAkweDAwMjAwMDAwCS8qIGJlYWNvbiBxdWV1ZSBETUEgT0sgKDQpICovCisjZGVmaW5lIFI4 OEVFX0lNUl9CQ05ET0s1CTB4MDA0MDAwMDAJLyogYmVhY29uIHF1ZXVlIERNQSBPSyAoNSkgKi8K KyNkZWZpbmUgUjg4RUVfSU1SX0JDTkRPSzYJMHgwMDgwMDAwMAkvKiBiZWFjb24gcXVldWUgRE1B IE9LICg2KSAqLworI2RlZmluZSBSODhFRV9JTVJfQkNORE9LNwkweDAxMDAwMDAwCS8qIGJlYWNv biBxdWV1ZSBETUEgT0sgKDcpICovCisjZGVmaW5lIFI4OEVFX0lNUl9CQ05ET0s4CTB4MDIwMDAw MDAJLyogYmVhY29uIHF1ZXVlIERNQSBPSyAoOCkgKi8KKyNkZWZpbmUgUjg4RUVfSU1SX0JDTkRN QUlOVDEJMHgwNDAwMDAwMAkvKiBiZWFjb24gRE1BIGludGVycnVwdCAxICovCisjZGVmaW5lIFI4 OEVFX0lNUl9CQ05ETUFJTlQyCTB4MDgwMDAwMDAJLyogYmVhY29uIERNQSBpbnRlcnJ1cHQgMiAq LworI2RlZmluZSBSODhFRV9JTVJfQkNORE1BSU5UMwkweDEwMDAwMDAwCS8qIGJlYWNvbiBETUEg aW50ZXJydXB0IDMgKi8KKyNkZWZpbmUgUjg4RUVfSU1SX0JDTkRNQUlOVDQJMHgyMDAwMDAwMAkv KiBiZWFjb24gRE1BIGludGVycnVwdCA0ICovCisjZGVmaW5lIFI4OEVFX0lNUl9CQ05ETUFJTlQ1 CTB4NDAwMDAwMDAJLyogYmVhY29uIERNQSBpbnRlcnJ1cHQgNSAqLworI2RlZmluZSBSODhFRV9J TVJfQkNORE1BSU5UNgkweDgwMDAwMDAwCS8qIGJlYWNvbiBETUEgaW50ZXJydXB0IDYgKi8KKyNk ZWZpbmUgUjg4RUVfSElNUgkJMHhiMAorI2RlZmluZSBSODhFRV9JU1IJCTB4YjQKKyNkZWZpbmUg Ujg4RUVfSElNUkUJCTB4YjgKKyNkZWZpbmUgUjg4RUVfSElTUkUJCTB4YmMKKworLyogU2hvcnRj dXQuICovCisjZGVmaW5lIFI4OEVFX0lCU1NfSU5UX01BU0sJXAorCShSODhFRV9JTVJfQkNOSU5U IHwgUjg4RUVfSU1SX1RCRE9LIHwgUjg4RUVfSU1SX1RCREVSKQorCisvKiBQb3dlciBPbi9PZmYg RE1BICovCisjZGVmaW5lIFI4OEVFX1JYRE1BX0NPTlRST0wgICAgIDB4MDI4NgorI2RlZmluZQlS ODhFRV9UUlhETUFfQ1RSTCAgICAgICAweDAxMEMKKworI2VuZGlmCS8qIFI5OUVFX1JFR19IICov CmRpZmYgLS1naXQgYS9zeXMvZGV2L3J0d24vcnRsODE4OGUvcGNpL3I4OGVlX3JmLmMgYi9zeXMv ZGV2L3J0d24vcnRsODE4OGUvcGNpL3I4OGVlX3JmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAuLjNmNGUyZTNkNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2Rldi9y dHduL3J0bDgxODhlL3BjaS9yODhlZV9yZi5jCkBAIC0wLDAgKzEsMTA2IEBACisvKi0KKyAqIENv cHlyaWdodCAoYykgMjAxNyBGYXJoYW4gS2hhbiA8a2hhbnpmQGdtYWlsLmNvbT4KKyAqCisgKiBQ ZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3 YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3Jh bnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRo aXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNP RlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBX QVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwg SU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElO IE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUws IERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdF UworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9G SVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Ig T1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElP TiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisj aW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRl ICJvcHRfd2xhbi5oIgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2xv Y2suaD4KKyNpbmNsdWRlIDxzeXMvbXV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvbWJ1Zi5oPgorI2lu Y2x1ZGUgPHN5cy9rZXJuZWwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8 c3lzL3N5c3RtLmg+CisjaW5jbHVkZSA8c3lzL21hbGxvYy5oPgorI2luY2x1ZGUgPHN5cy9xdWV1 ZS5oPgorI2luY2x1ZGUgPHN5cy90YXNrcXVldWUuaD4KKyNpbmNsdWRlIDxzeXMvYnVzLmg+Cisj aW5jbHVkZSA8c3lzL2VuZGlhbi5oPgorI2luY2x1ZGUgPHN5cy9saW5rZXIuaD4KKworI2luY2x1 ZGUgPG1hY2hpbmUvYnVzLmg+CisjaW5jbHVkZSA8bWFjaGluZS9yZXNvdXJjZS5oPgorI2luY2x1 ZGUgPHN5cy9ybWFuLmg+CisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQvZXRo ZXJuZXQuaD4KKyNpbmNsdWRlIDxuZXQvaWZfbWVkaWEuaD4KKworI2luY2x1ZGUgPG5ldDgwMjEx L2llZWU4MDIxMV92YXIuaD4KKyNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfcmFkaW90YXAu aD4KKworI2luY2x1ZGUgPGRldi9ydHduL2lmX3J0d252YXIuaD4KKyNpbmNsdWRlIDxkZXYvcnR3 bi9pZl9ydHduX2RlYnVnLmg+CisKKyNpbmNsdWRlIDxkZXYvcnR3bi9ydGw4MTg4ZS9yODhlLmg+ CisjaW5jbHVkZSA8ZGV2L3J0d24vcnRsODE4OGUvcjg4ZV9yZWcuaD4KKyNpbmNsdWRlIDxkZXYv cnR3bi9wY2kvcnR3bl9wY2lfdmFyLmg+CisKKyNpbmNsdWRlIDxkZXYvcnR3bi9ydGw4MTkyYy9y OTJjX3Zhci5oPgorI2luY2x1ZGUgPGRldi9ydHduL3J0bDgxODhlL3BjaS9yODhlZS5oPgorI2lu Y2x1ZGUgPGRldi9ydHduL3J0bDgxOTJjL3BjaS9yOTJjZV9yZWcuaD4KKyNpbmNsdWRlIDxkZXYv cnR3bi9ydGw4MTg4ZS9wY2kvcjg4ZWVfcmVnLmg+CisKKyNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVl ODAyMTFfdmFyLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhZGlvdGFwLmg+CisK KyNpbmNsdWRlIDxkZXYvcnR3bi9pZl9ydHducmVnLmg+CisjaW5jbHVkZSA8ZGV2L3J0d24vaWZf cnR3bnZhci5oPgorI2luY2x1ZGUgPGRldi9ydHduL2lmX3J0d25fZGVidWcuaD4KKworI2luY2x1 ZGUgPGRldi9ydHduL3BjaS9ydHduX3BjaV92YXIuaD4KKwordWludDMyX3QKK3I4OGVlX3JmX3Jl YWQoc3RydWN0IHJ0d25fc29mdGMgKnNjLCBpbnQgY2hhaW4sIHVpbnQ4X3QgYWRkcikKK3sKKwlz dHJ1Y3QgcjkyY19zb2Z0YyAqcnMgPSBzYy0+c2NfcHJpdjsKKwl1aW50MzJfdCByZWdbUjg4RUVf TUFYX0NIQUlOU10sIHZhbDsKKworCXJlZ1swXSA9IHJ0d25fYmJfcmVhZChzYywgUjkyQ19IU1NJ X1BBUkFNMigwKSk7CisKKwlpZiAoY2hhaW4gIT0gMCkKKwkJcmVnW2NoYWluXSA9IHJ0d25fYmJf cmVhZChzYywgUjkyQ19IU1NJX1BBUkFNMihjaGFpbikpOworCWVsc2UKKwkJcmVnW2NoYWluXSA9 IHJlZ1swXTsKKworCisJcnR3bl9iYl93cml0ZShzYywgUjkyQ19IU1NJX1BBUkFNMigwKSwKKwkJ cmVnWzBdICYgflI5MkNfSFNTSV9QQVJBTTJfUkVBRF9FREdFKTsKKwlydHduX2RlbGF5KHNjLCBy cy0+cmZfcmVhZF9kZWxheVsxXSk7CisKKwlydHduX2JiX3dyaXRlKHNjLCBSOTJDX0hTU0lfUEFS QU0yKGNoYWluKSwKKwkJKHJlZ1tjaGFpbl0gJiAoflI5MkNfSFNTSV9QQVJBTTJfUkVBRF9BRERS X00pKSB8CisJCShhZGRyIDw8IDIzKSB8IFI5MkNfSFNTSV9QQVJBTTJfUkVBRF9FREdFKTsKKwly dHduX2RlbGF5KHNjLCBycy0+cmZfcmVhZF9kZWxheVsyXSk7CisKKwlpZiAocnR3bl9iYl9yZWFk KHNjLCBSOTJDX0hTU0lfUEFSQU0xKGNoYWluKSkgJiBSOTJDX0hTU0lfUEFSQU0xX1BJKQorCQl2 YWwgPSBydHduX2JiX3JlYWQoc2MsIFI5MkNfSFNQSV9SRUFEQkFDSyhjaGFpbikpOworCWVsc2UK KwkJdmFsID0gcnR3bl9iYl9yZWFkKHNjLCBSOTJDX0xTU0lfUkVBREJBQ0soY2hhaW4pKTsKKwor CXJldHVybiB2YWw7Cit9CisKK3ZvaWQKK3I4OGVlX3JmX3dyaXRlKHN0cnVjdCBydHduX3NvZnRj ICpzYywgaW50IGNoYWluLCB1aW50OF90IGFkZHIsCisJdWludDMyX3QgdmFsKQoreworCXJ0d25f YmJfd3JpdGUoc2MsIFI5MkNfTFNTSV9QQVJBTShjaGFpbiksCisJCSgoYWRkciA8PCBSOTJDX0xT U0lfUEFSQU1fQUREUl9TKSB8CisJCSh2YWwgJiBSOTJDX0xTU0lfUEFSQU1fREFUQV9NKSkgJiAw eDBmZmZmZmZmKTsKK30KZGlmZiAtLWdpdCBhL3N5cy9kZXYvcnR3bi9ydGw4MTg4ZS9wY2kvcjg4 ZWVfcnguYyBiL3N5cy9kZXYvcnR3bi9ydGw4MTg4ZS9wY2kvcjg4ZWVfcnguYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMDljNTY2ZDM3YTIKLS0tIC9kZXYvbnVsbAor KysgYi9zeXMvZGV2L3J0d24vcnRsODE4OGUvcGNpL3I4OGVlX3J4LmMKQEAgLTAsMCArMSwxMzkg QEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDE3IEZhcmhhbiBLaGFuIDxraGFuemZAZ21haWwu Y29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmli dXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVl IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0 IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4K KyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBE SVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUg SU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBB TkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisg KiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT IE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNF LCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwg TkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBP UiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRX QVJFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJlZUJTRCQi KTsKKworI2luY2x1ZGUgIm9wdF93bGFuLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNp bmNsdWRlIDxzeXMvbG9jay5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgorI2luY2x1ZGUgPHN5 cy9tYnVmLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQu aD4KKyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KKyNpbmNsdWRlIDxzeXMvbWFsbG9jLmg+CisjaW5j bHVkZSA8c3lzL3F1ZXVlLmg+CisjaW5jbHVkZSA8c3lzL3Rhc2txdWV1ZS5oPgorI2luY2x1ZGUg PHN5cy9idXMuaD4KKyNpbmNsdWRlIDxzeXMvZW5kaWFuLmg+CisjaW5jbHVkZSA8c3lzL2xpbmtl ci5oPgorCisjaW5jbHVkZSA8bWFjaGluZS9idXMuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3Jlc291 cmNlLmg+CisjaW5jbHVkZSA8c3lzL3JtYW4uaD4KKworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2lu Y2x1ZGUgPG5ldC9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPG5ldC9pZl9tZWRpYS5oPgorCisjaW5j bHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Zhci5oPgorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4 MDIxMV9yYWRpb3RhcC5oPgorCisjaW5jbHVkZSA8ZGV2L3J0d24vaWZfcnR3bnZhci5oPgorI2lu Y2x1ZGUgPGRldi9ydHduL2lmX3J0d25fZGVidWcuaD4KKworI2luY2x1ZGUgPGRldi9ydHduL3J0 bDgxODhlL3I4OGUuaD4KKyNpbmNsdWRlIDxkZXYvcnR3bi9ydGw4MTg4ZS9yODhlX3JlZy5oPgor I2luY2x1ZGUgPGRldi9ydHduL3BjaS9ydHduX3BjaV92YXIuaD4KKworI2luY2x1ZGUgPGRldi9y dHduL3J0bDgxODhlL3BjaS9yODhlZS5oPgorI2luY2x1ZGUgPGRldi9ydHduL3J0bDgxOTJjL3Bj aS9yOTJjZV9yZWcuaD4KKyNpbmNsdWRlIDxkZXYvcnR3bi9ydGw4MTg4ZS9wY2kvcjg4ZWVfcmVn Lmg+CisKK2ludAorcjg4ZWVfY2xhc3NpZnlfaW50cihzdHJ1Y3QgcnR3bl9zb2Z0YyAqc2MsIHZv aWQgKmFyZywgaW50IGxlbiBfX3VudXNlZCkKK3sKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMy X3Qgc3RhdHVzYjsKKwlpbnQgKnJpbmdzID0gYXJnOworCWludCByZXQ7CisKKwkqcmluZ3MgPSAw OworCisJcnR3bl93cml0ZV80KHNjLCBSODhFRV9ISU1SLCAweDApOworCXJ0d25fd3JpdGVfNChz YywgUjg4RUVfSElNUkUsIDB4MCk7CisKKwlzdGF0dXMgPSBydHduX3JlYWRfNChzYywgUjg4RUVf SVNSKSAmIDB4MjAwMDg0ZmY7CisJcnR3bl93cml0ZV80KHNjLCBSODhFRV9JU1IsIHN0YXR1cyk7 CisJc3RhdHVzYiA9IHJ0d25fcmVhZF80KHNjLCBSODhFRV9ISVNSRSkgJiAweDEwMDsKKwlydHdu X3dyaXRlXzQoc2MsIFI4OEVFX0hJU1JFLCBzdGF0dXNiKTsKKworCWlmICghc3RhdHVzIHx8IHN0 YXR1c2IgPT0gMHhmZmZmKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIEFjayBpbnRlcnJ1cHRz LiAqLworCWlmIChzdGF0dXNiICYgUjkyQ19JTVJfQkRPSykKKwkJKnJpbmdzIHw9ICgxIDw8IFJU V05fUENJX0JFQUNPTl9RVUVVRSk7CisJaWYgKHN0YXR1c2IgJiBSOTJDX0lNUl9ISUdIRE9LKQor CQkqcmluZ3MgfD0gKDEgPDwgUlRXTl9QQ0lfSElHSF9RVUVVRSk7CisJaWYgKHN0YXR1c2IgJiBS OTJDX0lNUl9NR05URE9LKQorCQkqcmluZ3MgfD0gKDEgPDwgUlRXTl9QQ0lfTUdOVF9RVUVVRSk7 CisJaWYgKHN0YXR1c2IgJiBSOTJDX0lNUl9CS0RPSykKKwkJKnJpbmdzIHw9ICgxIDw8IFJUV05f UENJX0JLX1FVRVVFKTsKKwlpZiAoc3RhdHVzYiAmIFI5MkNfSU1SX0JFRE9LKQorCQkqcmluZ3Mg fD0gKDEgPDwgUlRXTl9QQ0lfQkVfUVVFVUUpOworCWlmIChzdGF0dXNiICYgUjkyQ19JTVJfVklE T0spCisJCSpyaW5ncyB8PSAoMSA8PCBSVFdOX1BDSV9WSV9RVUVVRSk7CisJaWYgKHN0YXR1c2Ig JiBSOTJDX0lNUl9WT0RPSykKKwkJKnJpbmdzIHw9ICgxIDw8IFJUV05fUENJX1ZPX1FVRVVFKTsK KworCXJldCA9IDA7CisJaWYgKHN0YXR1cyAmIFI5MkNfSU1SX1JYRk9WVykKKwkJcmV0IHw9IFJU V05fUENJX0lOVFJfUlhfT1ZFUkZMT1c7CisJaWYgKHN0YXR1cyAmIFI5MkNfSU1SX1JEVSkKKwkJ cmV0IHw9IFJUV05fUENJX0lOVFJfUlhfREVTQ19VTkFWQUlMOworCWlmIChzdGF0dXMgJiBSOTJD X0lNUl9ST0spCisJCXJldCB8PSBSVFdOX1BDSV9JTlRSX1JYX0RPTkU7CisJaWYgKHN0YXR1cyAm IFI5MkNfSU1SX1RYRk9WVykKKwkJcmV0IHw9IFJUV05fUENJX0lOVFJfVFhfT1ZFUkZMT1c7CisJ aWYgKHN0YXR1cyAmIFI5MkNfSU1SX1BTVElNRU9VVCkKKwkJcmV0IHw9IFJUV05fUENJX0lOVFJf UFNfVElNRU9VVDsKKworCXJldHVybiAocmV0KTsKK30KKwordm9pZAorcjg4ZWVfZW5hYmxlX2lu dHIoc3RydWN0IHJ0d25fcGNpX3NvZnRjICpwYykKK3sKKwlzdHJ1Y3QgcnR3bl9zb2Z0YyAqc2Mg PSAmcGMtPnBjX3NjOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwlydHduX3dyaXRlXzQo c2MsIFI4OEVFX0hJTVIsIDB4MjAwMDg0ZmYpOworCXJ0d25fd3JpdGVfNChzYywgUjg4RUVfSElN UkUsIDB4MTAwKTsKKworICAgICAgICAvKiB0aGVyZSBhcmUgc29tZSBDMkggQ01EcyBoYXZlIGJl ZW4gc2VudAorICAgICAgICAgKiBiZWZvcmUgc3lzdGVtIGludGVycnVwdCBpcyBlbmFibGVkLCBl LmcuLCBDMkgsIENQV00uCisgICAgICAgICAqIFNvIHdlIG5lZWQgdG8gY2xlYXIgYWxsIEMySCBl dmVudHMgdGhhdCBGVyBoYXMgbm90aWZpZWQsCisgICAgICAgICAqIG90aGVyd2lzZSBGVyB3b24n dCBzY2hlZHVsZSBhbnkgY29tbWFuZHMgYW55bW9yZS4KKyAgICAgICAgICovCisJcnR3bl93cml0 ZV8xKHNjLCAweDAxQUYsIDApOworICAgICAgICAvKmVuYWJsZSBzeXN0ZW0gaW50ZXJydXB0Ki8K KwlydHduX3dyaXRlXzQoc2MsIDB4MDA1OCwgMHhDMCk7Cit9CisKK3ZvaWQKK3I4OGVlX3N0YXJ0 X3hmZXJzKHN0cnVjdCBydHduX3NvZnRjICpzYykKK3sKKwlydHduX3dyaXRlXzQoc2MsIDB4MDBC MCwgMHgyMDAwODRmZik7CisJcnR3bl93cml0ZV80KHNjLCAweDAwQjgsIDB4MTAwKTsKKwlydHdu X3dyaXRlXzEoc2MsIDB4MDFBRiwgMHgwKTsKKwlydHduX3dyaXRlXzQoc2MsIDB4MDA1OCwgMHhj MCk7Cit9CisKKyN1bmRlZiBSODhFRV9JTlRfRU5BQkxFCmRpZmYgLS1naXQgYS9zeXMvZGV2L3J0 d24vcnRsODE4OGUvcGNpL3I4OGVlX3R4LmMgYi9zeXMvZGV2L3J0d24vcnRsODE4OGUvcGNpL3I4 OGVlX3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjYyZjA1NWFl Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2Rldi9ydHduL3J0bDgxODhlL3BjaS9yODhlZV90 eC5jCkBAIC0wLDAgKzEsMTExIEBACisvKgkkT3BlbkJTRDogaWZfcnR3bi5jLHYgMS42IDIwMTUv MDgvMjggMDA6MDM6NTMgZGVyYWFkdCBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykg MjAxMCBEYW1pZW4gQmVyZ2FtaW5pIDxkYW1pZW4uYmVyZ2FtaW5pQGZyZWUuZnI+CisgKiBDb3B5 cmlnaHQgKGMpIDIwMTUgU3RlZmFuIFNwZXJsaW5nIDxzdHNwQG9wZW5ic2Qub3JnPgorICogQ29w eXJpZ2h0IChjKSAyMDE2IEFuZHJpeSBWb3Nrb2JvaW55ayA8YXZvc0BGcmVlQlNELm9yZz4KKyAq IENvcHlyaWdodCAoYykgMjAxOCBGYXJoYW4gS2hhbiA8a2hhbnpmQGdtYWlsLmNvbT4KKyAqCisg KiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNv ZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkg Z3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5k IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhF IFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFM TCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBB TEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mu IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJ QUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFN QUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQ Uk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0Ug T1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVD VElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLwor CisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNs dWRlICJvcHRfd2xhbi5oIgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lz L2xvY2suaD4KKyNpbmNsdWRlIDxzeXMvbXV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvbWJ1Zi5oPgor I2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVk ZSA8c3lzL3N5c3RtLmg+CisjaW5jbHVkZSA8c3lzL21hbGxvYy5oPgorI2luY2x1ZGUgPHN5cy9x dWV1ZS5oPgorI2luY2x1ZGUgPHN5cy90YXNrcXVldWUuaD4KKyNpbmNsdWRlIDxzeXMvYnVzLmg+ CisjaW5jbHVkZSA8c3lzL2VuZGlhbi5oPgorI2luY2x1ZGUgPHN5cy9saW5rZXIuaD4KKworI2lu Y2x1ZGUgPG1hY2hpbmUvYnVzLmg+CisjaW5jbHVkZSA8bWFjaGluZS9yZXNvdXJjZS5oPgorI2lu Y2x1ZGUgPHN5cy9ybWFuLmg+CisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQv ZXRoZXJuZXQuaD4KKyNpbmNsdWRlIDxuZXQvaWZfbWVkaWEuaD4KKworI2luY2x1ZGUgPG5ldDgw MjExL2llZWU4MDIxMV92YXIuaD4KKyNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfcmFkaW90 YXAuaD4KKworI2luY2x1ZGUgPGRldi9ydHduL2lmX3J0d252YXIuaD4KKyNpbmNsdWRlIDxkZXYv cnR3bi9pZl9ydHduX2RlYnVnLmg+CisKKyNpbmNsdWRlIDxkZXYvcnR3bi9wY2kvcnR3bl9wY2lf dmFyLmg+CisKKyNpbmNsdWRlIDxkZXYvcnR3bi9ydGw4MTg4ZS9wY2kvcjg4ZWUuaD4KKyNpbmNs dWRlIDxkZXYvcnR3bi9ydGw4MTg4ZS9wY2kvcjg4ZWVfdHhfZGVzYy5oPgorCisKK3ZvaWQKK3I4 OGVlX3NldHVwX3R4X2Rlc2Moc3RydWN0IHJ0d25fcGNpX3NvZnRjICpwYywgdm9pZCAqZGVzYywK KyAgICB1aW50MzJfdCBuZXh0X2Rlc2NfYWRkcikKK3sKKwlzdHJ1Y3Qgcjg4ZWVfdHhfZGVzYyAq dHhkID0gZGVzYzsKKworCS8qIHNldHVwIHR4IGRlc2MgKi8KKwl0eGQtPm5leHRkZXNjYWRkciA9 IGh0b2xlMzIobmV4dF9kZXNjX2FkZHIpOworfQorCit2b2lkCityODhlZV90eF9wb3N0c2V0dXAo c3RydWN0IHJ0d25fcGNpX3NvZnRjICpwYywgdm9pZCAqZGVzYywKKyAgICBidXNfZG1hX3NlZ21l bnRfdCBzZWdzW10pCit7CisJLyogTm90IGltcGxlbWVudGVkICovCit9CisKK3ZvaWQKK3I4OGVl X2NvcHlfdHhfZGVzYyh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMpCit7CisJc3RydWN0IHI4 OGVlX3R4X2Rlc2MgKnR4ZCA9IGRlc3Q7CisJc2l6ZV90IGxlbiA9IHNpemVvZihzdHJ1Y3Qgcjky Y190eF9kZXNjKSArCisJICAgIHNpemVvZih0eGQtPnR4YnVmc2l6ZSkgKyBzaXplb2YodHhkLT5w YWQpOworCisJaWYgKHNyYyAhPSBOVUxMKQorCQltZW1jcHkoZGVzdCwgc3JjLCBsZW4pOworCWVs c2UKKwkJbWVtc2V0KGRlc3QsIDAsIGxlbik7Cit9CisKK3ZvaWQKK3I4OGVlX2R1bXBfdHhfZGVz YyhzdHJ1Y3QgcnR3bl9zb2Z0YyAqc2MsIGNvbnN0IHZvaWQgKmRlc2MpCit7CisjaWZkZWYgUlRX Tl9ERUJVRworCWNvbnN0IHN0cnVjdCByODhlZV90eF9kZXNjICp0eGQgPSBkZXNjOworCisJUlRX Tl9EUFJJTlRGKHNjLCBSVFdOX0RFQlVHX1hNSVRfREVTQywKKwkgICAgIiVzOiBsZW4gJWQsIG9m ZiAlZCwgZmxhZ3MwICUwMlgsIGR3OiAxICUwOFgsIDIgJTA4WCwgMyAlMDRYICIKKwkgICAgIihz ZXEgJTA0WCksIDQgJTA4WCwgNSAlMDhYLCA2ICUwOFgsIHNpemUgJTA0WCwgcGFkICUwNFgsICIK KwkgICAgImFkZHI6ICUwOFggKDY0OiAlMDhYKSwgbmV4dDogJTA4WCAoNjQ6ICUwOFgpLCAiCisJ ICAgICJyc3ZkOiAlMDhYICUwOFggJTA4WCAlMDhYXG4iLAorCSAgICBfX2Z1bmNfXywgbGUxNnRv aCh0eGQtPnBrdGxlbiksIHR4ZC0+b2Zmc2V0LCB0eGQtPmZsYWdzMCwKKwkgICAgbGUzMnRvaCh0 eGQtPnR4ZHcxKSwgbGUzMnRvaCh0eGQtPnR4ZHcyKSwgbGUxNnRvaCh0eGQtPnR4ZHczKSwKKwkg ICAgbGUxNnRvaCh0eGQtPnR4ZHNlcSksIGxlMzJ0b2godHhkLT50eGR3NCksIGxlMzJ0b2godHhk LT50eGR3NSksCisJICAgIGxlMzJ0b2godHhkLT50eGR3NiksIGxlMTZ0b2godHhkLT50eGJ1ZnNp emUpLCBsZTE2dG9oKHR4ZC0+cGFkKSwKKwkgICAgbGUzMnRvaCh0eGQtPnR4YnVmYWRkciksIGxl MzJ0b2godHhkLT50eGJ1ZmFkZHI2NCksCisJICAgIGxlMzJ0b2godHhkLT5uZXh0ZGVzY2FkZHIp LCBsZTMydG9oKHR4ZC0+bmV4dGRlc2NhZGRyNjQpLAorCSAgICBsZTMydG9oKHR4ZC0+cmVzZXJ2 ZWRbMF0pLCBsZTMydG9oKHR4ZC0+cmVzZXJ2ZWRbMV0pLAorCSAgICBsZTMydG9oKHR4ZC0+cmVz ZXJ2ZWRbMl0pLCBsZTMydG9oKHR4ZC0+cmVzZXJ2ZWRbM10pKTsKKyNlbmRpZgorfQpkaWZmIC0t Z2l0IGEvc3lzL2Rldi9ydHduL3J0bDgxODhlL3BjaS9yODhlZV90eF9kZXNjLmggYi9zeXMvZGV2 L3J0d24vcnRsODE4OGUvcGNpL3I4OGVlX3R4X2Rlc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMC4uOTgwODk1YjdjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZGV2 L3J0d24vcnRsODE4OGUvcGNpL3I4OGVlX3R4X2Rlc2MuaApAQCAtMCwwICsxLDU2IEBACisvKgkk T3BlbkJTRDogaWZfcnR3bnJlZy5oLHYgMS4zIDIwMTUvMDYvMTQgMDg6MDI6NDcgc3RzcCBFeHAg JAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAxMCBEYW1pZW4gQmVyZ2FtaW5pIDxkYW1p ZW4uYmVyZ2FtaW5pQGZyZWUuZnI+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgU3RlZmFuIFNwZXJs aW5nIDxzdHNwQG9wZW5ic2Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDE2IEFuZHJpeSBWb3Nr b2JvaW55ayA8YXZvc0BGcmVlQlNELm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxOCBGYXJoYW4g S2hhbiA8a2hhbnpmQGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwg bW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ug d2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUg YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBw ZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJ UyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FS RCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisg KiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRI T1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENP TlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJ TkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBB Q1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBB UklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9S TUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqIAorICogJEZyZWVCU0QkCisgKi8KKworI2lmbmRl ZiBSODhFRV9UWF9ERVNDX0gKKyNkZWZpbmUgUjg4RUVfVFhfREVTQ19ICisKKyNpbmNsdWRlIDxk ZXYvcnR3bi9ydGw4MTg4ZS9yODhlX3R4X2Rlc2MuaD4KKworLyogVHggTUFDIGRlc2NyaXB0b3Ig KFBDSWUpLiAqLworc3RydWN0IHI4OGVlX3R4X2Rlc2MgeworCXVpbnQxNl90IAlwa3RsZW47CisJ dWludDhfdAkJb2Zmc2V0OworCXVpbnQ4X3QJCWZsYWdzMDsKKworCXVpbnQzMl90CXR4ZHcxOwor CXVpbnQzMl90CXR4ZHcyOworCXVpbnQxNl90CXR4ZHczOworCXVpbnQxNl90CXR4ZHNlcTsKKwor CXVpbnQzMl90CXR4ZHc0OworCXVpbnQzMl90CXR4ZHc1OworCXVpbnQzMl90CXR4ZHc2OworCisJ dWludDE2X3QJdHhidWZzaXplOworCXVpbnQxNl90CXBhZDsKKworCXVpbnQzMl90CXR4YnVmYWRk cjsKKwl1aW50MzJfdAl0eGJ1ZmFkZHI2NDsKKworCXVpbnQzMl90CW5leHRkZXNjYWRkcjsKKwl1 aW50MzJfdAluZXh0ZGVzY2FkZHI2NDsKKworCXVpbnQzMl90CXJlc2VydmVkWzRdOworfSBfX3Bh Y2tlZCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSk7CisKKyNlbmRpZgkvKiBSODhFRV9UWF9E RVNDX0ggKi8KZGlmZiAtLWdpdCBhL3N5cy9kZXYvcnR3bi9ydGw4MTg4ZS9yODhlLmggYi9zeXMv ZGV2L3J0d24vcnRsODE4OGUvcjg4ZS5oCmluZGV4IDNhM2MwODY1YTQzLi4zMTYzOTU2M2RkNSAx MDA2NDQKLS0tIGEvc3lzL2Rldi9ydHduL3J0bDgxODhlL3I4OGUuaAorKysgYi9zeXMvZGV2L3J0 d24vcnRsODE4OGUvcjg4ZS5oCkBAIC01MCw2ICs1MCw4IEBAIHVpbnQ4X3QJcjg4ZV90ZW1wX3Jl YWQoc3RydWN0IHJ0d25fc29mdGMgKik7CiAvKiByODhlX2NoYW4uYyAqLwogdm9pZAlyODhlX2dl dF90eHBvd2VyKHN0cnVjdCBydHduX3NvZnRjICosIGludCwKIAkgICAgc3RydWN0IGllZWU4MDIx MV9jaGFubmVsICosIHVpbnQ4X3RbXSk7Cit2b2lkCXI4OGVlX2dldF90eHBvd2VyKHN0cnVjdCBy dHduX3NvZnRjICosIGludCwKKwkgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICosIHVpbnQ4 X3RbXSk7CiB2b2lkCXI4OGVfc2V0X2J3MjAoc3RydWN0IHJ0d25fc29mdGMgKiwgdWludDhfdCk7 CiB2b2lkCXI4OGVfc2V0X2dhaW4oc3RydWN0IHJ0d25fc29mdGMgKiwgdWludDhfdCk7CiAKQEAg LTU4LDYgKzYwLDcgQEAgdm9pZAlyODhlX3NldF9nYWluKHN0cnVjdCBydHduX3NvZnRjICosIHVp bnQ4X3QpOwogaW50CXI4OGVfZndfY21kKHN0cnVjdCBydHduX3NvZnRjICosIHVpbnQ4X3QsIGNv bnN0IHZvaWQgKiwgaW50KTsKIHZvaWQJcjg4ZV9md19yZXNldChzdHJ1Y3QgcnR3bl9zb2Z0YyAq LCBpbnQpOwogdm9pZAlyODhlX2Z3X2Rvd25sb2FkX2VuYWJsZShzdHJ1Y3QgcnR3bl9zb2Z0YyAq LCBpbnQpOwordm9pZAlyODhlZV9md19kb3dubG9hZF9lbmFibGUoc3RydWN0IHJ0d25fc29mdGMg KiwgaW50KTsKICNlbmRpZgogdm9pZAlyODhlX21hY2lkX2VuYWJsZV9saW5rKHN0cnVjdCBydHdu X3NvZnRjICosIGludCwgaW50KTsKIHZvaWQJcjg4ZV9zZXRfbWVkaWFfc3RhdHVzKHN0cnVjdCBy dHduX3NvZnRjICosIGludCk7CkBAIC02OCw4ICs3MSwxMSBAQCBpbnQJcjg4ZV9zZXRfcHdybW9k ZShzdHJ1Y3QgcnR3bl9zb2Z0YyAqLCBzdHJ1Y3QgaWVlZTgwMjExdmFwICosIGludCk7CiAKIC8q IHI4OGVfaW5pdC5jICovCiB2b2lkCXI4OGVfaW5pdF9iYihzdHJ1Y3QgcnR3bl9zb2Z0YyAqKTsK K3ZvaWQJcjg4ZWVfaW5pdF9iYihzdHJ1Y3QgcnR3bl9zb2Z0YyAqKTsKIHZvaWQJcjg4ZV9pbml0 X3JmKHN0cnVjdCBydHduX3NvZnRjICopOwogaW50CXI4OGVfcG93ZXJfb24oc3RydWN0IHJ0d25f c29mdGMgKik7CitpbnQJcjg4ZWVfcG93ZXJfb24oc3RydWN0IHJ0d25fc29mdGMgKik7CitpbnQJ cjg4ZWVfbGx0X2luaXQoc3RydWN0IHJ0d25fc29mdGMgKnNjKTsKIAogLyogcjg4ZV9sZWQuYyAq Lwogdm9pZAlyODhlX3NldF9sZWQoc3RydWN0IHJ0d25fc29mdGMgKiwgaW50LCBpbnQpOwpAQCAt NzksNiArODUsNyBAQCB2b2lkCXI4OGVfcmZfd3JpdGUoc3RydWN0IHJ0d25fc29mdGMgKiwgaW50 LCB1aW50OF90LCB1aW50MzJfdCk7CiAKIC8qIHI4OGVfcm9tLmMgKi8KIHZvaWQJcjg4ZV9wYXJz ZV9yb20oc3RydWN0IHJ0d25fc29mdGMgKiwgdWludDhfdCAqKTsKK3ZvaWQJcjg4ZWVfcGFyc2Vf cm9tKHN0cnVjdCBydHduX3NvZnRjICosIHVpbnQ4X3QgKik7CiAKIC8qIHI4OGVfcnguYyAqLwog dm9pZAlyODhlX3JhdGVjdGxfdHhfY29tcGxldGUoc3RydWN0IHJ0d25fc29mdGMgKiwgdWludDhf dCAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvc3lzL2Rldi9ydHduL3J0bDgxODhlL3I4OGVfZncuYyBi L3N5cy9kZXYvcnR3bi9ydGw4MTg4ZS9yODhlX2Z3LmMKaW5kZXggNGFlNGFiYmRhMWQuLmQyMjBi YWE0MjJhIDEwMDY0NAotLS0gYS9zeXMvZGV2L3J0d24vcnRsODE4OGUvcjg4ZV9mdy5jCisrKyBi L3N5cy9kZXYvcnR3bi9ydGw4MTg4ZS9yODhlX2Z3LmMKQEAgLTEzMCw2ICsxMzAsMjcgQEAgcjg4 ZV9md19kb3dubG9hZF9lbmFibGUoc3RydWN0IHJ0d25fc29mdGMgKnNjLCBpbnQgZW5hYmxlKQog fQogI2VuZGlmCiAKK3ZvaWQKK3I4OGVlX2Z3X2Rvd25sb2FkX2VuYWJsZShzdHJ1Y3QgcnR3bl9z b2Z0YyAqc2MsIGludCBlbmFibGUpCit7CisJdWludDhfdCB0bXA7CisJaWYgKGVuYWJsZSkgewor CQl0bXAgPSBydHduX3JlYWRfMShzYywgUjkyQ19TWVNfRlVOQ19FTisxKTsKKwkJcnR3bl93cml0 ZV8xKHNjLCBSOTJDX1NZU19GVU5DX0VOKzEsIHRtcCB8IDB4MDQpOworCisJCXRtcCA9IHJ0d25f cmVhZF8xKHNjLCBSOTJDX01DVUZXREwpOworCQlydHduX3dyaXRlXzEoc2MsIFI5MkNfTUNVRldE TCwgdG1wIHwgMHgwMSk7CisKKwkJdG1wID0gcnR3bl9yZWFkXzEoc2MsIFI5MkNfTUNVRldETCAr IDIpOworCQlydHduX3dyaXRlXzEoc2MsIFI5MkNfTUNVRldETCArIDIsIHRtcCAmIDB4ZjcpOwor CX0gZWxzZSB7CisJCXRtcCA9IHJ0d25fcmVhZF8xKHNjLCBSOTJDX01DVUZXREwpOworCQlydHdu X3dyaXRlXzEoc2MsIFI5MkNfTUNVRldETCwgdG1wICYgMHhmZSk7CisKKwkJcnR3bl93cml0ZV8x KHNjLCBSOTJDX01DVUZXREwgKyAxLCAweDAwKTsKKwl9Cit9CisKIHZvaWQKIHI4OGVfbWFjaWRf ZW5hYmxlX2xpbmsoc3RydWN0IHJ0d25fc29mdGMgKnNjLCBpbnQgaWQsIGludCBlbmFibGUpCiB7 CkBAIC0xNTEsNyArMTcyLDYgQEAgdm9pZAogcjg4ZV9zZXRfbWVkaWFfc3RhdHVzKHN0cnVjdCBy dHduX3NvZnRjICpzYywgaW50IG1hY2lkKQogewogCXN0cnVjdCByODhlX2Z3X2NtZF9tc3JycHQg c3RhdHVzOwotCiAJaWYgKG1hY2lkICYgUlRXTl9NQUNJRF9WQUxJRCkKIAkJc3RhdHVzLm1zcmIw ID0gUjg4RV9NU1JSUFRfQjBfQVNTT0M7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvc3lzL2Rldi9ydHdu L3J0bDgxODhlL3I4OGVfaW5pdC5jIGIvc3lzL2Rldi9ydHduL3J0bDgxODhlL3I4OGVfaW5pdC5j CmluZGV4IDIwMmNlYzE1NGFhLi5iMzZjN2RmYWE3YiAxMDA2NDQKLS0tIGEvc3lzL2Rldi9ydHdu L3J0bDgxODhlL3I4OGVfaW5pdC5jCisrKyBiL3N5cy9kZXYvcnR3bi9ydGw4MTg4ZS9yODhlX2lu aXQuYwpAQCAtNTQsNyArNTQsNyBAQCBfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CiAKICNpbmNsdWRl IDxkZXYvcnR3bi9ydGw4MTg4ZS9yODhlLmg+CiAjaW5jbHVkZSA8ZGV2L3J0d24vcnRsODE4OGUv cjg4ZV9yZWcuaD4KLQorI2luY2x1ZGUgPGRldi9ydHduL3J0bDgxOTJjL3BjaS9yOTJjZV9yZWcu aD4KIAogc3RhdGljIHZvaWQKIHI4OGVfY3J5c3RhbGNhcF93cml0ZShzdHJ1Y3QgcnR3bl9zb2Z0 YyAqc2MpCkBAIC05NCw2ICs5NCw5MyBAQCByODhlX2luaXRfYmIoc3RydWN0IHJ0d25fc29mdGMg KnNjKQogCXI4OGVfY3J5c3RhbGNhcF93cml0ZShzYyk7CiB9CiAKK2ludAorcjg4ZWVfbGx0X2lu aXQoc3RydWN0IHJ0d25fc29mdGMgKnNjKSB7CisKKwlydHduX3dyaXRlXzEoc2MsIFI5MkNfUlFQ Tl9OUFEsIDB4MDEpOworCXJ0d25fd3JpdGVfNChzYywgUjkyQ19UUlhGRl9CTkRZLCAweDgwNzMw ZDI5KTsKKworCXJ0d25fd3JpdGVfNChzYywgUjkyQ19UUlhGRl9CTkRZLCAoMHgyNUZGMDAwMCB8 IHNjLT5wa3RidWZfY291bnQpKTsKKwlydHduX3dyaXRlXzEoc2MsIFI5MkNfVERFQ1RSTCArIDEs IHNjLT5wa3RidWZfY291bnQpOworCisJcnR3bl93cml0ZV8xKHNjLCBSODhFX1RYUEtUQlVGX0JD TlExX0JETlksIHNjLT5wa3RidWZfY291bnQpOworCXJ0d25fd3JpdGVfMShzYywgUjkyQ19UWFBL VEJVRl9NR1FfQkROWSwgc2MtPnBrdGJ1Zl9jb3VudCk7CisKKwlydHduX3dyaXRlXzEoc2MsIDB4 NDVELCBzYy0+cGt0YnVmX2NvdW50KTsKKwlydHduX3dyaXRlXzEoc2MsIFI5MkNfUEJQLCAweDEx KTsKKwlydHduX3dyaXRlXzEoc2MsIFI5MkNfUlhfRFJWSU5GT19TWiwgMHg0KTsKKworCXJldHVy biByOTJjX2xsdF9pbml0KHNjKTsKK30KKwordm9pZAorcjg4ZWVfaW5pdF9iYihzdHJ1Y3QgcnR3 bl9zb2Z0YyAqc2MpCit7CisJdWludDMyX3QgdG1wOworCWludCBpLCBqOworCisJcnR3bl9zZXRi aXRzXzIoc2MsIFI5MkNfU1lTX0ZVTkNfRU4sIDAsCisJCVI5MkNfU1lTX0ZVTkNfRU5fQkJSU1RC IHwgUjkyQ19TWVNfRlVOQ19FTl9CQl9HTEJfUlNUIHwKKwkJUjkyQ19TWVNfRlVOQ19FTl9ESU9f UkYpOworCisJcnR3bl93cml0ZV8xKHNjLCBSOTJDX1JGX0NUUkwsCisJCVI5MkNfUkZfQ1RSTF9F TiB8IFI5MkNfUkZfQ1RSTF9SU1RCIHwgUjkyQ19SRl9DVFJMX1NETVJTVEIpOworCisJcnR3bl93 cml0ZV8xKHNjLCBSOTJDX1NZU19GVU5DX0VOLCBSOTJDX1NZU19GVU5DX0VOX1BQTEwgfCBSOTJD X1NZU19GVU5DX0VOX1BDSUVBIHwKKwkJUjkyQ19TWVNfRlVOQ19FTl9ESU9fUENJRSB8CisJCVI5 MkNfU1lTX0ZVTkNfRU5fQkJfR0xCX1JTVCB8IFI5MkNfU1lTX0ZVTkNfRU5fQkJSU1RCKTsKKwor CXRtcCA9IHJ0d25fcmVhZF80KHNjLCAweDRjKTsKKwlydHduX3dyaXRlXzQoc2MsIDB4NGMsIHRt cCB8IDB4ZmY3ZmZmZmYpOworCisJZm9yIChpID0gMDsgaSA8IHNjLT5iYl9zaXplOyBpKyspIHsK KwkJY29uc3Qgc3RydWN0IHJ0d25fYmJfcHJvZyAqYmJfcHJvZyA9ICZzYy0+YmJfcHJvZ1tpXTsK KworCQl3aGlsZSghcnR3bl9jaGVja19jb25kaXRpb24oc2MsIGJiX3Byb2ctPmNvbmQpKSB7CisJ CQlLQVNTRVJUKGJiX3Byb2ctPm5leHQgIT0gTlVMTCwKKwkJCSAgICAoIiVzOiB3cm9uZyBjb25k aXRpb24gdmFsdWUgKGkgJWQpXG4iLAorCQkJICAgIF9fZnVuY19fLCBpKSk7CisJCQliYl9wcm9n ID0gYmJfcHJvZy0+bmV4dDsKKwkJfQorCisJCWZvciAoaiA9IDA7IGogPCBiYl9wcm9nLT5jb3Vu dDsgaisrKSB7CisJCQlSVFdOX0RQUklOVEYoc2MsIFJUV05fREVCVUdfUkVTRVQsCisJCQkgICAg IkJCOiByZWcgMHglMDN4LCB2YWwgMHglMDh4XG4iLAorCQkJICAgIGJiX3Byb2ctPnJlZ1tqXSwg YmJfcHJvZy0+dmFsW2pdKTsKKworCQkJcnR3bl9iYl93cml0ZShzYywgYmJfcHJvZy0+cmVnW2pd LCBiYl9wcm9nLT52YWxbal0pOworCQkJcnR3bl9kZWxheShzYywgMSk7CisJCX0KKwl9CisKKwlm b3IgKGkgPSAwOyBpIDwgc2MtPmFnY19zaXplOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHJ0d25f YWdjX3Byb2cgKmFnY19wcm9nID0gJnNjLT5hZ2NfcHJvZ1tpXTsKKworCQl3aGlsZSghcnR3bl9j aGVja19jb25kaXRpb24oc2MsIGFnY19wcm9nLT5jb25kKSkgeworCQkJS0FTU0VSVChhZ2NfcHJv Zy0+bmV4dCAhPSBOVUxMLAorCQkJICAgICgiJXM6IHdyb25nIGNvbmRpdGlvbiB2YWx1ZSAoMikg KGkgJWQpXG4iLAorCQkJICAgIF9fZnVuY19fLCBpKSk7CisJCQlhZ2NfcHJvZyA9IGFnY19wcm9n LT5uZXh0OworCQl9CisKKwkJZm9yKGogPSAwOyBqIDwgYWdjX3Byb2ctPmNvdW50OyBqKyspIHsK KwkJCVJUV05fRFBSSU5URihzYywgUlRXTl9ERUJVR19SRVNFVCwKKwkJCSAgICAiQUdDOiB2YWwg MHglMDh4XG4iLCBhZ2NfcHJvZy0+dmFsW2pdKTsKKworCQkJcnR3bl9iYl93cml0ZShzYywgUjky Q19PRkRNMF9BR0NSU1NJVEFCTEUsCisJCQkgICAgYWdjX3Byb2ctPnZhbFtqXSk7CisJCQlydHdu X2RlbGF5KHNjLCAxKTsKKwkJfQorCX0KKworCWlmIChydHduX2JiX3JlYWQoc2MsIFI5MkNfSFNT SV9QQVJBTTIoMCkpICYgUjkyQ19IU1NJX1BBUkFNMl9DQ0tfSElQV1IpCisJCXNjLT5zY19mbGFn cyB8PSBSVFdOX0ZMQUdfQ0NLX0hJUFdSOworCisJcnR3bl9iYl9zZXRiaXRzKHNjLCBSOTJDX0ZQ R0EwX1JGTU9ELCAweDEwMDAwMDAsIDApOworCXJ0d25fYmJfc2V0Yml0cyhzYywgUjkyQ19GUEdB MF9SRk1PRCwgMHgyMDAwMDAwLCAwKTsKKworfQorCiBpbnQKIHI4OGVfcG93ZXJfb24oc3RydWN0 IHJ0d25fc29mdGMgKnNjKQogewpkaWZmIC0tZ2l0IGEvc3lzL2Rldi9ydHduL3J0bDgxODhlL3I4 OGVfcm9tLmMgYi9zeXMvZGV2L3J0d24vcnRsODE4OGUvcjg4ZV9yb20uYwppbmRleCBiMTJkN2Ri ODNkNC4uMjgzMWJhYzdlZDAgMTAwNjQ0Ci0tLSBhL3N5cy9kZXYvcnR3bi9ydGw4MTg4ZS9yODhl X3JvbS5jCisrKyBiL3N5cy9kZXYvcnR3bi9ydGw4MTg4ZS9yODhlX3JvbS5jCkBAIC04Miw0ICs4 MiwzNCBAQCByODhlX3BhcnNlX3JvbShzdHJ1Y3QgcnR3bl9zb2Z0YyAqc2MsIHVpbnQ4X3QgKmJ1 ZikKIAogCXNjLT50aGVybWFsX21ldGVyID0gcm9tLT50aGVybWFsX21ldGVyOwogCUlFRUU4MDIx MV9BRERSX0NPUFkoc2MtPnNjX2ljLmljX21hY2FkZHIsIHJvbS0+bWFjYWRkcik7CisKK30KKwor dm9pZAorcjg4ZWVfcGFyc2Vfcm9tKHN0cnVjdCBydHduX3NvZnRjICpzYywgdWludDhfdCAqYnVm KQoreworCXN0cnVjdCByOTJjX3NvZnRjICpycyA9IHNjLT5zY19wcml2OworCXN0cnVjdCBydHdu X3I4OGVfdHhwd3IgKnJ0ID0gcnMtPnJzX3R4cHdyOworCXN0cnVjdCByODhlZV9yb20gKnJvbSA9 IChzdHJ1Y3Qgcjg4ZWVfcm9tICopYnVmOworCWludCBpOworCisJcnQtPmJ3MjBfdHhfcHdyX2Rp ZmYgPSBSVFdOX1NJR040VE84KE1TKHJvbS0+cmZwYXRoWzBdLnJmcGF0aF8yNGcuYncyMF9vZmRt LCBISUdIX1BBUlQpKTsKKwlydC0+b2ZkbV90eF9wd3JfZGlmZiA9IFJUV05fU0lHTjRUTzgoTVMo cm9tLT5yZnBhdGhbMF0ucmZwYXRoXzI0Zy5idzIwX29mZG0sIExPV19QQVJUKSk7CisKKwlmb3Io aSA9IDA7IGkgPCBSODhFX0dST1VQXzJHOyBpKyspCisJCXJ0LT5jY2tfdHhfcHdyW2ldID0gcm9t LT5yZnBhdGhbMF0ucmZwYXRoXzI0Zy5pbmRleF9jY2tfYmFzZVtpXTsKKwlmb3IoaSA9IDA7IGkg PCBSODhFX0dST1VQXzJHIC0gMTsgaSsrKQorCQlydC0+aHQ0MF90eF9wd3JbaV0gPSByb20tPnJm cGF0aFswXS5yZnBhdGhfMjRnLmluZGV4X2J3NDBfYmFzZVtpXTsKKworCXJzLT5ib2FyZF90eXBl ID0KKwkJTVMoUlRXTl9HRVRfUk9NX1ZBUihyb20tPnJmX2JvYXJkX29wdCwgUjkyQ19CT0FSRF9U WVBFX0RPTkdMRSksCisJCVI5MkNfUk9NX1JGMV9CT0FSRF9UWVBFKTsKKwlycy0+cmVndWxhdG9y eSA9IE1TKHJvbS0+cmZfYm9hcmRfb3B0LCBSOTJDX1JPTV9SRjFfUkVHVUxBVE9SWSk7CisKKwly dC0+YncyMF90eF9wd3JfZGlmZiA9IDA7CisJcnQtPm9mZG1fdHhfcHdyX2RpZmYgPSAwOworCisJ cnR3bl9yOTJjX3NldF9uYW1lKHNjKTsKKworCUlFRUU4MDIxMV9BRERSX0NPUFkoc2MtPnNjX2lj LmljX21hY2FkZHIsIHJvbS0+bWFjYWRkcik7CiB9CmRpZmYgLS1naXQgYS9zeXMvZGV2L3J0d24v cnRsODE4OGUvcjg4ZV9yb21faW1hZ2UuaCBiL3N5cy9kZXYvcnR3bi9ydGw4MTg4ZS9yODhlX3Jv bV9pbWFnZS5oCmluZGV4IGM4MDAyOGUwMGQ2Li5jNDkxZjY3N2FiOSAxMDA2NDQKLS0tIGEvc3lz L2Rldi9ydHduL3J0bDgxODhlL3I4OGVfcm9tX2ltYWdlLmgKKysrIGIvc3lzL2Rldi9ydHduL3J0 bDgxODhlL3I4OGVfcm9tX2ltYWdlLmgKQEAgLTU3LDQgKzU3LDcxIEBAIHN0cnVjdCByODhlX3Jv bSB7CiBfU3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHI4OGVfcm9tKSA9PSBSODhFX0VGVVNF X01BUF9MRU4sCiAgICAgIlI4OEVfRUZVU0VfTUFQX0xFTiBtdXN0IGJlIGVxdWFsIHRvIHNpemVv ZihzdHJ1Y3Qgcjg4ZV9yb20pISIpOwogCisvKgorICogUlRMODE4OEVFIFJPTSBpbWFnZS4KKyAq IExhcmdlbHkgZGVyaXZlZCBmcm9tIHRoaXM6CisgKiBodHRwOi8vc3JjLmlsbHVtb3Mub3JnL3Nv dXJjZS94cmVmL2xpbnV4LW1hc3Rlci9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdp ZmkvcnRsODE4OGVlL2h3LmMjMTU3NgorICovCisKK3N0cnVjdCBfYnc0MF9idzIwX29mZG1fY2Nr IHsKKwl1aW50OF90CQkJCWJ3NDA6NDsKKwl1aW50OF90CQkJCWJ3MjA6NDsKKwl1aW50OF90CQkJ CW9mZG06NDsKKwl1aW50OF90CQkJCWNjazo0OworfSBfX3BhY2tlZDsKKworc3RydWN0IF9yODhl ZV9yb21fMjRnIHsKKwl1aW50OF90CQkJCWluZGV4X2Nja19iYXNlWzZdOworCXVpbnQ4X3QJCQkJ aW5kZXhfYnc0MF9iYXNlWzYtMV07CisJdWludDhfdAkJCQlidzIwX29mZG07CisJc3RydWN0IF9i dzQwX2J3MjBfb2ZkbV9jY2sJYnc0MF9idzIwX29mZG1fY2NrWzQtMV07Cit9IF9fcGFja2VkOwor CitzdHJ1Y3QgX3I4OGVlX3JvbV81ZyB7CisJdWludDhfdAkJCQlpbmRleF9idzQwX2Jhc2VbMTRd OworCXVpbnQ4X3QJCQkJYncyMF9vZmRtOworCXVpbnQ4X3QJCQkJYnc0MF9idzIwWzQtMV07CisJ dWludDhfdAkJCQlvZmRtXzFbMl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgX3I4OGVlX3JmX3Bh dGggeworCXN0cnVjdCBfcjg4ZWVfcm9tXzI0ZwkJcmZwYXRoXzI0ZzsKKwlzdHJ1Y3QgX3I4OGVl X3JvbV81ZwkJcmZwYXRoXzVnOworfSBfX3BhY2tlZDsKKworc3RydWN0IHI4OGVlX3JvbSB7CisJ dWludDE2X3QJCQlpZDsgLyogQWx3YXlzIDB4ODEyOSAqLworCisJdWludDhfdAkJCQlocG9uWzRd OworCXVpbnQxNl90CQkJY2xrOworCXVpbnQ4X3QJCQkJdGVzdHJbOF07CisKKwlzdHJ1Y3QgX3I4 OGVlX3JmX3BhdGgJCXJmcGF0aFs0XTsKKworCXVpbnQ4X3QJCQkJdW5rbm93bjNbMTZdOworCXVp bnQxNl90CQkJY2hhbm5lbF9wbGFuOworCXVpbnQ4X3QJCQkJeHRhbDsKKwl1aW50OF90CQkJCXRo ZXJtYWxfbWV0ZXI7CisJdWludDhfdAkJCQl1bmtub3duNFs1XTsKKwl1aW50OF90CQkJCXJmX2Jv YXJkX29wdDsKKwl1aW50OF90CQkJCXJmX2ZlYXR1cmVfb3B0OworCXVpbnQ4X3QJCQkJcmZfYnRf c2V0dGluZzsKKwl1aW50OF90CQkJCXZlcnNpb247CisJdWludDhfdAkJCQljdXN0b21lcl9pZDsK Kwl1aW50OF90CQkJCXJlc2VydmVkMVszXTsKKwl1aW50OF90CQkJCXJmX2FudGVubmFfb3B0Owor CisJdWludDhfdAkJCQlyZXNlcnZlZDJbNl07CisJdWludDhfdAkJCQltYWNhZGRyW0lFRUU4MDIx MV9BRERSX0xFTl07CisJdWludDE2X3QJCQl2aWQ7CisJdWludDE2X3QJCQlkaWQ7CisJdWludDE2 X3QJCQlzdmlkOworCXVpbnQxNl90CQkJc21pZDsKKworCXVpbnQ4X3QJCQkJdW5rbm93bjVbMjkw XTsKK30gX19wYWNrZWQ7IC8vIFNob3VsZCBiZSA1MTIgYnl0ZQorCitfU3RhdGljX2Fzc2VydChz aXplb2Yoc3RydWN0IHI4OGVlX3JvbSkgPT0gUjg4RV9FRlVTRV9NQVBfTEVOLAorICAgICJSODhF RV9FRlVTRV9NQVBfTEVOIG11c3QgYmUgZXF1YWwgdG8gc2l6ZW9mKHN0cnVjdCByODhlZV9yb20p ISIpOworCiAjZW5kaWYJLyogUjg4RV9ST01fSU1BR0VfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzL21v ZHVsZXMvcnR3bl9wY2kvTWFrZWZpbGUgYi9zeXMvbW9kdWxlcy9ydHduX3BjaS9NYWtlZmlsZQpp bmRleCA3MzA5OTFlZWRjZC4uZTgxMTAxNzM2NzAgMTAwNjQ0Ci0tLSBhL3N5cy9tb2R1bGVzL3J0 d25fcGNpL01ha2VmaWxlCisrKyBiL3N5cy9tb2R1bGVzL3J0d25fcGNpL01ha2VmaWxlCkBAIC0x Nyw2ICsxNywxMiBAQCBTUkNTCSs9IHI5MmNlX2F0dGFjaC5jIHI5MmNlX2NhbGliLmMgcjkyY2Vf ZncuYyByOTJjZV9pbml0LmMgcjkyY2VfbGVkLmMgXAogCSAgIHI5MmNlX3J4LmMgcjkyY2VfdHgu YyBcCiAJICAgcjkyY2UuaCByOTJjZV9wcml2LmggcjkyY2VfcmVnLmggcjkyY2VfcnhfZGVzYy5o IHI5MmNlX3R4X2Rlc2MuaAogCisuUEFUSDogJHsuU1JDVE9QfS9zeXMvZGV2L3J0d24vcnRsODE4 OGUvcGNpCitTUkNTICAgICs9IHI4OGVlX2F0dGFjaC5jIHI4OGVlX2NhbGliLmMgcjg4ZWVfaW5p dC5jIFwKKwkgICByODhlZV90eC5jIHI4OGVlX3B3cnNlcS5jIHI4OGVlX3J4LmMgcjg4ZWVfcmYu YyBcCisJICAgcjg4ZWUuaCByODhlZV9wcml2Lmggcjg4ZWVfcmVnLmggcjg4ZWVfdHhfZGVzYy5o IFwKKwkgICByODhlZV9wd3JzZXEuaAorCiBvcHRfcnR3bi5oOgogCUBlY2hvICIjZGVmaW5lIFJU V05fREVCVUcgMSIgPiAkey5UQVJHRVR9CiAuaWYgJHtNS19TT1VSQ0VMRVNTX1VDT0RFfSA9PSAi bm8iCmRpZmYgLS1naXQgYS9zeXMvbW9kdWxlcy9ydHduZncvTWFrZWZpbGUgYi9zeXMvbW9kdWxl cy9ydHduZncvTWFrZWZpbGUKaW5kZXggZmU2MDZiYjI1ZTUuLmJlNmViMGRmNmUwIDEwMDY0NAot LS0gYS9zeXMvbW9kdWxlcy9ydHduZncvTWFrZWZpbGUKKysrIGIvc3lzL21vZHVsZXMvcnR3bmZ3 L01ha2VmaWxlCkBAIC0xLDYgKzEsNiBAQAogIyAkRnJlZUJTRCQKIAogU1VCRElSPQlydHducnRs ODE4OGV1IHJ0d25ydGw4MTkyY1QgcnR3bnJ0bDgxOTJjVSBydHducnRsODE5MmV1IHJ0d25ydGw4 ODEyYXUgXAotCXJ0d25ydGw4ODIxYXUgcnR3bnJ0bDgxOTJjRSBydHducnRsODE5MmNFQgorCXJ0 d25ydGw4ODIxYXUgcnR3bnJ0bDgxOTJjRSBydHducnRsODE5MmNFQiBydHducnRsODE4OGVlCiAK IC5pbmNsdWRlIDxic2Quc3ViZGlyLm1rPgpkaWZmIC0tZ2l0IGEvc3lzL21vZHVsZXMvcnR3bmZ3 L3J0d25ydGw4MTg4ZWUvTWFrZWZpbGUgYi9zeXMvbW9kdWxlcy9ydHduZncvcnR3bnJ0bDgxODhl ZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uODQ2NGFi MzlmZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbW9kdWxlcy9ydHduZncvcnR3bnJ0bDgxODhl ZS9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKyMgJEZyZWVCU0QkCisKK0tNT0Q9CXJ0d24tcnRs ODE4OGVlZncKK0lNRz0JcnR3bi1ydGw4MTg4ZWVmdworCisuaW5jbHVkZSA8YnNkLmttb2QubWs+ Cg== --000000000000b10597056e022282-- From owner-freebsd-wireless@freebsd.org Thu Jun 7 00:29:55 2018 Return-Path: Delivered-To: freebsd-wireless@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A6324FE9344 for ; Thu, 7 Jun 2018 00:29:54 +0000 (UTC) (envelope-from khanzf@gmail.com) Received: from mail-io0-x236.google.com (mail-io0-x236.google.com [IPv6:2607:f8b0:4001:c06::236]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 267AD7393F for ; Thu, 7 Jun 2018 00:29:54 +0000 (UTC) (envelope-from khanzf@gmail.com) Received: by mail-io0-x236.google.com with SMTP id d73-v6so9798494iog.3 for ; Wed, 06 Jun 2018 17:29:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=S0obvh4fJf2w4XeyiGvWhk82UVS1whFJwbDgSCW9fcI=; b=r91xgeQ+W0LyNiUgHAMWbxDv9bO3ESrXLPPPDrKbrfBtGDgay3NW1DvNLi/7Ed49Ry BsE+UtPRBvfPXJkkYOmtsgH3PkJ+jgKNQPaABs/ik8UlT51EFE8aHkM3MK8dHInwe30J dDRARyc3OuINKLHmeT0VOTbGXtK4JCL4JsgdbAEDfvvgeBo4p+ZlfzC6hGLXSE4BQH80 x+00n0YhGaL9b2HbXSPgOPoOYgkATAfVveOTevpCi9mxLxBaC3mRKGzCLf96e5rhXS9N etkunQTbl9X45fFc1U7skkBarvZRRMwPnbGya7Pmpz2IAnNEnIMDxyQ8FXST4sd9EC95 A+Gw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=S0obvh4fJf2w4XeyiGvWhk82UVS1whFJwbDgSCW9fcI=; b=m/Nlskhk6G9t6XssBDcDREC+meZ5FXZMHiRKW6oEV7d7Q6jMIu6RqGEI3oKK5SHeL5 pBLDcSVAAzeTYs9VBF42Tga8HGs50g20MECOu4XM6kayxXQW8wD9OQhuUAevX1oAH/fn 1aSei3E3oL1SGEEY0Wvi8zF1VWrF4FheFTn2vn0MBk05X3tAIghZnweM6uWq/APSZMSL N6++NxQKPtV/KmnUqO+qCD/ptKjdkL62D3omZfuDP8t5o7pBUDDqCfquDVs05uWs4TYl hcXSdA4tFF9BG6sN2lrOM3dd4M5VgZWQiL/5CLDC96PWw76BqMVOG+U5N2ADRkTkLu0p Uwtg== X-Gm-Message-State: APt69E18QcIYRqiJpwjIWskkR7T6aa0cKhDliokoL3slu3lqUAi6k6Bj sWdUvYyBkq2QQwPrxIY7GgVDqn5Whe8Awm/bJtdO2a2f X-Google-Smtp-Source: ADUXVKLJCRouO9/yWzqCDyl3rT6Q6yW+AHIbwnLCaSemGepencHLBvIisWdUr5fIOA8wKVBysvZU0MNmL0qNNVQEPVI= X-Received: by 2002:a6b:ba45:: with SMTP id k66-v6mr5048187iof.129.1528331391790; Wed, 06 Jun 2018 17:29:51 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:ac0:a148:0:0:0:0:0 with HTTP; Wed, 6 Jun 2018 17:29:31 -0700 (PDT) In-Reply-To: References: From: Farhan Khan Date: Wed, 6 Jun 2018 20:29:31 -0400 Message-ID: Subject: Re: RTL8188EE monitor mode patch To: freebsd-wireless@freebsd.org Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.26 X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 07 Jun 2018 00:29:55 -0000 On Wed, Jun 6, 2018 at 8:11 PM, Farhan Khan wrote: > Hi all, > > First ever patch submission, quite nervous. I have attached the diff > to this email. This is for the Realtek rtl8188ee PCI driver. Currently > only works in monitor mode and will receive wireless frames. I am very > interested in moving forward with getting read/write working. > > Known bugs: > * Unloading the driver without bringing it down will result in a > kernel panic. This appears to be an issue with the firmware running > C2H code, and then attempting to write back to memory that was freed > by the kernel. > * Bringing the interface down, then back up will cause frames to > arrive in spurts or not at all. This behavior only seemed to start > after git commit 960c0f3d880f9767027c05614f2184ce4b93fa99. One > solution is to revert sys/dev/rtwn/pci/* to the previous state and the > issue appears to stop. > > You will notice what appear to be a lot of hard-coded register values. > This is because I am basing this off of the Linux driver, and Realtek > does not provide any documentation on how their driver works. > > My git repository is here: https://github.com/khanzf/freebsd > > Please let me know if there are any bugs or problems that need to be remediated. > Thank you, > -- > Farhan Khan > PGP Fingerprint: B28D 2726 E2BC A97E 3854 5ABE 9A9F 00BC D525 16EE Sincere apologies, I sent it as an attachment, not just the text. Please see below. ---- diff --git a/sys/contrib/dev/rtwn/rtwn-rtl8188eefw.fw.uu b/sys/contrib/dev/rtwn/rtwn-rtl8188eefw.fw.uu new file mode 100644 index 00000000000..68df43ca99d --- /dev/null +++ b/sys/contrib/dev/rtwn/rtwn-rtl8188eefw.fw.uu @@ -0,0 +1,253 @@ +begin 644 rtwn-rtl8188eefw.fw +MX8@0``@````0)2%6L"L``*($```````````````````"134````````````` +M````````P58````````````````````````````````````````````````` +M````````````H01X@!;F"'`+PJ_F,.$#1!CVTJ\(V>WJB]`BY0S_(R2!^`\( +M"+\$!'\`>('F,.3R`.4,PY]0(`4,=(@E#/CF_::!".:N#+X#`G3_S?CH;6#@ +M".;`X(#VY0S3GT`GY0PDB?CFK@R^`P)T__T8YLWXY8%M8`;0X/88@/7E#"2( +MR/85#(#3Y0PC)('X?P3"K^8PX`,0X@Q_`##A!S#C!'\(5/14?,;2KU2`0@(BF@70#8`;_"';_W_M_!.1X@/8(]@C?^GB!=C"01<5T`9/`X.23P.!#B0%U +MBF!UC'G2C-*O(@/OTY0#0`-__R)T@2\O^.8@Y?3"K^9$,/;2KZX,[L.?4"$. +M=(@N^.;Y".88O@,"=/_][6E@"0GG&1GW"0F`\Q86@-KNTY]`!`6!!8'NTY]` +M(G2(+O@(YOGNM0P"J8$8!@;F_>UI8`D9&><)"?<9@/,>@-GO)(CXY@3X[R\$ +MD$7%D_8([R^3]G\`(N_3E`-``W__(N\C)('XYC#E],*OYE2,]M*OY0RU!PIT +MB"_XYO6!`D)-4"YTB2_XYK\#`G3__1CF^72(+_C[YOSI;&`(J`7G]AT9@/2H +M`Z8%'^4,M0?C?P`B=(DO^.;]&(8!#W2(+_BF`0B&!.4,M0<"K('M;&`(#0FH +M!>;W@/3E#+4'WHF!?P`B[].4`T`#?_\B[R,D@?C"K^8PY04PX`+2Y-+BQM*O +M?P`PX@$/`D),C_#D__[E#",D@/C"J3#W#7\(YF`++?9@,%`N@`!@J$"XY).C^N23H_CDDZ/(Q8+(RL6#RO"CR,6" +MR,K%@\K?Z=[G@+X`08&7`$&!F`!!@:0`43172EK3I_51(R'JT[?U82,AZM/']7$C(>4Y'O(L#@P/#`@\""P-!U +MT`#``,`!P`+``\`$P`7`!L`'D`'$=%;P=$:C\!)C(N5!,.0$?P*1)^5#,.`" +MT?3E0S#A`Q)-N^5#,.(#$DX*Y4,PXP,28W_E0S#D`O&PY4,PY0+QWN5#,.8" +M\8OE1##A`M'J=%8$D`'$\'1&H_#0!]`&T`70!-`#T`+0`=``T-#0@M"#T/#0 +MX#*0@.?@8`,23H0BD($*X&`/Y/"0!5/@1`+PD`7\X`3PY/^0@.?@8'F0@*/@ +M9`%P<9"`YN#$5`]@)"3^8`,$3U'9"`\."`#>3U'9"`\.!U\`.D +M)/[_D(#OX"\23O.0`5=T!?"0@.K@(.(#$DK`(I"`H^"T`1.0@.?@8`V0@.O@ +M5/[P5`=P`O&F(I"`Z>#_?0$"2L20@*/@9`%P)9"`Y^!@'Y`!5^3PD`$\=`+P +MD(#DX%3[\)"`Z^!4_?!4!W`"\:8BD("CX+0!%I"`Y^!@$)"`YN!4#V0"8`," +M:DH23CTBP.#`\,"#P(+`T'70`,``P`'``L`#P`3`!<`&P`>0`<1T_/!T1Z/P +M$F-/Y4DPX0(1E.5),.(#$F.AY4DPXP,28]WE2C#@`Q)D&>5*,.0#$F2XY4PP +MX05_`Q)$)^5,,.0"$9[E3##E`Q)DSN5,,.8#$F5D=/P$D`'$\'1'H_#0!]`& +MT`70!-`#T`+0`=``T-#0@M"#T/#0X#*0@.?@8`,2:OLBL2J0@.W@%)`%<_!] +M`G\"46.0@0'@,.`MD("CX+0!)I"!I.`$\."T"@N0@0/@!/#DD(&D\)"!`^#_ +MD($"X+4'!>2C\!'D(N3_CU.0!!W@8!B0!2+@]59T__#Q\;\!`C%0@9O@D`0E\)"!G.!@#G0/+_6"Y#3\]8/@1(#PKP5T""_U@N0T_/6#Y/!T +M"2_U@N0T_/6#X%3P\'0A+?6"Y#3\]8/@5/?PK@2O!=#0DJ\B=#TO^.9-_O9T +M,"_U@N0T`?6#[O`BD`$V='CPHW0"\'UX_U%C?0)_`U%CD`8*X$0'\)"`\J/@ +MD`58\)"`H^"T`120@.7@5/OPD(#JX"#B#7T!?P2`#)"`Y>!$!/`B?0%_!-,0 +MKP'#P-"0@:'M\)"`ZN"0@:+PD(#DX/[$$Q-4`S#@`H$6[L03$Q-4`3#@`H$6 +MD(&BX/YO<`*!%N]P`F&-)/YP`F'&)/Y@223\<`*!`23\8`*!%NZT#@*1EI"! +MHN!P!'\!D;Z0@:+@M`8"D7"0@:+@M`0.D(&AX/]@!1)I@H`"\5>0@:+@9`A@ +M`H$6$F:'@1:0@:+@<`1_`9&^D(&BX+0&`I%PD(&BX+0.!Y$;OP$"D9:0@:+@ +M9`Q@`H$6D1OO9`%@`H$6D=B!%I"!HN"T#@>1&[\!`I&6D(&BX+0&`I%PD(&B +MX+0,!Y$;OP$"D=B0@:+@9`1P7!)HU.]D`7!4L0Z`4)"!HN"T#@>1&[\!`I&6 +MD(&BX+0&`I%PD(&BX+0,!Y$;OP$"D=B0@:+@<`1_`9&^D(&BX+0$&A)IQ(`5 +MD(&BX+0,#I"`Y>#_$Q-4/S#@`O'GT-"2KR+Q:N]D`6`(D`&X=`'P@#V0@.3@ +M_Q,3$U0?,.`(D`&X=`+P@"COQ%0/,.`(D`&X=`3P@!F0@.G@TY0$0`B0`;AT +M"/"`")`!N.3P?P$BD`&Y=`+P?P`BD(#EX)`&!"#@#.!$0/"0@.IT!/"`"N!4 +M?_"0@.IT#/"0!2+D\"*0@.7@PQ,@X`B0@.IT#/"`$9`&!.!$0/#@1(#PD(#J +M=`3PD`4BY/`BD(&C[_`29@R0@:/@8`60!2+D\)"`ZG0$\"*0@*/@9`%P+9"` +MY>!4_?"0!2)T;_!_`1'FOP$.D(#DX$2`\)"`ZG0.\"*0`;ET`?"0`;@$\"*0 +M!2)T__#Q\9`!-W0"\/U_`U%C$F:0Y)"`ZO`BD(#GX&`MD("CX&0!<"60@.[P +M!&`>D(#KX$00\.3U'9"`[]'RD`%7=`7PD(#JX"#B`E'`(N]P-GUX?P*QHWT" +M?P.QHWW(?P(29VZ0`5?D\)`!/'0"\'T!?PQ1Q)"`Y.!4]_!4[_"0!@K@5/CP +M(D%X?0)_`K&C?0%_`G0]+_CF_NWT7O[V=#`O]8+D-`'U@^[P(I"`Y^!@19"` +MY>#_$Q,35!\PX!*0`3O@,.0+L9F0@.W@%)`%<_"0@9GD=?`!$D2IPY"!FN"4 +M@)"!F>!D@)2`0`N0`9C@5/[PX$0!\/&S`:^0@.K@9`)@*A)J99"`Y>`3$Q-4 +M'S#@%9"`[>#_H^!O<`L29TJQF9"`[N`4\)`!YN`$\"*0`5_D\)`!/'0(\.3U +M'9"`^N##$U1_]1[D^_U_7'X!T?R0`5]T!?"0!I)T`O"0@.3@1!#PD(#JX&0, +M8`KD_7\,4<3D_Q'F(I"`Y^!D`7!>D(#FX%0/8$Z0@.K@<`/_D;Z0@.K@9`Q@ +M`O%7D`%;Y/"0`3QT!/#Q:N]D`7`Q]1V0@/K@PQ-4?_4>Y/O]?UA^`='\D`%; +M=`7PD`:2=`'PD(#DX$0(\"*0@.K@<`)1P"+PY/4=D(#YX/4>Y/O]?U1^`8X9 +MCQKE'E0'Q#-4X(49@X4:@O#E'50'Q#-4X/_E'A,3$U0?3Z/PZU0'Q#-4X/_E +M'1,3$U0?3X4:@H49@Z.C\+T!#(4:@HZ#HZ.C=`/P(H4:@H49@Z.CHW0!\"*0 +M!@3@5'_PD`4BY/"0@.IT#/`BD`0:X/1@`W\`(I`$&^!4!V0'?P%@`G\`(I"! +M>!)%!A)HDI"`Y^#_L5Z0@.?@8!F0@7@21/V0``$2'[U4#_^0``(2'[W]$FBC +M(I"!!.`PX"R0@0?@!/#@_Y"!!>"U!QV0!I+@5!QP"A'DD($(X`3P@`:0!I)T +M'/#DD($'\"(29I"0@.IT"/`BY)"!G?"C\)`%^.!P#Z/@<`NCX'`'H^!P`W\! +M(M.0@9[@E.B0@9W@E`-`"I`!P.!$(/!_`")_,GX`$C*JD(&=Y'7P`1)$J8"_ +MD`#WX"#G">!_`2#F#'\"(I``]^`PY@)_`R(1.9"``>_P$660`61T`?`"+:<1 +MTS$#$9(1L>3U-?4V]3?U.*TU?U`2,AZM-G]1$C(>K3=_4A(R'JTX?U,",AYU +M/1#D]3YU/P=U0`*0`3#E/?"CY3[PH^4_\*/E0/`B=44.=48!0T80=4<#=4AB +MD`$XY47PH^5&\*/E1_"CY4CP(I`!,.3PH_"C\*/PD`$X\*/PH_"C\/U_4!(R +M'N3]?U$2,A[D_7]2$C(>Y/U_4P(R'I`!-'3_\*/PH_"C\)`!//"C\*/PH_#] +M?U02,AY]_W]5$C(>??]_5A(R'GW_?U<",AZ0`(#@1(#]?X`2,AZ0_0#@5+_P +M,<`2,G=Q>S&G?P$20Q60@0!T`O#_$D,5D($`X`3P?P,20Q60@0#@!/`14S&, +MD`"`X$1`_7^`$C(>=2#_,;&1<>3_`D.>,:LQN+%#,!)$_9```A(?O9"! +M?/"`!9"!?._PD(%[[O"0@7S@_I"!>^#_TYY0.)"!>!)$_1(?I%0!_G2C+_6" +MY#2`]8/N\'2C+_6"Y#2`]8/@<`1Q,(`'D(%[X/]Q+Y"!>^`$\("ZD("CX'`E +MD(#JX'`$_Q),OI"`ZN!D#&`#$D]7D(#DX%3W\%3O\%2_\%1_\"(B(A(?I)"` +M\?`B$A^DD(#_\)"`_^"0`>?P(A(?I)"!"?"0``$2'[V0@0KP(A(?I/]4`?Z0 +M@0'@5/Y.\._#$S#@"I```1(?O9"!`O`BD`$!X$0$\)`!G'1^\*-TDO"C=*#P +MHW0D\)`!FW1)\)`!FG3@\)`!F>3PD`&8!/`BTQ"O`"4,I"!$."4`$"YD`'&X##CLB(2'Z3_ +M5'^0@.?P[\03$Q-4`:/PD``!$A^]_U3PQ%0/_I"`YN!4\$[PD``#$A^]5`$E +MX/Z0@.3@5/U.\.]4#\14\/^0@.;@5`]/\)``!!(?O9"`Z?`23X.0`;ET`?"0 +M`;CPD(#GX)`!NO"0@.G@D`&[\)"`YN!4#Y`!OO`BY)"`Y_"C\)"`YN!4#_!4 +M\/"0@.3@5/WP5/?P5._PD(#M=`'PH_"0@.3@5/OPH^!4^_#DD(#P\)"`[W0' +M\)"`\N3PHW0"\.20@.OPD(#DX%3^\)"`Z70,\)"`Y.!4W_"0@.IT#/"0@.3@ +M5+_P5'_PH^!4_O!4_?!4]_"0@/02(-H`````D(`!X+0!")"`\729\(`2D(`! +MX)"`\;0#!720\(`#=$#PD(#X=`'PHW0'\*/@5`%$*/"C=`7PY*/PH_"C\*/P +M(M,0KP'#P-"0`H%Y +M;1(K[9"!E^!U\`20`=$21/'@D(%N\)"!E^!U\`20`=(21/'@D(%O\)"!E^!U +M\`20`=,21/'@D(%P\)"!E^!U\`20`?`21/'@D(%Q\)"!E^!U\`20`?$21/'@ +MD(%R\)"!E^!U\`20`?(21/'@D(%S\)"!E^!U\`20`?,21/'@D(%T\)"!:^#_ +MD(&7X/YT`:@&"(`"PS/8_/1?D(%K\)"!E^#_=`&H!PB``L,SV/R0`6Y1!I"!E^`$\.!4`_#!&)`!P.!$`O#0T)*O(N3[^OU_`1)$3I"! +M:N_P8/#1!X#LY)"!$O"0@1+@9`'P)$J0`<3P=%>C\)"`ZN#_D(#IX&]@`Q)' +MIA)B^[\!`O&%$C*>OP$#$EY&$D)-@,K3$*\!P\#0D(#DX##@`O&:T-"2KR*0 +M@.K@<`X2:52_`0CQKY`!Y>`$\"+3$*\!P\#0$F<$\<#0T)*O(A)F_)``".!4 +M[_U_"!(R'N3_CU#DD($3\*/PD`$)X'\`,.<"?P'O95!@/L.0@13@E(B0@1/@ +ME!-`")`!P.!$$/`BD($3Y'7P`1)$J7\4?@`2,JK3D($4X)0RD($3X)0`0+F0 +M`<;@,."R(N3[^OU_`1)$3I"!?>_P8/`1/8#LTQ"O`X/Z0@)W@ +M_;4&!'X!@`)^`.YD`6`RD`&OX'`3[77P#Z0D!_ET@#7P^GL!$95_`>]@%I"` +MG>`$\.!_`+0*`G\![V`%Y)"`G?#0T)*O(M,0KP'#P-"0@7X210:0@9C@_P3P +MD``![Q(?_'^O?@$1^.]@.I"!?A)$_8L3BA2)%9``#A(?O20"]19[`7H!>:`2 +M*^V0@7X21/V0``X2'[V0`:[PHW3_\)`!R^!D@/#0T)*O(M,0KP'#P-"0@8ON +M\*/O\.2C\*/PD(&+X/ZCX/6"CH/@8"W#D(&.X)3HD(&-X)0#0`N0`<#@1(#P +M?P"`%9"!C>1U\`$21*E_"GX`$C*J@,5_`=#0DJ\BD(%%[_"C[?"C$B#:```` +M`.20@5/P?R1^"!(M7)"!2Q(@SI"!1>#[<`B0@4L21-F`%NMU\`BD)&+U@N0T +MA_6#X/ZCX/\2+5R0@4\2(,Z0@4;@_^3\_?YX%Q(@NZ@$J06J!JL'D(%/$D39 +M[51__>Q4@/P21,SL1(#\D(%/$B#.D(%+$D39[%1__)"%NQ(@SG\D?@@2+J*0 +M@47@=?`(I"1B]8+D-(?U@^#^H^#_P`;`!Y"!3Q)$V9"%NQ(@SM`'T`82+J*0 +M@4L21-GL1(#\D(6[$B#.?R1^"!(NHI"!1>!P!'\@@`F0@47@M`$6?RA^"!(M +M7'@($B"H[U0!_^20@5/O\)"!4^"0@45@#N!U\`BD)&;U@N0TAX`,X'7P"*0D +M9/6"Y#2']8/@_J/@_Q(M7.U4#_WD_)"!1Q(@SI"!1P)$V=,0KP'#P-`Q3M#0 +MDJ\BD($E$D4&$A^DD($I\)```1(?O9"!*/"0``(2'[V0@3OPD``#$A^]D($\ +M\)"!)1)$_>DD!/GD.HL3]12)%746!'L!>H%Y/1(K[9"!)1)$_>DD"/GD.HL3 +M]12)%746!'L!>H%Y01(K[9"!*>`D^&!Y)/Q@=20(8`*!W)"!*."T`042*<6! +MWY"!*."T`@42$;V!WY"!*."T`P42!NN!WY"!*."T$!F0@3S@_I"!.^#][?^0 +M@2KN\*/O\!(RJH'?D($HX+01&9"!/.#^D($[X/WM_Y"!*N[PH^_P$C(&@=^0 +M@2C@]&`"@=__(I"!*>"T#`B0@3IT`?"`!>20@3KPD($HX&0'8`*!KY"!.^"0 +M@3CPD($\X)"!.?"0@3[@_^3\_?YX"!(@NZ@$J06J!JL'D($]X/_D_/W^$D3, +MP`3`!<`&P`>0@3_@_^3\_?YX$!(@N]`#T`+0`=``$D3,D($L$B#.D($YX/^0 +M@3C@_5&-D($P$B#.D($ZX'`"@9>0@4+@_^3\_?YX"!(@NZ@$J06J!JL'D(%! +MX/_D_/W^$D3,P`3`!<`&P`>0@4/@_^3\_?YX$!(@N]`#T`+0`=``$D3,D($T +M$B#.D($T$D39$B";D($P$D3E$D2_P`3`!<`&P`>0@2P21-F0@3021.421+_0 +M`]`"T`'0`!)$S)"!+!(@SI"!+!)$V9"!1Q(@SI"!..#]H^#_D>*`,)"!.^#_ +MH^#]D($ZX)"!2/![`7J!>3VC$D4&>H%Y09"!3!)%!I"!*.#[\9.``W\"(G\! +M(M,0KP'#P-#`!\`%D(%'$D39D(%-$B#.T`70![$$T-"2KR*0@4OO\*L%D(%1 +M$B#:`````*\#Y/S]_G@4$B"[J`2I!:H&JP>0@4T21-GM5`_]Y/P21,SL5`_\ +MD(%1$B#.D(%+X'7P"*0D8/6"Y#2']8/@_J/@_\`&P`>0@5$21-F0A;L2(,[0 +M!]`&`BZBD`()X)"!$_"C="#PD($3X/\PX`6CX"2`\._#$Y#]$/#DD($D\)"! +M%.`D`/6"Y#3\]8/@D($6\)"!).!D`?`D;I`!Q/!T7:/PD($6X/]D!&`*[V0( +M8`7O9`QP>N20@17PD($6X/^0@17@_L.?4#_@_Y"!%.#]+R0`]8+D-/SU@^#\ +M=!1=1FY"!(^_PPY0"4!:0@2/@8`V0@17@_Y"!%.`O\*&3?P$B?P`B$BVG +MY/52$C*>[V!R8U(!Y5(D1I`!Q/!T7J/PD`"(X/50]5%4#V#?Y5`PX`L@Y`,2 +M*<534>Z`/N50,.$6(.4.$A&][W`#0U$@D`$&Y/!34?V`(^50,.(+(.8#$@;K +M4U'[@!/E4##C#B#G"+%N[W`#0U&`4U'WK5%_B!(R'H"((I"!@>_PH^WPK0.L +M`N20@8GPH_"0`<1TQ?!T7J/P[%0__)`!0.WPK@3NH_"0@8'@)(%@-"3:8!PD +M/'!!D(&"X,0S,S-4@)"!AO"C=&GPHW2`\(`LD(&"X%0!D(&&\*-TI?"C=`'P +M@!B0@8+@Q%00D(&&\*-T?_"C=!#P@`-_`"*0@8?@D`$&\)"!AN!@#I`!0O"0 +M@87@D`%#\(`-D`%#Y/"0@8;@D`%"\)"!B.#_D`%"X%__D(&&X&]@[G3%!)`! +MQ/!T7J/PD`%#Y/!_`2(BD(%%[_"C[?"CZ_"0@4D21/V+$XH4B15U%@1[`7J! +M>6(2*^V0@4P21/V+$XH4B15U%@1[`7J!>682*^V0@4;@_I"!1>#][?^0@4_N +M\*/O\)"!1^#_M`0(D(%2=`'P@`_OD(%2M`4%=`+P@`-T!/#3D(%0X)3_D(%/ +MX)0`0`(!DN20@5'PD(%2X/^0@5'@_L.?0`)!]'1B+O6"Y#2!]8/@D(%3\.[_ +MD(%0X"__D(%/X#0`CX+U@^"0@53PD(%(X&`ED(%1X"1F]8+D-('U@^"0@5WP +MX/_T_I"!5.!>_I"!4^#][UU.\)"!3Z/@_Z/@+_^0@5/@_1(R'I"!4>`$\("% +MTY"!4."4_Y"!3^"4!U!XY)"!4?"0@5+@_Y"!4>#^PY]``D'T=&(N]8+D-('U +M@^"0@5/P[O^0@5#@+_N0@4_@-`#ZBX+U@^"0@53PD(%(X&`ED(%1X"1F]8+D +M-('U@^"0@5WPX/_T_I"!5.!>_I"!4^#][UU.\)"!4^"+@HJ#\)"!4>`$\("- +MY)"!4_"0@5X2(-H`````D(%5$B#:`````)"!2.!@$9"!3^#^H^#_$BU#^PY]``D$?=&(N]8+D-('U@^"0@5/PD(%(X&!W +MD(%1X/LD9O6"Y#2!]8/@D(%=\)"!61)$V>MU\`BD^?@2(*B0@5W@_O1?_Y"! +M4^#][EU/\)"!7A)$Y<``P`'``L`#D(%=X/]^`)"!4>!U\`BD_>^H!0B`!<,S +MSC/.V/G_[C.5X/W\T`/0`M`!T``21,R0@5X2(,Z0@5421.7``,`!D(%3X/_D +M_/W^D(%1X'7P"*3Y^!(@N]`!T``21,R0@542(,Z0@5'@!/`A3I"!2.!@.I"! +M7A)$V1(@FY"!61)$Y1)$O\`$P`7`!L`'D(%5$D39D(%>$D3E$D2_T`/0`M`! +MT``21,R0@542(,Z0@5421-F0A;L2(,Z0@4_@_J/@_Q(NHI"!1^"0`:#PD(%2 +MX)`!H?"0@4C@D`&B\)"!21)$_1(?I)`!I/"0``$2'[V0`:7PD``"$A^]D`&F +M\)```Q(?O9`!I_"0@5421-F0`:CO\)"!51)$V7@($B"HD`&I[_"0@5421-EX +M$!(@J)`!JN_PD(%5$D39>!@2(*B0`:OO\"*/#2*/#B)_`I"!`.#^[\.>4!CO +M)>`D@?CF,.0+D`&X=`CPH_!_`"(/@-Y_`2*0`33@53WU0:/@53[U0J/@53_U +M0Z/@54#U1)`!-.5!\*/E0O"CY4/PH^5$\"*0`3S@547U2:/@54;U2J/@54?U +M2Z/@54CU3)`!/.5)\*/E2O"CY4OPH^5,\%.1WR*0@*/@9`%P&9"`Y^!@$Y`! +M5^3PD`$\=`(23NN0`5=T!?`BD(#GX&`UD`:2X##@).3U'9"`^N##$U1_]1[D +M^_U_6'X!$D[\D`%;=`7PD`:2=`'P(I"`Y.!4]_`21Z8BD(#GX&`UD`:2X##A +M).3U'9"`^N##$U1_]1[D^_U_7'X!$D[\D`%?=`7PD`:2=`+P(I"`Y.!4[_`2 +M1Z8BD7&0@0SO\)"`Y##@!N!$`?"`!.!4_O"0@0S@,.81D`$OX##G!.3P@`:0 +M`2]T@/"0@.3@,.`:D(#RY/"C=`?PD(#RH^"0!5CPD`3LX%3=\"*0!.S@1"+P +M(N20@0WPH_"C\)``@^"0@0WPD`"#X/Z0@0W@_[4&`2+#D($/X)1DD($.X)0` +M0`V0`<#@1$#PD($-X/\BD($.Y'7P`1)$J8#"D($)X&`/Y/"0!5/@1`'PD`7] +MX`3P(I"`Y.#_Q!,35`,PX"?O5+_PD`3@X)"`Y3#@!N!$`?"`$.!4_O"0`;ET +M`?"0`;AT!/`21Z;D_Y"!!.`PX$B0@0C@_6!!=`%^`*@'"(`%PS/.,\[8^?^0 +M!.#@^^];8`;DD($(\"*0@0;@TYU0$)`!QW00\+%4D($$X%3^\"(22.20@0C@ +M!/`BD(`!X&0"8`>0!I#@1`'P(I"`Y.#_Q!,3$U0!,.`L[U1_\)`$X."0@.4P +MX0;@1`+P@`_@5/WPD`&Y=`'PD`&X!/"0@.?@8`,21Z9_`:$$TQ"O`!@&I`%(N!4D&`'D`'`X$0(\)`!QN`PX>1_`(`"?P'0T)*O(L/NE`%`"@WM +M$Y#]$/#D+_\BP^Z4`4`DD/T1X&UP&I`!%^"U!0V0`>1T=_"0_1'D\(`&[020 +M_1'PY"__(M,0KP'#P-"0`0'@1`+PD`$`=/_PD`:W=`GPD`:T=(;P?WQ^"!(M +M7.Q4?_R0@8\2(,Z0@8\21-F0A;L2(,Y_?'X($BZBD(6[$B#:S,``P'^,?@@2 +M+J*0A;L2(-H`P``4?W!^#A(NHI"%EA(@V@`#/F#D_?\2,4W0T)*O(M$,D(#J +M=`SP(A)/\9"%NQ(@VLSP`,!_C'X($BZBD(6[$B#:````%']P?@X2+J*0A982 +M(-H`````Y/W_$C%-?WQ^"!(M7.Q$@/R0@9,2(,Z0@9,21-F0A;L2(,Y_?'X( +M$BZBD`$`=#_PH^!4_?"0!5/@1"#P(I``D.`@X/DBD(#QX/U_DQ(R'I"`Z.!@ +M$I`!+^`PYP5T$/"`!I`!+W20\)``".!$$/U_"!(R'G\!$E?1D`"0X$0!_7^0 +M$C(>?Q1^``(RJN\4D`5S\)`!/W00\/U_`W1%+_CF3?[V=#@O]8+D-`'U@^[P +M(G1%+_CF_NWT7O[V=#@O]8+D-`'U@^[P(M,0KP'#P-"0@:#M\)"!G^_PTY0' +M4'#@_W0!J`<(@`+#,]C\]/^0`$?@7_U_1Q(R'I"!G^#_=`&H!PB``L,SV/S_ +MD`!&X$_]?T82,AZ0@:#@8!B0@9_@_W0!J`<(@`+#,]C\_Y``1>!/@!>0@9_@ +M_W0!J`<(@`+#,]C\]/^0`$7@7_U_18!^D(&?X"3X\.`D!/]T`:@'"(`"PS/8 +M_/3_D`!#X%_]?T,2,AZ0@9_@_W0!J`<(@`+#,]C\_Y``0^!/_7]#$C(>D(&@ +MX&`=D(&?X"0$_W0!J`<(@`+#,]C\_Y``0N!/_7]"@!R0@9_@)`3_=`&H!PB` +M`L,SV/ST_Y``0N!?_7]"$C(>T-"2KR*0@.3@5/OPY)"`\/"0@.OP(N\D_F`, +M!'`HD(#M=`'PH_`B[7`*D(#[X)"`[?"`!9"`[>WPD(#MX*/PD(#EX$0(\"(2 +M3VKO9`%@")`!N'0!\(!GD(#KX/]4`V`(D`&X=`+P@%:0@.G@_N3#GE`(D`&X +M=`3P@$3O,.((D`&X=`CP@#B0@.O@,.0(D`&X=!#P@"F0@.7@$Q-4/R#@")`! +MN'0@\(`6D(#_X&`(D`&X=(#P@`B0`;CD\'\!(I`!N70$\'\`(I`"A^!@")`! +MN'0!\(`7D`*&X"#A")`!N'0$\(`(D`&XY/!_`2*0`;ET"/!_`"+O8#Z0@*/@ +M9`%P-I"`Y>!4_O"0!2)T#_"0!@3@5+_PY/\22.:_`0Z0@.3@1$#PD(#J=`;P +M(I`!N70!\)`!N'0(\"*0!2)T;_"0!2?@5+_PD(#J=`+P(N20@0OPD`:IX)"! +M"_#@5,!P#9"`Z^!4_O!4_?`"1Z:0@0O@,.8BD(#GX&0!<"&0@.O@1`'PD(#F +MX%0/9`)@!%%*@`P23CV`!Y"`Z^!4_O"0@0O@D(#K,.<4X$0"$D[KD`%7=`7P +MD(#DX$0$\"+@5/WP(I`$'>!P%)"``^#_Y/T22?F.3H]/D`0?="#P(I"`H^!D +M`6`"0?J0@.?@<`)!^I"`YN#$5`]D`7`BD`:KX)"`[O"0!JK@D(#M\*/@_W`( +MD(#MX/[_@`"0@.[O\)"`Y>!$!/#DD(#P\)"`\J/@D`58\)`!5^3PD`$\=`+P +MD(#KX%3]\%3O\)"`YN#_Q%0/)/U0`H`",=B0@.7@$Q,35!\PX!"0@.W@_Z/@ +MM0<&$F=*$DV?(I"`Y.#_$Q-4/S#@$>]4^_"0@.O@5/WP5`=P0H`]D(#PX`3P +MD(#KX%3O\)"`\.#_M`$"@`3OM`(&D`58X`3PD(#XX/^0@/#@TY]`#Y"`H^"T +M`0N0@.7@5/OP(A)'IB+D_N_#$_WO,.`$[B2`_I#]$.WPKP8BJP>J!NTK^^0Z +M^L.0@*#@FY"`G^":4!.CX"0!_Y"`G^`T`/[#ZY_[ZI[ZZI#]$?"O`W0`+_6" ++Y#3[]8/@_R(`,@@` +` +end diff --git a/sys/dev/rtwn/pci/rtwn_pci_attach.h b/sys/dev/rtwn/pci/rtwn_pci_attach.h index 6df5812e4cd..389d52fff95 100644 --- a/sys/dev/rtwn/pci/rtwn_pci_attach.h +++ b/sys/dev/rtwn/pci/rtwn_pci_attach.h @@ -17,9 +17,11 @@ */ void r92ce_attach(struct rtwn_pci_softc *); +void r88ee_attach(struct rtwn_pci_softc *); enum { RTWN_CHIP_RTL8192CE, + RTWN_CHIP_RTL8188EE, RTWN_CHIP_MAX_PCI }; @@ -32,13 +34,15 @@ struct rtwn_pci_ident { static const struct rtwn_pci_ident rtwn_pci_ident_table[] = { { 0x10ec, 0x8176, "Realtek RTL8188CE", RTWN_CHIP_RTL8192CE }, + { 0x10ec, 0x8179, "Realtek RTL8188EE", RTWN_CHIP_RTL8188EE }, { 0, 0, NULL, RTWN_CHIP_MAX_PCI } }; typedef void (*chip_pci_attach)(struct rtwn_pci_softc *); static const chip_pci_attach rtwn_chip_pci_attach[RTWN_CHIP_MAX_PCI] = { - [RTWN_CHIP_RTL8192CE] = r92ce_attach + [RTWN_CHIP_RTL8192CE] = r92ce_attach, + [RTWN_CHIP_RTL8188EE] = r88ee_attach }; static __inline void diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee.h b/sys/dev/rtwn/rtl8188e/pci/r88ee.h new file mode 100644 index 00000000000..3534cb3a86d --- /dev/null +++ b/sys/dev/rtwn/rtl8188e/pci/r88ee.h @@ -0,0 +1,75 @@ +/*- + * Copyright (c) 2018 Farhan Khan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef RTL8188EE_H +#define RTL8188EE_H + +#include + + +/* + * Global definitions. + */ +#define R88EE_PUBQ_NPAGES 176 +#define R88EE_HPQ_NPAGES 41 +#define R88EE_LPQ_NPAGES 28 +#define R88EE_TX_PAGE_COUNT \ + (R88EE_PUBQ_NPAGES + R88EE_HPQ_NPAGES + R88EE_LPQ_NPAGES) + + +/* + * Function declarations. + */ +/* r88ee_calib.c */ +void r88ee_iq_calib(struct rtwn_softc *); + +/* r88ee_fw.c */ +#ifndef RTWN_WITHOUT_UCODE +void r88ee_fw_reset(struct rtwn_softc *, int); +#endif + +/* r88ee_init.c */ +void r88ee_init_intr(struct rtwn_softc *); +void r88ee_init_edca(struct rtwn_softc *); +int r88ee_power_on(struct rtwn_softc *); +void r88ee_power_off(struct rtwn_softc *); +void r88ee_init_ampdu(struct rtwn_softc *); +void r88ee_post_init(struct rtwn_softc *); +void r88ee_init_rx_agg(struct rtwn_softc *); +void r88ee_init_rf(struct rtwn_softc *); + +/* r88ee_led.c */ +void r88ee_set_led(struct rtwn_softc *, int, int); + +/* r88ee_rx.c */ +int r88ee_classify_intr(struct rtwn_softc *, void *, int); +void r88ee_enable_intr(struct rtwn_pci_softc *); +void r88ee_start_xfers(struct rtwn_softc *); + +/* r88ee_tx.c */ +void r88ee_setup_tx_desc(struct rtwn_pci_softc *, void *, uint32_t); +void r88ee_tx_postsetup(struct rtwn_pci_softc *, void *, + bus_dma_segment_t[]); +void r88ee_copy_tx_desc(void *, const void *); +void r88ee_dump_tx_desc(struct rtwn_softc *, const void *); + +/* r88ee_rf.c */ +uint32_t r88ee_rf_read(struct rtwn_softc *, int, uint8_t); +void r88ee_rf_write(struct rtwn_softc *, int, uint8_t, uint32_t); + +#endif /* RTL8188EE_H */ diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee_attach.c b/sys/dev/rtwn/rtl8188e/pci/r88ee_attach.c new file mode 100644 index 00000000000..a3e310e8fdb --- /dev/null +++ b/sys/dev/rtwn/rtl8188e/pci/r88ee_attach.c @@ -0,0 +1,264 @@ +/* $OpenBSD: if_rtwn.c,v 1.6 2015/08/28 00:03:53 deraadt Exp $ */ + +/*- + * Copyright (c) 2010 Damien Bergamini + * Copyright (c) 2015 Stefan Sperling + * Copyright (c) 2016 Andriy Voskoboinyk + * Copyright (c) 2018 Farhan Khan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_wlan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +static struct rtwn_r92c_txpwr r88ee_txpwr; + +void r88ee_attach(struct rtwn_pci_softc *); + +static void +r88ee_postattach(struct rtwn_softc *sc) +{ + struct r92c_softc *rs = sc->sc_priv; + struct ieee80211com *ic = &sc->sc_ic; + sc->fwname = "rtwn-rtl8188eefw"; + sc->fwsig = 0x88E; + + rs->rs_scan_start = ic->ic_scan_start; + ic->ic_scan_start = r92c_scan_start; + rs->rs_scan_end = ic->ic_scan_end; + ic->ic_scan_end = r92c_scan_end; +} + +static void +r88ee_set_name(struct rtwn_softc *sc) +{ + sc->name = "RTL8188EE"; +} + +static void +r88ee_attach_private(struct rtwn_softc *sc) +{ + struct r92c_softc *rs; + + rs = malloc(sizeof(struct r92c_softc), M_RTWN_PRIV, M_WAITOK | M_ZERO); + + rs->rs_txpwr = &r88ee_txpwr; + + rs->rs_set_bw20 = r88e_set_bw20; + rs->rs_get_txpower = r88e_get_txpower; + rs->rs_set_gain = r88e_set_gain; + rs->rs_tx_enable_ampdu = r88e_tx_enable_ampdu; + rs->rs_tx_setup_hwseq = r88e_tx_setup_hwseq; + rs->rs_tx_setup_macid = r88e_tx_setup_macid; + rs->rs_set_name = r88ee_set_name; + + /* XXX TODO: test with net80211 ratectl! */ +#ifndef RTWN_WITHOUT_UCODE + rs->rs_c2h_timeout = hz; + + callout_init_mtx(&rs->rs_c2h_report, &sc->sc_mtx, 0); +#endif + + rs->rf_read_delay[0] = 1000; + rs->rf_read_delay[1] = 1000; + rs->rf_read_delay[2] = 1000; + + sc->sc_priv = rs; + +} + +static void +r88ee_adj_devcaps(struct rtwn_softc *sc) +{ + struct ieee80211com *ic = &sc->sc_ic; + + /* + * XXX do NOT enable PMGT until RSVD_PAGE command + * will not be tested / fixed + HRPWM register must be set too. + */ + ic->ic_caps &= ~IEEE80211_C_PMGT; +} + +void +r88ee_attach(struct rtwn_pci_softc *pc) +{ + struct rtwn_softc *sc = &pc->pc_sc; + + /* PCIe part. */ + pc->pc_setup_tx_desc = r88ee_setup_tx_desc; + pc->pc_tx_postsetup = r92ce_tx_postsetup; + pc->pc_copy_tx_desc = r88ee_copy_tx_desc; + pc->pc_enable_intr = r88ee_enable_intr; + + pc->pc_qmap = 0xe771; + pc->tcr = 0x8200; + + /* Common part. */ + /* RTL8192C* cannot use pairwise keys from first 4 slots */ + sc->sc_flags = RTWN_FLAG_EXT_HDR; //RTWN_FLAG_CAM_FIXED; + + sc->sc_start_xfers = r88ee_start_xfers; + sc->sc_set_chan = r92c_set_chan; + sc->sc_fill_tx_desc = r92c_fill_tx_desc; + sc->sc_fill_tx_desc_raw = r92c_fill_tx_desc_raw; + sc->sc_fill_tx_desc_null = r92c_fill_tx_desc_null; /* XXX recheck */ + sc->sc_dump_tx_desc = r88ee_dump_tx_desc; + sc->sc_tx_radiotap_flags = r92c_tx_radiotap_flags; + sc->sc_rx_radiotap_flags = r92c_rx_radiotap_flags; + sc->sc_get_rssi_cck = r88e_get_rssi_cck; + sc->sc_get_rssi_ofdm = r88e_get_rssi_ofdm; + sc->sc_classify_intr = r88ee_classify_intr; + sc->sc_handle_tx_report = rtwn_nop_softc_uint8_int; + sc->sc_handle_c2h_report = rtwn_nop_softc_uint8_int; + sc->sc_check_frame = rtwn_nop_int_softc_mbuf; + sc->sc_rf_read = r92c_rf_read; + sc->sc_rf_write = r88e_rf_write; + sc->sc_check_condition = r92c_check_condition; + sc->sc_efuse_postread = r92c_efuse_postread; + sc->sc_parse_rom = r88ee_parse_rom; + sc->sc_set_led = r88e_set_led; + sc->sc_power_on = r88ee_power_on; + sc->sc_power_off = r88ee_power_off; +#ifndef RTWN_WITHOUT_UCODE + sc->sc_fw_reset = r88e_fw_reset; + sc->sc_fw_download_enable = r88ee_fw_download_enable; +#endif + sc->sc_set_page_size = r92c_set_page_size; + sc->sc_lc_calib = r92c_lc_calib; + sc->sc_iq_calib = r88e_iq_calib; + sc->sc_read_chipid_vendor = rtwn_nop_softc_uint32; + sc->sc_adj_devcaps = r88ee_adj_devcaps; + sc->sc_vap_preattach = rtwn_nop_softc_vap; + sc->sc_postattach = r88ee_postattach; + sc->sc_detach_private = r92c_detach_private; + sc->sc_set_media_status = r88e_set_media_status; +#ifndef RTWN_WITHOUT_UCODE + sc->sc_set_rsvd_page = r88e_set_rsvd_page; + sc->sc_set_pwrmode = r88e_set_pwrmode; + sc->sc_set_rssi = r92c_set_rssi; +#endif + sc->sc_beacon_init = r92c_beacon_init; + sc->sc_beacon_enable = r88e_beacon_enable; + sc->sc_beacon_set_rate = rtwn_nop_void_int; + sc->sc_beacon_select = rtwn_nop_softc_int; + sc->sc_temp_measure = r88e_temp_measure; + sc->sc_temp_read = r88e_temp_read; + sc->sc_init_tx_agg = rtwn_nop_softc; + sc->sc_init_rx_agg = rtwn_nop_softc; + sc->sc_init_ampdu = r92ce_init_ampdu; + sc->sc_init_intr = r88ee_init_intr; + sc->sc_init_edca = r92ce_init_edca; + sc->sc_init_bb = r88ee_init_bb; + sc->sc_init_rf = r92c_init_rf; + sc->sc_init_antsel = rtwn_nop_softc; + sc->sc_post_init = r88ee_post_init; + sc->sc_init_bcnq1_boundary = rtwn_nop_int_softc; + + sc->mac_prog = &rtl8188ee_mac[0]; + sc->mac_size = nitems(rtl8188ee_mac); + sc->bb_prog = &rtl8188ee_bb[0]; + sc->bb_size = nitems(rtl8188ee_bb); + sc->agc_prog = &rtl8188ee_agc[0]; + sc->agc_size = nitems(rtl8188ee_agc); + sc->rf_prog = &rtl8188ee_rf[0]; + + sc->page_count = 0xAF; + sc->pktbuf_count = 0xAB; + + sc->ackto = 0x40; + sc->npubqpages = 115; + sc->nhqpages = R92CE_HPQ_NPAGES; + sc->nnqpages = 1; + sc->nlqpages = 13; + sc->page_size = R92C_TX_PAGE_SIZE; + + sc->txdesc_len = sizeof(struct r88ee_tx_desc); + sc->efuse_maxlen = R88E_EFUSE_MAX_LEN; + sc->efuse_maplen = R88E_EFUSE_MAP_LEN; + sc->rx_dma_size = R88E_RX_DMA_BUFFER_SIZE; + + sc->macid_limit = R88E_MACID_MAX + 1; + sc->cam_entry_limit = R92C_CAM_ENTRY_COUNT; + sc->fwsize_limit = 77895; + sc->temp_delta = R88E_CALIB_THRESHOLD; + + sc->bcn_status_reg[0] = R92C_TDECTRL; + /* + * TODO: some additional setup is required + * to maintain few beacons at the same time. + * + * XXX BCNQ1 mechanism is not needed here; move it to the USB module. + */ + sc->bcn_status_reg[1] = R92C_TDECTRL; + sc->rcr = 0xf000780e; + + sc->sc_llt_init = r88ee_llt_init; + sc->sc_get_rx_stats = r88e_get_rx_stats; + + sc->ntxchains = 1; + sc->nrxchains = 1; + + r88ee_attach_private(sc); +} diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee_calib.c b/sys/dev/rtwn/rtl8188e/pci/r88ee_calib.c new file mode 100644 index 00000000000..3cd75d1c216 --- /dev/null +++ b/sys/dev/rtwn/rtl8188e/pci/r88ee_calib.c @@ -0,0 +1,65 @@ +/* $OpenBSD: if_rtwn.c,v 1.6 2015/08/28 00:03:53 deraadt Exp $ */ + +/*- + * Copyright (c) 2018 Farhan Khan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_wlan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include + +#include +#include + + +#define RTWN_IQ_CAL_NRUN 3 +void +r88ee_iq_calib(struct rtwn_softc *sc) +{ + /* Currently unimplemented */ +} +#undef RTWN_IQ_CAL_NRUN diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee_init.c b/sys/dev/rtwn/rtl8188e/pci/r88ee_init.c new file mode 100644 index 00000000000..412a7149556 --- /dev/null +++ b/sys/dev/rtwn/rtl8188e/pci/r88ee_init.c @@ -0,0 +1,256 @@ +/*- + * Copyright (c) 2017 Farhan Khan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_wlan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +void +r88ee_init_intr(struct rtwn_softc *sc) +{ + /* Disable interrupts. */ + rtwn_write_4(sc, 0xb0, 0x200084ff); + rtwn_write_4(sc, 0xb8, 0x100); + rtwn_write_1(sc, 0x01AF, 0x0); + rtwn_write_4(sc, 0x0058, 0xc0); +} + +void +r88ee_init_edca(struct rtwn_softc *sc) +{ + rtwn_write_1(sc, R88EE_SIFS_TRX + 1, 0x0a); + rtwn_write_1(sc, R88EE_SIFS_SPEC + 1, 0x0a); + rtwn_write_1(sc, R88EE_SIFS_SPEC_MAC + 1, 0x0a); + rtwn_write_2(sc, R88EE_SIFS_RESP_OFDM, 0x0e0e); +} + +int +r88ee_power_on(struct rtwn_softc *sc) +{ + uint8_t bytetmp; + + bytetmp = rtwn_read_1(sc, R92C_APS_FSMCO + 1) & (~0x80); + rtwn_write_1(sc, R92C_APS_FSMCO + 1, bytetmp); + + rtwn_write_1(sc, R92C_RSV_CTRL, 0x00); + + /* Power sequence: NIC enable flow */ + rtwn_setbits_1(sc, 0x5, 0x18, 0x0); + if (!r88ee_pwrseq_polling(sc, 0x6, 0x2, 0x2)) + return false; + rtwn_setbits_1(sc, 0x2, 0x3, 0x0); + rtwn_setbits_1(sc, 0x26, 0x80, 0x80); + rtwn_setbits_1(sc, 0x5, 0x80, 0x0); + rtwn_setbits_1(sc, 0x5, 0x18, 0x0); + rtwn_setbits_1(sc, 0x5, 0x1, 0x1); + if (!r88ee_pwrseq_polling(sc, 0x5, 0x1, 0x0)) + return false; + /* End of power sequence */ + + bytetmp = rtwn_read_1(sc, R92C_SYS_CLKR); + + rtwn_write_1(sc, R92C_SYS_CLKR, bytetmp | 0x08); + bytetmp = rtwn_read_1(sc, R92C_GPIO_MUXCFG+1); + rtwn_write_1(sc, R92C_GPIO_MUXCFG+1, (bytetmp & (~0x10))); + rtwn_write_1(sc, 0x367, 0x80); + + rtwn_write_2(sc, R92C_CR, 0x2ff); + rtwn_write_1(sc, R92C_CR+1, 0x06); + rtwn_write_1(sc, R92C_MSR, 0x00); + + rtwn_write_4(sc, R92C_INT_MIG, 0); + + rtwn_write_1(sc, R92C_PCIE_CTRL_REG+1, 0); /* Enable RX DMA */ + + rtwn_write_1(sc, 0x04CA, 0x0B); + rtwn_write_4(sc, R92C_RCR, sc->rcr); + + rtwn_write_4(sc, R92C_MCUTST_1, 0x0); + + return(0); + +} + +void +r88ee_power_off(struct rtwn_softc *sc) +{ + uint32_t count = 0; + uint8_t tmp; + + tmp = rtwn_read_1(sc, R88E_TX_RPT_CTRL); + rtwn_write_1(sc, R88E_TX_RPT_CTRL, tmp & (~0x02)); + + tmp = rtwn_read_1(sc, R88EE_RXDMA_CONTROL); + + while (!(tmp & 0x02) && (count++ < 100)) { + rtwn_delay(sc, 10); + tmp = rtwn_read_1(sc, R88EE_RXDMA_CONTROL); + count++; + } + + rtwn_write_1(sc, R92C_PCIE_CTRL_REG+1, 0xFF); + + /* Power sequence: Disable NIC LPS enable Flow */ + rtwn_setbits_1(sc, 0x522, 0xff, 0x7f); + r88ee_pwrseq_polling(sc, 0x5f8, 0xff, 0x0); + r88ee_pwrseq_polling(sc, 0x5f9, 0xff, 0x0); + r88ee_pwrseq_polling(sc, 0x5fa, 0xff, 0x0); + r88ee_pwrseq_polling(sc, 0x5fb, 0xff, 0x0); + rtwn_setbits_1(sc, 0x2, 0x1, 0x0); + rtwn_setbits_1(sc, 0x100, 0xff, 0x3f); + rtwn_setbits_1(sc, 0x101, 0x2, 0x0); + rtwn_setbits_1(sc, 0x553, 0x20, 0x20); + /* End of power sequence */ + + rtwn_write_1(sc, R92C_RF_CTRL, 0x00); + + tmp = rtwn_read_1(sc, R92C_SYS_FUNC_EN+1); + rtwn_write_1(sc, R92C_SYS_FUNC_EN+1, (tmp & (~0x04))); + rtwn_write_1(sc, R92C_SYS_FUNC_EN+1, (tmp | 0x04)); + + tmp = rtwn_read_1(sc, R92C_SYS_FUNC_EN+1); + rtwn_write_1(sc, R92C_SYS_FUNC_EN + 1, (tmp & (~0x04))); + rtwn_write_1(sc, R92C_MCUFWDL, 0x00); + + tmp = rtwn_read_1(sc, R88E_32K_CTRL); + rtwn_write_1(sc, R88E_32K_CTRL, (tmp & (~0x01))); + + /* Power sequence: NIC Disable flow */ + rtwn_setbits_1(sc, 0x1f, 0xff, 0x0); + rtwn_setbits_1(sc, 0x23, 0x10, 0x10); + rtwn_setbits_1(sc, 0x5, 0x2, 0x2); + r88ee_pwrseq_polling(sc, 0x5, 0x2, 0x0); + rtwn_setbits_1(sc, 0x26, 0x80, 0x80); + /* End of power sequence */ + + tmp = rtwn_read_1(sc, R92C_RSV_CTRL+1); + rtwn_write_1(sc, R92C_RSV_CTRL+1, (tmp & (~0x08))); + tmp = rtwn_read_1(sc, R92C_RSV_CTRL+1); + rtwn_write_1(sc, R92C_RSV_CTRL+1, (tmp | 0x08)); + + rtwn_write_1(sc, R92C_RSV_CTRL, 0x0E); + + tmp = rtwn_read_1(sc, R92C_GPIO_IN); + rtwn_write_1(sc, R92C_GPIO_OUT, tmp); + rtwn_write_1(sc, R92C_GPIO_IO_SEL, 0x7F); + + tmp = rtwn_read_1(sc, R92C_GPIO_IO_SEL); + rtwn_write_1(sc, R92C_GPIO_IO_SEL, (tmp << 4) | tmp); + tmp = rtwn_read_1(sc, R92C_GPIO_IO_SEL+1); + rtwn_write_1(sc, R92C_GPIO_IO_SEL+1, tmp | 0x0F); + + rtwn_write_4(sc, R88EE_GPIO_IO_SEL_2+2, 0x00080808); +} + +void +r88ee_init_ampdu(struct rtwn_softc *sc) +{ + /* Not implemented */ +} + +void +r88ee_post_init(struct rtwn_softc *sc) +{ + rtwn_write_2(sc, R92C_FWHW_TXQ_CTRL, + 0x1f00 | R92C_FWHW_TXQ_CTRL_AMPDU_RTY_NEW); + + rtwn_write_1(sc, R92C_BCN_MAX_ERR, 0xff); + + /* Perform LO and IQ calibrations. */ + rtwn_iq_calib(sc); + /* Perform LC calibration. */ + rtwn_lc_calib(sc); + + r92c_pa_bias_init(sc); + + /* Fix for lower temperature. */ + rtwn_write_1(sc, 0x15, 0xe9); + +#ifndef RTWN_WITHOUT_UCODE + if (sc->sc_flags & RTWN_FW_LOADED) { + struct r92c_softc *rs = sc->sc_priv; + + if (sc->sc_ratectl_sysctl == RTWN_RATECTL_FW) { + /* XXX TODO: fix (see comment in r92cu_init.c) */ + sc->sc_ratectl = RTWN_RATECTL_NET80211; + } else + sc->sc_ratectl = sc->sc_ratectl_sysctl; + + /* Start C2H event handling. */ + callout_reset(&rs->rs_c2h_report, rs->rs_c2h_timeout, + r92c_handle_c2h_report, sc); + } else +#endif + sc->sc_ratectl = RTWN_RATECTL_NONE; +} + +void +r88ee_init_rx_agg(struct rtwn_softc *sc) { + struct rtwn_pci_softc *pc = sc->sc_priv; + + uint16_t tmp; + + tmp = rtwn_read_2(sc, R88EE_TRXDMA_CTRL); + tmp &= 0xf; + tmp |= 0xE771; + rtwn_write_2(sc, R88EE_TRXDMA_CTRL, tmp); + + rtwn_write_4(sc, R92C_RCR, sc->rcr); + rtwn_write_2(sc, R92C_RXFLTMAP2, 0xffff); + rtwn_write_4(sc, R92C_TCR, pc->tcr); + + rtwn_write_1(sc, R92C_PCIE_CTRL_REG+1, 0); + +} diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee_priv.h b/sys/dev/rtwn/rtl8188e/pci/r88ee_priv.h new file mode 100644 index 00000000000..b94150658a4 --- /dev/null +++ b/sys/dev/rtwn/rtl8188e/pci/r88ee_priv.h @@ -0,0 +1,236 @@ +/* $OpenBSD: if_rtwnreg.h,v 1.3 2015/06/14 08:02:47 stsp Exp $ */ + +/*- + * Copyright (c) 2018 Farhan Khan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef R88EE_PRIV_H +#define R88EE_PRIV_H + +#include + +/* + * RF initialization values. + */ +static const uint8_t rtl8188ee_rf_regs0[] = { + 0x000, 0x008, 0x018, 0x019, 0x01E, + 0x01F, 0x02F, 0x03F, 0x042, 0x057, + 0x058, 0x067, 0x083, 0x0B0, 0x0B1, + 0x0B2, 0x0B4, 0x0B6, 0x0B7, 0x0B8, + 0x0B9, 0x0BA, 0x0BB, 0x0BF, 0x0C2, + 0x0C3, 0x0C4, 0x0C5, 0x0C6, 0x0C7, + 0x0C8, 0x0C9, 0x0CA, 0x0DF, 0x0EF, + 0x051, 0x052, 0x053, 0x056, 0x035, + 0x035, 0x035, 0x036, 0x036, 0x036, + 0x036, 0x0B6, 0x018, 0x05A, 0x019, + 0x034, 0x034, 0x034, 0x034, 0x034, + 0x034, 0x034, 0x034, 0x034, 0x034, + 0x034, 0x000, 0x084, 0x086, 0x087, + 0x08E, 0x08F, 0x0EF, 0x03B, 0x03B, + 0x03B, 0x03B, 0x03B, 0x03B, 0x03B, + 0x03B, 0x03B, 0x03B, 0x03B, 0x03B, + + 0x03B, 0x03B, 0x03B, 0x03B, 0x0EF, + 0x000, 0x018, 0x0F9, 0x0F9, 0x01E, + 0x0F9, 0x0F9, 0x01E, 0x01F, 0x000 + +}; + +static const uint32_t rtl8188ee_rf_vals0[] = { + 0x00030000, 0x00084000, 0x00000407, 0x00000012, 0x00080009, + 0x00000880, 0x0001A060, 0x00000000, 0x000060C0, 0x000D0000, + 0x000BE180, 0x00001552, 0x00000000, 0x000FF8FC, 0x00054400, + 0x000CCC19, 0x00043003, 0x0004953E, 0x0001C718, 0x000060FF, + 0x00080001, 0x00040000, 0x00000400, 0x000C0000, 0x00002400, + 0x00000009, 0x00040C91, 0x00099999, 0x000000A3, 0x00088820, + 0x00076C06, 0x00000000, 0x00080000, 0x00000180, 0x000001A0, + 0x0006B27D, 0x0007E49D, 0x00000073, 0x00051FF3, 0x00000086, + 0x00000186, 0x00000286, 0x00001C25, 0x00009C25, 0x00011C25, + 0x00019C25, 0x00048538, 0x00000C07, 0x0004BD00, 0x000739D0, + 0x0000ADF3, 0x00009DF0, 0x00008DED, 0x00007DEA, 0x00006DE7, + 0x000054EE, 0x000044EB, 0x000034E8, 0x0000246B, 0x00001468, + 0x0000006D, 0x00030159, 0x00068200, 0x000000CE, 0x00048A00, + 0x00065540, 0x00088000, 0x000020A0, 0x000F02B0, 0x000EF7B0, + 0x000D4FB0, 0x000CF060, 0x000B0090, 0x000A0080, 0x00090080, + 0x0008F780, 0x000722B0, 0x0006F7B0, 0x00054FB0, 0x0004F060, + 0x00030090, 0x00020080, 0x00010080, 0x0000F780, 0x000000A0, + + 0x00010159, 0x0000F407, 0x0000C350, 0x0000C350, 0x00080003, + 0x0000C350, 0x0000C350, 0x00000001, 0x00080000, 0x00033e60 +}; + +_Static_assert(nitems(rtl8188ee_rf_regs0) == nitems(rtl8188ee_rf_vals0), + "rtl8188ee_rf_regs0 and rtl8188ee_rf_vals0 must be the same size!"); + + +static const struct rtwn_rf_prog rtl8188ee_rf[] = { + { + nitems(rtl8188ee_rf_regs0), + rtl8188ee_rf_regs0, + rtl8188ee_rf_vals0, + { 0x0 }, + NULL, + }, + { 0, NULL, NULL, { 0 }, NULL } +}; + +/* + * MAC initialization values. + */ +static const struct rtwn_mac_prog rtl8188ee_mac[] = { + { 0x026, 0x41 }, { 0x027, 0x35 }, { 0x428, 0x0A }, { 0x429, 0x10 }, + { 0x430, 0x00 }, { 0x431, 0x01 }, { 0x432, 0x02 }, { 0x433, 0x04 }, + { 0x434, 0x05 }, { 0x435, 0x06 }, { 0x436, 0x07 }, { 0x437, 0x08 }, + { 0x438, 0x00 }, { 0x439, 0x00 }, { 0x43A, 0x01 }, { 0x43B, 0x02 }, + { 0x43C, 0x04 }, { 0x43D, 0x05 }, { 0x43E, 0x06 }, { 0x43F, 0x07 }, + { 0x440, 0x5D }, { 0x441, 0x01 }, { 0x442, 0x00 }, { 0x444, 0x15 }, + { 0x445, 0xF0 }, { 0x446, 0x0F }, { 0x447, 0x00 }, { 0x458, 0x41 }, + { 0x459, 0xA8 }, { 0x45A, 0x72 }, { 0x45B, 0xB9 }, { 0x460, 0x66 }, + { 0x461, 0x66 }, { 0x480, 0x08 }, { 0x4C8, 0xFF }, { 0x4C9, 0x08 }, + { 0x4CC, 0xFF }, { 0x4CD, 0xFF }, { 0x4CE, 0x01 }, { 0x4D3, 0x01 }, + { 0x500, 0x26 }, { 0x501, 0xA2 }, { 0x502, 0x2F }, { 0x503, 0x00 }, + { 0x504, 0x28 }, { 0x505, 0xA3 }, { 0x506, 0x5E }, { 0x507, 0x00 }, + { 0x508, 0x2B }, { 0x509, 0xA4 }, { 0x50A, 0x5E }, { 0x50B, 0x00 }, + { 0x50C, 0x4F }, { 0x50D, 0xA4 }, { 0x50E, 0x00 }, { 0x50F, 0x00 }, + { 0x512, 0x1C }, { 0x514, 0x0A }, { 0x516, 0x0A }, { 0x525, 0x4F }, + { 0x550, 0x10 }, { 0x551, 0x10 }, { 0x559, 0x02 }, { 0x55D, 0xFF }, + { 0x605, 0x30 }, { 0x608, 0x0E }, { 0x609, 0x2A }, { 0x620, 0xFF }, + { 0x621, 0xFF }, { 0x622, 0xFF }, { 0x623, 0xFF }, { 0x624, 0xFF }, + { 0x625, 0xFF }, { 0x626, 0xFF }, { 0x627, 0xFF }, { 0x652, 0x20 }, + { 0x63C, 0x0A }, { 0x63D, 0x0A }, { 0x63E, 0x0E }, { 0x63F, 0x0E }, + { 0x640, 0x40 }, { 0x66E, 0x05 }, { 0x700, 0x21 }, { 0x701, 0x43 }, + { 0x702, 0x65 }, { 0x703, 0x87 }, { 0x708, 0x21 }, { 0x709, 0x43 }, + { 0x70A, 0x65 }, { 0x70B, 0x87 } +}; + +/* + * Baseband initialization values. + */ +static const uint16_t rtl8188ee_bb_phy_regs0[] = { + 0x800, 0x804, 0x808, 0x80C, 0x810, 0x814, 0x818, 0x81C, 0x820, + 0x824, 0x828, 0x82C, 0x830, 0x834, 0x838, 0x83C, 0x840, 0x844, + 0x848, 0x84C, 0x850, 0x854, 0x858, 0x85C, 0x860, 0x864, 0x868, + 0x86C, 0x870, 0x874, 0x878, 0x87C, 0x880, 0x884, 0x888, 0x88C, + 0x890, 0x894, 0x898, 0x89C, 0x900, 0x904, 0x908, 0x90C, 0x910, + 0x914, 0xA00, 0xA04, 0xA08, 0xA0C, 0xA10, 0xA14, 0xA18, 0xA1C, + 0xA20, 0xA24, 0xA28, 0xA2C, 0xA70, 0xA74, 0xA78, 0xA7C, 0xA80, + 0xB2C, 0xC00, 0xC04, 0xC08, 0xC0C, 0xC10, 0xC14, 0xC18, 0xC1C, + 0xC20, 0xC24, 0xC28, 0xC2C, 0xC30, 0xC34, 0xC38, 0xC3C, 0xC40, + 0xC44, 0xC48, 0xC4C, 0xC50, 0xC54, 0xC58, 0xC5C, 0xC60, 0xC64, + 0xC68, 0xC6C, 0xC70, 0xC74, 0xC78, 0xC7C, 0xC80, 0xC84, 0xC88, + 0xC8C, 0xC90, 0xC94, 0xC98, 0xC9C, 0xCA0, 0xCA4, 0xCA8, 0xCAC, + 0xCB0, 0xCB4, 0xCB8, 0xCBC, 0xCC0, 0xCC4, 0xCC8, 0xCCC, 0xCD0, + 0xCD4, 0xCD8, 0xCDC, 0xCE0, 0xCE4, 0xCE8, 0xCEC, 0xD00, 0xD04, + 0xD08, 0xD0C, 0xD10, 0xD14, 0xD18, 0xD2C, 0xD30, 0xD34, 0xD38, + 0xD3C, 0xD40, 0xD44, 0xD48, 0xD4C, 0xD50, 0xD54, 0xD58, 0xD5C, + 0xD60, 0xD64, 0xD68, 0xD6C, 0xD70, 0xD74, 0xD78, 0xE00, 0xE04, + 0xE08, 0xE10, 0xE14, 0xE18, 0xE1C, 0xE28, 0xE30, 0xE34, 0xE38, + 0xE3C, 0xE40, 0xE44, 0xE48, 0xE4C, 0xE50, 0xE54, 0xE58, 0xE5C, + 0xE60, 0xE68, 0xE6C, 0xE70, 0xE74, 0xE78, 0xE7C, 0xE80, 0xE84, + 0xE88, 0xE8C, 0xED0, 0xED4, 0xED8, 0xEDC, 0xEE0, 0xEEC, 0xF14, + 0xF4C, 0xF00 +}; + +static const uint32_t rtl8188ee_bb_phy_vals0[] = { + 0x80040000, 0x00000003, 0x0000FC00, 0x0000000A, 0x10001331, + 0x020C3D10, 0x02200385, 0x00000000, 0x01000100, 0x00390204, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00010000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x569A11A9, 0x01000014, 0x66F60110, + 0x061F0649, 0x00000000, 0x27272700, 0x07000760, 0x25004000, + 0x00000808, 0x00000000, 0xB0000C1C, 0x00000001, 0x00000000, + 0xCCC000C0, 0x00000800, 0xFFFFFFFE, 0x40302010, 0x00706050, + 0x00000000, 0x00000023, 0x00000000, 0x81121111, 0x00000002, + 0x00000201, 0x00D047C8, 0x80FF000C, 0x8C838300, 0x2E7F120F, + 0x9500BB78, 0x1114D028, 0x00881117, 0x89140F00, 0x1A1B0000, + 0x090E1317, 0x00000204, 0x00D30000, 0x101FBF00, 0x00000007, + 0x00000900, 0x225B0606, 0x218075B1, 0x80000000, 0x48071D40, + 0x03A05611, 0x000000E4, 0x6C6C6C6C, 0x08800000, 0x40000100, + 0x08800000, 0x40000100, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x69E9AC47, 0x469652AF, 0x49795994, 0x0A97971C, + 0x1F7C403F, 0x000100B7, 0xEC020107, 0x007F037F, 0x69553420, + 0x43BC0094, 0x00013169, 0x00250492, 0x00000000, 0x7112848B, + 0x47C00BFF, 0x00000036, 0x2C7F000D, 0x020610DB, 0x0000001F, + 0x00B91612, 0x390000E4, 0x20F60000, 0x40000100, 0x20200000, + 0x00091521, 0x00000000, 0x00121820, 0x00007F7F, 0x00000000, + 0x000300A0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x28000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x64B22427, 0x00766932, + 0x00222222, 0x00000000, 0x37644302, 0x2F97D40C, 0x00000740, + 0x00020401, 0x0000907F, 0x20010201, 0xA0633333, 0x3333BC43, + 0x7A8F5B6F, 0xCC979975, 0x00000000, 0x80608000, 0x00000000, + 0x00127353, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x6437140A, 0x00000000, 0x00000282, 0x30032064, 0x4653DE68, + 0x04518A3C, 0x00002101, 0x2A201C16, 0x1812362E, 0x322C2220, + 0x000E3C24, 0x2D2D2D2D, 0x2D2D2D2D, 0x0390272D, 0x2D2D2D2D, + 0x2D2D2D2D, 0x2D2D2D2D, 0x2D2D2D2D, 0x00000000, 0x1000DC1F, + 0x10008C1F, 0x02140102, 0x681604C2, 0x01007C00, 0x01004800, + 0xFB000000, 0x000028D1, 0x1000DC1F, 0x10008C1F, 0x02140102, + 0x28160D05, 0x00000008, 0x001B25A4, 0x00C00014, 0x00C00014, + 0x01000014, 0x01000014, 0x01000014, 0x01000014, 0x00C00014, + 0x01000014, 0x00C00014, 0x00C00014, 0x00C00014, 0x00C00014, + 0x00000014, 0x00000014, 0x01C00014, 0x00000003, 0x00000000, + 0x00000300 +}, rtl8188ee_bb_agc_vals0[] = { + 0xFB000001, 0xFB010001, 0xFB020001, 0xFB030001, 0xFB040001, + 0xFB050001, 0xFA060001, 0xF9070001, 0xF8080001, 0xF7090001, + 0xF60A0001, 0xF50B0001, 0xF40C0001, 0xF30D0001, 0xF20E0001, + 0xF10F0001, 0xF0100001, 0xEF110001, 0xEE120001, 0xED130001, + 0xEC140001, 0xEB150001, 0xEA160001, 0xE9170001, 0xE8180001, + 0xE7190001, 0xE61A0001, 0xE51B0001, 0xE41C0001, 0xE31D0001, + 0xE21E0001, 0xE11F0001, 0x8A200001, 0x89210001, 0x88220001, + 0x87230001, 0x86240001, 0x85250001, 0x84260001, 0x83270001, + 0x82280001, 0x6B290001, 0x6A2A0001, 0x692B0001, 0x682C0001, + 0x672D0001, 0x662E0001, 0x652F0001, 0x64300001, 0x63310001, + 0x62320001, 0x61330001, 0x46340001, 0x45350001, 0x44360001, + 0x43370001, 0x42380001, 0x41390001, 0x403A0001, 0x403B0001, + 0x403C0001, 0x403D0001, 0x403E0001, 0x403F0001, 0xFB400001, + 0xFB410001, 0xFB420001, 0xFB430001, 0xFB440001, 0xFB450001, + 0xFB460001, 0xFB470001, 0xFB480001, 0xFA490001, 0xF94A0001, + 0xF84B0001, 0xF74C0001, 0xF64D0001, 0xF54E0001, 0xF44F0001, + 0xF3500001, 0xF2510001, 0xF1520001, 0xF0530001, 0xEF540001, + 0xEE550001, 0xED560001, 0xEC570001, 0xEB580001, 0xEA590001, + 0xE95A0001, 0xE85B0001, 0xE75C0001, 0xE65D0001, 0xE55E0001, + 0xE45F0001, 0xE3600001, 0xE2610001, 0xC3620001, 0xC2630001, + 0xC1640001, 0x8B650001, 0x8A660001, 0x89670001, 0x88680001, + 0x87690001, 0x866A0001, 0x856B0001, 0x846C0001, 0x676D0001, + 0x666E0001, 0x656F0001, 0x64700001, 0x63710001, 0x62720001, + 0x61730001, 0x60740001, 0x46750001, 0x45760001, 0x44770001, + 0x43780001, 0x42790001, 0x417A0001, 0x407B0001, 0x407C0001, + 0x407D0001, 0x407E0001, 0x407F0001 +}; + +static const struct rtwn_bb_prog rtl8188ee_bb[] = { + { + nitems(rtl8188ee_bb_phy_regs0), + rtl8188ee_bb_phy_regs0, + rtl8188ee_bb_phy_vals0, + { (0x01 | 0x02) }, + NULL + } +}; + +static const struct rtwn_agc_prog rtl8188ee_agc[] = { + { + nitems(rtl8188ee_bb_agc_vals0), + rtl8188ee_bb_agc_vals0, + { 0 }, + NULL + } +}; + +#endif /* R88EE_PRIV_H */ diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee_pwrseq.c b/sys/dev/rtwn/rtl8188e/pci/r88ee_pwrseq.c new file mode 100644 index 00000000000..01d16f6fc24 --- /dev/null +++ b/sys/dev/rtwn/rtl8188e/pci/r88ee_pwrseq.c @@ -0,0 +1,44 @@ +/*- + * Copyright (c) 2018 Farhan Khan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#include + +int r88ee_pwrseq_polling(struct rtwn_softc *sc, uint32_t offset, uint32_t msk, uint8_t value) +{ + uint8_t reg; + uint32_t polling; + for(polling=0;polling<5000;polling++) { + reg = rtwn_read_1(sc, offset); + reg &= msk; + if (reg == (value & msk)) + break; + else + rtwn_delay(sc, 10); + } + + if (polling > 5000) + return false; + + return true; +} + +inline void r88ee_pwrseq_delay(struct rtwn_softc *sc, uint32_t offset) +{ + rtwn_delay(sc, offset * 1000); +} + diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee_pwrseq.h b/sys/dev/rtwn/rtl8188e/pci/r88ee_pwrseq.h new file mode 100644 index 00000000000..4a920337633 --- /dev/null +++ b/sys/dev/rtwn/rtl8188e/pci/r88ee_pwrseq.h @@ -0,0 +1,53 @@ +/*- + * Copyright (c) 2018 Farhan Khan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef RTL88EE_PWRSEQ_H +#define RTL88EE_PWRSEQ_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#ifdef IEEE80211_SUPPORT_SUPERG +#include +#endif + +#include +#include + +int r88ee_pwrseq_polling(struct rtwn_softc *sc, uint32_t offset, uint32_t msk, uint8_t value); +inline void r88ee_pwrseq_delay(struct rtwn_softc *sc, uint32_t offset); + +#endif diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee_reg.h b/sys/dev/rtwn/rtl8188e/pci/r88ee_reg.h new file mode 100644 index 00000000000..d585f6284ad --- /dev/null +++ b/sys/dev/rtwn/rtl8188e/pci/r88ee_reg.h @@ -0,0 +1,121 @@ +/* $OpenBSD: if_rtwnreg.h,v 1.3 2015/06/14 08:02:47 stsp Exp $ */ + +/*- + * Copyright (c) 2010 Damien Bergamini + * Copyright (c) 2015 Stefan Sperling + * Copyright (c) 2016 Andriy Voskoboinyk + * Copyright (c) 2018 Farhan Khan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef R88EEE_REG_H +#define R88EEE_REG_H + +#include + +#define R88EE_MAX_CHAINS 4 + +/* + * MAC registers. + */ +/* System Configuration. */ +#define R88EE_PCIE_MIO_INTF 0x0e4 +#define R88EE_PCIE_MIO_INTD 0x0e8 +/* PCIe Configuration. */ +#define R88EE_PCIE_CTRL_REG 0x300 +#define R88EE_INT_MIG 0x304 +#define R88EE_BCNQ_DESA 0x308 +#define R88EE_HQ_DESA 0x310 +#define R88EE_MGQ_DESA 0x318 +#define R88EE_VOQ_DESA 0x320 +#define R88EE_VIQ_DESA 0x328 +#define R88EE_BEQ_DESA 0x330 +#define R88EE_BKQ_DESA 0x338 +#define R88EE_RX_DESA 0x340 +#define R88EE_DBI 0x348 +#define R88EE_MDIO 0x354 +#define R88EE_DBG_SEL 0x360 +#define R88EE_PCIE_HRPWM 0x361 +#define R88EE_PCIE_HCPWM 0x363 +#define R88EE_UART_CTRL 0x364 +#define R88EE_UART_TX_DES 0x370 +#define R88EE_UART_RX_DES 0x378 + +/* EDCA Registers */ +#define R88EE_SIFS_CTX 0x0514 +#define R88EE_SIFS_TRX 0x0516 +#define R88EE_SIFS_SPEC 0x0428 +#define R88EE_SIFS_SPEC_MAC 0x063A +#define R88EE_SIFS_RESP_OFDM 0x063E + +/* Bits for R88EE_GPIO_MUXCFG. */ +#define R88EE_GPIO_MUXCFG_RFKILL 0x0008 + +/* Bits for R88EE_GPIO_IO_SEL. */ +#define R88EE_GPIO_IO_SEL_2 0x0062 +#define R88EE_GPIO_IO_SEL_RFKILL 0x0008 + +/* Bits for R88EE_LEDCFG2. */ +#define R88EE_LEDCFG2_EN 0x60 +#define R88EE_LEDCFG2_DIS 0x68 + +/* Bits for R88EE_HIMR. */ +#define R88EE_IMR_ROK 0x00000001 /* receive DMA OK */ +#define R88EE_IMR_VODOK 0x00000002 /* AC_VO DMA OK */ +#define R88EE_IMR_VIDOK 0x00000004 /* AC_VI DMA OK */ +#define R88EE_IMR_BEDOK 0x00000008 /* AC_BE DMA OK */ +#define R88EE_IMR_BKDOK 0x00000010 /* AC_BK DMA OK */ +#define R88EE_IMR_TXBDER 0x00000020 /* beacon transmit error */ +#define R88EE_IMR_MGNTDOK 0x00000040 /* management queue DMA OK */ +#define R88EE_IMR_TBDOK 0x00000080 /* beacon transmit OK */ +#define R88EE_IMR_HIGHDOK 0x00000100 /* high queue DMA OK */ +#define R88EE_IMR_BDOK 0x00000200 /* beacon queue DMA OK */ +#define R88EE_IMR_ATIMEND 0x00000400 /* ATIM window end interrupt */ +#define R88EE_IMR_RDU 0x00000800 /* Rx descriptor unavailable */ +#define R88EE_IMR_RXFOVW 0x00001000 /* receive FIFO overflow */ +#define R88EE_IMR_BCNINT 0x00002000 /* beacon DMA interrupt 0 */ +#define R88EE_IMR_PSTIMEOUT 0x00004000 /* powersave timeout */ +#define R88EE_IMR_TXFOVW 0x00008000 /* transmit FIFO overflow */ +#define R88EE_IMR_TIMEOUT1 0x00010000 /* timeout interrupt 1 */ +#define R88EE_IMR_TIMEOUT2 0x00020000 /* timeout interrupt 2 */ +#define R88EE_IMR_BCNDOK1 0x00040000 /* beacon queue DMA OK (1) */ +#define R88EE_IMR_BCNDOK2 0x00080000 /* beacon queue DMA OK (2) */ +#define R88EE_IMR_BCNDOK3 0x00100000 /* beacon queue DMA OK (3) */ +#define R88EE_IMR_BCNDOK4 0x00200000 /* beacon queue DMA OK (4) */ +#define R88EE_IMR_BCNDOK5 0x00400000 /* beacon queue DMA OK (5) */ +#define R88EE_IMR_BCNDOK6 0x00800000 /* beacon queue DMA OK (6) */ +#define R88EE_IMR_BCNDOK7 0x01000000 /* beacon queue DMA OK (7) */ +#define R88EE_IMR_BCNDOK8 0x02000000 /* beacon queue DMA OK (8) */ +#define R88EE_IMR_BCNDMAINT1 0x04000000 /* beacon DMA interrupt 1 */ +#define R88EE_IMR_BCNDMAINT2 0x08000000 /* beacon DMA interrupt 2 */ +#define R88EE_IMR_BCNDMAINT3 0x10000000 /* beacon DMA interrupt 3 */ +#define R88EE_IMR_BCNDMAINT4 0x20000000 /* beacon DMA interrupt 4 */ +#define R88EE_IMR_BCNDMAINT5 0x40000000 /* beacon DMA interrupt 5 */ +#define R88EE_IMR_BCNDMAINT6 0x80000000 /* beacon DMA interrupt 6 */ +#define R88EE_HIMR 0xb0 +#define R88EE_ISR 0xb4 +#define R88EE_HIMRE 0xb8 +#define R88EE_HISRE 0xbc + +/* Shortcut. */ +#define R88EE_IBSS_INT_MASK \ + (R88EE_IMR_BCNINT | R88EE_IMR_TBDOK | R88EE_IMR_TBDER) + +/* Power On/Off DMA */ +#define R88EE_RXDMA_CONTROL 0x0286 +#define R88EE_TRXDMA_CTRL 0x010C + +#endif /* R99EE_REG_H */ diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee_rf.c b/sys/dev/rtwn/rtl8188e/pci/r88ee_rf.c new file mode 100644 index 00000000000..3f4e2e3d607 --- /dev/null +++ b/sys/dev/rtwn/rtl8188e/pci/r88ee_rf.c @@ -0,0 +1,106 @@ +/*- + * Copyright (c) 2017 Farhan Khan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_wlan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include + +uint32_t +r88ee_rf_read(struct rtwn_softc *sc, int chain, uint8_t addr) +{ + struct r92c_softc *rs = sc->sc_priv; + uint32_t reg[R88EE_MAX_CHAINS], val; + + reg[0] = rtwn_bb_read(sc, R92C_HSSI_PARAM2(0)); + + if (chain != 0) + reg[chain] = rtwn_bb_read(sc, R92C_HSSI_PARAM2(chain)); + else + reg[chain] = reg[0]; + + + rtwn_bb_write(sc, R92C_HSSI_PARAM2(0), + reg[0] & ~R92C_HSSI_PARAM2_READ_EDGE); + rtwn_delay(sc, rs->rf_read_delay[1]); + + rtwn_bb_write(sc, R92C_HSSI_PARAM2(chain), + (reg[chain] & (~R92C_HSSI_PARAM2_READ_ADDR_M)) | + (addr << 23) | R92C_HSSI_PARAM2_READ_EDGE); + rtwn_delay(sc, rs->rf_read_delay[2]); + + if (rtwn_bb_read(sc, R92C_HSSI_PARAM1(chain)) & R92C_HSSI_PARAM1_PI) + val = rtwn_bb_read(sc, R92C_HSPI_READBACK(chain)); + else + val = rtwn_bb_read(sc, R92C_LSSI_READBACK(chain)); + + return val; +} + +void +r88ee_rf_write(struct rtwn_softc *sc, int chain, uint8_t addr, + uint32_t val) +{ + rtwn_bb_write(sc, R92C_LSSI_PARAM(chain), + ((addr << R92C_LSSI_PARAM_ADDR_S) | + (val & R92C_LSSI_PARAM_DATA_M)) & 0x0fffffff); +} diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee_rx.c b/sys/dev/rtwn/rtl8188e/pci/r88ee_rx.c new file mode 100644 index 00000000000..09c566d37a2 --- /dev/null +++ b/sys/dev/rtwn/rtl8188e/pci/r88ee_rx.c @@ -0,0 +1,139 @@ +/*- + * Copyright (c) 2017 Farhan Khan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_wlan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include + +int +r88ee_classify_intr(struct rtwn_softc *sc, void *arg, int len __unused) +{ + uint32_t status; + uint32_t statusb; + int *rings = arg; + int ret; + + *rings = 0; + + rtwn_write_4(sc, R88EE_HIMR, 0x0); + rtwn_write_4(sc, R88EE_HIMRE, 0x0); + + status = rtwn_read_4(sc, R88EE_ISR) & 0x200084ff; + rtwn_write_4(sc, R88EE_ISR, status); + statusb = rtwn_read_4(sc, R88EE_HISRE) & 0x100; + rtwn_write_4(sc, R88EE_HISRE, statusb); + + if (!status || statusb == 0xffff) { + return 0; + } + + /* Ack interrupts. */ + if (statusb & R92C_IMR_BDOK) + *rings |= (1 << RTWN_PCI_BEACON_QUEUE); + if (statusb & R92C_IMR_HIGHDOK) + *rings |= (1 << RTWN_PCI_HIGH_QUEUE); + if (statusb & R92C_IMR_MGNTDOK) + *rings |= (1 << RTWN_PCI_MGNT_QUEUE); + if (statusb & R92C_IMR_BKDOK) + *rings |= (1 << RTWN_PCI_BK_QUEUE); + if (statusb & R92C_IMR_BEDOK) + *rings |= (1 << RTWN_PCI_BE_QUEUE); + if (statusb & R92C_IMR_VIDOK) + *rings |= (1 << RTWN_PCI_VI_QUEUE); + if (statusb & R92C_IMR_VODOK) + *rings |= (1 << RTWN_PCI_VO_QUEUE); + + ret = 0; + if (status & R92C_IMR_RXFOVW) + ret |= RTWN_PCI_INTR_RX_OVERFLOW; + if (status & R92C_IMR_RDU) + ret |= RTWN_PCI_INTR_RX_DESC_UNAVAIL; + if (status & R92C_IMR_ROK) + ret |= RTWN_PCI_INTR_RX_DONE; + if (status & R92C_IMR_TXFOVW) + ret |= RTWN_PCI_INTR_TX_OVERFLOW; + if (status & R92C_IMR_PSTIMEOUT) + ret |= RTWN_PCI_INTR_PS_TIMEOUT; + + return (ret); +} + +void +r88ee_enable_intr(struct rtwn_pci_softc *pc) +{ + struct rtwn_softc *sc = &pc->pc_sc; + + /* Enable interrupts */ + rtwn_write_4(sc, R88EE_HIMR, 0x200084ff); + rtwn_write_4(sc, R88EE_HIMRE, 0x100); + + /* there are some C2H CMDs have been sent + * before system interrupt is enabled, e.g., C2H, CPWM. + * So we need to clear all C2H events that FW has notified, + * otherwise FW won't schedule any commands anymore. + */ + rtwn_write_1(sc, 0x01AF, 0); + /*enable system interrupt*/ + rtwn_write_4(sc, 0x0058, 0xC0); +} + +void +r88ee_start_xfers(struct rtwn_softc *sc) +{ + rtwn_write_4(sc, 0x00B0, 0x200084ff); + rtwn_write_4(sc, 0x00B8, 0x100); + rtwn_write_1(sc, 0x01AF, 0x0); + rtwn_write_4(sc, 0x0058, 0xc0); +} + +#undef R88EE_INT_ENABLE diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee_tx.c b/sys/dev/rtwn/rtl8188e/pci/r88ee_tx.c new file mode 100644 index 00000000000..62f055ae279 --- /dev/null +++ b/sys/dev/rtwn/rtl8188e/pci/r88ee_tx.c @@ -0,0 +1,111 @@ +/* $OpenBSD: if_rtwn.c,v 1.6 2015/08/28 00:03:53 deraadt Exp $ */ + +/*- + * Copyright (c) 2010 Damien Bergamini + * Copyright (c) 2015 Stefan Sperling + * Copyright (c) 2016 Andriy Voskoboinyk + * Copyright (c) 2018 Farhan Khan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_wlan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include + +#include + +#include +#include + + +void +r88ee_setup_tx_desc(struct rtwn_pci_softc *pc, void *desc, + uint32_t next_desc_addr) +{ + struct r88ee_tx_desc *txd = desc; + + /* setup tx desc */ + txd->nextdescaddr = htole32(next_desc_addr); +} + +void +r88ee_tx_postsetup(struct rtwn_pci_softc *pc, void *desc, + bus_dma_segment_t segs[]) +{ + /* Not implemented */ +} + +void +r88ee_copy_tx_desc(void *dest, const void *src) +{ + struct r88ee_tx_desc *txd = dest; + size_t len = sizeof(struct r92c_tx_desc) + + sizeof(txd->txbufsize) + sizeof(txd->pad); + + if (src != NULL) + memcpy(dest, src, len); + else + memset(dest, 0, len); +} + +void +r88ee_dump_tx_desc(struct rtwn_softc *sc, const void *desc) +{ +#ifdef RTWN_DEBUG + const struct r88ee_tx_desc *txd = desc; + + RTWN_DPRINTF(sc, RTWN_DEBUG_XMIT_DESC, + "%s: len %d, off %d, flags0 %02X, dw: 1 %08X, 2 %08X, 3 %04X " + "(seq %04X), 4 %08X, 5 %08X, 6 %08X, size %04X, pad %04X, " + "addr: %08X (64: %08X), next: %08X (64: %08X), " + "rsvd: %08X %08X %08X %08X\n", + __func__, le16toh(txd->pktlen), txd->offset, txd->flags0, + le32toh(txd->txdw1), le32toh(txd->txdw2), le16toh(txd->txdw3), + le16toh(txd->txdseq), le32toh(txd->txdw4), le32toh(txd->txdw5), + le32toh(txd->txdw6), le16toh(txd->txbufsize), le16toh(txd->pad), + le32toh(txd->txbufaddr), le32toh(txd->txbufaddr64), + le32toh(txd->nextdescaddr), le32toh(txd->nextdescaddr64), + le32toh(txd->reserved[0]), le32toh(txd->reserved[1]), + le32toh(txd->reserved[2]), le32toh(txd->reserved[3])); +#endif +} diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee_tx_desc.h b/sys/dev/rtwn/rtl8188e/pci/r88ee_tx_desc.h new file mode 100644 index 00000000000..980895b7ca2 --- /dev/null +++ b/sys/dev/rtwn/rtl8188e/pci/r88ee_tx_desc.h @@ -0,0 +1,56 @@ +/* $OpenBSD: if_rtwnreg.h,v 1.3 2015/06/14 08:02:47 stsp Exp $ */ + +/*- + * Copyright (c) 2010 Damien Bergamini + * Copyright (c) 2015 Stefan Sperling + * Copyright (c) 2016 Andriy Voskoboinyk + * Copyright (c) 2018 Farhan Khan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef R88EE_TX_DESC_H +#define R88EE_TX_DESC_H + +#include + +/* Tx MAC descriptor (PCIe). */ +struct r88ee_tx_desc { + uint16_t pktlen; + uint8_t offset; + uint8_t flags0; + + uint32_t txdw1; + uint32_t txdw2; + uint16_t txdw3; + uint16_t txdseq; + + uint32_t txdw4; + uint32_t txdw5; + uint32_t txdw6; + + uint16_t txbufsize; + uint16_t pad; + + uint32_t txbufaddr; + uint32_t txbufaddr64; + + uint32_t nextdescaddr; + uint32_t nextdescaddr64; + + uint32_t reserved[4]; +} __packed __attribute__((aligned(4))); + +#endif /* R88EE_TX_DESC_H */ diff --git a/sys/dev/rtwn/rtl8188e/r88e.h b/sys/dev/rtwn/rtl8188e/r88e.h index 3a3c0865a43..31639563dd5 100644 --- a/sys/dev/rtwn/rtl8188e/r88e.h +++ b/sys/dev/rtwn/rtl8188e/r88e.h @@ -50,6 +50,8 @@ uint8_t r88e_temp_read(struct rtwn_softc *); /* r88e_chan.c */ void r88e_get_txpower(struct rtwn_softc *, int, struct ieee80211_channel *, uint8_t[]); +void r88ee_get_txpower(struct rtwn_softc *, int, + struct ieee80211_channel *, uint8_t[]); void r88e_set_bw20(struct rtwn_softc *, uint8_t); void r88e_set_gain(struct rtwn_softc *, uint8_t); @@ -58,6 +60,7 @@ void r88e_set_gain(struct rtwn_softc *, uint8_t); int r88e_fw_cmd(struct rtwn_softc *, uint8_t, const void *, int); void r88e_fw_reset(struct rtwn_softc *, int); void r88e_fw_download_enable(struct rtwn_softc *, int); +void r88ee_fw_download_enable(struct rtwn_softc *, int); #endif void r88e_macid_enable_link(struct rtwn_softc *, int, int); void r88e_set_media_status(struct rtwn_softc *, int); @@ -68,8 +71,11 @@ int r88e_set_pwrmode(struct rtwn_softc *, struct ieee80211vap *, int); /* r88e_init.c */ void r88e_init_bb(struct rtwn_softc *); +void r88ee_init_bb(struct rtwn_softc *); void r88e_init_rf(struct rtwn_softc *); int r88e_power_on(struct rtwn_softc *); +int r88ee_power_on(struct rtwn_softc *); +int r88ee_llt_init(struct rtwn_softc *sc); /* r88e_led.c */ void r88e_set_led(struct rtwn_softc *, int, int); @@ -79,6 +85,7 @@ void r88e_rf_write(struct rtwn_softc *, int, uint8_t, uint32_t); /* r88e_rom.c */ void r88e_parse_rom(struct rtwn_softc *, uint8_t *); +void r88ee_parse_rom(struct rtwn_softc *, uint8_t *); /* r88e_rx.c */ void r88e_ratectl_tx_complete(struct rtwn_softc *, uint8_t *, int); diff --git a/sys/dev/rtwn/rtl8188e/r88e_fw.c b/sys/dev/rtwn/rtl8188e/r88e_fw.c index 4ae4abbda1d..d220baa422a 100644 --- a/sys/dev/rtwn/rtl8188e/r88e_fw.c +++ b/sys/dev/rtwn/rtl8188e/r88e_fw.c @@ -130,6 +130,27 @@ r88e_fw_download_enable(struct rtwn_softc *sc, int enable) } #endif +void +r88ee_fw_download_enable(struct rtwn_softc *sc, int enable) +{ + uint8_t tmp; + if (enable) { + tmp = rtwn_read_1(sc, R92C_SYS_FUNC_EN+1); + rtwn_write_1(sc, R92C_SYS_FUNC_EN+1, tmp | 0x04); + + tmp = rtwn_read_1(sc, R92C_MCUFWDL); + rtwn_write_1(sc, R92C_MCUFWDL, tmp | 0x01); + + tmp = rtwn_read_1(sc, R92C_MCUFWDL + 2); + rtwn_write_1(sc, R92C_MCUFWDL + 2, tmp & 0xf7); + } else { + tmp = rtwn_read_1(sc, R92C_MCUFWDL); + rtwn_write_1(sc, R92C_MCUFWDL, tmp & 0xfe); + + rtwn_write_1(sc, R92C_MCUFWDL + 1, 0x00); + } +} + void r88e_macid_enable_link(struct rtwn_softc *sc, int id, int enable) { @@ -151,7 +172,6 @@ void r88e_set_media_status(struct rtwn_softc *sc, int macid) { struct r88e_fw_cmd_msrrpt status; - if (macid & RTWN_MACID_VALID) status.msrb0 = R88E_MSRRPT_B0_ASSOC; else diff --git a/sys/dev/rtwn/rtl8188e/r88e_init.c b/sys/dev/rtwn/rtl8188e/r88e_init.c index 202cec154aa..b36c7dfaa7b 100644 --- a/sys/dev/rtwn/rtl8188e/r88e_init.c +++ b/sys/dev/rtwn/rtl8188e/r88e_init.c @@ -54,7 +54,7 @@ __FBSDID("$FreeBSD$"); #include #include - +#include static void r88e_crystalcap_write(struct rtwn_softc *sc) @@ -94,6 +94,93 @@ r88e_init_bb(struct rtwn_softc *sc) r88e_crystalcap_write(sc); } +int +r88ee_llt_init(struct rtwn_softc *sc) { + + rtwn_write_1(sc, R92C_RQPN_NPQ, 0x01); + rtwn_write_4(sc, R92C_TRXFF_BNDY, 0x80730d29); + + rtwn_write_4(sc, R92C_TRXFF_BNDY, (0x25FF0000 | sc->pktbuf_count)); + rtwn_write_1(sc, R92C_TDECTRL + 1, sc->pktbuf_count); + + rtwn_write_1(sc, R88E_TXPKTBUF_BCNQ1_BDNY, sc->pktbuf_count); + rtwn_write_1(sc, R92C_TXPKTBUF_MGQ_BDNY, sc->pktbuf_count); + + rtwn_write_1(sc, 0x45D, sc->pktbuf_count); + rtwn_write_1(sc, R92C_PBP, 0x11); + rtwn_write_1(sc, R92C_RX_DRVINFO_SZ, 0x4); + + return r92c_llt_init(sc); +} + +void +r88ee_init_bb(struct rtwn_softc *sc) +{ + uint32_t tmp; + int i, j; + + rtwn_setbits_2(sc, R92C_SYS_FUNC_EN, 0, + R92C_SYS_FUNC_EN_BBRSTB | R92C_SYS_FUNC_EN_BB_GLB_RST | + R92C_SYS_FUNC_EN_DIO_RF); + + rtwn_write_1(sc, R92C_RF_CTRL, + R92C_RF_CTRL_EN | R92C_RF_CTRL_RSTB | R92C_RF_CTRL_SDMRSTB); + + rtwn_write_1(sc, R92C_SYS_FUNC_EN, R92C_SYS_FUNC_EN_PPLL | R92C_SYS_FUNC_EN_PCIEA | + R92C_SYS_FUNC_EN_DIO_PCIE | + R92C_SYS_FUNC_EN_BB_GLB_RST | R92C_SYS_FUNC_EN_BBRSTB); + + tmp = rtwn_read_4(sc, 0x4c); + rtwn_write_4(sc, 0x4c, tmp | 0xff7fffff); + + for (i = 0; i < sc->bb_size; i++) { + const struct rtwn_bb_prog *bb_prog = &sc->bb_prog[i]; + + while(!rtwn_check_condition(sc, bb_prog->cond)) { + KASSERT(bb_prog->next != NULL, + ("%s: wrong condition value (i %d)\n", + __func__, i)); + bb_prog = bb_prog->next; + } + + for (j = 0; j < bb_prog->count; j++) { + RTWN_DPRINTF(sc, RTWN_DEBUG_RESET, + "BB: reg 0x%03x, val 0x%08x\n", + bb_prog->reg[j], bb_prog->val[j]); + + rtwn_bb_write(sc, bb_prog->reg[j], bb_prog->val[j]); + rtwn_delay(sc, 1); + } + } + + for (i = 0; i < sc->agc_size; i++) { + const struct rtwn_agc_prog *agc_prog = &sc->agc_prog[i]; + + while(!rtwn_check_condition(sc, agc_prog->cond)) { + KASSERT(agc_prog->next != NULL, + ("%s: wrong condition value (2) (i %d)\n", + __func__, i)); + agc_prog = agc_prog->next; + } + + for(j = 0; j < agc_prog->count; j++) { + RTWN_DPRINTF(sc, RTWN_DEBUG_RESET, + "AGC: val 0x%08x\n", agc_prog->val[j]); + + rtwn_bb_write(sc, R92C_OFDM0_AGCRSSITABLE, + agc_prog->val[j]); + rtwn_delay(sc, 1); + } + } + + if (rtwn_bb_read(sc, R92C_HSSI_PARAM2(0)) & R92C_HSSI_PARAM2_CCK_HIPWR) + sc->sc_flags |= RTWN_FLAG_CCK_HIPWR; + + rtwn_bb_setbits(sc, R92C_FPGA0_RFMOD, 0x1000000, 0); + rtwn_bb_setbits(sc, R92C_FPGA0_RFMOD, 0x2000000, 0); + +} + int r88e_power_on(struct rtwn_softc *sc) { diff --git a/sys/dev/rtwn/rtl8188e/r88e_rom.c b/sys/dev/rtwn/rtl8188e/r88e_rom.c index b12d7db83d4..2831bac7ed0 100644 --- a/sys/dev/rtwn/rtl8188e/r88e_rom.c +++ b/sys/dev/rtwn/rtl8188e/r88e_rom.c @@ -82,4 +82,34 @@ r88e_parse_rom(struct rtwn_softc *sc, uint8_t *buf) sc->thermal_meter = rom->thermal_meter; IEEE80211_ADDR_COPY(sc->sc_ic.ic_macaddr, rom->macaddr); + +} + +void +r88ee_parse_rom(struct rtwn_softc *sc, uint8_t *buf) +{ + struct r92c_softc *rs = sc->sc_priv; + struct rtwn_r88e_txpwr *rt = rs->rs_txpwr; + struct r88ee_rom *rom = (struct r88ee_rom *)buf; + int i; + + rt->bw20_tx_pwr_diff = RTWN_SIGN4TO8(MS(rom->rfpath[0].rfpath_24g.bw20_ofdm, HIGH_PART)); + rt->ofdm_tx_pwr_diff = RTWN_SIGN4TO8(MS(rom->rfpath[0].rfpath_24g.bw20_ofdm, LOW_PART)); + + for(i = 0; i < R88E_GROUP_2G; i++) + rt->cck_tx_pwr[i] = rom->rfpath[0].rfpath_24g.index_cck_base[i]; + for(i = 0; i < R88E_GROUP_2G - 1; i++) + rt->ht40_tx_pwr[i] = rom->rfpath[0].rfpath_24g.index_bw40_base[i]; + + rs->board_type = + MS(RTWN_GET_ROM_VAR(rom->rf_board_opt, R92C_BOARD_TYPE_DONGLE), + R92C_ROM_RF1_BOARD_TYPE); + rs->regulatory = MS(rom->rf_board_opt, R92C_ROM_RF1_REGULATORY); + + rt->bw20_tx_pwr_diff = 0; + rt->ofdm_tx_pwr_diff = 0; + + rtwn_r92c_set_name(sc); + + IEEE80211_ADDR_COPY(sc->sc_ic.ic_macaddr, rom->macaddr); } diff --git a/sys/dev/rtwn/rtl8188e/r88e_rom_image.h b/sys/dev/rtwn/rtl8188e/r88e_rom_image.h index c80028e00d6..c491f677ab9 100644 --- a/sys/dev/rtwn/rtl8188e/r88e_rom_image.h +++ b/sys/dev/rtwn/rtl8188e/r88e_rom_image.h @@ -57,4 +57,71 @@ struct r88e_rom { _Static_assert(sizeof(struct r88e_rom) == R88E_EFUSE_MAP_LEN, "R88E_EFUSE_MAP_LEN must be equal to sizeof(struct r88e_rom)!"); +/* + * RTL8188EE ROM image. + * Largely derived from this: + * http://src.illumos.org/source/xref/linux-master/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c#1576 + */ + +struct _bw40_bw20_ofdm_cck { + uint8_t bw40:4; + uint8_t bw20:4; + uint8_t ofdm:4; + uint8_t cck:4; +} __packed; + +struct _r88ee_rom_24g { + uint8_t index_cck_base[6]; + uint8_t index_bw40_base[6-1]; + uint8_t bw20_ofdm; + struct _bw40_bw20_ofdm_cck bw40_bw20_ofdm_cck[4-1]; +} __packed; + +struct _r88ee_rom_5g { + uint8_t index_bw40_base[14]; + uint8_t bw20_ofdm; + uint8_t bw40_bw20[4-1]; + uint8_t ofdm_1[2]; +} __packed; + +struct _r88ee_rf_path { + struct _r88ee_rom_24g rfpath_24g; + struct _r88ee_rom_5g rfpath_5g; +} __packed; + +struct r88ee_rom { + uint16_t id; /* Always 0x8129 */ + + uint8_t hpon[4]; + uint16_t clk; + uint8_t testr[8]; + + struct _r88ee_rf_path rfpath[4]; + + uint8_t unknown3[16]; + uint16_t channel_plan; + uint8_t xtal; + uint8_t thermal_meter; + uint8_t unknown4[5]; + uint8_t rf_board_opt; + uint8_t rf_feature_opt; + uint8_t rf_bt_setting; + uint8_t version; + uint8_t customer_id; + uint8_t reserved1[3]; + uint8_t rf_antenna_opt; + + uint8_t reserved2[6]; + uint8_t macaddr[IEEE80211_ADDR_LEN]; + uint16_t vid; + uint16_t did; + uint16_t svid; + uint16_t smid; + + uint8_t unknown5[290]; +} __packed; // Should be 512 byte + +_Static_assert(sizeof(struct r88ee_rom) == R88E_EFUSE_MAP_LEN, + "R88EE_EFUSE_MAP_LEN must be equal to sizeof(struct r88ee_rom)!"); + #endif /* R88E_ROM_IMAGE_H */ diff --git a/sys/modules/rtwn_pci/Makefile b/sys/modules/rtwn_pci/Makefile index 730991eedcd..e8110173670 100644 --- a/sys/modules/rtwn_pci/Makefile +++ b/sys/modules/rtwn_pci/Makefile @@ -17,6 +17,12 @@ SRCS += r92ce_attach.c r92ce_calib.c r92ce_fw.c r92ce_init.c r92ce_led.c \ r92ce_rx.c r92ce_tx.c \ r92ce.h r92ce_priv.h r92ce_reg.h r92ce_rx_desc.h r92ce_tx_desc.h +.PATH: ${.SRCTOP}/sys/dev/rtwn/rtl8188e/pci +SRCS += r88ee_attach.c r88ee_calib.c r88ee_init.c \ + r88ee_tx.c r88ee_pwrseq.c r88ee_rx.c r88ee_rf.c \ + r88ee.h r88ee_priv.h r88ee_reg.h r88ee_tx_desc.h \ + r88ee_pwrseq.h + opt_rtwn.h: @echo "#define RTWN_DEBUG 1" > ${.TARGET} .if ${MK_SOURCELESS_UCODE} == "no" diff --git a/sys/modules/rtwnfw/Makefile b/sys/modules/rtwnfw/Makefile index fe606bb25e5..be6eb0df6e0 100644 --- a/sys/modules/rtwnfw/Makefile +++ b/sys/modules/rtwnfw/Makefile @@ -1,6 +1,6 @@ # $FreeBSD$ SUBDIR= rtwnrtl8188eu rtwnrtl8192cT rtwnrtl8192cU rtwnrtl8192eu rtwnrtl8812au \ - rtwnrtl8821au rtwnrtl8192cE rtwnrtl8192cEB + rtwnrtl8821au rtwnrtl8192cE rtwnrtl8192cEB rtwnrtl8188ee .include diff --git a/sys/modules/rtwnfw/rtwnrtl8188ee/Makefile b/sys/modules/rtwnfw/rtwnrtl8188ee/Makefile new file mode 100644 index 00000000000..8464ab39fdf --- /dev/null +++ b/sys/modules/rtwnfw/rtwnrtl8188ee/Makefile @@ -0,0 +1,6 @@ +# $FreeBSD$ + +KMOD= rtwn-rtl8188eefw +IMG= rtwn-rtl8188eefw + +.include From owner-freebsd-wireless@freebsd.org Thu Jun 7 04:41:01 2018 Return-Path: Delivered-To: freebsd-wireless@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 69D3EFF6109 for ; Thu, 7 Jun 2018 04:41:01 +0000 (UTC) (envelope-from khanzf@gmail.com) Received: from mail-it0-x230.google.com (mail-it0-x230.google.com [IPv6:2607:f8b0:4001:c0b::230]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id BB9F07D2D3 for ; Thu, 7 Jun 2018 04:40:40 +0000 (UTC) (envelope-from khanzf@gmail.com) Received: by mail-it0-x230.google.com with SMTP id 76-v6so11152610itx.4 for ; Wed, 06 Jun 2018 21:40:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=xNa5Gj9A417xnbZGm7Hs98U5NCpJs9ig4rF5FXCRuPo=; b=PdYWWnSStJek+R3znTjMBbhqVr+SgTQepelG+4mpxEPAMFe+BUK8Dt11w2wKoguvAj 1f2jdY5Qv1hrOixCllAh9aekC69Jsap2d8O38NdUHA2gItq6Riv31XDE/1onaxxYKOam reBpbdM/5lRR/eMFjB4utCiK1tvHeKZdREi34SnCIu2LkoXKw1D68TnTpRnBP6zM3f2E BbAHX0ymCq+cV82rHodZybvbUcjwpLyXgrpfB0R7tc3MQ3jScBv/q7CrMDuXcq24jRY+ 5ccU5VyyKjHO/0DFPaZZsF1BR5Daw1nPCzN47YKVwxrLfJSgKWCn7QE10YjSkrR1QuU6 eddQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=xNa5Gj9A417xnbZGm7Hs98U5NCpJs9ig4rF5FXCRuPo=; b=F3Rm3bNsTc0QmwD7ZcUtL/Ni53GG1n3kJuoeG/OTW3rAbBbvydt6erkvYto1Q8agUc Oz04Qd8DDtZYHNzNVxmjzOoy5OSM33NbVMLqpTclu0zEA1vDSH0hFc44cuG+a3krXEo4 PPfGdGcw3Zi0DvHWAZU52UHaBldSPDSUljGuV82qwWtVzsquJ49QvUuQQcCm5c4bJWFp efkj/4xtG/p6UX2U+DSdhE/8rZp4uqu8UsoSNVjbIAwDSn8HLYu1BOW//Z1ZQJoch+uF J4jDIgdBFxP21Dw4hu8FpU6foyaY2wxOo40XMQq3gi/8IwZmyZinw3YONzdhBUmKt1Fg 2law== X-Gm-Message-State: APt69E3NJNfxYpIP4YH77/z1cgnMxT8jvI5wxf8athY1InVpXavacZYl 6TM60bLYf2c0S7AjGIqj/Cylt0CrHp5vYKMoahph4IN5 X-Google-Smtp-Source: ADUXVKIWZLToT3aggMrYsJAG8Y2fmXw1yaqT2D+olIv9Xlp+yZ8CvVR3PQACb1fXwdgs6jnDgJIQtT+7++me84LVJ9g= X-Received: by 2002:a24:ee4b:: with SMTP id b72-v6mr517608iti.43.1528346439747; Wed, 06 Jun 2018 21:40:39 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:ac0:a148:0:0:0:0:0 with HTTP; Wed, 6 Jun 2018 21:40:19 -0700 (PDT) From: Farhan Khan Date: Thu, 7 Jun 2018 00:40:19 -0400 Message-ID: Subject: Ignoring R92C_C2H_EVT_DEBUG patch To: freebsd-wireless@freebsd.org Content-Type: text/plain; charset="UTF-8" X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 07 Jun 2018 04:41:01 -0000 Quick patch to rtwn's signal handling. Ignoring R92C_C2H_EVT_DEBUG interrupts rtl8188ee sends debugging interrupts a few times a second, which contain no information. Linux's rtl8723ae also ignores this signal. Currently, rtl8188ee prints endless C2H unhandled reports to the kernel messages, such as this: rtwn0: r92c_handle_c2h_task: C2H report 0 (len 0) was not handled rtwn0: r92c_handle_c2h_task: C2H report 0 (len 0) was not handled rtwn0: r92c_handle_c2h_task: C2H report 0 (len 0) was not handled ..... My associated git commit is located here: https://gitlab.com/farhankhan/freebsd/commit/9f9ff4bd883a88788376876fb09bac017dbb13e2 ============================================================================== diff --git a/sys/dev/rtwn/rtl8192c/r92c_fw.c b/sys/dev/rtwn/rtl8192c/r92c_fw.c index 0791990a0c00..14e517636c14 100644 --- a/sys/dev/rtwn/rtl8192c/r92c_fw.c +++ b/sys/dev/rtwn/rtl8192c/r92c_fw.c @@ -477,6 +477,8 @@ r92c_handle_c2h_task(struct rtwn_softc *sc, union sec_param *data) __func__, i, sizeof(buf))); switch (id) { + case R92C_C2H_EVT_DEBUG: + break; case R92C_C2H_EVT_TX_REPORT: r92c_ratectl_tx_complete(sc, (uint8_t *)buf, len); break; ============================================================================== Thanks -- Farhan Khan PGP Fingerprint: B28D 2726 E2BC A97E 3854 5ABE 9A9F 00BC D525 16EE From owner-freebsd-wireless@freebsd.org Thu Jun 7 23:54:07 2018 Return-Path: Delivered-To: freebsd-wireless@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 9985E1007AE6 for ; Thu, 7 Jun 2018 23:54:07 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from mailman.ysv.freebsd.org (mailman.ysv.freebsd.org [IPv6:2001:1900:2254:206a::50:5]) by mx1.freebsd.org (Postfix) with ESMTP id 0499E86BC0 for ; Thu, 7 Jun 2018 23:54:07 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: by mailman.ysv.freebsd.org (Postfix) id B24E81007AE1; Thu, 7 Jun 2018 23:54:06 +0000 (UTC) Delivered-To: wireless@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 9F9E91007AE0 for ; Thu, 7 Jun 2018 23:54:06 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from mxrelay.ysv.freebsd.org (mxrelay.ysv.freebsd.org [IPv6:2001:1900:2254:206a::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.ysv.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 3B5B086BB8 for ; Thu, 7 Jun 2018 23:54:06 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.ysv.freebsd.org (Postfix) with ESMTPS id 8CA7C1D3FE for ; Thu, 7 Jun 2018 23:54:05 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id w57Ns5Ie051507 for ; Thu, 7 Jun 2018 23:54:05 GMT (envelope-from bugzilla-noreply@freebsd.org) Received: (from www@localhost) by kenobi.freebsd.org (8.15.2/8.15.2/Submit) id w57Ns5cc051506 for wireless@FreeBSD.org; Thu, 7 Jun 2018 23:54:05 GMT (envelope-from bugzilla-noreply@freebsd.org) X-Authentication-Warning: kenobi.freebsd.org: www set sender to bugzilla-noreply@freebsd.org using -f From: bugzilla-noreply@freebsd.org To: wireless@FreeBSD.org Subject: [Bug 228787] Intel 7260 bluetooth broken. Date: Thu, 07 Jun 2018 23:54:05 +0000 X-Bugzilla-Reason: AssignedTo X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 11.1-STABLE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Some People X-Bugzilla-Who: linimon@FreeBSD.org X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: wireless@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: assigned_to Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 07 Jun 2018 23:54:07 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D228787 Mark Linimon changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|bugs@FreeBSD.org |wireless@FreeBSD.org --=20 You are receiving this mail because: You are the assignee for the bug.=