All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH resend 1/4] nfc: Add support RC-S380P to port100
@ 2017-02-04  1:15 OGAWA Hirofumi
  2017-02-04  1:15 ` [PATCH resend 2/4] nfc: Send same info for both of NFC_CMD_GET_DEVICE and NFC_EVENT_DEVICE_ADDED OGAWA Hirofumi
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: OGAWA Hirofumi @ 2017-02-04  1:15 UTC (permalink / raw)
  To: Samuel Ortiz
  Cc: Aloisio Almeida Jr, Lauro Ramos Venancio, linux-wireless,
	Andrew Morton, Linus Torvalds, linux-kernel, linux-nfc



Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
---

 drivers/nfc/port100.c |    8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff -puN drivers/nfc/port100.c~nfc-add-rcs380p drivers/nfc/port100.c
--- linux/drivers/nfc/port100.c~nfc-add-rcs380p	2016-12-18 22:16:53.503673411 +0900
+++ linux-hirofumi/drivers/nfc/port100.c	2016-12-18 22:16:53.504673416 +0900
@@ -21,8 +21,9 @@
 
 #define VERSION "0.1"
 
-#define SONY_VENDOR_ID    0x054c
-#define RCS380_PRODUCT_ID 0x06c1
+#define SONY_VENDOR_ID		0x054c
+#define RCS380S_PRODUCT_ID	0x06c1
+#define RCS380P_PRODUCT_ID	0x06c3
 
 #define PORT100_PROTOCOLS (NFC_PROTO_JEWEL_MASK    | \
 			   NFC_PROTO_MIFARE_MASK   | \
@@ -1477,7 +1478,8 @@ static struct nfc_digital_ops port100_di
 };
 
 static const struct usb_device_id port100_table[] = {
-	{ USB_DEVICE(SONY_VENDOR_ID, RCS380_PRODUCT_ID), },
+	{ USB_DEVICE(SONY_VENDOR_ID, RCS380S_PRODUCT_ID), },
+	{ USB_DEVICE(SONY_VENDOR_ID, RCS380P_PRODUCT_ID), },
 	{ }
 };
 MODULE_DEVICE_TABLE(usb, port100_table);
_

-- 
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH resend 2/4] nfc: Send same info for both of NFC_CMD_GET_DEVICE and NFC_EVENT_DEVICE_ADDED
  2017-02-04  1:15 [PATCH resend 1/4] nfc: Add support RC-S380P to port100 OGAWA Hirofumi
@ 2017-02-04  1:15 ` OGAWA Hirofumi
  2017-02-04  1:16   ` [PATCH resend 3/4] nfc: Fix RC-S380* needs zero-length packet OGAWA Hirofumi
  2017-02-25 22:43 ` [PATCH resend 1/4] nfc: Add support RC-S380P to port100 OGAWA Hirofumi
  2017-02-27 10:35 ` Samuel Ortiz
  2 siblings, 1 reply; 7+ messages in thread
From: OGAWA Hirofumi @ 2017-02-04  1:15 UTC (permalink / raw)
  To: Samuel Ortiz
  Cc: Aloisio Almeida Jr, Lauro Ramos Venancio, linux-wireless,
	Andrew Morton, Linus Torvalds, linux-kernel, linux-nfc


Now, NFC_EVENT_DEVICE_ADDED doesn't send NFC_ATTR_RF_MODE. But
NFC_CMD_GET_DEVICE send.

To get NFC_ATTR_RF_MODE, we have to call NFC_CMD_GET_DEVICE just for
NFC_ATTR_RF_MODE when get NFC_EVENT_DEVICE_ADDED.

This fixes those inconsistent.

Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
---

 net/nfc/netlink.c |   22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff -puN net/nfc/netlink.c~nfc-send-same-info net/nfc/netlink.c
--- linux/net/nfc/netlink.c~nfc-send-same-info	2016-12-18 22:16:55.805686290 +0900
+++ linux-hirofumi/net/nfc/netlink.c	2016-12-18 22:16:55.806686296 +0900
@@ -311,6 +311,17 @@ free_msg:
 	return -EMSGSIZE;
 }
 
+static int nfc_genl_setup_device_added(struct nfc_dev *dev, struct sk_buff *msg)
+{
+	if (nla_put_string(msg, NFC_ATTR_DEVICE_NAME, nfc_device_name(dev)) ||
+	    nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
+	    nla_put_u32(msg, NFC_ATTR_PROTOCOLS, dev->supported_protocols) ||
+	    nla_put_u8(msg, NFC_ATTR_DEVICE_POWERED, dev->dev_up) ||
+	    nla_put_u8(msg, NFC_ATTR_RF_MODE, dev->rf_mode))
+		return -1;
+	return 0;
+}
+
 int nfc_genl_device_added(struct nfc_dev *dev)
 {
 	struct sk_buff *msg;
@@ -325,10 +336,7 @@ int nfc_genl_device_added(struct nfc_dev
 	if (!hdr)
 		goto free_msg;
 
-	if (nla_put_string(msg, NFC_ATTR_DEVICE_NAME, nfc_device_name(dev)) ||
-	    nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
-	    nla_put_u32(msg, NFC_ATTR_PROTOCOLS, dev->supported_protocols) ||
-	    nla_put_u8(msg, NFC_ATTR_DEVICE_POWERED, dev->dev_up))
+	if (nfc_genl_setup_device_added(dev, msg))
 		goto nla_put_failure;
 
 	genlmsg_end(msg, hdr);
@@ -604,11 +612,7 @@ static int nfc_genl_send_device(struct s
 	if (cb)
 		genl_dump_check_consistent(cb, hdr, &nfc_genl_family);
 
-	if (nla_put_string(msg, NFC_ATTR_DEVICE_NAME, nfc_device_name(dev)) ||
-	    nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
-	    nla_put_u32(msg, NFC_ATTR_PROTOCOLS, dev->supported_protocols) ||
-	    nla_put_u8(msg, NFC_ATTR_DEVICE_POWERED, dev->dev_up) ||
-	    nla_put_u8(msg, NFC_ATTR_RF_MODE, dev->rf_mode))
+	if (nfc_genl_setup_device_added(dev, msg))
 		goto nla_put_failure;
 
 	genlmsg_end(msg, hdr);
_
-- 
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH resend 3/4] nfc: Fix RC-S380* needs zero-length packet
  2017-02-04  1:15 ` [PATCH resend 2/4] nfc: Send same info for both of NFC_CMD_GET_DEVICE and NFC_EVENT_DEVICE_ADDED OGAWA Hirofumi
