[PATCH 5/8] 2.6.5-rc2 - sis190 update
DORMANTno replies
From: Francois Romieu <romieu@fr.zoreil.com>
Date: 2004-03-27 02:14:43
Still no functionnal change. See r8169 driver for details. drivers/net/sis190.c | 49 +++++++++++++++++++++++++++++++++++++------------ 1 files changed, 37 insertions(+), 12 deletions(-) diff -puN drivers/net/sis190.c~sis190-dma-api-rx-buffers-10 drivers/net/sis190.c
--- linux-2.6.5-rc2/drivers/net/sis190.c~sis190-dma-api-rx-buffers-10 2004-03-27 02:37:12.000000000 +0100
+++ linux-2.6.5-rc2-fr/drivers/net/sis190.c 2004-03-27 02:37:12.000000000 +0100@@ -817,10 +817,42 @@ static inline void sis190_give_to_asic(s desc->status |= cpu_to_le32(OWNbit | INTbit); } +static int sis190_alloc_rx_skb(struct pci_dev *pdev, struct net_device *dev, + char *tail, struct RxDesc *desc) +{ + dma_addr_t mapping; + int ret = 0; + + mapping = pci_map_single(pdev, tail, RX_BUF_SIZE, PCI_DMA_FROMDEVICE); + + desc->PSize = 0x0; + desc->buf_Len |= cpu_to_le32(RX_BUF_SIZE); + + sis190_give_to_asic(desc, mapping); + + return ret; +} + +static u32 sis190_rx_fill(struct sis190_private *tp, struct net_device *dev, + u32 start, u32 end) +{ + u32 cur; + + for (cur = start; end - cur > 0; cur++) { + int ret, i = cur % NUM_RX_DESC; + + ret = sis190_alloc_rx_skb(tp->pci_dev, dev, + tp->RxBufferRings + i * RX_BUF_SIZE, + tp->RxDescArray + i); + if (ret < 0) + break; + } + return cur - start; +} + static int SiS190_init_ring(struct net_device *dev) { struct sis190_private *tp = dev->priv; - int i; tp->cur_rx = 0; tp->cur_tx = tp->dirty_tx = 0;
@@ -836,22 +868,15 @@ static int SiS190_init_ring(struct net_d goto err_out; } - for (i = 0; i < NUM_RX_DESC; i++) { - struct RxDesc *desc = tp->RxDescArray + i; - dma_addr_t mapping; - - desc->PSize = 0x0; - desc->buf_Len = cpu_to_le32(RX_BUF_SIZE); + if (sis190_rx_fill(tp, dev, 0, NUM_RX_DESC) != NUM_RX_DESC) + goto err_out_free; - tp->RxBufferRing[i] = tp->RxBufferRings + i * RX_BUF_SIZE; - mapping = pci_map_single(tp->pci_dev, - tp->RxBufferRing[i], RX_BUF_SIZE, PCI_DMA_FROMDEVICE); - sis190_give_to_asic(desc, mapping); - } sis190_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1); return 0; +err_out_free: + kfree(tp->RxBufferRings); err_out: return -ENOMEM; }
_