mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
[SCSI] Merge branch 'linus'
Conflicts: drivers/message/fusion/mptsas.c fixed up conflict between req->data_len accessors and mptsas driver updates. Signed-off-by: James Bottomley <[email protected]>
This commit is contained in:
commit
82681a318f
1794 changed files with 103107 additions and 34819 deletions
|
|
@ -480,9 +480,13 @@ static int pnp_registered;
|
|||
|
||||
#ifdef CONFIG_EISA
|
||||
static struct eisa_device_id el3_eisa_ids[] = {
|
||||
{ "TCM5090" },
|
||||
{ "TCM5091" },
|
||||
{ "TCM5092" },
|
||||
{ "TCM5093" },
|
||||
{ "TCM5094" },
|
||||
{ "TCM5095" },
|
||||
{ "TCM5098" },
|
||||
{ "" }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(eisa, el3_eisa_ids);
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ obj-$(CONFIG_HAMACHI) += hamachi.o
|
|||
obj-$(CONFIG_NET) += Space.o loopback.o
|
||||
obj-$(CONFIG_SEEQ8005) += seeq8005.o
|
||||
obj-$(CONFIG_NET_SB1000) += sb1000.o
|
||||
obj-$(CONFIG_MAC8390) += mac8390.o 8390.o
|
||||
obj-$(CONFIG_MAC8390) += mac8390.o
|
||||
obj-$(CONFIG_APNE) += apne.o 8390.o
|
||||
obj-$(CONFIG_PCMCIA_PCNET) += 8390.o
|
||||
obj-$(CONFIG_HP100) += hp100.o
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ char atl1e_driver_version[] = DRV_VERSION;
|
|||
*/
|
||||
static struct pci_device_id atl1e_pci_tbl[] = {
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L1E)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, 0x1066)},
|
||||
/* required last entry */
|
||||
{ 0 }
|
||||
};
|
||||
|
|
|
|||
|
|
@ -82,6 +82,12 @@
|
|||
|
||||
#include "atl1.h"
|
||||
|
||||
#define ATLX_DRIVER_VERSION "2.1.3"
|
||||
MODULE_AUTHOR("Xiong Huang <[email protected]>, \
|
||||
Chris Snook <csnook@redhat.com>, Jay Cliburn <jcliburn@gmail.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION(ATLX_DRIVER_VERSION);
|
||||
|
||||
/* Temporary hack for merging atl1 and atl2 */
|
||||
#include "atlx.c"
|
||||
|
||||
|
|
|
|||
|
|
@ -29,12 +29,6 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define ATLX_DRIVER_VERSION "2.1.3"
|
||||
MODULE_AUTHOR("Xiong Huang <[email protected]>, \
|
||||
Chris Snook <csnook@redhat.com>, Jay Cliburn <jcliburn@gmail.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION(ATLX_DRIVER_VERSION);
|
||||
|
||||
#define ATLX_ERR_PHY 2
|
||||
#define ATLX_ERR_PHY_SPEED 7
|
||||
#define ATLX_ERR_PHY_RES 8
|
||||
|
|
|
|||
|
|
@ -35,8 +35,22 @@
|
|||
#define DRV_VER "2.0.348"
|
||||
#define DRV_NAME "be2net"
|
||||
#define BE_NAME "ServerEngines BladeEngine2 10Gbps NIC"
|
||||
#define OC_NAME "Emulex OneConnect 10Gbps NIC"
|
||||
#define DRV_DESC BE_NAME "Driver"
|
||||
|
||||
#define BE_VENDOR_ID 0x19a2
|
||||
#define BE_DEVICE_ID1 0x211
|
||||
#define OC_DEVICE_ID1 0x700
|
||||
#define OC_DEVICE_ID2 0x701
|
||||
|
||||
static inline char *nic_name(struct pci_dev *pdev)
|
||||
{
|
||||
if (pdev->device == OC_DEVICE_ID1 || pdev->device == OC_DEVICE_ID2)
|
||||
return OC_NAME;
|
||||
else
|
||||
return BE_NAME;
|
||||
}
|
||||
|
||||
/* Number of bytes of an RX frame that are copied to skb->data */
|
||||
#define BE_HDR_LEN 64
|
||||
#define BE_MAX_JUMBO_FRAME_SIZE 9018
|
||||
|
|
|
|||
|
|
@ -28,10 +28,10 @@ static unsigned int rx_frag_size = 2048;
|
|||
module_param(rx_frag_size, uint, S_IRUGO);
|
||||
MODULE_PARM_DESC(rx_frag_size, "Size of a fragment that holds rcvd data.");
|
||||
|
||||
#define BE_VENDOR_ID 0x19a2
|
||||
#define BE2_DEVICE_ID_1 0x0211
|
||||
static DEFINE_PCI_DEVICE_TABLE(be_dev_ids) = {
|
||||
{ PCI_DEVICE(BE_VENDOR_ID, BE2_DEVICE_ID_1) },
|
||||
{ PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID1) },
|
||||
{ PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID1) },
|
||||
{ PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID2) },
|
||||
{ 0 }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, be_dev_ids);
|
||||
|
|
@ -1859,7 +1859,7 @@ static int __devinit be_probe(struct pci_dev *pdev,
|
|||
if (status != 0)
|
||||
goto stats_clean;
|
||||
|
||||
dev_info(&pdev->dev, BE_NAME " port %d\n", adapter->port_num);
|
||||
dev_info(&pdev->dev, "%s port %d\n", nic_name(pdev), adapter->port_num);
|
||||
return 0;
|
||||
|
||||
stats_clean:
|
||||
|
|
@ -1873,7 +1873,7 @@ rel_reg:
|
|||
disable_dev:
|
||||
pci_disable_device(pdev);
|
||||
do_none:
|
||||
dev_warn(&pdev->dev, BE_NAME " initialization failed\n");
|
||||
dev_err(&pdev->dev, "%s initialization failed\n", nic_name(pdev));
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -979,22 +979,7 @@ static int bfin_mac_open(struct net_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct net_device_ops bfin_mac_netdev_ops = {
|
||||
.ndo_open = bfin_mac_open,
|
||||
.ndo_stop = bfin_mac_close,
|
||||
.ndo_start_xmit = bfin_mac_hard_start_xmit,
|
||||
.ndo_set_mac_address = bfin_mac_set_mac_address,
|
||||
.ndo_tx_timeout = bfin_mac_timeout,
|
||||
.ndo_set_multicast_list = bfin_mac_set_multicast_list,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
.ndo_poll_controller = bfin_mac_poll,
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
*
|
||||
* this makes the board clean up everything that it can
|
||||
* and not talk to the outside world. Caused by
|
||||
* an 'ifconfig ethX down'
|
||||
|
|
@ -1019,6 +1004,20 @@ static int bfin_mac_close(struct net_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct net_device_ops bfin_mac_netdev_ops = {
|
||||
.ndo_open = bfin_mac_open,
|
||||
.ndo_stop = bfin_mac_close,
|
||||
.ndo_start_xmit = bfin_mac_hard_start_xmit,
|
||||
.ndo_set_mac_address = bfin_mac_set_mac_address,
|
||||
.ndo_tx_timeout = bfin_mac_timeout,
|
||||
.ndo_set_multicast_list = bfin_mac_set_multicast_list,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
.ndo_poll_controller = bfin_mac_poll,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __devinit bfin_mac_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct net_device *ndev;
|
||||
|
|
|
|||
|
|
@ -1465,6 +1465,12 @@ static struct aggregator *ad_agg_selection_test(struct aggregator *best,
|
|||
return best;
|
||||
}
|
||||
|
||||
static int agg_device_up(const struct aggregator *agg)
|
||||
{
|
||||
return (netif_running(agg->slave->dev) &&
|
||||
netif_carrier_ok(agg->slave->dev));
|
||||
}
|
||||
|
||||
/**
|
||||
* ad_agg_selection_logic - select an aggregation group for a team
|
||||
* @aggregator: the aggregator we're looking at
|
||||
|
|
@ -1496,14 +1502,13 @@ static void ad_agg_selection_logic(struct aggregator *agg)
|
|||
struct port *port;
|
||||
|
||||
origin = agg;
|
||||
|
||||
active = __get_active_agg(agg);
|
||||
best = active;
|
||||
best = (active && agg_device_up(active)) ? active : NULL;
|
||||
|
||||
do {
|
||||
agg->is_active = 0;
|
||||
|
||||
if (agg->num_of_ports)
|
||||
if (agg->num_of_ports && agg_device_up(agg))
|
||||
best = ad_agg_selection_test(best, agg);
|
||||
|
||||
} while ((agg = __get_next_agg(agg)));
|
||||
|
|
|
|||
|
|
@ -85,8 +85,8 @@ struct fl_pg_chunk {
|
|||
struct page *page;
|
||||
void *va;
|
||||
unsigned int offset;
|
||||
u64 *p_cnt;
|
||||
DECLARE_PCI_UNMAP_ADDR(mapping);
|
||||
unsigned long *p_cnt;
|
||||
dma_addr_t mapping;
|
||||
};
|
||||
|
||||
struct rx_desc;
|
||||
|
|
|
|||
|
|
@ -2496,14 +2496,16 @@ static void check_link_status(struct adapter *adapter)
|
|||
for_each_port(adapter, i) {
|
||||
struct net_device *dev = adapter->port[i];
|
||||
struct port_info *p = netdev_priv(dev);
|
||||
int link_fault;
|
||||
|
||||
spin_lock_irq(&adapter->work_lock);
|
||||
if (p->link_fault) {
|
||||
link_fault = p->link_fault;
|
||||
spin_unlock_irq(&adapter->work_lock);
|
||||
|
||||
if (link_fault) {
|
||||
t3_link_fault(adapter, i);
|
||||
spin_unlock_irq(&adapter->work_lock);
|
||||
continue;
|
||||
}
|
||||
spin_unlock_irq(&adapter->work_lock);
|
||||
|
||||
if (!(p->phy.caps & SUPPORTED_IRQ) && netif_running(dev)) {
|
||||
t3_xgm_intr_disable(adapter, i);
|
||||
|
|
|
|||
|
|
@ -355,7 +355,7 @@ static void clear_rx_desc(struct pci_dev *pdev, const struct sge_fl *q,
|
|||
(*d->pg_chunk.p_cnt)--;
|
||||
if (!*d->pg_chunk.p_cnt)
|
||||
pci_unmap_page(pdev,
|
||||
pci_unmap_addr(&d->pg_chunk, mapping),
|
||||
d->pg_chunk.mapping,
|
||||
q->alloc_size, PCI_DMA_FROMDEVICE);
|
||||
|
||||
put_page(d->pg_chunk.page);
|
||||
|
|
@ -454,7 +454,7 @@ static int alloc_pg_chunk(struct adapter *adapter, struct sge_fl *q,
|
|||
q->pg_chunk.offset = 0;
|
||||
mapping = pci_map_page(adapter->pdev, q->pg_chunk.page,
|
||||
0, q->alloc_size, PCI_DMA_FROMDEVICE);
|
||||
pci_unmap_addr_set(&q->pg_chunk, mapping, mapping);
|
||||
q->pg_chunk.mapping = mapping;
|
||||
}
|
||||
sd->pg_chunk = q->pg_chunk;
|
||||
|
||||
|
|
@ -511,8 +511,7 @@ static int refill_fl(struct adapter *adap, struct sge_fl *q, int n, gfp_t gfp)
|
|||
nomem: q->alloc_failed++;
|
||||
break;
|
||||
}
|
||||
mapping = pci_unmap_addr(&sd->pg_chunk, mapping) +
|
||||
sd->pg_chunk.offset;
|
||||
mapping = sd->pg_chunk.mapping + sd->pg_chunk.offset;
|
||||
pci_unmap_addr_set(sd, dma_addr, mapping);
|
||||
|
||||
add_one_rx_chunk(mapping, d, q->gen);
|
||||
|
|
@ -881,7 +880,7 @@ recycle:
|
|||
(*sd->pg_chunk.p_cnt)--;
|
||||
if (!*sd->pg_chunk.p_cnt)
|
||||
pci_unmap_page(adap->pdev,
|
||||
pci_unmap_addr(&sd->pg_chunk, mapping),
|
||||
sd->pg_chunk.mapping,
|
||||
fl->alloc_size,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
if (!skb) {
|
||||
|
|
@ -2096,7 +2095,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
|
|||
(*sd->pg_chunk.p_cnt)--;
|
||||
if (!*sd->pg_chunk.p_cnt)
|
||||
pci_unmap_page(adap->pdev,
|
||||
pci_unmap_addr(&sd->pg_chunk, mapping),
|
||||
sd->pg_chunk.mapping,
|
||||
fl->alloc_size,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
|
||||
|
|
|
|||
|
|
@ -1274,6 +1274,11 @@ void t3_link_fault(struct adapter *adapter, int port_id)
|
|||
A_XGM_INT_STATUS + mac->offset);
|
||||
link_fault &= F_LINKFAULTCHANGE;
|
||||
|
||||
link_ok = lc->link_ok;
|
||||
speed = lc->speed;
|
||||
duplex = lc->duplex;
|
||||
fc = lc->fc;
|
||||
|
||||
phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc);
|
||||
|
||||
if (link_fault) {
|
||||
|
|
|
|||
|
|
@ -4027,8 +4027,9 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
|
|||
PCI_DMA_FROMDEVICE);
|
||||
|
||||
length = le16_to_cpu(rx_desc->length);
|
||||
|
||||
if (unlikely(!(status & E1000_RXD_STAT_EOP))) {
|
||||
/* !EOP means multiple descriptors were used to store a single
|
||||
* packet, also make sure the frame isn't just CRC only */
|
||||
if (unlikely(!(status & E1000_RXD_STAT_EOP) || (length <= 4))) {
|
||||
/* All receives must fit into a single buffer */
|
||||
E1000_DBG("%s: Receive packet consumed multiple"
|
||||
" buffers\n", netdev->name);
|
||||
|
|
|
|||
|
|
@ -897,6 +897,12 @@ enum {
|
|||
};
|
||||
static int phy_cross = NV_CROSSOVER_DETECTION_DISABLED;
|
||||
|
||||
/*
|
||||
* Power down phy when interface is down (persists through reboot;
|
||||
* older Linux and other OSes may not power it up again)
|
||||
*/
|
||||
static int phy_power_down = 0;
|
||||
|
||||
static inline struct fe_priv *get_nvpriv(struct net_device *dev)
|
||||
{
|
||||
return netdev_priv(dev);
|
||||
|
|
@ -1485,7 +1491,10 @@ static int phy_init(struct net_device *dev)
|
|||
|
||||
/* restart auto negotiation, power down phy */
|
||||
mii_control = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ);
|
||||
mii_control |= (BMCR_ANRESTART | BMCR_ANENABLE | BMCR_PDOWN);
|
||||
mii_control |= (BMCR_ANRESTART | BMCR_ANENABLE);
|
||||
if (phy_power_down) {
|
||||
mii_control |= BMCR_PDOWN;
|
||||
}
|
||||
if (mii_rw(dev, np->phyaddr, MII_BMCR, mii_control)) {
|
||||
return PHY_ERROR;
|
||||
}
|
||||
|
|
@ -5513,7 +5522,7 @@ static int nv_close(struct net_device *dev)
|
|||
|
||||
nv_drain_rxtx(dev);
|
||||
|
||||
if (np->wolenabled) {
|
||||
if (np->wolenabled || !phy_power_down) {
|
||||
writel(NVREG_PFF_ALWAYS|NVREG_PFF_MYADDR, base + NvRegPacketFilterFlags);
|
||||
nv_start_rx(dev);
|
||||
} else {
|
||||
|
|
@ -6367,6 +6376,8 @@ module_param(dma_64bit, int, 0);
|
|||
MODULE_PARM_DESC(dma_64bit, "High DMA is enabled by setting to 1 and disabled by setting to 0.");
|
||||
module_param(phy_cross, int, 0);
|
||||
MODULE_PARM_DESC(phy_cross, "Phy crossover detection for Realtek 8201 phy is enabled by setting to 1 and disabled by setting to 0.");
|
||||
module_param(phy_power_down, int, 0);
|
||||
MODULE_PARM_DESC(phy_power_down, "Power down phy and disable link when interface is down (1), or leave phy powered up (0).");
|
||||
|
||||
MODULE_AUTHOR("Manfred Spraul <[email protected]>");
|
||||
MODULE_DESCRIPTION("Reverse Engineered nForce ethernet driver");
|
||||
|
|
|
|||
|
|
@ -1885,8 +1885,17 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit)
|
|||
|
||||
if (unlikely(!newskb))
|
||||
newskb = skb;
|
||||
else if (skb)
|
||||
else if (skb) {
|
||||
/*
|
||||
* We need to reset ->data to what it
|
||||
* was before gfar_new_skb() re-aligned
|
||||
* it to an RXBUF_ALIGNMENT boundary
|
||||
* before we put the skb back on the
|
||||
* recycle list.
|
||||
*/
|
||||
skb->data = skb->head + NET_SKB_PAD;
|
||||
__skb_queue_head(&priv->rx_recycle, skb);
|
||||
}
|
||||
} else {
|
||||
/* Increment the number of packets */
|
||||
dev->stats.rx_packets++;
|
||||
|
|
|
|||
|
|
@ -259,7 +259,7 @@ extern const char gfar_driver_version[];
|
|||
(IEVENT_RXC | IEVENT_BSY | IEVENT_EBERR | IEVENT_MSRO | \
|
||||
IEVENT_BABT | IEVENT_TXC | IEVENT_TXE | IEVENT_LC \
|
||||
| IEVENT_CRL | IEVENT_XFUN | IEVENT_DPE | IEVENT_PERR \
|
||||
| IEVENT_MAG)
|
||||
| IEVENT_MAG | IEVENT_BABR)
|
||||
|
||||
#define IMASK_INIT_CLEAR 0x00000000
|
||||
#define IMASK_BABR 0x80000000
|
||||
|
|
|
|||
|
|
@ -304,7 +304,7 @@ struct net_device * __init mac8390_probe(int unit)
|
|||
if (!MACH_IS_MAC)
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
dev = alloc_ei_netdev();
|
||||
dev = ____alloc_ei_netdev(0);
|
||||
if (!dev)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
|
|
@ -481,15 +481,15 @@ void cleanup_module(void)
|
|||
static const struct net_device_ops mac8390_netdev_ops = {
|
||||
.ndo_open = mac8390_open,
|
||||
.ndo_stop = mac8390_close,
|
||||
.ndo_start_xmit = ei_start_xmit,
|
||||
.ndo_tx_timeout = ei_tx_timeout,
|
||||
.ndo_get_stats = ei_get_stats,
|
||||
.ndo_set_multicast_list = ei_set_multicast_list,
|
||||
.ndo_start_xmit = __ei_start_xmit,
|
||||
.ndo_tx_timeout = __ei_tx_timeout,
|
||||
.ndo_get_stats = __ei_get_stats,
|
||||
.ndo_set_multicast_list = __ei_set_multicast_list,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
.ndo_poll_controller = ei_poll,
|
||||
.ndo_poll_controller = __ei_poll,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -127,11 +127,11 @@ static unsigned long mdio_read(struct meth_private *priv, unsigned long phyreg)
|
|||
static int mdio_probe(struct meth_private *priv)
|
||||
{
|
||||
int i;
|
||||
unsigned long p2, p3;
|
||||
unsigned long p2, p3, flags;
|
||||
/* check if phy is detected already */
|
||||
if(priv->phy_addr>=0&&priv->phy_addr<32)
|
||||
return 0;
|
||||
spin_lock(&priv->meth_lock);
|
||||
spin_lock_irqsave(&priv->meth_lock, flags);
|
||||
for (i=0;i<32;++i){
|
||||
priv->phy_addr=i;
|
||||
p2=mdio_read(priv,2);
|
||||
|
|
@ -157,7 +157,7 @@ static int mdio_probe(struct meth_private *priv)
|
|||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock(&priv->meth_lock);
|
||||
spin_unlock_irqrestore(&priv->meth_lock, flags);
|
||||
if(priv->phy_addr<32) {
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -373,14 +373,14 @@ static int meth_release(struct net_device *dev)
|
|||
static void meth_rx(struct net_device* dev, unsigned long int_status)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
unsigned long status;
|
||||
unsigned long status, flags;
|
||||
struct meth_private *priv = netdev_priv(dev);
|
||||
unsigned long fifo_rptr = (int_status & METH_INT_RX_RPTR_MASK) >> 8;
|
||||
|
||||
spin_lock(&priv->meth_lock);
|
||||
spin_lock_irqsave(&priv->meth_lock, flags);
|
||||
priv->dma_ctrl &= ~METH_DMA_RX_INT_EN;
|
||||
mace->eth.dma_ctrl = priv->dma_ctrl;
|
||||
spin_unlock(&priv->meth_lock);
|
||||
spin_unlock_irqrestore(&priv->meth_lock, flags);
|
||||
|
||||
if (int_status & METH_INT_RX_UNDERFLOW) {
|
||||
fifo_rptr = (fifo_rptr - 1) & 0x0f;
|
||||
|
|
@ -452,12 +452,12 @@ static void meth_rx(struct net_device* dev, unsigned long int_status)
|
|||
mace->eth.rx_fifo = priv->rx_ring_dmas[priv->rx_write];
|
||||
ADVANCE_RX_PTR(priv->rx_write);
|
||||
}
|
||||
spin_lock(&priv->meth_lock);
|
||||
spin_lock_irqsave(&priv->meth_lock, flags);
|
||||
/* In case there was underflow, and Rx DMA was disabled */
|
||||
priv->dma_ctrl |= METH_DMA_RX_INT_EN | METH_DMA_RX_EN;
|
||||
mace->eth.dma_ctrl = priv->dma_ctrl;
|
||||
mace->eth.int_stat = METH_INT_RX_THRESHOLD;
|
||||
spin_unlock(&priv->meth_lock);
|
||||
spin_unlock_irqrestore(&priv->meth_lock, flags);
|
||||
}
|
||||
|
||||
static int meth_tx_full(struct net_device *dev)
|
||||
|
|
@ -470,11 +470,11 @@ static int meth_tx_full(struct net_device *dev)
|
|||
static void meth_tx_cleanup(struct net_device* dev, unsigned long int_status)
|
||||
{
|
||||
struct meth_private *priv = netdev_priv(dev);
|
||||
unsigned long status;
|
||||
unsigned long status, flags;
|
||||
struct sk_buff *skb;
|
||||
unsigned long rptr = (int_status&TX_INFO_RPTR) >> 16;
|
||||
|
||||
spin_lock(&priv->meth_lock);
|
||||
spin_lock_irqsave(&priv->meth_lock, flags);
|
||||
|
||||
/* Stop DMA notification */
|
||||
priv->dma_ctrl &= ~(METH_DMA_TX_INT_EN);
|
||||
|
|
@ -527,12 +527,13 @@ static void meth_tx_cleanup(struct net_device* dev, unsigned long int_status)
|
|||
}
|
||||
|
||||
mace->eth.int_stat = METH_INT_TX_EMPTY | METH_INT_TX_PKT;
|
||||
spin_unlock(&priv->meth_lock);
|
||||
spin_unlock_irqrestore(&priv->meth_lock, flags);
|
||||
}
|
||||
|
||||
static void meth_error(struct net_device* dev, unsigned status)
|
||||
{
|
||||
struct meth_private *priv = netdev_priv(dev);
|
||||
unsigned long flags;
|
||||
|
||||
printk(KERN_WARNING "meth: error status: 0x%08x\n",status);
|
||||
/* check for errors too... */
|
||||
|
|
@ -547,7 +548,7 @@ static void meth_error(struct net_device* dev, unsigned status)
|
|||
printk(KERN_WARNING "meth: Rx overflow\n");
|
||||
if (status & (METH_INT_RX_UNDERFLOW)) {
|
||||
printk(KERN_WARNING "meth: Rx underflow\n");
|
||||
spin_lock(&priv->meth_lock);
|
||||
spin_lock_irqsave(&priv->meth_lock, flags);
|
||||
mace->eth.int_stat = METH_INT_RX_UNDERFLOW;
|
||||
/* more underflow interrupts will be delivered,
|
||||
* effectively throwing us into an infinite loop.
|
||||
|
|
@ -555,7 +556,7 @@ static void meth_error(struct net_device* dev, unsigned status)
|
|||
priv->dma_ctrl &= ~METH_DMA_RX_EN;
|
||||
mace->eth.dma_ctrl = priv->dma_ctrl;
|
||||
DPRINTK("Disabled meth Rx DMA temporarily\n");
|
||||
spin_unlock(&priv->meth_lock);
|
||||
spin_unlock_irqrestore(&priv->meth_lock, flags);
|
||||
}
|
||||
mace->eth.int_stat = METH_INT_ERROR;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -125,8 +125,10 @@ void mlx4_en_deactivate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq)
|
|||
|
||||
if (cq->is_tx)
|
||||
del_timer(&cq->timer);
|
||||
else
|
||||
else {
|
||||
napi_disable(&cq->napi);
|
||||
netif_napi_del(&cq->napi);
|
||||
}
|
||||
|
||||
mlx4_cq_free(mdev->dev, &cq->mcq);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -426,7 +426,7 @@ void mlx4_en_poll_tx_cq(unsigned long data)
|
|||
|
||||
INC_PERF_COUNTER(priv->pstats.tx_poll);
|
||||
|
||||
if (!spin_trylock(&ring->comp_lock)) {
|
||||
if (!spin_trylock_irq(&ring->comp_lock)) {
|
||||
mod_timer(&cq->timer, jiffies + MLX4_EN_TX_POLL_TIMEOUT);
|
||||
return;
|
||||
}
|
||||
|
|
@ -439,7 +439,7 @@ void mlx4_en_poll_tx_cq(unsigned long data)
|
|||
if (inflight && priv->port_up)
|
||||
mod_timer(&cq->timer, jiffies + MLX4_EN_TX_POLL_TIMEOUT);
|
||||
|
||||
spin_unlock(&ring->comp_lock);
|
||||
spin_unlock_irq(&ring->comp_lock);
|
||||
}
|
||||
|
||||
static struct mlx4_en_tx_desc *mlx4_en_bounce_to_desc(struct mlx4_en_priv *priv,
|
||||
|
|
@ -482,9 +482,9 @@ static inline void mlx4_en_xmit_poll(struct mlx4_en_priv *priv, int tx_ind)
|
|||
|
||||
/* Poll the CQ every mlx4_en_TX_MODER_POLL packets */
|
||||
if ((++ring->poll_cnt & (MLX4_EN_TX_POLL_MODER - 1)) == 0)
|
||||
if (spin_trylock(&ring->comp_lock)) {
|
||||
if (spin_trylock_irq(&ring->comp_lock)) {
|
||||
mlx4_en_process_tx_cq(priv->dev, cq);
|
||||
spin_unlock(&ring->comp_lock);
|
||||
spin_unlock_irq(&ring->comp_lock);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -569,7 +569,7 @@ static int rxq_process(struct rx_queue *rxq, int budget)
|
|||
if (rxq->rx_curr_desc == rxq->rx_ring_size)
|
||||
rxq->rx_curr_desc = 0;
|
||||
|
||||
dma_unmap_single(NULL, rx_desc->buf_ptr,
|
||||
dma_unmap_single(mp->dev->dev.parent, rx_desc->buf_ptr,
|
||||
rx_desc->buf_size, DMA_FROM_DEVICE);
|
||||
rxq->rx_desc_count--;
|
||||
rx++;
|
||||
|
|
@ -678,8 +678,9 @@ static int rxq_refill(struct rx_queue *rxq, int budget)
|
|||
|
||||
rx_desc = rxq->rx_desc_area + rx;
|
||||
|
||||
rx_desc->buf_ptr = dma_map_single(NULL, skb->data,
|
||||
mp->skb_size, DMA_FROM_DEVICE);
|
||||
rx_desc->buf_ptr = dma_map_single(mp->dev->dev.parent,
|
||||
skb->data, mp->skb_size,
|
||||
DMA_FROM_DEVICE);
|
||||
rx_desc->buf_size = mp->skb_size;
|
||||
rxq->rx_skb[rx] = skb;
|
||||
wmb();
|
||||
|
|
@ -718,6 +719,7 @@ static inline unsigned int has_tiny_unaligned_frags(struct sk_buff *skb)
|
|||
|
||||
static void txq_submit_frag_skb(struct tx_queue *txq, struct sk_buff *skb)
|
||||
{
|
||||
struct mv643xx_eth_private *mp = txq_to_mp(txq);
|
||||
int nr_frags = skb_shinfo(skb)->nr_frags;
|
||||
int frag;
|
||||
|
||||
|
|
@ -746,10 +748,10 @@ static void txq_submit_frag_skb(struct tx_queue *txq, struct sk_buff *skb)
|
|||
|
||||
desc->l4i_chk = 0;
|
||||
desc->byte_cnt = this_frag->size;
|
||||
desc->buf_ptr = dma_map_page(NULL, this_frag->page,
|
||||
this_frag->page_offset,
|
||||
this_frag->size,
|
||||
DMA_TO_DEVICE);
|
||||
desc->buf_ptr = dma_map_page(mp->dev->dev.parent,
|
||||
this_frag->page,
|
||||
this_frag->page_offset,
|
||||
this_frag->size, DMA_TO_DEVICE);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -826,7 +828,8 @@ no_csum:
|
|||
|
||||
desc->l4i_chk = l4i_chk;
|
||||
desc->byte_cnt = length;
|
||||
desc->buf_ptr = dma_map_single(NULL, skb->data, length, DMA_TO_DEVICE);
|
||||
desc->buf_ptr = dma_map_single(mp->dev->dev.parent, skb->data,
|
||||
length, DMA_TO_DEVICE);
|
||||
|
||||
__skb_queue_tail(&txq->tx_skb, skb);
|
||||
|
||||
|
|
@ -956,10 +959,10 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force)
|
|||
}
|
||||
|
||||
if (cmd_sts & TX_FIRST_DESC) {
|
||||
dma_unmap_single(NULL, desc->buf_ptr,
|
||||
dma_unmap_single(mp->dev->dev.parent, desc->buf_ptr,
|
||||
desc->byte_cnt, DMA_TO_DEVICE);
|
||||
} else {
|
||||
dma_unmap_page(NULL, desc->buf_ptr,
|
||||
dma_unmap_page(mp->dev->dev.parent, desc->buf_ptr,
|
||||
desc->byte_cnt, DMA_TO_DEVICE);
|
||||
}
|
||||
|
||||
|
|
@ -1894,9 +1897,9 @@ static int rxq_init(struct mv643xx_eth_private *mp, int index)
|
|||
mp->rx_desc_sram_size);
|
||||
rxq->rx_desc_dma = mp->rx_desc_sram_addr;
|
||||
} else {
|
||||
rxq->rx_desc_area = dma_alloc_coherent(NULL, size,
|
||||
&rxq->rx_desc_dma,
|
||||
GFP_KERNEL);
|
||||
rxq->rx_desc_area = dma_alloc_coherent(mp->dev->dev.parent,
|
||||
size, &rxq->rx_desc_dma,
|
||||
GFP_KERNEL);
|
||||
}
|
||||
|
||||
if (rxq->rx_desc_area == NULL) {
|
||||
|
|
@ -1947,7 +1950,7 @@ out_free:
|
|||
if (index == 0 && size <= mp->rx_desc_sram_size)
|
||||
iounmap(rxq->rx_desc_area);
|
||||
else
|
||||
dma_free_coherent(NULL, size,
|
||||
dma_free_coherent(mp->dev->dev.parent, size,
|
||||
rxq->rx_desc_area,
|
||||
rxq->rx_desc_dma);
|
||||
|
||||
|
|
@ -1979,7 +1982,7 @@ static void rxq_deinit(struct rx_queue *rxq)
|
|||
rxq->rx_desc_area_size <= mp->rx_desc_sram_size)
|
||||
iounmap(rxq->rx_desc_area);
|
||||
else
|
||||
dma_free_coherent(NULL, rxq->rx_desc_area_size,
|
||||
dma_free_coherent(mp->dev->dev.parent, rxq->rx_desc_area_size,
|
||||
rxq->rx_desc_area, rxq->rx_desc_dma);
|
||||
|
||||
kfree(rxq->rx_skb);
|
||||
|
|
@ -2007,9 +2010,9 @@ static int txq_init(struct mv643xx_eth_private *mp, int index)
|
|||
mp->tx_desc_sram_size);
|
||||
txq->tx_desc_dma = mp->tx_desc_sram_addr;
|
||||
} else {
|
||||
txq->tx_desc_area = dma_alloc_coherent(NULL, size,
|
||||
&txq->tx_desc_dma,
|
||||
GFP_KERNEL);
|
||||
txq->tx_desc_area = dma_alloc_coherent(mp->dev->dev.parent,
|
||||
size, &txq->tx_desc_dma,
|
||||
GFP_KERNEL);
|
||||
}
|
||||
|
||||
if (txq->tx_desc_area == NULL) {
|
||||
|
|
@ -2053,7 +2056,7 @@ static void txq_deinit(struct tx_queue *txq)
|
|||
txq->tx_desc_area_size <= mp->tx_desc_sram_size)
|
||||
iounmap(txq->tx_desc_area);
|
||||
else
|
||||
dma_free_coherent(NULL, txq->tx_desc_area_size,
|
||||
dma_free_coherent(mp->dev->dev.parent, txq->tx_desc_area_size,
|
||||
txq->tx_desc_area, txq->tx_desc_dma);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -66,7 +66,6 @@ static const int multicast_filter_limit = 32;
|
|||
#define RX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */
|
||||
#define TX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */
|
||||
#define EarlyTxThld 0x3F /* 0x3F means NO early transmit */
|
||||
#define RxPacketMaxSize 0x3FE8 /* 16K - 1 - ETH_HLEN - VLAN - CRC... */
|
||||
#define SafeMtu 0x1c20 /* ... actually life sucks beyond ~7k */
|
||||
#define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */
|
||||
|
||||
|
|
@ -2357,10 +2356,10 @@ static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
|
|||
return cmd;
|
||||
}
|
||||
|
||||
static void rtl_set_rx_max_size(void __iomem *ioaddr)
|
||||
static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
|
||||
{
|
||||
/* Low hurts. Let's disable the filtering. */
|
||||
RTL_W16(RxMaxSize, 16383);
|
||||
RTL_W16(RxMaxSize, rx_buf_sz);
|
||||
}
|
||||
|
||||
static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
|
||||
|
|
@ -2407,7 +2406,7 @@ static void rtl_hw_start_8169(struct net_device *dev)
|
|||
|
||||
RTL_W8(EarlyTxThres, EarlyTxThld);
|
||||
|
||||
rtl_set_rx_max_size(ioaddr);
|
||||
rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
|
||||
|
||||
if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
|
||||
(tp->mac_version == RTL_GIGA_MAC_VER_02) ||
|
||||
|
|
@ -2668,7 +2667,7 @@ static void rtl_hw_start_8168(struct net_device *dev)
|
|||
|
||||
RTL_W8(EarlyTxThres, EarlyTxThld);
|
||||
|
||||
rtl_set_rx_max_size(ioaddr);
|
||||
rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
|
||||
|
||||
tp->cp_cmd |= RTL_R16(CPlusCmd) | PktCntrDisable | INTT_1;
|
||||
|
||||
|
|
@ -2846,7 +2845,7 @@ static void rtl_hw_start_8101(struct net_device *dev)
|
|||
|
||||
RTL_W8(EarlyTxThres, EarlyTxThld);
|
||||
|
||||
rtl_set_rx_max_size(ioaddr);
|
||||
rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
|
||||
|
||||
tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
|
||||
|
||||
|
|
@ -3554,54 +3553,64 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
|
|||
int handled = 0;
|
||||
int status;
|
||||
|
||||
/* loop handling interrupts until we have no new ones or
|
||||
* we hit a invalid/hotplug case.
|
||||
*/
|
||||
status = RTL_R16(IntrStatus);
|
||||
while (status && status != 0xffff) {
|
||||
handled = 1;
|
||||
|
||||
/* hotplug/major error/no more work/shared irq */
|
||||
if ((status == 0xffff) || !status)
|
||||
goto out;
|
||||
|
||||
handled = 1;
|
||||
|
||||
if (unlikely(!netif_running(dev))) {
|
||||
rtl8169_asic_down(ioaddr);
|
||||
goto out;
|
||||
}
|
||||
|
||||
status &= tp->intr_mask;
|
||||
RTL_W16(IntrStatus,
|
||||
(status & RxFIFOOver) ? (status | RxOverflow) : status);
|
||||
|
||||
if (!(status & tp->intr_event))
|
||||
goto out;
|
||||
|
||||
/* Work around for rx fifo overflow */
|
||||
if (unlikely(status & RxFIFOOver) &&
|
||||
(tp->mac_version == RTL_GIGA_MAC_VER_11)) {
|
||||
netif_stop_queue(dev);
|
||||
rtl8169_tx_timeout(dev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (unlikely(status & SYSErr)) {
|
||||
rtl8169_pcierr_interrupt(dev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (status & LinkChg)
|
||||
rtl8169_check_link_status(dev, tp, ioaddr);
|
||||
|
||||
if (status & tp->napi_event) {
|
||||
RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
|
||||
tp->intr_mask = ~tp->napi_event;
|
||||
|
||||
if (likely(napi_schedule_prep(&tp->napi)))
|
||||
__napi_schedule(&tp->napi);
|
||||
else if (netif_msg_intr(tp)) {
|
||||
printk(KERN_INFO "%s: interrupt %04x in poll\n",
|
||||
dev->name, status);
|
||||
/* Handle all of the error cases first. These will reset
|
||||
* the chip, so just exit the loop.
|
||||
*/
|
||||
if (unlikely(!netif_running(dev))) {
|
||||
rtl8169_asic_down(ioaddr);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Work around for rx fifo overflow */
|
||||
if (unlikely(status & RxFIFOOver) &&
|
||||
(tp->mac_version == RTL_GIGA_MAC_VER_11)) {
|
||||
netif_stop_queue(dev);
|
||||
rtl8169_tx_timeout(dev);
|
||||
break;
|
||||
}
|
||||
|
||||
if (unlikely(status & SYSErr)) {
|
||||
rtl8169_pcierr_interrupt(dev);
|
||||
break;
|
||||
}
|
||||
|
||||
if (status & LinkChg)
|
||||
rtl8169_check_link_status(dev, tp, ioaddr);
|
||||
|
||||
/* We need to see the lastest version of tp->intr_mask to
|
||||
* avoid ignoring an MSI interrupt and having to wait for
|
||||
* another event which may never come.
|
||||
*/
|
||||
smp_rmb();
|
||||
if (status & tp->intr_mask & tp->napi_event) {
|
||||
RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
|
||||
tp->intr_mask = ~tp->napi_event;
|
||||
|
||||
if (likely(napi_schedule_prep(&tp->napi)))
|
||||
__napi_schedule(&tp->napi);
|
||||
else if (netif_msg_intr(tp)) {
|
||||
printk(KERN_INFO "%s: interrupt %04x in poll\n",
|
||||
dev->name, status);
|
||||
}
|
||||
}
|
||||
|
||||
/* We only get a new MSI interrupt when all active irq
|
||||
* sources on the chip have been acknowledged. So, ack
|
||||
* everything we've seen and check if new sources have become
|
||||
* active to avoid blocking all interrupts from the chip.
|
||||
*/
|
||||
RTL_W16(IntrStatus,
|
||||
(status & RxFIFOOver) ? (status | RxOverflow) : status);
|
||||
status = RTL_R16(IntrStatus);
|
||||
}
|
||||
out:
|
||||
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
|
||||
|
|
@ -3617,13 +3626,15 @@ static int rtl8169_poll(struct napi_struct *napi, int budget)
|
|||
|
||||
if (work_done < budget) {
|
||||
napi_complete(napi);
|
||||
tp->intr_mask = 0xffff;
|
||||
/*
|
||||
* 20040426: the barrier is not strictly required but the
|
||||
* behavior of the irq handler could be less predictable
|
||||
* without it. Btw, the lack of flush for the posted pci
|
||||
* write is safe - FR
|
||||
|
||||
/* We need for force the visibility of tp->intr_mask
|
||||
* for other CPUs, as we can loose an MSI interrupt
|
||||
* and potentially wait for a retransmit timeout if we don't.
|
||||
* The posted write to IntrMask is safe, as it will
|
||||
* eventually make it to the chip and we won't loose anything
|
||||
* until it does.
|
||||
*/
|
||||
tp->intr_mask = 0xffff;
|
||||
smp_wmb();
|
||||
RTL_W16(IntrMask, tp->intr_event);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ enum vxge_hw_status vxge_hw_vpath_intr_enable(struct __vxge_hw_vpath_handle *vp)
|
|||
VXGE_HW_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_POISON|
|
||||
VXGE_HW_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO2_POISON|
|
||||
VXGE_HW_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_DMA_ERR|
|
||||
VXGE_HW_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_DMA_ERR), 0, 32),
|
||||
VXGE_HW_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO2_DMA_ERR), 0, 32),
|
||||
&vp_reg->kdfcctl_errors_mask);
|
||||
|
||||
__vxge_hw_pio_mem_write32_upper(0, &vp_reg->vpath_ppif_int_mask);
|
||||
|
|
|
|||
|
|
@ -819,10 +819,9 @@ void i2400m_roq_queue_update_ws(struct i2400m *i2400m, struct i2400m_roq *roq,
|
|||
roq_data = (struct i2400m_roq_data *) &skb->cb;
|
||||
i2400m_net_erx(i2400m, skb, roq_data->cs);
|
||||
}
|
||||
else {
|
||||
else
|
||||
__i2400m_roq_queue(i2400m, roq, skb, sn, nsn);
|
||||
__i2400m_roq_update_ws(i2400m, roq, sn + 1);
|
||||
}
|
||||
__i2400m_roq_update_ws(i2400m, roq, sn + 1);
|
||||
i2400m_roq_log_add(i2400m, roq, I2400M_RO_TYPE_PACKET_WS,
|
||||
old_ws, len, sn, nsn, roq->ws);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -505,27 +505,52 @@ int i2400mu_suspend(struct usb_interface *iface, pm_message_t pm_msg)
|
|||
#ifdef CONFIG_PM
|
||||
struct usb_device *usb_dev = i2400mu->usb_dev;
|
||||
#endif
|
||||
unsigned is_autosuspend = 0;
|
||||
struct i2400m *i2400m = &i2400mu->i2400m;
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
if (usb_dev->auto_pm > 0)
|
||||
is_autosuspend = 1;
|
||||
#endif
|
||||
|
||||
d_fnstart(3, dev, "(iface %p pm_msg %u)\n", iface, pm_msg.event);
|
||||
if (i2400m->updown == 0)
|
||||
goto no_firmware;
|
||||
d_printf(1, dev, "fw up, requesting standby\n");
|
||||
if (i2400m->state == I2400M_SS_DATA_PATH_CONNECTED && is_autosuspend) {
|
||||
/* ugh -- the device is connected and this suspend
|
||||
* request is an autosuspend one (not a system standby
|
||||
* / hibernate).
|
||||
*
|
||||
* The only way the device can go to standby is if the
|
||||
* link with the base station is in IDLE mode; that
|
||||
* were the case, we'd be in status
|
||||
* I2400M_SS_CONNECTED_IDLE. But we are not.
|
||||
*
|
||||
* If we *tell* him to go power save now, it'll reset
|
||||
* as a precautionary measure, so if this is an
|
||||
* autosuspend thing, say no and it'll come back
|
||||
* later, when the link is IDLE
|
||||
*/
|
||||
result = -EBADF;
|
||||
d_printf(1, dev, "fw up, link up, not-idle, autosuspend: "
|
||||
"not entering powersave\n");
|
||||
goto error_not_now;
|
||||
}
|
||||
d_printf(1, dev, "fw up: entering powersave\n");
|
||||
atomic_dec(&i2400mu->do_autopm);
|
||||
result = i2400m_cmd_enter_powersave(i2400m);
|
||||
atomic_inc(&i2400mu->do_autopm);
|
||||
#ifdef CONFIG_PM
|
||||
if (result < 0 && usb_dev->auto_pm == 0) {
|
||||
if (result < 0 && !is_autosuspend) {
|
||||
/* System suspend, can't fail */
|
||||
dev_err(dev, "failed to suspend, will reset on resume\n");
|
||||
result = 0;
|
||||
}
|
||||
#endif
|
||||
if (result < 0)
|
||||
goto error_enter_powersave;
|
||||
i2400mu_notification_release(i2400mu);
|
||||
d_printf(1, dev, "fw up, got standby\n");
|
||||
d_printf(1, dev, "powersave requested\n");
|
||||
error_enter_powersave:
|
||||
error_not_now:
|
||||
no_firmware:
|
||||
d_fnend(3, dev, "(iface %p pm_msg %u) = %d\n",
|
||||
iface, pm_msg.event, result);
|
||||
|
|
|
|||
|
|
@ -430,6 +430,7 @@ config RTL8187
|
|||
ASUS P5B Deluxe
|
||||
Toshiba Satellite Pro series of laptops
|
||||
Asus Wireless Link
|
||||
Linksys WUSB54GC-EU
|
||||
|
||||
Thanks to Realtek for their support!
|
||||
|
||||
|
|
|
|||
|
|
@ -6467,6 +6467,7 @@ static int airo_get_encode(struct net_device *dev,
|
|||
{
|
||||
struct airo_info *local = dev->ml_priv;
|
||||
int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
|
||||
int wep_key_len;
|
||||
u8 buf[16];
|
||||
|
||||
if (!local->wep_capable)
|
||||
|
|
@ -6500,11 +6501,13 @@ static int airo_get_encode(struct net_device *dev,
|
|||
dwrq->flags |= index + 1;
|
||||
|
||||
/* Copy the key to the user buffer */
|
||||
dwrq->length = get_wep_key(local, index, &buf[0], sizeof(buf));
|
||||
if (dwrq->length != -1)
|
||||
memcpy(extra, buf, dwrq->length);
|
||||
else
|
||||
wep_key_len = get_wep_key(local, index, &buf[0], sizeof(buf));
|
||||
if (wep_key_len < 0) {
|
||||
dwrq->length = 0;
|
||||
} else {
|
||||
dwrq->length = wep_key_len;
|
||||
memcpy(extra, buf, dwrq->length);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -6617,7 +6620,7 @@ static int airo_get_encodeext(struct net_device *dev,
|
|||
struct airo_info *local = dev->ml_priv;
|
||||
struct iw_point *encoding = &wrqu->encoding;
|
||||
struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
|
||||
int idx, max_key_len;
|
||||
int idx, max_key_len, wep_key_len;
|
||||
u8 buf[16];
|
||||
|
||||
if (!local->wep_capable)
|
||||
|
|
@ -6661,11 +6664,13 @@ static int airo_get_encodeext(struct net_device *dev,
|
|||
memset(extra, 0, 16);
|
||||
|
||||
/* Copy the key to the user buffer */
|
||||
ext->key_len = get_wep_key(local, idx, &buf[0], sizeof(buf));
|
||||
if (ext->key_len != -1)
|
||||
memcpy(extra, buf, ext->key_len);
|
||||
else
|
||||
wep_key_len = get_wep_key(local, idx, &buf[0], sizeof(buf));
|
||||
if (wep_key_len < 0) {
|
||||
ext->key_len = 0;
|
||||
} else {
|
||||
ext->key_len = wep_key_len;
|
||||
memcpy(extra, buf, ext->key_len);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1873,18 +1873,18 @@ static void at76_dwork_hw_scan(struct work_struct *work)
|
|||
if (ret != CMD_STATUS_COMPLETE) {
|
||||
queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan,
|
||||
SCAN_POLL_INTERVAL);
|
||||
goto exit;
|
||||
mutex_unlock(&priv->mtx);
|
||||
return;
|
||||
}
|
||||
|
||||
ieee80211_scan_completed(priv->hw, false);
|
||||
|
||||
if (is_valid_ether_addr(priv->bssid))
|
||||
at76_join(priv);
|
||||
|
||||
ieee80211_wake_queues(priv->hw);
|
||||
|
||||
exit:
|
||||
mutex_unlock(&priv->mtx);
|
||||
|
||||
ieee80211_scan_completed(priv->hw, false);
|
||||
|
||||
ieee80211_wake_queues(priv->hw);
|
||||
}
|
||||
|
||||
static int at76_hw_scan(struct ieee80211_hw *hw,
|
||||
|
|
|
|||
|
|
@ -1487,28 +1487,35 @@ ath5k_get_linear_pcdac_min(const u8 *stepL, const u8 *stepR,
|
|||
{
|
||||
s8 tmp;
|
||||
s16 min_pwrL, min_pwrR;
|
||||
s16 pwr_i = pwrL[0];
|
||||
s16 pwr_i;
|
||||
|
||||
do {
|
||||
pwr_i--;
|
||||
tmp = (s8) ath5k_get_interpolated_value(pwr_i,
|
||||
pwrL[0], pwrL[1],
|
||||
stepL[0], stepL[1]);
|
||||
if (pwrL[0] == pwrL[1])
|
||||
min_pwrL = pwrL[0];
|
||||
else {
|
||||
pwr_i = pwrL[0];
|
||||
do {
|
||||
pwr_i--;
|
||||
tmp = (s8) ath5k_get_interpolated_value(pwr_i,
|
||||
pwrL[0], pwrL[1],
|
||||
stepL[0], stepL[1]);
|
||||
} while (tmp > 1);
|
||||
|
||||
} while (tmp > 1);
|
||||
min_pwrL = pwr_i;
|
||||
}
|
||||
|
||||
min_pwrL = pwr_i;
|
||||
if (pwrR[0] == pwrR[1])
|
||||
min_pwrR = pwrR[0];
|
||||
else {
|
||||
pwr_i = pwrR[0];
|
||||
do {
|
||||
pwr_i--;
|
||||
tmp = (s8) ath5k_get_interpolated_value(pwr_i,
|
||||
pwrR[0], pwrR[1],
|
||||
stepR[0], stepR[1]);
|
||||
} while (tmp > 1);
|
||||
|
||||
pwr_i = pwrR[0];
|
||||
do {
|
||||
pwr_i--;
|
||||
tmp = (s8) ath5k_get_interpolated_value(pwr_i,
|
||||
pwrR[0], pwrR[1],
|
||||
stepR[0], stepR[1]);
|
||||
|
||||
} while (tmp > 1);
|
||||
|
||||
min_pwrR = pwr_i;
|
||||
min_pwrR = pwr_i;
|
||||
}
|
||||
|
||||
/* Keep the right boundary so that it works for both curves */
|
||||
return max(min_pwrL, min_pwrR);
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
\*****************************/
|
||||
|
||||
#include <linux/pci.h> /* To determine if a card is pci-e */
|
||||
#include <linux/bitops.h> /* For get_bitmask_order */
|
||||
#include <linux/log2.h>
|
||||
#include "ath5k.h"
|
||||
#include "reg.h"
|
||||
#include "base.h"
|
||||
|
|
@ -69,10 +69,10 @@ static inline int ath5k_hw_write_ofdm_timings(struct ath5k_hw *ah,
|
|||
|
||||
/* Get exponent
|
||||
* ALGO: coef_exp = 14 - highest set bit position */
|
||||
coef_exp = get_bitmask_order(coef_scaled);
|
||||
coef_exp = ilog2(coef_scaled);
|
||||
|
||||
/* Doesn't make sense if it's zero*/
|
||||
if (!coef_exp)
|
||||
if (!coef_scaled || !coef_exp)
|
||||
return -EINVAL;
|
||||
|
||||
/* Note: we've shifted coef_scaled by 24 */
|
||||
|
|
@ -359,7 +359,7 @@ int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int flags, bool initial)
|
|||
mode |= AR5K_PHY_MODE_FREQ_5GHZ;
|
||||
|
||||
if (ah->ah_radio == AR5K_RF5413)
|
||||
clock |= AR5K_PHY_PLL_40MHZ_5413;
|
||||
clock = AR5K_PHY_PLL_40MHZ_5413;
|
||||
else
|
||||
clock |= AR5K_PHY_PLL_40MHZ;
|
||||
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@
|
|||
#include "iwl-6000-hw.h"
|
||||
|
||||
/* Highest firmware API version supported */
|
||||
#define IWL5000_UCODE_API_MAX 1
|
||||
#define IWL5000_UCODE_API_MAX 2
|
||||
#define IWL5150_UCODE_API_MAX 2
|
||||
|
||||
/* Lowest firmware API version supported */
|
||||
|
|
|
|||
|
|
@ -669,13 +669,6 @@ static int iwl_set_mode(struct iwl_priv *priv, int mode)
|
|||
if (!iwl_is_ready_rf(priv))
|
||||
return -EAGAIN;
|
||||
|
||||
cancel_delayed_work(&priv->scan_check);
|
||||
if (iwl_scan_cancel_timeout(priv, 100)) {
|
||||
IWL_WARN(priv, "Aborted scan still in progress after 100ms\n");
|
||||
IWL_DEBUG_MAC80211(priv, "leaving - scan abort failed.\n");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
iwl_commit_rxon(priv);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -227,9 +227,6 @@ static void iwl_rx_scan_complete_notif(struct iwl_priv *priv,
|
|||
/* The HW is no longer scanning */
|
||||
clear_bit(STATUS_SCAN_HW, &priv->status);
|
||||
|
||||
/* The scan completion notification came in, so kill that timer... */
|
||||
cancel_delayed_work(&priv->scan_check);
|
||||
|
||||
IWL_DEBUG_INFO(priv, "Scan pass on %sGHz took %dms\n",
|
||||
(priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) ?
|
||||
"2.4" : "5.2",
|
||||
|
|
@ -712,6 +709,8 @@ static void iwl_bg_request_scan(struct work_struct *data)
|
|||
|
||||
mutex_lock(&priv->mutex);
|
||||
|
||||
cancel_delayed_work(&priv->scan_check);
|
||||
|
||||
if (!iwl_is_ready(priv)) {
|
||||
IWL_WARN(priv, "request scan called when driver not ready.\n");
|
||||
goto done;
|
||||
|
|
@ -925,6 +924,8 @@ void iwl_bg_scan_completed(struct work_struct *work)
|
|||
|
||||
IWL_DEBUG_SCAN(priv, "SCAN complete scan\n");
|
||||
|
||||
cancel_delayed_work(&priv->scan_check);
|
||||
|
||||
ieee80211_scan_completed(priv->hw, false);
|
||||
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
|
|
|
|||
|
|
@ -782,13 +782,6 @@ static int iwl3945_set_mode(struct iwl_priv *priv, int mode)
|
|||
if (!iwl_is_ready_rf(priv))
|
||||
return -EAGAIN;
|
||||
|
||||
cancel_delayed_work(&priv->scan_check);
|
||||
if (iwl_scan_cancel_timeout(priv, 100)) {
|
||||
IWL_WARN(priv, "Aborted scan still in progress after 100ms\n");
|
||||
IWL_DEBUG_MAC80211(priv, "leaving - scan abort failed.\n");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
iwl3945_commit_rxon(priv);
|
||||
|
||||
return 0;
|
||||
|
|
@ -3298,6 +3291,8 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
|
|||
|
||||
mutex_lock(&priv->mutex);
|
||||
|
||||
cancel_delayed_work(&priv->scan_check);
|
||||
|
||||
if (!iwl_is_ready(priv)) {
|
||||
IWL_WARN(priv, "request scan called when driver not ready.\n");
|
||||
goto done;
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev,
|
|||
|
||||
if (cipher == CIPHER_TKIP_NO_MIC)
|
||||
cipher = CIPHER_TKIP;
|
||||
if (cipher == CIPHER_NONE || cipher > CIPHER_MAX)
|
||||
if (cipher == CIPHER_NONE || cipher >= CIPHER_MAX)
|
||||
return;
|
||||
|
||||
/* Remove CIPHER_NONE index */
|
||||
|
|
|
|||
|
|
@ -71,6 +71,8 @@ static struct usb_device_id rtl8187_table[] __devinitdata = {
|
|||
{USB_DEVICE(0x18E8, 0x6232), .driver_info = DEVICE_RTL8187},
|
||||
/* AirLive */
|
||||
{USB_DEVICE(0x1b75, 0x8187), .driver_info = DEVICE_RTL8187},
|
||||
/* Linksys */
|
||||
{USB_DEVICE(0x1737, 0x0073), .driver_info = DEVICE_RTL8187B},
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue