From a46a1ad097419aeea7350987dd95230f50d90392 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Fri, 15 Nov 2024 08:53:41 +0000
Subject: [PATCH] 固定GMAC1 网卡名为 eth3
---
kernel/drivers/dma/virt-dma.h | 127 +++++++++++++++++++++++++++++++++++++++--
1 files changed, 119 insertions(+), 8 deletions(-)
diff --git a/kernel/drivers/dma/virt-dma.h b/kernel/drivers/dma/virt-dma.h
index e9f5250..5e01bc8 100644
--- a/kernel/drivers/dma/virt-dma.h
+++ b/kernel/drivers/dma/virt-dma.h
@@ -19,12 +19,22 @@
struct list_head node;
};
+struct virt_dma_lockops;
+
struct virt_dma_chan {
struct dma_chan chan;
struct tasklet_struct task;
void (*desc_free)(struct virt_dma_desc *);
+#ifdef CONFIG_DMA_VIRTUAL_CHANNELS_OOB
+ struct virt_dma_lockops *lock_ops;
+ union {
+ spinlock_t lock;
+ hard_spinlock_t oob_lock;
+ };
+#else
spinlock_t lock;
+#endif
/* protected by vc.lock */
struct list_head desc_allocated;
@@ -40,6 +50,107 @@
{
return container_of(chan, struct virt_dma_chan, chan);
}
+
+#ifdef CONFIG_DMA_VIRTUAL_CHANNELS_OOB
+
+struct virt_dma_lockops {
+ void (*init)(struct virt_dma_chan *vc);
+ void (*lock)(struct virt_dma_chan *vc);
+ void (*unlock)(struct virt_dma_chan *vc);
+ void (*lock_irq)(struct virt_dma_chan *vc);
+ void (*unlock_irq)(struct virt_dma_chan *vc);
+ unsigned long (*lock_irqsave)(struct virt_dma_chan *vc);
+ void (*unlock_irqrestore)(struct virt_dma_chan *vc,
+ unsigned long flags);
+};
+
+static inline void vchan_lock_init(struct virt_dma_chan *vc)
+{
+ vc->lock_ops->init(vc);
+}
+
+static inline void vchan_lock(struct virt_dma_chan *vc)
+{
+ vc->lock_ops->lock(vc);
+}
+
+static inline void vchan_unlock(struct virt_dma_chan *vc)
+{
+ vc->lock_ops->unlock(vc);
+}
+
+static inline void vchan_lock_irq(struct virt_dma_chan *vc)
+{
+ vc->lock_ops->lock_irq(vc);
+}
+
+static inline void vchan_unlock_irq(struct virt_dma_chan *vc)
+{
+ vc->lock_ops->unlock_irq(vc);
+}
+
+static inline
+unsigned long __vchan_lock_irqsave(struct virt_dma_chan *vc)
+{
+ return vc->lock_ops->lock_irqsave(vc);
+}
+
+#define vchan_lock_irqsave(__vc, __flags) \
+ do { \
+ (__flags) = __vchan_lock_irqsave(__vc); \
+ } while (0)
+
+static inline
+void vchan_unlock_irqrestore(struct virt_dma_chan *vc,
+ unsigned long flags)
+{
+ vc->lock_ops->unlock_irqrestore(vc, flags);
+}
+
+static inline bool vchan_oob_handled(struct virt_dma_desc *vd)
+{
+ return !!(vd->tx.flags & DMA_OOB_INTERRUPT);
+}
+
+static inline bool vchan_oob_pulsed(struct virt_dma_desc *vd)
+{
+ return !!(vd->tx.flags & DMA_OOB_PULSE);
+}
+
+#else
+
+#define vchan_lock_init(__vc) \
+ spin_lock_init(&(__vc)->lock)
+
+#define vchan_lock(__vc) \
+ spin_lock(&(__vc)->lock)
+
+#define vchan_unlock(__vc) \
+ spin_unlock(&(__vc)->lock)
+
+#define vchan_lock_irq(__vc) \
+ spin_lock_irq(&(__vc)->lock)
+
+#define vchan_unlock_irq(__vc) \
+ spin_unlock_irq(&(__vc)->lock)
+
+#define vchan_lock_irqsave(__vc, __flags) \
+ spin_lock_irqsave(&(__vc)->lock, __flags)
+
+#define vchan_unlock_irqrestore(__vc, __flags) \
+ spin_unlock_irqrestore(&(__vc)->lock, __flags)
+
+static inline bool vchan_oob_handled(struct virt_dma_desc *vd)
+{
+ return false;
+}
+
+static inline bool vchan_oob_pulsed(struct virt_dma_desc *vd)
+{
+ return false;
+}
+
+#endif /* !CONFIG_DMA_VIRTUAL_CHANNELS_OOB */
void vchan_dma_desc_free_list(struct virt_dma_chan *vc, struct list_head *head);
void vchan_init(struct virt_dma_chan *vc, struct dma_device *dmadev);
@@ -66,9 +177,9 @@
vd->tx_result.result = DMA_TRANS_NOERROR;
vd->tx_result.residue = 0;
- spin_lock_irqsave(&vc->lock, flags);
+ vchan_lock_irqsave(vc, flags);
list_add_tail(&vd->node, &vc->desc_allocated);
- spin_unlock_irqrestore(&vc->lock, flags);
+ vchan_unlock_irqrestore(vc, flags);
return &vd->tx;
}
@@ -116,9 +227,9 @@
if (dmaengine_desc_test_reuse(&vd->tx)) {
unsigned long flags;
- spin_lock_irqsave(&vc->lock, flags);
+ vchan_lock_irqsave(vc, flags);
list_add(&vd->node, &vc->desc_allocated);
- spin_unlock_irqrestore(&vc->lock, flags);
+ vchan_unlock_irqrestore(vc, flags);
} else {
vc->desc_free(vd);
}
@@ -190,11 +301,11 @@
unsigned long flags;
LIST_HEAD(head);
- spin_lock_irqsave(&vc->lock, flags);
+ vchan_lock_irqsave(vc, flags);
vchan_get_all_descriptors(vc, &head);
list_for_each_entry(vd, &head, node)
dmaengine_desc_clear_reuse(&vd->tx);
- spin_unlock_irqrestore(&vc->lock, flags);
+ vchan_unlock_irqrestore(vc, flags);
vchan_dma_desc_free_list(vc, &head);
}
@@ -215,11 +326,11 @@
tasklet_kill(&vc->task);
- spin_lock_irqsave(&vc->lock, flags);
+ vchan_lock_irqsave(vc, flags);
list_splice_tail_init(&vc->desc_terminated, &head);
- spin_unlock_irqrestore(&vc->lock, flags);
+ vchan_unlock_irqrestore(vc, flags);
vchan_dma_desc_free_list(vc, &head);
}
--
Gitblit v1.6.2