]> 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>
Fri, 10 Jul 2009 03:18:24 +0000 (20:18 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 10 Jul 2009 03:18:24 +0000 (20:18 -0700)
1  2 
drivers/net/cxgb3/cxgb3_main.c
drivers/net/r6040.c
drivers/net/tun.c
drivers/net/wireless/mac80211_hwsim.c
net/core/netpoll.c

index 8c381c696a3ddb9db446f53b2523bab39f742258,fb5df5c6203e9541849fce56a52abfaedfbe7391..ec05149a9065363a78d4144df8057c42d4e2c6a9
@@@ -172,23 -172,6 +172,23 @@@ static void link_report(struct net_devi
        }
  }
  
 +static void enable_tx_fifo_drain(struct adapter *adapter,
 +                               struct port_info *pi)
 +{
 +      t3_set_reg_field(adapter, A_XGM_TXFIFO_CFG + pi->mac.offset, 0,
 +                       F_ENDROPPKT);
 +      t3_write_reg(adapter, A_XGM_RX_CTRL + pi->mac.offset, 0);
 +      t3_write_reg(adapter, A_XGM_TX_CTRL + pi->mac.offset, F_TXEN);
 +      t3_write_reg(adapter, A_XGM_RX_CTRL + pi->mac.offset, F_RXEN);
 +}
 +
 +static void disable_tx_fifo_drain(struct adapter *adapter,
 +                                struct port_info *pi)
 +{
 +      t3_set_reg_field(adapter, A_XGM_TXFIFO_CFG + pi->mac.offset,
 +                       F_ENDROPPKT, 0);
 +}
 +
  void t3_os_link_fault(struct adapter *adap, int port_id, int state)
  {
        struct net_device *dev = adap->port[port_id];
  
                netif_carrier_on(dev);
  
 +              disable_tx_fifo_drain(adap, pi);
 +
                /* Clear local faults */
                t3_xgm_intr_disable(adap, pi->port_id);
                t3_read_reg(adap, A_XGM_INT_STATUS +
                t3_xgm_intr_enable(adap, pi->port_id);
  
                t3_mac_enable(mac, MAC_DIRECTION_TX);
 -      } else
 +      } else {
                netif_carrier_off(dev);
  
 +              /* Flush TX FIFO */
 +              enable_tx_fifo_drain(adap, pi);
 +      }
        link_report(dev);
  }
  
