-+static int cns3xxx_change_mtu(struct net_device *netdev, int new_mtu)
-+{
-+ struct port *port = netdev_priv(netdev);
-+ struct sw *sw = port->sw;
-+ u32 temp;
-+ int i;
-+ struct _rx_ring *rx_ring = sw->rx_ring;
-+ struct rx_desc *desc;
-+ struct sk_buff *skb;
-+
-+ if (new_mtu > MAX_MRU)
-+ return -EINVAL;
-+
-+ netdev->mtu = new_mtu;
-+
-+ new_mtu += 36 + SKB_DMA_REALIGN;
-+ port->mtu = new_mtu;
-+
-+ new_mtu = 0;
-+ for (i = 0; i < 3; i++) {
-+ if (switch_port_tab[i]) {
-+ if (switch_port_tab[i]->mtu > new_mtu)
-+ new_mtu = switch_port_tab[i]->mtu;
-+ }
-+ }
-+
-+
-+ if (new_mtu == sw->mtu)
-+ return 0;
-+
-+ disable_irq(IRQ_CNS3XXX_SW_R0RXC);
-+
-+ sw->mtu = new_mtu;
-+
-+ /* Disable DMA */
-+ __raw_writel(TS_SUSPEND | FS_SUSPEND, &sw->regs->dma_auto_poll_cfg);
-+
-+ for (i = 0; i < RX_DESCS; i++) {
-+ desc = &(rx_ring)->desc[i];
-+ /* Check if we own it, if we do, it will get set correctly
-+ * when it is re-used */
-+ if (!desc->cown) {
-+ skb = rx_ring->buff_tab[i];
-+ dma_unmap_single(NULL, desc->sdp, desc->sdl,
-+ DMA_FROM_DEVICE);
-+ dev_kfree_skb(skb);
-+
-+ if ((skb = dev_alloc_skb(new_mtu))) {
-+ if (SKB_DMA_REALIGN)
-+ skb_reserve(skb, SKB_DMA_REALIGN);
-+ skb_reserve(skb, NET_IP_ALIGN);
-+ desc->sdp = dma_map_single(NULL, skb->data,
-+ new_mtu, DMA_FROM_DEVICE);
-+ if (dma_mapping_error(NULL, desc->sdp)) {
-+ dev_kfree_skb(skb);
-+ skb = NULL;
-+ }
-+ }
-+
-+ /* put the new buffer on RX-free queue */
-+ rx_ring->buff_tab[i] = skb;
-+
-+ if (i == RX_DESCS - 1)
-+ desc->config0 = END_OF_RING | FIRST_SEGMENT |
-+ LAST_SEGMENT | new_mtu;
-+ else
-+ desc->config0 = FIRST_SEGMENT |
-+ LAST_SEGMENT | new_mtu;
-+ }
-+ }
-+
-+ /* Re-ENABLE DMA */
-+ temp = __raw_readl(&sw->regs->dma_auto_poll_cfg);
-+ temp &= ~(TS_SUSPEND | FS_SUSPEND);
-+ __raw_writel(temp, &sw->regs->dma_auto_poll_cfg);
-+
-+ __raw_writel((TS_POLL_EN | FS_POLL_EN), &sw->regs->dma_auto_poll_cfg);
-+
-+ enable_irq(IRQ_CNS3XXX_SW_R0RXC);
-+
-+ return 0;
-+}
-+