Skip to content

Commit 82ce18b

Browse files
KAZUMIZUgregkh
authored andcommitted
ravb: unmap descriptors when freeing rings
[ Upstream commit a47b70ea86bdeb3091341f5ae3ef580f1a1ad822 ] "swiotlb buffer is full" errors occur after repeated initialisation of a device - f.e. suspend/resume or ip link set up/down. This is because memory mapped using dma_map_single() in ravb_ring_format() and ravb_start_xmit() is not released. Resolve this problem by unmapping descriptors when freeing rings. Fixes: c156633 ("Renesas Ethernet AVB driver proper") Signed-off-by: Kazuya Mizuguchi <kazuya.mizuguchi.ks@renesas.com> [simon: reworked] Signed-off-by: Simon Horman <horms+renesas@verge.net.au> Acked-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <alexander.levin@verizon.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 3987a40 commit 82ce18b

1 file changed

Lines changed: 64 additions & 48 deletions

File tree

drivers/net/ethernet/renesas/ravb_main.c

Lines changed: 64 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,49 @@ static struct mdiobb_ops bb_ops = {
171171
.get_mdio_data = ravb_get_mdio_data,
172172
};
173173

174+
/* Free TX skb function for AVB-IP */
175+
static int ravb_tx_free(struct net_device *ndev, int q, bool free_txed_only)
176+
{
177+
struct ravb_private *priv = netdev_priv(ndev);
178+
struct net_device_stats *stats = &priv->stats[q];
179+
struct ravb_tx_desc *desc;
180+
int free_num = 0;
181+
int entry;
182+
u32 size;
183+
184+
for (; priv->cur_tx[q] - priv->dirty_tx[q] > 0; priv->dirty_tx[q]++) {
185+
bool txed;
186+
187+
entry = priv->dirty_tx[q] % (priv->num_tx_ring[q] *
188+
NUM_TX_DESC);
189+
desc = &priv->tx_ring[q][entry];
190+
txed = desc->die_dt == DT_FEMPTY;
191+
if (free_txed_only && !txed)
192+
break;
193+
/* Descriptor type must be checked before all other reads */
194+
dma_rmb();
195+
size = le16_to_cpu(desc->ds_tagl) & TX_DS;
196+
/* Free the original skb. */
197+
if (priv->tx_skb[q][entry / NUM_TX_DESC]) {
198+
dma_unmap_single(ndev->dev.parent, le32_to_cpu(desc->dptr),
199+
size, DMA_TO_DEVICE);
200+
/* Last packet descriptor? */
201+
if (entry % NUM_TX_DESC == NUM_TX_DESC - 1) {
202+
entry /= NUM_TX_DESC;
203+
dev_kfree_skb_any(priv->tx_skb[q][entry]);
204+
priv->tx_skb[q][entry] = NULL;
205+
if (txed)
206+
stats->tx_packets++;
207+
}
208+
free_num++;
209+
}
210+
if (txed)
211+
stats->tx_bytes += size;
212+
desc->die_dt = DT_EEMPTY;
213+
}
214+
return free_num;
215+
}
216+
174217
/* Free skb's and DMA buffers for Ethernet AVB */
175218
static void ravb_ring_free(struct net_device *ndev, int q)
176219
{
@@ -186,19 +229,21 @@ static void ravb_ring_free(struct net_device *ndev, int q)
186229
kfree(priv->rx_skb[q]);
187230
priv->rx_skb[q] = NULL;
188231

189-
/* Free TX skb ringbuffer */
190-
if (priv->tx_skb[q]) {
191-
for (i = 0; i < priv->num_tx_ring[q]; i++)
192-
dev_kfree_skb(priv->tx_skb[q][i]);
193-
}
194-
kfree(priv->tx_skb[q]);
195-
priv->tx_skb[q] = NULL;
196-
197232
/* Free aligned TX buffers */
198233
kfree(priv->tx_align[q]);
199234
priv->tx_align[q] = NULL;
200235

201236
if (priv->rx_ring[q]) {
237+
for (i = 0; i < priv->num_rx_ring[q]; i++) {
238+
struct ravb_ex_rx_desc *desc = &priv->rx_ring[q][i];
239+
240+
if (!dma_mapping_error(ndev->dev.parent,
241+
le32_to_cpu(desc->dptr)))
242+
dma_unmap_single(ndev->dev.parent,
243+
le32_to_cpu(desc->dptr),
244+
PKT_BUF_SZ,
245+
DMA_FROM_DEVICE);
246+
}
202247
ring_size = sizeof(struct ravb_ex_rx_desc) *
203248
(priv->num_rx_ring[q] + 1);
204249
dma_free_coherent(ndev->dev.parent, ring_size, priv->rx_ring[q],
@@ -207,12 +252,20 @@ static void ravb_ring_free(struct net_device *ndev, int q)
207252
}
208253

209254
if (priv->tx_ring[q]) {
255+
ravb_tx_free(ndev, q, false);
256+
210257
ring_size = sizeof(struct ravb_tx_desc) *
211258
(priv->num_tx_ring[q] * NUM_TX_DESC + 1);
212259
dma_free_coherent(ndev->dev.parent, ring_size, priv->tx_ring[q],
213260
priv->tx_desc_dma[q]);
214261
priv->tx_ring[q] = NULL;
215262
}
263+
264+
/* Free TX skb ringbuffer.
265+
* SKBs are freed by ravb_tx_free() call above.
266+
*/
267+
kfree(priv->tx_skb[q]);
268+
priv->tx_skb[q] = NULL;
216269
}
217270

218271
/* Format skb and descriptor buffer for Ethernet AVB */
@@ -420,44 +473,6 @@ static int ravb_dmac_init(struct net_device *ndev)
420473
return 0;
421474
}
422475

