Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/bnx2x/bnx2x.h drivers/net/wireless/iwlwifi/iwl-1000.c drivers/net/wireless/iwlwifi/iwl-6000.c drivers/net/wireless/iwlwifi/iwl-core.h drivers/vhost/vhost.c
This commit is contained in:
commit
b4aa9e05a6
70 changed files with 458 additions and 202 deletions
|
@ -5943,7 +5943,6 @@ F: include/linux/tty.h
|
|||
|
||||
TULIP NETWORK DRIVERS
|
||||
M: Grant Grundler <grundler@parisc-linux.org>
|
||||
M: Kyle McMartin <kyle@mcmartin.ca>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/tulip/
|
||||
|
|
|
@ -154,7 +154,7 @@ static int __init adummy_init(void)
|
|||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
atm_dev = atm_dev_register(DEV_LABEL, &adummy_ops, -1, NULL);
|
||||
atm_dev = atm_dev_register(DEV_LABEL, NULL, &adummy_ops, -1, NULL);
|
||||
if (!atm_dev) {
|
||||
printk(KERN_ERR DEV_LABEL ": atm_dev_register() failed\n");
|
||||
err = -ENODEV;
|
||||
|
|
|
@ -2244,7 +2244,8 @@ static int __devinit amb_probe(struct pci_dev *pci_dev, const struct pci_device_
|
|||
goto out_reset;
|
||||
}
|
||||
|
||||
dev->atm_dev = atm_dev_register (DEV_LABEL, &amb_ops, -1, NULL);
|
||||
dev->atm_dev = atm_dev_register (DEV_LABEL, &pci_dev->dev, &amb_ops, -1,
|
||||
NULL);
|
||||
if (!dev->atm_dev) {
|
||||
PRINTD (DBG_ERR, "failed to register Madge ATM adapter");
|
||||
err = -EINVAL;
|
||||
|
|
|
@ -366,7 +366,7 @@ static int atmtcp_create(int itf,int persist,struct atm_dev **result)
|
|||
if (!dev_data)
|
||||
return -ENOMEM;
|
||||
|
||||
dev = atm_dev_register(DEV_LABEL,&atmtcp_v_dev_ops,itf,NULL);
|
||||
dev = atm_dev_register(DEV_LABEL,NULL,&atmtcp_v_dev_ops,itf,NULL);
|
||||
if (!dev) {
|
||||
kfree(dev_data);
|
||||
return itf == -1 ? -ENOMEM : -EBUSY;
|
||||
|
|
|
@ -2244,7 +2244,7 @@ static int __devinit eni_init_one(struct pci_dev *pci_dev,
|
|||
&zeroes);
|
||||
if (!cpu_zeroes) goto out1;
|
||||
}
|
||||
dev = atm_dev_register(DEV_LABEL,&ops,-1,NULL);
|
||||
dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &ops, -1, NULL);
|
||||
if (!dev) goto out2;
|
||||
pci_set_drvdata(pci_dev, dev);
|
||||
eni_dev->pci_dev = pci_dev;
|
||||
|
|
|
@ -1911,7 +1911,7 @@ static int __devinit firestream_init_one (struct pci_dev *pci_dev,
|
|||
fs_dev, sizeof (struct fs_dev));
|
||||
if (!fs_dev)
|
||||
goto err_out;
|
||||
atm_dev = atm_dev_register("fs", &ops, -1, NULL);
|
||||
atm_dev = atm_dev_register("fs", &pci_dev->dev, &ops, -1, NULL);
|
||||
if (!atm_dev)
|
||||
goto err_out_free_fs_dev;
|
||||
|
||||
|
|
|
@ -2567,14 +2567,14 @@ fore200e_load_and_start_fw(struct fore200e* fore200e)
|
|||
|
||||
|
||||
static int __devinit
|
||||
fore200e_register(struct fore200e* fore200e)
|
||||
fore200e_register(struct fore200e* fore200e, struct device *parent)
|
||||
{
|
||||
struct atm_dev* atm_dev;
|
||||
|
||||
DPRINTK(2, "device %s being registered\n", fore200e->name);
|
||||
|
||||
atm_dev = atm_dev_register(fore200e->bus->proc_name, &fore200e_ops, -1,
|
||||
NULL);
|
||||
atm_dev = atm_dev_register(fore200e->bus->proc_name, parent, &fore200e_ops,
|
||||
-1, NULL);
|
||||
if (atm_dev == NULL) {
|
||||
printk(FORE200E "unable to register device %s\n", fore200e->name);
|
||||
return -ENODEV;
|
||||
|
@ -2594,9 +2594,9 @@ fore200e_register(struct fore200e* fore200e)
|
|||
|
||||
|
||||
static int __devinit
|
||||
fore200e_init(struct fore200e* fore200e)
|
||||
fore200e_init(struct fore200e* fore200e, struct device *parent)
|
||||
{
|
||||
if (fore200e_register(fore200e) < 0)
|
||||
if (fore200e_register(fore200e, parent) < 0)
|
||||
return -ENODEV;
|
||||
|
||||
if (fore200e->bus->configure(fore200e) < 0)
|
||||
|
@ -2662,7 +2662,7 @@ static int __devinit fore200e_sba_probe(struct platform_device *op,
|
|||
|
||||
sprintf(fore200e->name, "%s-%d", bus->model_name, index);
|
||||
|
||||
err = fore200e_init(fore200e);
|
||||
err = fore200e_init(fore200e, &op->dev);
|
||||
if (err < 0) {
|
||||
fore200e_shutdown(fore200e);
|
||||
kfree(fore200e);
|
||||
|
@ -2740,7 +2740,7 @@ fore200e_pca_detect(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent
|
|||
|
||||
sprintf(fore200e->name, "%s-%d", bus->model_name, index);
|
||||
|
||||
err = fore200e_init(fore200e);
|
||||
err = fore200e_init(fore200e, &pci_dev->dev);
|
||||
if (err < 0) {
|
||||
fore200e_shutdown(fore200e);
|
||||
goto out_free;
|
||||
|
|
|
@ -366,7 +366,7 @@ he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
|
|||
goto init_one_failure;
|
||||
}
|
||||
|
||||
atm_dev = atm_dev_register(DEV_LABEL, &he_ops, -1, NULL);
|
||||
atm_dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &he_ops, -1, NULL);
|
||||
if (!atm_dev) {
|
||||
err = -ENODEV;
|
||||
goto init_one_failure;
|
||||
|
|
|
@ -2733,7 +2733,8 @@ static int __devinit hrz_probe(struct pci_dev *pci_dev, const struct pci_device_
|
|||
PRINTD(DBG_INFO, "found Madge ATM adapter (hrz) at: IO %x, IRQ %u, MEM %p",
|
||||
iobase, irq, membase);
|
||||
|
||||
dev->atm_dev = atm_dev_register(DEV_LABEL, &hrz_ops, -1, NULL);
|
||||
dev->atm_dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &hrz_ops, -1,
|
||||
NULL);
|
||||
if (!(dev->atm_dev)) {
|
||||
PRINTD(DBG_ERR, "failed to register Madge ATM adapter");
|
||||
err = -EINVAL;
|
||||
|
|
|
@ -3698,7 +3698,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
|
|||
goto err_out_iounmap;
|
||||
}
|
||||
|
||||
dev = atm_dev_register("idt77252", &idt77252_ops, -1, NULL);
|
||||
dev = atm_dev_register("idt77252", &pcidev->dev, &idt77252_ops, -1,
|
||||
NULL);
|
||||
if (!dev) {
|
||||
printk("%s: can't register atm device\n", card->name);
|
||||
err = -EIO;
|
||||
|
|
|
@ -3172,7 +3172,7 @@ static int __devinit ia_init_one(struct pci_dev *pdev,
|
|||
ret = -ENODEV;
|
||||
goto err_out_free_iadev;
|
||||
}
|
||||
dev = atm_dev_register(DEV_LABEL, &ops, -1, NULL);
|
||||
dev = atm_dev_register(DEV_LABEL, &pdev->dev, &ops, -1, NULL);
|
||||
if (!dev) {
|
||||
ret = -ENOMEM;
|
||||
goto err_out_disable_dev;
|
||||
|
|
|
@ -2588,7 +2588,7 @@ static int __devinit lanai_init_one(struct pci_dev *pci,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
atmdev = atm_dev_register(DEV_LABEL, &ops, -1, NULL);
|
||||
atmdev = atm_dev_register(DEV_LABEL, &pci->dev, &ops, -1, NULL);
|
||||
if (atmdev == NULL) {
|
||||
printk(KERN_ERR DEV_LABEL
|
||||
": couldn't register atm device!\n");
|
||||
|
|
|
@ -771,7 +771,8 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
|
|||
}
|
||||
|
||||
/* Register device */
|
||||
card->atmdev = atm_dev_register("nicstar", &atm_ops, -1, NULL);
|
||||
card->atmdev = atm_dev_register("nicstar", &card->pcidev->dev, &atm_ops,
|
||||
-1, NULL);
|
||||
if (card->atmdev == NULL) {
|
||||
printk("nicstar%d: can't register device.\n", i);
|
||||
error = 17;
|
||||
|
|
|
@ -166,7 +166,7 @@ static irqreturn_t solos_irq(int irq, void *dev_id);
|
|||
static struct atm_vcc* find_vcc(struct atm_dev *dev, short vpi, int vci);
|
||||
static int list_vccs(int vci);
|
||||
static void release_vccs(struct atm_dev *dev);
|
||||
static int atm_init(struct solos_card *);
|
||||
static int atm_init(struct solos_card *, struct device *);
|
||||
static void atm_remove(struct solos_card *);
|
||||
static int send_command(struct solos_card *card, int dev, const char *buf, size_t size);
|
||||
static void solos_bh(unsigned long);
|
||||
|
@ -1210,7 +1210,7 @@ static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
if (db_firmware_upgrade)
|
||||
flash_upgrade(card, 3);
|
||||
|
||||
err = atm_init(card);
|
||||
err = atm_init(card, &dev->dev);
|
||||
if (err)
|
||||
goto out_free_irq;
|
||||
|
||||
|
@ -1233,7 +1233,7 @@ static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
return err;
|
||||
}
|
||||
|
||||
static int atm_init(struct solos_card *card)
|
||||
static int atm_init(struct solos_card *card, struct device *parent)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -1244,7 +1244,7 @@ static int atm_init(struct solos_card *card)
|
|||
skb_queue_head_init(&card->tx_queue[i]);
|
||||
skb_queue_head_init(&card->cli_queue[i]);
|
||||
|
||||
card->atmdev[i] = atm_dev_register("solos-pci", &fpga_ops, -1, NULL);
|
||||
card->atmdev[i] = atm_dev_register("solos-pci", parent, &fpga_ops, -1, NULL);
|
||||
if (!card->atmdev[i]) {
|
||||
dev_err(&card->dev->dev, "Could not register ATM device %d\n", i);
|
||||
atm_remove(card);
|
||||
|
|
|
@ -1597,7 +1597,7 @@ static int __devinit zatm_init_one(struct pci_dev *pci_dev,
|
|||
goto out;
|
||||
}
|
||||
|
||||
dev = atm_dev_register(DEV_LABEL, &ops, -1, NULL);
|
||||
dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &ops, -1, NULL);
|
||||
if (!dev)
|
||||
goto out_free;
|
||||
|
||||
|
|
|
@ -311,8 +311,10 @@ static void hci_uart_tty_close(struct tty_struct *tty)
|
|||
|
||||
if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) {
|
||||
hu->proto->close(hu);
|
||||
hci_unregister_dev(hdev);
|
||||
hci_free_dev(hdev);
|
||||
if (hdev) {
|
||||
hci_unregister_dev(hdev);
|
||||
hci_free_dev(hdev);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
|
||||
MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector.");
|
||||
MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_CONNECTOR);
|
||||
|
||||
static struct cn_dev cdev;
|
||||
|
||||
|
|
|
@ -242,7 +242,7 @@ struct be_adapter {
|
|||
u8 __iomem *db; /* Door Bell */
|
||||
u8 __iomem *pcicfg; /* PCI config space */
|
||||
|
||||
spinlock_t mbox_lock; /* For serializing mbox cmds to BE card */
|
||||
struct mutex mbox_lock; /* For serializing mbox cmds to BE card */
|
||||
struct be_dma_mem mbox_mem;
|
||||
/* Mbox mem is adjusted to align to 16 bytes. The allocated addr
|
||||
* is stored for freeing purpose */
|
||||
|
|
|
@ -467,7 +467,8 @@ int be_cmd_fw_init(struct be_adapter *adapter)
|
|||
u8 *wrb;
|
||||
int status;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = (u8 *)wrb_from_mbox(adapter);
|
||||
*wrb++ = 0xFF;
|
||||
|
@ -481,7 +482,7 @@ int be_cmd_fw_init(struct be_adapter *adapter)
|
|||
|
||||
status = be_mbox_notify_wait(adapter);
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -496,7 +497,8 @@ int be_cmd_fw_clean(struct be_adapter *adapter)
|
|||
if (adapter->eeh_err)
|
||||
return -EIO;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = (u8 *)wrb_from_mbox(adapter);
|
||||
*wrb++ = 0xFF;
|
||||
|
@ -510,7 +512,7 @@ int be_cmd_fw_clean(struct be_adapter *adapter)
|
|||
|
||||
status = be_mbox_notify_wait(adapter);
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
return status;
|
||||
}
|
||||
int be_cmd_eq_create(struct be_adapter *adapter,
|
||||
|
@ -521,7 +523,8 @@ int be_cmd_eq_create(struct be_adapter *adapter,
|
|||
struct be_dma_mem *q_mem = &eq->dma_mem;
|
||||
int status;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
@ -551,7 +554,7 @@ int be_cmd_eq_create(struct be_adapter *adapter,
|
|||
eq->created = true;
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -563,7 +566,8 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
|
|||
struct be_cmd_req_mac_query *req;
|
||||
int status;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
@ -588,7 +592,7 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
|
|||
memcpy(mac_addr, resp->mac.addr, ETH_ALEN);
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -672,7 +676,8 @@ int be_cmd_cq_create(struct be_adapter *adapter,
|
|||
void *ctxt;
|
||||
int status;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
@ -726,7 +731,7 @@ int be_cmd_cq_create(struct be_adapter *adapter,
|
|||
cq->created = true;
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -749,7 +754,8 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
|
|||
void *ctxt;
|
||||
int status;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
@ -793,7 +799,7 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
|
|||
mccq->id = le16_to_cpu(resp->id);
|
||||
mccq->created = true;
|
||||
}
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -808,7 +814,8 @@ int be_cmd_txq_create(struct be_adapter *adapter,
|
|||
void *ctxt;
|
||||
int status;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
@ -840,7 +847,7 @@ int be_cmd_txq_create(struct be_adapter *adapter,
|
|||
txq->created = true;
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -855,7 +862,8 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
|
|||
struct be_dma_mem *q_mem = &rxq->dma_mem;
|
||||
int status;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
@ -882,7 +890,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
|
|||
*rss_id = resp->rss_id;
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -901,7 +909,8 @@ int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q,
|
|||
if (adapter->eeh_err)
|
||||
return -EIO;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
@ -938,7 +947,7 @@ int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q,
|
|||
|
||||
status = be_mbox_notify_wait(adapter);
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -954,7 +963,8 @@ int be_cmd_if_create(struct be_adapter *adapter, u32 cap_flags, u32 en_flags,
|
|||
struct be_cmd_req_if_create *req;
|
||||
int status;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
@ -980,7 +990,7 @@ int be_cmd_if_create(struct be_adapter *adapter, u32 cap_flags, u32 en_flags,
|
|||
*pmac_id = le32_to_cpu(resp->pmac_id);
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -994,7 +1004,8 @@ int be_cmd_if_destroy(struct be_adapter *adapter, u32 interface_id)
|
|||
if (adapter->eeh_err)
|
||||
return -EIO;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
@ -1009,7 +1020,7 @@ int be_cmd_if_destroy(struct be_adapter *adapter, u32 interface_id)
|
|||
|
||||
status = be_mbox_notify_wait(adapter);
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -1099,7 +1110,8 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver)
|
|||
struct be_cmd_req_get_fw_version *req;
|
||||
int status;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
@ -1116,7 +1128,7 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver)
|
|||
strncpy(fw_ver, resp->firmware_version_string, FW_VER_LEN);
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -1361,7 +1373,8 @@ int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num,
|
|||
struct be_cmd_req_query_fw_cfg *req;
|
||||
int status;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
@ -1380,7 +1393,7 @@ int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num,
|
|||
*caps = le32_to_cpu(resp->function_caps);
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -1391,7 +1404,8 @@ int be_cmd_reset_function(struct be_adapter *adapter)
|
|||
struct be_cmd_req_hdr *req;
|
||||
int status;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
@ -1404,7 +1418,7 @@ int be_cmd_reset_function(struct be_adapter *adapter)
|
|||
|
||||
status = be_mbox_notify_wait(adapter);
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -1415,7 +1429,8 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable, u16 table_size)
|
|||
u32 myhash[10];
|
||||
int status;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||
return -1;
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
@ -1435,7 +1450,7 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable, u16 table_size)
|
|||
|
||||
status = be_mbox_notify_wait(adapter);
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
mutex_unlock(&adapter->mbox_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
|
@ -2746,7 +2746,7 @@ static int be_ctrl_init(struct be_adapter *adapter)
|
|||
}
|
||||
memset(mc_cmd_mem->va, 0, mc_cmd_mem->size);
|
||||
|
||||
spin_lock_init(&adapter->mbox_lock);
|
||||
mutex_init(&adapter->mbox_lock);
|
||||
spin_lock_init(&adapter->mcc_lock);
|
||||
spin_lock_init(&adapter->mcc_cq_lock);
|
||||
|
||||
|
|
|
@ -88,7 +88,12 @@ static void bond_na_send(struct net_device *slave_dev,
|
|||
}
|
||||
|
||||
if (vlan_id) {
|
||||
skb = vlan_put_tag(skb, vlan_id);
|
||||
/* The Ethernet header is not present yet, so it is
|
||||
* too early to insert a VLAN tag. Force use of an
|
||||
* out-of-line tag here and let dev_hard_start_xmit()
|
||||
* insert it if the slave hardware can't.
|
||||
*/
|
||||
skb = __vlan_hwaccel_put_tag(skb, vlan_id);
|
||||
if (!skb) {
|
||||
pr_err("failed to insert VLAN tag\n");
|
||||
return;
|
||||
|
|
|
@ -171,7 +171,7 @@ MODULE_PARM_DESC(resend_igmp, "Number of IGMP membership reports to send on link
|
|||
/*----------------------------- Global variables ----------------------------*/
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
cpumask_var_t netpoll_block_tx;
|
||||
atomic_t netpoll_block_tx = ATOMIC_INIT(0);
|
||||
#endif
|
||||
|
||||
static const char * const version =
|
||||
|
@ -418,36 +418,11 @@ struct vlan_entry *bond_next_vlan(struct bonding *bond, struct vlan_entry *curr)
|
|||
* @bond: bond device that got this skb for tx.
|
||||
* @skb: hw accel VLAN tagged skb to transmit
|
||||
* @slave_dev: slave that is supposed to xmit this skbuff
|
||||
*
|
||||
* When the bond gets an skb to transmit that is
|
||||
* already hardware accelerated VLAN tagged, and it
|
||||
* needs to relay this skb to a slave that is not
|
||||
* hw accel capable, the skb needs to be "unaccelerated",
|
||||
* i.e. strip the hwaccel tag and re-insert it as part
|
||||
* of the payload.
|
||||
*/
|
||||
int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb,
|
||||
struct net_device *slave_dev)
|
||||
{
|
||||
unsigned short uninitialized_var(vlan_id);
|
||||
|
||||
/* Test vlan_list not vlgrp to catch and handle 802.1p tags */
|
||||
if (!list_empty(&bond->vlan_list) &&
|
||||
!(slave_dev->features & NETIF_F_HW_VLAN_TX) &&
|
||||
vlan_get_tag(skb, &vlan_id) == 0) {
|
||||
skb->dev = slave_dev;
|
||||
skb = vlan_put_tag(skb, vlan_id);
|
||||
if (!skb) {
|
||||
/* vlan_put_tag() frees the skb in case of error,
|
||||
* so return success here so the calling functions
|
||||
* won't attempt to free is again.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
skb->dev = slave_dev;
|
||||
}
|
||||
|
||||
skb->dev = slave_dev;
|
||||
skb->priority = 1;
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
if (unlikely(bond->dev->priv_flags & IFF_IN_NETPOLL)) {
|
||||
|
@ -1197,11 +1172,13 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
|
|||
bond_do_fail_over_mac(bond, new_active,
|
||||
old_active);
|
||||
|
||||
bond->send_grat_arp = bond->params.num_grat_arp;
|
||||
bond_send_gratuitous_arp(bond);
|
||||
if (netif_running(bond->dev)) {
|
||||
bond->send_grat_arp = bond->params.num_grat_arp;
|
||||
bond_send_gratuitous_arp(bond);
|
||||
|
||||
bond->send_unsol_na = bond->params.num_unsol_na;
|
||||
bond_send_unsolicited_na(bond);
|
||||
bond->send_unsol_na = bond->params.num_unsol_na;
|
||||
bond_send_unsolicited_na(bond);
|
||||
}
|
||||
|
||||
write_unlock_bh(&bond->curr_slave_lock);
|
||||
read_unlock(&bond->lock);
|
||||
|
@ -1215,8 +1192,9 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
|
|||
|
||||
/* resend IGMP joins since active slave has changed or
|
||||
* all were sent on curr_active_slave */
|
||||
if ((USES_PRIMARY(bond->params.mode) && new_active) ||
|
||||
bond->params.mode == BOND_MODE_ROUNDROBIN) {
|
||||
if (((USES_PRIMARY(bond->params.mode) && new_active) ||
|
||||
bond->params.mode == BOND_MODE_ROUNDROBIN) &&
|
||||
netif_running(bond->dev)) {
|
||||
bond->igmp_retrans = bond->params.resend_igmp;
|
||||
queue_delayed_work(bond->wq, &bond->mcast_work, 0);
|
||||
}
|
||||
|
@ -5299,13 +5277,6 @@ static int __init bonding_init(void)
|
|||
if (res)
|
||||
goto out;
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
if (!alloc_cpumask_var(&netpoll_block_tx, GFP_KERNEL)) {
|
||||
res = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
#endif
|
||||
|
||||
res = register_pernet_subsys(&bond_net_ops);
|
||||
if (res)
|
||||
goto out;
|
||||
|
@ -5335,9 +5306,6 @@ static int __init bonding_init(void)
|
|||
rtnl_link_unregister(&bond_link_ops);
|
||||
err_link:
|
||||
unregister_pernet_subsys(&bond_net_ops);
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
free_cpumask_var(netpoll_block_tx);
|
||||
#endif
|
||||
goto out;
|
||||
|
||||
}
|
||||
|
@ -5355,7 +5323,10 @@ static void __exit bonding_exit(void)
|
|||
unregister_pernet_subsys(&bond_net_ops);
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
free_cpumask_var(netpoll_block_tx);
|
||||
/*
|
||||
* Make sure we don't have an imbalance on our netpoll blocking
|
||||
*/
|
||||
WARN_ON(atomic_read(&netpoll_block_tx));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -119,26 +119,22 @@
|
|||
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
extern cpumask_var_t netpoll_block_tx;
|
||||
extern atomic_t netpoll_block_tx;
|
||||
|
||||
static inline void block_netpoll_tx(void)
|
||||
{
|
||||
preempt_disable();
|
||||
BUG_ON(cpumask_test_and_set_cpu(smp_processor_id(),
|
||||
netpoll_block_tx));
|
||||
atomic_inc(&netpoll_block_tx);
|
||||
}
|
||||
|
||||
static inline void unblock_netpoll_tx(void)
|
||||
{
|
||||
BUG_ON(!cpumask_test_and_clear_cpu(smp_processor_id(),
|
||||
netpoll_block_tx));
|
||||
preempt_enable();
|
||||
atomic_dec(&netpoll_block_tx);
|
||||
}
|
||||
|
||||
static inline int is_netpoll_tx_blocked(struct net_device *dev)
|
||||
{
|
||||
if (unlikely(dev->priv_flags & IFF_IN_NETPOLL))
|
||||
return cpumask_test_cpu(smp_processor_id(), netpoll_block_tx);
|
||||
return atomic_read(&netpoll_block_tx);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
|
@ -277,11 +273,11 @@ static inline struct slave *bond_get_slave_by_dev(struct bonding *bond, struct n
|
|||
|
||||
bond_for_each_slave(bond, slave, i) {
|
||||
if (slave->dev == slave_dev) {
|
||||
break;
|
||||
return slave;
|
||||
}
|
||||
}
|
||||
|
||||
return slave;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline struct bonding *bond_get_bond_by_slave(struct slave *slave)
|
||||
|
|
|
@ -2278,6 +2278,7 @@ static void __devinit cfg_queues(struct adapter *adapter)
|
|||
{
|
||||
struct sge *s = &adapter->sge;
|
||||
int q10g, n10g, qidx, pidx, qs;
|
||||
size_t iqe_size;
|
||||
|
||||
/*
|
||||
* We should not be called till we know how many Queue Sets we can
|
||||
|
@ -2321,6 +2322,13 @@ static void __devinit cfg_queues(struct adapter *adapter)
|
|||
}
|
||||
s->ethqsets = qidx;
|
||||
|
||||
/*
|
||||
* The Ingress Queue Entry Size for our various Response Queues needs
|
||||
* to be big enough to accommodate the largest message we can receive
|
||||
* from the chip/firmware; which is 64 bytes ...
|
||||
*/
|
||||
iqe_size = 64;
|
||||
|
||||
/*
|
||||
* Set up default Queue Set parameters ... Start off with the
|
||||
* shortest interrupt holdoff timer.
|
||||
|
@ -2329,7 +2337,7 @@ static void __devinit cfg_queues(struct adapter *adapter)
|
|||
struct sge_eth_rxq *rxq = &s->ethrxq[qs];
|
||||
struct sge_eth_txq *txq = &s->ethtxq[qs];
|
||||
|
||||
init_rspq(&rxq->rspq, 0, 0, 1024, L1_CACHE_BYTES);
|
||||
init_rspq(&rxq->rspq, 0, 0, 1024, iqe_size);
|
||||
rxq->fl.size = 72;
|
||||
txq->q.size = 1024;
|
||||
}
|
||||
|
@ -2338,8 +2346,7 @@ static void __devinit cfg_queues(struct adapter *adapter)
|
|||
* The firmware event queue is used for link state changes and
|
||||
* notifications of TX DMA completions.
|
||||
*/
|
||||
init_rspq(&s->fw_evtq, SGE_TIMER_RSTRT_CNTR, 0, 512,
|
||||
L1_CACHE_BYTES);
|
||||
init_rspq(&s->fw_evtq, SGE_TIMER_RSTRT_CNTR, 0, 512, iqe_size);
|
||||
|
||||
/*
|
||||
* The forwarded interrupt queue is used when we're in MSI interrupt
|
||||
|
@ -2355,7 +2362,7 @@ static void __devinit cfg_queues(struct adapter *adapter)
|
|||
* any time ...
|
||||
*/
|
||||
init_rspq(&s->intrq, SGE_TIMER_RSTRT_CNTR, 0, MSIX_ENTRIES + 1,
|
||||
L1_CACHE_BYTES);
|
||||
iqe_size);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -2098,7 +2098,8 @@ static void enic_poll_controller(struct net_device *netdev)
|
|||
case VNIC_DEV_INTR_MODE_MSIX:
|
||||
for (i = 0; i < enic->rq_count; i++) {
|
||||
intr = enic_msix_rq_intr(enic, i);
|
||||
enic_isr_msix_rq(enic->msix_entry[intr].vector, enic);
|
||||
enic_isr_msix_rq(enic->msix_entry[intr].vector,
|
||||
&enic->napi[i]);
|
||||
}
|
||||
intr = enic_msix_wq_intr(enic, i);
|
||||
enic_isr_msix_wq(enic->msix_entry[intr].vector, enic);
|
||||
|
|
|
@ -690,6 +690,7 @@ static void block_output(struct net_device *dev, int count,
|
|||
static struct pcmcia_device_id axnet_ids[] = {
|
||||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x016c, 0x0081),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x018a, 0x0301),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x2328),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0301),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0303),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0309),
|
||||
|
|
|
@ -1493,7 +1493,6 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
|||
PCMCIA_DEVICE_MANF_CARD(0x0149, 0x4530),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x0149, 0xc1ab),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x0186, 0x0110),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x2328),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x8041),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x0213, 0x2452),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0300),
|
||||
|
|
|
@ -64,7 +64,7 @@ config BCM63XX_PHY
|
|||
config ICPLUS_PHY
|
||||
tristate "Drivers for ICPlus PHYs"
|
||||
---help---
|
||||
Currently supports the IP175C PHY.
|
||||
Currently supports the IP175C and IP1001 PHYs.
|
||||
|
||||
config REALTEK_PHY
|
||||
tristate "Drivers for Realtek PHYs"
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
#include <asm/irq.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
MODULE_DESCRIPTION("ICPlus IP175C PHY driver");
|
||||
MODULE_DESCRIPTION("ICPlus IP175C/IC1001 PHY drivers");
|
||||
MODULE_AUTHOR("Michael Barkowski");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
|
@ -89,6 +89,33 @@ static int ip175c_config_init(struct phy_device *phydev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ip1001_config_init(struct phy_device *phydev)
|
||||
{
|
||||
int err, value;
|
||||
|
||||
/* Software Reset PHY */
|
||||
value = phy_read(phydev, MII_BMCR);
|
||||
value |= BMCR_RESET;
|
||||
err = phy_write(phydev, MII_BMCR, value);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
do {
|
||||
value = phy_read(phydev, MII_BMCR);
|
||||
} while (value & BMCR_RESET);
|
||||
|
||||
/* Additional delay (2ns) used to adjust RX clock phase
|
||||
* at GMII/ RGMII interface */
|
||||
value = phy_read(phydev, 16);
|
||||
value |= 0x3;
|
||||
|
||||
err = phy_write(phydev, 16, value);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ip175c_read_status(struct phy_device *phydev)
|
||||
{
|
||||
if (phydev->addr == 4) /* WAN port */
|
||||
|
@ -121,21 +148,43 @@ static struct phy_driver ip175c_driver = {
|
|||
.driver = { .owner = THIS_MODULE,},
|
||||
};
|
||||
|
||||
static int __init ip175c_init(void)
|
||||
static struct phy_driver ip1001_driver = {
|
||||
.phy_id = 0x02430d90,
|
||||
.name = "ICPlus IP1001",
|
||||
.phy_id_mask = 0x0ffffff0,
|
||||
.features = PHY_GBIT_FEATURES | SUPPORTED_Pause |
|
||||
SUPPORTED_Asym_Pause,
|
||||
.config_init = &ip1001_config_init,
|
||||
.config_aneg = &genphy_config_aneg,
|
||||
.read_status = &genphy_read_status,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
.driver = { .owner = THIS_MODULE,},
|
||||
};
|
||||
|
||||
static int __init icplus_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
ret = phy_driver_register(&ip1001_driver);
|
||||
if (ret < 0)
|
||||
return -ENODEV;
|
||||
|
||||
return phy_driver_register(&ip175c_driver);
|
||||
}
|
||||
|
||||
static void __exit ip175c_exit(void)
|
||||
static void __exit icplus_exit(void)
|
||||
{
|
||||
phy_driver_unregister(&ip1001_driver);
|
||||
phy_driver_unregister(&ip175c_driver);
|
||||
}
|
||||
|
||||
module_init(ip175c_init);
|
||||
module_exit(ip175c_exit);
|
||||
module_init(icplus_init);
|
||||
module_exit(icplus_exit);
|
||||
|
||||
static struct mdio_device_id __maybe_unused icplus_tbl[] = {
|
||||
{ 0x02430d80, 0x0ffffff0 },
|
||||
{ 0x02430d90, 0x0ffffff0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
@ -948,7 +948,7 @@ static int __pppoe_xmit(struct sock *sk, struct sk_buff *skb)
|
|||
|
||||
abort:
|
||||
kfree_skb(skb);
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
|
|
|
@ -2083,6 +2083,7 @@ struct ql_adapter {
|
|||
u32 mailbox_in;
|
||||
u32 mailbox_out;
|
||||
struct mbox_params idc_mbc;
|
||||
struct mutex mpi_mutex;
|
||||
|
||||
int tx_ring_size;
|
||||
int rx_ring_size;
|
||||
|
|
|
@ -4629,6 +4629,7 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
|
|||
INIT_DELAYED_WORK(&qdev->mpi_idc_work, ql_mpi_idc_work);
|
||||
INIT_DELAYED_WORK(&qdev->mpi_core_to_log, ql_mpi_core_to_log);
|
||||
init_completion(&qdev->ide_completion);
|
||||
mutex_init(&qdev->mpi_mutex);
|
||||
|
||||
if (!cards_found) {
|
||||
dev_info(&pdev->dev, "%s\n", DRV_STRING);
|
||||
|
|
|
@ -534,6 +534,7 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
|
|||
int status;
|
||||
unsigned long count;
|
||||
|
||||
mutex_lock(&qdev->mpi_mutex);
|
||||
|
||||
/* Begin polled mode for MPI */
|
||||
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
|
||||
|
@ -603,6 +604,7 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
|
|||
end:
|
||||
/* End polled mode for MPI */
|
||||
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI);
|
||||
mutex_unlock(&qdev->mpi_mutex);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -1099,9 +1101,7 @@ int ql_wait_fifo_empty(struct ql_adapter *qdev)
|
|||
static int ql_set_port_cfg(struct ql_adapter *qdev)
|
||||
{
|
||||
int status;
|
||||
rtnl_lock();
|
||||
status = ql_mb_set_port_cfg(qdev);
|
||||
rtnl_unlock();
|
||||
if (status)
|
||||
return status;
|
||||
status = ql_idc_wait(qdev);
|
||||
|
@ -1122,9 +1122,7 @@ void ql_mpi_port_cfg_work(struct work_struct *work)
|
|||
container_of(work, struct ql_adapter, mpi_port_cfg_work.work);
|
||||
int status;
|
||||
|
||||
rtnl_lock();
|
||||
status = ql_mb_get_port_cfg(qdev);
|
||||
rtnl_unlock();
|
||||
if (status) {
|
||||
netif_err(qdev, drv, qdev->ndev,
|
||||
"Bug: Failed to get port config data.\n");
|
||||
|
@ -1167,7 +1165,6 @@ void ql_mpi_idc_work(struct work_struct *work)
|
|||
u32 aen;
|
||||
int timeout;
|
||||
|
||||
rtnl_lock();
|
||||
aen = mbcp->mbox_out[1] >> 16;
|
||||
timeout = (mbcp->mbox_out[1] >> 8) & 0xf;
|
||||
|
||||
|
@ -1231,7 +1228,6 @@ void ql_mpi_idc_work(struct work_struct *work)
|
|||
}
|
||||
break;
|
||||
}
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
void ql_mpi_work(struct work_struct *work)
|
||||
|
@ -1242,7 +1238,7 @@ void ql_mpi_work(struct work_struct *work)
|
|||
struct mbox_params *mbcp = &mbc;
|
||||
int err = 0;
|
||||
|
||||
rtnl_lock();
|
||||
mutex_lock(&qdev->mpi_mutex);
|
||||
/* Begin polled mode for MPI */
|
||||
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
|
||||
|
||||
|
@ -1259,7 +1255,7 @@ void ql_mpi_work(struct work_struct *work)
|
|||
|
||||
/* End polled mode for MPI */
|
||||
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI);
|
||||
rtnl_unlock();
|
||||
mutex_unlock(&qdev->mpi_mutex);
|
||||
ql_enable_completion_interrupt(qdev, 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -744,26 +744,36 @@ static void rtl8169_xmii_reset_enable(void __iomem *ioaddr)
|
|||
mdio_write(ioaddr, MII_BMCR, val & 0xffff);
|
||||
}
|
||||
|
||||
static void rtl8169_check_link_status(struct net_device *dev,
|
||||
static void __rtl8169_check_link_status(struct net_device *dev,
|
||||
struct rtl8169_private *tp,
|
||||
void __iomem *ioaddr)
|
||||
void __iomem *ioaddr,
|
||||
bool pm)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&tp->lock, flags);
|
||||
if (tp->link_ok(ioaddr)) {
|
||||
/* This is to cancel a scheduled suspend if there's one. */
|
||||
pm_request_resume(&tp->pci_dev->dev);
|
||||
if (pm)
|
||||
pm_request_resume(&tp->pci_dev->dev);
|
||||
netif_carrier_on(dev);
|
||||
netif_info(tp, ifup, dev, "link up\n");
|
||||
} else {
|
||||
netif_carrier_off(dev);
|
||||
netif_info(tp, ifdown, dev, "link down\n");
|
||||
pm_schedule_suspend(&tp->pci_dev->dev, 100);
|
||||
if (pm)
|
||||
pm_schedule_suspend(&tp->pci_dev->dev, 100);
|
||||
}
|
||||
spin_unlock_irqrestore(&tp->lock, flags);
|
||||
}
|
||||
|
||||
static void rtl8169_check_link_status(struct net_device *dev,
|
||||
struct rtl8169_private *tp,
|
||||
void __iomem *ioaddr)
|
||||
{
|
||||
__rtl8169_check_link_status(dev, tp, ioaddr, false);
|
||||
}
|
||||
|
||||
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
|
||||
|
||||
static u32 __rtl8169_get_wol(struct rtl8169_private *tp)
|
||||
|
@ -4600,7 +4610,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
|
|||
}
|
||||
|
||||
if (status & LinkChg)
|
||||
rtl8169_check_link_status(dev, tp, ioaddr);
|
||||
__rtl8169_check_link_status(dev, tp, ioaddr, true);
|
||||
|
||||
/* We need to see the lastest version of tp->intr_mask to
|
||||
* avoid ignoring an MSI interrupt and having to wait for
|
||||
|
@ -4890,11 +4900,7 @@ static int rtl8169_runtime_idle(struct device *device)
|
|||
struct net_device *dev = pci_get_drvdata(pdev);
|
||||
struct rtl8169_private *tp = netdev_priv(dev);
|
||||
|
||||
if (!tp->TxDescArray)
|
||||
return 0;
|
||||
|
||||
rtl8169_check_link_status(dev, tp, tp->mmio_addr);
|
||||
return -EBUSY;
|
||||
return tp->TxDescArray ? -EBUSY : 0;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops rtl8169_pm_ops = {
|
||||
|
|
|
@ -324,7 +324,7 @@ static int bdx_fw_load(struct bdx_priv *priv)
|
|||
ENTER;
|
||||
master = READ_REG(priv, regINIT_SEMAPHORE);
|
||||
if (!READ_REG(priv, regINIT_STATUS) && master) {
|
||||
rc = request_firmware(&fw, "tehuti/firmware.bin", &priv->pdev->dev);
|
||||
rc = request_firmware(&fw, "tehuti/bdx.bin", &priv->pdev->dev);
|
||||
if (rc)
|
||||
goto out;
|
||||
bdx_tx_push_desc_safe(priv, (char *)fw->data, fw->size);
|
||||
|
@ -2510,4 +2510,4 @@ module_exit(bdx_module_exit);
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(BDX_DRV_DESC);
|
||||
MODULE_FIRMWARE("tehuti/firmware.bin");
|
||||
MODULE_FIRMWARE("tehuti/bdx.bin");
|
||||
|
|
|
@ -1507,6 +1507,10 @@ static const struct usb_device_id products [] = {
|
|||
// ASIX AX88178 10/100/1000
|
||||
USB_DEVICE (0x0b95, 0x1780),
|
||||
.driver_info = (unsigned long) &ax88178_info,
|
||||
}, {
|
||||
// Logitec LAN-GTJ/U2A
|
||||
USB_DEVICE (0x0789, 0x0160),
|
||||
.driver_info = (unsigned long) &ax88178_info,
|
||||
}, {
|
||||
// Linksys USB200M Rev 2
|
||||
USB_DEVICE (0x13b1, 0x0018),
|
||||
|
|
|
@ -958,10 +958,6 @@ static void packetizeRx(struct hso_net *odev, unsigned char *ip_pkt,
|
|||
/* Packet is complete. Inject into stack. */
|
||||
/* We have IP packet here */
|
||||
odev->skb_rx_buf->protocol = cpu_to_be16(ETH_P_IP);
|
||||
/* don't check it */
|
||||
odev->skb_rx_buf->ip_summed =
|
||||
CHECKSUM_UNNECESSARY;
|
||||
|
||||
skb_reset_mac_header(odev->skb_rx_buf);
|
||||
|
||||
/* Ship it off to the kernel */
|
||||
|
|
|
@ -166,7 +166,9 @@ static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
if (!(rcv->flags & IFF_UP))
|
||||
goto tx_drop;
|
||||
|
||||
if (dev->features & NETIF_F_NO_CSUM)
|
||||
/* don't change ip_summed == CHECKSUM_PARTIAL, as that
|
||||
will cause bad checksum on forwarded packets */
|
||||
if (skb->ip_summed == CHECKSUM_NONE)
|
||||
skb->ip_summed = rcv_priv->ip_summed;
|
||||
|
||||
length = skb->len + ETH_HLEN;
|
||||
|
|
|
@ -293,6 +293,7 @@ static inline void sca_tx_done(port_t *port)
|
|||
struct net_device *dev = port->netdev;
|
||||
card_t* card = port->card;
|
||||
u8 stat;
|
||||
unsigned count = 0;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
|
||||
|
@ -316,10 +317,12 @@ static inline void sca_tx_done(port_t *port)
|
|||
dev->stats.tx_bytes += readw(&desc->len);
|
||||
}
|
||||
writeb(0, &desc->stat); /* Free descriptor */
|
||||
count++;
|
||||
port->txlast = (port->txlast + 1) % card->tx_ring_buffers;
|
||||
}
|
||||
|
||||
netif_wake_queue(dev);
|
||||
if (count)
|
||||
netif_wake_queue(dev);
|
||||
spin_unlock(&port->lock);
|
||||
}
|
||||
|
||||
|
|
|
@ -311,6 +311,7 @@ struct iwl_cfg iwl100_bgn_cfg = {
|
|||
.base_params = &iwl1000_base_params,
|
||||
.ht_params = &iwl1000_ht_params,
|
||||
.led_mode = IWL_LED_RF_STATE,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl100_bg_cfg = {
|
||||
|
@ -324,6 +325,7 @@ struct iwl_cfg iwl100_bg_cfg = {
|
|||
.mod_params = &iwlagn_mod_params,
|
||||
.base_params = &iwl1000_base_params,
|
||||
.led_mode = IWL_LED_RF_STATE,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL1000_MODULE_FIRMWARE(IWL1000_UCODE_API_MAX));
|
||||
|
|
|
@ -564,6 +564,7 @@ struct iwl_cfg iwl6005_2agn_cfg = {
|
|||
.need_dc_calib = true,
|
||||
.need_temp_offset_calib = true,
|
||||
.led_mode = IWL_LED_RF_STATE,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6005_2abg_cfg = {
|
||||
|
@ -579,6 +580,7 @@ struct iwl_cfg iwl6005_2abg_cfg = {
|
|||
.need_dc_calib = true,
|
||||
.need_temp_offset_calib = true,
|
||||
.led_mode = IWL_LED_RF_STATE,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6005_2bg_cfg = {
|
||||
|
@ -594,6 +596,7 @@ struct iwl_cfg iwl6005_2bg_cfg = {
|
|||
.need_dc_calib = true,
|
||||
.need_temp_offset_calib = true,
|
||||
.led_mode = IWL_LED_RF_STATE,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6030_2agn_cfg = {
|
||||
|
@ -614,6 +617,7 @@ struct iwl_cfg iwl6030_2agn_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6030_2abg_cfg = {
|
||||
|
@ -633,6 +637,7 @@ struct iwl_cfg iwl6030_2abg_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6030_2bgn_cfg = {
|
||||
|
@ -653,6 +658,7 @@ struct iwl_cfg iwl6030_2bgn_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6030_2bg_cfg = {
|
||||
|
@ -672,6 +678,7 @@ struct iwl_cfg iwl6030_2bg_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl1030_bgn_cfg = {
|
||||
|
@ -692,6 +699,7 @@ struct iwl_cfg iwl1030_bgn_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl1030_bg_cfg = {
|
||||
|
@ -711,6 +719,7 @@ struct iwl_cfg iwl1030_bg_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -793,6 +802,7 @@ struct iwl_cfg iwl6150_bgn_cfg = {
|
|||
.ht_params = &iwl6000_ht_params,
|
||||
.need_dc_calib = true,
|
||||
.led_mode = IWL_LED_RF_STATE,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6050_2abg_cfg = {
|
||||
|
@ -841,6 +851,7 @@ struct iwl_cfg iwl130_bgn_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl130_bg_cfg = {
|
||||
|
@ -859,6 +870,7 @@ struct iwl_cfg iwl130_bg_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
|
||||
|
|
|
@ -433,7 +433,7 @@ static s8 iwl_update_channel_txpower(struct iwl_priv *priv,
|
|||
/**
|
||||
* iwlcore_eeprom_enhanced_txpower: process enhanced tx power info
|
||||
*/
|
||||
void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv)
|
||||
static void iwlcore_eeprom_enhanced_txpower_old(struct iwl_priv *priv)
|
||||
{
|
||||
int eeprom_section_count = 0;
|
||||
int section, element;
|
||||
|
@ -460,7 +460,8 @@ void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv)
|
|||
* always check for valid entry before process
|
||||
* the information
|
||||
*/
|
||||
if (!enhanced_txpower->common || enhanced_txpower->reserved)
|
||||
if (!(enhanced_txpower->flags || enhanced_txpower->channel) ||
|
||||
enhanced_txpower->delta_20_in_40)
|
||||
continue;
|
||||
|
||||
for (element = 0; element < eeprom_section_count; element++) {
|
||||
|
@ -493,3 +494,86 @@ void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
iwlcore_eeprom_enh_txp_read_element(struct iwl_priv *priv,
|
||||
struct iwl_eeprom_enhanced_txpwr *txp,
|
||||
s8 max_txpower_avg)
|
||||
{
|
||||
int ch_idx;
|
||||
bool is_ht40 = txp->flags & IWL_EEPROM_ENH_TXP_FL_40MHZ;
|
||||
enum ieee80211_band band;
|
||||
|
||||
band = txp->flags & IWL_EEPROM_ENH_TXP_FL_BAND_52G ?
|
||||
IEEE80211_BAND_5GHZ : IEEE80211_BAND_2GHZ;
|
||||
|
||||
for (ch_idx = 0; ch_idx < priv->channel_count; ch_idx++) {
|
||||
struct iwl_channel_info *ch_info = &priv->channel_info[ch_idx];
|
||||
|
||||
/* update matching channel or from common data only */
|
||||
if (txp->channel != 0 && ch_info->channel != txp->channel)
|
||||
continue;
|
||||
|
||||
/* update matching band only */
|
||||
if (band != ch_info->band)
|
||||
continue;
|
||||
|
||||
if (ch_info->max_power_avg < max_txpower_avg && !is_ht40) {
|
||||
ch_info->max_power_avg = max_txpower_avg;
|
||||
ch_info->curr_txpow = max_txpower_avg;
|
||||
ch_info->scan_power = max_txpower_avg;
|
||||
}
|
||||
|
||||
if (is_ht40 && ch_info->ht40_max_power_avg < max_txpower_avg)
|
||||
ch_info->ht40_max_power_avg = max_txpower_avg;
|
||||
}
|
||||
}
|
||||
|
||||
#define EEPROM_TXP_OFFS (0x00 | INDIRECT_ADDRESS | INDIRECT_TXP_LIMIT)
|
||||
#define EEPROM_TXP_ENTRY_LEN sizeof(struct iwl_eeprom_enhanced_txpwr)
|
||||
#define EEPROM_TXP_SZ_OFFS (0x00 | INDIRECT_ADDRESS | INDIRECT_TXP_LIMIT_SIZE)
|
||||
|
||||
static void iwlcore_eeprom_enhanced_txpower_new(struct iwl_priv *priv)
|
||||
{
|
||||
struct iwl_eeprom_enhanced_txpwr *txp_array, *txp;
|
||||
int idx, entries;
|
||||
__le16 *txp_len;
|
||||
s8 max_txp_avg, max_txp_avg_halfdbm;
|
||||
|
||||
BUILD_BUG_ON(sizeof(struct iwl_eeprom_enhanced_txpwr) != 8);
|
||||
|
||||
/* the length is in 16-bit words, but we want entries */
|
||||
txp_len = (__le16 *) iwlagn_eeprom_query_addr(priv, EEPROM_TXP_SZ_OFFS);
|
||||
entries = le16_to_cpup(txp_len) * 2 / EEPROM_TXP_ENTRY_LEN;
|
||||
|
||||
txp_array = (void *) iwlagn_eeprom_query_addr(priv, EEPROM_TXP_OFFS);
|
||||
for (idx = 0; idx < entries; idx++) {
|
||||
txp = &txp_array[idx];
|
||||
|
||||
/* skip invalid entries */
|
||||
if (!(txp->flags & IWL_EEPROM_ENH_TXP_FL_VALID))
|
||||
continue;
|
||||
|
||||
max_txp_avg = iwl_get_max_txpower_avg(priv, txp_array, idx,
|
||||
&max_txp_avg_halfdbm);
|
||||
|
||||
/*
|
||||
* Update the user limit values values to the highest
|
||||
* power supported by any channel
|
||||
*/
|
||||
if (max_txp_avg > priv->tx_power_user_lmt)
|
||||
priv->tx_power_user_lmt = max_txp_avg;
|
||||
if (max_txp_avg_halfdbm > priv->tx_power_lmt_in_half_dbm)
|
||||
priv->tx_power_lmt_in_half_dbm = max_txp_avg_halfdbm;
|
||||
|
||||
iwlcore_eeprom_enh_txp_read_element(priv, txp, max_txp_avg);
|
||||
}
|
||||
}
|
||||
|
||||
void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv)
|
||||
{
|
||||
if (priv->cfg->use_new_eeprom_reading)
|
||||
iwlcore_eeprom_enhanced_txpower_new(priv);
|
||||
else
|
||||
iwlcore_eeprom_enhanced_txpower_old(priv);
|
||||
}
|
||||
|
|
|
@ -568,6 +568,12 @@ static u32 eeprom_indirect_address(const struct iwl_priv *priv, u32 address)
|
|||
case INDIRECT_REGULATORY:
|
||||
offset = iwl_eeprom_query16(priv, EEPROM_LINK_REGULATORY);
|
||||
break;
|
||||
case INDIRECT_TXP_LIMIT:
|
||||
offset = iwl_eeprom_query16(priv, EEPROM_LINK_TXP_LIMIT);
|
||||
break;
|
||||
case INDIRECT_TXP_LIMIT_SIZE:
|
||||
offset = iwl_eeprom_query16(priv, EEPROM_LINK_TXP_LIMIT_SIZE);
|
||||
break;
|
||||
case INDIRECT_CALIBRATION:
|
||||
offset = iwl_eeprom_query16(priv, EEPROM_LINK_CALIBRATION);
|
||||
break;
|
||||
|
|
|
@ -412,6 +412,7 @@ struct iwl_cfg {
|
|||
u8 scan_tx_antennas[IEEE80211_NUM_BANDS];
|
||||
enum iwl_led_mode led_mode;
|
||||
const bool adv_pm;
|
||||
const bool use_new_eeprom_reading; /* temporary, remove later */
|
||||
};
|
||||
|
||||
/***************************
|
||||
|
|
|
@ -129,6 +129,17 @@ struct iwl_eeprom_channel {
|
|||
s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */
|
||||
} __packed;
|
||||
|
||||
enum iwl_eeprom_enhanced_txpwr_flags {
|
||||
IWL_EEPROM_ENH_TXP_FL_VALID = BIT(0),
|
||||
IWL_EEPROM_ENH_TXP_FL_BAND_52G = BIT(1),
|
||||
IWL_EEPROM_ENH_TXP_FL_OFDM = BIT(2),
|
||||
IWL_EEPROM_ENH_TXP_FL_40MHZ = BIT(3),
|
||||
IWL_EEPROM_ENH_TXP_FL_HT_AP = BIT(4),
|
||||
IWL_EEPROM_ENH_TXP_FL_RES1 = BIT(5),
|
||||
IWL_EEPROM_ENH_TXP_FL_RES2 = BIT(6),
|
||||
IWL_EEPROM_ENH_TXP_FL_COMMON_TYPE = BIT(7),
|
||||
};
|
||||
|
||||
/**
|
||||
* iwl_eeprom_enhanced_txpwr structure
|
||||
* This structure presents the enhanced regulatory tx power limit layout
|
||||
|
@ -136,21 +147,23 @@ struct iwl_eeprom_channel {
|
|||
* Enhanced regulatory tx power portion of eeprom image can be broken down
|
||||
* into individual structures; each one is 8 bytes in size and contain the
|
||||
* following information
|
||||
* @common: (desc + channel) not used by driver, should _NOT_ be "zero"
|
||||
* @flags: entry flags
|
||||
* @channel: channel number
|
||||
* @chain_a_max_pwr: chain a max power in 1/2 dBm
|
||||
* @chain_b_max_pwr: chain b max power in 1/2 dBm
|
||||
* @chain_c_max_pwr: chain c max power in 1/2 dBm
|
||||
* @reserved: not used, should be "zero"
|
||||
* @delta_20_in_40: 20-in-40 deltas (hi/lo)
|
||||
* @mimo2_max_pwr: mimo2 max power in 1/2 dBm
|
||||
* @mimo3_max_pwr: mimo3 max power in 1/2 dBm
|
||||
*
|
||||
*/
|
||||
struct iwl_eeprom_enhanced_txpwr {
|
||||
__le16 common;
|
||||
u8 flags;
|
||||
u8 channel;
|
||||
s8 chain_a_max;
|
||||
s8 chain_b_max;
|
||||
s8 chain_c_max;
|
||||
s8 reserved;
|
||||
u8 delta_20_in_40;
|
||||
s8 mimo2_max;
|
||||
s8 mimo3_max;
|
||||
} __packed;
|
||||
|
@ -195,6 +208,8 @@ struct iwl_eeprom_enhanced_txpwr {
|
|||
#define EEPROM_LINK_CALIBRATION (2*0x67)
|
||||
#define EEPROM_LINK_PROCESS_ADJST (2*0x68)
|
||||
#define EEPROM_LINK_OTHERS (2*0x69)
|
||||
#define EEPROM_LINK_TXP_LIMIT (2*0x6a)
|
||||
#define EEPROM_LINK_TXP_LIMIT_SIZE (2*0x6b)
|
||||
|
||||
/* agn regulatory - indirect access */
|
||||
#define EEPROM_REG_BAND_1_CHANNELS ((0x08)\
|
||||
|
@ -398,6 +413,8 @@ struct iwl_eeprom_calib_info {
|
|||
#define INDIRECT_CALIBRATION 0x00040000
|
||||
#define INDIRECT_PROCESS_ADJST 0x00050000
|
||||
#define INDIRECT_OTHERS 0x00060000
|
||||
#define INDIRECT_TXP_LIMIT 0x00070000
|
||||
#define INDIRECT_TXP_LIMIT_SIZE 0x00080000
|
||||
#define INDIRECT_ADDRESS 0x00100000
|
||||
|
||||
/* General */
|
||||
|
|
|
@ -617,7 +617,7 @@ static int lbs_ret_scan(struct lbs_private *priv, unsigned long dummy,
|
|||
print_ssid(ssid_buf, ssid, ssid_len),
|
||||
LBS_SCAN_RSSI_TO_MBM(rssi)/100);
|
||||
|
||||
if (channel ||
|
||||
if (channel &&
|
||||
!(channel->flags & IEEE80211_CHAN_DISABLED))
|
||||
cfg80211_inform_bss(wiphy, channel,
|
||||
bssid, le64_to_cpu(*(__le64 *)tsfdesc),
|
||||
|
|
|
@ -43,6 +43,7 @@ MODULE_FIRMWARE("isl3887usb");
|
|||
|
||||
static struct usb_device_id p54u_table[] __devinitdata = {
|
||||
/* Version 1 devices (pci chip + net2280) */
|
||||
{USB_DEVICE(0x0411, 0x0050)}, /* Buffalo WLI2-USB2-G54 */
|
||||
{USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */
|
||||
{USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */
|
||||
{USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */
|
||||
|
@ -56,9 +57,13 @@ static struct usb_device_id p54u_table[] __devinitdata = {
|
|||
{USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */
|
||||
{USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */
|
||||
{USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */
|
||||
{USB_DEVICE(0x0db0, 0x6826)}, /* MSI UB54G (MS-6826) */
|
||||
{USB_DEVICE(0x107b, 0x55f2)}, /* Gateway WGU-210 (Gemtek) */
|
||||
{USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */
|
||||
{USB_DEVICE(0x1435, 0x0210)}, /* Inventel UR054G */
|
||||
{USB_DEVICE(0x15a9, 0x0002)}, /* Gemtek WUBI-100GW 802.11g */
|
||||
{USB_DEVICE(0x1630, 0x0005)}, /* 2Wire 802.11g USB (v1) / Z-Com */
|
||||
{USB_DEVICE(0x182d, 0x096b)}, /* Sitecom WL-107 */
|
||||
{USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */
|
||||
{USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */
|
||||
{USB_DEVICE(0x2001, 0x3701)}, /* DLink DWL-G120 Spinnaker */
|
||||
|
@ -94,6 +99,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
|
|||
{USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
|
||||
{USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */
|
||||
{USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
|
||||
{USB_DEVICE(0x2001, 0x3705)}, /* D-Link DWL-G120 rev C1 */
|
||||
{USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */
|
||||
{USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
|
||||
{USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */
|
||||
|
|
|
@ -951,7 +951,9 @@ static int usbatm_atm_init(struct usbatm_data *instance)
|
|||
* condition: callbacks we register can be executed at once, before we have
|
||||
* initialized the struct atm_dev. To protect against this, all callbacks
|
||||
* abort if atm_dev->dev_data is NULL. */
|
||||
atm_dev = atm_dev_register(instance->driver_name, &usbatm_atm_devops, -1, NULL);
|
||||
atm_dev = atm_dev_register(instance->driver_name,
|
||||
&instance->usb_intf->dev, &usbatm_atm_devops,
|
||||
-1, NULL);
|
||||
if (!atm_dev) {
|
||||
usb_err(instance, "%s: failed to register ATM device!\n", __func__);
|
||||
return -1;
|
||||
|
@ -966,14 +968,6 @@ static int usbatm_atm_init(struct usbatm_data *instance)
|
|||
/* temp init ATM device, set to 128kbit */
|
||||
atm_dev->link_rate = 128 * 1000 / 424;
|
||||
|
||||
ret = sysfs_create_link(&atm_dev->class_dev.kobj,
|
||||
&instance->usb_intf->dev.kobj, "device");
|
||||
if (ret) {
|
||||
atm_err(instance, "%s: sysfs_create_link failed: %d\n",
|
||||
__func__, ret);
|
||||
goto fail_sysfs;
|
||||
}
|
||||
|
||||
if (instance->driver->atm_start && ((ret = instance->driver->atm_start(instance, atm_dev)) < 0)) {
|
||||
atm_err(instance, "%s: atm_start failed: %d!\n", __func__, ret);
|
||||
goto fail;
|
||||
|
@ -992,8 +986,6 @@ static int usbatm_atm_init(struct usbatm_data *instance)
|
|||
return 0;
|
||||
|
||||
fail:
|
||||
sysfs_remove_link(&atm_dev->class_dev.kobj, "device");
|
||||
fail_sysfs:
|
||||
instance->atm_dev = NULL;
|
||||
atm_dev_deregister(atm_dev); /* usbatm_atm_dev_close will eventually be called */
|
||||
return ret;
|
||||
|
@ -1329,7 +1321,6 @@ void usbatm_usb_disconnect(struct usb_interface *intf)
|
|||
|
||||
/* ATM finalize */
|
||||
if (instance->atm_dev) {
|
||||
sysfs_remove_link(&instance->atm_dev->class_dev.kobj, "device");
|
||||
atm_dev_deregister(instance->atm_dev);
|
||||
instance->atm_dev = NULL;
|
||||
}
|
||||
|
|
|
@ -427,8 +427,10 @@ extern rwlock_t vcc_sklist_lock;
|
|||
|
||||
#define ATM_SKB(skb) (((struct atm_skb_data *) (skb)->cb))
|
||||
|
||||
struct atm_dev *atm_dev_register(const char *type,const struct atmdev_ops *ops,
|
||||
int number,unsigned long *flags); /* number == -1: pick first available */
|
||||
struct atm_dev *atm_dev_register(const char *type, struct device *parent,
|
||||
const struct atmdev_ops *ops,
|
||||
int number, /* -1 == pick first available */
|
||||
unsigned long *flags);
|
||||
struct atm_dev *atm_dev_lookup(int number);
|
||||
void atm_dev_deregister(struct atm_dev *dev);
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ struct nlmsghdr {
|
|||
Check NLM_F_EXCL
|
||||
*/
|
||||
|
||||
#define NLMSG_ALIGNTO 4
|
||||
#define NLMSG_ALIGNTO 4U
|
||||
#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )
|
||||
#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))
|
||||
#define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(NLMSG_HDRLEN))
|
||||
|
|
|
@ -769,6 +769,7 @@ struct proto {
|
|||
void (*unhash)(struct sock *sk);
|
||||
void (*rehash)(struct sock *sk);
|
||||
int (*get_port)(struct sock *sk, unsigned short snum);
|
||||
void (*clear_sk)(struct sock *sk, int size);
|
||||
|
||||
/* Keeping track of sockets in use */
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
@ -867,6 +868,8 @@ static inline void __sk_prot_rehash(struct sock *sk)
|
|||
sk->sk_prot->hash(sk);
|
||||
}
|
||||
|
||||
void sk_prot_clear_portaddr_nulls(struct sock *sk, int size);
|
||||
|
||||
/* About 10 seconds */
|
||||
#define SOCK_DESTROY_TIME (10*HZ)
|
||||
|
||||
|
|
|
@ -143,12 +143,13 @@ static struct class atm_class = {
|
|||
.dev_uevent = atm_uevent,
|
||||
};
|
||||
|
||||
int atm_register_sysfs(struct atm_dev *adev)
|
||||
int atm_register_sysfs(struct atm_dev *adev, struct device *parent)
|
||||
{
|
||||
struct device *cdev = &adev->class_dev;
|
||||
int i, j, err;
|
||||
|
||||
cdev->class = &atm_class;
|
||||
cdev->parent = parent;
|
||||
dev_set_drvdata(cdev, adev);
|
||||
|
||||
dev_set_name(cdev, "%s%d", adev->type, adev->number);
|
||||
|
|
|
@ -74,8 +74,9 @@ struct atm_dev *atm_dev_lookup(int number)
|
|||
}
|
||||
EXPORT_SYMBOL(atm_dev_lookup);
|
||||
|
||||
struct atm_dev *atm_dev_register(const char *type, const struct atmdev_ops *ops,
|
||||
int number, unsigned long *flags)
|
||||
struct atm_dev *atm_dev_register(const char *type, struct device *parent,
|
||||
const struct atmdev_ops *ops, int number,
|
||||
unsigned long *flags)
|
||||
{
|
||||
struct atm_dev *dev, *inuse;
|
||||
|
||||
|
@ -115,7 +116,7 @@ struct atm_dev *atm_dev_register(const char *type, const struct atmdev_ops *ops,
|
|||
goto out_fail;
|
||||
}
|
||||
|
||||
if (atm_register_sysfs(dev) < 0) {
|
||||
if (atm_register_sysfs(dev, parent) < 0) {
|
||||
pr_err("atm_register_sysfs failed for dev %s\n", type);
|
||||
atm_proc_dev_deregister(dev);
|
||||
goto out_fail;
|
||||
|
|
|
@ -42,6 +42,6 @@ static inline void atm_proc_dev_deregister(struct atm_dev *dev)
|
|||
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
int atm_register_sysfs(struct atm_dev *adev);
|
||||
int atm_register_sysfs(struct atm_dev *adev, struct device *parent);
|
||||
void atm_unregister_sysfs(struct atm_dev *adev);
|
||||
#endif
|
||||
|
|
|
@ -311,6 +311,7 @@ static void rfcomm_dlc_clear_state(struct rfcomm_dlc *d)
|
|||
d->state = BT_OPEN;
|
||||
d->flags = 0;
|
||||
d->mscex = 0;
|
||||
d->sec_level = BT_SECURITY_LOW;
|
||||
d->mtu = RFCOMM_DEFAULT_MTU;
|
||||
d->v24_sig = RFCOMM_V24_RTC | RFCOMM_V24_RTR | RFCOMM_V24_DV;
|
||||
|
||||
|
|
|
@ -445,7 +445,7 @@ static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br,
|
|||
ip6h = ipv6_hdr(skb);
|
||||
|
||||
*(__force __be32 *)ip6h = htonl(0x60000000);
|
||||
ip6h->payload_len = 8 + sizeof(*mldq);
|
||||
ip6h->payload_len = htons(8 + sizeof(*mldq));
|
||||
ip6h->nexthdr = IPPROTO_HOPOPTS;
|
||||
ip6h->hop_limit = 1;
|
||||
ipv6_addr_set(&ip6h->saddr, 0, 0, 0, 0);
|
||||
|
|
|
@ -1010,6 +1010,36 @@ static void sock_copy(struct sock *nsk, const struct sock *osk)
|
|||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* caches using SLAB_DESTROY_BY_RCU should let .next pointer from nulls nodes
|
||||
* un-modified. Special care is taken when initializing object to zero.
|
||||
*/
|
||||
static inline void sk_prot_clear_nulls(struct sock *sk, int size)
|
||||
{
|
||||
if (offsetof(struct sock, sk_node.next) != 0)
|
||||
memset(sk, 0, offsetof(struct sock, sk_node.next));
|
||||
memset(&sk->sk_node.pprev, 0,
|
||||
size - offsetof(struct sock, sk_node.pprev));
|
||||
}
|
||||
|
||||
void sk_prot_clear_portaddr_nulls(struct sock *sk, int size)
|
||||
{
|
||||
unsigned long nulls1, nulls2;
|
||||
|
||||
nulls1 = offsetof(struct sock, __sk_common.skc_node.next);
|
||||
nulls2 = offsetof(struct sock, __sk_common.skc_portaddr_node.next);
|
||||
if (nulls1 > nulls2)
|
||||
swap(nulls1, nulls2);
|
||||
|
||||
if (nulls1 != 0)
|
||||
memset((char *)sk, 0, nulls1);
|
||||
memset((char *)sk + nulls1 + sizeof(void *), 0,
|
||||
nulls2 - nulls1 - sizeof(void *));
|
||||
memset((char *)sk + nulls2 + sizeof(void *), 0,
|
||||
size - nulls2 - sizeof(void *));
|
||||
}
|
||||
EXPORT_SYMBOL(sk_prot_clear_portaddr_nulls);
|
||||
|
||||
static struct sock *sk_prot_alloc(struct proto *prot, gfp_t priority,
|
||||
int family)
|
||||
{
|
||||
|
@ -1022,19 +1052,12 @@ static struct sock *sk_prot_alloc(struct proto *prot, gfp_t priority,
|
|||
if (!sk)
|
||||
return sk;
|
||||
if (priority & __GFP_ZERO) {
|
||||
/*
|
||||
* caches using SLAB_DESTROY_BY_RCU should let
|
||||
* sk_node.next un-modified. Special care is taken
|
||||
* when initializing object to zero.
|
||||
*/
|
||||
if (offsetof(struct sock, sk_node.next) != 0)
|
||||
memset(sk, 0, offsetof(struct sock, sk_node.next));
|
||||
memset(&sk->sk_node.pprev, 0,
|
||||
prot->obj_size - offsetof(struct sock,
|
||||
sk_node.pprev));
|
||||
if (prot->clear_sk)
|
||||
prot->clear_sk(sk, prot->obj_size);
|
||||
else
|
||||
sk_prot_clear_nulls(sk, prot->obj_size);
|
||||
}
|
||||
}
|
||||
else
|
||||
} else
|
||||
sk = kmalloc(prot->obj_size, priority);
|
||||
|
||||
if (sk != NULL) {
|
||||
|
|
|
@ -96,11 +96,13 @@ bool skb_defer_rx_timestamp(struct sk_buff *skb)
|
|||
struct phy_device *phydev;
|
||||
unsigned int type;
|
||||
|
||||
skb_push(skb, ETH_HLEN);
|
||||
if (skb_headroom(skb) < ETH_HLEN)
|
||||
return false;
|
||||
__skb_push(skb, ETH_HLEN);
|
||||
|
||||
type = classify(skb);
|
||||
|
||||
skb_pull(skb, ETH_HLEN);
|
||||
__skb_pull(skb, ETH_HLEN);
|
||||
|
||||
switch (type) {
|
||||
case PTP_CLASS_V1_IPV4:
|
||||
|
|
|
@ -851,9 +851,13 @@ static void aun_incoming(struct sk_buff *skb, struct aunhdr *ah, size_t len)
|
|||
{
|
||||
struct iphdr *ip = ip_hdr(skb);
|
||||
unsigned char stn = ntohl(ip->saddr) & 0xff;
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct ec_device *edev = NULL;
|
||||
struct sock *sk = NULL;
|
||||
struct sk_buff *newskb;
|
||||
struct ec_device *edev = skb->dev->ec_ptr;
|
||||
|
||||
if (dst)
|
||||
edev = dst->dev->ec_ptr;
|
||||
|
||||
if (! edev)
|
||||
goto bad;
|
||||
|
|
|
@ -1897,6 +1897,7 @@ struct proto udp_prot = {
|
|||
.compat_setsockopt = compat_udp_setsockopt,
|
||||
.compat_getsockopt = compat_udp_getsockopt,
|
||||
#endif
|
||||
.clear_sk = sk_prot_clear_portaddr_nulls,
|
||||
};
|
||||
EXPORT_SYMBOL(udp_prot);
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@ struct proto udplite_prot = {
|
|||
.compat_setsockopt = compat_udp_setsockopt,
|
||||
.compat_getsockopt = compat_udp_getsockopt,
|
||||
#endif
|
||||
.clear_sk = sk_prot_clear_portaddr_nulls,
|
||||
};
|
||||
EXPORT_SYMBOL(udplite_prot);
|
||||
|
||||
|
|
|
@ -2669,7 +2669,9 @@ static int addrconf_ifdown(struct net_device *dev, int how)
|
|||
|
||||
ASSERT_RTNL();
|
||||
|
||||
rt6_ifdown(net, dev);
|
||||
/* Flush routes if device is being removed or it is not loopback */
|
||||
if (how || !(dev->flags & IFF_LOOPBACK))
|
||||
rt6_ifdown(net, dev);
|
||||
neigh_ifdown(&nd_tbl, dev);
|
||||
|
||||
idev = __in6_dev_get(dev);
|
||||
|
@ -4057,11 +4059,11 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev)
|
|||
kfree_skb(skb);
|
||||
goto errout;
|
||||
}
|
||||
rtnl_notify(skb, net, 0, RTNLGRP_IPV6_IFADDR, NULL, GFP_ATOMIC);
|
||||
rtnl_notify(skb, net, 0, RTNLGRP_IPV6_IFINFO, NULL, GFP_ATOMIC);
|
||||
return;
|
||||
errout:
|
||||
if (err < 0)
|
||||
rtnl_set_sk_err(net, RTNLGRP_IPV6_IFADDR, err);
|
||||
rtnl_set_sk_err(net, RTNLGRP_IPV6_IFINFO, err);
|
||||
}
|
||||
|
||||
static inline size_t inet6_prefix_nlmsg_size(void)
|
||||
|
|
|
@ -1566,11 +1566,16 @@ static void rt6_do_pmtu_disc(struct in6_addr *daddr, struct in6_addr *saddr,
|
|||
{
|
||||
struct rt6_info *rt, *nrt;
|
||||
int allfrag = 0;
|
||||
|
||||
again:
|
||||
rt = rt6_lookup(net, daddr, saddr, ifindex, 0);
|
||||
if (rt == NULL)
|
||||
return;
|
||||
|
||||
if (rt6_check_expired(rt)) {
|
||||
ip6_del_rt(rt);
|
||||
goto again;
|
||||
}
|
||||
|
||||
if (pmtu >= dst_mtu(&rt->dst))
|
||||
goto out;
|
||||
|
||||
|
|
|
@ -1477,6 +1477,7 @@ struct proto udpv6_prot = {
|
|||
.compat_setsockopt = compat_udpv6_setsockopt,
|
||||
.compat_getsockopt = compat_udpv6_getsockopt,
|
||||
#endif
|
||||
.clear_sk = sk_prot_clear_portaddr_nulls,
|
||||
};
|
||||
|
||||
static struct inet_protosw udpv6_protosw = {
|
||||
|
|
|
@ -55,6 +55,7 @@ struct proto udplitev6_prot = {
|
|||
.compat_setsockopt = compat_udpv6_setsockopt,
|
||||
.compat_getsockopt = compat_udpv6_getsockopt,
|
||||
#endif
|
||||
.clear_sk = sk_prot_clear_portaddr_nulls,
|
||||
};
|
||||
|
||||
static struct inet_protosw udplite6_protosw = {
|
||||
|
|
|
@ -780,6 +780,9 @@ void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
|||
|
||||
mutex_lock(&sdata->u.ibss.mtx);
|
||||
|
||||
if (!sdata->u.ibss.ssid_len)
|
||||
goto mgmt_out; /* not ready to merge yet */
|
||||
|
||||
switch (fc & IEEE80211_FCTL_STYPE) {
|
||||
case IEEE80211_STYPE_PROBE_REQ:
|
||||
ieee80211_rx_mgmt_probe_req(sdata, mgmt, skb->len);
|
||||
|
@ -797,6 +800,7 @@ void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
|||
break;
|
||||
}
|
||||
|
||||
mgmt_out:
|
||||
mutex_unlock(&sdata->u.ibss.mtx);
|
||||
}
|
||||
|
||||
|
|
|
@ -1074,11 +1074,13 @@ void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
|
|||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_work *wk;
|
||||
bool cleanup = false;
|
||||
|
||||
mutex_lock(&local->mtx);
|
||||
list_for_each_entry(wk, &local->work_list, list) {
|
||||
if (wk->sdata != sdata)
|
||||
continue;
|
||||
cleanup = true;
|
||||
wk->type = IEEE80211_WORK_ABORT;
|
||||
wk->started = true;
|
||||
wk->timeout = jiffies;
|
||||
|
@ -1086,7 +1088,8 @@ void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
|
|||
mutex_unlock(&local->mtx);
|
||||
|
||||
/* run cleanups etc. */
|
||||
ieee80211_work_work(&local->work_work);
|
||||
if (cleanup)
|
||||
ieee80211_work_work(&local->work_work);
|
||||
|
||||
mutex_lock(&local->mtx);
|
||||
list_for_each_entry(wk, &local->work_list, list) {
|
||||
|
|
|
@ -2932,6 +2932,7 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optva
|
|||
struct sctp_association *asoc = NULL;
|
||||
struct sctp_setpeerprim prim;
|
||||
struct sctp_chunk *chunk;
|
||||
struct sctp_af *af;
|
||||
int err;
|
||||
|
||||
sp = sctp_sk(sk);
|
||||
|
@ -2959,6 +2960,13 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optva
|
|||
if (!sctp_state(asoc, ESTABLISHED))
|
||||
return -ENOTCONN;
|
||||
|
||||
af = sctp_get_af_specific(prim.sspp_addr.ss_family);
|
||||
if (!af)
|
||||
return -EINVAL;
|
||||
|
||||
if (!af->addr_valid((union sctp_addr *)&prim.sspp_addr, sp, NULL))
|
||||
return -EADDRNOTAVAIL;
|
||||
|
||||
if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr))
|
||||
return -EADDRNOTAVAIL;
|
||||
|
||||
|
@ -5045,7 +5053,7 @@ static int sctp_getsockopt_partial_delivery_point(struct sock *sk, int len,
|
|||
if (copy_to_user(optval, &val, len))
|
||||
return -EFAULT;
|
||||
|
||||
return -ENOTSUPP;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
15
net/socket.c
15
net/socket.c
|
@ -732,6 +732,21 @@ static int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* kernel_recvmsg - Receive a message from a socket (kernel space)
|
||||
* @sock: The socket to receive the message from
|
||||
* @msg: Received message
|
||||
* @vec: Input s/g array for message data
|
||||
* @num: Size of input s/g array
|
||||
* @size: Number of bytes to read
|
||||
* @flags: Message flags (MSG_DONTWAIT, etc...)
|
||||
*
|
||||
* On return the msg structure contains the scatter/gather array passed in the
|
||||
* vec argument. The array is modified so that it consists of the unfilled
|
||||
* portion of the original array.
|
||||
*
|
||||
* The returned value is the total number of bytes received, or an error.
|
||||
*/
|
||||
int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
struct kvec *vec, size_t num, size_t size, int flags)
|
||||
{
|
||||
|
|
|
@ -1268,7 +1268,7 @@ struct xfrm_state * xfrm_state_migrate(struct xfrm_state *x,
|
|||
|
||||
return xc;
|
||||
error:
|
||||
kfree(xc);
|
||||
xfrm_state_put(xc);
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(xfrm_state_migrate);
|
||||
|
|
Loading…
Reference in a new issue