@@@ -254,8 -232,6 +254,8 @@@ void t3_os_link_changed(struct adapter 
  
        if (link_stat != netif_carrier_ok(dev)) {
                if (link_stat) {
 +                      disable_tx_fifo_drain(adapter, pi);
 +
                        t3_mac_enable(mac, MAC_DIRECTION_RX);
  
                        /* Clear local faults */
                        t3_read_reg(adapter, A_XGM_INT_STATUS + pi->mac.offset);
                        t3_mac_disable(mac, MAC_DIRECTION_RX);
                        t3_link_start(&pi->phy, mac, &pi->link_config);
 +
 +                      /* Flush TX FIFO */
 +                      enable_tx_fifo_drain(adapter, pi);
                }
  
                link_report(dev);
@@@ -470,7 -443,6 +470,7 @@@ static int init_tp_parity(struct adapte
                memset(req, 0, sizeof(*req));
                req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
                OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, i));
 +              req->mtu_idx = NMTUS - 1;
                req->iff = i;
                t3_mgmt_tx(adap, skb);
                if (skb == adap->nofail_skb) {
@@@ -670,8 -642,7 +670,7 @@@ static int setup_sge_qsets(struct adapt
                struct port_info *pi = netdev_priv(dev);
  
                pi->qs = &adap->sge.qs[pi->first_qset];
-               for (j = pi->first_qset; j < pi->first_qset + pi->nqsets;
-                    ++j, ++qset_idx) {
+               for (j = 0; j < pi->nqsets; ++j, ++qset_idx) {
                        set_qset_lro(dev, qset_idx, pi->rx_offload & T3_LRO);
                        err = t3_sge_alloc_qset(adap, qset_idx, 1,
                                (adap->flags & USING_MSIX) ? qset_idx + 1 :
@@@ -992,75 -963,6 +991,75 @@@ static int bind_qsets(struct adapter *a
  
  #define FW_FNAME "cxgb3/t3fw-%d.%d.%d.bin"
  #define TPSRAM_NAME "cxgb3/t3%c_psram-%d.%d.%d.bin"
 +#define AEL2005_OPT_EDC_NAME "cxgb3/ael2005_opt_edc.bin"
 +#define AEL2005_TWX_EDC_NAME "cxgb3/ael2005_twx_edc.bin"
 +#define AEL2020_TWX_EDC_NAME "cxgb3/ael2005_twx_edc.bin"
 +
 +static inline const char *get_edc_fw_name(int edc_idx)
 +{
 +      const char *fw_name = NULL;
 +
 +      switch (edc_idx) {
 +      case EDC_OPT_AEL2005:
 +              fw_name = AEL2005_OPT_EDC_NAME;
 +              break;
 +      case EDC_TWX_AEL2005:
 +              fw_name = AEL2005_TWX_EDC_NAME;
 +              break;
 +      case EDC_TWX_AEL2020:
 +              fw_name = AEL2020_TWX_EDC_NAME;
 +              break;
 +      }
 +      return fw_name;
 +}
 +
 +int t3_get_edc_fw(struct cphy *phy, int edc_idx, int size)
 +{
 +      struct adapter *adapter = phy->adapter;
 +      const struct firmware *fw;
 +      char buf[64];
 +      u32 csum;
 +      const __be32 *p;
 +      u16 *cache = phy->phy_cache;
 +      int i, ret;
 +
 +      snprintf(buf, sizeof(buf), get_edc_fw_name(edc_idx));
 +
 +      ret = request_firmware(&fw, buf, &adapter->pdev->dev);
 +      if (ret < 0) {
 +              dev_err(&adapter->pdev->dev,
 +                      "could not upgrade firmware: unable to load %s\n",
 +                      buf);
 +              return ret;
 +      }
 +
 +      /* check size, take checksum in account */
 +      if (fw->size > size + 4) {
 +              CH_ERR(adapter, "firmware image too large %u, expected %d\n",
 +                     (unsigned int)fw->size, size + 4);
 +              ret = -EINVAL;
 +      }
 +
 +      /* compute checksum */
 +      p = (const __be32 *)fw->data;
 +      for (csum = 0, i = 0; i < fw->size / sizeof(csum); i++)
 +              csum += ntohl(p[i]);
 +
 +      if (csum != 0xffffffff) {
 +              CH_ERR(adapter, "corrupted firmware image, checksum %u\n",
 +                     csum);
 +              ret = -EINVAL;
 +      }
 +
 +      for (i = 0; i < size / 4 ; i++) {
 +              *cache++ = (be32_to_cpu(p[i]) & 0xffff0000) >> 16;
 +              *cache++ = be32_to_cpu(p[i]) & 0xffff;
 +      }
 +
 +      release_firmware(fw);
 +
 +      return ret;
 +}
  
  static int upgrade_fw(struct adapter *adap)
  {
diff --combined drivers/net/r6040.c
index b3197e96f3235767289bdf82c21a54ee956507ca,961b5397a531ea3800ccf43ac4f9b12a7e6849c2..840677f5ee82466b1a73ea678c4086c39127ad8d
@@@ -49,8 -49,8 +49,8 @@@
  #include <asm/processor.h>
  
  #define DRV_NAME      "r6040"
- #define DRV_VERSION   "0.23"
- #define DRV_RELDATE   "05May2009"
+ #define DRV_VERSION   "0.24"
+ #define DRV_RELDATE   "08Jul2009"
  
  /* PHY CHIP Address */
  #define PHY1_ADDR     1       /* For MAC1 */
@@@ -704,8 -704,11 +704,11 @@@ static irqreturn_t r6040_interrupt(int 
        /* Read MISR status and clear */
        status = ioread16(ioaddr + MISR);
  
-       if (status == 0x0000 || status == 0xffff)
+       if (status == 0x0000 || status == 0xffff) {
+               /* Restore RDC MAC interrupt */
+               iowrite16(misr, ioaddr + MIER);
                return IRQ_NONE;
+       }
  
        /* RX interrupt request */
        if (status & RX_INTS) {
@@@ -1112,13 -1115,13 +1115,13 @@@ static int __devinit r6040_init_one(str
        }
  
        /* IO Size check */
 -      if (pci_resource_len(pdev, 0) < io_size) {
 +      if (pci_resource_len(pdev, bar) < io_size) {
                printk(KERN_ERR DRV_NAME ": Insufficient PCI resources, aborting\n");
                err = -EIO;
                goto err_out;
        }
  
 -      pioaddr = pci_resource_start(pdev, 0);  /* IO map base address */
 +      pioaddr = pci_resource_start(pdev, bar);        /* IO map base address */
        pci_set_master(pdev);
  
        dev = alloc_etherdev(sizeof(struct r6040_private));
diff --combined drivers/net/tun.c
index 92ffd11a71959d342e77a88ef0aa2c36def07bcb,027f7aba26af1d339dad5081a1ae8167b34c3d8c..dfc1054e4cbde8569170681fc582ee8507eee3ae
@@@ -398,12 -398,12 +398,12 @@@ static int tun_net_xmit(struct sk_buff 
        if (tun->flags & TUN_FASYNC)
                kill_fasync(&tun->fasync, SIGIO, POLL_IN);
        wake_up_interruptible(&tun->socket.wait);
 -      return 0;
 +      return NETDEV_TX_OK;
  
  drop:
        dev->stats.tx_dropped++;
        kfree_skb(skb);
 -      return 0;
 +      return NETDEV_TX_OK;
  }
  
  static void tun_net_mclist(struct net_device *dev)
@@@ -486,12 -486,14 +486,14 @@@ static unsigned int tun_chr_poll(struc
  {
        struct tun_file *tfile = file->private_data;
        struct tun_struct *tun = __tun_get(tfile);
-       struct sock *sk = tun->sk;
+       struct sock *sk;
        unsigned int mask = 0;
  
        if (!tun)
                return POLLERR;
  
+       sk = tun->sk;
        DBG(KERN_INFO "%s: tun_chr_poll\n", tun->dev->name);
  
        poll_wait(file, &tun->socket.wait, wait);
@@@ -995,6 -997,7 +997,6 @@@ static int tun_set_iff(struct net *net
                                goto err_free_sk;
                }
  
 -              err = -EINVAL;
                err = register_netdevice(tun->dev);
                if (err < 0)
                        goto err_free_sk;
index 55f77ad853042d0e6609b73b973a25f4f123d09e,a111bda392e2084115c4738296e1873bf385ab21..c47ef48f31c54bf531d7cd7b8c1430e8b382f98f
@@@ -314,7 -314,7 +314,7 @@@ static int hwsim_mon_xmit(struct sk_buf
  {
        /* TODO: allow packet injection */
        dev_kfree_skb(skb);
 -      return 0;
 +      return NETDEV_TX_OK;
  }
  
  
@@@ -418,6 -418,7 +418,7 @@@ static bool mac80211_hwsim_tx_frame(str
                        continue;
  
                if (!data2->started || !hwsim_ps_rx_ok(data2, skb) ||
+                   !data->channel || !data2->channel ||
                    data->channel->center_freq != data2->channel->center_freq ||
                    !(data->group & data2->group))
                        continue;
diff --combined net/core/netpoll.c
index 3afe381e24a50f812d69586d70cbcf2012e684af,df30feb2fc725b047ef744273e7c506714bbac61..0ac309154b0d8307c2b1aae9d0320f3253cdc77b
@@@ -9,7 -9,6 +9,7 @@@
   * Copyright (C) 2002  Red Hat, Inc.
   */
  
 +#include <linux/moduleparam.h>
  #include <linux/netdevice.h>
  #include <linux/etherdevice.h>
  #include <linux/string.h>
@@@ -51,9 -50,6 +51,9 @@@ static atomic_t trapped
  static void zap_completion_queue(void);
  static void arp_reply(struct sk_buff *skb);
  
 +static unsigned int carrier_timeout = 4;
 +module_param(carrier_timeout, uint, 0644);
 +
  static void queue_process(struct work_struct *work)
  {
        struct netpoll_info *npinfo =
@@@ -736,7 -732,7 +736,7 @@@ int netpoll_setup(struct netpoll *np
                }
  
                atleast = jiffies + HZ/10;
 -              atmost = jiffies + 4*HZ;
 +              atmost = jiffies + carrier_timeout * HZ;
                while (!netif_carrier_ok(ndev)) {
                        if (time_after(jiffies, atmost)) {
                                printk(KERN_NOTICE
                                       np->name);
                                break;
                        }
-                       cond_resched();
+                       msleep(1);
                }
  
                /* If carrier appears to come up instantly, we don't