提交 37bed900 编写于 作者: L Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (32 commits)
  wimax: fix oops in wimax_dev_get_by_genl_info() when looking up non-wimax iface
  net: 4 bytes kernel memory disclosure in SO_BSDCOMPAT gsopt try #2
  netxen: fix compile waring "label ‘set_32_bit_mask’ defined but not used" on IA64 platform
  bnx2: Update version to 1.9.2 and copyright.
  bnx2: Fix jumbo frames error handling.
  bnx2: Update 5709 firmware.
  bnx2: Update 5706/5708 firmware.
  3c505: do not set pcb->data.raw beyond its size
  Documentation/connector/cn_test.c: don't use gfp_any()
  net: don't use in_atomic() in gfp_any()
  IRDA: cnt is off by 1
  netxen: remove pcie workaround
  sun3: print when lance_open() fails
  qlge: bugfix: Add missing rx buf clean index on early exit.
  qlge: bugfix: Fix RX scaling values.
  qlge: bugfix: Fix TSO breakage.
  qlge: bugfix: Add missing dev_kfree_skb_any() call.
  qlge: bugfix: Add missing put_page() call.
  qlge: bugfix: Fix fatal error recovery hang.
  qlge: bugfix: Use netif_receive_skb() and vlan_hwaccel_receive_skb().
  ...
