@@ -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 */
175218static 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-
461476static 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
13991415exit :
0 commit comments