5858
5959#include "ll_temac.h"
6060
61- #define TX_BD_NUM 64
62- #define RX_BD_NUM 128
61+ /* Descriptors defines for Tx and Rx DMA */
62+ #define TX_BD_NUM_DEFAULT 64
63+ #define RX_BD_NUM_DEFAULT 1024
64+ #define TX_BD_NUM_MAX 4096
65+ #define RX_BD_NUM_MAX 4096
6366
6467/* ---------------------------------------------------------------------
6568 * Low level register access functions
@@ -301,7 +304,7 @@ static void temac_dma_bd_release(struct net_device *ndev)
301304 /* Reset Local Link (DMA) */
302305 lp -> dma_out (lp , DMA_CONTROL_REG , DMA_CONTROL_RST );
303306
304- for (i = 0 ; i < RX_BD_NUM ; i ++ ) {
307+ for (i = 0 ; i < lp -> rx_bd_num ; i ++ ) {
305308 if (!lp -> rx_skb [i ])
306309 break ;
307310 else {
@@ -312,12 +315,12 @@ static void temac_dma_bd_release(struct net_device *ndev)
312315 }
313316 if (lp -> rx_bd_v )
314317 dma_free_coherent (ndev -> dev .parent ,
315- sizeof (* lp -> rx_bd_v ) * RX_BD_NUM ,
316- lp -> rx_bd_v , lp -> rx_bd_p );
318+ sizeof (* lp -> rx_bd_v ) * lp -> rx_bd_num ,
319+ lp -> rx_bd_v , lp -> rx_bd_p );
317320 if (lp -> tx_bd_v )
318321 dma_free_coherent (ndev -> dev .parent ,
319- sizeof (* lp -> tx_bd_v ) * TX_BD_NUM ,
320- lp -> tx_bd_v , lp -> tx_bd_p );
322+ sizeof (* lp -> tx_bd_v ) * lp -> tx_bd_num ,
323+ lp -> tx_bd_v , lp -> tx_bd_p );
321324}
322325
323326/**
@@ -330,33 +333,33 @@ static int temac_dma_bd_init(struct net_device *ndev)
330333 dma_addr_t skb_dma_addr ;
331334 int i ;
332335
333- lp -> rx_skb = devm_kcalloc (& ndev -> dev , RX_BD_NUM , sizeof ( * lp -> rx_skb ) ,
334- GFP_KERNEL );
336+ lp -> rx_skb = devm_kcalloc (& ndev -> dev , lp -> rx_bd_num ,
337+ sizeof ( * lp -> rx_skb ), GFP_KERNEL );
335338 if (!lp -> rx_skb )
336339 goto out ;
337340
338341 /* allocate the tx and rx ring buffer descriptors. */
339342 /* returns a virtual address and a physical address. */
340343 lp -> tx_bd_v = dma_alloc_coherent (ndev -> dev .parent ,
341- sizeof (* lp -> tx_bd_v ) * TX_BD_NUM ,
344+ sizeof (* lp -> tx_bd_v ) * lp -> tx_bd_num ,
342345 & lp -> tx_bd_p , GFP_KERNEL );
343346 if (!lp -> tx_bd_v )
344347 goto out ;
345348
346349 lp -> rx_bd_v = dma_alloc_coherent (ndev -> dev .parent ,
347- sizeof (* lp -> rx_bd_v ) * RX_BD_NUM ,
350+ sizeof (* lp -> rx_bd_v ) * lp -> rx_bd_num ,
348351 & lp -> rx_bd_p , GFP_KERNEL );
349352 if (!lp -> rx_bd_v )
350353 goto out ;
351354
352- for (i = 0 ; i < TX_BD_NUM ; i ++ ) {
355+ for (i = 0 ; i < lp -> tx_bd_num ; i ++ ) {
353356 lp -> tx_bd_v [i ].next = cpu_to_be32 (lp -> tx_bd_p
354- + sizeof (* lp -> tx_bd_v ) * ((i + 1 ) % TX_BD_NUM ));
357+ + sizeof (* lp -> tx_bd_v ) * ((i + 1 ) % lp -> tx_bd_num ));
355358 }
356359
357- for (i = 0 ; i < RX_BD_NUM ; i ++ ) {
360+ for (i = 0 ; i < lp -> rx_bd_num ; i ++ ) {
358361 lp -> rx_bd_v [i ].next = cpu_to_be32 (lp -> rx_bd_p
359- + sizeof (* lp -> rx_bd_v ) * ((i + 1 ) % RX_BD_NUM ));
362+ + sizeof (* lp -> rx_bd_v ) * ((i + 1 ) % lp -> rx_bd_num ));
360363
361364 skb = netdev_alloc_skb_ip_align (ndev ,
362365 XTE_MAX_JUMBO_FRAME_SIZE );
@@ -389,7 +392,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
389392 lp -> tx_bd_ci = 0 ;
390393 lp -> tx_bd_tail = 0 ;
391394 lp -> rx_bd_ci = 0 ;
392- lp -> rx_bd_tail = RX_BD_NUM - 1 ;
395+ lp -> rx_bd_tail = lp -> rx_bd_num - 1 ;
393396
394397 /* Enable RX DMA transfers */
395398 wmb ();
@@ -784,7 +787,7 @@ static void temac_start_xmit_done(struct net_device *ndev)
784787 ndev -> stats .tx_bytes += be32_to_cpu (cur_p -> len );
785788
786789 lp -> tx_bd_ci ++ ;
787- if (lp -> tx_bd_ci >= TX_BD_NUM )
790+ if (lp -> tx_bd_ci >= lp -> tx_bd_num )
788791 lp -> tx_bd_ci = 0 ;
789792
790793 cur_p = & lp -> tx_bd_v [lp -> tx_bd_ci ];
@@ -810,7 +813,7 @@ static inline int temac_check_tx_bd_space(struct temac_local *lp, int num_frag)
810813 return NETDEV_TX_BUSY ;
811814
812815 tail ++ ;
813- if (tail >= TX_BD_NUM )
816+ if (tail >= lp -> tx_bd_num )
814817 tail = 0 ;
815818
816819 cur_p = & lp -> tx_bd_v [tail ];
@@ -874,7 +877,7 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
874877 ptr_to_txbd ((void * )skb , cur_p );
875878
876879 for (ii = 0 ; ii < num_frag ; ii ++ ) {
877- if (++ lp -> tx_bd_tail >= TX_BD_NUM )
880+ if (++ lp -> tx_bd_tail >= lp -> tx_bd_num )
878881 lp -> tx_bd_tail = 0 ;
879882
880883 cur_p = & lp -> tx_bd_v [lp -> tx_bd_tail ];
@@ -884,7 +887,7 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
884887 DMA_TO_DEVICE );
885888 if (dma_mapping_error (ndev -> dev .parent , skb_dma_addr )) {
886889 if (-- lp -> tx_bd_tail < 0 )
887- lp -> tx_bd_tail = TX_BD_NUM - 1 ;
890+ lp -> tx_bd_tail = lp -> tx_bd_num - 1 ;
888891 cur_p = & lp -> tx_bd_v [lp -> tx_bd_tail ];
889892 while (-- ii >= 0 ) {
890893 -- frag ;
@@ -893,7 +896,7 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
893896 skb_frag_size (frag ),
894897 DMA_TO_DEVICE );
895898 if (-- lp -> tx_bd_tail < 0 )
896- lp -> tx_bd_tail = TX_BD_NUM - 1 ;
899+ lp -> tx_bd_tail = lp -> tx_bd_num - 1 ;
897900 cur_p = & lp -> tx_bd_v [lp -> tx_bd_tail ];
898901 }
899902 dma_unmap_single (ndev -> dev .parent ,
@@ -912,7 +915,7 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
912915
913916 tail_p = lp -> tx_bd_p + sizeof (* lp -> tx_bd_v ) * lp -> tx_bd_tail ;
914917 lp -> tx_bd_tail ++ ;
915- if (lp -> tx_bd_tail >= TX_BD_NUM )
918+ if (lp -> tx_bd_tail >= lp -> tx_bd_num )
916919 lp -> tx_bd_tail = 0 ;
917920
918921 skb_tx_timestamp (skb );
@@ -932,7 +935,7 @@ static int ll_temac_recv_buffers_available(struct temac_local *lp)
932935 return 0 ;
933936 available = 1 + lp -> rx_bd_tail - lp -> rx_bd_ci ;
934937 if (available <= 0 )
935- available += RX_BD_NUM ;
938+ available += lp -> rx_bd_num ;
936939 return available ;
937940}
938941
@@ -1001,7 +1004,7 @@ static void ll_temac_recv(struct net_device *ndev)
10011004 ndev -> stats .rx_bytes += length ;
10021005
10031006 rx_bd = lp -> rx_bd_ci ;
1004- if (++ lp -> rx_bd_ci >= RX_BD_NUM )
1007+ if (++ lp -> rx_bd_ci >= lp -> rx_bd_num )
10051008 lp -> rx_bd_ci = 0 ;
10061009 } while (rx_bd != lp -> rx_bd_tail );
10071010
@@ -1032,7 +1035,7 @@ static void ll_temac_recv(struct net_device *ndev)
10321035 dma_addr_t skb_dma_addr ;
10331036
10341037 rx_bd = lp -> rx_bd_tail + 1 ;
1035- if (rx_bd >= RX_BD_NUM )
1038+ if (rx_bd >= lp -> rx_bd_num )
10361039 rx_bd = 0 ;
10371040 bd = & lp -> rx_bd_v [rx_bd ];
10381041
@@ -1248,13 +1251,52 @@ static const struct attribute_group temac_attr_group = {
12481251 .attrs = temac_device_attrs ,
12491252};
12501253
1251- /* ethtool support */
1254+ /* ---------------------------------------------------------------------
1255+ * ethtool support
1256+ */
1257+
1258+ static void ll_temac_ethtools_get_ringparam (struct net_device * ndev ,
1259+ struct ethtool_ringparam * ering )
1260+ {
1261+ struct temac_local * lp = netdev_priv (ndev );
1262+
1263+ ering -> rx_max_pending = RX_BD_NUM_MAX ;
1264+ ering -> rx_mini_max_pending = 0 ;
1265+ ering -> rx_jumbo_max_pending = 0 ;
1266+ ering -> tx_max_pending = TX_BD_NUM_MAX ;
1267+ ering -> rx_pending = lp -> rx_bd_num ;
1268+ ering -> rx_mini_pending = 0 ;
1269+ ering -> rx_jumbo_pending = 0 ;
1270+ ering -> tx_pending = lp -> tx_bd_num ;
1271+ }
1272+
1273+ static int ll_temac_ethtools_set_ringparam (struct net_device * ndev ,
1274+ struct ethtool_ringparam * ering )
1275+ {
1276+ struct temac_local * lp = netdev_priv (ndev );
1277+
1278+ if (ering -> rx_pending > RX_BD_NUM_MAX ||
1279+ ering -> rx_mini_pending ||
1280+ ering -> rx_jumbo_pending ||
1281+ ering -> rx_pending > TX_BD_NUM_MAX )
1282+ return - EINVAL ;
1283+
1284+ if (netif_running (ndev ))
1285+ return - EBUSY ;
1286+
1287+ lp -> rx_bd_num = ering -> rx_pending ;
1288+ lp -> tx_bd_num = ering -> tx_pending ;
1289+ return 0 ;
1290+ }
1291+
12521292static const struct ethtool_ops temac_ethtool_ops = {
12531293 .nway_reset = phy_ethtool_nway_reset ,
12541294 .get_link = ethtool_op_get_link ,
12551295 .get_ts_info = ethtool_op_get_ts_info ,
12561296 .get_link_ksettings = phy_ethtool_get_link_ksettings ,
12571297 .set_link_ksettings = phy_ethtool_set_link_ksettings ,
1298+ .get_ringparam = ll_temac_ethtools_get_ringparam ,
1299+ .set_ringparam = ll_temac_ethtools_set_ringparam ,
12581300};
12591301
12601302static int temac_probe (struct platform_device * pdev )
@@ -1298,6 +1340,8 @@ static int temac_probe(struct platform_device *pdev)
12981340 lp -> ndev = ndev ;
12991341 lp -> dev = & pdev -> dev ;
13001342 lp -> options = XTE_OPTION_DEFAULTS ;
1343+ lp -> rx_bd_num = RX_BD_NUM_DEFAULT ;
1344+ lp -> tx_bd_num = TX_BD_NUM_DEFAULT ;
13011345 spin_lock_init (& lp -> rx_lock );
13021346 INIT_DELAYED_WORK (& lp -> restart_work , ll_temac_restart_work_func );
13031347
0 commit comments