diff mbox series

[v12,10/14] HID: nintendo: set controller uniq to MAC

Message ID 20200823044157.339677-11-djogorchock@gmail.com
State Superseded
Headers show
Series HID: nintendo | expand

Commit Message

Daniel Ogorchock Aug. 23, 2020, 4:41 a.m. UTC
This patch sets the input device's uniq identifier to the controller's
MAC address. This is useful for future association between an IMU input
device with the normal input device as well as associating the
controller with any serial joy-con driver.

Signed-off-by: Daniel J. Ogorchock <djogorchock@gmail.com>
---
 drivers/hid/hid-nintendo.c | 45 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)

Comments

Silvan Jegen Feb. 15, 2021, 2:42 p.m. UTC | #1
Hi Daniel

One comment below.

"Daniel J. Ogorchock" <djogorchock@gmail.com> wrote:
> This patch sets the input device's uniq identifier to the controller's

> MAC address. This is useful for future association between an IMU input

> device with the normal input device as well as associating the

> controller with any serial joy-con driver.

> 

> Signed-off-by: Daniel J. Ogorchock <djogorchock@gmail.com>

> ---

>  drivers/hid/hid-nintendo.c | 45 ++++++++++++++++++++++++++++++++++++++

>  1 file changed, 45 insertions(+)

> 

> diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c

> index c2f7dc83d875..85870569cb49 100644

> --- a/drivers/hid/hid-nintendo.c

> +++ b/drivers/hid/hid-nintendo.c

> @@ -319,6 +319,8 @@ struct joycon_ctlr {

>  	struct led_classdev home_led;

>  	enum joycon_ctlr_state ctlr_state;

>  	spinlock_t lock;

> +	u8 mac_addr[6];

> +	char *mac_addr_str;

>  

>  	/* The following members are used for synchronous sends/receives */

>  	enum joycon_msg_type msg_type;

> @@ -1005,6 +1007,7 @@ static int joycon_input_create(struct joycon_ctlr *ctlr)

>  	ctlr->input->id.vendor = hdev->vendor;

>  	ctlr->input->id.product = hdev->product;

>  	ctlr->input->id.version = hdev->version;

> +	ctlr->input->uniq = ctlr->mac_addr_str;

>  	ctlr->input->name = name;

>  	input_set_drvdata(ctlr->input, ctlr);

>  

> @@ -1317,6 +1320,41 @@ static int joycon_power_supply_create(struct joycon_ctlr *ctlr)

>  	return 0;

>  }

>  

> +static int joycon_read_mac(struct joycon_ctlr *ctlr)

> +{

> +	int ret;

> +	int i;

> +	int j;

> +	struct joycon_subcmd_request req = { 0 };

> +	struct joycon_input_report *report;

> +

> +	req.subcmd_id = JC_SUBCMD_REQ_DEV_INFO;

> +	ret = joycon_send_subcmd(ctlr, &req, 0, HZ);

> +	if (ret) {

> +		hid_err(ctlr->hdev, "Failed to get joycon info; ret=%d\n", ret);

> +		return ret;

> +	}

> +

> +	report = (struct joycon_input_report *)ctlr->input_buf;

> +

> +	for (i = 4, j = 0; j < 6; i++, j++)

> +		ctlr->mac_addr[j] = report->reply.data[i];

> +

> +	ctlr->mac_addr_str = devm_kasprintf(&ctlr->hdev->dev, GFP_KERNEL,

> +					    "%02X:%02X:%02X:%02X:%02X:%02X",

> +					    ctlr->mac_addr[0],

> +					    ctlr->mac_addr[1],

> +					    ctlr->mac_addr[2],

> +					    ctlr->mac_addr[3],

> +					    ctlr->mac_addr[4],

> +					    ctlr->mac_addr[5]);

> +	if (!ctlr->mac_addr_str)

> +		return -ENOMEM;

> +	hid_info(ctlr->hdev, "controller MAC = %s\n", ctlr->mac_addr_str);

> +

> +	return 0;

> +}

> +

