mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
Merge branch 'master' into devel
This commit is contained in:
commit
87d721ad7a
908 changed files with 12536 additions and 7059 deletions
|
|
@ -832,7 +832,9 @@ static int corkscrew_open(struct net_device *dev)
|
|||
skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
|
||||
vp->rx_ring[i].addr = isa_virt_to_bus(skb->data);
|
||||
}
|
||||
vp->rx_ring[i - 1].next = isa_virt_to_bus(&vp->rx_ring[0]); /* Wrap the ring. */
|
||||
if (i != 0)
|
||||
vp->rx_ring[i - 1].next =
|
||||
isa_virt_to_bus(&vp->rx_ring[0]); /* Wrap the ring. */
|
||||
outl(isa_virt_to_bus(&vp->rx_ring[0]), ioaddr + UpListPtr);
|
||||
}
|
||||
if (vp->full_bus_master_tx) { /* Boomerang bus master Tx. */
|
||||
|
|
|
|||
|
|
@ -235,6 +235,7 @@ enum vortex_chips {
|
|||
CH_3C900B_FL,
|
||||
CH_3C905_1,
|
||||
CH_3C905_2,
|
||||
CH_3C905B_TX,
|
||||
CH_3C905B_1,
|
||||
|
||||
CH_3C905B_2,
|
||||
|
|
@ -307,6 +308,8 @@ static struct vortex_chip_info {
|
|||
PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, },
|
||||
{"3c905 Boomerang 100baseT4",
|
||||
PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, },
|
||||
{"3C905B-TX Fast Etherlink XL PCI",
|
||||
PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, },
|
||||
{"3c905B Cyclone 100baseTx",
|
||||
PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, },
|
||||
|
||||
|
|
@ -389,6 +392,7 @@ static struct pci_device_id vortex_pci_tbl[] = {
|
|||
{ 0x10B7, 0x900A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900B_FL },
|
||||
{ 0x10B7, 0x9050, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905_1 },
|
||||
{ 0x10B7, 0x9051, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905_2 },
|
||||
{ 0x10B7, 0x9054, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_TX },
|
||||
{ 0x10B7, 0x9055, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_1 },
|
||||
|
||||
{ 0x10B7, 0x9058, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_2 },
|
||||
|
|
@ -2721,13 +2725,15 @@ dump_tx_ring(struct net_device *dev)
|
|||
&vp->tx_ring[vp->dirty_tx % TX_RING_SIZE]);
|
||||
issue_and_wait(dev, DownStall);
|
||||
for (i = 0; i < TX_RING_SIZE; i++) {
|
||||
pr_err(" %d: @%p length %8.8x status %8.8x\n", i,
|
||||
&vp->tx_ring[i],
|
||||
unsigned int length;
|
||||
|
||||
#if DO_ZEROCOPY
|
||||
le32_to_cpu(vp->tx_ring[i].frag[0].length),
|
||||
length = le32_to_cpu(vp->tx_ring[i].frag[0].length);
|
||||
#else
|
||||
le32_to_cpu(vp->tx_ring[i].length),
|
||||
length = le32_to_cpu(vp->tx_ring[i].length);
|
||||
#endif
|
||||
pr_err(" %d: @%p length %8.8x status %8.8x\n",
|
||||
i, &vp->tx_ring[i], length,
|
||||
le32_to_cpu(vp->tx_ring[i].status));
|
||||
}
|
||||
if (!stalled)
|
||||
|
|
|
|||
|
|
@ -515,7 +515,7 @@ rx_status_loop:
|
|||
dma_addr_t mapping;
|
||||
struct sk_buff *skb, *new_skb;
|
||||
struct cp_desc *desc;
|
||||
unsigned buflen;
|
||||
const unsigned buflen = cp->rx_buf_sz;
|
||||
|
||||
skb = cp->rx_skb[rx_tail];
|
||||
BUG_ON(!skb);
|
||||
|
|
@ -549,8 +549,7 @@ rx_status_loop:
|
|||
pr_debug("%s: rx slot %d status 0x%x len %d\n",
|
||||
dev->name, rx_tail, status, len);
|
||||
|
||||
buflen = cp->rx_buf_sz + NET_IP_ALIGN;
|
||||
new_skb = netdev_alloc_skb(dev, buflen);
|
||||
new_skb = netdev_alloc_skb(dev, buflen + NET_IP_ALIGN);
|
||||
if (!new_skb) {
|
||||
dev->stats.rx_dropped++;
|
||||
goto rx_next;
|
||||
|
|
|
|||
|
|
@ -1727,12 +1727,14 @@ config KS8842
|
|||
tristate "Micrel KSZ8842"
|
||||
depends on HAS_IOMEM
|
||||
help
|
||||
This platform driver is for Micrel KSZ8842 chip.
|
||||
This platform driver is for Micrel KSZ8842 / KS8842
|
||||
2-port ethernet switch chip (managed, VLAN, QoS).
|
||||
|
||||
config KS8851
|
||||
tristate "Micrel KS8851 SPI"
|
||||
depends on SPI
|
||||
select MII
|
||||
select CRC32
|
||||
help
|
||||
SPI driver for Micrel KS8851 SPI attached network chip.
|
||||
|
||||
|
|
|
|||
|
|
@ -1080,7 +1080,7 @@ static struct platform_driver w90p910_ether_driver = {
|
|||
.probe = w90p910_ether_probe,
|
||||
.remove = __devexit_p(w90p910_ether_remove),
|
||||
.driver = {
|
||||
.name = "w90p910-emc",
|
||||
.name = "nuc900-emc",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
|
@ -1101,5 +1101,5 @@ module_exit(w90p910_ether_exit);
|
|||
MODULE_AUTHOR("Wan ZongShun <[email protected]>");
|
||||
MODULE_DESCRIPTION("w90p910 MAC driver!");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:w90p910-emc");
|
||||
MODULE_ALIAS("platform:nuc900-emc");
|
||||
|
||||
|
|
|
|||
|
|
@ -232,11 +232,11 @@ static void atl1c_get_drvinfo(struct net_device *netdev,
|
|||
{
|
||||
struct atl1c_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
strncpy(drvinfo->driver, atl1c_driver_name, sizeof(drvinfo->driver));
|
||||
strncpy(drvinfo->version, atl1c_driver_version,
|
||||
strlcpy(drvinfo->driver, atl1c_driver_name, sizeof(drvinfo->driver));
|
||||
strlcpy(drvinfo->version, atl1c_driver_version,
|
||||
sizeof(drvinfo->version));
|
||||
strncpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version));
|
||||
strncpy(drvinfo->bus_info, pci_name(adapter->pdev),
|
||||
strlcpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version));
|
||||
strlcpy(drvinfo->bus_info, pci_name(adapter->pdev),
|
||||
sizeof(drvinfo->bus_info));
|
||||
drvinfo->n_stats = 0;
|
||||
drvinfo->testinfo_len = 0;
|
||||
|
|
|
|||
|
|
@ -3378,11 +3378,11 @@ static void atl1_get_drvinfo(struct net_device *netdev,
|
|||
{
|
||||
struct atl1_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
strncpy(drvinfo->driver, ATLX_DRIVER_NAME, sizeof(drvinfo->driver));
|
||||
strncpy(drvinfo->version, ATLX_DRIVER_VERSION,
|
||||
strlcpy(drvinfo->driver, ATLX_DRIVER_NAME, sizeof(drvinfo->driver));
|
||||
strlcpy(drvinfo->version, ATLX_DRIVER_VERSION,
|
||||
sizeof(drvinfo->version));
|
||||
strncpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version));
|
||||
strncpy(drvinfo->bus_info, pci_name(adapter->pdev),
|
||||
strlcpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version));
|
||||
strlcpy(drvinfo->bus_info, pci_name(adapter->pdev),
|
||||
sizeof(drvinfo->bus_info));
|
||||
drvinfo->eedump_len = ATL1_EEDUMP_LEN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -952,9 +952,10 @@ static int b44_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
int rc = NETDEV_TX_OK;
|
||||
dma_addr_t mapping;
|
||||
u32 len, entry, ctrl;
|
||||
unsigned long flags;
|
||||
|
||||
len = skb->len;
|
||||
spin_lock_irq(&bp->lock);
|
||||
spin_lock_irqsave(&bp->lock, flags);
|
||||
|
||||
/* This is a hard error, log it. */
|
||||
if (unlikely(TX_BUFFS_AVAIL(bp) < 1)) {
|
||||
|
|
@ -1027,7 +1028,7 @@ static int b44_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
dev->trans_start = jiffies;
|
||||
|
||||
out_unlock:
|
||||
spin_unlock_irq(&bp->lock);
|
||||
spin_unlock_irqrestore(&bp->lock, flags);
|
||||
|
||||
return rc;
|
||||
|
||||
|
|
|
|||
|
|
@ -399,9 +399,11 @@ static int bnx2_unregister_cnic(struct net_device *dev)
|
|||
struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
|
||||
struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
|
||||
|
||||
mutex_lock(&bp->cnic_lock);
|
||||
cp->drv_state = 0;
|
||||
bnapi->cnic_present = 0;
|
||||
rcu_assign_pointer(bp->cnic_ops, NULL);
|
||||
mutex_unlock(&bp->cnic_lock);
|
||||
synchronize_rcu();
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -429,13 +431,13 @@ bnx2_cnic_stop(struct bnx2 *bp)
|
|||
struct cnic_ops *c_ops;
|
||||
struct cnic_ctl_info info;
|
||||
|
||||
rcu_read_lock();
|
||||
c_ops = rcu_dereference(bp->cnic_ops);
|
||||
mutex_lock(&bp->cnic_lock);
|
||||
c_ops = bp->cnic_ops;
|
||||
if (c_ops) {
|
||||
info.cmd = CNIC_CTL_STOP_CMD;
|
||||
c_ops->cnic_ctl(bp->cnic_data, &info);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
mutex_unlock(&bp->cnic_lock);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -444,8 +446,8 @@ bnx2_cnic_start(struct bnx2 *bp)
|
|||
struct cnic_ops *c_ops;
|
||||
struct cnic_ctl_info info;
|
||||
|
||||
rcu_read_lock();
|
||||
c_ops = rcu_dereference(bp->cnic_ops);
|
||||
mutex_lock(&bp->cnic_lock);
|
||||
c_ops = bp->cnic_ops;
|
||||
if (c_ops) {
|
||||
if (!(bp->flags & BNX2_FLAG_USING_MSIX)) {
|
||||
struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
|
||||
|
|
@ -455,7 +457,7 @@ bnx2_cnic_start(struct bnx2 *bp)
|
|||
info.cmd = CNIC_CTL_START_CMD;
|
||||
c_ops->cnic_ctl(bp->cnic_data, &info);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
mutex_unlock(&bp->cnic_lock);
|
||||
}
|
||||
|
||||
#else
|
||||
|
|
@ -7663,6 +7665,9 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
|
|||
|
||||
spin_lock_init(&bp->phy_lock);
|
||||
spin_lock_init(&bp->indirect_lock);
|
||||
#ifdef BCM_CNIC
|
||||
mutex_init(&bp->cnic_lock);
|
||||
#endif
|
||||
INIT_WORK(&bp->reset_task, bnx2_reset_task);
|
||||
|
||||
dev->base_addr = dev->mem_start = pci_resource_start(pdev, 0);
|
||||
|
|
|
|||
|
|
@ -6902,6 +6902,7 @@ struct bnx2 {
|
|||
u32 idle_chk_status_idx;
|
||||
|
||||
#ifdef BCM_CNIC
|
||||
struct mutex cnic_lock;
|
||||
struct cnic_eth_dev cnic_eth_dev;
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -611,11 +611,18 @@ nla_put_failure:
|
|||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
static int can_newlink(struct net_device *dev,
|
||||
struct nlattr *tb[], struct nlattr *data[])
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static struct rtnl_link_ops can_link_ops __read_mostly = {
|
||||
.kind = "can",
|
||||
.maxtype = IFLA_CAN_MAX,
|
||||
.policy = can_policy,
|
||||
.setup = can_setup,
|
||||
.newlink = can_newlink,
|
||||
.changelink = can_changelink,
|
||||
.fill_info = can_fill_info,
|
||||
.fill_xstats = can_fill_xstats,
|
||||
|
|
|
|||
|
|
@ -138,6 +138,16 @@ static struct cnic_dev *cnic_from_netdev(struct net_device *netdev)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline void ulp_get(struct cnic_ulp_ops *ulp_ops)
|
||||
{
|
||||
atomic_inc(&ulp_ops->ref_count);
|
||||
}
|
||||
|
||||
static inline void ulp_put(struct cnic_ulp_ops *ulp_ops)
|
||||
{
|
||||
atomic_dec(&ulp_ops->ref_count);
|
||||
}
|
||||
|
||||
static void cnic_ctx_wr(struct cnic_dev *dev, u32 cid_addr, u32 off, u32 val)
|
||||
{
|
||||
struct cnic_local *cp = dev->cnic_priv;
|
||||
|
|
@ -358,6 +368,7 @@ int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops)
|
|||
}
|
||||
read_unlock(&cnic_dev_lock);
|
||||
|
||||
atomic_set(&ulp_ops->ref_count, 0);
|
||||
rcu_assign_pointer(cnic_ulp_tbl[ulp_type], ulp_ops);
|
||||
mutex_unlock(&cnic_lock);
|
||||
|
||||
|
|
@ -379,6 +390,8 @@ int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops)
|
|||
int cnic_unregister_driver(int ulp_type)
|
||||
{
|
||||
struct cnic_dev *dev;
|
||||
struct cnic_ulp_ops *ulp_ops;
|
||||
int i = 0;
|
||||
|
||||
if (ulp_type >= MAX_CNIC_ULP_TYPE) {
|
||||
printk(KERN_ERR PFX "cnic_unregister_driver: Bad type %d\n",
|
||||
|
|
@ -386,7 +399,8 @@ int cnic_unregister_driver(int ulp_type)
|
|||
return -EINVAL;
|
||||
}
|
||||
mutex_lock(&cnic_lock);
|
||||
if (!cnic_ulp_tbl[ulp_type]) {
|
||||
ulp_ops = cnic_ulp_tbl[ulp_type];
|
||||
if (!ulp_ops) {
|
||||
printk(KERN_ERR PFX "cnic_unregister_driver: Type %d has not "
|
||||
"been registered\n", ulp_type);
|
||||
goto out_unlock;
|
||||
|
|
@ -411,6 +425,14 @@ int cnic_unregister_driver(int ulp_type)
|
|||
|
||||
mutex_unlock(&cnic_lock);
|
||||
synchronize_rcu();
|
||||
while ((atomic_read(&ulp_ops->ref_count) != 0) && (i < 20)) {
|
||||
msleep(100);
|
||||
i++;
|
||||
}
|
||||
|
||||
if (atomic_read(&ulp_ops->ref_count) != 0)
|
||||
printk(KERN_WARNING PFX "%s: Failed waiting for ref count to go"
|
||||
" to zero.\n", dev->netdev->name);
|
||||
return 0;
|
||||
|
||||
out_unlock:
|
||||
|
|
@ -466,6 +488,7 @@ EXPORT_SYMBOL(cnic_register_driver);
|
|||
static int cnic_unregister_device(struct cnic_dev *dev, int ulp_type)
|
||||
{
|
||||
struct cnic_local *cp = dev->cnic_priv;
|
||||
int i = 0;
|
||||
|
||||
if (ulp_type >= MAX_CNIC_ULP_TYPE) {
|
||||
printk(KERN_ERR PFX "cnic_unregister_device: Bad type %d\n",
|
||||
|
|
@ -486,6 +509,15 @@ static int cnic_unregister_device(struct cnic_dev *dev, int ulp_type)
|
|||
|
||||
synchronize_rcu();
|
||||
|
||||
while (test_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[ulp_type]) &&
|
||||
i < 20) {
|
||||
msleep(100);
|
||||
i++;
|
||||
}
|
||||
if (test_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[ulp_type]))
|
||||
printk(KERN_WARNING PFX "%s: Failed waiting for ULP up call"
|
||||
" to complete.\n", dev->netdev->name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(cnic_unregister_driver);
|
||||
|
|
@ -1076,18 +1108,23 @@ static void cnic_ulp_stop(struct cnic_dev *dev)
|
|||
if (cp->cnic_uinfo)
|
||||
cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL);
|
||||
|
||||
rcu_read_lock();
|
||||
for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) {
|
||||
struct cnic_ulp_ops *ulp_ops;
|
||||
|
||||
ulp_ops = rcu_dereference(cp->ulp_ops[if_type]);
|
||||
if (!ulp_ops)
|
||||
mutex_lock(&cnic_lock);
|
||||
ulp_ops = cp->ulp_ops[if_type];
|
||||
if (!ulp_ops) {
|
||||
mutex_unlock(&cnic_lock);
|
||||
continue;
|
||||
}
|
||||
set_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[if_type]);
|
||||
mutex_unlock(&cnic_lock);
|
||||
|
||||
if (test_and_clear_bit(ULP_F_START, &cp->ulp_flags[if_type]))
|
||||
ulp_ops->cnic_stop(cp->ulp_handle[if_type]);
|
||||
|
||||
clear_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[if_type]);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static void cnic_ulp_start(struct cnic_dev *dev)
|
||||
|
|
@ -1095,18 +1132,23 @@ static void cnic_ulp_start(struct cnic_dev *dev)
|
|||
struct cnic_local *cp = dev->cnic_priv;
|
||||
int if_type;
|
||||
|
||||
rcu_read_lock();
|
||||
for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) {
|
||||
struct cnic_ulp_ops *ulp_ops;
|
||||
|
||||
ulp_ops = rcu_dereference(cp->ulp_ops[if_type]);
|
||||
if (!ulp_ops || !ulp_ops->cnic_start)
|
||||
mutex_lock(&cnic_lock);
|
||||
ulp_ops = cp->ulp_ops[if_type];
|
||||
if (!ulp_ops || !ulp_ops->cnic_start) {
|
||||
mutex_unlock(&cnic_lock);
|
||||
continue;
|
||||
}
|
||||
set_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[if_type]);
|
||||
mutex_unlock(&cnic_lock);
|
||||
|
||||
if (!test_and_set_bit(ULP_F_START, &cp->ulp_flags[if_type]))
|
||||
ulp_ops->cnic_start(cp->ulp_handle[if_type]);
|
||||
|
||||
clear_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[if_type]);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static int cnic_ctl(void *data, struct cnic_ctl_info *info)
|
||||
|
|
@ -1116,22 +1158,18 @@ static int cnic_ctl(void *data, struct cnic_ctl_info *info)
|
|||
switch (info->cmd) {
|
||||
case CNIC_CTL_STOP_CMD:
|
||||
cnic_hold(dev);
|
||||
mutex_lock(&cnic_lock);
|
||||
|
||||
cnic_ulp_stop(dev);
|
||||
cnic_stop_hw(dev);
|
||||
|
||||
mutex_unlock(&cnic_lock);
|
||||
cnic_put(dev);
|
||||
break;
|
||||
case CNIC_CTL_START_CMD:
|
||||
cnic_hold(dev);
|
||||
mutex_lock(&cnic_lock);
|
||||
|
||||
if (!cnic_start_hw(dev))
|
||||
cnic_ulp_start(dev);
|
||||
|
||||
mutex_unlock(&cnic_lock);
|
||||
cnic_put(dev);
|
||||
break;
|
||||
default:
|
||||
|
|
@ -1145,19 +1183,23 @@ static void cnic_ulp_init(struct cnic_dev *dev)
|
|||
int i;
|
||||
struct cnic_local *cp = dev->cnic_priv;
|
||||
|
||||
rcu_read_lock();
|
||||
for (i = 0; i < MAX_CNIC_ULP_TYPE_EXT; i++) {
|
||||
struct cnic_ulp_ops *ulp_ops;
|
||||
|
||||
ulp_ops = rcu_dereference(cnic_ulp_tbl[i]);
|
||||
if (!ulp_ops || !ulp_ops->cnic_init)
|
||||
mutex_lock(&cnic_lock);
|
||||
ulp_ops = cnic_ulp_tbl[i];
|
||||
if (!ulp_ops || !ulp_ops->cnic_init) {
|
||||
mutex_unlock(&cnic_lock);
|
||||
continue;
|
||||
}
|
||||
ulp_get(ulp_ops);
|
||||
mutex_unlock(&cnic_lock);
|
||||
|
||||
if (!test_and_set_bit(ULP_F_INIT, &cp->ulp_flags[i]))
|
||||
ulp_ops->cnic_init(dev);
|
||||
|
||||
ulp_put(ulp_ops);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static void cnic_ulp_exit(struct cnic_dev *dev)
|
||||
|
|
@ -1165,19 +1207,23 @@ static void cnic_ulp_exit(struct cnic_dev *dev)
|
|||
int i;
|
||||
struct cnic_local *cp = dev->cnic_priv;
|
||||
|
||||
rcu_read_lock();
|
||||
for (i = 0; i < MAX_CNIC_ULP_TYPE_EXT; i++) {
|
||||
struct cnic_ulp_ops *ulp_ops;
|
||||
|
||||
ulp_ops = rcu_dereference(cnic_ulp_tbl[i]);
|
||||
if (!ulp_ops || !ulp_ops->cnic_exit)
|
||||
mutex_lock(&cnic_lock);
|
||||
ulp_ops = cnic_ulp_tbl[i];
|
||||
if (!ulp_ops || !ulp_ops->cnic_exit) {
|
||||
mutex_unlock(&cnic_lock);
|
||||
continue;
|
||||
}
|
||||
ulp_get(ulp_ops);
|
||||
mutex_unlock(&cnic_lock);
|
||||
|
||||
if (test_and_clear_bit(ULP_F_INIT, &cp->ulp_flags[i]))
|
||||
ulp_ops->cnic_exit(dev);
|
||||
|
||||
ulp_put(ulp_ops);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static int cnic_cm_offload_pg(struct cnic_sock *csk)
|
||||
|
|
@ -2393,6 +2439,37 @@ static int cnic_start_bnx2_hw(struct cnic_dev *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cnic_register_netdev(struct cnic_dev *dev)
|
||||
{
|
||||
struct cnic_local *cp = dev->cnic_priv;
|
||||
struct cnic_eth_dev *ethdev = cp->ethdev;
|
||||
int err;
|
||||
|
||||
if (!ethdev)
|
||||
return -ENODEV;
|
||||
|
||||
if (ethdev->drv_state & CNIC_DRV_STATE_REGD)
|
||||
return 0;
|
||||
|
||||
err = ethdev->drv_register_cnic(dev->netdev, cp->cnic_ops, dev);
|
||||
if (err)
|
||||
printk(KERN_ERR PFX "%s: register_cnic failed\n",
|
||||
dev->netdev->name);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static void cnic_unregister_netdev(struct cnic_dev *dev)
|
||||
{
|
||||
struct cnic_local *cp = dev->cnic_priv;
|
||||
struct cnic_eth_dev *ethdev = cp->ethdev;
|
||||
|
||||
if (!ethdev)
|
||||
return;
|
||||
|
||||
ethdev->drv_unregister_cnic(dev->netdev);
|
||||
}
|
||||
|
||||
static int cnic_start_hw(struct cnic_dev *dev)
|
||||
{
|
||||
struct cnic_local *cp = dev->cnic_priv;
|
||||
|
|
@ -2402,13 +2479,6 @@ static int cnic_start_hw(struct cnic_dev *dev)
|
|||
if (test_bit(CNIC_F_CNIC_UP, &dev->flags))
|
||||
return -EALREADY;
|
||||
|
||||
err = ethdev->drv_register_cnic(dev->netdev, cp->cnic_ops, dev);
|
||||
if (err) {
|
||||
printk(KERN_ERR PFX "%s: register_cnic failed\n",
|
||||
dev->netdev->name);
|
||||
goto err2;
|
||||
}
|
||||
|
||||
dev->regview = ethdev->io_base;
|
||||
cp->chip_id = ethdev->chip_id;
|
||||
pci_dev_get(dev->pcidev);
|
||||
|
|
@ -2438,18 +2508,13 @@ static int cnic_start_hw(struct cnic_dev *dev)
|
|||
return 0;
|
||||
|
||||
err1:
|
||||
ethdev->drv_unregister_cnic(dev->netdev);
|
||||
cp->free_resc(dev);
|
||||
pci_dev_put(dev->pcidev);
|
||||
err2:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void cnic_stop_bnx2_hw(struct cnic_dev *dev)
|
||||
{
|
||||
struct cnic_local *cp = dev->cnic_priv;
|
||||
struct cnic_eth_dev *ethdev = cp->ethdev;
|
||||
|
||||
cnic_disable_bnx2_int_sync(dev);
|
||||
|
||||
cnic_reg_wr_ind(dev, BNX2_CP_SCRATCH + 0x20, 0);
|
||||
|
|
@ -2461,8 +2526,6 @@ static void cnic_stop_bnx2_hw(struct cnic_dev *dev)
|
|||
cnic_setup_5709_context(dev, 0);
|
||||
cnic_free_irq(dev);
|
||||
|
||||
ethdev->drv_unregister_cnic(dev->netdev);
|
||||
|
||||
cnic_free_resc(dev);
|
||||
}
|
||||
|
||||
|
|
@ -2543,7 +2606,7 @@ static struct cnic_dev *init_bnx2_cnic(struct net_device *dev)
|
|||
probe = symbol_get(bnx2_cnic_probe);
|
||||
if (probe) {
|
||||
ethdev = (*probe)(dev);
|
||||
symbol_put_addr(probe);
|
||||
symbol_put(bnx2_cnic_probe);
|
||||
}
|
||||
if (!ethdev)
|
||||
return NULL;
|
||||
|
|
@ -2646,10 +2709,12 @@ static int cnic_netdev_event(struct notifier_block *this, unsigned long event,
|
|||
else if (event == NETDEV_UNREGISTER)
|
||||
cnic_ulp_exit(dev);
|
||||
else if (event == NETDEV_UP) {
|
||||
mutex_lock(&cnic_lock);
|
||||
if (cnic_register_netdev(dev) != 0) {
|
||||
cnic_put(dev);
|
||||
goto done;
|
||||
}
|
||||
if (!cnic_start_hw(dev))
|
||||
cnic_ulp_start(dev);
|
||||
mutex_unlock(&cnic_lock);
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
|
|
@ -2668,10 +2733,9 @@ static int cnic_netdev_event(struct notifier_block *this, unsigned long event,
|
|||
rcu_read_unlock();
|
||||
|
||||
if (event == NETDEV_GOING_DOWN) {
|
||||
mutex_lock(&cnic_lock);
|
||||
cnic_ulp_stop(dev);
|
||||
cnic_stop_hw(dev);
|
||||
mutex_unlock(&cnic_lock);
|
||||
cnic_unregister_netdev(dev);
|
||||
} else if (event == NETDEV_UNREGISTER) {
|
||||
write_lock(&cnic_dev_lock);
|
||||
list_del_init(&dev->list);
|
||||
|
|
@ -2703,6 +2767,7 @@ static void cnic_release(void)
|
|||
}
|
||||
|
||||
cnic_ulp_exit(dev);
|
||||
cnic_unregister_netdev(dev);
|
||||
list_del_init(&dev->list);
|
||||
cnic_free_dev(dev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -176,6 +176,7 @@ struct cnic_local {
|
|||
unsigned long ulp_flags[MAX_CNIC_ULP_TYPE];
|
||||
#define ULP_F_INIT 0
|
||||
#define ULP_F_START 1
|
||||
#define ULP_F_CALL_PENDING 2
|
||||
struct cnic_ulp_ops *ulp_ops[MAX_CNIC_ULP_TYPE];
|
||||
|
||||
/* protected by ulp_lock */
|
||||
|
|
|
|||
|
|
@ -290,6 +290,7 @@ struct cnic_ulp_ops {
|
|||
void (*iscsi_nl_send_msg)(struct cnic_dev *dev, u32 msg_type,
|
||||
char *data, u16 data_size);
|
||||
struct module *owner;
|
||||
atomic_t ref_count;
|
||||
};
|
||||
|
||||
extern int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops);
|
||||
|
|
|
|||
|
|
@ -1899,7 +1899,7 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx,
|
|||
nic->ru_running = RU_SUSPENDED;
|
||||
pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr,
|
||||
sizeof(struct rfd),
|
||||
PCI_DMA_BIDIRECTIONAL);
|
||||
PCI_DMA_FROMDEVICE);
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -338,10 +338,7 @@ static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw)
|
|||
{
|
||||
struct e1000_nvm_info *nvm = &hw->nvm;
|
||||
struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
|
||||
union ich8_hws_flash_status hsfsts;
|
||||
u32 gfpreg;
|
||||
u32 sector_base_addr;
|
||||
u32 sector_end_addr;
|
||||
u32 gfpreg, sector_base_addr, sector_end_addr;
|
||||
u16 i;
|
||||
|
||||
/* Can't read flash registers if the register set isn't mapped. */
|
||||
|
|
@ -375,20 +372,6 @@ static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw)
|
|||
/* Adjust to word count */
|
||||
nvm->flash_bank_size /= sizeof(u16);
|
||||
|
||||
/*
|
||||
* Make sure the flash bank size does not overwrite the 4k
|
||||
* sector ranges. We may have 64k allotted to us but we only care
|
||||
* about the first 2 4k sectors. Therefore, if we have anything less
|
||||
* than 64k set in the HSFSTS register, we will reduce the bank size
|
||||
* down to 4k and let the rest remain unused. If berasesz == 3, then
|
||||
* we are working in 64k mode. Otherwise we are not.
|
||||
*/
|
||||
if (nvm->flash_bank_size > E1000_ICH8_SHADOW_RAM_WORDS) {
|
||||
hsfsts.regval = er16flash(ICH_FLASH_HSFSTS);
|
||||
if (hsfsts.hsf_status.berasesz != 3)
|
||||
nvm->flash_bank_size = E1000_ICH8_SHADOW_RAM_WORDS;
|
||||
}
|
||||
|
||||
nvm->word_size = E1000_ICH8_SHADOW_RAM_WORDS;
|
||||
|
||||
/* Clear shadow ram */
|
||||
|
|
@ -594,8 +577,8 @@ static DEFINE_MUTEX(nvm_mutex);
|
|||
**/
|
||||
static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw)
|
||||
{
|
||||
u32 extcnf_ctrl;
|
||||
u32 timeout = PHY_CFG_TIMEOUT;
|
||||
u32 extcnf_ctrl, timeout = PHY_CFG_TIMEOUT;
|
||||
s32 ret_val = 0;
|
||||
|
||||
might_sleep();
|
||||
|
||||
|
|
@ -603,28 +586,46 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw)
|
|||
|
||||
while (timeout) {
|
||||
extcnf_ctrl = er32(EXTCNF_CTRL);
|
||||
if (!(extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG))
|
||||
break;
|
||||
|
||||
if (!(extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)) {
|
||||
extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG;
|
||||
ew32(EXTCNF_CTRL, extcnf_ctrl);
|
||||
|
||||
extcnf_ctrl = er32(EXTCNF_CTRL);
|
||||
if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)
|
||||
break;
|
||||
}
|
||||
mdelay(1);
|
||||
timeout--;
|
||||
}
|
||||
|
||||
if (!timeout) {
|
||||
hw_dbg(hw, "FW or HW has locked the resource for too long.\n");
|
||||
extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG;
|
||||
ew32(EXTCNF_CTRL, extcnf_ctrl);
|
||||
mutex_unlock(&nvm_mutex);
|
||||
return -E1000_ERR_CONFIG;
|
||||
hw_dbg(hw, "SW/FW/HW has locked the resource for too long.\n");
|
||||
ret_val = -E1000_ERR_CONFIG;
|
||||
goto out;
|
||||
}
|
||||
|
||||
return 0;
|
||||
timeout = PHY_CFG_TIMEOUT * 2;
|
||||
|
||||
extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG;
|
||||
ew32(EXTCNF_CTRL, extcnf_ctrl);
|
||||
|
||||
while (timeout) {
|
||||
extcnf_ctrl = er32(EXTCNF_CTRL);
|
||||
if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)
|
||||
break;
|
||||
|
||||
mdelay(1);
|
||||
timeout--;
|
||||
}
|
||||
|
||||
if (!timeout) {
|
||||
hw_dbg(hw, "Failed to acquire the semaphore.\n");
|
||||
extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG;
|
||||
ew32(EXTCNF_CTRL, extcnf_ctrl);
|
||||
ret_val = -E1000_ERR_CONFIG;
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
if (ret_val)
|
||||
mutex_unlock(&nvm_mutex);
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1306,7 +1307,7 @@ static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words,
|
|||
struct e1000_nvm_info *nvm = &hw->nvm;
|
||||
struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
|
||||
u32 act_offset;
|
||||
s32 ret_val;
|
||||
s32 ret_val = 0;
|
||||
u32 bank = 0;
|
||||
u16 i, word;
|
||||
|
||||
|
|
@ -1321,12 +1322,15 @@ static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words,
|
|||
goto out;
|
||||
|
||||
ret_val = e1000_valid_nvm_bank_detect_ich8lan(hw, &bank);
|
||||
if (ret_val)
|
||||
goto release;
|
||||
if (ret_val) {
|
||||
hw_dbg(hw, "Could not detect valid bank, assuming bank 0\n");
|
||||
bank = 0;
|
||||
}
|
||||
|
||||
act_offset = (bank) ? nvm->flash_bank_size : 0;
|
||||
act_offset += offset;
|
||||
|
||||
ret_val = 0;
|
||||
for (i = 0; i < words; i++) {
|
||||
if ((dev_spec->shadow_ram) &&
|
||||
(dev_spec->shadow_ram[offset+i].modified)) {
|
||||
|
|
@ -1341,7 +1345,6 @@ static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words,
|
|||
}
|
||||
}
|
||||
|
||||
release:
|
||||
e1000_release_swflag_ich8lan(hw);
|
||||
|
||||
out:
|
||||
|
|
@ -1592,7 +1595,6 @@ static s32 e1000_write_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words,
|
|||
{
|
||||
struct e1000_nvm_info *nvm = &hw->nvm;
|
||||
struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
|
||||
s32 ret_val;
|
||||
u16 i;
|
||||
|
||||
if ((offset >= nvm->word_size) || (words > nvm->word_size - offset) ||
|
||||
|
|
@ -1601,17 +1603,11 @@ static s32 e1000_write_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words,
|
|||
return -E1000_ERR_NVM;
|
||||
}
|
||||
|
||||
ret_val = e1000_acquire_swflag_ich8lan(hw);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
for (i = 0; i < words; i++) {
|
||||
dev_spec->shadow_ram[offset+i].modified = 1;
|
||||
dev_spec->shadow_ram[offset+i].value = data[i];
|
||||
}
|
||||
|
||||
e1000_release_swflag_ich8lan(hw);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1652,8 +1648,8 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw)
|
|||
*/
|
||||
ret_val = e1000_valid_nvm_bank_detect_ich8lan(hw, &bank);
|
||||
if (ret_val) {
|
||||
e1000_release_swflag_ich8lan(hw);
|
||||
goto out;
|
||||
hw_dbg(hw, "Could not detect valid bank, assuming bank 0\n");
|
||||
bank = 0;
|
||||
}
|
||||
|
||||
if (bank == 0) {
|
||||
|
|
@ -2039,12 +2035,8 @@ static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank)
|
|||
iteration = 1;
|
||||
break;
|
||||
case 2:
|
||||
if (hw->mac.type == e1000_ich9lan) {
|
||||
sector_size = ICH_FLASH_SEG_SIZE_8K;
|
||||
iteration = flash_bank_size / ICH_FLASH_SEG_SIZE_8K;
|
||||
} else {
|
||||
return -E1000_ERR_NVM;
|
||||
}
|
||||
sector_size = ICH_FLASH_SEG_SIZE_8K;
|
||||
iteration = 1;
|
||||
break;
|
||||
case 3:
|
||||
sector_size = ICH_FLASH_SEG_SIZE_64K;
|
||||
|
|
@ -2056,7 +2048,7 @@ static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank)
|
|||
|
||||
/* Start with the base address, then add the sector offset. */
|
||||
flash_linear_addr = hw->nvm.flash_base_addr;
|
||||
flash_linear_addr += (bank) ? (sector_size * iteration) : 0;
|
||||
flash_linear_addr += (bank) ? flash_bank_size : 0;
|
||||
|
||||
for (j = 0; j < iteration ; j++) {
|
||||
do {
|
||||
|
|
|
|||
|
|
@ -4538,8 +4538,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake)
|
|||
/* Allow time for pending master requests to run */
|
||||
e1000e_disable_pcie_master(&adapter->hw);
|
||||
|
||||
if ((adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) &&
|
||||
!(hw->mac.ops.check_mng_mode(hw))) {
|
||||
if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) {
|
||||
/* enable wakeup by the PHY */
|
||||
retval = e1000_init_phy_wakeup(adapter, wufc);
|
||||
if (retval)
|
||||
|
|
@ -4557,7 +4556,8 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake)
|
|||
*enable_wake = !!wufc;
|
||||
|
||||
/* make sure adapter isn't asleep if manageability is enabled */
|
||||
if (adapter->flags & FLAG_MNG_PT_ENABLED)
|
||||
if ((adapter->flags & FLAG_MNG_PT_ENABLED) ||
|
||||
(hw->mac.ops.check_mng_mode(hw)))
|
||||
*enable_wake = true;
|
||||
|
||||
if (adapter->hw.phy.type == e1000_phy_igp_3)
|
||||
|
|
@ -4670,14 +4670,6 @@ static int e1000_resume(struct pci_dev *pdev)
|
|||
return err;
|
||||
}
|
||||
|
||||
/* AER (Advanced Error Reporting) hooks */
|
||||
err = pci_enable_pcie_error_reporting(pdev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "pci_enable_pcie_error_reporting failed "
|
||||
"0x%x\n", err);
|
||||
/* non-fatal, continue */
|
||||
}
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
pci_enable_wake(pdev, PCI_D3hot, 0);
|
||||
|
|
@ -4990,6 +4982,14 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
|
|||
if (err)
|
||||
goto err_pci_reg;
|
||||
|
||||
/* AER (Advanced Error Reporting) hooks */
|
||||
err = pci_enable_pcie_error_reporting(pdev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "pci_enable_pcie_error_reporting failed "
|
||||
"0x%x\n", err);
|
||||
/* non-fatal, continue */
|
||||
}
|
||||
|
||||
pci_set_master(pdev);
|
||||
/* PCI config space info */
|
||||
err = pci_save_state(pdev);
|
||||
|
|
|
|||
|
|
@ -1474,13 +1474,13 @@ static void eexp_hw_init586(struct net_device *dev)
|
|||
outw(0x0000, ioaddr + 0x800c);
|
||||
outw(0x0000, ioaddr + 0x800e);
|
||||
|
||||
for (i = 0; i < (sizeof(start_code)); i+=32) {
|
||||
for (i = 0; i < ARRAY_SIZE(start_code) * 2; i+=32) {
|
||||
int j;
|
||||
outw(i, ioaddr + SM_PTR);
|
||||
for (j = 0; j < 16; j+=2)
|
||||
for (j = 0; j < 16 && (i+j)/2 < ARRAY_SIZE(start_code); j+=2)
|
||||
outw(start_code[(i+j)/2],
|
||||
ioaddr+0x4000+j);
|
||||
for (j = 0; j < 16; j+=2)
|
||||
for (j = 0; j < 16 && (i+j+16)/2 < ARRAY_SIZE(start_code); j+=2)
|
||||
outw(start_code[(i+j+16)/2],
|
||||
ioaddr+0x8000+j);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
#include <asm/io.h>
|
||||
|
||||
#define DRV_NAME "ehea"
|
||||
#define DRV_VERSION "EHEA_0101"
|
||||
#define DRV_VERSION "EHEA_0102"
|
||||
|
||||
/* eHEA capability flags */
|
||||
#define DLPAR_PORT_ADD_REM 1
|
||||
|
|
|
|||
|
|
@ -1545,6 +1545,9 @@ static int ehea_clean_portres(struct ehea_port *port, struct ehea_port_res *pr)
|
|||
{
|
||||
int ret, i;
|
||||
|
||||
if (pr->qp)
|
||||
netif_napi_del(&pr->napi);
|
||||
|
||||
ret = ehea_destroy_qp(pr->qp);
|
||||
|
||||
if (!ret) {
|
||||
|
|
|
|||
|
|
@ -285,6 +285,7 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
{
|
||||
struct fec_enet_private *fep = netdev_priv(dev);
|
||||
struct bufdesc *bdp;
|
||||
void *bufaddr;
|
||||
unsigned short status;
|
||||
unsigned long flags;
|
||||
|
||||
|
|
@ -312,7 +313,7 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
status &= ~BD_ENET_TX_STATS;
|
||||
|
||||
/* Set buffer length and buffer pointer */
|
||||
bdp->cbd_bufaddr = __pa(skb->data);
|
||||
bufaddr = skb->data;
|
||||
bdp->cbd_datlen = skb->len;
|
||||
|
||||
/*
|
||||
|
|
@ -320,11 +321,11 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
* 4-byte boundaries. Use bounce buffers to copy data
|
||||
* and get it aligned. Ugh.
|
||||
*/
|
||||
if (bdp->cbd_bufaddr & FEC_ALIGNMENT) {
|
||||
if (((unsigned long) bufaddr) & FEC_ALIGNMENT) {
|
||||
unsigned int index;
|
||||
index = bdp - fep->tx_bd_base;
|
||||
memcpy(fep->tx_bounce[index], (void *)skb->data, skb->len);
|
||||
bdp->cbd_bufaddr = __pa(fep->tx_bounce[index]);
|
||||
bufaddr = fep->tx_bounce[index];
|
||||
}
|
||||
|
||||
/* Save skb pointer */
|
||||
|
|
@ -336,7 +337,7 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
/* Push the data cache so the CPM does not get stale memory
|
||||
* data.
|
||||
*/
|
||||
bdp->cbd_bufaddr = dma_map_single(&dev->dev, skb->data,
|
||||
bdp->cbd_bufaddr = dma_map_single(&dev->dev, bufaddr,
|
||||
FEC_ENET_TX_FRSIZE, DMA_TO_DEVICE);
|
||||
|
||||
/* Send it on its way. Tell FEC it's ready, interrupt when done,
|
||||
|
|
|
|||
|
|
@ -309,6 +309,7 @@ static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
{
|
||||
struct mpc52xx_fec_priv *priv = netdev_priv(dev);
|
||||
struct bcom_fec_bd *bd;
|
||||
unsigned long flags;
|
||||
|
||||
if (bcom_queue_full(priv->tx_dmatsk)) {
|
||||
if (net_ratelimit())
|
||||
|
|
@ -316,7 +317,7 @@ static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
||||
spin_lock_irq(&priv->lock);
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
dev->trans_start = jiffies;
|
||||
|
||||
bd = (struct bcom_fec_bd *)
|
||||
|
|
@ -332,7 +333,7 @@ static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
netif_stop_queue(dev);
|
||||
}
|
||||
|
||||
spin_unlock_irq(&priv->lock);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -936,6 +936,7 @@ int startup_gfar(struct net_device *dev)
|
|||
struct gfar __iomem *regs = priv->regs;
|
||||
int err = 0;
|
||||
u32 rctrl = 0;
|
||||
u32 tctrl = 0;
|
||||
u32 attrs = 0;
|
||||
|
||||
gfar_write(®s->imask, IMASK_INIT_CLEAR);
|
||||
|
|
@ -1111,11 +1112,19 @@ int startup_gfar(struct net_device *dev)
|
|||
rctrl |= RCTRL_PADDING(priv->padding);
|
||||
}
|
||||
|
||||
/* keep vlan related bits if it's enabled */
|
||||
if (priv->vlgrp) {
|
||||
rctrl |= RCTRL_VLEX | RCTRL_PRSDEP_INIT;
|
||||
tctrl |= TCTRL_VLINS;
|
||||
}
|
||||
|
||||
/* Init rctrl based on our settings */
|
||||
gfar_write(&priv->regs->rctrl, rctrl);
|
||||
|
||||
if (dev->features & NETIF_F_IP_CSUM)
|
||||
gfar_write(&priv->regs->tctrl, TCTRL_INIT_CSUM);
|
||||
tctrl |= TCTRL_INIT_CSUM;
|
||||
|
||||
gfar_write(&priv->regs->tctrl, tctrl);
|
||||
|
||||
/* Set the extraction length and index */
|
||||
attrs = ATTRELI_EL(priv->rx_stash_size) |
|
||||
|
|
@ -1450,7 +1459,6 @@ static void gfar_vlan_rx_register(struct net_device *dev,
|
|||
|
||||
/* Enable VLAN tag extraction */
|
||||
tempval = gfar_read(&priv->regs->rctrl);
|
||||
tempval |= RCTRL_VLEX;
|
||||
tempval |= (RCTRL_VLEX | RCTRL_PRSDEP_INIT);
|
||||
gfar_write(&priv->regs->rctrl, tempval);
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -366,9 +366,8 @@ static int gfar_scoalesce(struct net_device *dev, struct ethtool_coalesce *cvals
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
priv->rxic = mk_ic_value(
|
||||
gfar_usecs2ticks(priv, cvals->rx_coalesce_usecs),
|
||||
cvals->rx_max_coalesced_frames);
|
||||
priv->rxic = mk_ic_value(cvals->rx_max_coalesced_frames,
|
||||
gfar_usecs2ticks(priv, cvals->rx_coalesce_usecs));
|
||||
|
||||
/* Set up tx coalescing */
|
||||
if ((cvals->tx_coalesce_usecs == 0) ||
|
||||
|
|
@ -390,9 +389,8 @@ static int gfar_scoalesce(struct net_device *dev, struct ethtool_coalesce *cvals
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
priv->txic = mk_ic_value(
|
||||
gfar_usecs2ticks(priv, cvals->tx_coalesce_usecs),
|
||||
cvals->tx_max_coalesced_frames);
|
||||
priv->txic = mk_ic_value(cvals->tx_max_coalesced_frames,
|
||||
gfar_usecs2ticks(priv, cvals->tx_coalesce_usecs));
|
||||
|
||||
gfar_write(&priv->regs->rxic, 0);
|
||||
if (priv->rxcoalescing)
|
||||
|
|
|
|||
|
|
@ -1305,6 +1305,8 @@ static int emac_close(struct net_device *ndev)
|
|||
|
||||
free_irq(dev->emac_irq, dev);
|
||||
|
||||
netif_carrier_off(ndev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -274,6 +274,8 @@ static s32 e1000_set_vfta_vf(struct e1000_hw *hw, u16 vid, bool set)
|
|||
|
||||
err = mbx->ops.read_posted(hw, msgbuf, 2);
|
||||
|
||||
msgbuf[0] &= ~E1000_VT_MSGTYPE_CTS;
|
||||
|
||||
/* if nacked the vlan was rejected */
|
||||
if (!err && (msgbuf[0] == (E1000_VF_SET_VLAN | E1000_VT_MSGTYPE_NACK)))
|
||||
err = -E1000_ERR_MAC_INIT;
|
||||
|
|
@ -317,6 +319,8 @@ static void e1000_rar_set_vf(struct e1000_hw *hw, u8 * addr, u32 index)
|
|||
if (!ret_val)
|
||||
ret_val = mbx->ops.read_posted(hw, msgbuf, 3);
|
||||
|
||||
msgbuf[0] &= ~E1000_VT_MSGTYPE_CTS;
|
||||
|
||||
/* if nacked the address was rejected, use "perm_addr" */
|
||||
if (!ret_val &&
|
||||
(msgbuf[0] == (E1000_VF_SET_MAC_ADDR | E1000_VT_MSGTYPE_NACK)))
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
|
@ -205,9 +204,6 @@ static const struct net_device_ops au1k_irda_netdev_ops = {
|
|||
.ndo_start_xmit = au1k_irda_hard_xmit,
|
||||
.ndo_tx_timeout = au1k_tx_timeout,
|
||||
.ndo_do_ioctl = au1k_irda_ioctl,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
};
|
||||
|
||||
static int au1k_irda_net_init(struct net_device *dev)
|
||||
|
|
|
|||
|
|
@ -803,9 +803,6 @@ static const struct net_device_ops pxa_irda_netdev_ops = {
|
|||
.ndo_stop = pxa_irda_stop,
|
||||
.ndo_start_xmit = pxa_irda_hard_xmit,
|
||||
.ndo_do_ioctl = pxa_irda_ioctl,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
};
|
||||
|
||||
static int pxa_irda_probe(struct platform_device *pdev)
|
||||
|
|
@ -830,6 +827,7 @@ static int pxa_irda_probe(struct platform_device *pdev)
|
|||
if (!dev)
|
||||
goto err_mem_3;
|
||||
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
si = netdev_priv(dev);
|
||||
si->dev = &pdev->dev;
|
||||
si->pdata = pdev->dev.platform_data;
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
|
@ -881,9 +880,6 @@ static const struct net_device_ops sa1100_irda_netdev_ops = {
|
|||
.ndo_stop = sa1100_irda_stop,
|
||||
.ndo_start_xmit = sa1100_irda_hard_xmit,
|
||||
.ndo_do_ioctl = sa1100_irda_ioctl,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
};
|
||||
|
||||
static int sa1100_irda_probe(struct platform_device *pdev)
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ static int __init w83977af_init(void)
|
|||
|
||||
IRDA_DEBUG(0, "%s()\n", __func__ );
|
||||
|
||||
for (i=0; (io[i] < 2000) && (i < ARRAY_SIZE(dev_self)); i++) {
|
||||
for (i=0; i < ARRAY_SIZE(dev_self) && io[i] < 2000; i++) {
|
||||
if (w83977af_open(i, io[i], irq[i], dma[i]) == 0)
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -96,6 +96,8 @@
|
|||
#define IXGBE_TX_FLAGS_VLAN_PRIO_MASK 0x0000e000
|
||||
#define IXGBE_TX_FLAGS_VLAN_SHIFT 16
|
||||
|
||||
#define IXGBE_MAX_RSC_INT_RATE 162760
|
||||
|
||||
/* wrapper around a pointer to a socket buffer,
|
||||
* so a DMA handle can be stored along with the buffer */
|
||||
struct ixgbe_tx_buffer {
|
||||
|
|
@ -134,6 +136,8 @@ struct ixgbe_ring {
|
|||
|
||||
u8 queue_index; /* needed for multiqueue queue management */
|
||||
|
||||
#define IXGBE_RING_RX_PS_ENABLED (u8)(1)
|
||||
u8 flags; /* per ring feature flags */
|
||||
u16 head;
|
||||
u16 tail;
|
||||
|
||||
|
|
|
|||
|
|
@ -49,6 +49,51 @@ static s32 ixgbe_setup_copper_link_speed_82598(struct ixgbe_hw *hw,
|
|||
static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
|
||||
u8 *eeprom_data);
|
||||
|
||||
/**
|
||||
* ixgbe_set_pcie_completion_timeout - set pci-e completion timeout
|
||||
* @hw: pointer to the HW structure
|
||||
*
|
||||
* The defaults for 82598 should be in the range of 50us to 50ms,
|
||||
* however the hardware default for these parts is 500us to 1ms which is less
|
||||
* than the 10ms recommended by the pci-e spec. To address this we need to
|
||||
* increase the value to either 10ms to 250ms for capability version 1 config,
|
||||
* or 16ms to 55ms for version 2.
|
||||
**/
|
||||
void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw)
|
||||
{
|
||||
struct ixgbe_adapter *adapter = hw->back;
|
||||
u32 gcr = IXGBE_READ_REG(hw, IXGBE_GCR);
|
||||
u16 pcie_devctl2;
|
||||
|
||||
/* only take action if timeout value is defaulted to 0 */
|
||||
if (gcr & IXGBE_GCR_CMPL_TMOUT_MASK)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* if capababilities version is type 1 we can write the
|
||||
* timeout of 10ms to 250ms through the GCR register
|
||||
*/
|
||||
if (!(gcr & IXGBE_GCR_CAP_VER2)) {
|
||||
gcr |= IXGBE_GCR_CMPL_TMOUT_10ms;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* for version 2 capabilities we need to write the config space
|
||||
* directly in order to set the completion timeout value for
|
||||
* 16ms to 55ms
|
||||
*/
|
||||
pci_read_config_word(adapter->pdev,
|
||||
IXGBE_PCI_DEVICE_CONTROL2, &pcie_devctl2);
|
||||
pcie_devctl2 |= IXGBE_PCI_DEVICE_CONTROL2_16ms;
|
||||
pci_write_config_word(adapter->pdev,
|
||||
IXGBE_PCI_DEVICE_CONTROL2, pcie_devctl2);
|
||||
out:
|
||||
/* disable completion timeout resend */
|
||||
gcr &= ~IXGBE_GCR_CMPL_TMOUT_RESEND;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_GCR, gcr);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_get_pcie_msix_count_82598 - Gets MSI-X vector count
|
||||
* @hw: pointer to hardware structure
|
||||
|
|
@ -152,6 +197,26 @@ out:
|
|||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_start_hw_82598 - Prepare hardware for Tx/Rx
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Starts the hardware using the generic start_hw function.
|
||||
* Then set pcie completion timeout
|
||||
**/
|
||||
s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 ret_val = 0;
|
||||
|
||||
ret_val = ixgbe_start_hw_generic(hw);
|
||||
|
||||
/* set the completion timeout for interface */
|
||||
if (ret_val == 0)
|
||||
ixgbe_set_pcie_completion_timeout(hw);
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_get_link_capabilities_82598 - Determines link capabilities
|
||||
* @hw: pointer to hardware structure
|
||||
|
|
@ -1085,7 +1150,7 @@ out:
|
|||
static struct ixgbe_mac_operations mac_ops_82598 = {
|
||||
.init_hw = &ixgbe_init_hw_generic,
|
||||
.reset_hw = &ixgbe_reset_hw_82598,
|
||||
.start_hw = &ixgbe_start_hw_generic,
|
||||
.start_hw = &ixgbe_start_hw_82598,
|
||||
.clear_hw_cntrs = &ixgbe_clear_hw_cntrs_generic,
|
||||
.get_media_type = &ixgbe_get_media_type_82598,
|
||||
.get_supported_physical_layer = &ixgbe_get_supported_physical_layer_82598,
|
||||
|
|
|
|||
|
|
@ -1948,6 +1948,7 @@ static int ixgbe_set_coalesce(struct net_device *netdev,
|
|||
struct ethtool_coalesce *ec)
|
||||
{
|
||||
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
||||
struct ixgbe_q_vector *q_vector;
|
||||
int i;
|
||||
|
||||
if (ec->tx_max_coalesced_frames_irq)
|
||||
|
|
@ -1975,18 +1976,31 @@ static int ixgbe_set_coalesce(struct net_device *netdev,
|
|||
* any other value means disable eitr, which is best
|
||||
* served by setting the interrupt rate very high
|
||||
*/
|
||||
adapter->eitr_param = IXGBE_MAX_INT_RATE;
|
||||
if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED)
|
||||
adapter->eitr_param = IXGBE_MAX_RSC_INT_RATE;
|
||||
else
|
||||
adapter->eitr_param = IXGBE_MAX_INT_RATE;
|
||||
adapter->itr_setting = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < adapter->num_msix_vectors - NON_Q_VECTORS; i++) {
|
||||
struct ixgbe_q_vector *q_vector = adapter->q_vector[i];
|
||||
if (q_vector->txr_count && !q_vector->rxr_count)
|
||||
/* tx vector gets half the rate */
|
||||
q_vector->eitr = (adapter->eitr_param >> 1);
|
||||
else
|
||||
/* rx only or mixed */
|
||||
q_vector->eitr = adapter->eitr_param;
|
||||
/* MSI/MSIx Interrupt Mode */
|
||||
if (adapter->flags &
|
||||
(IXGBE_FLAG_MSIX_ENABLED | IXGBE_FLAG_MSI_ENABLED)) {
|
||||
int num_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
|
||||
for (i = 0; i < num_vectors; i++) {
|
||||
q_vector = adapter->q_vector[i];
|
||||
if (q_vector->txr_count && !q_vector->rxr_count)
|
||||
/* tx vector gets half the rate */
|
||||
q_vector->eitr = (adapter->eitr_param >> 1);
|
||||
else
|
||||
/* rx only or mixed */
|
||||
q_vector->eitr = adapter->eitr_param;
|
||||
ixgbe_write_eitr(q_vector);
|
||||
}
|
||||
/* Legacy Interrupt Mode */
|
||||
} else {
|
||||
q_vector = adapter->q_vector[0];
|
||||
q_vector->eitr = adapter->eitr_param;
|
||||
ixgbe_write_eitr(q_vector);
|
||||
}
|
||||
|
||||
|
|
@ -1999,13 +2013,13 @@ static int ixgbe_set_flags(struct net_device *netdev, u32 data)
|
|||
|
||||
ethtool_op_set_flags(netdev, data);
|
||||
|
||||
if (!(adapter->flags & IXGBE_FLAG2_RSC_CAPABLE))
|
||||
if (!(adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE))
|
||||
return 0;
|
||||
|
||||
/* if state changes we need to update adapter->flags and reset */
|
||||
if ((!!(data & ETH_FLAG_LRO)) !=
|
||||
(!!(adapter->flags & IXGBE_FLAG2_RSC_ENABLED))) {
|
||||
adapter->flags ^= IXGBE_FLAG2_RSC_ENABLED;
|
||||
(!!(adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED))) {
|
||||
adapter->flags2 ^= IXGBE_FLAG2_RSC_ENABLED;
|
||||
if (netif_running(netdev))
|
||||
ixgbe_reinit_locked(adapter);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -336,7 +336,7 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
|
|||
/* return 0 to bypass going to ULD for DDPed data */
|
||||
if (fcstat == IXGBE_RXDADV_STAT_FCSTAT_DDP)
|
||||
rc = 0;
|
||||
else
|
||||
else if (ddp->len)
|
||||
rc = ddp->len;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -492,12 +492,12 @@ static void ixgbe_receive_skb(struct ixgbe_q_vector *q_vector,
|
|||
|
||||
skb_record_rx_queue(skb, ring->queue_index);
|
||||
if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL)) {
|
||||
if (adapter->vlgrp && is_vlan && (tag != 0))
|
||||
if (adapter->vlgrp && is_vlan && (tag & VLAN_VID_MASK))
|
||||
vlan_gro_receive(napi, adapter->vlgrp, tag, skb);
|
||||
else
|
||||
napi_gro_receive(napi, skb);
|
||||
} else {
|
||||
if (adapter->vlgrp && is_vlan && (tag != 0))
|
||||
if (adapter->vlgrp && is_vlan && (tag & VLAN_VID_MASK))
|
||||
vlan_hwaccel_rx(skb, adapter->vlgrp, tag);
|
||||
else
|
||||
netif_rx(skb);
|
||||
|
|
@ -585,7 +585,7 @@ static void ixgbe_alloc_rx_buffers(struct ixgbe_adapter *adapter,
|
|||
rx_desc = IXGBE_RX_DESC_ADV(*rx_ring, i);
|
||||
|
||||
if (!bi->page_dma &&
|
||||
(adapter->flags & IXGBE_FLAG_RX_PS_ENABLED)) {
|
||||
(rx_ring->flags & IXGBE_RING_RX_PS_ENABLED)) {
|
||||
if (!bi->page) {
|
||||
bi->page = alloc_page(GFP_ATOMIC);
|
||||
if (!bi->page) {
|
||||
|
|
@ -629,7 +629,7 @@ static void ixgbe_alloc_rx_buffers(struct ixgbe_adapter *adapter,
|
|||
}
|
||||
/* Refresh the desc even if buffer_addrs didn't change because
|
||||
* each write-back erases this info. */
|
||||
if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
|
||||
if (rx_ring->flags & IXGBE_RING_RX_PS_ENABLED) {
|
||||
rx_desc->read.pkt_addr = cpu_to_le64(bi->page_dma);
|
||||
rx_desc->read.hdr_addr = cpu_to_le64(bi->dma);
|
||||
} else {
|
||||
|
|
@ -726,7 +726,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||
break;
|
||||
(*work_done)++;
|
||||
|
||||
if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
|
||||
if (rx_ring->flags & IXGBE_RING_RX_PS_ENABLED) {
|
||||
hdr_info = le16_to_cpu(ixgbe_get_hdr_info(rx_desc));
|
||||
len = (hdr_info & IXGBE_RXDADV_HDRBUFLEN_MASK) >>
|
||||
IXGBE_RXDADV_HDRBUFLEN_SHIFT;
|
||||
|
|
@ -780,7 +780,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||
prefetch(next_rxd);
|
||||
cleaned_count++;
|
||||
|
||||
if (adapter->flags & IXGBE_FLAG2_RSC_CAPABLE)
|
||||
if (adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE)
|
||||
rsc_count = ixgbe_get_rsc_count(rx_desc);
|
||||
|
||||
if (rsc_count) {
|
||||
|
|
@ -798,7 +798,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||
rx_ring->stats.packets++;
|
||||
rx_ring->stats.bytes += skb->len;
|
||||
} else {
|
||||
if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
|
||||
if (rx_ring->flags & IXGBE_RING_RX_PS_ENABLED) {
|
||||
rx_buffer_info->skb = next_buffer->skb;
|
||||
rx_buffer_info->dma = next_buffer->dma;
|
||||
next_buffer->skb = skb;
|
||||
|
|
@ -1898,46 +1898,19 @@ static void ixgbe_configure_tx(struct ixgbe_adapter *adapter)
|
|||
|
||||
#define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2
|
||||
|
||||
static void ixgbe_configure_srrctl(struct ixgbe_adapter *adapter, int index)
|
||||
static void ixgbe_configure_srrctl(struct ixgbe_adapter *adapter,
|
||||
struct ixgbe_ring *rx_ring)
|
||||
{
|
||||
struct ixgbe_ring *rx_ring;
|
||||
u32 srrctl;
|
||||
int queue0 = 0;
|
||||
unsigned long mask;
|
||||
int index;
|
||||
struct ixgbe_ring_feature *feature = adapter->ring_feature;
|
||||
|
||||
if (adapter->hw.mac.type == ixgbe_mac_82599EB) {
|
||||
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
|
||||
int dcb_i = feature[RING_F_DCB].indices;
|
||||
if (dcb_i == 8)
|
||||
queue0 = index >> 4;
|
||||
else if (dcb_i == 4)
|
||||
queue0 = index >> 5;
|
||||
else
|
||||
dev_err(&adapter->pdev->dev, "Invalid DCB "
|
||||
"configuration\n");
|
||||
#ifdef IXGBE_FCOE
|
||||
if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) {
|
||||
struct ixgbe_ring_feature *f;
|
||||
|
||||
rx_ring = &adapter->rx_ring[queue0];
|
||||
f = &adapter->ring_feature[RING_F_FCOE];
|
||||
if ((queue0 == 0) && (index > rx_ring->reg_idx))
|
||||
queue0 = f->mask + index -
|
||||
rx_ring->reg_idx - 1;
|
||||
}
|
||||
#endif /* IXGBE_FCOE */
|
||||
} else {
|
||||
queue0 = index;
|
||||
}
|
||||
} else {
|
||||
index = rx_ring->reg_idx;
|
||||
if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
|
||||
unsigned long mask;
|
||||
mask = (unsigned long) feature[RING_F_RSS].mask;
|
||||
queue0 = index & mask;
|
||||
index = index & mask;
|
||||
}
|
||||
|
||||
rx_ring = &adapter->rx_ring[queue0];
|
||||
|
||||
srrctl = IXGBE_READ_REG(&adapter->hw, IXGBE_SRRCTL(index));
|
||||
|
||||
srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
|
||||
|
|
@ -1946,7 +1919,7 @@ static void ixgbe_configure_srrctl(struct ixgbe_adapter *adapter, int index)
|
|||
srrctl |= (IXGBE_RX_HDR_SIZE << IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) &
|
||||
IXGBE_SRRCTL_BSIZEHDR_MASK;
|
||||
|
||||
if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
|
||||
if (rx_ring->flags & IXGBE_RING_RX_PS_ENABLED) {
|
||||
#if (PAGE_SIZE / 2) > IXGBE_MAX_RXBUFFER
|
||||
srrctl |= IXGBE_MAX_RXBUFFER >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
|
||||
#else
|
||||
|
|
@ -2002,6 +1975,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
|
|||
{
|
||||
u64 rdba;
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
struct ixgbe_ring *rx_ring;
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
int max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
|
||||
int i, j;
|
||||
|
|
@ -2018,11 +1992,6 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
|
|||
/* Decide whether to use packet split mode or not */
|
||||
adapter->flags |= IXGBE_FLAG_RX_PS_ENABLED;
|
||||
|
||||
#ifdef IXGBE_FCOE
|
||||
if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED)
|
||||
adapter->flags &= ~IXGBE_FLAG_RX_PS_ENABLED;
|
||||
#endif /* IXGBE_FCOE */
|
||||
|
||||
/* Set the RX buffer length according to the mode */
|
||||
if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
|
||||
rx_buf_len = IXGBE_RX_HDR_SIZE;
|
||||
|
|
@ -2036,7 +2005,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
|
|||
IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype);
|
||||
}
|
||||
} else {
|
||||
if (!(adapter->flags & IXGBE_FLAG2_RSC_ENABLED) &&
|
||||
if (!(adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) &&
|
||||
(netdev->mtu <= ETH_DATA_LEN))
|
||||
rx_buf_len = MAXIMUM_ETHERNET_VLAN_SIZE;
|
||||
else
|
||||
|
|
@ -2070,29 +2039,35 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
|
|||
* the Base and Length of the Rx Descriptor Ring
|
||||
*/
|
||||
for (i = 0; i < adapter->num_rx_queues; i++) {
|
||||
rdba = adapter->rx_ring[i].dma;
|
||||
j = adapter->rx_ring[i].reg_idx;
|
||||
rx_ring = &adapter->rx_ring[i];
|
||||
rdba = rx_ring->dma;
|
||||
j = rx_ring->reg_idx;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RDBAL(j), (rdba & DMA_BIT_MASK(32)));
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RDBAH(j), (rdba >> 32));
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RDLEN(j), rdlen);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RDH(j), 0);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RDT(j), 0);
|
||||
adapter->rx_ring[i].head = IXGBE_RDH(j);
|
||||
adapter->rx_ring[i].tail = IXGBE_RDT(j);
|
||||
adapter->rx_ring[i].rx_buf_len = rx_buf_len;
|
||||
rx_ring->head = IXGBE_RDH(j);
|
||||
rx_ring->tail = IXGBE_RDT(j);
|
||||
rx_ring->rx_buf_len = rx_buf_len;
|
||||
|
||||
if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED)
|
||||
rx_ring->flags |= IXGBE_RING_RX_PS_ENABLED;
|
||||
|
||||
#ifdef IXGBE_FCOE
|
||||
if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) {
|
||||
struct ixgbe_ring_feature *f;
|
||||
f = &adapter->ring_feature[RING_F_FCOE];
|
||||
if ((rx_buf_len < IXGBE_FCOE_JUMBO_FRAME_SIZE) &&
|
||||
(i >= f->mask) && (i < f->mask + f->indices))
|
||||
adapter->rx_ring[i].rx_buf_len =
|
||||
IXGBE_FCOE_JUMBO_FRAME_SIZE;
|
||||
if ((i >= f->mask) && (i < f->mask + f->indices)) {
|
||||
rx_ring->flags &= ~IXGBE_RING_RX_PS_ENABLED;
|
||||
if (rx_buf_len < IXGBE_FCOE_JUMBO_FRAME_SIZE)
|
||||
rx_ring->rx_buf_len =
|
||||
IXGBE_FCOE_JUMBO_FRAME_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* IXGBE_FCOE */
|
||||
ixgbe_configure_srrctl(adapter, j);
|
||||
ixgbe_configure_srrctl(adapter, rx_ring);
|
||||
}
|
||||
|
||||
if (hw->mac.type == ixgbe_mac_82598EB) {
|
||||
|
|
@ -2165,10 +2140,11 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
|
|||
IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl);
|
||||
}
|
||||
|
||||
if (adapter->flags & IXGBE_FLAG2_RSC_ENABLED) {
|
||||
if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) {
|
||||
/* Enable 82599 HW-RSC */
|
||||
for (i = 0; i < adapter->num_rx_queues; i++) {
|
||||
j = adapter->rx_ring[i].reg_idx;
|
||||
rx_ring = &adapter->rx_ring[i];
|
||||
j = rx_ring->reg_idx;
|
||||
rscctrl = IXGBE_READ_REG(hw, IXGBE_RSCCTL(j));
|
||||
rscctrl |= IXGBE_RSCCTL_RSCEN;
|
||||
/*
|
||||
|
|
@ -2176,7 +2152,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
|
|||
* total size of max desc * buf_len is not greater
|
||||
* than 65535
|
||||
*/
|
||||
if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
|
||||
if (rx_ring->flags & IXGBE_RING_RX_PS_ENABLED) {
|
||||
#if (MAX_SKB_FRAGS > 16)
|
||||
rscctrl |= IXGBE_RSCCTL_MAXDESC_16;
|
||||
#elif (MAX_SKB_FRAGS > 8)
|
||||
|
|
@ -3812,8 +3788,8 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
|
|||
adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82598;
|
||||
} else if (hw->mac.type == ixgbe_mac_82599EB) {
|
||||
adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82599;
|
||||
adapter->flags |= IXGBE_FLAG2_RSC_CAPABLE;
|
||||
adapter->flags |= IXGBE_FLAG2_RSC_ENABLED;
|
||||
adapter->flags2 |= IXGBE_FLAG2_RSC_CAPABLE;
|
||||
adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED;
|
||||
adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
|
||||
adapter->ring_feature[RING_F_FDIR].indices =
|
||||
IXGBE_MAX_FDIR_INDICES;
|
||||
|
|
@ -5360,12 +5336,19 @@ static int ixgbe_del_sanmac_netdev(struct net_device *dev)
|
|||
static void ixgbe_netpoll(struct net_device *netdev)
|
||||
{
|
||||
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
||||
int i;
|
||||
|
||||
disable_irq(adapter->pdev->irq);
|
||||
adapter->flags |= IXGBE_FLAG_IN_NETPOLL;
|
||||
ixgbe_intr(adapter->pdev->irq, netdev);
|
||||
if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
|
||||
int num_q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
|
||||
for (i = 0; i < num_q_vectors; i++) {
|
||||
struct ixgbe_q_vector *q_vector = adapter->q_vector[i];
|
||||
ixgbe_msix_clean_many(0, q_vector);
|
||||
}
|
||||
} else {
|
||||
ixgbe_intr(adapter->pdev->irq, netdev);
|
||||
}
|
||||
adapter->flags &= ~IXGBE_FLAG_IN_NETPOLL;
|
||||
enable_irq(adapter->pdev->irq);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -5611,7 +5594,7 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
|
|||
if (pci_using_dac)
|
||||
netdev->features |= NETIF_F_HIGHDMA;
|
||||
|
||||
if (adapter->flags & IXGBE_FLAG2_RSC_ENABLED)
|
||||
if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED)
|
||||
netdev->features |= NETIF_F_LRO;
|
||||
|
||||
/* make sure the EEPROM is good */
|
||||
|
|
|
|||
|
|
@ -718,6 +718,12 @@
|
|||
#define IXGBE_ECC_STATUS_82599 0x110E0
|
||||
#define IXGBE_BAR_CTRL_82599 0x110F4
|
||||
|
||||
/* PCI Express Control */
|
||||
#define IXGBE_GCR_CMPL_TMOUT_MASK 0x0000F000
|
||||
#define IXGBE_GCR_CMPL_TMOUT_10ms 0x00001000
|
||||
#define IXGBE_GCR_CMPL_TMOUT_RESEND 0x00010000
|
||||
#define IXGBE_GCR_CAP_VER2 0x00040000
|
||||
|
||||
/* Time Sync Registers */
|
||||
#define IXGBE_TSYNCRXCTL 0x05188 /* Rx Time Sync Control register - RW */
|
||||
#define IXGBE_TSYNCTXCTL 0x08C00 /* Tx Time Sync Control register - RW */
|
||||
|
|
@ -1521,6 +1527,7 @@
|
|||
|
||||
/* PCI Bus Info */
|
||||
#define IXGBE_PCI_LINK_STATUS 0xB2
|
||||
#define IXGBE_PCI_DEVICE_CONTROL2 0xC8
|
||||
#define IXGBE_PCI_LINK_WIDTH 0x3F0
|
||||
#define IXGBE_PCI_LINK_WIDTH_1 0x10
|
||||
#define IXGBE_PCI_LINK_WIDTH_2 0x20
|
||||
|
|
@ -1531,6 +1538,7 @@
|
|||
#define IXGBE_PCI_LINK_SPEED_5000 0x2
|
||||
#define IXGBE_PCI_HEADER_TYPE_REGISTER 0x0E
|
||||
#define IXGBE_PCI_HEADER_TYPE_MULTIFUNC 0x80
|
||||
#define IXGBE_PCI_DEVICE_CONTROL2_16ms 0x0005
|
||||
|
||||
/* Number of 100 microseconds we wait for PCI Express master disable */
|
||||
#define IXGBE_PCI_MASTER_DISABLE_TIMEOUT 800
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ static int ixpdev_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
struct ixpdev_priv *ip = netdev_priv(dev);
|
||||
struct ixpdev_tx_desc *desc;
|
||||
int entry;
|
||||
unsigned long flags;
|
||||
|
||||
if (unlikely(skb->len > PAGE_SIZE)) {
|
||||
/* @@@ Count drops. */
|
||||
|
|
@ -63,11 +64,11 @@ static int ixpdev_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
dev->trans_start = jiffies;
|
||||
|
||||
local_irq_disable();
|
||||
local_irq_save(flags);
|
||||
ip->tx_queue_entries++;
|
||||
if (ip->tx_queue_entries == TX_BUF_COUNT_PER_CHAN)
|
||||
netif_stop_queue(dev);
|
||||
local_irq_enable();
|
||||
local_irq_restore(flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -620,6 +620,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
dma_addr_t mapping;
|
||||
unsigned int len, entry;
|
||||
u32 ctrl;
|
||||
unsigned long flags;
|
||||
|
||||
#ifdef DEBUG
|
||||
int i;
|
||||
|
|
@ -635,12 +636,12 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
#endif
|
||||
|
||||
len = skb->len;
|
||||
spin_lock_irq(&bp->lock);
|
||||
spin_lock_irqsave(&bp->lock, flags);
|
||||
|
||||
/* This is a hard error, log it. */
|
||||
if (TX_BUFFS_AVAIL(bp) < 1) {
|
||||
netif_stop_queue(dev);
|
||||
spin_unlock_irq(&bp->lock);
|
||||
spin_unlock_irqrestore(&bp->lock, flags);
|
||||
dev_err(&bp->pdev->dev,
|
||||
"BUG! Tx Ring full when queue awake!\n");
|
||||
dev_dbg(&bp->pdev->dev, "tx_head = %u, tx_tail = %u\n",
|
||||
|
|
@ -674,7 +675,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
if (TX_BUFFS_AVAIL(bp) < 1)
|
||||
netif_stop_queue(dev);
|
||||
|
||||
spin_unlock_irq(&bp->lock);
|
||||
spin_unlock_irqrestore(&bp->lock, flags);
|
||||
|
||||
dev->trans_start = jiffies;
|
||||
|
||||
|
|
|
|||
|
|
@ -506,8 +506,9 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
|
|||
PCI_DMA_FROMDEVICE);
|
||||
}
|
||||
/* Adjust size of last fragment to match actual length */
|
||||
skb_frags_rx[nr - 1].size = length -
|
||||
priv->frag_info[nr - 1].frag_prefix_size;
|
||||
if (nr > 0)
|
||||
skb_frags_rx[nr - 1].size = length -
|
||||
priv->frag_info[nr - 1].frag_prefix_size;
|
||||
return nr;
|
||||
|
||||
fail:
|
||||
|
|
|
|||
|
|
@ -249,6 +249,7 @@ static u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv,
|
|||
pci_unmap_page(mdev->pdev,
|
||||
(dma_addr_t) be64_to_cpu(data->addr),
|
||||
frag->size, PCI_DMA_TODEVICE);
|
||||
++data;
|
||||
}
|
||||
}
|
||||
/* Stamp the freed descriptor */
|
||||
|
|
@ -436,6 +437,7 @@ static inline void mlx4_en_xmit_poll(struct mlx4_en_priv *priv, int tx_ind)
|
|||
{
|
||||
struct mlx4_en_cq *cq = &priv->tx_cq[tx_ind];
|
||||
struct mlx4_en_tx_ring *ring = &priv->tx_ring[tx_ind];
|
||||
unsigned long flags;
|
||||
|
||||
/* If we don't have a pending timer, set one up to catch our recent
|
||||
post in case the interface becomes idle */
|
||||
|
|
@ -444,9 +446,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_irq(&ring->comp_lock)) {
|
||||
if (spin_trylock_irqsave(&ring->comp_lock, flags)) {
|
||||
mlx4_en_process_tx_cq(priv->dev, cq);
|
||||
spin_unlock_irq(&ring->comp_lock);
|
||||
spin_unlock_irqrestore(&ring->comp_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1254,7 +1254,7 @@ struct netxen_adapter {
|
|||
u8 mc_enabled;
|
||||
u8 max_mc_count;
|
||||
u8 rss_supported;
|
||||
u8 resv2;
|
||||
u8 link_changed;
|
||||
u32 resv3;
|
||||
|
||||
u8 has_link_events;
|
||||
|
|
|
|||
|
|
@ -184,13 +184,6 @@ void netxen_free_sw_resources(struct netxen_adapter *adapter)
|
|||
kfree(recv_ctx->rds_rings);
|
||||
|
||||
skip_rds:
|
||||
if (recv_ctx->sds_rings == NULL)
|
||||
goto skip_sds;
|
||||
|
||||
for(ring = 0; ring < adapter->max_sds_rings; ring++)
|
||||
recv_ctx->sds_rings[ring].consumer = 0;
|
||||
|
||||
skip_sds:
|
||||
if (adapter->tx_ring == NULL)
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -94,10 +94,6 @@ static struct pci_device_id netxen_pci_tbl[] __devinitdata = {
|
|||
|
||||
MODULE_DEVICE_TABLE(pci, netxen_pci_tbl);
|
||||
|
||||
static struct workqueue_struct *netxen_workq;
|
||||
#define SCHEDULE_WORK(tp) queue_work(netxen_workq, tp)
|
||||
#define FLUSH_SCHEDULED_WORK() flush_workqueue(netxen_workq)
|
||||
|
||||
static void netxen_watchdog(unsigned long);
|
||||
|
||||
static uint32_t crb_cmd_producer[4] = {
|
||||
|
|
@ -171,6 +167,8 @@ netxen_free_sds_rings(struct netxen_recv_context *recv_ctx)
|
|||
{
|
||||
if (recv_ctx->sds_rings != NULL)
|
||||
kfree(recv_ctx->sds_rings);
|
||||
|
||||
recv_ctx->sds_rings = NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -192,6 +190,21 @@ netxen_napi_add(struct netxen_adapter *adapter, struct net_device *netdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
netxen_napi_del(struct netxen_adapter *adapter)
|
||||
{
|
||||
int ring;
|
||||
struct nx_host_sds_ring *sds_ring;
|
||||
struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
|
||||
|
||||
for (ring = 0; ring < adapter->max_sds_rings; ring++) {
|
||||
sds_ring = &recv_ctx->sds_rings[ring];
|
||||
netif_napi_del(&sds_ring->napi);
|
||||
}
|
||||
|
||||
netxen_free_sds_rings(&adapter->recv_ctx);
|
||||
}
|
||||
|
||||
static void
|
||||
netxen_napi_enable(struct netxen_adapter *adapter)
|
||||
{
|
||||
|
|
@ -221,7 +234,7 @@ netxen_napi_disable(struct netxen_adapter *adapter)
|
|||
}
|
||||
}
|
||||
|
||||
static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id)
|
||||
static int nx_set_dma_mask(struct netxen_adapter *adapter)
|
||||
{
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
uint64_t mask, cmask;
|
||||
|
|
@ -229,19 +242,17 @@ static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id)
|
|||
adapter->pci_using_dac = 0;
|
||||
|
||||
mask = DMA_BIT_MASK(32);
|
||||
/*
|
||||
* Consistent DMA mask is set to 32 bit because it cannot be set to
|
||||
* 35 bits. For P3 also leave it at 32 bits for now. Only the rings
|
||||
* come off this pool.
|
||||
*/
|
||||
cmask = DMA_BIT_MASK(32);
|
||||
|
||||
if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
|
||||
#ifndef CONFIG_IA64
|
||||
if (revision_id >= NX_P3_B0)
|
||||
mask = DMA_BIT_MASK(39);
|
||||
else if (revision_id == NX_P2_C1)
|
||||
mask = DMA_BIT_MASK(35);
|
||||
#endif
|
||||
} else {
|
||||
mask = DMA_BIT_MASK(39);
|
||||
cmask = mask;
|
||||
}
|
||||
|
||||
if (pci_set_dma_mask(pdev, mask) == 0 &&
|
||||
pci_set_consistent_dma_mask(pdev, cmask) == 0) {
|
||||
adapter->pci_using_dac = 1;
|
||||
|
|
@ -256,13 +267,13 @@ static int
|
|||
nx_update_dma_mask(struct netxen_adapter *adapter)
|
||||
{
|
||||
int change, shift, err;
|
||||
uint64_t mask, old_mask;
|
||||
uint64_t mask, old_mask, old_cmask;
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
|
||||
change = 0;
|
||||
|
||||
shift = NXRD32(adapter, CRB_DMA_SHIFT);
|
||||
if (shift >= 32)
|
||||
if (shift > 32)
|
||||
return 0;
|
||||
|
||||
if (NX_IS_REVISION_P3(adapter->ahw.revision_id) && (shift > 9))
|
||||
|
|
@ -272,14 +283,29 @@ nx_update_dma_mask(struct netxen_adapter *adapter)
|
|||
|
||||
if (change) {
|
||||
old_mask = pdev->dma_mask;
|
||||
mask = (1ULL<<(32+shift)) - 1;
|
||||
old_cmask = pdev->dev.coherent_dma_mask;
|
||||
|
||||
mask = DMA_BIT_MASK(32+shift);
|
||||
|
||||
err = pci_set_dma_mask(pdev, mask);
|
||||
if (err)
|
||||
return pci_set_dma_mask(pdev, old_mask);
|
||||
goto err_out;
|
||||
|
||||
if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
|
||||
|
||||
err = pci_set_consistent_dma_mask(pdev, mask);
|
||||
if (err)
|
||||
goto err_out;
|
||||
}
|
||||
dev_info(&pdev->dev, "using %d-bit dma mask\n", 32+shift);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
pci_set_dma_mask(pdev, old_mask);
|
||||
pci_set_consistent_dma_mask(pdev, old_cmask);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void netxen_check_options(struct netxen_adapter *adapter)
|
||||
|
|
@ -867,7 +893,6 @@ netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev)
|
|||
spin_unlock(&adapter->tx_clean_lock);
|
||||
|
||||
del_timer_sync(&adapter->watchdog_timer);
|
||||
FLUSH_SCHEDULED_WORK();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -881,10 +906,12 @@ netxen_nic_attach(struct netxen_adapter *adapter)
|
|||
struct nx_host_tx_ring *tx_ring;
|
||||
|
||||
err = netxen_init_firmware(adapter);
|
||||
if (err != 0) {
|
||||
printk(KERN_ERR "Failed to init firmware\n");
|
||||
return -EIO;
|
||||
}
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = netxen_napi_add(adapter, netdev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (adapter->fw_major < 4)
|
||||
adapter->max_rds_rings = 3;
|
||||
|
|
@ -948,6 +975,7 @@ netxen_nic_detach(struct netxen_adapter *adapter)
|
|||
netxen_free_hw_resources(adapter);
|
||||
netxen_release_rx_buffers(adapter);
|
||||
netxen_nic_free_irq(adapter);
|
||||
netxen_napi_del(adapter);
|
||||
netxen_free_sw_resources(adapter);
|
||||
|
||||
adapter->is_up = 0;
|
||||
|
|
@ -1006,7 +1034,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
revision_id = pdev->revision;
|
||||
adapter->ahw.revision_id = revision_id;
|
||||
|
||||
err = nx_set_dma_mask(adapter, revision_id);
|
||||
err = nx_set_dma_mask(adapter);
|
||||
if (err)
|
||||
goto err_out_free_netdev;
|
||||
|
||||
|
|
@ -1092,9 +1120,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
|
||||
netdev->irq = adapter->msix_entries[0].vector;
|
||||
|
||||
if (netxen_napi_add(adapter, netdev))
|
||||
goto err_out_disable_msi;
|
||||
|
||||
init_timer(&adapter->watchdog_timer);
|
||||
adapter->watchdog_timer.function = &netxen_watchdog;
|
||||
adapter->watchdog_timer.data = (unsigned long)adapter;
|
||||
|
|
@ -1164,6 +1189,9 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
|
|||
|
||||
unregister_netdev(netdev);
|
||||
|
||||
cancel_work_sync(&adapter->watchdog_task);
|
||||
cancel_work_sync(&adapter->tx_timeout_task);
|
||||
|
||||
if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) {
|
||||
netxen_nic_detach(adapter);
|
||||
}
|
||||
|
|
@ -1172,7 +1200,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
|
|||
netxen_free_adapter_offload(adapter);
|
||||
|
||||
netxen_teardown_intr(adapter);
|
||||
netxen_free_sds_rings(&adapter->recv_ctx);
|
||||
|
||||
netxen_cleanup_pci_map(adapter);
|
||||
|
||||
|
|
@ -1198,6 +1225,9 @@ netxen_nic_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||
if (netif_running(netdev))
|
||||
netxen_nic_down(adapter, netdev);
|
||||
|
||||
cancel_work_sync(&adapter->watchdog_task);
|
||||
cancel_work_sync(&adapter->tx_timeout_task);
|
||||
|
||||
if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC)
|
||||
netxen_nic_detach(adapter);
|
||||
|
||||
|
|
@ -1536,11 +1566,6 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter)
|
|||
"%s: Device temperature %d degrees C exceeds"
|
||||
" maximum allowed. Hardware has been shut down.\n",
|
||||
netdev->name, temp_val);
|
||||
|
||||
netif_device_detach(netdev);
|
||||
netxen_nic_down(adapter, netdev);
|
||||
netxen_nic_detach(adapter);
|
||||
|
||||
rv = 1;
|
||||
} else if (temp_state == NX_TEMP_WARN) {
|
||||
if (adapter->temp == NX_TEMP_NORMAL) {
|
||||
|
|
@ -1574,10 +1599,7 @@ void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup)
|
|||
netif_carrier_off(netdev);
|
||||
netif_stop_queue(netdev);
|
||||
}
|
||||
|
||||
if (!adapter->has_link_events)
|
||||
netxen_nic_set_link_parameters(adapter);
|
||||
|
||||
adapter->link_changed = !adapter->has_link_events;
|
||||
} else if (!adapter->ahw.linkup && linkup) {
|
||||
printk(KERN_INFO "%s: %s NIC Link is up\n",
|
||||
netxen_nic_driver_name, netdev->name);
|
||||
|
|
@ -1586,9 +1608,7 @@ void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup)
|
|||
netif_carrier_on(netdev);
|
||||
netif_wake_queue(netdev);
|
||||
}
|
||||
|
||||
if (!adapter->has_link_events)
|
||||
netxen_nic_set_link_parameters(adapter);
|
||||
adapter->link_changed = !adapter->has_link_events;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1615,11 +1635,36 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter)
|
|||
netxen_advert_link_change(adapter, linkup);
|
||||
}
|
||||
|
||||
static void netxen_nic_thermal_shutdown(struct netxen_adapter *adapter)
|
||||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
|
||||
netif_device_detach(netdev);
|
||||
netxen_nic_down(adapter, netdev);
|
||||
netxen_nic_detach(adapter);
|
||||
}
|
||||
|
||||
static void netxen_watchdog(unsigned long v)
|
||||
{
|
||||
struct netxen_adapter *adapter = (struct netxen_adapter *)v;
|
||||
|
||||
SCHEDULE_WORK(&adapter->watchdog_task);
|
||||
if (netxen_nic_check_temp(adapter))
|
||||
goto do_sched;
|
||||
|
||||
if (!adapter->has_link_events) {
|
||||
netxen_nic_handle_phy_intr(adapter);
|
||||
|
||||
if (adapter->link_changed)
|
||||
goto do_sched;
|
||||
}
|
||||
|
||||
if (netif_running(adapter->netdev))
|
||||
mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ);
|
||||
|
||||
return;
|
||||
|
||||
do_sched:
|
||||
schedule_work(&adapter->watchdog_task);
|
||||
}
|
||||
|
||||
void netxen_watchdog_task(struct work_struct *work)
|
||||
|
|
@ -1627,11 +1672,13 @@ void netxen_watchdog_task(struct work_struct *work)
|
|||
struct netxen_adapter *adapter =
|
||||
container_of(work, struct netxen_adapter, watchdog_task);
|
||||
|
||||
if (netxen_nic_check_temp(adapter))
|
||||
if (adapter->temp == NX_TEMP_PANIC) {
|
||||
netxen_nic_thermal_shutdown(adapter);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!adapter->has_link_events)
|
||||
netxen_nic_handle_phy_intr(adapter);
|
||||
if (adapter->link_changed)
|
||||
netxen_nic_set_link_parameters(adapter);
|
||||
|
||||
if (netif_running(adapter->netdev))
|
||||
mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ);
|
||||
|
|
@ -1639,9 +1686,8 @@ void netxen_watchdog_task(struct work_struct *work)
|
|||
|
||||
static void netxen_tx_timeout(struct net_device *netdev)
|
||||
{
|
||||
struct netxen_adapter *adapter = (struct netxen_adapter *)
|
||||
netdev_priv(netdev);
|
||||
SCHEDULE_WORK(&adapter->tx_timeout_task);
|
||||
struct netxen_adapter *adapter = netdev_priv(netdev);
|
||||
schedule_work(&adapter->tx_timeout_task);
|
||||
}
|
||||
|
||||
static void netxen_tx_timeout_task(struct work_struct *work)
|
||||
|
|
@ -1798,9 +1844,6 @@ static int __init netxen_init_module(void)
|
|||
{
|
||||
printk(KERN_INFO "%s\n", netxen_nic_driver_string);
|
||||
|
||||
if ((netxen_workq = create_singlethread_workqueue("netxen")) == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
return pci_register_driver(&netxen_driver);
|
||||
}
|
||||
|
||||
|
|
@ -1809,7 +1852,6 @@ module_init(netxen_init_module);
|
|||
static void __exit netxen_exit_module(void)
|
||||
{
|
||||
pci_unregister_driver(&netxen_driver);
|
||||
destroy_workqueue(netxen_workq);
|
||||
}
|
||||
|
||||
module_exit(netxen_exit_module);
|
||||
|
|
|
|||
|
|
@ -1611,8 +1611,11 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
|
|||
if (pcnet32_dwio_read_csr(ioaddr, 0) == 4
|
||||
&& pcnet32_dwio_check(ioaddr)) {
|
||||
a = &pcnet32_dwio;
|
||||
} else
|
||||
} else {
|
||||
if (pcnet32_debug & NETIF_MSG_PROBE)
|
||||
printk(KERN_ERR PFX "No access methods\n");
|
||||
goto err_release_region;
|
||||
}
|
||||
}
|
||||
|
||||
chip_version =
|
||||
|
|
@ -1719,7 +1722,9 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
|
|||
ret = -ENOMEM;
|
||||
goto err_release_region;
|
||||
}
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
|
||||
if (pdev)
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
|
||||
if (pcnet32_debug & NETIF_MSG_PROBE)
|
||||
printk(KERN_INFO PFX "%s at %#3lx,", chipname, ioaddr);
|
||||
|
|
@ -1818,7 +1823,6 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
|
|||
|
||||
spin_lock_init(&lp->lock);
|
||||
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
lp->name = chipname;
|
||||
lp->shared_irq = shared;
|
||||
lp->tx_ring_size = TX_RING_SIZE; /* default tx ring size */
|
||||
|
|
@ -1835,7 +1839,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
|
|||
lp->chip_version = chip_version;
|
||||
lp->msg_enable = pcnet32_debug;
|
||||
if ((cards_found >= MAX_UNITS)
|
||||
|| (options[cards_found] > sizeof(options_mapping)))
|
||||
|| (options[cards_found] >= sizeof(options_mapping)))
|
||||
lp->options = PCNET32_PORT_ASEL;
|
||||
else
|
||||
lp->options = options_mapping[options[cards_found]];
|
||||
|
|
@ -1852,12 +1856,6 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
|
|||
((cards_found >= MAX_UNITS) || full_duplex[cards_found]))
|
||||
lp->options |= PCNET32_PORT_FD;
|
||||
|
||||
if (!a) {
|
||||
if (pcnet32_debug & NETIF_MSG_PROBE)
|
||||
printk(KERN_ERR PFX "No access methods\n");
|
||||
ret = -ENODEV;
|
||||
goto err_free_consistent;
|
||||
}
|
||||
lp->a = *a;
|
||||
|
||||
/* prior to register_netdev, dev->name is not yet correct */
|
||||
|
|
@ -1973,14 +1971,13 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
|
|||
|
||||
return 0;
|
||||
|
||||
err_free_ring:
|
||||
err_free_ring:
|
||||
pcnet32_free_ring(dev);
|
||||
err_free_consistent:
|
||||
pci_free_consistent(lp->pci_dev, sizeof(*lp->init_block),
|
||||
lp->init_block, lp->init_dma_addr);
|
||||
err_free_netdev:
|
||||
err_free_netdev:
|
||||
free_netdev(dev);
|
||||
err_release_region:
|
||||
err_release_region:
|
||||
release_region(ioaddr, PCNET32_TOTAL_SIZE);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -2089,6 +2086,7 @@ static void pcnet32_free_ring(struct net_device *dev)
|
|||
static int pcnet32_open(struct net_device *dev)
|
||||
{
|
||||
struct pcnet32_private *lp = netdev_priv(dev);
|
||||
struct pci_dev *pdev = lp->pci_dev;
|
||||
unsigned long ioaddr = dev->base_addr;
|
||||
u16 val;
|
||||
int i;
|
||||
|
|
@ -2149,9 +2147,9 @@ static int pcnet32_open(struct net_device *dev)
|
|||
lp->a.write_csr(ioaddr, 124, val);
|
||||
|
||||
/* Allied Telesyn AT 2700/2701 FX are 100Mbit only and do not negotiate */
|
||||
if (lp->pci_dev->subsystem_vendor == PCI_VENDOR_ID_AT &&
|
||||
(lp->pci_dev->subsystem_device == PCI_SUBDEVICE_ID_AT_2700FX ||
|
||||
lp->pci_dev->subsystem_device == PCI_SUBDEVICE_ID_AT_2701FX)) {
|
||||
if (pdev && pdev->subsystem_vendor == PCI_VENDOR_ID_AT &&
|
||||
(pdev->subsystem_device == PCI_SUBDEVICE_ID_AT_2700FX ||
|
||||
pdev->subsystem_device == PCI_SUBDEVICE_ID_AT_2701FX)) {
|
||||
if (lp->options & PCNET32_PORT_ASEL) {
|
||||
lp->options = PCNET32_PORT_FD | PCNET32_PORT_100;
|
||||
if (netif_msg_link(lp))
|
||||
|
|
|
|||
|
|
@ -1384,7 +1384,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
|
|||
|
||||
/* create a fragment for each channel */
|
||||
bits = B;
|
||||
while (nfree > 0 && len > 0) {
|
||||
while (len > 0) {
|
||||
list = list->next;
|
||||
if (list == &ppp->channels) {
|
||||
i = 0;
|
||||
|
|
@ -1431,29 +1431,31 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
|
|||
*otherwise divide it according to the speed
|
||||
*of the channel we are going to transmit on
|
||||
*/
|
||||
if (pch->speed == 0) {
|
||||
flen = totlen/nfree ;
|
||||
if (nbigger > 0) {
|
||||
flen++;
|
||||
nbigger--;
|
||||
}
|
||||
} else {
|
||||
flen = (((totfree - nzero)*(totlen + hdrlen*totfree)) /
|
||||
((totspeed*totfree)/pch->speed)) - hdrlen;
|
||||
if (nbigger > 0) {
|
||||
flen += ((totfree - nzero)*pch->speed)/totspeed;
|
||||
nbigger -= ((totfree - nzero)*pch->speed)/
|
||||
if (nfree > 0) {
|
||||
if (pch->speed == 0) {
|
||||
flen = totlen/nfree ;
|
||||
if (nbigger > 0) {
|
||||
flen++;
|
||||
nbigger--;
|
||||
}
|
||||
} else {
|
||||
flen = (((totfree - nzero)*(totlen + hdrlen*totfree)) /
|
||||
((totspeed*totfree)/pch->speed)) - hdrlen;
|
||||
if (nbigger > 0) {
|
||||
flen += ((totfree - nzero)*pch->speed)/totspeed;
|
||||
nbigger -= ((totfree - nzero)*pch->speed)/
|
||||
totspeed;
|
||||
}
|
||||
}
|
||||
nfree--;
|
||||
}
|
||||
nfree--;
|
||||
|
||||
/*
|
||||
*check if we are on the last channel or
|
||||
*we exceded the lenght of the data to
|
||||
*fragment
|
||||
*/
|
||||
if ((nfree == 0) || (flen > len))
|
||||
if ((nfree <= 0) || (flen > len))
|
||||
flen = len;
|
||||
/*
|
||||
*it is not worth to tx on slow channels:
|
||||
|
|
@ -1467,7 +1469,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
|
|||
continue;
|
||||
}
|
||||
|
||||
mtu = pch->chan->mtu + 2 - hdrlen;
|
||||
mtu = pch->chan->mtu - hdrlen;
|
||||
if (mtu < 4)
|
||||
mtu = 4;
|
||||
if (flen > mtu)
|
||||
|
|
|
|||
|
|
@ -1063,6 +1063,7 @@ static void *pppoe_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|||
else {
|
||||
int hash = hash_item(po->pppoe_pa.sid, po->pppoe_pa.remote);
|
||||
|
||||
po = NULL;
|
||||
while (++hash < PPPOE_HASH_SIZE) {
|
||||
po = pn->hash_table[hash];
|
||||
if (po)
|
||||
|
|
|
|||
|
|
@ -2680,6 +2680,7 @@ out_unregister_pppol2tp_proto:
|
|||
static void __exit pppol2tp_exit(void)
|
||||
{
|
||||
unregister_pppox_proto(PX_PROTO_OL2TP);
|
||||
unregister_pernet_gen_device(pppol2tp_net_id, &pppol2tp_net_ops);
|
||||
proto_unregister(&pppol2tp_sk_proto);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -793,7 +793,7 @@ static inline int s6gmac_phy_start(struct net_device *dev)
|
|||
struct s6gmac *pd = netdev_priv(dev);
|
||||
int i = 0;
|
||||
struct phy_device *p = NULL;
|
||||
while ((!(p = pd->mii.bus->phy_map[i])) && (i < PHY_MAX_ADDR))
|
||||
while ((i < PHY_MAX_ADDR) && (!(p = pd->mii.bus->phy_map[i])))
|
||||
i++;
|
||||
p = phy_connect(dev, dev_name(&p->dev), &s6gmac_adjust_link, 0,
|
||||
PHY_INTERFACE_MODE_RGMII);
|
||||
|
|
|
|||
|
|
@ -1488,6 +1488,8 @@ static int sky2_up(struct net_device *dev)
|
|||
sky2_set_vlan_mode(hw, port, sky2->vlgrp != NULL);
|
||||
#endif
|
||||
|
||||
sky2->restarting = 0;
|
||||
|
||||
err = sky2_rx_start(sky2);
|
||||
if (err)
|
||||
goto err_out;
|
||||
|
|
@ -1500,6 +1502,9 @@ static int sky2_up(struct net_device *dev)
|
|||
|
||||
sky2_set_multicast(dev);
|
||||
|
||||
/* wake queue incase we are restarting */
|
||||
netif_wake_queue(dev);
|
||||
|
||||
if (netif_msg_ifup(sky2))
|
||||
printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
|
||||
return 0;
|
||||
|
|
@ -1533,6 +1538,8 @@ static inline int tx_dist(unsigned tail, unsigned head)
|
|||
/* Number of list elements available for next tx */
|
||||
static inline int tx_avail(const struct sky2_port *sky2)
|
||||
{
|
||||
if (unlikely(sky2->restarting))
|
||||
return 0;
|
||||
return sky2->tx_pending - tx_dist(sky2->tx_cons, sky2->tx_prod);
|
||||
}
|
||||
|
||||
|
|
@ -1818,6 +1825,10 @@ static int sky2_down(struct net_device *dev)
|
|||
if (netif_msg_ifdown(sky2))
|
||||
printk(KERN_INFO PFX "%s: disabling interface\n", dev->name);
|
||||
|
||||
/* explicitly shut off tx incase we're restarting */
|
||||
sky2->restarting = 1;
|
||||
netif_tx_disable(dev);
|
||||
|
||||
/* Force flow control off */
|
||||
sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_OFF);
|
||||
|
||||
|
|
@ -2359,7 +2370,7 @@ static inline void sky2_tx_done(struct net_device *dev, u16 last)
|
|||
{
|
||||
struct sky2_port *sky2 = netdev_priv(dev);
|
||||
|
||||
if (netif_running(dev)) {
|
||||
if (likely(netif_running(dev) && !sky2->restarting)) {
|
||||
netif_tx_lock(dev);
|
||||
sky2_tx_complete(sky2, last);
|
||||
netif_tx_unlock(dev);
|
||||
|
|
@ -4283,6 +4294,7 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
|
|||
spin_lock_init(&sky2->phy_lock);
|
||||
sky2->tx_pending = TX_DEF_PENDING;
|
||||
sky2->rx_pending = RX_DEF_PENDING;
|
||||
sky2->restarting = 0;
|
||||
|
||||
hw->dev[port] = dev;
|
||||
|
||||
|
|
|
|||
|
|
@ -2051,6 +2051,7 @@ struct sky2_port {
|
|||
u8 duplex; /* DUPLEX_HALF, DUPLEX_FULL */
|
||||
u8 rx_csum;
|
||||
u8 wol;
|
||||
u8 restarting;
|
||||
enum flow_control flow_mode;
|
||||
enum flow_control flow_status;
|
||||
|
||||
|
|
|
|||
|
|
@ -196,21 +196,23 @@ static void PRINT_PKT(u_char *buf, int length)
|
|||
/* this enables an interrupt in the interrupt mask register */
|
||||
#define SMC_ENABLE_INT(lp, x) do { \
|
||||
unsigned char mask; \
|
||||
spin_lock_irq(&lp->lock); \
|
||||
unsigned long smc_enable_flags; \
|
||||
spin_lock_irqsave(&lp->lock, smc_enable_flags); \
|
||||
mask = SMC_GET_INT_MASK(lp); \
|
||||
mask |= (x); \
|
||||
SMC_SET_INT_MASK(lp, mask); \
|
||||
spin_unlock_irq(&lp->lock); \
|
||||
spin_unlock_irqrestore(&lp->lock, smc_enable_flags); \
|
||||
} while (0)
|
||||
|
||||
/* this disables an interrupt from the interrupt mask register */
|
||||
#define SMC_DISABLE_INT(lp, x) do { \
|
||||
unsigned char mask; \
|
||||
spin_lock_irq(&lp->lock); \
|
||||
unsigned long smc_disable_flags; \
|
||||
spin_lock_irqsave(&lp->lock, smc_disable_flags); \
|
||||
mask = SMC_GET_INT_MASK(lp); \
|
||||
mask &= ~(x); \
|
||||
SMC_SET_INT_MASK(lp, mask); \
|
||||
spin_unlock_irq(&lp->lock); \
|
||||
spin_unlock_irqrestore(&lp->lock, smc_disable_flags); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
|
|
@ -520,21 +522,21 @@ static inline void smc_rcv(struct net_device *dev)
|
|||
* any other concurrent access and C would always interrupt B. But life
|
||||
* isn't that easy in a SMP world...
|
||||
*/
|
||||
#define smc_special_trylock(lock) \
|
||||
#define smc_special_trylock(lock, flags) \
|
||||
({ \
|
||||
int __ret; \
|
||||
local_irq_disable(); \
|
||||
local_irq_save(flags); \
|
||||
__ret = spin_trylock(lock); \
|
||||
if (!__ret) \
|
||||
local_irq_enable(); \
|
||||
local_irq_restore(flags); \
|
||||
__ret; \
|
||||
})
|
||||
#define smc_special_lock(lock) spin_lock_irq(lock)
|
||||
#define smc_special_unlock(lock) spin_unlock_irq(lock)
|
||||
#define smc_special_lock(lock, flags) spin_lock_irqsave(lock, flags)
|
||||
#define smc_special_unlock(lock, flags) spin_unlock_irqrestore(lock, flags)
|
||||
#else
|
||||
#define smc_special_trylock(lock) (1)
|
||||
#define smc_special_lock(lock) do { } while (0)
|
||||
#define smc_special_unlock(lock) do { } while (0)
|
||||
#define smc_special_trylock(lock, flags) (1)
|
||||
#define smc_special_lock(lock, flags) do { } while (0)
|
||||
#define smc_special_unlock(lock, flags) do { } while (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -548,10 +550,11 @@ static void smc_hardware_send_pkt(unsigned long data)
|
|||
struct sk_buff *skb;
|
||||
unsigned int packet_no, len;
|
||||
unsigned char *buf;
|
||||
unsigned long flags;
|
||||
|
||||
DBG(3, "%s: %s\n", dev->name, __func__);
|
||||
|
||||
if (!smc_special_trylock(&lp->lock)) {
|
||||
if (!smc_special_trylock(&lp->lock, flags)) {
|
||||
netif_stop_queue(dev);
|
||||
tasklet_schedule(&lp->tx_task);
|
||||
return;
|
||||
|
|
@ -559,7 +562,7 @@ static void smc_hardware_send_pkt(unsigned long data)
|
|||
|
||||
skb = lp->pending_tx_skb;
|
||||
if (unlikely(!skb)) {
|
||||
smc_special_unlock(&lp->lock);
|
||||
smc_special_unlock(&lp->lock, flags);
|
||||
return;
|
||||
}
|
||||
lp->pending_tx_skb = NULL;
|
||||
|
|
@ -569,7 +572,7 @@ static void smc_hardware_send_pkt(unsigned long data)
|
|||
printk("%s: Memory allocation failed.\n", dev->name);
|
||||
dev->stats.tx_errors++;
|
||||
dev->stats.tx_fifo_errors++;
|
||||
smc_special_unlock(&lp->lock);
|
||||
smc_special_unlock(&lp->lock, flags);
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
|
@ -608,7 +611,7 @@ static void smc_hardware_send_pkt(unsigned long data)
|
|||
|
||||
/* queue the packet for TX */
|
||||
SMC_SET_MMU_CMD(lp, MC_ENQUEUE);
|
||||
smc_special_unlock(&lp->lock);
|
||||
smc_special_unlock(&lp->lock, flags);
|
||||
|
||||
dev->trans_start = jiffies;
|
||||
dev->stats.tx_packets++;
|
||||
|
|
@ -633,6 +636,7 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
struct smc_local *lp = netdev_priv(dev);
|
||||
void __iomem *ioaddr = lp->base;
|
||||
unsigned int numPages, poll_count, status;
|
||||
unsigned long flags;
|
||||
|
||||
DBG(3, "%s: %s\n", dev->name, __func__);
|
||||
|
||||
|
|
@ -658,7 +662,7 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
smc_special_lock(&lp->lock);
|
||||
smc_special_lock(&lp->lock, flags);
|
||||
|
||||
/* now, try to allocate the memory */
|
||||
SMC_SET_MMU_CMD(lp, MC_ALLOC | numPages);
|
||||
|
|
@ -676,7 +680,7 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
}
|
||||
} while (--poll_count);
|
||||
|
||||
smc_special_unlock(&lp->lock);
|
||||
smc_special_unlock(&lp->lock, flags);
|
||||
|
||||
lp->pending_tx_skb = skb;
|
||||
if (!poll_count) {
|
||||
|
|
|
|||
|
|
@ -5059,7 +5059,7 @@ mii_get_phy(struct net_device *dev)
|
|||
if ((id == 0) || (id == 65535)) continue; /* Valid ID? */
|
||||
for (j=0; j<limit; j++) { /* Search PHY table */
|
||||
if (id != phy_info[j].id) continue; /* ID match? */
|
||||
for (k=0; lp->phy[k].id && (k < DE4X5_MAX_PHY); k++);
|
||||
for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++);
|
||||
if (k < DE4X5_MAX_PHY) {
|
||||
memcpy((char *)&lp->phy[k],
|
||||
(char *)&phy_info[j], sizeof(struct phy_table));
|
||||
|
|
@ -5072,7 +5072,7 @@ mii_get_phy(struct net_device *dev)
|
|||
break;
|
||||
}
|
||||
if ((j == limit) && (i < DE4X5_MAX_MII)) {
|
||||
for (k=0; lp->phy[k].id && (k < DE4X5_MAX_PHY); k++);
|
||||
for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++);
|
||||
lp->phy[k].addr = i;
|
||||
lp->phy[k].id = id;
|
||||
lp->phy[k].spd.reg = GENERIC_REG; /* ANLPA register */
|
||||
|
|
@ -5091,7 +5091,7 @@ mii_get_phy(struct net_device *dev)
|
|||
purgatory:
|
||||
lp->active = 0;
|
||||
if (lp->phy[0].id) { /* Reset the PHY devices */
|
||||
for (k=0; lp->phy[k].id && (k < DE4X5_MAX_PHY); k++) { /*For each PHY*/
|
||||
for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++) { /*For each PHY*/
|
||||
mii_wr(MII_CR_RST, MII_CR, lp->phy[k].addr, DE4X5_MII);
|
||||
while (mii_rd(MII_CR, lp->phy[k].addr, DE4X5_MII) & MII_CR_RST);
|
||||
|
||||
|
|
|
|||
|
|
@ -652,8 +652,9 @@ tulip_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
int entry;
|
||||
u32 flag;
|
||||
dma_addr_t mapping;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irq(&tp->lock);
|
||||
spin_lock_irqsave(&tp->lock, flags);
|
||||
|
||||
/* Calculate the next Tx descriptor entry. */
|
||||
entry = tp->cur_tx % TX_RING_SIZE;
|
||||
|
|
@ -688,7 +689,7 @@ tulip_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
/* Trigger an immediate transmit demand. */
|
||||
iowrite32(0, tp->base_addr + CSR1);
|
||||
|
||||
spin_unlock_irq(&tp->lock);
|
||||
spin_unlock_irqrestore(&tp->lock, flags);
|
||||
|
||||
dev->trans_start = jiffies;
|
||||
|
||||
|
|
|
|||
|
|
@ -1048,20 +1048,15 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
|||
return err;
|
||||
}
|
||||
|
||||
static int tun_get_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
||||
static int tun_get_iff(struct net *net, struct tun_struct *tun,
|
||||
struct ifreq *ifr)
|
||||
{
|
||||
struct tun_struct *tun = tun_get(file);
|
||||
|
||||
if (!tun)
|
||||
return -EBADFD;
|
||||
|
||||
DBG(KERN_INFO "%s: tun_get_iff\n", tun->dev->name);
|
||||
|
||||
strcpy(ifr->ifr_name, tun->dev->name);
|
||||
|
||||
ifr->ifr_flags = tun_flags(tun);
|
||||
|
||||
tun_put(tun);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1105,8 +1100,8 @@ static int set_offload(struct net_device *dev, unsigned long arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int tun_chr_ioctl(struct inode *inode, struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
static long tun_chr_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
struct tun_file *tfile = file->private_data;
|
||||
struct tun_struct *tun;
|
||||
|
|
@ -1128,34 +1123,32 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
|
|||
(unsigned int __user*)argp);
|
||||
}
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
tun = __tun_get(tfile);
|
||||
if (cmd == TUNSETIFF && !tun) {
|
||||
int err;
|
||||
|
||||
ifr.ifr_name[IFNAMSIZ-1] = '\0';
|
||||
|
||||
rtnl_lock();
|
||||
err = tun_set_iff(tfile->net, file, &ifr);
|
||||
rtnl_unlock();
|
||||
ret = tun_set_iff(tfile->net, file, &ifr);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
if (ret)
|
||||
goto unlock;
|
||||
|
||||
if (copy_to_user(argp, &ifr, sizeof(ifr)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
ret = -EFAULT;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
|
||||
ret = -EBADFD;
|
||||
if (!tun)
|
||||
return -EBADFD;
|
||||
goto unlock;
|
||||
|
||||
DBG(KERN_INFO "%s: tun_chr_ioctl cmd %d\n", tun->dev->name, cmd);
|
||||
|
||||
ret = 0;
|
||||
switch (cmd) {
|
||||
case TUNGETIFF:
|
||||
ret = tun_get_iff(current->nsproxy->net_ns, file, &ifr);
|
||||
ret = tun_get_iff(current->nsproxy->net_ns, tun, &ifr);
|
||||
if (ret)
|
||||
break;
|
||||
|
||||
|
|
@ -1201,7 +1194,6 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
|
|||
|
||||
case TUNSETLINK:
|
||||
/* Only allow setting the type when the interface is down */
|
||||
rtnl_lock();
|
||||
if (tun->dev->flags & IFF_UP) {
|
||||
DBG(KERN_INFO "%s: Linktype set failed because interface is up\n",
|
||||
tun->dev->name);
|
||||
|
|
@ -1211,7 +1203,6 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
|
|||
DBG(KERN_INFO "%s: linktype set to %d\n", tun->dev->name, tun->dev->type);
|
||||
ret = 0;
|
||||
}
|
||||
rtnl_unlock();
|
||||
break;
|
||||
|
||||
#ifdef TUN_DEBUG
|
||||
|
|
@ -1220,9 +1211,7 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
|
|||
break;
|
||||
#endif
|
||||
case TUNSETOFFLOAD:
|
||||
rtnl_lock();
|
||||
ret = set_offload(tun->dev, arg);
|
||||
rtnl_unlock();
|
||||
break;
|
||||
|
||||
case TUNSETTXFILTER:
|
||||
|
|
@ -1230,9 +1219,7 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
|
|||
ret = -EINVAL;
|
||||
if ((tun->flags & TUN_TYPE_MASK) != TUN_TAP_DEV)
|
||||
break;
|
||||
rtnl_lock();
|
||||
ret = update_filter(&tun->txflt, (void __user *)arg);
|
||||
rtnl_unlock();
|
||||
break;
|
||||
|
||||
case SIOCGIFHWADDR:
|
||||
|
|
@ -1248,9 +1235,7 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
|
|||
DBG(KERN_DEBUG "%s: set hw address: %pM\n",
|
||||
tun->dev->name, ifr.ifr_hwaddr.sa_data);
|
||||
|
||||
rtnl_lock();
|
||||
ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr);
|
||||
rtnl_unlock();
|
||||
break;
|
||||
|
||||
case TUNGETSNDBUF:
|
||||
|
|
@ -1273,7 +1258,10 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
|
|||
break;
|
||||
};
|
||||
|
||||
tun_put(tun);
|
||||
unlock:
|
||||
rtnl_unlock();
|
||||
if (tun)
|
||||
tun_put(tun);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1361,7 +1349,7 @@ static const struct file_operations tun_fops = {
|
|||
.write = do_sync_write,
|
||||
.aio_write = tun_chr_aio_write,
|
||||
.poll = tun_chr_poll,
|
||||
.ioctl = tun_chr_ioctl,
|
||||
.unlocked_ioctl = tun_chr_ioctl,
|
||||
.open = tun_chr_open,
|
||||
.release = tun_chr_close,
|
||||
.fasync = tun_chr_fasync
|
||||
|
|
|
|||
|
|
@ -3111,10 +3111,11 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
u8 __iomem *bd; /* BD pointer */
|
||||
u32 bd_status;
|
||||
u8 txQ = 0;
|
||||
unsigned long flags;
|
||||
|
||||
ugeth_vdbg("%s: IN", __func__);
|
||||
|
||||
spin_lock_irq(&ugeth->lock);
|
||||
spin_lock_irqsave(&ugeth->lock, flags);
|
||||
|
||||
dev->stats.tx_bytes += skb->len;
|
||||
|
||||
|
|
@ -3171,7 +3172,7 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
uccf = ugeth->uccf;
|
||||
out_be16(uccf->p_utodr, UCC_FAST_TOD);
|
||||
#endif
|
||||
spin_unlock_irq(&ugeth->lock);
|
||||
spin_unlock_irqrestore(&ugeth->lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -250,6 +250,8 @@ PEGASUS_DEV( "IO DATA USB ET/TX", VENDOR_IODATA, 0x0904,
|
|||
DEFAULT_GPIO_RESET )
|
||||
PEGASUS_DEV( "IO DATA USB ET/TX-S", VENDOR_IODATA, 0x0913,
|
||||
DEFAULT_GPIO_RESET | PEGASUS_II )
|
||||
PEGASUS_DEV( "IO DATA USB ETX-US2", VENDOR_IODATA, 0x092a,
|
||||
DEFAULT_GPIO_RESET | PEGASUS_II )
|
||||
PEGASUS_DEV( "Kingston KNU101TX Ethernet", VENDOR_KINGSTON, 0x000a,
|
||||
DEFAULT_GPIO_RESET)
|
||||
PEGASUS_DEV( "LANEED USB Ethernet LD-USB/TX", VENDOR_LANEED, 0x4002,
|
||||
|
|
|
|||
|
|
@ -1218,6 +1218,7 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev)
|
|||
struct rhine_private *rp = netdev_priv(dev);
|
||||
void __iomem *ioaddr = rp->base;
|
||||
unsigned entry;
|
||||
unsigned long flags;
|
||||
|
||||
/* Caution: the write order is important here, set the field
|
||||
with the "ownership" bits last. */
|
||||
|
|
@ -1261,7 +1262,7 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev)
|
|||
cpu_to_le32(TXDESC | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN));
|
||||
|
||||
/* lock eth irq */
|
||||
spin_lock_irq(&rp->lock);
|
||||
spin_lock_irqsave(&rp->lock, flags);
|
||||
wmb();
|
||||
rp->tx_ring[entry].tx_status = cpu_to_le32(DescOwn);
|
||||
wmb();
|
||||
|
|
@ -1280,7 +1281,7 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
dev->trans_start = jiffies;
|
||||
|
||||
spin_unlock_irq(&rp->lock);
|
||||
spin_unlock_irqrestore(&rp->lock, flags);
|
||||
|
||||
if (debug > 4) {
|
||||
printk(KERN_DEBUG "%s: Transmit frame #%d queued in slot %d.\n",
|
||||
|
|
|
|||
|
|
@ -1778,7 +1778,7 @@ static void velocity_error(struct velocity_info *vptr, int status)
|
|||
* mode
|
||||
*/
|
||||
if (vptr->rev_id < REV_ID_VT3216_A0) {
|
||||
if (vptr->mii_status | VELOCITY_DUPLEX_FULL)
|
||||
if (vptr->mii_status & VELOCITY_DUPLEX_FULL)
|
||||
BYTE_REG_BITS_ON(TCR_TB2BDIS, ®s->TCR);
|
||||
else
|
||||
BYTE_REG_BITS_OFF(TCR_TB2BDIS, ®s->TCR);
|
||||
|
|
|
|||
|
|
@ -70,6 +70,9 @@ struct virtnet_info
|
|||
struct sk_buff_head recv;
|
||||
struct sk_buff_head send;
|
||||
|
||||
/* Work struct for refilling if we run low on memory. */
|
||||
struct delayed_work refill;
|
||||
|
||||
/* Chain pages by the private ptr. */
|
||||
struct page *pages;
|
||||
};
|
||||
|
|
@ -273,19 +276,22 @@ drop:
|
|||
dev_kfree_skb(skb);
|
||||
}
|
||||
|
||||
static void try_fill_recv_maxbufs(struct virtnet_info *vi)
|
||||
static bool try_fill_recv_maxbufs(struct virtnet_info *vi, gfp_t gfp)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct scatterlist sg[2+MAX_SKB_FRAGS];
|
||||
int num, err, i;
|
||||
bool oom = false;
|
||||
|
||||
sg_init_table(sg, 2+MAX_SKB_FRAGS);
|
||||
for (;;) {
|
||||
struct virtio_net_hdr *hdr;
|
||||
|
||||
skb = netdev_alloc_skb(vi->dev, MAX_PACKET_LEN + NET_IP_ALIGN);
|
||||
if (unlikely(!skb))
|
||||
if (unlikely(!skb)) {
|
||||
oom = true;
|
||||
break;
|
||||
}
|
||||
|
||||
skb_reserve(skb, NET_IP_ALIGN);
|
||||
skb_put(skb, MAX_PACKET_LEN);
|
||||
|
|
@ -296,7 +302,7 @@ static void try_fill_recv_maxbufs(struct virtnet_info *vi)
|
|||
if (vi->big_packets) {
|
||||
for (i = 0; i < MAX_SKB_FRAGS; i++) {
|
||||
skb_frag_t *f = &skb_shinfo(skb)->frags[i];
|
||||
f->page = get_a_page(vi, GFP_ATOMIC);
|
||||
f->page = get_a_page(vi, gfp);
|
||||
if (!f->page)
|
||||
break;
|
||||
|
||||
|
|
@ -325,31 +331,35 @@ static void try_fill_recv_maxbufs(struct virtnet_info *vi)
|
|||
if (unlikely(vi->num > vi->max))
|
||||
vi->max = vi->num;
|
||||
vi->rvq->vq_ops->kick(vi->rvq);
|
||||
return !oom;
|
||||
}
|
||||
|
||||
static void try_fill_recv(struct virtnet_info *vi)
|
||||
/* Returns false if we couldn't fill entirely (OOM). */
|
||||
static bool try_fill_recv(struct virtnet_info *vi, gfp_t gfp)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct scatterlist sg[1];
|
||||
int err;
|
||||
bool oom = false;
|
||||
|
||||
if (!vi->mergeable_rx_bufs) {
|
||||
try_fill_recv_maxbufs(vi);
|
||||
return;
|
||||
}
|
||||
if (!vi->mergeable_rx_bufs)
|
||||
return try_fill_recv_maxbufs(vi, gfp);
|
||||
|
||||
for (;;) {
|
||||
skb_frag_t *f;
|
||||
|
||||
skb = netdev_alloc_skb(vi->dev, GOOD_COPY_LEN + NET_IP_ALIGN);
|
||||
if (unlikely(!skb))
|
||||
if (unlikely(!skb)) {
|
||||
oom = true;
|
||||
break;
|
||||
}
|
||||
|
||||
skb_reserve(skb, NET_IP_ALIGN);
|
||||
|
||||
f = &skb_shinfo(skb)->frags[0];
|
||||
f->page = get_a_page(vi, GFP_ATOMIC);
|
||||
f->page = get_a_page(vi, gfp);
|
||||
if (!f->page) {
|
||||
oom = true;
|
||||
kfree_skb(skb);
|
||||
break;
|
||||
}
|
||||
|
|
@ -373,6 +383,7 @@ static void try_fill_recv(struct virtnet_info *vi)
|
|||
if (unlikely(vi->num > vi->max))
|
||||
vi->max = vi->num;
|
||||
vi->rvq->vq_ops->kick(vi->rvq);
|
||||
return !oom;
|
||||
}
|
||||
|
||||
static void skb_recv_done(struct virtqueue *rvq)
|
||||
|
|
@ -385,6 +396,23 @@ static void skb_recv_done(struct virtqueue *rvq)
|
|||
}
|
||||
}
|
||||
|
||||
static void refill_work(struct work_struct *work)
|
||||
{
|
||||
struct virtnet_info *vi;
|
||||
bool still_empty;
|
||||
|
||||
vi = container_of(work, struct virtnet_info, refill.work);
|
||||
napi_disable(&vi->napi);
|
||||
try_fill_recv(vi, GFP_KERNEL);
|
||||
still_empty = (vi->num == 0);
|
||||
napi_enable(&vi->napi);
|
||||
|
||||
/* In theory, this can happen: if we don't get any buffers in
|
||||
* we will *never* try to fill again. */
|
||||
if (still_empty)
|
||||
schedule_delayed_work(&vi->refill, HZ/2);
|
||||
}
|
||||
|
||||
static int virtnet_poll(struct napi_struct *napi, int budget)
|
||||
{
|
||||
struct virtnet_info *vi = container_of(napi, struct virtnet_info, napi);
|
||||
|
|
@ -400,10 +428,10 @@ again:
|
|||
received++;
|
||||
}
|
||||
|
||||
/* FIXME: If we oom and completely run out of inbufs, we need
|
||||
* to start a timer trying to fill more. */
|
||||
if (vi->num < vi->max / 2)
|
||||
try_fill_recv(vi);
|
||||
if (vi->num < vi->max / 2) {
|
||||
if (!try_fill_recv(vi, GFP_ATOMIC))
|
||||
schedule_delayed_work(&vi->refill, 0);
|
||||
}
|
||||
|
||||
/* Out of packets? */
|
||||
if (received < budget) {
|
||||
|
|
@ -893,6 +921,7 @@ static int virtnet_probe(struct virtio_device *vdev)
|
|||
vi->vdev = vdev;
|
||||
vdev->priv = vi;
|
||||
vi->pages = NULL;
|
||||
INIT_DELAYED_WORK(&vi->refill, refill_work);
|
||||
|
||||
/* If they give us a callback when all buffers are done, we don't need
|
||||
* the timer. */
|
||||
|
|
@ -941,7 +970,7 @@ static int virtnet_probe(struct virtio_device *vdev)
|
|||
}
|
||||
|
||||
/* Last of all, set up some receive buffers. */
|
||||
try_fill_recv(vi);
|
||||
try_fill_recv(vi, GFP_KERNEL);
|
||||
|
||||
/* If we didn't even get one input buffer, we're useless. */
|
||||
if (vi->num == 0) {
|
||||
|
|
@ -958,6 +987,7 @@ static int virtnet_probe(struct virtio_device *vdev)
|
|||
|
||||
unregister:
|
||||
unregister_netdev(dev);
|
||||
cancel_delayed_work_sync(&vi->refill);
|
||||
free_vqs:
|
||||
vdev->config->del_vqs(vdev);
|
||||
free:
|
||||
|
|
@ -986,6 +1016,7 @@ static void virtnet_remove(struct virtio_device *vdev)
|
|||
BUG_ON(vi->num != 0);
|
||||
|
||||
unregister_netdev(vi->dev);
|
||||
cancel_delayed_work_sync(&vi->refill);
|
||||
|
||||
vdev->config->del_vqs(vi->vdev);
|
||||
|
||||
|
|
|
|||
|
|
@ -5918,20 +5918,19 @@ static int airo_set_essid(struct net_device *dev,
|
|||
readSsidRid(local, &SSID_rid);
|
||||
|
||||
/* Check if we asked for `any' */
|
||||
if(dwrq->flags == 0) {
|
||||
if (dwrq->flags == 0) {
|
||||
/* Just send an empty SSID list */
|
||||
memset(&SSID_rid, 0, sizeof(SSID_rid));
|
||||
} else {
|
||||
int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
|
||||
unsigned index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
|
||||
|
||||
/* Check the size of the string */
|
||||
if(dwrq->length > IW_ESSID_MAX_SIZE) {
|
||||
if (dwrq->length > IW_ESSID_MAX_SIZE)
|
||||
return -E2BIG ;
|
||||
}
|
||||
|
||||
/* Check if index is valid */
|
||||
if((index < 0) || (index >= 4)) {
|
||||
if (index >= ARRAY_SIZE(SSID_rid.ssids))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Set the SSID */
|
||||
memset(SSID_rid.ssids[index].ssid, 0,
|
||||
|
|
@ -6819,7 +6818,7 @@ static int airo_set_txpow(struct net_device *dev,
|
|||
return -EINVAL;
|
||||
}
|
||||
clear_bit (FLAG_RADIO_OFF, &local->flags);
|
||||
for (i = 0; cap_rid.txPowerLevels[i] && (i < 8); i++)
|
||||
for (i = 0; i < 8 && cap_rid.txPowerLevels[i]; i++)
|
||||
if (v == cap_rid.txPowerLevels[i]) {
|
||||
readConfigRid(local, 1);
|
||||
local->config.txPower = v;
|
||||
|
|
|
|||
|
|
@ -1967,13 +1967,14 @@ static int ar9170_conf_tx(struct ieee80211_hw *hw, u16 queue,
|
|||
int ret;
|
||||
|
||||
mutex_lock(&ar->mutex);
|
||||
if ((param) && !(queue > __AR9170_NUM_TXQ)) {
|
||||
if (queue < __AR9170_NUM_TXQ) {
|
||||
memcpy(&ar->edcf[ar9170_qos_hwmap[queue]],
|
||||
param, sizeof(*param));
|
||||
|
||||
ret = ar9170_set_qos(ar);
|
||||
} else
|
||||
} else {
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
mutex_unlock(&ar->mutex);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -598,11 +598,15 @@ static int ar9170_usb_request_firmware(struct ar9170_usb *aru)
|
|||
|
||||
err = request_firmware(&aru->init_values, "ar9170-1.fw",
|
||||
&aru->udev->dev);
|
||||
if (err) {
|
||||
dev_err(&aru->udev->dev, "file with init values not found.\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
err = request_firmware(&aru->firmware, "ar9170-2.fw", &aru->udev->dev);
|
||||
if (err) {
|
||||
release_firmware(aru->init_values);
|
||||
dev_err(&aru->udev->dev, "file with init values not found.\n");
|
||||
dev_err(&aru->udev->dev, "firmware file not found.\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -460,7 +460,7 @@ static int ath9k_hw_4k_check_eeprom(struct ath_hw *ah)
|
|||
integer = swab32(eep->modalHeader.antCtrlCommon);
|
||||
eep->modalHeader.antCtrlCommon = integer;
|
||||
|
||||
for (i = 0; i < AR5416_MAX_CHAINS; i++) {
|
||||
for (i = 0; i < AR5416_EEP4K_MAX_CHAINS; i++) {
|
||||
integer = swab32(eep->modalHeader.antCtrlChain[i]);
|
||||
eep->modalHeader.antCtrlChain[i] = integer;
|
||||
}
|
||||
|
|
@ -914,7 +914,7 @@ static void ath9k_hw_set_4k_power_per_rate_table(struct ath_hw *ah,
|
|||
ctlMode, numCtlModes, isHt40CtlMode,
|
||||
(pCtlMode[ctlMode] & EXT_ADDITIVE));
|
||||
|
||||
for (i = 0; (i < AR5416_NUM_CTLS) &&
|
||||
for (i = 0; (i < AR5416_EEP4K_NUM_CTLS) &&
|
||||
pEepData->ctlIndex[i]; i++) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_EEPROM,
|
||||
" LOOP-Ctlidx %d: cfgCtl 0x%2.2x "
|
||||
|
|
|
|||
|
|
@ -6226,7 +6226,7 @@ static void ipw_add_scan_channels(struct ipw_priv *priv,
|
|||
};
|
||||
|
||||
u8 channel;
|
||||
while (channel_index < IPW_SCAN_CHANNELS) {
|
||||
while (channel_index < IPW_SCAN_CHANNELS - 1) {
|
||||
channel =
|
||||
priv->speed_scan[priv->speed_scan_pos];
|
||||
if (channel == 0) {
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ enum iwl3945_antenna {
|
|||
#define IWL_TX_FIFO_NONE 7
|
||||
|
||||
/* Minimum number of queues. MAX_NUM is defined in hw specific files */
|
||||
#define IWL_MIN_NUM_QUEUES 4
|
||||
#define IWL39_MIN_NUM_QUEUES 4
|
||||
|
||||
#define IEEE80211_DATA_LEN 2304
|
||||
#define IEEE80211_4ADDR_LEN 30
|
||||
|
|
|
|||
|
|
@ -1332,6 +1332,9 @@ int iwl_setup_mac(struct iwl_priv *priv)
|
|||
|
||||
hw->wiphy->custom_regulatory = true;
|
||||
|
||||
/* Firmware does not support this */
|
||||
hw->wiphy->disable_beacon_hints = true;
|
||||
|
||||
hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX;
|
||||
/* we create the 802.11 header and a zero-length SSID element */
|
||||
hw->wiphy->max_scan_ie_len = IWL_MAX_PROBE_REQUEST - 24 - 2;
|
||||
|
|
|
|||
|
|
@ -308,18 +308,18 @@ static ssize_t iwl_dbgfs_nvm_read(struct file *file,
|
|||
return -ENODATA;
|
||||
}
|
||||
|
||||
ptr = priv->eeprom;
|
||||
if (!ptr) {
|
||||
IWL_ERR(priv, "Invalid EEPROM/OTP memory\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* 4 characters for byte 0xYY */
|
||||
buf = kzalloc(buf_size, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
IWL_ERR(priv, "Can not allocate Buffer\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ptr = priv->eeprom;
|
||||
if (!ptr) {
|
||||
IWL_ERR(priv, "Invalid EEPROM/OTP memory\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
pos += scnprintf(buf + pos, buf_size - pos, "NVM Type: %s\n",
|
||||
(priv->nvm_device_type == NVM_DEVICE_TYPE_OTP)
|
||||
? "OTP" : "EEPROM");
|
||||
|
|
|
|||
|
|
@ -258,8 +258,10 @@ struct iwl_channel_info {
|
|||
#define IWL_TX_FIFO_HCCA_2 6
|
||||
#define IWL_TX_FIFO_NONE 7
|
||||
|
||||
/* Minimum number of queues. MAX_NUM is defined in hw specific files */
|
||||
#define IWL_MIN_NUM_QUEUES 4
|
||||
/* Minimum number of queues. MAX_NUM is defined in hw specific files.
|
||||
* Set the minimum to accommodate the 4 standard TX queues, 1 command
|
||||
* queue, 2 (unused) HCCA queues, and 4 HT queues (one for each AC) */
|
||||
#define IWL_MIN_NUM_QUEUES 10
|
||||
|
||||
/* Power management (not Tx power) structures */
|
||||
|
||||
|
|
|
|||
|
|
@ -566,6 +566,8 @@ int iwl_remove_default_wep_key(struct iwl_priv *priv,
|
|||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&priv->sta_lock, flags);
|
||||
IWL_DEBUG_WEP(priv, "Removing default WEP key: idx=%d\n",
|
||||
keyconf->keyidx);
|
||||
|
||||
if (!test_and_clear_bit(keyconf->keyidx, &priv->ucode_key_table))
|
||||
IWL_ERR(priv, "index %d not used in uCode key table.\n",
|
||||
|
|
@ -573,6 +575,11 @@ int iwl_remove_default_wep_key(struct iwl_priv *priv,
|
|||
|
||||
priv->default_wep_key--;
|
||||
memset(&priv->wep_keys[keyconf->keyidx], 0, sizeof(priv->wep_keys[0]));
|
||||
if (iwl_is_rfkill(priv)) {
|
||||
IWL_DEBUG_WEP(priv, "Not sending REPLY_WEPKEY command due to RFKILL.\n");
|
||||
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
ret = iwl_send_static_wepkey_cmd(priv, 1);
|
||||
IWL_DEBUG_WEP(priv, "Remove default WEP key: idx=%d ret=%d\n",
|
||||
keyconf->keyidx, ret);
|
||||
|
|
@ -853,6 +860,11 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
|
|||
priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK;
|
||||
priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
|
||||
|
||||
if (iwl_is_rfkill(priv)) {
|
||||
IWL_DEBUG_WEP(priv, "Not sending REPLY_ADD_STA command because RFKILL enabled. \n");
|
||||
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
ret = iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
|
||||
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -720,8 +720,6 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
goto drop_unlock;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
hdr_len = ieee80211_hdrlen(fc);
|
||||
|
||||
/* Find (or create) index into station table for destination station */
|
||||
|
|
@ -729,7 +727,7 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
if (sta_id == IWL_INVALID_STATION) {
|
||||
IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
|
||||
hdr->addr1);
|
||||
goto drop;
|
||||
goto drop_unlock;
|
||||
}
|
||||
|
||||
IWL_DEBUG_TX(priv, "station Id %d\n", sta_id);
|
||||
|
|
@ -750,14 +748,17 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
txq_id = priv->stations[sta_id].tid[tid].agg.txq_id;
|
||||
swq_id = iwl_virtual_agg_queue_num(swq_id, txq_id);
|
||||
}
|
||||
priv->stations[sta_id].tid[tid].tfds_in_queue++;
|
||||
}
|
||||
|
||||
txq = &priv->txq[txq_id];
|
||||
q = &txq->q;
|
||||
txq->swq_id = swq_id;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
if (unlikely(iwl_queue_space(q) < q->high_mark))
|
||||
goto drop_unlock;
|
||||
|
||||
if (ieee80211_is_data_qos(fc))
|
||||
priv->stations[sta_id].tid[tid].tfds_in_queue++;
|
||||
|
||||
/* Set up driver data for this TFD */
|
||||
memset(&(txq->txb[q->write_ptr]), 0, sizeof(struct iwl_tx_info));
|
||||
|
|
@ -902,7 +903,6 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
|
||||
drop_unlock:
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
drop:
|
||||
return -1;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_tx_skb);
|
||||
|
|
@ -1171,6 +1171,8 @@ int iwl_tx_agg_start(struct iwl_priv *priv, const u8 *ra, u16 tid, u16 *ssn)
|
|||
IWL_ERR(priv, "Start AGG on invalid station\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
if (unlikely(tid >= MAX_TID_COUNT))
|
||||
return -EINVAL;
|
||||
|
||||
if (priv->stations[sta_id].tid[tid].agg.state != IWL_AGG_OFF) {
|
||||
IWL_ERR(priv, "Start AGG when state is not IWL_AGG_OFF !\n");
|
||||
|
|
|
|||
|
|
@ -3968,6 +3968,9 @@ static int iwl3945_setup_mac(struct iwl_priv *priv)
|
|||
|
||||
hw->wiphy->custom_regulatory = true;
|
||||
|
||||
/* Firmware does not support this */
|
||||
hw->wiphy->disable_beacon_hints = true;
|
||||
|
||||
hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX_3945;
|
||||
/* we create the 802.11 header and a zero-length SSID element */
|
||||
hw->wiphy->max_scan_ie_len = IWL_MAX_PROBE_REQUEST - 24 - 2;
|
||||
|
|
@ -4018,10 +4021,10 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
|
|||
SET_IEEE80211_DEV(hw, &pdev->dev);
|
||||
|
||||
if ((iwl3945_mod_params.num_of_queues > IWL39_MAX_NUM_QUEUES) ||
|
||||
(iwl3945_mod_params.num_of_queues < IWL_MIN_NUM_QUEUES)) {
|
||||
(iwl3945_mod_params.num_of_queues < IWL39_MIN_NUM_QUEUES)) {
|
||||
IWL_ERR(priv,
|
||||
"invalid queues_num, should be between %d and %d\n",
|
||||
IWL_MIN_NUM_QUEUES, IWL39_MAX_NUM_QUEUES);
|
||||
IWL39_MIN_NUM_QUEUES, IWL39_MAX_NUM_QUEUES);
|
||||
err = -EINVAL;
|
||||
goto out_ieee80211_free_hw;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -220,6 +220,7 @@ int iwm_store_rxiq_calib_result(struct iwm_priv *iwm)
|
|||
eeprom_rxiq = iwm_eeprom_access(iwm, IWM_EEPROM_CALIB_RXIQ);
|
||||
if (IS_ERR(eeprom_rxiq)) {
|
||||
IWM_ERR(iwm, "Couldn't access EEPROM RX IQ entry\n");
|
||||
kfree(rxiq);
|
||||
return PTR_ERR(eeprom_rxiq);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -106,10 +106,8 @@ void *iwm_if_alloc(int sizeof_bus, struct device *dev,
|
|||
int ret = 0;
|
||||
|
||||
wdev = iwm_wdev_alloc(sizeof_bus, dev);
|
||||
if (!wdev) {
|
||||
dev_err(dev, "no memory for wireless device instance\n");
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
if (IS_ERR(wdev))
|
||||
return wdev;
|
||||
|
||||
iwm = wdev_to_iwm(wdev);
|
||||
iwm->bus_ops = if_ops;
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ static u8 lbs_region_2_code(u8 *region)
|
|||
{
|
||||
u8 i;
|
||||
|
||||
for (i = 0; region[i] && i < COUNTRY_CODE_LEN; i++)
|
||||
for (i = 0; i < COUNTRY_CODE_LEN && region[i]; i++)
|
||||
region[i] = toupper(region[i]);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(region_code_mapping); i++) {
|
||||
|
|
|
|||
|
|
@ -56,8 +56,8 @@ struct rxpd {
|
|||
u8 bss_type;
|
||||
/* BSS number */
|
||||
u8 bss_num;
|
||||
} bss;
|
||||
} u;
|
||||
} __attribute__ ((packed)) bss;
|
||||
} __attribute__ ((packed)) u;
|
||||
|
||||
/* SNR */
|
||||
u8 snr;
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
* for sending scan commands to the firmware.
|
||||
*/
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/if_arp.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
|
@ -876,7 +877,7 @@ static inline char *lbs_translate_scan(struct lbs_private *priv,
|
|||
iwe.u.bitrate.disabled = 0;
|
||||
iwe.u.bitrate.value = 0;
|
||||
|
||||
for (j = 0; bss->rates[j] && (j < sizeof(bss->rates)); j++) {
|
||||
for (j = 0; j < ARRAY_SIZE(bss->rates) && bss->rates[j]; j++) {
|
||||
/* Bit rate given in 500 kb/s units */
|
||||
iwe.u.bitrate.value = bss->rates[j] * 500000;
|
||||
current_val = iwe_stream_add_value(info, start, current_val,
|
||||
|
|
|
|||
|
|
@ -261,7 +261,7 @@ struct mwl8k_vif {
|
|||
*/
|
||||
};
|
||||
|
||||
#define MWL8K_VIF(_vif) (struct mwl8k_vif *)(&((_vif)->drv_priv))
|
||||
#define MWL8K_VIF(_vif) ((struct mwl8k_vif *)&((_vif)->drv_priv))
|
||||
|
||||
static const struct ieee80211_channel mwl8k_channels[] = {
|
||||
{ .center_freq = 2412, .hw_value = 1, },
|
||||
|
|
@ -1012,6 +1012,8 @@ static int rxq_process(struct ieee80211_hw *hw, int index, int limit)
|
|||
rmb();
|
||||
|
||||
skb = rxq->rx_skb[rxq->rx_head];
|
||||
if (skb == NULL)
|
||||
break;
|
||||
rxq->rx_skb[rxq->rx_head] = NULL;
|
||||
|
||||
rxq->rx_head = (rxq->rx_head + 1) % MWL8K_RX_DESCS;
|
||||
|
|
@ -1591,6 +1593,9 @@ static int mwl8k_post_cmd(struct ieee80211_hw *hw, struct mwl8k_cmd_pkt *cmd)
|
|||
timeout = wait_for_completion_timeout(&cmd_wait,
|
||||
msecs_to_jiffies(MWL8K_CMD_TIMEOUT_MS));
|
||||
|
||||
pci_unmap_single(priv->pdev, dma_addr, dma_size,
|
||||
PCI_DMA_BIDIRECTIONAL);
|
||||
|
||||
result = &cmd->result;
|
||||
if (!timeout) {
|
||||
spin_lock_irq(&priv->fw_lock);
|
||||
|
|
@ -1610,8 +1615,6 @@ static int mwl8k_post_cmd(struct ieee80211_hw *hw, struct mwl8k_cmd_pkt *cmd)
|
|||
*result);
|
||||
}
|
||||
|
||||
pci_unmap_single(priv->pdev, dma_addr, dma_size,
|
||||
PCI_DMA_BIDIRECTIONAL);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
@ -1654,18 +1657,18 @@ static int mwl8k_cmd_get_hw_spec(struct ieee80211_hw *hw)
|
|||
memset(cmd->perm_addr, 0xff, sizeof(cmd->perm_addr));
|
||||
cmd->ps_cookie = cpu_to_le32(priv->cookie_dma);
|
||||
cmd->rx_queue_ptr = cpu_to_le32(priv->rxq[0].rx_desc_dma);
|
||||
cmd->num_tx_queues = MWL8K_TX_QUEUES;
|
||||
cmd->num_tx_queues = cpu_to_le32(MWL8K_TX_QUEUES);
|
||||
for (i = 0; i < MWL8K_TX_QUEUES; i++)
|
||||
cmd->tx_queue_ptrs[i] = cpu_to_le32(priv->txq[i].tx_desc_dma);
|
||||
cmd->num_tx_desc_per_queue = MWL8K_TX_DESCS;
|
||||
cmd->total_rx_desc = MWL8K_RX_DESCS;
|
||||
cmd->num_tx_desc_per_queue = cpu_to_le32(MWL8K_TX_DESCS);
|
||||
cmd->total_rx_desc = cpu_to_le32(MWL8K_RX_DESCS);
|
||||
|
||||
rc = mwl8k_post_cmd(hw, &cmd->header);
|
||||
|
||||
if (!rc) {
|
||||
SET_IEEE80211_PERM_ADDR(hw, cmd->perm_addr);
|
||||
priv->num_mcaddrs = le16_to_cpu(cmd->num_mcaddrs);
|
||||
priv->fw_rev = cmd->fw_rev;
|
||||
priv->fw_rev = le32_to_cpu(cmd->fw_rev);
|
||||
priv->hw_rev = cmd->hw_rev;
|
||||
priv->region_code = le16_to_cpu(cmd->region_code);
|
||||
}
|
||||
|
|
@ -3216,15 +3219,19 @@ static int mwl8k_configure_filter_wt(struct work_struct *wt)
|
|||
struct dev_addr_list *mclist = worker->mclist;
|
||||
|
||||
struct mwl8k_priv *priv = hw->priv;
|
||||
struct mwl8k_vif *mv_vif;
|
||||
int rc = 0;
|
||||
|
||||
if (changed_flags & FIF_BCN_PRBRESP_PROMISC) {
|
||||
if (*total_flags & FIF_BCN_PRBRESP_PROMISC)
|
||||
rc = mwl8k_cmd_set_pre_scan(hw);
|
||||
else {
|
||||
mv_vif = MWL8K_VIF(priv->vif);
|
||||
rc = mwl8k_cmd_set_post_scan(hw, mv_vif->bssid);
|
||||
u8 *bssid;
|
||||
|
||||
bssid = "\x00\x00\x00\x00\x00\x00";
|
||||
if (priv->vif != NULL)
|
||||
bssid = MWL8K_VIF(priv->vif)->bssid;
|
||||
|
||||
rc = mwl8k_cmd_set_post_scan(hw, bssid);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3726,6 +3733,8 @@ static void __devexit mwl8k_remove(struct pci_dev *pdev)
|
|||
|
||||
ieee80211_stop_queues(hw);
|
||||
|
||||
ieee80211_unregister_hw(hw);
|
||||
|
||||
/* Remove tx reclaim tasklet */
|
||||
tasklet_kill(&priv->tx_reclaim_task);
|
||||
|
||||
|
|
@ -3739,8 +3748,6 @@ static void __devexit mwl8k_remove(struct pci_dev *pdev)
|
|||
for (i = 0; i < MWL8K_TX_QUEUES; i++)
|
||||
mwl8k_txq_reclaim(hw, i, 1);
|
||||
|
||||
ieee80211_unregister_hw(hw);
|
||||
|
||||
for (i = 0; i < MWL8K_TX_QUEUES; i++)
|
||||
mwl8k_txq_deinit(hw, i);
|
||||
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ int orinoco_hw_get_tkip_iv(struct orinoco_private *priv, int key, u8 *tsc)
|
|||
int err = 0;
|
||||
u8 tsc_arr[4][IW_ENCODE_SEQ_MAX_SIZE];
|
||||
|
||||
if ((key < 0) || (key > 4))
|
||||
if ((key < 0) || (key >= 4))
|
||||
return -EINVAL;
|
||||
|
||||
err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_TKIP_IV,
|
||||
|
|
|
|||
|
|
@ -849,13 +849,15 @@ struct rt2x00_dev {
|
|||
static inline void rt2x00_rf_read(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int word, u32 *data)
|
||||
{
|
||||
*data = rt2x00dev->rf[word];
|
||||
BUG_ON(word < 1 || word > rt2x00dev->ops->rf_size / sizeof(u32));
|
||||
*data = rt2x00dev->rf[word - 1];
|
||||
}
|
||||
|
||||
static inline void rt2x00_rf_write(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int word, u32 data)
|
||||
{
|
||||
rt2x00dev->rf[word] = data;
|
||||
BUG_ON(word < 1 || word > rt2x00dev->ops->rf_size / sizeof(u32));
|
||||
rt2x00dev->rf[word - 1] = data;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -869,6 +869,9 @@ static int rtl8187b_init_hw(struct ieee80211_hw *dev)
|
|||
priv->aifsn[3] = 3; /* AIFSN[AC_BE] */
|
||||
rtl818x_iowrite8(priv, &priv->map->ACM_CONTROL, 0);
|
||||
|
||||
/* ENEDCA flag must always be set, transmit issues? */
|
||||
rtl818x_iowrite8(priv, &priv->map->MSR, RTL818X_MSR_ENEDCA);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1173,13 +1176,16 @@ static void rtl8187_bss_info_changed(struct ieee80211_hw *dev,
|
|||
rtl818x_iowrite8(priv, &priv->map->BSSID[i],
|
||||
info->bssid[i]);
|
||||
|
||||
if (priv->is_rtl8187b)
|
||||
reg = RTL818X_MSR_ENEDCA;
|
||||
else
|
||||
reg = 0;
|
||||
|
||||
if (is_valid_ether_addr(info->bssid)) {
|
||||
reg = RTL818X_MSR_INFRA;
|
||||
if (priv->is_rtl8187b)
|
||||
reg |= RTL818X_MSR_ENEDCA;
|
||||
reg |= RTL818X_MSR_INFRA;
|
||||
rtl818x_iowrite8(priv, &priv->map->MSR, reg);
|
||||
} else {
|
||||
reg = RTL818X_MSR_NO_LINK;
|
||||
reg |= RTL818X_MSR_NO_LINK;
|
||||
rtl818x_iowrite8(priv, &priv->map->MSR, reg);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -698,7 +698,7 @@ int zd_mac_rx(struct ieee80211_hw *hw, const u8 *buffer, unsigned int length)
|
|||
&& !mac->pass_ctrl)
|
||||
return 0;
|
||||
|
||||
fc = *(__le16 *)buffer;
|
||||
fc = get_unaligned((__le16*)buffer);
|
||||
need_padding = ieee80211_is_data_qos(fc) ^ ieee80211_has_a4(fc);
|
||||
|
||||
skb = dev_alloc_skb(length + (need_padding ? 2 : 0));
|
||||
|
|
|
|||
|
|
@ -346,7 +346,7 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
|
|||
static int yellowfin_open(struct net_device *dev);
|
||||
static void yellowfin_timer(unsigned long data);
|
||||
static void yellowfin_tx_timeout(struct net_device *dev);
|
||||
static void yellowfin_init_ring(struct net_device *dev);
|
||||
static int yellowfin_init_ring(struct net_device *dev);
|
||||
static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev);
|
||||
static irqreturn_t yellowfin_interrupt(int irq, void *dev_instance);
|
||||
static int yellowfin_rx(struct net_device *dev);
|
||||
|
|
@ -573,19 +573,24 @@ static int yellowfin_open(struct net_device *dev)
|
|||
{
|
||||
struct yellowfin_private *yp = netdev_priv(dev);
|
||||
void __iomem *ioaddr = yp->base;
|
||||
int i;
|
||||
int i, ret;
|
||||
|
||||
/* Reset the chip. */
|
||||
iowrite32(0x80000000, ioaddr + DMACtrl);
|
||||
|
||||
i = request_irq(dev->irq, &yellowfin_interrupt, IRQF_SHARED, dev->name, dev);
|
||||
if (i) return i;
|
||||
ret = request_irq(dev->irq, &yellowfin_interrupt, IRQF_SHARED, dev->name, dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (yellowfin_debug > 1)
|
||||
printk(KERN_DEBUG "%s: yellowfin_open() irq %d.\n",
|
||||
dev->name, dev->irq);
|
||||
|
||||
yellowfin_init_ring(dev);
|
||||
ret = yellowfin_init_ring(dev);
|
||||
if (ret) {
|
||||
free_irq(dev->irq, dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
iowrite32(yp->rx_ring_dma, ioaddr + RxPtr);
|
||||
iowrite32(yp->tx_ring_dma, ioaddr + TxPtr);
|
||||
|
|
@ -725,10 +730,10 @@ static void yellowfin_tx_timeout(struct net_device *dev)
|
|||
}
|
||||
|
||||
/* Initialize the Rx and Tx rings, along with various 'dev' bits. */
|
||||
static void yellowfin_init_ring(struct net_device *dev)
|
||||
static int yellowfin_init_ring(struct net_device *dev)
|
||||
{
|
||||
struct yellowfin_private *yp = netdev_priv(dev);
|
||||
int i;
|
||||
int i, j;
|
||||
|
||||
yp->tx_full = 0;
|
||||
yp->cur_rx = yp->cur_tx = 0;
|
||||
|
|
@ -753,6 +758,11 @@ static void yellowfin_init_ring(struct net_device *dev)
|
|||
yp->rx_ring[i].addr = cpu_to_le32(pci_map_single(yp->pci_dev,
|
||||
skb->data, yp->rx_buf_sz, PCI_DMA_FROMDEVICE));
|
||||
}
|
||||
if (i != RX_RING_SIZE) {
|
||||
for (j = 0; j < i; j++)
|
||||
dev_kfree_skb(yp->rx_skbuff[j]);
|
||||
return -ENOMEM;
|
||||
}
|
||||
yp->rx_ring[i-1].dbdma_cmd = cpu_to_le32(CMD_STOP);
|
||||
yp->dirty_rx = (unsigned int)(i - RX_RING_SIZE);
|
||||
|
||||
|
|
@ -769,8 +779,6 @@ static void yellowfin_init_ring(struct net_device *dev)
|
|||
yp->tx_ring[--i].dbdma_cmd = cpu_to_le32(CMD_STOP | BRANCH_ALWAYS);
|
||||
#else
|
||||
{
|
||||
int j;
|
||||
|
||||
/* Tx ring needs a pair of descriptors, the second for the status. */
|
||||
for (i = 0; i < TX_RING_SIZE; i++) {
|
||||
j = 2*i;
|
||||
|
|
@ -805,7 +813,7 @@ static void yellowfin_init_ring(struct net_device *dev)
|
|||
}
|
||||
#endif
|
||||
yp->tx_tail_desc = &yp->tx_status[0];
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
|
|
|
|||
|
|
@ -120,6 +120,9 @@ static int __devinit zorro8390_init_one(struct zorro_dev *z,
|
|||
for (i = ARRAY_SIZE(cards)-1; i >= 0; i--)
|
||||
if (z->id == cards[i].id)
|
||||
break;
|
||||
if (i < 0)
|
||||
return -ENODEV;
|
||||
|
||||
board = z->resource.start;
|
||||
ioaddr = board+cards[i].offset;
|
||||
dev = alloc_ei_netdev();
|
||||
|
|
|
|||
Loading…
Reference in a new issue