Bryan O'Donoghue [Sun, 16 Aug 2015 23:55:03 +0000 (00:55 +0100)]
greybus: loopback: convert sample report interface to debugfs
Greg previously suggested switching over to debugfs instead of a char
interface to report raw samples to user-space. At the time we agreed not
to go for that change. However later patches in this series are made
simpler if debugfs is used instead of /dev, so it makes sense to make the
conversion now for that reason. This patch removes the char interface and
replaces it with a debugfs interface. Raw samples will be acquired from
/sys/kernel/debug/gb_loopback/raw_latency_endo0:x:y:z:w where
x = <module-id>
y = <interface-id>
z = <bundle-id>
w = <cport-number>
Bryan O'Donoghue [Sun, 16 Aug 2015 23:55:02 +0000 (00:55 +0100)]
greybus: loopback: add ability to graph greybus latency
This patch adds the ability to graph the latency of the overhead introduced
by the greybus stack in the roundtrip time AP->Module->AP.
Since this is a small number it is reported in nanoseconds, not
mircoseconds. This data can also be derived with tracepoints but it's being
provided in this format to export to CSV file more easily than with
tracepoints.
'user-replicable' means something that a user can replicate.
'user-replaceable' means something that a user can replace. We defintely
mean to say replaceable not replicable here.
Rui Miguel Silva [Fri, 14 Aug 2015 12:58:19 +0000 (13:58 +0100)]
greybus: lights: add lights implementation
This patch adds lights implementation for Greybus Lights class, it
allows multiplexing of lights devices using the same connection. Also
adds two sysfs entries to led class (color, fade) which are commonly
used in several existing LED devices.
It support 2 major class of devices (normal LED and flash type), for
the first it registers to led_classdev, for the latest it registers in
the led_classdev_flash and v4l2_flash, depending on the support of the
kernel version.
Each Module can have N light devices attach and each light can have
multiple channel associated:
glights
|->light0
| |->channel0
| |->channel1
| | ....
| |->channeln
|->...
|->lightn
|->channel0
|->channel1
| ....
|->channeln
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Rui Miguel Silva [Fri, 14 Aug 2015 12:58:18 +0000 (13:58 +0100)]
greybus: makefile: add needed config options for lights
Add a function to check kernel versions and append the necessary
options to support LEDS_CLASS, LEDS_CLASS_FLASH and V4L2_FLASH_LED_CLASS
depending of the kernel version.
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Viresh Kumar [Wed, 12 Aug 2015 05:34:06 +0000 (11:04 +0530)]
greybus: protocol: send own protocol version while requesting it
The greybus specifications clearly say (for all protocols) that the
sender is responsible for sending the highest version of protocol it
supports, while it requests the same from the receiver.
But the greybus code never followed that.
Fix, this by always sending AP's version of the protocol, while
requesting the same from svc/module.
This also renames 'response' to 'version' in gb_protocol_get_version()
as it is used for both request/response.
Viresh Kumar [Wed, 12 Aug 2015 03:49:34 +0000 (09:19 +0530)]
greybus: connection: Send protocol version for firmware protocol
As per greybus specs, we need to send the protocol version for firmware
protocol and so this special case Hack.
Probably we should always send the protocol version AP supports and kill
this hack completely. But then it requires updates to specs as well, and
that should be done after some discussion.
For now, add a FIXME for that and a special case for firmware protocol.
Viresh Kumar [Wed, 12 Aug 2015 03:49:32 +0000 (09:19 +0530)]
greybus: protocol: Create request structure from within gb_protocol_get_version()
The version request can only send the version of protocol for which it
is initiated and gb_protocol_get_version() has all the information to
create the request structure.
Replace the 'request' and 'request_size' arguments to
gb_protocol_get_version() with a bool to know if the version information
of the protocol should be sent or not.
Bryan O'Donoghue [Tue, 11 Aug 2015 12:50:54 +0000 (13:50 +0100)]
greybus: loopback: handle timestamp roll-over
This patch ensures we account for roll-over in the loopback driver.
do_gettimeofday() is used to grab a timestamp. Two timestamps are derived
one before and one after a gb_operation_sync(), however since
do_gettimeofday() returns the number of seconds and mircoseconds that have
elapsed today - we need to account for a situation where the timestamp
starts at say 23:59:999us rolls over and the end time is now earlier than
the start time.
Bryan O'Donoghue [Tue, 11 Aug 2015 12:50:53 +0000 (13:50 +0100)]
greybus: loopback: functionally decompose calculation of turn-around times
We have a pattern similar to this over and over again gb->elapsed_nsecs =
timeval_to_ns(&te) - timeval_to_ns(&ts); good software practice dictates we
functionally decompose this. This patch decomposes into
gb_loopback_calc_latency().
Bryan O'Donoghue [Tue, 11 Aug 2015 12:50:52 +0000 (13:50 +0100)]
greybus: es-drivers: add outbound timestamp to connection
In order to facilitate grabbing a timestamp that doesn't include greybus
overhead, this patch adds a timestamp right before usb_submit_urb() for
both es1.c and es2.c. Long term the timestmaping of messages like this
probably wants to go away but, for the moment it may have some use to the
firmware people instrumenting the performance of the system.
Bryan O'Donoghue [Tue, 11 Aug 2015 12:50:51 +0000 (13:50 +0100)]
greybus: connection: add a timestamp kfifo to track connection handoff
For the ES2 test activity it may be beneficial to have a performance
metric that doesn't include any of the greybus stack malloc, workqueues
etc. In order to faciltate, this patch adds a simple kfifo structure to
hold two timestamp values. One timestamp will represent the last reasonable
point a greybus outbound timestamp can be taken, the other timestamp will
represent the first reasonable point an inbound timestamp can be taken. In
order to facilitate this model, tracking the timestamps in the connection
structure appears to be the best place to keep store of this data.
Bryan O'Donoghue [Tue, 11 Aug 2015 12:50:50 +0000 (13:50 +0100)]
greybus: connection: fix jump label on device_add failure
On device_add() failure in gb_connection_create_range() we jump to
err_remove_ida. Instead we should be jumping to err_free_connection, so
change the flow to accomodate.
Viresh Kumar [Tue, 11 Aug 2015 01:59:19 +0000 (07:29 +0530)]
greybus: svc: error out only for smaller payloads received
!= was used in place of <, while comparing expected and actual payload
size. The module may be running a higher version of the protocol and
might have some extra fields (towards the end) in the structure, and the
AP needs to ignore them.
This also updates the print (expected-payload-size <
actual-payload-size), when the size doesn't match for requests received
by the module. This gives more details required for debugging.
Viresh Kumar [Sat, 8 Aug 2015 02:39:32 +0000 (08:09 +0530)]
greybus: sdio: error out only for smaller payloads received
!= was used in place of <, while comparing expected and actual payload
size. The module may be running a higher version of the protocol and
might have some extra fields (towards the end) in the structure, and the
AP needs to ignore them.
This also updates the print (expected-payload-size <
actual-payload-size), when the size doesn't match for requests received
by the module. This gives more details required for debugging.
Viresh Kumar [Thu, 6 Aug 2015 07:14:55 +0000 (12:44 +0530)]
greybus: svc: Handle hotplug request from a workqueue
Bringing up a module can be time consuming, as that may require lots of
initialization on the module side. Over that, we may also need to
download the firmware first and flash that on the module.
In order to make other hotplug events to not wait for all this to
finish, handle most of module hotplug stuff outside of the hotplug
callback, with help of a workqueue.
Viresh Kumar [Thu, 6 Aug 2015 07:14:54 +0000 (12:44 +0530)]
greybus: svc: Print expected/actual payload size on mismatch
Print (expected-payload-size actual-payload-size), when the size doesn't
match for requests received by the module. This gives more details
required for debugging the issue.
Viresh Kumar [Thu, 6 Aug 2015 07:14:51 +0000 (12:44 +0530)]
greybus: gpio: Print expected/actual payload size on mismatch
Print (expected-payload-size actual-payload-size), when the size doesn't
match for requests received by the module. This gives more details
required for debugging the issue.
Viresh Kumar [Thu, 6 Aug 2015 07:14:52 +0000 (12:44 +0530)]
greybus: raw: Print expected/actual payload size on mismatch
Print (expected-payload-size actual-payload-size), when the size doesn't
match for requests received by the module. This gives more details
required for debugging the issue.
Alex Elder [Mon, 3 Aug 2015 17:57:20 +0000 (12:57 -0500)]
greybus: loopback: fix connection cleanup paths
The error paths in gb_loopback_connection_init() are kind of screwed
up--not in proper order, and the label naming convention seems a
little inconsistent.
Fix this, ensuring each error cleans up the setup that's been done
up to that point. Use the convention that the label indicates the
first thing that needs to be cleaned up.
Reorder the statements in gb_loopback_connection_exit() to match
the order of cleanup in gb_loopback_connection_init().
Alex Elder [Mon, 3 Aug 2015 17:57:18 +0000 (12:57 -0500)]
greybus: loopback: use separate attribute macro for average
Define a separate macro for displaying the average of the samples
collected. This will be used so we can calculate the average only
when requested, rather than every time a new value gets recorded.
Alex Elder [Mon, 3 Aug 2015 17:57:15 +0000 (12:57 -0500)]
greybus: loopback: use a 32-bit count
The count of statistical samples recorded is currently a 64-bit
value. 32 bits is sufficient, and in fact anything more than
that won't work for the do_div() call it's pass to anyway. So make
the count field be 32 bits.
Signed-off-by: Alex Elder <elder@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
greybus: operation: Drop alignment attribute from operation message header
The buffers allocated for message header is already 64 bit aligned and
we have explicit pad bytes in the header structure, to 64 bit align the
operation specific data.
And so there is no need to add the aligned attribute to the operation
message header. Drop it.
Suggested-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Reviewed-by: Alex Elder <elder@linaro.org> Reviewed-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Johan Hovold [Thu, 30 Jul 2015 18:30:38 +0000 (20:30 +0200)]
greybus: usb: fix hcd allocation, deregistration and deallocation
Fix allocation, deregistration and deallocation of USB HCD, and update
the hcd_priv helper functions.
The HCD private data was not allocated correctly, something which would
lead to a crash when accessed in hcd_start. The HCD was neither
reregistered or deallocated on connection tear down.
Signed-off-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>