[PATCH 07/14] staging: unisys: Add support to update Features bits in channel queues

Benjamin Romer benjamin.romer at unisys.com
Tue Nov 17 14:58:05 UTC 2015


From: David Kershner <david.kershner at unisys.com>

Add support to visorbus to update the features in the channel queues.
Signal queues features is the memory location to disable/enable signal
queue interrupts.

Signed-off-by: David Kershner <david.kershner at unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer at unisys.com>
---
 drivers/staging/unisys/include/visorbus.h      |  4 +++
 drivers/staging/unisys/visorbus/visorchannel.c | 46 ++++++++++++++++++++++++++
 2 files changed, 50 insertions(+)

diff --git a/drivers/staging/unisys/include/visorbus.h b/drivers/staging/unisys/include/visorbus.h
index 9235536..644ca30 100644
--- a/drivers/staging/unisys/include/visorbus.h
+++ b/drivers/staging/unisys/include/visorbus.h
@@ -218,6 +218,10 @@ char *visorchannel_uuid_id(uuid_le *guid, char *s);
 void visorchannel_debug(struct visorchannel *channel, int num_queues,
 			struct seq_file *seq, u32 off);
 void __iomem *visorchannel_get_header(struct visorchannel *channel);
+void visorchannel_set_sig_features(struct visorchannel *channel, u32 queue,
+				   u64 features);
+void visorchannel_clear_sig_features(struct visorchannel *channel, u32 queue,
+				     u64 features);
 
 #define BUS_ROOT_DEVICE		UINT_MAX
 struct visor_device *visorbus_get_device_by_id(u32 bus_no, u32 dev_no,
diff --git a/drivers/staging/unisys/visorbus/visorchannel.c b/drivers/staging/unisys/visorbus/visorchannel.c
index a4e117f..2ef79fa 100644
--- a/drivers/staging/unisys/visorbus/visorchannel.c
+++ b/drivers/staging/unisys/visorbus/visorchannel.c
@@ -538,6 +538,52 @@ visorchannel_signalqueue_max_slots(struct visorchannel *channel, u32 queue)
 }
 EXPORT_SYMBOL_GPL(visorchannel_signalqueue_max_slots);
 
+/**
+ *	visorchannel_clear_or_set_sig_features
+ *
+ *	Clear or set bits within the 64-bit features word for the
+ *	specified channel and queue.
+ *	@channel: the channel to modify features for.
+ *	@queue: the queue number to modify features for.
+ *	@features: a mask of feature bits usage based on is_set flag;
+ *	@is_set: if is_set is true, 1 bits indicate which features bits
+ *		 you want to set within the feature word;
+ *		 if is_set is false, 1 bits indicate which feature bits
+ *		 you want to clear within the features word
+ */
+void
+visorchannel_clear_or_set_sig_features(struct visorchannel *channel,
+				       u32 queue, u64 features, bool is_set)
+{
+	struct signal_queue_header sig_hdr;
+
+	if (!sig_read_header(channel, queue, &sig_hdr))
+		return;
+	sig_hdr.features = (is_set) ? sig_hdr.features | features :
+			   sig_hdr.features & !features;
+	if (!SIG_WRITE_FIELD(channel, queue, &sig_hdr, features))
+		return;
+	wmb(); /* required to sync channel with IOSP */
+}
+
+void
+visorchannel_clear_sig_features(struct visorchannel *channel, u32 queue,
+				u64 features)
+{
+	visorchannel_clear_or_set_sig_features(channel, queue, features,
+					       false);
+}
+EXPORT_SYMBOL_GPL(visorchannel_clear_sig_features);
+
+void
+visorchannel_set_sig_features(struct visorchannel *channel, u32 queue,
+			      u64 features)
+{
+	visorchannel_clear_or_set_sig_features(channel, queue, features,
+					       true);
+}
+EXPORT_SYMBOL_GPL(visorchannel_set_sig_features);
+
 static void
 sigqueue_debug(struct signal_queue_header *q, int which, struct seq_file *seq)
 {
-- 
2.5.0



More information about the devel mailing list