37
37
38
38
#define MACB_RX_BUFFER_SIZE 128
39
39
#define RX_BUFFER_MULTIPLE 64 /* bytes */
40
+
40
41
#define DEFAULT_RX_RING_SIZE 512 /* must be power of 2 */
42
+ #define MIN_RX_RING_SIZE 64
43
+ #define MAX_RX_RING_SIZE 8192
41
44
#define RX_RING_BYTES (bp ) (sizeof(struct macb_dma_desc) \
42
45
* (bp)->rx_ring_size)
43
46
44
47
#define DEFAULT_TX_RING_SIZE 512 /* must be power of 2 */
48
+ #define MIN_TX_RING_SIZE 64
49
+ #define MAX_TX_RING_SIZE 4096
45
50
#define TX_RING_BYTES (bp ) (sizeof(struct macb_dma_desc) \
46
51
* (bp)->tx_ring_size)
47
52
@@ -2211,6 +2216,56 @@ static int macb_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
2211
2216
return 0 ;
2212
2217
}
2213
2218
2219
+ static void macb_get_ringparam (struct net_device * netdev ,
2220
+ struct ethtool_ringparam * ring )
2221
+ {
2222
+ struct macb * bp = netdev_priv (netdev );
2223
+
2224
+ ring -> rx_max_pending = MAX_RX_RING_SIZE ;
2225
+ ring -> tx_max_pending = MAX_TX_RING_SIZE ;
2226
+
2227
+ ring -> rx_pending = bp -> rx_ring_size ;
2228
+ ring -> tx_pending = bp -> tx_ring_size ;
2229
+ }
2230
+
2231
+ static int macb_set_ringparam (struct net_device * netdev ,
2232
+ struct ethtool_ringparam * ring )
2233
+ {
2234
+ struct macb * bp = netdev_priv (netdev );
2235
+ u32 new_rx_size , new_tx_size ;
2236
+ unsigned int reset = 0 ;
2237
+
2238
+ if ((ring -> rx_mini_pending ) || (ring -> rx_jumbo_pending ))
2239
+ return - EINVAL ;
2240
+
2241
+ new_rx_size = clamp_t (u32 , ring -> rx_pending ,
2242
+ MIN_RX_RING_SIZE , MAX_RX_RING_SIZE );
2243
+ new_rx_size = roundup_pow_of_two (new_rx_size );
2244
+
2245
+ new_tx_size = clamp_t (u32 , ring -> tx_pending ,
2246
+ MIN_TX_RING_SIZE , MAX_TX_RING_SIZE );
2247
+ new_tx_size = roundup_pow_of_two (new_tx_size );
2248
+
2249
+ if ((new_tx_size == bp -> tx_ring_size ) &&
2250
+ (new_rx_size == bp -> rx_ring_size )) {
2251
+ /* nothing to do */
2252
+ return 0 ;
2253
+ }
2254
+
2255
+ if (netif_running (bp -> dev )) {
2256
+ reset = 1 ;
2257
+ macb_close (bp -> dev );
2258
+ }
2259
+
2260
+ bp -> rx_ring_size = new_rx_size ;
2261
+ bp -> tx_ring_size = new_tx_size ;
2262
+
2263
+ if (reset )
2264
+ macb_open (bp -> dev );
2265
+
2266
+ return 0 ;
2267
+ }
2268
+
2214
2269
static const struct ethtool_ops macb_ethtool_ops = {
2215
2270
.get_regs_len = macb_get_regs_len ,
2216
2271
.get_regs = macb_get_regs ,
@@ -2220,6 +2275,8 @@ static const struct ethtool_ops macb_ethtool_ops = {
2220
2275
.set_wol = macb_set_wol ,
2221
2276
.get_link_ksettings = phy_ethtool_get_link_ksettings ,
2222
2277
.set_link_ksettings = phy_ethtool_set_link_ksettings ,
2278
+ .get_ringparam = macb_get_ringparam ,
2279
+ .set_ringparam = macb_set_ringparam ,
2223
2280
};
2224
2281
2225
2282
static const struct ethtool_ops gem_ethtool_ops = {
@@ -2232,6 +2289,8 @@ static const struct ethtool_ops gem_ethtool_ops = {
2232
2289
.get_sset_count = gem_get_sset_count ,
2233
2290
.get_link_ksettings = phy_ethtool_get_link_ksettings ,
2234
2291
.set_link_ksettings = phy_ethtool_set_link_ksettings ,
2292
+ .get_ringparam = macb_get_ringparam ,
2293
+ .set_ringparam = macb_set_ringparam ,
2235
2294
};
2236
2295
2237
2296
static int macb_ioctl (struct net_device * dev , struct ifreq * rq , int cmd )
0 commit comments