...@@ -137,7 +137,7 @@ static void cn_test_timer_func(unsigned long __data) ...@@ -137,7 +137,7 @@ static void cn_test_timer_func(unsigned long __data)
memcpy(m + 1, data, m->len); memcpy(m + 1, data, m->len);
cn_netlink_send(m, 0, gfp_any()); cn_netlink_send(m, 0, GFP_ATOMIC);
kfree(m); kfree(m);
} }
...@@ -160,10 +160,8 @@ static int cn_test_init(void) ...@@ -160,10 +160,8 @@ static int cn_test_init(void)
goto err_out; goto err_out;
} }
init_timer(&cn_test_timer); setup_timer(&cn_test_timer, cn_test_timer_func, 0);
cn_test_timer.function = cn_test_timer_func;
cn_test_timer.expires = jiffies + HZ; cn_test_timer.expires = jiffies + HZ;
cn_test_timer.data = 0;
add_timer(&cn_test_timer); add_timer(&cn_test_timer);
return 0; return 0;
......
...@@ -2519,8 +2519,8 @@ fore200e_load_and_start_fw(struct fore200e* fore200e) ...@@ -2519,8 +2519,8 @@ fore200e_load_and_start_fw(struct fore200e* fore200e)
return err; return err;
sprintf(buf, "%s%s", fore200e->bus->proc_name, FW_EXT); sprintf(buf, "%s%s", fore200e->bus->proc_name, FW_EXT);
if (request_firmware(&firmware, buf, device) == 1) { if ((err = request_firmware(&firmware, buf, device)) < 0) {
printk(FORE200E "missing %s firmware image\n", fore200e->bus->model_name); printk(FORE200E "problem loading firmware image %s\n", fore200e->bus->model_name);
return err; return err;
} }
......
...@@ -493,21 +493,27 @@ static bool receive_pcb(struct net_device *dev, pcb_struct * pcb) ...@@ -493,21 +493,27 @@ static bool receive_pcb(struct net_device *dev, pcb_struct * pcb)
} }
/* read the data */ /* read the data */
spin_lock_irqsave(&adapter->lock, flags); spin_lock_irqsave(&adapter->lock, flags);
i = 0; for (i = 0; i < MAX_PCB_DATA; i++) {
do { for (j = 0; j < 20000; j++) {
j = 0; stat = get_status(dev->base_addr);
while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && j++ < 20000); if (stat & ACRF)
pcb->data.raw[i++] = inb_command(dev->base_addr); break;
if (i > MAX_PCB_DATA) }
INVALID_PCB_MSG(i); pcb->data.raw[i] = inb_command(dev->base_addr);
} while ((stat & ASF_PCB_MASK) != ASF_PCB_END && j < 20000); if ((stat & ASF_PCB_MASK) == ASF_PCB_END || j >= 20000)
break;
}
spin_unlock_irqrestore(&adapter->lock, flags); spin_unlock_irqrestore(&adapter->lock, flags);
if (i >= MAX_PCB_DATA) {
INVALID_PCB_MSG(i);
return false;
}
if (j >= 20000) { if (j >= 20000) {
TIMEOUT_MSG(__LINE__); TIMEOUT_MSG(__LINE__);
return false; return false;
} }
/* woops, the last "data" byte was really the length! */ /* the last "data" byte was really the length! */
total_length = pcb->data.raw[--i]; total_length = pcb->data.raw[i];
/* safety check total length vs data length */ /* safety check total length vs data length */
if (total_length != (pcb->length + 2)) { if (total_length != (pcb->length + 2)) {
......
/* bnx2.c: Broadcom NX2 network driver. /* bnx2.c: Broadcom NX2 network driver.
* *
* Copyright (c) 2004-2008 Broadcom Corporation * Copyright (c) 2004-2009 Broadcom Corporation
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -57,8 +57,8 @@ ...@@ -57,8 +57,8 @@
#define DRV_MODULE_NAME "bnx2" #define DRV_MODULE_NAME "bnx2"
#define PFX DRV_MODULE_NAME ": " #define PFX DRV_MODULE_NAME ": "
#define DRV_MODULE_VERSION "1.9.0" #define DRV_MODULE_VERSION "1.9.2"
#define DRV_MODULE_RELDATE "Dec 16, 2008" #define DRV_MODULE_RELDATE "Feb 11, 2009"
#define RUN_AT(x) (jiffies + (x)) #define RUN_AT(x) (jiffies + (x))
...@@ -2910,18 +2910,8 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) ...@@ -2910,18 +2910,8 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
rx_hdr = (struct l2_fhdr *) skb->data; rx_hdr = (struct l2_fhdr *) skb->data;
len = rx_hdr->l2_fhdr_pkt_len; len = rx_hdr->l2_fhdr_pkt_len;
status = rx_hdr->l2_fhdr_status;
if ((status = rx_hdr->l2_fhdr_status) &
(L2_FHDR_ERRORS_BAD_CRC |
L2_FHDR_ERRORS_PHY_DECODE |
L2_FHDR_ERRORS_ALIGNMENT |
L2_FHDR_ERRORS_TOO_SHORT |
L2_FHDR_ERRORS_GIANT_FRAME)) {
bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons,
sw_ring_prod);
goto next_rx;
}
hdr_len = 0; hdr_len = 0;
if (status & L2_FHDR_STATUS_SPLIT) { if (status & L2_FHDR_STATUS_SPLIT) {
hdr_len = rx_hdr->l2_fhdr_ip_xsum; hdr_len = rx_hdr->l2_fhdr_ip_xsum;
...@@ -2931,6 +2921,24 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) ...@@ -2931,6 +2921,24 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
pg_ring_used = 1; pg_ring_used = 1;
} }
if (unlikely(status & (L2_FHDR_ERRORS_BAD_CRC |
L2_FHDR_ERRORS_PHY_DECODE |
L2_FHDR_ERRORS_ALIGNMENT |
L2_FHDR_ERRORS_TOO_SHORT |
L2_FHDR_ERRORS_GIANT_FRAME))) {
bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons,
sw_ring_prod);
if (pg_ring_used) {
int pages;
pages = PAGE_ALIGN(len - hdr_len) >> PAGE_SHIFT;
bnx2_reuse_rx_skb_pages(bp, rxr, NULL, pages);
}
goto next_rx;
}
len -= 4; len -= 4;
if (len <= bp->rx_copy_thresh) { if (len <= bp->rx_copy_thresh) {
......
/* bnx2.h: Broadcom NX2 network driver. /* bnx2.h: Broadcom NX2 network driver.
* *
* Copyright (c) 2004-2007 Broadcom Corporation * Copyright (c) 2004-2009 Broadcom Corporation
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
......
此差异已折叠。
此差异已折叠。
...@@ -585,7 +585,7 @@ static int mcs_speed_change(struct mcs_cb *mcs) ...@@ -585,7 +585,7 @@ static int mcs_speed_change(struct mcs_cb *mcs)
mcs_get_reg(mcs, MCS_RESV_REG, &rval); mcs_get_reg(mcs, MCS_RESV_REG, &rval);
} while(cnt++ < 100 && (rval & MCS_IRINTX)); } while(cnt++ < 100 && (rval & MCS_IRINTX));
if(cnt >= 100) { if (cnt > 100) {
IRDA_ERROR("unable to change speed\n"); IRDA_ERROR("unable to change speed\n");
ret = -EIO; ret = -EIO;
goto error; goto error;
......
...@@ -201,9 +201,9 @@ static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) ...@@ -201,9 +201,9 @@ static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id)
adapter->pci_using_dac = 1; adapter->pci_using_dac = 1;
return 0; return 0;
} }
set_32_bit_mask:
#endif /* CONFIG_IA64 */ #endif /* CONFIG_IA64 */
set_32_bit_mask:
err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
if (!err) if (!err)
err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
...@@ -372,67 +372,6 @@ static void netxen_set_port_mode(struct netxen_adapter *adapter) ...@@ -372,67 +372,6 @@ static void netxen_set_port_mode(struct netxen_adapter *adapter)
} }
} }
#define PCI_CAP_ID_GEN 0x10
static void netxen_pcie_strap_init(struct netxen_adapter *adapter)
{
u32 pdevfuncsave;
u32 c8c9value = 0;
u32 chicken = 0;
u32 control = 0;
int i, pos;
struct pci_dev *pdev;
pdev = adapter->pdev;
adapter->hw_read_wx(adapter,
NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4);
/* clear chicken3.25:24 */
chicken &= 0xFCFFFFFF;
/*
* if gen1 and B0, set F1020 - if gen 2, do nothing
* if gen2 set to F1000
*/
pos = pci_find_capability(pdev, PCI_CAP_ID_GEN);
if (pos == 0xC0) {
pci_read_config_dword(pdev, pos + 0x10, &control);
if ((control & 0x000F0000) != 0x00020000) {
/* set chicken3.24 if gen1 */
chicken |= 0x01000000;
}
printk(KERN_INFO "%s Gen2 strapping detected\n",
netxen_nic_driver_name);
c8c9value = 0xF1000;
} else {
/* set chicken3.24 if gen1 */
chicken |= 0x01000000;
printk(KERN_INFO "%s Gen1 strapping detected\n",
netxen_nic_driver_name);
if (adapter->ahw.revision_id == NX_P3_B0)
c8c9value = 0xF1020;
else
c8c9value = 0;
}
adapter->hw_write_wx(adapter,
NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4);
if (!c8c9value)
return;
pdevfuncsave = pdev->devfn;
if (pdevfuncsave & 0x07)
return;
for (i = 0; i < 8; i++) {
pci_read_config_dword(pdev, pos + 8, &control);
pci_read_config_dword(pdev, pos + 8, &control);
pci_write_config_dword(pdev, pos + 8, c8c9value);
pdev->devfn++;
}
pdev->devfn = pdevfuncsave;
}
static void netxen_set_msix_bit(struct pci_dev *pdev, int enable) static void netxen_set_msix_bit(struct pci_dev *pdev, int enable)
{ {
u32 control; u32 control;
...@@ -812,9 +751,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -812,9 +751,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
} }
netxen_load_firmware(adapter); netxen_load_firmware(adapter);
if (NX_IS_REVISION_P3(revision_id))
netxen_pcie_strap_init(adapter);
if (NX_IS_REVISION_P2(revision_id)) { if (NX_IS_REVISION_P2(revision_id)) {
/* Initialize multicast addr pool owners */ /* Initialize multicast addr pool owners */
......
...@@ -125,6 +125,8 @@ static int __devinit mdio_gpio_bus_init(struct device *dev, ...@@ -125,6 +125,8 @@ static int __devinit mdio_gpio_bus_init(struct device *dev,
if (gpio_request(bitbang->mdio, "mdio")) if (gpio_request(bitbang->mdio, "mdio"))
goto out_free_mdc; goto out_free_mdc;
gpio_direction_output(bitbang->mdc, 0);
dev_set_drvdata(dev, new_bus); dev_set_drvdata(dev, new_bus);
ret = mdiobus_register(new_bus); ret = mdiobus_register(new_bus);
......
...@@ -898,6 +898,7 @@ static void ql_update_lbq(struct ql_adapter *qdev, struct rx_ring *rx_ring) ...@@ -898,6 +898,7 @@ static void ql_update_lbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
lbq_desc->index); lbq_desc->index);
lbq_desc->p.lbq_page = alloc_page(GFP_ATOMIC); lbq_desc->p.lbq_page = alloc_page(GFP_ATOMIC);
if (lbq_desc->p.lbq_page == NULL) { if (lbq_desc->p.lbq_page == NULL) {
rx_ring->lbq_clean_idx = clean_idx;
QPRINTK(qdev, RX_STATUS, ERR, QPRINTK(qdev, RX_STATUS, ERR,
"Couldn't get a page.\n"); "Couldn't get a page.\n");
return; return;
...@@ -907,6 +908,9 @@ static void ql_update_lbq(struct ql_adapter *qdev, struct rx_ring *rx_ring) ...@@ -907,6 +908,9 @@ static void ql_update_lbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
0, PAGE_SIZE, 0, PAGE_SIZE,
PCI_DMA_FROMDEVICE); PCI_DMA_FROMDEVICE);
if (pci_dma_mapping_error(qdev->pdev, map)) { if (pci_dma_mapping_error(qdev->pdev, map)) {
rx_ring->lbq_clean_idx = clean_idx;
put_page(lbq_desc->p.lbq_page);
lbq_desc->p.lbq_page = NULL;
QPRINTK(qdev, RX_STATUS, ERR, QPRINTK(qdev, RX_STATUS, ERR,
"PCI mapping failed.\n"); "PCI mapping failed.\n");
return; return;
...@@ -968,6 +972,8 @@ static void ql_update_sbq(struct ql_adapter *qdev, struct rx_ring *rx_ring) ...@@ -968,6 +972,8 @@ static void ql_update_sbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
if (pci_dma_mapping_error(qdev->pdev, map)) { if (pci_dma_mapping_error(qdev->pdev, map)) {
QPRINTK(qdev, IFUP, ERR, "PCI mapping failed.\n"); QPRINTK(qdev, IFUP, ERR, "PCI mapping failed.\n");
rx_ring->sbq_clean_idx = clean_idx; rx_ring->sbq_clean_idx = clean_idx;
dev_kfree_skb_any(sbq_desc->p.skb);
sbq_desc->p.skb = NULL;
return; return;
} }
pci_unmap_addr_set(sbq_desc, mapaddr, map); pci_unmap_addr_set(sbq_desc, mapaddr, map);
...@@ -1449,12 +1455,12 @@ static void ql_process_mac_rx_intr(struct ql_adapter *qdev, ...@@ -1449,12 +1455,12 @@ static void ql_process_mac_rx_intr(struct ql_adapter *qdev,
if (qdev->vlgrp && (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V)) { if (qdev->vlgrp && (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V)) {
QPRINTK(qdev, RX_STATUS, DEBUG, QPRINTK(qdev, RX_STATUS, DEBUG,
"Passing a VLAN packet upstream.\n"); "Passing a VLAN packet upstream.\n");
vlan_hwaccel_rx(skb, qdev->vlgrp, vlan_hwaccel_receive_skb(skb, qdev->vlgrp,
le16_to_cpu(ib_mac_rsp->vlan_id)); le16_to_cpu(ib_mac_rsp->vlan_id));
} else { } else {
QPRINTK(qdev, RX_STATUS, DEBUG, QPRINTK(qdev, RX_STATUS, DEBUG,
"Passing a normal packet upstream.\n"); "Passing a normal packet upstream.\n");
netif_rx(skb); netif_receive_skb(skb);
} }
} }
...@@ -1511,6 +1517,11 @@ void ql_queue_asic_error(struct ql_adapter *qdev) ...@@ -1511,6 +1517,11 @@ void ql_queue_asic_error(struct ql_adapter *qdev)
netif_stop_queue(qdev->ndev); netif_stop_queue(qdev->ndev);
netif_carrier_off(qdev->ndev); netif_carrier_off(qdev->ndev);
ql_disable_interrupts(qdev); ql_disable_interrupts(qdev);
/* Clear adapter up bit to signal the recovery
* process that it shouldn't kill the reset worker
* thread
*/
clear_bit(QL_ADAPTER_UP, &qdev->flags);
queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0); queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0);
} }
...@@ -1927,10 +1938,6 @@ static int qlge_send(struct sk_buff *skb, struct net_device *ndev) ...@@ -1927,10 +1938,6 @@ static int qlge_send(struct sk_buff *skb, struct net_device *ndev)
tx_ring_desc = &tx_ring->q[tx_ring->prod_idx]; tx_ring_desc = &tx_ring->q[tx_ring->prod_idx];
mac_iocb_ptr = tx_ring_desc->queue_entry; mac_iocb_ptr = tx_ring_desc->queue_entry;
memset((void *)mac_iocb_ptr, 0, sizeof(mac_iocb_ptr)); memset((void *)mac_iocb_ptr, 0, sizeof(mac_iocb_ptr));
if (ql_map_send(qdev, mac_iocb_ptr, skb, tx_ring_desc) != NETDEV_TX_OK) {
QPRINTK(qdev, TX_QUEUED, ERR, "Could not map the segments.\n");
return NETDEV_TX_BUSY;
}
mac_iocb_ptr->opcode = OPCODE_OB_MAC_IOCB; mac_iocb_ptr->opcode = OPCODE_OB_MAC_IOCB;
mac_iocb_ptr->tid = tx_ring_desc->index; mac_iocb_ptr->tid = tx_ring_desc->index;
...@@ -1956,6 +1963,12 @@ static int qlge_send(struct sk_buff *skb, struct net_device *ndev) ...@@ -1956,6 +1963,12 @@ static int qlge_send(struct sk_buff *skb, struct net_device *ndev)
ql_hw_csum_setup(skb, ql_hw_csum_setup(skb,
(struct ob_mac_tso_iocb_req *)mac_iocb_ptr); (struct ob_mac_tso_iocb_req *)mac_iocb_ptr);
} }
if (ql_map_send(qdev, mac_iocb_ptr, skb, tx_ring_desc) !=
NETDEV_TX_OK) {
QPRINTK(qdev, TX_QUEUED, ERR,
"Could not map the segments.\n");
return NETDEV_TX_BUSY;
}
QL_DUMP_OB_MAC_IOCB(mac_iocb_ptr); QL_DUMP_OB_MAC_IOCB(mac_iocb_ptr);
tx_ring->prod_idx++; tx_ring->prod_idx++;
if (tx_ring->prod_idx == tx_ring->wq_len) if (tx_ring->prod_idx == tx_ring->wq_len)
...@@ -2873,8 +2886,8 @@ static int ql_start_rss(struct ql_adapter *qdev) ...@@ -2873,8 +2886,8 @@ static int ql_start_rss(struct ql_adapter *qdev)
/* /*
* Fill out the Indirection Table. * Fill out the Indirection Table.
*/ */
for (i = 0; i < 32; i++) for (i = 0; i < 256; i++)
hash_id[i] = i & 1; hash_id[i] = i & (qdev->rss_ring_count - 1);
/* /*
* Random values for the IPv6 and IPv4 Hash Keys. * Random values for the IPv6 and IPv4 Hash Keys.
...@@ -3100,7 +3113,11 @@ static int ql_adapter_down(struct ql_adapter *qdev) ...@@ -3100,7 +3113,11 @@ static int ql_adapter_down(struct ql_adapter *qdev)
netif_stop_queue(ndev); netif_stop_queue(ndev);
netif_carrier_off(ndev); netif_carrier_off(ndev);
cancel_delayed_work_sync(&qdev->asic_reset_work); /* Don't kill the reset worker thread if we
* are in the process of recovery.
*/
if (test_bit(QL_ADAPTER_UP, &qdev->flags))
cancel_delayed_work_sync(&qdev->asic_reset_work);
cancel_delayed_work_sync(&qdev->mpi_reset_work); cancel_delayed_work_sync(&qdev->mpi_reset_work);
cancel_delayed_work_sync(&qdev->mpi_work); cancel_delayed_work_sync(&qdev->mpi_work);
...@@ -3501,7 +3518,7 @@ static int qlge_set_mac_address(struct net_device *ndev, void *p) ...@@ -3501,7 +3518,7 @@ static int qlge_set_mac_address(struct net_device *ndev, void *p)
static void qlge_tx_timeout(struct net_device *ndev) static void qlge_tx_timeout(struct net_device *ndev)
{ {
struct ql_adapter *qdev = (struct ql_adapter *)netdev_priv(ndev); struct ql_adapter *qdev = (struct ql_adapter *)netdev_priv(ndev);
queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0); ql_queue_asic_error(qdev);
} }
static void ql_asic_reset_work(struct work_struct *work) static void ql_asic_reset_work(struct work_struct *work)
......
...@@ -428,7 +428,7 @@ static int lance_open( struct net_device *dev ) ...@@ -428,7 +428,7 @@ static int lance_open( struct net_device *dev )
while (--i > 0) while (--i > 0)
if (DREG & CSR0_IDON) if (DREG & CSR0_IDON)
break; break;
if (i < 0 || (DREG & CSR0_ERR)) { if (i <= 0 || (DREG & CSR0_ERR)) {
DPRINTK( 2, ( "lance_open(): opening %s failed, i=%d, csr0=%04x\n", DPRINTK( 2, ( "lance_open(): opening %s failed, i=%d, csr0=%04x\n",
dev->name, i, DREG )); dev->name, i, DREG ));
DREG = CSR0_STOP; DREG = CSR0_STOP;
......
...@@ -2543,25 +2543,36 @@ static struct quattro * __devinit quattro_sbus_find(struct of_device *child) ...@@ -2543,25 +2543,36 @@ static struct quattro * __devinit quattro_sbus_find(struct of_device *child)
} }
/* After all quattro cards have been probed, we call these functions /* After all quattro cards have been probed, we call these functions
* to register the IRQ handlers. * to register the IRQ handlers for the cards that have been
* successfully probed and skip the cards that failed to initialize
*/ */
static void __init quattro_sbus_register_irqs(void) static int __init quattro_sbus_register_irqs(void)
{ {
struct quattro *qp; struct quattro *qp;
for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) { for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) {
struct of_device *op = qp->quattro_dev; struct of_device *op = qp->quattro_dev;
int err; int err, qfe_slot, skip = 0;
for (qfe_slot = 0; qfe_slot < 4; qfe_slot++) {
if (!qp->happy_meals[qfe_slot])
skip = 1;
}
if (skip)
continue;
err = request_irq(op->irqs[0], err = request_irq(op->irqs[0],
quattro_sbus_interrupt, quattro_sbus_interrupt,
IRQF_SHARED, "Quattro", IRQF_SHARED, "Quattro",
qp); qp);
if (err != 0) { if (err != 0) {
printk(KERN_ERR "Quattro: Fatal IRQ registery error %d.\n", err); printk(KERN_ERR "Quattro HME: IRQ registration "
panic("QFE request irq"); "error %d.\n", err);
return err;
} }
} }
return 0;
} }
static void quattro_sbus_free_irqs(void) static void quattro_sbus_free_irqs(void)
...@@ -2570,6 +2581,14 @@ static void quattro_sbus_free_irqs(void) ...@@ -2570,6 +2581,14 @@ static void quattro_sbus_free_irqs(void)
for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) { for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) {
struct of_device *op = qp->quattro_dev; struct of_device *op = qp->quattro_dev;
int qfe_slot, skip = 0;
for (qfe_slot = 0; qfe_slot < 4; qfe_slot++) {
if (!qp->happy_meals[qfe_slot])
skip = 1;
}
if (skip)
continue;
free_irq(op->irqs[0], qp); free_irq(op->irqs[0], qp);
} }
...@@ -2828,6 +2847,9 @@ static int __devinit happy_meal_sbus_probe_one(struct of_device *op, int is_qfe) ...@@ -2828,6 +2847,9 @@ static int __devinit happy_meal_sbus_probe_one(struct of_device *op, int is_qfe)
if (hp->tcvregs) if (hp->tcvregs)
of_iounmap(&op->resource[4], hp->tcvregs, TCVR_REG_SIZE); of_iounmap(&op->resource[4], hp->tcvregs, TCVR_REG_SIZE);
if (qp)
qp->happy_meals[qfe_slot] = NULL;
err_out_free_netdev: err_out_free_netdev:
free_netdev(dev); free_netdev(dev);
...@@ -3285,7 +3307,7 @@ static int __init happy_meal_sbus_init(void) ...@@ -3285,7 +3307,7 @@ static int __init happy_meal_sbus_init(void)
err = of_register_driver(&hme_sbus_driver, &of_bus_type); err = of_register_driver(&hme_sbus_driver, &of_bus_type);
if (!err) if (!err)
quattro_sbus_register_irqs(); err = quattro_sbus_register_irqs();
return err; return err;
} }
......
...@@ -852,7 +852,7 @@ static int tg3_bmcr_reset(struct tg3 *tp) ...@@ -852,7 +852,7 @@ static int tg3_bmcr_reset(struct tg3 *tp)
} }
udelay(10); udelay(10);
} }
if (limit <= 0) if (limit < 0)
return -EBUSY; return -EBUSY;
return 0; return 0;
...@@ -1603,7 +1603,7 @@ static int tg3_wait_macro_done(struct tg3 *tp) ...@@ -1603,7 +1603,7 @@ static int tg3_wait_macro_done(struct tg3 *tp)
break; break;
} }
} }
if (limit <= 0) if (limit < 0)
return -EBUSY; return -EBUSY;
return 0; return 0;
......
...@@ -1098,6 +1098,42 @@ ath5k_hw_to_driver_rix(struct ath5k_softc *sc, int hw_rix) ...@@ -1098,6 +1098,42 @@ ath5k_hw_to_driver_rix(struct ath5k_softc *sc, int hw_rix)
* Buffers setup * * Buffers setup *
\***************/ \***************/
static
struct sk_buff *ath5k_rx_skb_alloc(struct ath5k_softc *sc, dma_addr_t *skb_addr)
{
struct sk_buff *skb;
unsigned int off;
/*
* Allocate buffer with headroom_needed space for the
* fake physical layer header at the start.
*/
skb = dev_alloc_skb(sc->rxbufsize + sc->cachelsz - 1);
if (!skb) {
ATH5K_ERR(sc, "can't alloc skbuff of size %u\n",
sc->rxbufsize + sc->cachelsz - 1);
return NULL;
}
/*
* Cache-line-align. This is important (for the
* 5210 at least) as not doing so causes bogus data
* in rx'd frames.
*/
off = ((unsigned long)skb->data) % sc->cachelsz;
if (off != 0)
skb_reserve(skb, sc->cachelsz - off);
*skb_addr = pci_map_single(sc->pdev,
skb->data, sc->rxbufsize, PCI_DMA_FROMDEVICE);
if (unlikely(pci_dma_mapping_error(sc->pdev, *skb_addr))) {
ATH5K_ERR(sc, "%s: DMA mapping failed\n", __func__);
dev_kfree_skb(skb);
return NULL;
}
return skb;
}
static int static int
ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf) ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
{ {
...@@ -1105,37 +1141,11 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf) ...@@ -1105,37 +1141,11 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
struct sk_buff *skb = bf->skb; struct sk_buff *skb = bf->skb;
struct ath5k_desc *ds; struct ath5k_desc *ds;
if (likely(skb == NULL)) { if (!skb) {
unsigned int off; skb = ath5k_rx_skb_alloc(sc, &bf->skbaddr);
if (!skb)
/*
* Allocate buffer with headroom_needed space for the
* fake physical layer header at the start.
*/
skb = dev_alloc_skb(sc->rxbufsize + sc->cachelsz - 1);
if (unlikely(skb == NULL)) {
ATH5K_ERR(sc, "can't alloc skbuff of size %u\n",
sc->rxbufsize + sc->cachelsz - 1);
return -ENOMEM; return -ENOMEM;
}
/*
* Cache-line-align. This is important (for the
* 5210 at least) as not doing so causes bogus data
* in rx'd frames.
*/
off = ((unsigned long)skb->data) % sc->cachelsz;
if (off != 0)
skb_reserve(skb, sc->cachelsz - off);
bf->skb = skb; bf->skb = skb;
bf->skbaddr = pci_map_single(sc->pdev,
skb->data, sc->rxbufsize, PCI_DMA_FROMDEVICE);
if (unlikely(pci_dma_mapping_error(sc->pdev, bf->skbaddr))) {
ATH5K_ERR(sc, "%s: DMA mapping failed\n", __func__);
dev_kfree_skb(skb);
bf->skb = NULL;
return -ENOMEM;
}
} }
/* /*
...@@ -1664,7 +1674,8 @@ ath5k_tasklet_rx(unsigned long data) ...@@ -1664,7 +1674,8 @@ ath5k_tasklet_rx(unsigned long data)
{ {
struct ieee80211_rx_status rxs = {}; struct ieee80211_rx_status rxs = {};
struct ath5k_rx_status rs = {}; struct ath5k_rx_status rs = {};
struct sk_buff *skb; struct sk_buff *skb, *next_skb;
dma_addr_t next_skb_addr;
struct ath5k_softc *sc = (void *)data; struct ath5k_softc *sc = (void *)data;
struct ath5k_buf *bf, *bf_last; struct ath5k_buf *bf, *bf_last;
struct ath5k_desc *ds; struct ath5k_desc *ds;
...@@ -1749,10 +1760,17 @@ ath5k_tasklet_rx(unsigned long data) ...@@ -1749,10 +1760,17 @@ ath5k_tasklet_rx(unsigned long data)
goto next; goto next;
} }
accept: accept:
next_skb = ath5k_rx_skb_alloc(sc, &next_skb_addr);
/*
* If we can't replace bf->skb with a new skb under memory
* pressure, just skip this packet
*/
if (!next_skb)
goto next;
pci_unmap_single(sc->pdev, bf->skbaddr, sc->rxbufsize, pci_unmap_single(sc->pdev, bf->skbaddr, sc->rxbufsize,
PCI_DMA_FROMDEVICE); PCI_DMA_FROMDEVICE);
bf->skb = NULL;
skb_put(skb, rs.rs_datalen); skb_put(skb, rs.rs_datalen);
/* The MAC header is padded to have 32-bit boundary if the /* The MAC header is padded to have 32-bit boundary if the
...@@ -1825,6 +1843,9 @@ ath5k_tasklet_rx(unsigned long data) ...@@ -1825,6 +1843,9 @@ ath5k_tasklet_rx(unsigned long data)
ath5k_check_ibss_tsf(sc, skb, &rxs); ath5k_check_ibss_tsf(sc, skb, &rxs);
__ieee80211_rx(sc->hw, skb, &rxs); __ieee80211_rx(sc->hw, skb, &rxs);
bf->skb = next_skb;
bf->skbaddr = next_skb_addr;
next: next:
list_move_tail(&bf->list, &sc->rxbuf); list_move_tail(&bf->list, &sc->rxbuf);
} while (ath5k_rxbuf_setup(sc, bf) == 0); } while (ath5k_rxbuf_setup(sc, bf) == 0);
......
...@@ -4042,7 +4042,19 @@ static int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state) ...@@ -4042,7 +4042,19 @@ static int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state)
priv->is_open = 1; priv->is_open = 1;
} }
pci_save_state(pdev); /* pci driver assumes state will be saved in this function.
* pci state is saved and device disabled when interface is
* stopped, so at this time pci device will always be disabled -
* whether interface was started or not. saving pci state now will
* cause saved state be that of a disabled device, which will cause
* problems during resume in that we will end up with a disabled device.
*
* indicate that the current saved state (from when interface was
* stopped) is valid. if interface was never up at time of suspend
* then the saved state will still be valid as it was saved during
* .probe. */
pdev->state_saved = true;
pci_set_power_state(pdev, PCI_D3hot); pci_set_power_state(pdev, PCI_D3hot);
return 0; return 0;
...@@ -4053,7 +4065,6 @@ static int iwl_pci_resume(struct pci_dev *pdev) ...@@ -4053,7 +4065,6 @@ static int iwl_pci_resume(struct pci_dev *pdev)
struct iwl_priv *priv = pci_get_drvdata(pdev); struct iwl_priv *priv = pci_get_drvdata(pdev);
pci_set_power_state(pdev, PCI_D0); pci_set_power_state(pdev, PCI_D0);
pci_restore_state(pdev);
if (priv->is_open) if (priv->is_open)
iwl_mac_start(priv->hw); iwl_mac_start(priv->hw);
......
...@@ -8143,7 +8143,19 @@ static int iwl3945_pci_suspend(struct pci_dev *pdev, pm_message_t state) ...@@ -8143,7 +8143,19 @@ static int iwl3945_pci_suspend(struct pci_dev *pdev, pm_message_t state)
priv->is_open = 1; priv->is_open = 1;
} }
pci_save_state(pdev); /* pci driver assumes state will be saved in this function.
* pci state is saved and device disabled when interface is
* stopped, so at this time pci device will always be disabled -
* whether interface was started or not. saving pci state now will
* cause saved state be that of a disabled device, which will cause
* problems during resume in that we will end up with a disabled device.
*
* indicate that the current saved state (from when interface was
* stopped) is valid. if interface was never up at time of suspend
* then the saved state will still be valid as it was saved during
* .probe. */
pdev->state_saved = true;
pci_set_power_state(pdev, PCI_D3hot); pci_set_power_state(pdev, PCI_D3hot);
return 0; return 0;
...@@ -8154,7 +8166,6 @@ static int iwl3945_pci_resume(struct pci_dev *pdev) ...@@ -8154,7 +8166,6 @@ static int iwl3945_pci_resume(struct pci_dev *pdev)
struct iwl3945_priv *priv = pci_get_drvdata(pdev); struct iwl3945_priv *priv = pci_get_drvdata(pdev);
pci_set_power_state(pdev, PCI_D0); pci_set_power_state(pdev, PCI_D0);
pci_restore_state(pdev);
if (priv->is_open) if (priv->is_open)
iwl3945_mac_start(priv->hw); iwl3945_mac_start(priv->hw);
......
...@@ -86,6 +86,7 @@ int zd_rf_init_hw(struct zd_rf *rf, u8 type) ...@@ -86,6 +86,7 @@ int zd_rf_init_hw(struct zd_rf *rf, u8 type)
case AL7230B_RF: case AL7230B_RF:
r = zd_rf_init_al7230b(rf); r = zd_rf_init_al7230b(rf);
break; break;
case MAXIM_NEW_RF:
case UW2453_RF: case UW2453_RF:
r = zd_rf_init_uw2453(rf); r = zd_rf_init_uw2453(rf);
break; break;
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
static struct usb_device_id usb_ids[] = { static struct usb_device_id usb_ids[] = {
/* ZD1211 */ /* ZD1211 */
{ USB_DEVICE(0x0ace, 0x1211), .driver_info = DEVICE_ZD1211 }, { USB_DEVICE(0x0ace, 0x1211), .driver_info = DEVICE_ZD1211 },
{ USB_DEVICE(0x0ace, 0xa211), .driver_info = DEVICE_ZD1211 },
{ USB_DEVICE(0x07b8, 0x6001), .driver_info = DEVICE_ZD1211 }, { USB_DEVICE(0x07b8, 0x6001), .driver_info = DEVICE_ZD1211 },
{ USB_DEVICE(0x126f, 0xa006), .driver_info = DEVICE_ZD1211 }, { USB_DEVICE(0x126f, 0xa006), .driver_info = DEVICE_ZD1211 },
{ USB_DEVICE(0x6891, 0xa727), .driver_info = DEVICE_ZD1211 }, { USB_DEVICE(0x6891, 0xa727), .driver_info = DEVICE_ZD1211 },
......
...@@ -515,7 +515,7 @@ enum ...@@ -515,7 +515,7 @@ enum
struct tc_drr_stats struct tc_drr_stats
{ {
u32 deficit; __u32 deficit;
}; };
#endif #endif
...@@ -1308,7 +1308,7 @@ static inline int sock_writeable(const struct sock *sk) ...@@ -1308,7 +1308,7 @@ static inline int sock_writeable(const struct sock *sk)
static inline gfp_t gfp_any(void) static inline gfp_t gfp_any(void)
{ {
return in_atomic() ? GFP_ATOMIC : GFP_KERNEL; return in_softirq() ? GFP_ATOMIC : GFP_KERNEL;
} }
static inline long sock_rcvtimeo(const struct sock *sk, int noblock) static inline long sock_rcvtimeo(const struct sock *sk, int noblock)
......
...@@ -696,6 +696,8 @@ int sock_getsockopt(struct socket *sock, int level, int optname, ...@@ -696,6 +696,8 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
if (len < 0) if (len < 0)
return -EINVAL; return -EINVAL;
v.val = 0;
switch(optname) { switch(optname) {
case SO_DEBUG: case SO_DEBUG:
v.val = sock_flag(sk, SOCK_DBG); v.val = sock_flag(sk, SOCK_DBG);
......
...@@ -1343,6 +1343,8 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -1343,6 +1343,8 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, struct net_device *dev)
list) { list) {
if (!netif_running(sdata->dev)) if (!netif_running(sdata->dev))
continue; continue;
if (sdata->vif.type != NL80211_IFTYPE_AP)
continue;
if (compare_ether_addr(sdata->dev->dev_addr, if (compare_ether_addr(sdata->dev->dev_addr,
hdr->addr2)) { hdr->addr2)) {
dev_hold(sdata->dev); dev_hold(sdata->dev);
......
...@@ -207,7 +207,6 @@ static int gprs_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -207,7 +207,6 @@ static int gprs_xmit(struct sk_buff *skb, struct net_device *dev)
dev->name, err); dev->name, err);
dev->stats.tx_aborted_errors++; dev->stats.tx_aborted_errors++;
dev->stats.tx_errors++; dev->stats.tx_errors++;
dev_kfree_skb(skb);
} else { } else {
dev->stats.tx_packets++; dev->stats.tx_packets++;
dev->stats.tx_bytes += len; dev->stats.tx_bytes += len;
......
...@@ -553,7 +553,7 @@ static int pep_do_rcv(struct sock *sk, struct sk_buff *skb) ...@@ -553,7 +553,7 @@ static int pep_do_rcv(struct sock *sk, struct sk_buff *skb)
{ {
struct pep_sock *pn = pep_sk(sk); struct pep_sock *pn = pep_sk(sk);
struct sock *sknode; struct sock *sknode;
struct pnpipehdr *hdr = pnp_hdr(skb); struct pnpipehdr *hdr;
struct sockaddr_pn dst; struct sockaddr_pn dst;
int err = NET_RX_SUCCESS; int err = NET_RX_SUCCESS;
u8 pipe_handle; u8 pipe_handle;
......
...@@ -94,12 +94,13 @@ struct wimax_dev *wimax_dev_get_by_genl_info( ...@@ -94,12 +94,13 @@ struct wimax_dev *wimax_dev_get_by_genl_info(
list_for_each_entry(wimax_dev, &wimax_id_table, id_table_node) { list_for_each_entry(wimax_dev, &wimax_id_table, id_table_node) {
if (wimax_dev->net_dev->ifindex == ifindex) { if (wimax_dev->net_dev->ifindex == ifindex) {
dev_hold(wimax_dev->net_dev); dev_hold(wimax_dev->net_dev);
break; goto found;
} }
} }
if (wimax_dev == NULL) wimax_dev = NULL;
d_printf(1, NULL, "wimax: no devices found with ifindex %d\n", d_printf(1, NULL, "wimax: no devices found with ifindex %d\n",
ifindex); ifindex);
found:
spin_unlock(&wimax_id_table_lock); spin_unlock(&wimax_id_table_lock);
d_fnend(3, NULL, "(info %p ifindex %d) = %p\n", d_fnend(3, NULL, "(info %p ifindex %d) = %p\n",
info, ifindex, wimax_dev); info, ifindex, wimax_dev);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册