|
|
@@ -29,11 +29,13 @@
|
|
|
/* Specific functions used for Ring mode */
|
|
|
|
|
|
/* Enhanced descriptors */
|
|
|
-static inline void ehn_desc_rx_set_on_ring(struct dma_desc *p, int end)
|
|
|
+static inline void ehn_desc_rx_set_on_ring(struct dma_desc *p, int end,
|
|
|
+ int bfsize)
|
|
|
{
|
|
|
- p->des1 |= cpu_to_le32((BUF_SIZE_8KiB
|
|
|
- << ERDES1_BUFFER2_SIZE_SHIFT)
|
|
|
- & ERDES1_BUFFER2_SIZE_MASK);
|
|
|
+ if (bfsize == BUF_SIZE_16KiB)
|
|
|
+ p->des1 |= cpu_to_le32((BUF_SIZE_8KiB
|
|
|
+ << ERDES1_BUFFER2_SIZE_SHIFT)
|
|
|
+ & ERDES1_BUFFER2_SIZE_MASK);
|
|
|
|
|
|
if (end)
|
|
|
p->des1 |= cpu_to_le32(ERDES1_END_RING);
|
|
|
@@ -59,11 +61,15 @@ static inline void enh_set_tx_desc_len_on_ring(struct dma_desc *p, int len)
|
|
|
}
|
|
|
|
|
|
/* Normal descriptors */
|
|
|
-static inline void ndesc_rx_set_on_ring(struct dma_desc *p, int end)
|
|
|
+static inline void ndesc_rx_set_on_ring(struct dma_desc *p, int end, int bfsize)
|
|
|
{
|
|
|
- p->des1 |= cpu_to_le32(((BUF_SIZE_2KiB - 1)
|
|
|
- << RDES1_BUFFER2_SIZE_SHIFT)
|
|
|
- & RDES1_BUFFER2_SIZE_MASK);
|
|
|
+ if (bfsize >= BUF_SIZE_2KiB) {
|
|
|
+ int bfsize2;
|
|
|
+
|
|
|
+ bfsize2 = min(bfsize - BUF_SIZE_2KiB + 1, BUF_SIZE_2KiB - 1);
|
|
|
+ p->des1 |= cpu_to_le32((bfsize2 << RDES1_BUFFER2_SIZE_SHIFT)
|
|
|
+ & RDES1_BUFFER2_SIZE_MASK);
|
|
|
+ }
|
|
|
|
|
|
if (end)
|
|
|
p->des1 |= cpu_to_le32(RDES1_END_RING);
|