|
@@ -77,11 +77,47 @@ void virtio_check_driver_offered_feature(const struct virtio_device *vdev,
|
|
|
unsigned int fbit);
|
|
|
|
|
|
/**
|
|
|
- * virtio_has_feature - helper to determine if this device has this feature.
|
|
|
+ * __virtio_test_bit - helper to test feature bits. For use by transports.
|
|
|
+ * Devices should normally use virtio_has_feature,
|
|
|
+ * which includes more checks.
|
|
|
* @vdev: the device
|
|
|
* @fbit: the feature bit
|
|
|
*/
|
|
|
-static inline bool virtio_has_feature(const struct virtio_device *vdev,
|
|
|
+static inline bool __virtio_test_bit(const struct virtio_device *vdev,
|
|
|
+ unsigned int fbit)
|
|
|
+{
|
|
|
+ /* Did you forget to fix assumptions on max features? */
|
|
|
+ if (__builtin_constant_p(fbit))
|
|
|
+ BUILD_BUG_ON(fbit >= 32);
|
|
|
+ else
|
|
|
+ BUG_ON(fbit >= 32);
|
|
|
+
|
|
|
+ return test_bit(fbit, vdev->features);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * __virtio_set_bit - helper to set feature bits. For use by transports.
|
|
|
+ * @vdev: the device
|
|
|
+ * @fbit: the feature bit
|
|
|
+ */
|
|
|
+static inline void __virtio_set_bit(struct virtio_device *vdev,
|
|
|
+ unsigned int fbit)
|
|
|
+{
|
|
|
+ /* Did you forget to fix assumptions on max features? */
|
|
|
+ if (__builtin_constant_p(fbit))
|
|
|
+ BUILD_BUG_ON(fbit >= 32);
|
|
|
+ else
|
|
|
+ BUG_ON(fbit >= 32);
|
|
|
+
|
|
|
+ set_bit(fbit, vdev->features);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * __virtio_clear_bit - helper to clear feature bits. For use by transports.
|
|
|
+ * @vdev: the device
|
|
|
+ * @fbit: the feature bit
|
|
|
+ */
|
|
|
+static inline void __virtio_clear_bit(struct virtio_device *vdev,
|
|
|
unsigned int fbit)
|
|
|
{
|
|
|
/* Did you forget to fix assumptions on max features? */
|
|
@@ -90,10 +126,21 @@ static inline bool virtio_has_feature(const struct virtio_device *vdev,
|
|
|
else
|
|
|
BUG_ON(fbit >= 32);
|
|
|
|
|
|
+ clear_bit(fbit, vdev->features);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * virtio_has_feature - helper to determine if this device has this feature.
|
|
|
+ * @vdev: the device
|
|
|
+ * @fbit: the feature bit
|
|
|
+ */
|
|
|
+static inline bool virtio_has_feature(const struct virtio_device *vdev,
|
|
|
+ unsigned int fbit)
|
|
|
+{
|
|
|
if (fbit < VIRTIO_TRANSPORT_F_START)
|
|
|
virtio_check_driver_offered_feature(vdev, fbit);
|
|
|
|
|
|
- return test_bit(fbit, vdev->features);
|
|
|
+ return __virtio_test_bit(vdev, fbit);
|
|
|
}
|
|
|
|
|
|
static inline
|