@ 2017-02-04  1:16   ` OGAWA Hirofumi
  2017-02-04  1:16     ` [PATCH resend 4/4] nfc: Fix hangup of RC-S380* in port100_send_ack() OGAWA Hirofumi
  0 siblings, 1 reply; 7+ messages in thread
From: OGAWA Hirofumi @ 2017-02-04  1:16 UTC (permalink / raw)
  To: Samuel Ortiz
  Cc: Aloisio Almeida Jr, Lauro Ramos Venancio, linux-wireless,
	Andrew Morton, Linus Torvalds, linux-kernel, linux-nfc


If sent packet size is wMaxPacketSize boundary, this device doesn't
answer. To fix this, we have to send zero-length packet in usb spec.

Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
---

 drivers/nfc/port100.c |    1 +
 1 file changed, 1 insertion(+)

diff -puN drivers/nfc/port100.c~nfc-need-zero-packet drivers/nfc/port100.c
--- linux-ibmpc/drivers/nfc/port100.c~nfc-need-zero-packet	2016-12-31 18:27:14.814753508 +0900
+++ linux-ibmpc-hirofumi/drivers/nfc/port100.c	2016-12-31 18:32:12.928334607 +0900
@@ -1540,6 +1540,7 @@ static int port100_probe(struct usb_inte
 	usb_fill_bulk_urb(dev->out_urb, dev->udev,
 			  usb_sndbulkpipe(dev->udev, out_endpoint),
 			  NULL, 0, port100_send_complete, dev);
+	dev->out_urb->transfer_flags = URB_ZERO_PACKET;
 
 	dev->skb_headroom = PORT100_FRAME_HEADER_LEN +
 			    PORT100_COMM_RF_HEAD_MAX_LEN;
_

-- 
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH resend 4/4] nfc: Fix hangup of RC-S380* in port100_send_ack()
  2017-02-04  1:16   ` [PATCH resend 3/4] nfc: Fix RC-S380* needs zero-length packet OGAWA Hirofumi
@ 2017-02-04  1:16     ` OGAWA Hirofumi
  0 siblings, 0 replies; 7+ messages in thread
