@@ -238,7 +238,7 @@ static void ravb_ring_free(struct net_device *ndev, int q)
238
238
le32_to_cpu (desc -> dptr )))
239
239
dma_unmap_single (ndev -> dev .parent ,
240
240
le32_to_cpu (desc -> dptr ),
241
- PKT_BUF_SZ ,
241
+ priv -> rx_buf_sz ,
242
242
DMA_FROM_DEVICE );
243
243
}
244
244
ring_size = sizeof (struct ravb_ex_rx_desc ) *
@@ -300,9 +300,9 @@ static void ravb_ring_format(struct net_device *ndev, int q)
300
300
for (i = 0 ; i < priv -> num_rx_ring [q ]; i ++ ) {
301
301
/* RX descriptor */
302
302
rx_desc = & priv -> rx_ring [q ][i ];
303
- rx_desc -> ds_cc = cpu_to_le16 (PKT_BUF_SZ );
303
+ rx_desc -> ds_cc = cpu_to_le16 (priv -> rx_buf_sz );
304
304
dma_addr = dma_map_single (ndev -> dev .parent , priv -> rx_skb [q ][i ]-> data ,
305
- PKT_BUF_SZ ,
305
+ priv -> rx_buf_sz ,
306
306
DMA_FROM_DEVICE );
307
307
/* We just set the data size to 0 for a failed mapping which
308
308
* should prevent DMA from happening...
@@ -346,6 +346,10 @@ static int ravb_ring_init(struct net_device *ndev, int q)
346
346
int ring_size ;
347
347
int i ;
348
348
349
+ /* +16 gets room from the status from the card. */
350
+ priv -> rx_buf_sz = (ndev -> mtu <= 1492 ? PKT_BUF_SZ : ndev -> mtu ) +
351
+ ETH_HLEN + VLAN_HLEN ;
352
+
349
353
/* Allocate RX and TX skb rings */
350
354
priv -> rx_skb [q ] = kcalloc (priv -> num_rx_ring [q ],
351
355
sizeof (* priv -> rx_skb [q ]), GFP_KERNEL );
@@ -355,7 +359,7 @@ static int ravb_ring_init(struct net_device *ndev, int q)
355
359
goto error ;
356
360
357
361
for (i = 0 ; i < priv -> num_rx_ring [q ]; i ++ ) {
358
- skb = netdev_alloc_skb (ndev , PKT_BUF_SZ + RAVB_ALIGN - 1 );
362
+ skb = netdev_alloc_skb (ndev , priv -> rx_buf_sz + RAVB_ALIGN - 1 );
359
363
if (!skb )
360
364
goto error ;
361
365
ravb_set_buffer_align (skb );
@@ -586,7 +590,7 @@ static bool ravb_rx(struct net_device *ndev, int *quota, int q)
586
590
skb = priv -> rx_skb [q ][entry ];
587
591
priv -> rx_skb [q ][entry ] = NULL ;
588
592
dma_unmap_single (ndev -> dev .parent , le32_to_cpu (desc -> dptr ),
589
- PKT_BUF_SZ ,
593
+ priv -> rx_buf_sz ,
590
594
DMA_FROM_DEVICE );
591
595
get_ts &= (q == RAVB_NC ) ?
592
596
RAVB_RXTSTAMP_TYPE_V2_L2_EVENT :
@@ -619,11 +623,12 @@ static bool ravb_rx(struct net_device *ndev, int *quota, int q)
619
623
for (; priv -> cur_rx [q ] - priv -> dirty_rx [q ] > 0 ; priv -> dirty_rx [q ]++ ) {
620
624
entry = priv -> dirty_rx [q ] % priv -> num_rx_ring [q ];
621
625
desc = & priv -> rx_ring [q ][entry ];
622
- desc -> ds_cc = cpu_to_le16 (PKT_BUF_SZ );
626
+ desc -> ds_cc = cpu_to_le16 (priv -> rx_buf_sz );
623
627
624
628
if (!priv -> rx_skb [q ][entry ]) {
625
629
skb = netdev_alloc_skb (ndev ,
626
- PKT_BUF_SZ + RAVB_ALIGN - 1 );
630
+ priv -> rx_buf_sz +
631
+ RAVB_ALIGN - 1 );
627
632
if (!skb )
628
633
break ; /* Better luck next round. */
629
634
ravb_set_buffer_align (skb );
@@ -1854,6 +1859,17 @@ static int ravb_do_ioctl(struct net_device *ndev, struct ifreq *req, int cmd)
1854
1859
return phy_mii_ioctl (phydev , req , cmd );
1855
1860
}
1856
1861
1862
+ static int ravb_change_mtu (struct net_device * ndev , int new_mtu )
1863
+ {
1864
+ if (netif_running (ndev ))
1865
+ return - EBUSY ;
1866
+
1867
+ ndev -> mtu = new_mtu ;
1868
+ netdev_update_features (ndev );
1869
+
1870
+ return 0 ;
1871
+ }
1872
+
1857
1873
static void ravb_set_rx_csum (struct net_device * ndev , bool enable )
1858
1874
{
1859
1875
struct ravb_private * priv = netdev_priv (ndev );
@@ -1895,6 +1911,7 @@ static const struct net_device_ops ravb_netdev_ops = {
1895
1911
.ndo_set_rx_mode = ravb_set_rx_mode ,
1896
1912
.ndo_tx_timeout = ravb_tx_timeout ,
1897
1913
.ndo_do_ioctl = ravb_do_ioctl ,
1914
+ .ndo_change_mtu = ravb_change_mtu ,
1898
1915
.ndo_validate_addr = eth_validate_addr ,
1899
1916
.ndo_set_mac_address = eth_mac_addr ,
1900
1917
.ndo_set_features = ravb_set_features ,
@@ -2117,6 +2134,9 @@ static int ravb_probe(struct platform_device *pdev)
2117
2134
goto out_release ;
2118
2135
}
2119
2136
2137
+ ndev -> max_mtu = 2048 - (ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN );
2138
+ ndev -> min_mtu = ETH_MIN_MTU ;
2139
+
2120
2140
/* Set function */
2121
2141
ndev -> netdev_ops = & ravb_netdev_ops ;
2122
2142
ndev -> ethtool_ops = & ravb_ethtool_ops ;
0 commit comments