return NETDEV_TX_BUSY;
 }
 
-static void ntb_netdev_tx_timer(unsigned long data)
+static void ntb_netdev_tx_timer(struct timer_list *t)
 {
-       struct net_device *ndev = (struct net_device *)data;
-       struct ntb_netdev *dev = netdev_priv(ndev);
+       struct ntb_netdev *dev = from_timer(dev, t, tx_timer);
+       struct net_device *ndev = dev->ndev;
 
        if (ntb_transport_tx_free_entry(dev->qp) < tx_stop) {
                mod_timer(&dev->tx_timer, jiffies + msecs_to_jiffies(tx_time));
                }
        }
 
-       setup_timer(&dev->tx_timer, ntb_netdev_tx_timer, (unsigned long)ndev);
+       timer_setup(&dev->tx_timer, ntb_netdev_tx_timer, 0);
 
        netif_carrier_off(ndev);
        ntb_transport_link_up(dev->qp);