423-
/* Free TX skb function for AVB-IP */
424-
static int ravb_tx_free(struct net_device *ndev, int q)
425-
{
426-
struct ravb_private *priv = netdev_priv(ndev);
427-
struct net_device_stats *stats = &priv->stats[q];
428-
struct ravb_tx_desc *desc;
429-
int free_num = 0;
430-
int entry;
431-
u32 size;
432-
433-
for (; priv->cur_tx[q] - priv->dirty_tx[q] > 0; priv->dirty_tx[q]++) {
434-
entry = priv->dirty_tx[q] % (priv->num_tx_ring[q] *
435-
NUM_TX_DESC);
436-
desc = &priv->tx_ring[q][entry];
437-
if (desc->die_dt != DT_FEMPTY)
438-
break;
439-
/* Descriptor type must be checked before all other reads */
440-
dma_rmb();
441-
size = le16_to_cpu(desc->ds_tagl) & TX_DS;
442-
/* Free the original skb. */
443-
if (priv->tx_skb[q][entry / NUM_TX_DESC]) {
444-
dma_unmap_single(ndev->dev.parent, le32_to_cpu(desc->dptr),
445-
size, DMA_TO_DEVICE);
446-
/* Last packet descriptor? */
447-
if (entry % NUM_TX_DESC == NUM_TX_DESC - 1) {
448-
entry /= NUM_TX_DESC;
449-
dev_kfree_skb_any(priv->tx_skb[q][entry]);
450-
priv->tx_skb[q][entry] = NULL;
451-
stats->tx_packets++;
452-
}
453-
free_num++;
454-
}
455-
stats->tx_bytes += size;
456-
desc->die_dt = DT_EEMPTY;
457-
}
458-
return free_num;
459-
}
460-
461476
static void ravb_get_tx_tstamp(struct net_device *ndev)
462477
{
463478
struct ravb_private *priv = netdev_priv(ndev);
@@ -797,7 +812,7 @@ static int ravb_poll(struct napi_struct *napi, int budget)
797812
spin_lock_irqsave(&priv->lock, flags);
798813
/* Clear TX interrupt */
799814
ravb_write(ndev, ~mask, TIS);
800-
ravb_tx_free(ndev, q);
815+
ravb_tx_free(ndev, q, true);
801816
netif_wake_subqueue(ndev, q);
802817
mmiowb();
803818
spin_unlock_irqrestore(&priv->lock, flags);
@@ -1393,7 +1408,8 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev)
13931408

13941409
priv->cur_tx[q] += NUM_TX_DESC;
13951410
if (priv->cur_tx[q] - priv->dirty_tx[q] >
1396-
(priv->num_tx_ring[q] - 1) * NUM_TX_DESC && !ravb_tx_free(ndev, q))
1411+
(priv->num_tx_ring[q] - 1) * NUM_TX_DESC &&
1412+
!ravb_tx_free(ndev, q, true))
13971413
netif_stop_subqueue(ndev, q);
13981414

13991415
exit:

0 commit comments

Comments
 (0)