Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp2689172ybp; Sat, 5 Oct 2019 18:08:06 -0700 (PDT) X-Google-Smtp-Source: APXvYqxSyAjTnM8fQGRnKS1tAapJJsXgBQvajbsUfKpzPu5NHkR6Yi4kSpOVyQ/1ZV3BpXjneMNm X-Received: by 2002:a50:f0d4:: with SMTP id a20mr23193715edm.149.1570324085947; Sat, 05 Oct 2019 18:08:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570324085; cv=none; d=google.com; s=arc-20160816; b=xDz+E4RAQHbtsPyok9lMLlNFdxSQb7BtccbCKfdHL4VCm+TRRusjf8Gj2DInKzMvFj lFbHQ3Uc7mMcLT+BSRO+Ku/VpT681LiAh+nlQPocFK4ywpJARqroqactiVqa4D0dlqsZ 8MAdU5otScDIYlbjAoNktkFUdi2TtAGcyvwMnZExH85RxYdv6cj+QNd99SnDDSOrX5qh mkPijKkA8oJjVF+Qx5qdsE+rXvZQt+f0TFGCec3py0A665YngKNWS3QCTjrW0iXoqCZh ZSQyhBOlqPSWo8vR0PokR5k1sVLbIjwIorUmf6/O2/4208qbBMHZqkBpUk70txrQSDNb IgNQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :feedback-id:message-id:subject:reply-to:cc:from:to:dkim-signature :date; bh=lucdwIXyrI3acF9pa/XY2PlrAhFkzNyslqQIMc4ZvqA=; b=k9faG+IZT9Q6AKq4Kngh0WgKw+RYf6b47oI7+NmlMv3aUCfhD6ukRnXOaT5D3Pn/LE PKRgW88e+3fxcC0fUmoK3cgX93P7RevGk2D04JAHWZnQAsSi5J/R+4jc7+DmECBlhVho qy2zLFRcrHHPQJYfZbDEmADh+TrGIgIS/AUvtQecCk6VsMWB4rVjGhD7hcERtE8v2/+L hXFJ4uz+QGKf9Mxql6xLBBQZ0/kClmAoUIrT/t+T+TXcmSZK+dWNxgAjF4FZ1vDCXY3S UVPTbZY6fFj0iSQBW31Na6ddwE9U9WK1jrp5kMqjGRdOmdjcYZwoAjEmdcH002Lw3ar9 rG/Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@protonmail.com header.s=default header.b=ZmB+A7gP; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=protonmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k7si4864395eja.377.2019.10.05.18.07.42; Sat, 05 Oct 2019 18:08:05 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@protonmail.com header.s=default header.b=ZmB+A7gP; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=protonmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727108AbfJFBEt (ORCPT + 99 others); Sat, 5 Oct 2019 21:04:49 -0400 Received: from mail-40136.protonmail.ch ([185.70.40.136]:59932 "EHLO mail-40136.protonmail.ch" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726986AbfJFBEt (ORCPT ); Sat, 5 Oct 2019 21:04:49 -0400 Date: Sun, 06 Oct 2019 01:04:39 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=default; t=1570323885; bh=lucdwIXyrI3acF9pa/XY2PlrAhFkzNyslqQIMc4ZvqA=; h=Date:To:From:Cc:Reply-To:Subject:Feedback-ID:From; b=ZmB+A7gPusQeDsS5vcpM4Rqaij4o+ROfPmEBCS02oNWn2cDnbHjjUgCXCpghxvhRs lXr88dv0H5ex3u9Tn6JLgB3ljd+BRIucAw95SzD5F4WHfMRHEkSPjiL0JhIxR1nzhV SxFlbTRfFb+3CZl75dBYx39bEdtmG1QwQfNFc9uY= To: "linux-input@vger.kernel.org" From: Mazin Rezk Cc: "benjamin.tissoires@redhat.com" , "jikos@kernel.org" , "linux-kernel@vger.kernel.org" , "lains@archlinux.org" , "mnrzk@protonmail.com" Reply-To: Mazin Rezk Subject: [PATCH v3 3/4] HID: logitech: Add feature 0x0001: FeatureSet Message-ID: Feedback-ID: 18B_FC5q-t32TXzMsVp9BgkgrdNH3iwklfW8WOrHrcxZA0WRj7JodCh5VXKxs6A3OaiHK0QNd8wi3SImKex8yQ==:Ext:ProtonMail MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-0.2 required=7.0 tests=ALL_TRUSTED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,HK_RANDOM_REPLYTO autolearn=no autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mail.protonmail.ch Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds support for the 0x0001 (FeatureSet) feature. This feature is used to look up the feature ID of a feature index on a device and list the total count of features on the device. I also added the hidpp20_get_features function which iterates through all feature indexes on the device and stores a map of them in features an hidpp_device struct. This function runs when an HID++ 2.0 device is probed. Signed-off-by: Mazin Rezk --- drivers/hid/hid-logitech-hidpp.c | 92 ++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hi= dpp.c index a0efa8a43213..64ac94c581aa 100644 --- a/drivers/hid/hid-logitech-hidpp.c +++ b/drivers/hid/hid-logitech-hidpp.c @@ -190,6 +190,9 @@ struct hidpp_device { =09struct hidpp_battery battery; =09struct hidpp_scroll_counter vertical_wheel_counter; + +=09u16 *features; +=09u8 feature_count; }; /* HID++ 1.0 error codes */ @@ -911,6 +914,84 @@ static int hidpp_root_get_protocol_version(struct hidp= p_device *hidpp) =09return 0; } +/* -----------------------------------------------------------------------= --- */ +/* 0x0001: FeatureSet = */ +/* -----------------------------------------------------------------------= --- */ + +#define HIDPP_PAGE_FEATURESET=09=09=09=090x0001 + +#define CMD_FEATURESET_GET_COUNT=09=09=090x00 +#define CMD_FEATURESET_GET_FEATURE=09=09=090x11 + +static int hidpp20_featureset_get_feature(struct hidpp_device *hidpp, +=09u8 featureset_index, u8 feature_index, u16 *feature_id) +{ +=09struct hidpp_report response; +=09int ret; + +=09ret =3D hidpp_send_fap_command_sync(hidpp, featureset_index, +=09=09CMD_FEATURESET_GET_FEATURE, &feature_index, 1, &response); + +=09if (ret) +=09=09return ret; + +=09*feature_id =3D (response.fap.params[0] << 8) | response.fap.params[1]; + +=09return ret; +} + +static int hidpp20_featureset_get_count(struct hidpp_device *hidpp, +=09u8 feature_index, u8 *count) +{ +=09struct hidpp_report response; +=09int ret; + +=09ret =3D hidpp_send_fap_command_sync(hidpp, feature_index, +=09=09CMD_FEATURESET_GET_COUNT, NULL, 0, &response); + +=09if (ret) +=09=09return ret; + +=09*count =3D response.fap.params[0]; + +=09return ret; +} + +static int hidpp20_get_features(struct hidpp_device *hidpp) +{ +=09int ret; +=09u8 featureset_index, featureset_type; +=09u8 i; + +=09hidpp->feature_count =3D 0; + +=09ret =3D hidpp_root_get_feature(hidpp, HIDPP_PAGE_FEATURESET, +=09=09=09=09 &featureset_index, &featureset_type); + +=09if (ret =3D=3D -ENOENT) { +=09=09hid_warn(hidpp->hid_dev, "Unable to retrieve feature set."); +=09=09return 0; +=09} + +=09if (ret) +=09=09return ret; + +=09ret =3D hidpp20_featureset_get_count(hidpp, featureset_index, +=09=09&hidpp->feature_count); + +=09if (ret) +=09=09return ret; + +=09hidpp->features =3D devm_kzalloc(&hidpp->hid_dev->dev, +=09=09=09hidpp->feature_count * sizeof(u16), GFP_KERNEL); + +=09for (i =3D 0; i < hidpp->feature_count && !ret; i++) +=09=09ret =3D hidpp20_featureset_get_feature(hidpp, featureset_index, +=09=09=09=09i, &(hidpp->features[i])); + +=09return ret; +} + /* -----------------------------------------------------------------------= --- */ /* 0x0005: GetDeviceNameType = */ /* -----------------------------------------------------------------------= --- */ @@ -3625,6 +3706,17 @@ static int hidpp_probe(struct hid_device *hdev, cons= t struct hid_device_id *id) =09=09hidpp_overwrite_name(hdev); =09} +=09/* Cache feature indexes and IDs to check reports faster */ +=09if (hidpp->protocol_major >=3D 2) { +=09=09if (hidpp20_get_features(hidpp)) { +=09=09=09hid_err(hdev, "%s:hidpp20_get_features returned error\n", +=09=09=09=09__func__); +=09=09=09goto hid_hw_init_fail; +=09=09} +=09} else { +=09=09hidpp->feature_count =3D 0; +=09} + =09if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)) { =09=09ret =3D wtp_get_config(hidpp); =09=09if (ret) -- 2.23.0