]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
authorDavid S. Miller <davem@davemloft.net>
Mon, 3 May 2010 22:45:52 +0000 (15:45 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 3 May 2010 22:45:52 +0000 (15:45 -0700)
1  2 
drivers/net/ppp_generic.c
drivers/net/usb/dm9601.c

index 35f195329fdd0645966e7c64151aef757a0e55f1,8518a2e58e5362254221ba11a0ba34146d84f47b..5441688daba70c6ad61f825fd911966041907c29
@@@ -405,6 -405,7 +405,7 @@@ static ssize_t ppp_read(struct file *fi
        DECLARE_WAITQUEUE(wait, current);
        ssize_t ret;
        struct sk_buff *skb = NULL;
+       struct iovec iov;
  
        ret = count;
  
        if (skb->len > count)
                goto outf;
        ret = -EFAULT;
-       if (copy_to_user(buf, skb->data, skb->len))
+       iov.iov_base = buf;
+       iov.iov_len = count;
+       if (skb_copy_datagram_iovec(skb, 0, &iov, skb->len))
                goto outf;
        ret = skb->len;
  
@@@ -1567,13 -1570,22 +1570,22 @@@ ppp_input(struct ppp_channel *chan, str
        struct channel *pch = chan->ppp;
        int proto;
  
-       if (!pch || skb->len == 0) {
+       if (!pch) {
                kfree_skb(skb);
                return;
        }
  
-       proto = PPP_PROTO(skb);
        read_lock_bh(&pch->upl);
+       if (!pskb_may_pull(skb, 2)) {
+               kfree_skb(skb);
+               if (pch->ppp) {
+                       ++pch->ppp->dev->stats.rx_length_errors;
+                       ppp_receive_error(pch->ppp);
+               }
+               goto done;
+       }
+       proto = PPP_PROTO(skb);
        if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) {
                /* put it on the channel queue */
                skb_queue_tail(&pch->file.rq, skb);
        } else {
                ppp_do_recv(pch->ppp, skb, pch);
        }
+ done:
        read_unlock_bh(&pch->upl);
  }
  
@@@ -1617,7 -1631,8 +1631,8 @@@ ppp_input_error(struct ppp_channel *cha
  static void
  ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
  {
-       if (pskb_may_pull(skb, 2)) {
+       /* note: a 0-length skb is used as an error indication */
+       if (skb->len > 0) {
  #ifdef CONFIG_PPP_MULTILINK
                /* XXX do channel-level decompression here */
                if (PPP_PROTO(skb) == PPP_MP)
                else
  #endif /* CONFIG_PPP_MULTILINK */
                        ppp_receive_nonmp_frame(ppp, skb);
-               return;
+       } else {
+               kfree_skb(skb);
+               ppp_receive_error(ppp);
        }
-       if (skb->len > 0)
-               /* note: a 0-length skb is used as an error indication */
-               ++ppp->dev->stats.rx_length_errors;
-       kfree_skb(skb);
-       ppp_receive_error(ppp);
  }
  
  static void
@@@ -2163,24 -2173,6 +2173,24 @@@ int ppp_unit_number(struct ppp_channel 
        return unit;
  }
  
 +/*
 + * Return the PPP device interface name of a channel.
 + */
 +char *ppp_dev_name(struct ppp_channel *chan)
 +{
 +      struct channel *pch = chan->ppp;
 +      char *name = NULL;
 +
 +      if (pch) {
 +              read_lock_bh(&pch->upl);
 +              if (pch->ppp && pch->ppp->dev)
 +                      name = pch->ppp->dev->name;
 +              read_unlock_bh(&pch->upl);
 +      }
 +      return name;
 +}
 +
 +
  /*
   * Disconnect a channel from the generic layer.
   * This must be called in process context.
@@@ -2909,7 -2901,6 +2919,7 @@@ EXPORT_SYMBOL(ppp_register_channel)
  EXPORT_SYMBOL(ppp_unregister_channel);
  EXPORT_SYMBOL(ppp_channel_index);
  EXPORT_SYMBOL(ppp_unit_number);
 +EXPORT_SYMBOL(ppp_dev_name);
  EXPORT_SYMBOL(ppp_input);
  EXPORT_SYMBOL(ppp_input_error);
  EXPORT_SYMBOL(ppp_output_wakeup);
diff --combined drivers/net/usb/dm9601.c
index 291add255246ae90d74e4dc7bf6288da7a1ea8d4,5dfed9297b22fbe4f5b8aa568e20ed416ee8df72..47634b617107751223938d401d3dfcc355991ecd
@@@ -240,7 -240,7 +240,7 @@@ static int dm_write_shared_word(struct 
                goto out;
  
        dm_write_reg(dev, DM_SHARED_ADDR, phy ? (reg | 0x40) : reg);
-       dm_write_reg(dev, DM_SHARED_CTRL, phy ? 0x1c : 0x14);
+       dm_write_reg(dev, DM_SHARED_CTRL, phy ? 0x1a : 0x12);
  
        for (i = 0; i < DM_TIMEOUT; i++) {
                u8 tmp;
@@@ -387,10 -387,10 +387,10 @@@ static void dm9601_set_multicast(struc
                   netdev_mc_count(net) > DM_MAX_MCAST) {
                rx_ctl |= 0x04;
        } else if (!netdev_mc_empty(net)) {
 -              struct dev_mc_list *mc_list;
 +              struct netdev_hw_addr *ha;
  
 -              netdev_for_each_mc_addr(mc_list, net) {
 -                      u32 crc = ether_crc(ETH_ALEN, mc_list->dmi_addr) >> 26;
 +              netdev_for_each_mc_addr(ha, net) {
 +                      u32 crc = ether_crc(ETH_ALEN, ha->addr) >> 26;
                        hashes[crc >> 3] |= 1 << (crc & 0x7);
                }
        }