>  /* Common handler for parsing inputs */

>  static int joycon_ctlr_read_handler(struct joycon_ctlr *ctlr, u8 *data,

>  							      int size)

> @@ -1495,6 +1533,13 @@ static int nintendo_hid_probe(struct hid_device *hdev,

>  		goto err_mutex;

>  	}

>  

> +	ret = joycon_read_mac(ctlr);

> +	if (ret) {

> +		hid_err(hdev, "Failed to retrieve controller MAC; ret=%d\n",

> +			ret);

> +		goto err_close;


This should be err_mutex otherwise we don't unlock the mutex on
error. Note that a later patch changes the hid_err error format string
but the error is introduced here.


Cheers,

Silvan

> +	}

> +

>  	mutex_unlock(&ctlr->output_mutex);

>  

>  	/* Initialize the leds */
diff mbox series

Patch

diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c
index c2f7dc83d875..85870569cb49 100644
--- a/drivers/hid/hid-nintendo.c
+++ b/drivers/hid/hid-nintendo.c
@@ -319,6 +319,8 @@  struct joycon_ctlr {
 	struct led_classdev home_led;
 	enum joycon_ctlr_state ctlr_state;
 	spinlock_t lock;
+	u8 mac_addr[6];
+	char *mac_addr_str;
 
 	/* The following members are used for synchronous sends/receives */
 	enum joycon_msg_type msg_type;
@@ -1005,6 +1007,7 @@  static int joycon_input_create(struct joycon_ctlr *ctlr)
 	ctlr->input->id.vendor = hdev->vendor;
 	ctlr->input->id.product = hdev->product;
 	ctlr->input->id.version = hdev->version;
+	ctlr->input->uniq = ctlr->mac_addr_str;
 	ctlr->input->name = name;
 	input_set_drvdata(ctlr->input, ctlr);
 
@@ -1317,6 +1320,41 @@  static int joycon_power_supply_create(struct joycon_ctlr *ctlr)
 	return 0;
 }
 
+static int joycon_read_mac(struct joycon_ctlr *ctlr)
+{
+	int ret;
+	int i;
+	int j;
+	struct joycon_subcmd_request req = { 0 };
+	struct joycon_input_report *report;
+
+	req.subcmd_id = JC_SUBCMD_REQ_DEV_INFO;
+	ret = joycon_send_subcmd(ctlr, &req, 0, HZ);
+	if (ret) {
+		hid_err(ctlr->hdev, "Failed to get joycon info; ret=%d\n", ret);
+		return ret;
+	}
+
+	report = (struct joycon_input_report *)ctlr->input_buf;
+
+	for (i = 4, j = 0; j < 6; i++, j++)
+		ctlr->mac_addr[j] = report->reply.data[i];
+
+	ctlr->mac_addr_str = devm_kasprintf(&ctlr->hdev->dev, GFP_KERNEL,
+					    "%02X:%02X:%02X:%02X:%02X:%02X",
+					    ctlr->mac_addr[0],
+					    ctlr->mac_addr[1],
+					    ctlr->mac_addr[2],
+					    ctlr->mac_addr[3],
+					    ctlr->mac_addr[4],
+					    ctlr->mac_addr[5]);
+	if (!ctlr->mac_addr_str)
+		return -ENOMEM;
+	hid_info(ctlr->hdev, "controller MAC = %s\n", ctlr->mac_addr_str);
+
+	return 0;
+}
+
 /* Common handler for parsing inputs */
 static int joycon_ctlr_read_handler(struct joycon_ctlr *ctlr, u8 *data,
 							      int size)
@@ -1495,6 +1533,13 @@  static int nintendo_hid_probe(struct hid_device *hdev,
 		goto err_mutex;
 	}
 
+	ret = joycon_read_mac(ctlr);
+	if (ret) {
+		hid_err(hdev, "Failed to retrieve controller MAC; ret=%d\n",
+			ret);
+		goto err_close;
+	}
+
 	mutex_unlock(&ctlr->output_mutex);
 
 	/* Initialize the leds */