From: OGAWA Hirofumi @ 2017-02-04  1:16 UTC (permalink / raw)
  To: Samuel Ortiz
  Cc: Aloisio Almeida Jr, Lauro Ramos Venancio, linux-wireless,
	Andrew Morton, Linus Torvalds, linux-kernel, linux-nfc


If port100_send_ack() was called twice or more, it has race to hangup.

  port100_send_ack()          port100_send_ack()
    init_completion()
    [...]
    dev->cmd_cancel = true
                                /* this removes previous from completion */
                                init_completion()
				[...]
                                dev->cmd_cancel = true
                                wait_for_completion()
    /* never be waked up */
    wait_for_completion()

Like above race, this code is not assuming port100_send_ack() is
called twice or more.

To fix, this checks dev->cmd_cancel to know if prior cancel is
in-flight or not. And never be remove prior task from completion by
using reinit_completion(), so this guarantees to be waked up properly
soon or later.

Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
---

 drivers/nfc/port100.c |   37 ++++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 13 deletions(-)

diff -puN drivers/nfc/port100.c~nfc-port100-hang-fix drivers/nfc/port100.c
--- linux-ibmpc/drivers/nfc/port100.c~nfc-port100-hang-fix	2017-01-03 12:32:13.261785257 +0900
+++ linux-ibmpc-hirofumi/drivers/nfc/port100.c	2017-01-03 12:33:51.965364300 +0900
@@ -726,23 +726,33 @@ static int port100_submit_urb_for_ack(st
 
 static int port100_send_ack(struct port100 *dev)
 {
-	int rc;
+	int rc = 0;
 
 	mutex_lock(&dev->out_urb_lock);
 
-	init_completion(&dev->cmd_cancel_done);
-
-	usb_kill_urb(dev->out_urb);
+	/*
+	 * If prior cancel is in-flight (dev->cmd_cancel == true), we
+	 * can skip to send cancel. Then this will wait the prior
+	 * cancel, or merged into the next cancel rarely if next
+	 * cancel was started before waiting done. In any case, this
+	 * will be waked up soon or later.
+	 */
+	if (!dev->cmd_cancel) {
+		reinit_completion(&dev->cmd_cancel_done);
 
-	dev->out_urb->transfer_buffer = ack_frame;
-	dev->out_urb->transfer_buffer_length = sizeof(ack_frame);
-	rc = usb_submit_urb(dev->out_urb, GFP_KERNEL);
+		usb_kill_urb(dev->out_urb);
 
-	/* Set the cmd_cancel flag only if the URB has been successfully
-	 * submitted. It will be reset by the out URB completion callback
-	 * port100_send_complete().
-	 */
-	dev->cmd_cancel = !rc;
+		dev->out_urb->transfer_buffer = ack_frame;
+		dev->out_urb->transfer_buffer_length = sizeof(ack_frame);
+		rc = usb_submit_urb(dev->out_urb, GFP_KERNEL);
+
+		/*
+		 * Set the cmd_cancel flag only if the URB has been
+		 * successfully submitted. It will be reset by the out
+		 * URB completion callback port100_send_complete().
+		 */
+		dev->cmd_cancel = !rc;
+	}
 
 	mutex_unlock(&dev->out_urb_lock);
 
@@ -929,8 +939,8 @@ static void port100_send_complete(struct
 	struct port100 *dev = urb->context;
 
 	if (dev->cmd_cancel) {
+		complete_all(&dev->cmd_cancel_done);
 		dev->cmd_cancel = false;
-		complete(&dev->cmd_cancel_done);
 	}
 
 	switch (urb->status) {
@@ -1546,6 +1556,7 @@ static int port100_probe(struct usb_inte
 			    PORT100_COMM_RF_HEAD_MAX_LEN;
 	dev->skb_tailroom = PORT100_FRAME_TAIL_LEN;
 
+	init_completion(&dev->cmd_cancel_done);
 	INIT_WORK(&dev->cmd_complete_work, port100_wq_cmd_complete);
 
 	/* The first thing to do with the Port-100 is to set the command type
_

-- 
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH resend 1/4] nfc: Add support RC-S380P to port100
  2017-02-04  1:15 [PATCH resend 1/4] nfc: Add support RC-S380P to port100 OGAWA Hirofumi
  2017-02-04  1:15 ` [PATCH resend 2/4] nfc: Send same info for both of NFC_CMD_GET_DEVICE and NFC_EVENT_DEVICE_ADDED OGAWA Hirofumi
@ 2017-02-25 22:43 ` OGAWA Hirofumi
  2017-02-27 10:35 ` Samuel Ortiz
  2 siblings, 0 replies; 7+ messages in thread
From: OGAWA Hirofumi @ 2017-02-25 22:43 UTC (permalink / raw)
  To: Samuel Ortiz
  Cc: Aloisio Almeida Jr, Lauro Ramos Venancio, linux-wireless,
	Andrew Morton, Linus Torvalds, linux-kernel, linux-nfc

OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> writes:

Ping?

> Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
> ---
>
>  drivers/nfc/port100.c |    8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff -puN drivers/nfc/port100.c~nfc-add-rcs380p drivers/nfc/port100.c
> --- linux/drivers/nfc/port100.c~nfc-add-rcs380p	2016-12-18 22:16:53.503673411 +0900
> +++ linux-hirofumi/drivers/nfc/port100.c	2016-12-18 22:16:53.504673416 +0900
> @@ -21,8 +21,9 @@
>  
>  #define VERSION "0.1"
>  
> -#define SONY_VENDOR_ID    0x054c
> -#define RCS380_PRODUCT_ID 0x06c1
> +#define SONY_VENDOR_ID		0x054c
> +#define RCS380S_PRODUCT_ID	0x06c1
> +#define RCS380P_PRODUCT_ID	0x06c3
>  
>  #define PORT100_PROTOCOLS (NFC_PROTO_JEWEL_MASK    | \
>  			   NFC_PROTO_MIFARE_MASK   | \
> @@ -1477,7 +1478,8 @@ static struct nfc_digital_ops port100_di
>  };
>  
>  static const struct usb_device_id port100_table[] = {
> -	{ USB_DEVICE(SONY_VENDOR_ID, RCS380_PRODUCT_ID), },
> +	{ USB_DEVICE(SONY_VENDOR_ID, RCS380S_PRODUCT_ID), },
> +	{ USB_DEVICE(SONY_VENDOR_ID, RCS380P_PRODUCT_ID), },
>  	{ }
>  };
>  MODULE_DEVICE_TABLE(usb, port100_table);
> _

-- 
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH resend 1/4] nfc: Add support RC-S380P to port100
  2017-02-04  1:15 [PATCH resend 1/4] nfc: Add support RC-S380P to port100 OGAWA Hirofumi
  2017-02-04  1:15 ` [PATCH resend 2/4] nfc: Send same info for both of NFC_CMD_GET_DEVICE and NFC_EVENT_DEVICE_ADDED OGAWA Hirofumi
  2017-02-25 22:43 ` [PATCH resend 1/4] nfc: Add support RC-S380P to port100 OGAWA Hirofumi
@ 2017-02-27 10:35 ` Samuel Ortiz
  2 siblings, 0 replies; 7+ messages in thread
From: Samuel Ortiz @ 2017-02-27 10:35 UTC (permalink / raw)
  To: OGAWA Hirofumi
  Cc: linux-wireless, Andrew Morton, Linus Torvalds, linux-kernel, linux-nfc

Hi Hirofumi,

On Sat, Feb 04, 2017 at 10:15:22AM +0900, OGAWA Hirofumi wrote:
> 
> 
> Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
> ---
> 
>  drivers/nfc/port100.c |    8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
All 4 patches applied, thanks.

Cheers,
Samuel.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH resend 3/4] nfc: Fix RC-S380* needs zero-length packet
  2017-01-03  5:47 ` [PATCH resend 2/4] nfc: Send same info for both of NFC_CMD_GET_DEVICE and NFC_EVENT_DEVICE_ADDED OGAWA Hirofumi
@ 2017-01-03  5:48   ` OGAWA Hirofumi
  0 siblings, 0 replies; 7+ messages in thread
From: OGAWA Hirofumi @ 2017-01-03  5:48 UTC (permalink / raw)
  To: Samuel Ortiz
  Cc: Aloisio Almeida Jr, Lauro Ramos Venancio, linux-wireless,
	Andrew Morton, linux-kernel


If sent packet size is wMaxPacketSize boundary, this device doesn't
answer. To fix this, we have to send zero-length packet in usb spec.

Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
---

 drivers/nfc/port100.c |    1 +
 1 file changed, 1 insertion(+)

diff -puN drivers/nfc/port100.c~nfc-need-zero-packet drivers/nfc/port100.c
--- linux-ibmpc/drivers/nfc/port100.c~nfc-need-zero-packet	2016-12-31 18:27:14.814753508 +0900
+++ linux-ibmpc-hirofumi/drivers/nfc/port100.c	2016-12-31 18:32:12.928334607 +0900
@@ -1540,6 +1540,7 @@ static int port100_probe(struct usb_inte
 	usb_fill_bulk_urb(dev->out_urb, dev->udev,
 			  usb_sndbulkpipe(dev->udev, out_endpoint),
 			  NULL, 0, port100_send_complete, dev);
+	dev->out_urb->transfer_flags = URB_ZERO_PACKET;
 
 	dev->skb_headroom = PORT100_FRAME_HEADER_LEN +
 			    PORT100_COMM_RF_HEAD_MAX_LEN;
_

-- 
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2017-02-27 10:40 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-04  1:15 [PATCH resend 1/4] nfc: Add support RC-S380P to port100 OGAWA Hirofumi
2017-02-04  1:15 ` [PATCH resend 2/4] nfc: Send same info for both of NFC_CMD_GET_DEVICE and NFC_EVENT_DEVICE_ADDED OGAWA Hirofumi
2017-02-04  1:16   ` [PATCH resend 3/4] nfc: Fix RC-S380* needs zero-length packet OGAWA Hirofumi
2017-02-04  1:16     ` [PATCH resend 4/4] nfc: Fix hangup of RC-S380* in port100_send_ack() OGAWA Hirofumi
2017-02-25 22:43 ` [PATCH resend 1/4] nfc: Add support RC-S380P to port100 OGAWA Hirofumi
2017-02-27 10:35 ` Samuel Ortiz
  -- strict thread matches above, loose matches on Subject: below --
2017-01-03  5:47 OGAWA Hirofumi
2017-01-03  5:47 ` [PATCH resend 2/4] nfc: Send same info for both of NFC_CMD_GET_DEVICE and NFC_EVENT_DEVICE_ADDED OGAWA Hirofumi
2017-01-03  5:48   ` [PATCH resend 3/4] nfc: Fix RC-S380* needs zero-length packet OGAWA Hirofumi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.