greybus: es2: implement flush callback
authorJohan Hovold <johan@hovoldconsulting.com>
Fri, 26 Aug 2016 10:55:47 +0000 (12:55 +0200)
committerGreg Kroah-Hartman <gregkh@google.com>
Fri, 26 Aug 2016 11:21:13 +0000 (13:21 +0200)
Implement the flush callback which is called as part of connection tear
down to flush host-device queues and stop any ongoing transfers.

Note that this should be considered an optimisation of sort since if
the CPort is stuck waiting for credit, the CPort is likely still stuck
when we try to send the cport_shutdown request over it after the
callback returns.

Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/arpc.h
drivers/staging/greybus/es2.c

index 6d277695e01dde47758f6d7948daa63a648a61f4..d44434f7ed28b4bcec02da3d1460cc0403a45d90 100644 (file)
@@ -80,6 +80,7 @@ struct arpc_response_message {
 #define ARPC_TYPE_CPORT_CONNECTED              0x01
 #define ARPC_TYPE_CPORT_QUIESCE                        0x02
 #define ARPC_TYPE_CPORT_CLEAR                  0x03
+#define ARPC_TYPE_CPORT_FLUSH                  0x04
 
 struct arpc_cport_reset_req {
        __le16 cport_id;
@@ -99,5 +100,8 @@ struct arpc_cport_clear_req {
        __le16 cport_id;
 } __packed;
 
+struct arpc_cport_flush_req {
+       __le16 cport_id;
+} __packed;
 
 #endif /* __ARPC_H */
index 8803bc9d410dbbfc1a9595aeb1e16a6c2a63f7d4..1817c3535fa9c12f26eff867a4f7228e4aa36941 100644 (file)
@@ -765,6 +765,24 @@ static int es2_cport_connected(struct gb_host_device *hd, u16 cport_id)
        return 0;
 }
 
+static int es2_cport_flush(struct gb_host_device *hd, u16 cport_id)
+{
+       struct es2_ap_dev *es2 = hd_to_es2(hd);
+       struct device *dev = &es2->usb_dev->dev;
+       struct arpc_cport_flush_req req;
+       int ret;
+
+       req.cport_id = cpu_to_le16(cport_id);
+       ret = arpc_sync(es2, ARPC_TYPE_CPORT_FLUSH, &req, sizeof(req),
+                       NULL, ES2_ARPC_CPORT_TIMEOUT);
+       if (ret) {
+               dev_err(dev, "failed to flush cport %u: %d\n", cport_id, ret);
+               return ret;
+       }
+
+       return 0;
+}
+
 static int es2_cport_quiesce(struct gb_host_device *hd, u16 cport_id,
                                size_t peer_space, unsigned int timeout)
 {
@@ -997,6 +1015,7 @@ static struct gb_hd_driver es2_driver = {
        .cport_enable                   = cport_enable,
        .cport_disable                  = cport_disable,
        .cport_connected                = es2_cport_connected,
+       .cport_flush                    = es2_cport_flush,
        .cport_quiesce                  = es2_cport_quiesce,
        .cport_clear                    = es2_cport_clear,
        .latency_tag_enable             = latency_tag_enable,