static void smsc95xx_set_multicast(struct net_device *netdev)
 {
        struct usbnet *dev = netdev_priv(netdev);
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        unsigned long flags;
        int ret;
 
 
 static int smsc95xx_link_reset(struct usbnet *dev)
 {
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        struct mii_if_info *mii = &dev->mii;
        struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET };
        unsigned long flags;
 
 static void set_carrier(struct usbnet *dev, bool link)
 {
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
 
        if (pdata->link_ok == link)
                return;
                                     struct ethtool_wolinfo *wolinfo)
 {
        struct usbnet *dev = netdev_priv(net);
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
 
        wolinfo->supported = SUPPORTED_WAKE;
        wolinfo->wolopts = pdata->wolopts;
                                    struct ethtool_wolinfo *wolinfo)
 {
        struct usbnet *dev = netdev_priv(net);
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        int ret;
 
        if (wolinfo->wolopts & ~SUPPORTED_WAKE)
 static void set_mdix_status(struct net_device *net, __u8 mdix_ctrl)
 {
        struct usbnet *dev = netdev_priv(net);
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        int buf;
 
        if ((pdata->chip_id == ID_REV_CHIP_ID_9500A_) ||
                                       struct ethtool_link_ksettings *cmd)
 {
        struct usbnet *dev = netdev_priv(net);
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        int retval;
 
        retval = usbnet_get_link_ksettings(net, cmd);
                                       const struct ethtool_link_ksettings *cmd)
 {
        struct usbnet *dev = netdev_priv(net);
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        int retval;
 
        if (pdata->mdix_ctrl != cmd->base.eth_tp_mdix_ctrl)
 /* starts the TX path */
 static int smsc95xx_start_tx_path(struct usbnet *dev)
 {
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        unsigned long flags;
        int ret;
 
 /* Starts the Receive path */
 static int smsc95xx_start_rx_path(struct usbnet *dev, int in_pm)
 {
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        unsigned long flags;
 
        spin_lock_irqsave(&pdata->mac_cr_lock, flags);
 
 static int smsc95xx_reset(struct usbnet *dev)
 {
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        u32 read_buf, write_buf, burst_cap;
        int ret = 0, timeout;
 
 
 static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
 {
-       struct smsc95xx_priv *pdata = NULL;
+       struct smsc95xx_priv *pdata;
        u32 val;
        int ret;
 
                return ret;
        }
 
-       dev->data[0] = (unsigned long)kzalloc(sizeof(struct smsc95xx_priv),
-                                             GFP_KERNEL);
-
-       pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
        if (!pdata)
                return -ENOMEM;
 
+       dev->driver_priv = pdata;
+
        spin_lock_init(&pdata->mac_cr_lock);
 
        /* LAN95xx devices do not alter the computed checksum of 0 to 0xffff.
 
 static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf)
 {
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
-
-       if (pdata) {
-               cancel_delayed_work_sync(&pdata->carrier_check);
-               netif_dbg(dev, ifdown, dev->net, "free pdata\n");
-               kfree(pdata);
-               pdata = NULL;
-               dev->data[0] = 0;
-       }
+       struct smsc95xx_priv *pdata = dev->driver_priv;
+
+       cancel_delayed_work_sync(&pdata->carrier_check);
+       netif_dbg(dev, ifdown, dev->net, "free pdata\n");
+       kfree(pdata);
 }
 
 static u32 smsc_crc(const u8 *buffer, size_t len, int filter)
 
 static int smsc95xx_enter_suspend0(struct usbnet *dev)
 {
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        u32 val;
        int ret;
 
 
 static int smsc95xx_enter_suspend1(struct usbnet *dev)
 {
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        u32 val;
        int ret;
 
 
 static int smsc95xx_enter_suspend2(struct usbnet *dev)
 {
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        u32 val;
        int ret;
 
 
 static int smsc95xx_enter_suspend3(struct usbnet *dev)
 {
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        u32 val;
        int ret;
 
 
 static int smsc95xx_autosuspend(struct usbnet *dev, u32 link_up)
 {
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        int ret;
 
        if (!netif_running(dev->net)) {
 static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message)
 {
        struct usbnet *dev = usb_get_intfdata(intf);
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
        u32 val, link_up;
        int ret;
 
        u32 val;
 
        BUG_ON(!dev);
-       pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       pdata = dev->driver_priv;
        suspend_flags = pdata->suspend_flags;
 
        netdev_dbg(dev->net, "resume suspend_flags=0x%02x\n", suspend_flags);
 
 static int smsc95xx_manage_power(struct usbnet *dev, int on)
 {
-       struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+       struct smsc95xx_priv *pdata = dev->driver_priv;
 
        dev->intf->needs_remote_wakeup = on;