From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on0058.outbound.protection.outlook.com [104.47.36.58]) by dpdk.org (Postfix) with ESMTP id B5EA0D326 for ; Sat, 25 Mar 2017 07:27:19 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=H+H1381jHU/CWuKimZAoyM6u3mKAnAb4R9CItrxDcms=; b=jNmfwQQB6PaOTkpAFLvTLp3TDaXArDjO7334mviLTgFdZWcZIS/B+pAlTaRqVl2FNx26bdY/YJEOYmaRVOwya/jMytkOv/76mFYTWvC7WHZEZqM4GChYMjfqgzwxKKe0NDu4yLp6NPTr3xdxMLtoRqUbAawnTUvkPFNe5aCzl1E= Authentication-Results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=caviumnetworks.com; Received: from lio357.in.caveonetworks.com (14.140.2.178) by CY1PR07MB2280.namprd07.prod.outlook.com (10.164.112.158) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.977.11; Sat, 25 Mar 2017 06:27:15 +0000 From: Shijith Thotton To: Ferruh Yigit Cc: dev@dpdk.org, Jerin Jacob , Derek Chickles , Venkat Koppula , Srisivasubramanian S , Mallesham Jatharakonda Date: Sat, 25 Mar 2017 11:54:19 +0530 Message-Id: <1490423097-6797-9-git-send-email-shijith.thotton@caviumnetworks.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1490423097-6797-1-git-send-email-shijith.thotton@caviumnetworks.com> References: <1488454371-3342-1-git-send-email-shijith.thotton@caviumnetworks.com> <1490423097-6797-1-git-send-email-shijith.thotton@caviumnetworks.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [14.140.2.178] X-ClientProxiedBy: BM1PR01CA0117.INDPRD01.PROD.OUTLOOK.COM (10.174.208.33) To CY1PR07MB2280.namprd07.prod.outlook.com (10.164.112.158) X-MS-Office365-Filtering-Correlation-Id: e6c58802-a317-423f-1c4c-08d47347fc75 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:CY1PR07MB2280; X-Microsoft-Exchange-Diagnostics: 1; CY1PR07MB2280; 3:wJkzvll4+Fk7Mr3oQnKBt6szzrJpwzDsvXungJG9iPQC9bWb75ZwnvEDOdtEneWo5GRERjuVaMcRxe79FxzBFrNySoBLgXdtAAw/SI7bE1qjyh3quGqRcOlzz2K6O/dExxrwgEZupjCdvachNDTE2RHrbsqrKzomVvJg1XVJg8vlMHmU/zqqmvGSULzx9Xc1n+hHKLyl3x7KIsYBxSgPDzdtTGmidS+L3s0RtszwAoUmcvAsJGYMp/NvN37LayqMW5bQenSZLfdHmLIJFj+4jQ==; 25:+PNx11K2mt6o0IUE4m6pcD9tHMYmDiRwRgeM/8GZWSxWE4UU0eGrWVaGpmYPT9KyZCb0wle9v+DrI4pWt4Lp4YBgRJqrDvpL/dBYikUvSaTHl3E0H9ga2vAIxgnEzm9t6Hf7ZSrbtfxIBMy6dIY9HEViGdkIfUVyqtOBoo8t18sKTgYc54FZ2U018C/U4RzCtGTz+9B2pKoNIajH9aAKr4nfZLeBzLJ1zC1SRQZWUAJnifvN6dhtmtt4qT2rfu7NqzJJaIuY+f9lkw8Oga090v9f7oSq19kwcjssoz3K5oWYPZ21OiYwq9xwQIrDHsyZYHXRrmbeIz78eKrGDCbXW39lrRlcVNEgTpLgLN2lw1dSOSI5Dw2MmQC8Au81/4kXO2rEqFv7nheR0C1jj6r/+nRtB/P9NDdpFKQKiPg0bHCrBCPK908Y6AuHuWQjWZN6bmYETSi6CYzMlHnM/WC+SQ== X-Microsoft-Exchange-Diagnostics: 1; CY1PR07MB2280; 31:qZZToR2S8EKF5KYlXNJXI2FRgDr0SapvHuZdr6GdeGmgY/FRgZXhG1KGTsGwsrfhvAygcw+Eose1oh486GsNARFg4nvMN0dMkZ+xzYCqS74+aqY3N318RUQM101CEpg2lthhk/wqwbQJNfzt9SGvCDG094ljDzrxwt8TitXg5JHiWs+uDkwXhxnAAYK8XTwCXuY4v+tsylPz4jWeu6u+DMIxNj/V+7ehRa/tE+bE+zLkOzdPsBKIH2eaaw1PeMsN; 20:Yg0iWiu7k17UpdyaqTjVFp6fcCgQ2K3iZ9TduJuvwlYPNebezYunP6rykYPiziOz1SYmAQx/IBViQi0lGqGNesGYbMgMbfgzg2n1SYTF4MTKNV5zQ2HtEwhafb0M75Aw97qndhykI3zmI1tpDdC5Q2sJ2B3j8vLwvEzTuDl5bmCXDQM3skC41AeF0nO8n5GLdakIG7ZrGWmJBkmRAX9ID67oWDwV92fAKlnNdN1gw4dZAe3sCbuBvn03Aj53tRoIvU3sYGBwN/xfTB6SUE76ZCQwW37ZPwmVWY5SxAlgZYD5Eb6P5VQttACPDP/kxK9bXSmhHBkqmNzOFO+lAGGyjiwSSn95cz4gfc6JyM7aWofa64w4G2o+qvO8CpGES68g4n1+cRFIm1yGRi7zVYvh6LW4gPgmDLbf8hjUv+NoJBmguJNGI9wqQwTJ0G84ZurTYI65ju4otUDRgBNHwHZZLoKypESMK6c3OuGInEIMhipx1+3gwsygc0ia9URLkJJ3oJZcNCGoH9AKsShzQB3OzlrMqvTLoF8eXuxsVLOHnYm5vd901YPBL6BXk0rX5GFZwSiOscjJzb6VS2bno8+TBFoxNVNQTbXg1so6r3ci9S0= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6041248)(20161123564025)(20161123560025)(20161123562025)(20161123558025)(20161123555025)(6072148); SRVR:CY1PR07MB2280; BCL:0; PCL:0; RULEID:; SRVR:CY1PR07MB2280; X-Microsoft-Exchange-Diagnostics: 1; CY1PR07MB2280; 4:RupWEpXSqxx9LRvm39hfNPLLDDfdtk3h9xlF+a95qzXguN8hUbLA39XrL9jVNrK7O3O+L17dJ4gJW/w2CBLGpz9ey3SkNB+2NypuTyuDJXywGbcIxXXd76KRoDWluvU7hHgRlaTLfInWXLW5sZBAwYHEkAKBcdPeIAmADsFeTmEK00pel8B2J4QfvxmaIgPcQFxX57YcdVQd9iRt1o3y1+KmvmVh/W+4fbN3GUo38X801F81EqqkvuCx2ypxutm8IqsW4eThlVXiuBsJELH+v2ZZQ5Qu711ogFHyzzXsUlAV4DAAN4KCoApEsWNXh8bG78dTJf7QvmUH5FfLKZVNIniRO+3D/5hQR1bBaAJKTKcEvezUBlqt6YCLXhk9BiF1LQlbHxWVc0GrCOVjGHVLSw0F8WgekUbos0dZd4TMNTdLONFogVfOgRo20ScvJ8rdus9f1RoLmuzZ2BammTljEH1ftMCnPtuOnQLfOsFzewJy2RI6FYFelbGSjuH4XcDCJr6POIOK6/f8Vj8tyU+Ln7JBFffnoz0pwFyQwZLWzutmsiSrq8VTODnEl/iG6EWAsC+kucNo21eSZDop08FB0rdQepKIasRUFB2WAXTpee4= X-Forefront-PRVS: 025796F161 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(39450400003)(39410400002)(39830400002)(2906002)(2950100002)(5003940100001)(66066001)(42882006)(6916009)(50466002)(48376002)(47776003)(42186005)(53936002)(6512007)(68736007)(5009440100003)(54906002)(50226002)(38730400002)(6486002)(25786009)(305945005)(81166006)(7736002)(6116002)(3846002)(4326008)(8676002)(6506006)(189998001)(36756003)(50986999)(76176999)(33646002)(4720700003)(5660300001)(110136004)(110426004); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR07MB2280; H:lio357.in.caveonetworks.com; FPR:; SPF:None; MLV:nov; PTR:InfoNoRecords; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR07MB2280; 23:QmnpGjTXgz/rlsSvIxxRY3nDAMl34zTF9h50BTk0k?= =?us-ascii?Q?UxJDVouNLREMC3miy9re0U/U2uqD+bRtcwHmaIZqMP5MDkQZdPhxEwg20gOt?= =?us-ascii?Q?tQBeAGLKPmUhTaGPxbXDr3jwKnhLnfCFQZe1aqg3MtABHymJaCLA8rkf97UT?= =?us-ascii?Q?wqVXobOa80N5HscypRlC8LOrjKYg2XVkKNiRhFmhK+oSYOhofVyJiCCHEMCo?= =?us-ascii?Q?h1ZTrLdq6b9svXQjg4zxbRmPOzWwmxCgmGVHH1z62h2h94BbLJZo7n0WQn+E?= =?us-ascii?Q?abMdLOqIdFvVr9jikDZIqvRsINu2AagTZxQK28knIwajDjXkrnw9YtkRQT3Y?= =?us-ascii?Q?lQDhcFJP+QIIPUdn4QRw9auUKcN3zkM/6CxClhYpP7BYp8U3Kt6UoBXcohNL?= =?us-ascii?Q?G5kzv7uVzKA7HtmuMYal2ikt5soBToMnypClnMGh6sLV92pJF7p85m/NLmNO?= =?us-ascii?Q?fC1avSHIHQhk/vCOJIjq0Pvey+IweJqIg4yqON1YuLF6+WuBinmNzTu2g/O8?= =?us-ascii?Q?VJJYd+IC/vL0OEDggPCDmNI4SzbwbHOb0trv1n/4XiCIW/XT7bkWsi0qcSMq?= =?us-ascii?Q?uBAj+qoSVZiLLJYnNP4GakORFYMVV4ZGVqBKO1JKZUt/VPWLPSKyQRfFycz/?= =?us-ascii?Q?CvGpYbDoNllbShcM5XRMy9LZkAuV4oWEvfwKvU2YgOeQsvwZhm6J25iRUuIw?= =?us-ascii?Q?l5KI7QlIv9bfSDf4clq6Rq/wdAP3NCnOavJ5q4dKIkVuaaCknf84ymzSspUh?= =?us-ascii?Q?+qrkeWNCt1KlqmvjrfSSWfoZ+2Vpy9GiB0hUPMtcTFR1wlJac+MmCJf+fw++?= =?us-ascii?Q?BQxdxaMytdnYsYKerwXvqTJzIJPusrfsZYfP2GaHcIseCd5c3hJivxAerq7U?= =?us-ascii?Q?WpmJfru3n98fdAOtoMuzUZvmHYwd9KIr2ELkQQS0eIeOzrCtzA0MT1PBewhp?= =?us-ascii?Q?2FzSKOUIkkvO0q8G5+AY0QXzwTM7gqiHADwmdsNdH7upDHLWap+uLotc+nWP?= =?us-ascii?Q?Wd/jAHktHArBFmIGvZ6W3poR6b5+LAN3kKetztRX8xxoQqJDR6F3nzELdsUq?= =?us-ascii?Q?fdWbdg=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR07MB2280; 6:Edauog/qdivl453SvSjdD6JHt63iD8XMikvXt3jZGIbCi3iP68zxJ3qmivpn3F661K7uCvuWDhhoztWTVjH8oDvJhVPhqE1wcGaQixGfyrHTrH/AxDlYUqFBPKq8EdgcuC7u2/95/PPmPrt9GSrlCv9g4t78whq641v2xBr/1Ba5iYfoHIsRUV4IoGnm9F8Un6wWjsZ0pEeOZ+DdU2yOpjBbbSq7rvi0Krg6l4Ktj/60fdn4SzNA4YuuCqwaznysMnNvKXCzvKOYlUS6Ij30+Pxnh9yuXipDkJ+/L4A6WFGG7u6gPVG0kw+kfo5ReHrUbNdk7A7Fu9vCqH92Ed6SSuSCN4c3kyg3Dlkxf5iOFpmjd1uUkqD3obm32wgWw3ZW0UmKJUoSdb8ANIRfQOJ1VQ==; 5:VQhu4gvvDYw0Ff9M3WRyTum9+mZ8w8mWIuf7Twv15E2Y+vSj6EdpQWzfQWev2UEtoEMr/8o9OEAun+sVqRdTLQ2jiyZ6+OPvSPEXoEUYxQ4+p3ElQs4vOPj2/Xu0QxJAu8YCYdmg/6HVD9mfvdS1FA==; 24:HHAvndHlVIsJCxHzU42Tn5zx8qG4fPEBUdhHOF0urv7/fd/cCqfy5e1xK6BHYU8px4dVbxfvWuIlAo4CsDv7SXLGKBf7tVpJK2U7EjokQ8M= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR07MB2280; 7:/BR6wVfGv9bjzY6S2cBKPiwxSLSgsXd3iCW+eCpWh01CJ5vyxhCTwJ1qHbpax98BPzpxrQm/iIJuFqOnyy7N9IBJZhUi4dfsOrEr1JEnWHnP7Lx2Ni5RtUQaY1uUR0Pmz3FOxW+pVs4S7pEC/FTmKRnYtdwuvuj9DeWW9s11mns9SXbxRjFStuUxitiqq1o/nPfqrmAlpb7na+2hwejB7TDac9XZRpqVAxKLSYqqjUaZiUlcvdbqf7nJ2qzpEBXGFj6SLI088/LGsaBEJuuqWBDS/MNXHV1K9PmVkHulNa0ittzgc/qVFj87dskVDTTJ1Lo70XXugJSpF63MQFvfuA== X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Mar 2017 06:27:15.5167 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR07MB2280 Subject: [dpdk-dev] [PATCH v3 08/46] net/liquidio: add API to setup IO queue registers X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 25 Mar 2017 06:27:20 -0000 Set default configuration values for input and output queue registers. Signed-off-by: Shijith Thotton Signed-off-by: Jerin Jacob Signed-off-by: Derek Chickles Signed-off-by: Venkat Koppula Signed-off-by: Srisivasubramanian S Signed-off-by: Mallesham Jatharakonda --- drivers/net/liquidio/base/lio_23xx_vf.c | 160 ++++++++++++++++++++++++++++++++ drivers/net/liquidio/lio_ethdev.c | 5 + drivers/net/liquidio/lio_struct.h | 7 ++ 3 files changed, 172 insertions(+) diff --git a/drivers/net/liquidio/base/lio_23xx_vf.c b/drivers/net/liquidio/base/lio_23xx_vf.c index d9b9e2a..f61f185 100644 --- a/drivers/net/liquidio/base/lio_23xx_vf.c +++ b/drivers/net/liquidio/base/lio_23xx_vf.c @@ -39,6 +39,164 @@ #include "lio_23xx_vf.h" #include "lio_23xx_reg.h" +static int +cn23xx_vf_reset_io_queues(struct lio_device *lio_dev, uint32_t num_queues) +{ + uint32_t loop = CN23XX_VF_BUSY_READING_REG_LOOP_COUNT; + uint64_t d64, q_no; + int ret_val = 0; + + PMD_INIT_FUNC_TRACE(); + + for (q_no = 0; q_no < num_queues; q_no++) { + /* set RST bit to 1. This bit applies to both IQ and OQ */ + d64 = lio_read_csr64(lio_dev, + CN23XX_SLI_IQ_PKT_CONTROL64(q_no)); + d64 = d64 | CN23XX_PKT_INPUT_CTL_RST; + lio_write_csr64(lio_dev, CN23XX_SLI_IQ_PKT_CONTROL64(q_no), + d64); + } + + /* wait until the RST bit is clear or the RST and QUIET bits are set */ + for (q_no = 0; q_no < num_queues; q_no++) { + volatile uint64_t reg_val; + + reg_val = lio_read_csr64(lio_dev, + CN23XX_SLI_IQ_PKT_CONTROL64(q_no)); + while ((reg_val & CN23XX_PKT_INPUT_CTL_RST) && + !(reg_val & CN23XX_PKT_INPUT_CTL_QUIET) && + loop) { + reg_val = lio_read_csr64( + lio_dev, + CN23XX_SLI_IQ_PKT_CONTROL64(q_no)); + loop = loop - 1; + } + + if (loop == 0) { + lio_dev_err(lio_dev, + "clearing the reset reg failed or setting the quiet reg failed for qno: %lu\n", + (unsigned long)q_no); + return -1; + } + + reg_val = reg_val & ~CN23XX_PKT_INPUT_CTL_RST; + lio_write_csr64(lio_dev, CN23XX_SLI_IQ_PKT_CONTROL64(q_no), + reg_val); + + reg_val = lio_read_csr64( + lio_dev, CN23XX_SLI_IQ_PKT_CONTROL64(q_no)); + if (reg_val & CN23XX_PKT_INPUT_CTL_RST) { + lio_dev_err(lio_dev, + "clearing the reset failed for qno: %lu\n", + (unsigned long)q_no); + ret_val = -1; + } + } + + return ret_val; +} + +static int +cn23xx_vf_setup_global_input_regs(struct lio_device *lio_dev) +{ + uint64_t q_no; + uint64_t d64; + + PMD_INIT_FUNC_TRACE(); + + if (cn23xx_vf_reset_io_queues(lio_dev, + lio_dev->sriov_info.rings_per_vf)) + return -1; + + for (q_no = 0; q_no < (lio_dev->sriov_info.rings_per_vf); q_no++) { + lio_write_csr64(lio_dev, CN23XX_SLI_IQ_DOORBELL(q_no), + 0xFFFFFFFF); + + d64 = lio_read_csr64(lio_dev, + CN23XX_SLI_IQ_INSTR_COUNT64(q_no)); + + d64 &= 0xEFFFFFFFFFFFFFFFL; + + lio_write_csr64(lio_dev, CN23XX_SLI_IQ_INSTR_COUNT64(q_no), + d64); + + /* Select ES, RO, NS, RDSIZE,DPTR Fomat#0 for + * the Input Queues + */ + lio_write_csr64(lio_dev, CN23XX_SLI_IQ_PKT_CONTROL64(q_no), + CN23XX_PKT_INPUT_CTL_MASK); + } + + return 0; +} + +static void +cn23xx_vf_setup_global_output_regs(struct lio_device *lio_dev) +{ + uint32_t reg_val; + uint32_t q_no; + + PMD_INIT_FUNC_TRACE(); + + for (q_no = 0; q_no < lio_dev->sriov_info.rings_per_vf; q_no++) { + lio_write_csr(lio_dev, CN23XX_SLI_OQ_PKTS_CREDIT(q_no), + 0xFFFFFFFF); + + reg_val = + lio_read_csr(lio_dev, CN23XX_SLI_OQ_PKTS_SENT(q_no)); + + reg_val &= 0xEFFFFFFFFFFFFFFFL; + + reg_val = + lio_read_csr(lio_dev, CN23XX_SLI_OQ_PKT_CONTROL(q_no)); + + /* set IPTR & DPTR */ + reg_val |= + (CN23XX_PKT_OUTPUT_CTL_IPTR | CN23XX_PKT_OUTPUT_CTL_DPTR); + + /* reset BMODE */ + reg_val &= ~(CN23XX_PKT_OUTPUT_CTL_BMODE); + + /* No Relaxed Ordering, No Snoop, 64-bit Byte swap + * for Output Queue Scatter List + * reset ROR_P, NSR_P + */ + reg_val &= ~(CN23XX_PKT_OUTPUT_CTL_ROR_P); + reg_val &= ~(CN23XX_PKT_OUTPUT_CTL_NSR_P); + +#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN + reg_val &= ~(CN23XX_PKT_OUTPUT_CTL_ES_P); +#elif RTE_BYTE_ORDER == RTE_BIG_ENDIAN + reg_val |= (CN23XX_PKT_OUTPUT_CTL_ES_P); +#endif + /* No Relaxed Ordering, No Snoop, 64-bit Byte swap + * for Output Queue Data + * reset ROR, NSR + */ + reg_val &= ~(CN23XX_PKT_OUTPUT_CTL_ROR); + reg_val &= ~(CN23XX_PKT_OUTPUT_CTL_NSR); + /* set the ES bit */ + reg_val |= (CN23XX_PKT_OUTPUT_CTL_ES); + + /* write all the selected settings */ + lio_write_csr(lio_dev, CN23XX_SLI_OQ_PKT_CONTROL(q_no), + reg_val); + } +} + +static int +cn23xx_vf_setup_device_regs(struct lio_device *lio_dev) +{ + PMD_INIT_FUNC_TRACE(); + + if (cn23xx_vf_setup_global_input_regs(lio_dev)) + return -1; + + cn23xx_vf_setup_global_output_regs(lio_dev); + + return 0; +} + int cn23xx_vf_setup_device(struct lio_device *lio_dev) { @@ -63,6 +221,8 @@ if (lio_dev->default_config == NULL) return -1; + lio_dev->fn_list.setup_device_regs = cn23xx_vf_setup_device_regs; + return 0; } diff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c index 0487f3d..34b7b54 100644 --- a/drivers/net/liquidio/lio_ethdev.c +++ b/drivers/net/liquidio/lio_ethdev.c @@ -91,6 +91,11 @@ return -1; } + if (lio_dev->fn_list.setup_device_regs(lio_dev)) { + lio_dev_err(lio_dev, "Failed to configure device registers\n"); + return -1; + } + dpdk_queues = (int)lio_dev->sriov_info.rings_per_vf; lio_dev->max_tx_queues = dpdk_queues; diff --git a/drivers/net/liquidio/lio_struct.h b/drivers/net/liquidio/lio_struct.h index a1203e4..577ea49 100644 --- a/drivers/net/liquidio/lio_struct.h +++ b/drivers/net/liquidio/lio_struct.h @@ -43,6 +43,11 @@ #include "lio_hw_defs.h" +struct lio_device; +struct lio_fn_list { + int (*setup_device_regs)(struct lio_device *); +}; + struct lio_sriov_info { /** Number of rings assigned to VF */ uint32_t rings_per_vf; @@ -117,6 +122,8 @@ struct lio_device { uint8_t *hw_addr; + struct lio_fn_list fn_list; + struct lio_sriov_info sriov_info; char dev_string[LIO_DEVICE_NAME_LEN]; /* Device print string */ -- 1.8.3.1