]> err.no Git - linux-2.6/commitdiff
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
authorDavid Howells <dhowells@redhat.com>
Tue, 5 Dec 2006 14:37:56 +0000 (14:37 +0000)
committerDavid Howells <dhowells@warthog.cambridge.redhat.com>
Tue, 5 Dec 2006 14:37:56 +0000 (14:37 +0000)
Conflicts:

drivers/infiniband/core/iwcm.c
drivers/net/chelsio/cxgb2.c
drivers/net/wireless/bcm43xx/bcm43xx_main.c
drivers/net/wireless/prism54/islpci_eth.c
drivers/usb/core/hub.h
drivers/usb/input/hid-core.c
net/core/netpoll.c

Fix up merge failures with Linus's head and fix new compilation failures.

Signed-Off-By: David Howells <dhowells@redhat.com>
87 files changed:
1  2 
block/as-iosched.c
block/cfq-iosched.c
block/ll_rw_blk.c
drivers/ata/libata-scsi.c
drivers/char/random.c
drivers/char/tpm/tpm.c
drivers/char/tty_io.c
drivers/char/vt.c
drivers/infiniband/core/addr.c
drivers/infiniband/core/cm.c
drivers/infiniband/core/cma.c
drivers/infiniband/core/iwcm.c
drivers/infiniband/core/mad.c
drivers/infiniband/ulp/ipoib/ipoib.h
drivers/infiniband/ulp/ipoib/ipoib_main.c
drivers/infiniband/ulp/ipoib/ipoib_multicast.c
drivers/infiniband/ulp/srp/ib_srp.c
drivers/media/dvb/cinergyT2/cinergyT2.c
drivers/media/video/saa6588.c
drivers/mmc/mmc.c
drivers/mmc/mmc_sysfs.c
drivers/net/bnx2.c
drivers/net/cassini.c
drivers/net/chelsio/common.h
drivers/net/chelsio/cxgb2.c
drivers/net/e100.c
drivers/net/e1000/e1000_main.c
drivers/net/ixgb/ixgb_main.c
drivers/net/myri10ge/myri10ge.c
drivers/net/phy/phy.c
drivers/net/r8169.c
drivers/net/skge.c
drivers/net/spider_net.c
drivers/net/sungem.c
drivers/net/wireless/bcm43xx/bcm43xx.h
drivers/net/wireless/bcm43xx/bcm43xx_main.c
drivers/net/wireless/ipw2100.c
drivers/net/wireless/ipw2200.c
drivers/net/wireless/prism54/isl_ioctl.c
drivers/net/wireless/prism54/isl_ioctl.h
drivers/net/wireless/prism54/islpci_dev.c
drivers/net/wireless/prism54/islpci_eth.c
drivers/net/wireless/prism54/islpci_eth.h
drivers/net/wireless/prism54/islpci_mgt.c
drivers/net/wireless/zd1211rw/zd_mac.c
drivers/net/wireless/zd1211rw/zd_mac.h
drivers/pcmcia/ds.c
drivers/rtc/rtc-dev.c
drivers/usb/atm/speedtch.c
drivers/usb/atm/ueagle-atm.c
drivers/usb/class/cdc-acm.c
drivers/usb/core/hub.c
drivers/usb/core/message.c
drivers/usb/core/usb.c
drivers/usb/gadget/ether.c
drivers/usb/host/u132-hcd.c
drivers/usb/input/hid-core.c
drivers/usb/misc/ftdi-elan.c
drivers/usb/misc/phidgetkit.c
drivers/usb/misc/phidgetmotorcontrol.c
drivers/usb/net/pegasus.c
drivers/usb/net/usbnet.c
drivers/usb/serial/aircable.c
drivers/usb/serial/digi_acceleport.c
drivers/usb/serial/ftdi_sio.c
drivers/usb/serial/usb-serial.c
fs/aio.c
fs/bio.c
fs/reiserfs/journal.c
include/linux/mmc/host.h
include/linux/reiserfs_fs_sb.h
include/linux/tty.h
include/linux/usb.h
include/net/sctp/structs.h
include/scsi/libsas.h
kernel/kmod.c
net/atm/lec.c
net/atm/lec.h
net/core/netpoll.c
net/dccp/minisocks.c
net/ieee80211/softmac/ieee80211softmac_auth.c
net/ieee80211/softmac/ieee80211softmac_scan.c
net/ipv4/tcp_minisocks.c
net/sctp/associola.c
net/sctp/endpointola.c
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_state.c

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 9bfa785252dc746a59b02267952cd400205b3846,cf797d7aea09a0673617a1e04aa56da384509d8c..1039ad57d53b4b0f3ef2d252c51fb9a47bfd68f0
@@@ -828,10 -828,10 +828,10 @@@ static int process_event(struct iwcm_id
   * thread asleep on the destroy_comp list vs. an object destroyed
   * here synchronously when the last reference is removed.
   */
 -static void cm_work_handler(void *arg)
 +static void cm_work_handler(struct work_struct *_work)
  {
-       struct iwcm_work lwork, *work =
-               container_of(_work, struct iwcm_work, work);
 -      struct iwcm_work *work = arg;
++      struct iwcm_work *work = container_of(_work, struct iwcm_work, work);
+       struct iw_cm_event levent;
        struct iwcm_id_private *cm_id_priv = work->cm_id;
        unsigned long flags;
        int empty;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index b12cc4596b8d0168019ea03b3be0a2f58bd4d471,fc2f1d1c7ead437f4665539b9b7e61c461ac527f..5bacb7587df41b77cdc414b278e85750279f4477
@@@ -5630,10 -5702,10 +5702,10 @@@ bnx2_init_board(struct pci_dev *pdev, s
        bp->pdev = pdev;
  
        spin_lock_init(&bp->phy_lock);
 -      INIT_WORK(&bp->reset_task, bnx2_reset_task, bp);
 +      INIT_WORK(&bp->reset_task, bnx2_reset_task);
  
        dev->base_addr = dev->mem_start = pci_resource_start(pdev, 0);
-       mem_len = MB_GET_CID_ADDR(17);
+       mem_len = MB_GET_CID_ADDR(TX_TSS_CID + 1);
        dev->mem_end = dev->mem_start + mem_len;
        dev->irq = pdev->irq;
  
Simple merge
index 8b1bedbce0d51984ceb02e002477719de954aaa0,b265941e137220a90eb3d8d1588c61cb04ee717d..74758d2c7af8c368ff79b7ab4dc29aa04c7f0ffb
@@@ -207,14 -276,16 +276,16 @@@ struct adapter 
        /* Terminator modules. */
        struct sge    *sge;
        struct peespi *espi;
+       struct petp   *tp;
  
        struct port_info port[MAX_NPORTS];
 -      struct work_struct stats_update_task;
 +      struct delayed_work stats_update_task;
        struct timer_list stats_update_timer;
  
-       struct semaphore mib_mutex;
        spinlock_t tpi_lock;
        spinlock_t work_lock;
+       spinlock_t mac_lock;
        /* guards async operations */
        spinlock_t async_lock ____cacheline_aligned;
        u32 slow_intr_mask;
index f607cc6a276bbf3ed39a1c9e735dbe2f0753ef8c,53bec6739812366fdf0c1537b54149409d9ae1ec..de48eadddbc4af9fa09452fea78b22ec7f17cf9c
@@@ -952,12 -977,11 +978,12 @@@ static void mac_stats_task(struct work_
  /*
   * Processes elmer0 external interrupts in process context.
   */
 -static void ext_intr_task(void *data)
 +static void ext_intr_task(struct work_struct *work)
  {
 -      struct adapter *adapter = data;
 +      struct adapter *adapter =
 +              container_of(work, struct adapter, ext_intr_handler_task);
  
-       elmer0_ext_intr_handler(adapter);
+       t1_elmer0_ext_intr_handler(adapter);
  
        /* Now reenable external interrupts */
        spin_lock_irq(&adapter->async_lock);
@@@ -1086,18 -1110,12 +1112,12 @@@ static int __devinit init_one(struct pc
                        spin_lock_init(&adapter->tpi_lock);
                        spin_lock_init(&adapter->work_lock);
                        spin_lock_init(&adapter->async_lock);
+                       spin_lock_init(&adapter->mac_lock);
  
                        INIT_WORK(&adapter->ext_intr_handler_task,
 -                                ext_intr_task, adapter);
 -                      INIT_WORK(&adapter->stats_update_task, mac_stats_task,
 -                                adapter);
 +                                ext_intr_task);
 +                      INIT_DELAYED_WORK(&adapter->stats_update_task,
 +                                        mac_stats_task);
- #ifdef work_struct
-                       init_timer(&adapter->stats_update_timer);
-                       adapter->stats_update_timer.function = mac_stats_timer;
-                       adapter->stats_update_timer.data =
-                               (unsigned long)adapter;
- #endif
  
                        pci_set_drvdata(pdev, netdev);
                }
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 728a9b789fdf54fa569e0fa0a96eec9f2c4ad686,5b3c27359a1840ba2c2bf59bd1264da401fd720e..2ec2e5afce67dd67d6e62e235e4ac68db37fb76c
@@@ -3156,31 -3215,9 +3215,10 @@@ static void do_periodic_work(struct bcm
        schedule_delayed_work(&bcm->periodic_work, HZ * 15);
  }
  
- /* Estimate a "Badness" value based on the periodic work
-  * state-machine state. "Badness" is worse (bigger), if the
-  * periodic work will take longer.
-  */
- static int estimate_periodic_work_badness(unsigned int state)
- {
-       int badness = 0;
-       if (state % 8 == 0) /* every 120 sec */
-               badness += 10;
-       if (state % 4 == 0) /* every 60 sec */
-               badness += 5;
-       if (state % 2 == 0) /* every 30 sec */
-               badness += 1;
-       if (state % 1 == 0) /* every 15 sec */
-               badness += 1;
- #define BADNESS_LIMIT 4
-       return badness;
- }
 -static void bcm43xx_periodic_work_handler(void *d)
 +static void bcm43xx_periodic_work_handler(struct work_struct *work)
  {
 -      struct bcm43xx_private *bcm = d;
 +      struct bcm43xx_private *bcm =
 +              container_of(work, struct bcm43xx_private, periodic_work.work);
        struct net_device *net_dev = bcm->net_dev;
        unsigned long flags;
        u32 savedirqs = 0;
Simple merge
Simple merge
index 103a378777331123c282c8635ad485edbfd63d43,676d83813dc8526699c732d3eccc36d583ad536f..b1122912ee2d25dcaffe7024bd78c00b5bcc6b75
@@@ -482,12 -480,14 +480,14 @@@ islpci_eth_receive(islpci_private *priv
  }
  
  void
 -islpci_do_reset_and_wake(void *data)
 +islpci_do_reset_and_wake(struct work_struct *work)
  {
 -      islpci_private *priv = data;
 +      islpci_private *priv = container_of(work, islpci_private, reset_task);
        islpci_reset(priv, 1);
-       netif_wake_queue(priv->ndev);
        priv->reset_task_pending = 0;
+       smp_wmb();
+       netif_wake_queue(priv->ndev);
  }
  
  void
index 5e4f4b707375887baefd988a7532712783dc50e2,2696f95b92781d94c67b0258b91699afe7aee685..44f3cfd4cc1de6bc242c58a629ad6eed87cfd08d
@@@ -1028,72 -1180,11 +1180,12 @@@ struct iw_statistics *zd_mac_get_wirele
        return iw_stats;
  }
  
- #ifdef DEBUG
- static const char* decryption_types[] = {
-       [ZD_RX_NO_WEP] = "none",
-       [ZD_RX_WEP64] = "WEP64",
-       [ZD_RX_TKIP] = "TKIP",
-       [ZD_RX_AES] = "AES",
-       [ZD_RX_WEP128] = "WEP128",
-       [ZD_RX_WEP256] = "WEP256",
- };
- static const char *decryption_type_string(u8 type)
- {
-       const char *s;
-       if (type < ARRAY_SIZE(decryption_types)) {
-               s = decryption_types[type];
-       } else {
-               s = NULL;
-       }
-       return s ? s : "unknown";
- }
- static int is_ofdm(u8 frame_status)
- {
-       return (frame_status & ZD_RX_OFDM);
- }
- void zd_dump_rx_status(const struct rx_status *status)
- {
-       const char* modulation;
-       u8 quality;
-       if (is_ofdm(status->frame_status)) {
-               modulation = "ofdm";
-               quality = status->signal_quality_ofdm;
-       } else {
-               modulation = "cck";
-               quality = status->signal_quality_cck;
-       }
-       pr_debug("rx status %s strength %#04x qual %#04x decryption %s\n",
-               modulation, status->signal_strength, quality,
-               decryption_type_string(status->decryption_type));
-       if (status->frame_status & ZD_RX_ERROR) {
-               pr_debug("rx error %s%s%s%s%s%s\n",
-                       (status->frame_status & ZD_RX_TIMEOUT_ERROR) ?
-                               "timeout " : "",
-                       (status->frame_status & ZD_RX_FIFO_OVERRUN_ERROR) ?
-                               "fifo " : "",
-                       (status->frame_status & ZD_RX_DECRYPTION_ERROR) ?
-                               "decryption " : "",
-                       (status->frame_status & ZD_RX_CRC32_ERROR) ?
-                               "crc32 " : "",
-                       (status->frame_status & ZD_RX_NO_ADDR1_MATCH_ERROR) ?
-                               "addr1 " : "",
-                       (status->frame_status & ZD_RX_CRC16_ERROR) ?
-                               "crc16" : "");
-       }
- }
- #endif /* DEBUG */
  #define LINK_LED_WORK_DELAY HZ
  
 -static void link_led_handler(void *p)
 +static void link_led_handler(struct work_struct *work)
  {
 -      struct zd_mac *mac = p;
 +      struct zd_mac *mac =
 +              container_of(work, struct zd_mac, housekeeping.link_led_work.work);
        struct zd_chip *chip = &mac->chip;
        struct ieee80211softmac_device *sm = ieee80211_priv(mac->netdev);
        int is_associated;
index 7957cac3de25c452ecaad56a5b07988e5305923b,5dcfb251f02ec6b2d2eb9c5cc5641300ac5b2648..08d6b8c08e75a1a8702275c738753c931e6d8842
@@@ -116,12 -118,8 +118,8 @@@ struct rx_status 
  #define ZD_RX_CRC16_ERROR             0x40
  #define ZD_RX_ERROR                   0x80
  
- enum mac_flags {
-       MAC_FIXED_CHANNEL = 0x01,
- };
  struct housekeeping {
 -      struct work_struct link_led_work;
 +      struct delayed_work link_led_work;
  };
  
  #define ZD_MAC_STATS_BUFFER_SIZE 16
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index ad0ffbe8f7d78c2832514427d4c4aa9a76bb92e1,0ce393eb3c4b0bea98e9a6ec8156ca5272160018..39186db1015fab9ebe7ad7d0fd0a3c605913f72e
@@@ -882,9 -938,10 +940,10 @@@ descriptor_error
        INIT_LIST_HEAD(&hub->event_list);
        hub->intfdev = &intf->dev;
        hub->hdev = hdev;
 -      INIT_WORK(&hub->leds, led_work, hub);
 +      INIT_DELAYED_WORK(&hub->leds, led_work);
  
        usb_set_intfdata (intf, hub);
+       intf->needs_remote_wakeup = 1;
  
        if (hdev->speed == USB_SPEED_HIGH)
                highspeed_hubs++;
Simple merge
index ab2f68fc7d2d1ab2cf9647ca69e6010ac2b6d087,81cb52564e681eb1e4a4b35bbb8a7e6d2d4e2562..02426d0b9a347f514f69b4c4f706bb9c5a48caef
@@@ -223,10 -215,17 +216,17 @@@ static void usb_autosuspend_work(struc
  
  #else
  
 -static void usb_autosuspend_work(void *_udev)
 +static void usb_autosuspend_work(struct work_struct *work)
  {}
  
- #endif
+ #endif        /* CONFIG_USB_SUSPEND */
+ #else
+ #define ksuspend_usb_init()   0
+ #define ksuspend_usb_cleanup()        do {} while (0)
+ #endif        /* CONFIG_PM */
  
  /**
   * usb_alloc_dev - usb device constructor (usbcore-internal)
Simple merge
Simple merge
index ebc9e823a46e6bb3727d5fe01872346d77a5c2d5,a49644b7c58e1492a19d21d533105254138f78f7..4295bab4f1e2653a69bba6a5326488d782e64e0f
@@@ -968,21 -968,29 +968,30 @@@ static void hid_retry_timeout(unsigned 
                hid_io_error(hid);
  }
  
- /* Workqueue routine to reset the device */
+ /* Workqueue routine to reset the device or clear a halt */
 -static void hid_reset(void *_hid)
 +static void hid_reset(struct work_struct *work)
  {
 -      struct hid_device *hid = (struct hid_device *) _hid;
 +      struct hid_device *hid =
 +              container_of(work, struct hid_device, reset_work);
-       int rc_lock, rc;
-       dev_dbg(&hid->intf->dev, "resetting device\n");
-       rc = rc_lock = usb_lock_device_for_reset(hid->dev, hid->intf);
-       if (rc_lock >= 0) {
-               rc = usb_reset_composite_device(hid->dev, hid->intf);
-               if (rc_lock)
-                       usb_unlock_device(hid->dev);
+       int rc_lock, rc = 0;
+       if (test_bit(HID_CLEAR_HALT, &hid->iofl)) {
+               dev_dbg(&hid->intf->dev, "clear halt\n");
+               rc = usb_clear_halt(hid->dev, hid->urbin->pipe);
+               clear_bit(HID_CLEAR_HALT, &hid->iofl);
+               hid_start_in(hid);
+       }
+       else if (test_bit(HID_RESET_PENDING, &hid->iofl)) {
+               dev_dbg(&hid->intf->dev, "resetting device\n");
+               rc = rc_lock = usb_lock_device_for_reset(hid->dev, hid->intf);
+               if (rc_lock >= 0) {
+                       rc = usb_reset_composite_device(hid->dev, hid->intf);
+                       if (rc_lock)
+                               usb_unlock_device(hid->dev);
+               }
+               clear_bit(HID_RESET_PENDING, &hid->iofl);
        }
-       clear_bit(HID_RESET_PENDING, &hid->iofl);
  
        switch (rc) {
        case 0:
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc fs/aio.c
Simple merge
diff --cc fs/bio.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc kernel/kmod.c
Simple merge
diff --cc net/atm/lec.c
Simple merge
diff --cc net/atm/lec.h
Simple merge
index 63f24c914ddb561b240bcabf7a8e66574d368c5f,3c58846fcaa5694a8b6c1396e221a02fc1c7d1c1..b3c559b9ac35cb9495edb39e4e77c8fedd5f26cf
@@@ -56,54 -50,37 +50,36 @@@ static atomic_t trapped
  static void zap_completion_queue(void);
  static void arp_reply(struct sk_buff *skb);
  
 -static void queue_process(void *p)
 +static void queue_process(struct work_struct *work)
  {
-       unsigned long flags;
 -      struct netpoll_info *npinfo = p;
++      struct netpoll_info *npinfo =
++              container_of(work, struct netpoll_info, tx_work.work);
        struct sk_buff *skb;
  
-       while (queue_head) {
-               spin_lock_irqsave(&queue_lock, flags);
-               skb = queue_head;
-               queue_head = skb->next;
-               if (skb == queue_tail)
-                       queue_head = NULL;
-               queue_depth--;
-               spin_unlock_irqrestore(&queue_lock, flags);
-               dev_queue_xmit(skb);
-       }
- }
+       while ((skb = skb_dequeue(&npinfo->txq))) {
+               struct net_device *dev = skb->dev;
  
- static DECLARE_WORK(send_queue, queue_process);
+               if (!netif_device_present(dev) || !netif_running(dev)) {
+                       __kfree_skb(skb);
+                       continue;
+               }
  
- void netpoll_queue(struct sk_buff *skb)
- {
-       unsigned long flags;
+               netif_tx_lock_bh(dev);
+               if (netif_queue_stopped(dev) ||
+                   dev->hard_start_xmit(skb, dev) != NETDEV_TX_OK) {
+                       skb_queue_head(&npinfo->txq, skb);
+                       netif_tx_unlock_bh(dev);
  
-       if (queue_depth == MAX_QUEUE_DEPTH) {
-               __kfree_skb(skb);
-               return;
+                       schedule_delayed_work(&npinfo->tx_work, HZ/10);
+                       return;
+               }
 -
 -              netif_tx_unlock_bh(dev);
        }
-       spin_lock_irqsave(&queue_lock, flags);
-       if (!queue_head)
-               queue_head = skb;
-       else
-               queue_tail->next = skb;
-       queue_tail = skb;
-       queue_depth++;
-       spin_unlock_irqrestore(&queue_lock, flags);
-       schedule_work(&send_queue);
  }
  
- static int checksum_udp(struct sk_buff *skb, struct udphdr *uh,
-                            unsigned short ulen, u32 saddr, u32 daddr)
+ static __sum16 checksum_udp(struct sk_buff *skb, struct udphdr *uh,
+                           unsigned short ulen, __be32 saddr, __be32 daddr)
  {
-       unsigned int psum;
+       __wsum psum;
  
        if (uh->check == 0 || skb->ip_summed == CHECKSUM_UNNECESSARY)
                return 0;
@@@ -270,50 -231,40 +230,40 @@@ repeat
  
  static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
  {
-       int status;
-       struct netpoll_info *npinfo;
-       if (!np || !np->dev || !netif_running(np->dev)) {
-               __kfree_skb(skb);
-               return;
-       }
-       npinfo = np->dev->npinfo;
-       /* avoid recursion */
-       if (npinfo->poll_owner == smp_processor_id() ||
-           np->dev->xmit_lock_owner == smp_processor_id()) {
-               if (np->drop)
-                       np->drop(skb);
-               else
-                       __kfree_skb(skb);
-               return;
-       }
-       do {
-               npinfo->tries--;
-               netif_tx_lock(np->dev);
+       int status = NETDEV_TX_BUSY;
+       unsigned long tries;
+       struct net_device *dev = np->dev;
+       struct netpoll_info *npinfo = np->dev->npinfo;
+       if (!npinfo || !netif_running(dev) || !netif_device_present(dev)) {
+               __kfree_skb(skb);
+               return;
+       }
+       /* don't get messages out of order, and no recursion */
+       if (skb_queue_len(&npinfo->txq) == 0 &&
+           npinfo->poll_owner != smp_processor_id() &&
+           netif_tx_trylock(dev)) {
+               /* try until next clock tick */
+               for (tries = jiffies_to_usecs(1)/USEC_PER_POLL; tries > 0; --tries) {
+                       if (!netif_queue_stopped(dev))
+                               status = dev->hard_start_xmit(skb, dev);
  
-               /*
-                * network drivers do not expect to be called if the queue is
-                * stopped.
-                */
-               status = NETDEV_TX_BUSY;
-               if (!netif_queue_stopped(np->dev))
-                       status = np->dev->hard_start_xmit(skb, np->dev);
+                       if (status == NETDEV_TX_OK)
+                               break;
  
-               netif_tx_unlock(np->dev);
+                       /* tickle device maybe there is some cleanup */
+                       netpoll_poll(np);
  
-               /* success */
-               if(!status) {
-                       npinfo->tries = MAX_RETRIES; /* reset */
-                       return;
+                       udelay(USEC_PER_POLL);
                }
+               netif_tx_unlock(dev);
+       }
  
-               /* transmit busy */
-               netpoll_poll(np);
-               udelay(50);
-       } while (npinfo->tries > 0);
+       if (status != NETDEV_TX_OK) {
+               skb_queue_tail(&npinfo->txq, skb);
 -              schedule_work(&npinfo->tx_work);
++              schedule_delayed_work(&npinfo->tx_work,0);
+       }
  }
  
  void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
@@@ -672,11 -624,17 +623,17 @@@ int netpoll_setup(struct netpoll *np
                npinfo->rx_np = NULL;
                spin_lock_init(&npinfo->poll_lock);
                npinfo->poll_owner = -1;
-               npinfo->tries = MAX_RETRIES;
                spin_lock_init(&npinfo->rx_lock);
                skb_queue_head_init(&npinfo->arp_tx);
-       } else
+               skb_queue_head_init(&npinfo->txq);
 -              INIT_WORK(&npinfo->tx_work, queue_process, npinfo);
++              INIT_DELAYED_WORK(&npinfo->tx_work, queue_process);
+               atomic_set(&npinfo->refcnt, 1);
+       } else {
                npinfo = ndev->npinfo;
+               atomic_inc(&npinfo->refcnt);
+       }
  
        if (!ndev->poll_controller) {
                printk(KERN_ERR "%s: %s doesn't support polling, aborting.\n",
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge