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:
David S. Miller 2010-12-17 12:27:22 -08:00
commit b4aa9e05a6
70 changed files with 458 additions and 202 deletions

View file

@ -5943,7 +5943,6 @@ F: include/linux/tty.h
TULIP NETWORK DRIVERS TULIP NETWORK DRIVERS
M: Grant Grundler <grundler@parisc-linux.org> M: Grant Grundler <grundler@parisc-linux.org>
M: Kyle McMartin <kyle@mcmartin.ca>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Maintained
F: drivers/net/tulip/ F: drivers/net/tulip/

View file

@ -154,7 +154,7 @@ static int __init adummy_init(void)
err = -ENOMEM; err = -ENOMEM;
goto out; 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) { if (!atm_dev) {
printk(KERN_ERR DEV_LABEL ": atm_dev_register() failed\n"); printk(KERN_ERR DEV_LABEL ": atm_dev_register() failed\n");
err = -ENODEV; err = -ENODEV;

View file

@ -2244,7 +2244,8 @@ static int __devinit amb_probe(struct pci_dev *pci_dev, const struct pci_device_
goto out_reset; 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) { if (!dev->atm_dev) {
PRINTD (DBG_ERR, "failed to register Madge ATM adapter"); PRINTD (DBG_ERR, "failed to register Madge ATM adapter");
err = -EINVAL; err = -EINVAL;

View file

@ -366,7 +366,7 @@ static int atmtcp_create(int itf,int persist,struct atm_dev **result)
if (!dev_data) if (!dev_data)
return -ENOMEM; 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) { if (!dev) {
kfree(dev_data); kfree(dev_data);
return itf == -1 ? -ENOMEM : -EBUSY; return itf == -1 ? -ENOMEM : -EBUSY;

View file

@ -2244,7 +2244,7 @@ static int __devinit eni_init_one(struct pci_dev *pci_dev,
&zeroes); &zeroes);
if (!cpu_zeroes) goto out1; 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; if (!dev) goto out2;
pci_set_drvdata(pci_dev, dev); pci_set_drvdata(pci_dev, dev);
eni_dev->pci_dev = pci_dev; eni_dev->pci_dev = pci_dev;

View file

@ -1911,7 +1911,7 @@ static int __devinit firestream_init_one (struct pci_dev *pci_dev,
fs_dev, sizeof (struct fs_dev)); fs_dev, sizeof (struct fs_dev));
if (!fs_dev) if (!fs_dev)
goto err_out; 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) if (!atm_dev)
goto err_out_free_fs_dev; goto err_out_free_fs_dev;

View file

@ -2567,14 +2567,14 @@ release:
static int __devinit static int __devinit
fore200e_register(struct fore200e* fore200e) fore200e_register(struct fore200e* fore200e, struct device *parent)
{ {
struct atm_dev* atm_dev; struct atm_dev* atm_dev;
DPRINTK(2, "device %s being registered\n", fore200e->name); DPRINTK(2, "device %s being registered\n", fore200e->name);
atm_dev = atm_dev_register(fore200e->bus->proc_name, &fore200e_ops, -1, atm_dev = atm_dev_register(fore200e->bus->proc_name, parent, &fore200e_ops,
NULL); -1, NULL);
if (atm_dev == NULL) { if (atm_dev == NULL) {
printk(FORE200E "unable to register device %s\n", fore200e->name); printk(FORE200E "unable to register device %s\n", fore200e->name);
return -ENODEV; return -ENODEV;
@ -2594,9 +2594,9 @@ fore200e_register(struct fore200e* fore200e)
static int __devinit 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; return -ENODEV;
if (fore200e->bus->configure(fore200e) < 0) 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); sprintf(fore200e->name, "%s-%d", bus->model_name, index);
err = fore200e_init(fore200e); err = fore200e_init(fore200e, &op->dev);
if (err < 0) { if (err < 0) {
fore200e_shutdown(fore200e); fore200e_shutdown(fore200e);
kfree(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); sprintf(fore200e->name, "%s-%d", bus->model_name, index);
err = fore200e_init(fore200e); err = fore200e_init(fore200e, &pci_dev->dev);
if (err < 0) { if (err < 0) {
fore200e_shutdown(fore200e); fore200e_shutdown(fore200e);
goto out_free; goto out_free;

View file

@ -366,7 +366,7 @@ he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
goto init_one_failure; 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) { if (!atm_dev) {
err = -ENODEV; err = -ENODEV;
goto init_one_failure; goto init_one_failure;

View file

@ -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", PRINTD(DBG_INFO, "found Madge ATM adapter (hrz) at: IO %x, IRQ %u, MEM %p",
iobase, irq, membase); 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)) { if (!(dev->atm_dev)) {
PRINTD(DBG_ERR, "failed to register Madge ATM adapter"); PRINTD(DBG_ERR, "failed to register Madge ATM adapter");
err = -EINVAL; err = -EINVAL;

View file

@ -3698,7 +3698,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
goto err_out_iounmap; 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) { if (!dev) {
printk("%s: can't register atm device\n", card->name); printk("%s: can't register atm device\n", card->name);
err = -EIO; err = -EIO;

View file

@ -3172,7 +3172,7 @@ static int __devinit ia_init_one(struct pci_dev *pdev,
ret = -ENODEV; ret = -ENODEV;
goto err_out_free_iadev; 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) { if (!dev) {
ret = -ENOMEM; ret = -ENOMEM;
goto err_out_disable_dev; goto err_out_disable_dev;

View file

@ -2588,7 +2588,7 @@ static int __devinit lanai_init_one(struct pci_dev *pci,
return -ENOMEM; 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) { if (atmdev == NULL) {
printk(KERN_ERR DEV_LABEL printk(KERN_ERR DEV_LABEL
": couldn't register atm device!\n"); ": couldn't register atm device!\n");

View file

@ -771,7 +771,8 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
} }
/* Register device */ /* 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) { if (card->atmdev == NULL) {
printk("nicstar%d: can't register device.\n", i); printk("nicstar%d: can't register device.\n", i);
error = 17; error = 17;

View file

@ -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 struct atm_vcc* find_vcc(struct atm_dev *dev, short vpi, int vci);
static int list_vccs(int vci); static int list_vccs(int vci);
static void release_vccs(struct atm_dev *dev); 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 void atm_remove(struct solos_card *);
static int send_command(struct solos_card *card, int dev, const char *buf, size_t size); static int send_command(struct solos_card *card, int dev, const char *buf, size_t size);
static void solos_bh(unsigned long); 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) if (db_firmware_upgrade)
flash_upgrade(card, 3); flash_upgrade(card, 3);
err = atm_init(card); err = atm_init(card, &dev->dev);
if (err) if (err)
goto out_free_irq; goto out_free_irq;
@ -1233,7 +1233,7 @@ static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id)
return err; return err;
} }
static int atm_init(struct solos_card *card) static int atm_init(struct solos_card *card, struct device *parent)
{ {
int i; 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->tx_queue[i]);
skb_queue_head_init(&card->cli_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]) { if (!card->atmdev[i]) {
dev_err(&card->dev->dev, "Could not register ATM device %d\n", i); dev_err(&card->dev->dev, "Could not register ATM device %d\n", i);
atm_remove(card); atm_remove(card);

View file

@ -1597,7 +1597,7 @@ static int __devinit zatm_init_one(struct pci_dev *pci_dev,
goto out; 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) if (!dev)
goto out_free; goto out_free;

View file

@ -311,11 +311,13 @@ static void hci_uart_tty_close(struct tty_struct *tty)
if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) { if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) {
hu->proto->close(hu); hu->proto->close(hu);
if (hdev) {
hci_unregister_dev(hdev); hci_unregister_dev(hdev);
hci_free_dev(hdev); hci_free_dev(hdev);
} }
} }
} }
}
/* hci_uart_tty_wakeup() /* hci_uart_tty_wakeup()
* *

View file

@ -36,6 +36,7 @@
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>"); MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector."); MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector.");
MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_CONNECTOR);
static struct cn_dev cdev; static struct cn_dev cdev;

View file

@ -242,7 +242,7 @@ struct be_adapter {
u8 __iomem *db; /* Door Bell */ u8 __iomem *db; /* Door Bell */
u8 __iomem *pcicfg; /* PCI config space */ 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; struct be_dma_mem mbox_mem;
/* Mbox mem is adjusted to align to 16 bytes. The allocated addr /* Mbox mem is adjusted to align to 16 bytes. The allocated addr
* is stored for freeing purpose */ * is stored for freeing purpose */

View file

@ -467,7 +467,8 @@ int be_cmd_fw_init(struct be_adapter *adapter)
u8 *wrb; u8 *wrb;
int status; int status;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = (u8 *)wrb_from_mbox(adapter); wrb = (u8 *)wrb_from_mbox(adapter);
*wrb++ = 0xFF; *wrb++ = 0xFF;
@ -481,7 +482,7 @@ int be_cmd_fw_init(struct be_adapter *adapter)
status = be_mbox_notify_wait(adapter); status = be_mbox_notify_wait(adapter);
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; return status;
} }
@ -496,7 +497,8 @@ int be_cmd_fw_clean(struct be_adapter *adapter)
if (adapter->eeh_err) if (adapter->eeh_err)
return -EIO; return -EIO;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = (u8 *)wrb_from_mbox(adapter); wrb = (u8 *)wrb_from_mbox(adapter);
*wrb++ = 0xFF; *wrb++ = 0xFF;
@ -510,7 +512,7 @@ int be_cmd_fw_clean(struct be_adapter *adapter)
status = be_mbox_notify_wait(adapter); status = be_mbox_notify_wait(adapter);
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; return status;
} }
int be_cmd_eq_create(struct be_adapter *adapter, 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; struct be_dma_mem *q_mem = &eq->dma_mem;
int status; int status;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb); req = embedded_payload(wrb);
@ -551,7 +554,7 @@ int be_cmd_eq_create(struct be_adapter *adapter,
eq->created = true; eq->created = true;
} }
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; 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; struct be_cmd_req_mac_query *req;
int status; int status;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb); 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); memcpy(mac_addr, resp->mac.addr, ETH_ALEN);
} }
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; return status;
} }
@ -672,7 +676,8 @@ int be_cmd_cq_create(struct be_adapter *adapter,
void *ctxt; void *ctxt;
int status; int status;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb); req = embedded_payload(wrb);
@ -726,7 +731,7 @@ int be_cmd_cq_create(struct be_adapter *adapter,
cq->created = true; cq->created = true;
} }
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; return status;
} }
@ -749,7 +754,8 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
void *ctxt; void *ctxt;
int status; int status;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb); 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->id = le16_to_cpu(resp->id);
mccq->created = true; mccq->created = true;
} }
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; return status;
} }
@ -808,7 +814,8 @@ int be_cmd_txq_create(struct be_adapter *adapter,
void *ctxt; void *ctxt;
int status; int status;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb); req = embedded_payload(wrb);
@ -840,7 +847,7 @@ int be_cmd_txq_create(struct be_adapter *adapter,
txq->created = true; txq->created = true;
} }
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; return status;
} }
@ -855,7 +862,8 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
struct be_dma_mem *q_mem = &rxq->dma_mem; struct be_dma_mem *q_mem = &rxq->dma_mem;
int status; int status;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb); req = embedded_payload(wrb);
@ -882,7 +890,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
*rss_id = resp->rss_id; *rss_id = resp->rss_id;
} }
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; return status;
} }
@ -901,7 +909,8 @@ int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q,
if (adapter->eeh_err) if (adapter->eeh_err)
return -EIO; return -EIO;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb); 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); status = be_mbox_notify_wait(adapter);
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; 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; struct be_cmd_req_if_create *req;
int status; int status;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb); 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); *pmac_id = le32_to_cpu(resp->pmac_id);
} }
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; return status;
} }
@ -994,7 +1004,8 @@ int be_cmd_if_destroy(struct be_adapter *adapter, u32 interface_id)
if (adapter->eeh_err) if (adapter->eeh_err)
return -EIO; return -EIO;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb); 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); status = be_mbox_notify_wait(adapter);
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; 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; struct be_cmd_req_get_fw_version *req;
int status; int status;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb); 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); strncpy(fw_ver, resp->firmware_version_string, FW_VER_LEN);
} }
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; 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; struct be_cmd_req_query_fw_cfg *req;
int status; int status;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb); 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); *caps = le32_to_cpu(resp->function_caps);
} }
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; return status;
} }
@ -1391,7 +1404,8 @@ int be_cmd_reset_function(struct be_adapter *adapter)
struct be_cmd_req_hdr *req; struct be_cmd_req_hdr *req;
int status; int status;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb); req = embedded_payload(wrb);
@ -1404,7 +1418,7 @@ int be_cmd_reset_function(struct be_adapter *adapter)
status = be_mbox_notify_wait(adapter); status = be_mbox_notify_wait(adapter);
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; return status;
} }
@ -1415,7 +1429,8 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable, u16 table_size)
u32 myhash[10]; u32 myhash[10];
int status; int status;
spin_lock(&adapter->mbox_lock); if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb); 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); status = be_mbox_notify_wait(adapter);
spin_unlock(&adapter->mbox_lock); mutex_unlock(&adapter->mbox_lock);
return status; return status;
} }

View file

@ -2746,7 +2746,7 @@ static int be_ctrl_init(struct be_adapter *adapter)
} }
memset(mc_cmd_mem->va, 0, mc_cmd_mem->size); 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_lock);
spin_lock_init(&adapter->mcc_cq_lock); spin_lock_init(&adapter->mcc_cq_lock);

View file

@ -88,7 +88,12 @@ static void bond_na_send(struct net_device *slave_dev,
} }
if (vlan_id) { 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) { if (!skb) {
pr_err("failed to insert VLAN tag\n"); pr_err("failed to insert VLAN tag\n");
return; return;

View file

@ -171,7 +171,7 @@ MODULE_PARM_DESC(resend_igmp, "Number of IGMP membership reports to send on link
/*----------------------------- Global variables ----------------------------*/ /*----------------------------- Global variables ----------------------------*/
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
cpumask_var_t netpoll_block_tx; atomic_t netpoll_block_tx = ATOMIC_INIT(0);
#endif #endif
static const char * const version = 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. * @bond: bond device that got this skb for tx.
* @skb: hw accel VLAN tagged skb to transmit * @skb: hw accel VLAN tagged skb to transmit
* @slave_dev: slave that is supposed to xmit this skbuff * @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, int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb,
struct net_device *slave_dev) 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->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->priority = 1; skb->priority = 1;
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
if (unlikely(bond->dev->priv_flags & IFF_IN_NETPOLL)) { 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, bond_do_fail_over_mac(bond, new_active,
old_active); old_active);
if (netif_running(bond->dev)) {
bond->send_grat_arp = bond->params.num_grat_arp; bond->send_grat_arp = bond->params.num_grat_arp;
bond_send_gratuitous_arp(bond); bond_send_gratuitous_arp(bond);
bond->send_unsol_na = bond->params.num_unsol_na; bond->send_unsol_na = bond->params.num_unsol_na;
bond_send_unsolicited_na(bond); bond_send_unsolicited_na(bond);
}
write_unlock_bh(&bond->curr_slave_lock); write_unlock_bh(&bond->curr_slave_lock);
read_unlock(&bond->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 /* resend IGMP joins since active slave has changed or
* all were sent on curr_active_slave */ * all were sent on curr_active_slave */
if ((USES_PRIMARY(bond->params.mode) && new_active) || if (((USES_PRIMARY(bond->params.mode) && new_active) ||
bond->params.mode == BOND_MODE_ROUNDROBIN) { bond->params.mode == BOND_MODE_ROUNDROBIN) &&
netif_running(bond->dev)) {
bond->igmp_retrans = bond->params.resend_igmp; bond->igmp_retrans = bond->params.resend_igmp;
queue_delayed_work(bond->wq, &bond->mcast_work, 0); queue_delayed_work(bond->wq, &bond->mcast_work, 0);
} }
@ -5299,13 +5277,6 @@ static int __init bonding_init(void)
if (res) if (res)
goto out; 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); res = register_pernet_subsys(&bond_net_ops);
if (res) if (res)
goto out; goto out;
@ -5335,9 +5306,6 @@ err:
rtnl_link_unregister(&bond_link_ops); rtnl_link_unregister(&bond_link_ops);
err_link: err_link:
unregister_pernet_subsys(&bond_net_ops); unregister_pernet_subsys(&bond_net_ops);
#ifdef CONFIG_NET_POLL_CONTROLLER
free_cpumask_var(netpoll_block_tx);
#endif
goto out; goto out;
} }
@ -5355,7 +5323,10 @@ static void __exit bonding_exit(void)
unregister_pernet_subsys(&bond_net_ops); unregister_pernet_subsys(&bond_net_ops);
#ifdef CONFIG_NET_POLL_CONTROLLER #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 #endif
} }

View file

@ -119,26 +119,22 @@
#ifdef CONFIG_NET_POLL_CONTROLLER #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) static inline void block_netpoll_tx(void)
{ {
preempt_disable(); atomic_inc(&netpoll_block_tx);
BUG_ON(cpumask_test_and_set_cpu(smp_processor_id(),
netpoll_block_tx));
} }
static inline void unblock_netpoll_tx(void) static inline void unblock_netpoll_tx(void)
{ {
BUG_ON(!cpumask_test_and_clear_cpu(smp_processor_id(), atomic_dec(&netpoll_block_tx);
netpoll_block_tx));
preempt_enable();
} }
static inline int is_netpoll_tx_blocked(struct net_device *dev) static inline int is_netpoll_tx_blocked(struct net_device *dev)
{ {
if (unlikely(dev->priv_flags & IFF_IN_NETPOLL)) 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; return 0;
} }
#else #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) { bond_for_each_slave(bond, slave, i) {
if (slave->dev == slave_dev) { if (slave->dev == slave_dev) {
break; return slave;
} }
} }
return slave; return 0;
} }
static inline struct bonding *bond_get_bond_by_slave(struct slave *slave) static inline struct bonding *bond_get_bond_by_slave(struct slave *slave)

View file

@ -2278,6 +2278,7 @@ static void __devinit cfg_queues(struct adapter *adapter)
{ {
struct sge *s = &adapter->sge; struct sge *s = &adapter->sge;
int q10g, n10g, qidx, pidx, qs; int q10g, n10g, qidx, pidx, qs;
size_t iqe_size;
/* /*
* We should not be called till we know how many Queue Sets we can * 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; 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 * Set up default Queue Set parameters ... Start off with the
* shortest interrupt holdoff timer. * 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_rxq *rxq = &s->ethrxq[qs];
struct sge_eth_txq *txq = &s->ethtxq[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; rxq->fl.size = 72;
txq->q.size = 1024; 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 * The firmware event queue is used for link state changes and
* notifications of TX DMA completions. * notifications of TX DMA completions.
*/ */
init_rspq(&s->fw_evtq, SGE_TIMER_RSTRT_CNTR, 0, 512, init_rspq(&s->fw_evtq, SGE_TIMER_RSTRT_CNTR, 0, 512, iqe_size);
L1_CACHE_BYTES);
/* /*
* The forwarded interrupt queue is used when we're in MSI interrupt * 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 ... * any time ...
*/ */
init_rspq(&s->intrq, SGE_TIMER_RSTRT_CNTR, 0, MSIX_ENTRIES + 1, init_rspq(&s->intrq, SGE_TIMER_RSTRT_CNTR, 0, MSIX_ENTRIES + 1,
L1_CACHE_BYTES); iqe_size);
} }
/* /*

View file

@ -2098,7 +2098,8 @@ static void enic_poll_controller(struct net_device *netdev)
case VNIC_DEV_INTR_MODE_MSIX: case VNIC_DEV_INTR_MODE_MSIX:
for (i = 0; i < enic->rq_count; i++) { for (i = 0; i < enic->rq_count; i++) {
intr = enic_msix_rq_intr(enic, 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); intr = enic_msix_wq_intr(enic, i);
enic_isr_msix_wq(enic->msix_entry[intr].vector, enic); enic_isr_msix_wq(enic->msix_entry[intr].vector, enic);

View file

@ -690,6 +690,7 @@ static void block_output(struct net_device *dev, int count,
static struct pcmcia_device_id axnet_ids[] = { static struct pcmcia_device_id axnet_ids[] = {
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x016c, 0x0081), PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x016c, 0x0081),
PCMCIA_DEVICE_MANF_CARD(0x018a, 0x0301), PCMCIA_DEVICE_MANF_CARD(0x018a, 0x0301),
PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x2328),
PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0301), PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0301),
PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0303), PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0303),
PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0309), PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0309),

View file

@ -1493,7 +1493,6 @@ static struct pcmcia_device_id pcnet_ids[] = {
PCMCIA_DEVICE_MANF_CARD(0x0149, 0x4530), PCMCIA_DEVICE_MANF_CARD(0x0149, 0x4530),
PCMCIA_DEVICE_MANF_CARD(0x0149, 0xc1ab), PCMCIA_DEVICE_MANF_CARD(0x0149, 0xc1ab),
PCMCIA_DEVICE_MANF_CARD(0x0186, 0x0110), PCMCIA_DEVICE_MANF_CARD(0x0186, 0x0110),
PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x2328),
PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x8041), PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x8041),
PCMCIA_DEVICE_MANF_CARD(0x0213, 0x2452), PCMCIA_DEVICE_MANF_CARD(0x0213, 0x2452),
PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0300), PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0300),

View file

@ -64,7 +64,7 @@ config BCM63XX_PHY
config ICPLUS_PHY config ICPLUS_PHY
tristate "Drivers for ICPlus PHYs" tristate "Drivers for ICPlus PHYs"
---help--- ---help---
Currently supports the IP175C PHY. Currently supports the IP175C and IP1001 PHYs.
config REALTEK_PHY config REALTEK_PHY
tristate "Drivers for Realtek PHYs" tristate "Drivers for Realtek PHYs"

View file

@ -30,7 +30,7 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
MODULE_DESCRIPTION("ICPlus IP175C PHY driver"); MODULE_DESCRIPTION("ICPlus IP175C/IC1001 PHY drivers");
MODULE_AUTHOR("Michael Barkowski"); MODULE_AUTHOR("Michael Barkowski");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
@ -89,6 +89,33 @@ static int ip175c_config_init(struct phy_device *phydev)
return 0; 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) static int ip175c_read_status(struct phy_device *phydev)
{ {
if (phydev->addr == 4) /* WAN port */ if (phydev->addr == 4) /* WAN port */
@ -121,21 +148,43 @@ static struct phy_driver ip175c_driver = {
.driver = { .owner = THIS_MODULE,}, .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); 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); phy_driver_unregister(&ip175c_driver);
} }
module_init(ip175c_init); module_init(icplus_init);
module_exit(ip175c_exit); module_exit(icplus_exit);
static struct mdio_device_id __maybe_unused icplus_tbl[] = { static struct mdio_device_id __maybe_unused icplus_tbl[] = {
{ 0x02430d80, 0x0ffffff0 }, { 0x02430d80, 0x0ffffff0 },
{ 0x02430d90, 0x0ffffff0 },
{ } { }
}; };

View file

@ -948,7 +948,7 @@ static int __pppoe_xmit(struct sock *sk, struct sk_buff *skb)
abort: abort:
kfree_skb(skb); kfree_skb(skb);
return 0; return 1;
} }
/************************************************************************ /************************************************************************

View file

@ -2083,6 +2083,7 @@ struct ql_adapter {
u32 mailbox_in; u32 mailbox_in;
u32 mailbox_out; u32 mailbox_out;
struct mbox_params idc_mbc; struct mbox_params idc_mbc;
struct mutex mpi_mutex;
int tx_ring_size; int tx_ring_size;
int rx_ring_size; int rx_ring_size;

View file

@ -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_idc_work, ql_mpi_idc_work);
INIT_DELAYED_WORK(&qdev->mpi_core_to_log, ql_mpi_core_to_log); INIT_DELAYED_WORK(&qdev->mpi_core_to_log, ql_mpi_core_to_log);
init_completion(&qdev->ide_completion); init_completion(&qdev->ide_completion);
mutex_init(&qdev->mpi_mutex);
if (!cards_found) { if (!cards_found) {
dev_info(&pdev->dev, "%s\n", DRV_STRING); dev_info(&pdev->dev, "%s\n", DRV_STRING);

View file

@ -534,6 +534,7 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
int status; int status;
unsigned long count; unsigned long count;
mutex_lock(&qdev->mpi_mutex);
/* Begin polled mode for MPI */ /* Begin polled mode for MPI */
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16)); ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
@ -603,6 +604,7 @@ done:
end: end:
/* End polled mode for MPI */ /* End polled mode for MPI */
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI); ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI);
mutex_unlock(&qdev->mpi_mutex);
return status; 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) static int ql_set_port_cfg(struct ql_adapter *qdev)
{ {
int status; int status;
rtnl_lock();
status = ql_mb_set_port_cfg(qdev); status = ql_mb_set_port_cfg(qdev);
rtnl_unlock();
if (status) if (status)
return status; return status;
status = ql_idc_wait(qdev); 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); container_of(work, struct ql_adapter, mpi_port_cfg_work.work);
int status; int status;
rtnl_lock();
status = ql_mb_get_port_cfg(qdev); status = ql_mb_get_port_cfg(qdev);
rtnl_unlock();
if (status) { if (status) {
netif_err(qdev, drv, qdev->ndev, netif_err(qdev, drv, qdev->ndev,
"Bug: Failed to get port config data.\n"); "Bug: Failed to get port config data.\n");
@ -1167,7 +1165,6 @@ void ql_mpi_idc_work(struct work_struct *work)
u32 aen; u32 aen;
int timeout; int timeout;
rtnl_lock();
aen = mbcp->mbox_out[1] >> 16; aen = mbcp->mbox_out[1] >> 16;
timeout = (mbcp->mbox_out[1] >> 8) & 0xf; timeout = (mbcp->mbox_out[1] >> 8) & 0xf;
@ -1231,7 +1228,6 @@ void ql_mpi_idc_work(struct work_struct *work)
} }
break; break;
} }
rtnl_unlock();
} }
void ql_mpi_work(struct work_struct *work) 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; struct mbox_params *mbcp = &mbc;
int err = 0; int err = 0;
rtnl_lock(); mutex_lock(&qdev->mpi_mutex);
/* Begin polled mode for MPI */ /* Begin polled mode for MPI */
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16)); 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 */ /* End polled mode for MPI */
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI); 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); ql_enable_completion_interrupt(qdev, 0);
} }

View file

@ -744,26 +744,36 @@ static void rtl8169_xmii_reset_enable(void __iomem *ioaddr)
mdio_write(ioaddr, MII_BMCR, val & 0xffff); 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, struct rtl8169_private *tp,
void __iomem *ioaddr) void __iomem *ioaddr,
bool pm)
{ {
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&tp->lock, flags); spin_lock_irqsave(&tp->lock, flags);
if (tp->link_ok(ioaddr)) { if (tp->link_ok(ioaddr)) {
/* This is to cancel a scheduled suspend if there's one. */ /* This is to cancel a scheduled suspend if there's one. */
if (pm)
pm_request_resume(&tp->pci_dev->dev); pm_request_resume(&tp->pci_dev->dev);
netif_carrier_on(dev); netif_carrier_on(dev);
netif_info(tp, ifup, dev, "link up\n"); netif_info(tp, ifup, dev, "link up\n");
} else { } else {
netif_carrier_off(dev); netif_carrier_off(dev);
netif_info(tp, ifdown, dev, "link down\n"); netif_info(tp, ifdown, dev, "link down\n");
if (pm)
pm_schedule_suspend(&tp->pci_dev->dev, 100); pm_schedule_suspend(&tp->pci_dev->dev, 100);
} }
spin_unlock_irqrestore(&tp->lock, flags); 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) #define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
static u32 __rtl8169_get_wol(struct rtl8169_private *tp) 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) 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 /* We need to see the lastest version of tp->intr_mask to
* avoid ignoring an MSI interrupt and having to wait for * 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 net_device *dev = pci_get_drvdata(pdev);
struct rtl8169_private *tp = netdev_priv(dev); struct rtl8169_private *tp = netdev_priv(dev);
if (!tp->TxDescArray) return tp->TxDescArray ? -EBUSY : 0;
return 0;
rtl8169_check_link_status(dev, tp, tp->mmio_addr);
return -EBUSY;
} }
static const struct dev_pm_ops rtl8169_pm_ops = { static const struct dev_pm_ops rtl8169_pm_ops = {

View file

@ -324,7 +324,7 @@ static int bdx_fw_load(struct bdx_priv *priv)
ENTER; ENTER;
master = READ_REG(priv, regINIT_SEMAPHORE); master = READ_REG(priv, regINIT_SEMAPHORE);
if (!READ_REG(priv, regINIT_STATUS) && master) { 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) if (rc)
goto out; goto out;
bdx_tx_push_desc_safe(priv, (char *)fw->data, fw->size); bdx_tx_push_desc_safe(priv, (char *)fw->data, fw->size);
@ -2510,4 +2510,4 @@ module_exit(bdx_module_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(BDX_DRV_DESC); MODULE_DESCRIPTION(BDX_DRV_DESC);
MODULE_FIRMWARE("tehuti/firmware.bin"); MODULE_FIRMWARE("tehuti/bdx.bin");

View file

@ -1507,6 +1507,10 @@ static const struct usb_device_id products [] = {
// ASIX AX88178 10/100/1000 // ASIX AX88178 10/100/1000
USB_DEVICE (0x0b95, 0x1780), USB_DEVICE (0x0b95, 0x1780),
.driver_info = (unsigned long) &ax88178_info, .driver_info = (unsigned long) &ax88178_info,
}, {
// Logitec LAN-GTJ/U2A
USB_DEVICE (0x0789, 0x0160),
.driver_info = (unsigned long) &ax88178_info,
}, { }, {
// Linksys USB200M Rev 2 // Linksys USB200M Rev 2
USB_DEVICE (0x13b1, 0x0018), USB_DEVICE (0x13b1, 0x0018),

View file

@ -958,10 +958,6 @@ static void packetizeRx(struct hso_net *odev, unsigned char *ip_pkt,
/* Packet is complete. Inject into stack. */ /* Packet is complete. Inject into stack. */
/* We have IP packet here */ /* We have IP packet here */
odev->skb_rx_buf->protocol = cpu_to_be16(ETH_P_IP); 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); skb_reset_mac_header(odev->skb_rx_buf);
/* Ship it off to the kernel */ /* Ship it off to the kernel */

View file

@ -166,7 +166,9 @@ static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
if (!(rcv->flags & IFF_UP)) if (!(rcv->flags & IFF_UP))
goto tx_drop; 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; skb->ip_summed = rcv_priv->ip_summed;
length = skb->len + ETH_HLEN; length = skb->len + ETH_HLEN;

View file

@ -293,6 +293,7 @@ static inline void sca_tx_done(port_t *port)
struct net_device *dev = port->netdev; struct net_device *dev = port->netdev;
card_t* card = port->card; card_t* card = port->card;
u8 stat; u8 stat;
unsigned count = 0;
spin_lock(&port->lock); spin_lock(&port->lock);
@ -316,9 +317,11 @@ static inline void sca_tx_done(port_t *port)
dev->stats.tx_bytes += readw(&desc->len); dev->stats.tx_bytes += readw(&desc->len);
} }
writeb(0, &desc->stat); /* Free descriptor */ writeb(0, &desc->stat); /* Free descriptor */
count++;
port->txlast = (port->txlast + 1) % card->tx_ring_buffers; port->txlast = (port->txlast + 1) % card->tx_ring_buffers;
} }
if (count)
netif_wake_queue(dev); netif_wake_queue(dev);
spin_unlock(&port->lock); spin_unlock(&port->lock);
} }

View file

@ -311,6 +311,7 @@ struct iwl_cfg iwl100_bgn_cfg = {
.base_params = &iwl1000_base_params, .base_params = &iwl1000_base_params,
.ht_params = &iwl1000_ht_params, .ht_params = &iwl1000_ht_params,
.led_mode = IWL_LED_RF_STATE, .led_mode = IWL_LED_RF_STATE,
.use_new_eeprom_reading = true,
}; };
struct iwl_cfg iwl100_bg_cfg = { struct iwl_cfg iwl100_bg_cfg = {
@ -324,6 +325,7 @@ struct iwl_cfg iwl100_bg_cfg = {
.mod_params = &iwlagn_mod_params, .mod_params = &iwlagn_mod_params,
.base_params = &iwl1000_base_params, .base_params = &iwl1000_base_params,
.led_mode = IWL_LED_RF_STATE, .led_mode = IWL_LED_RF_STATE,
.use_new_eeprom_reading = true,
}; };
MODULE_FIRMWARE(IWL1000_MODULE_FIRMWARE(IWL1000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL1000_MODULE_FIRMWARE(IWL1000_UCODE_API_MAX));

View file

@ -564,6 +564,7 @@ struct iwl_cfg iwl6005_2agn_cfg = {
.need_dc_calib = true, .need_dc_calib = true,
.need_temp_offset_calib = true, .need_temp_offset_calib = true,
.led_mode = IWL_LED_RF_STATE, .led_mode = IWL_LED_RF_STATE,
.use_new_eeprom_reading = true,
}; };
struct iwl_cfg iwl6005_2abg_cfg = { struct iwl_cfg iwl6005_2abg_cfg = {
@ -579,6 +580,7 @@ struct iwl_cfg iwl6005_2abg_cfg = {
.need_dc_calib = true, .need_dc_calib = true,
.need_temp_offset_calib = true, .need_temp_offset_calib = true,
.led_mode = IWL_LED_RF_STATE, .led_mode = IWL_LED_RF_STATE,
.use_new_eeprom_reading = true,
}; };
struct iwl_cfg iwl6005_2bg_cfg = { struct iwl_cfg iwl6005_2bg_cfg = {
@ -594,6 +596,7 @@ struct iwl_cfg iwl6005_2bg_cfg = {
.need_dc_calib = true, .need_dc_calib = true,
.need_temp_offset_calib = true, .need_temp_offset_calib = true,
.led_mode = IWL_LED_RF_STATE, .led_mode = IWL_LED_RF_STATE,
.use_new_eeprom_reading = true,
}; };
struct iwl_cfg iwl6030_2agn_cfg = { struct iwl_cfg iwl6030_2agn_cfg = {
@ -614,6 +617,7 @@ struct iwl_cfg iwl6030_2agn_cfg = {
.adv_pm = true, .adv_pm = true,
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
.use_new_eeprom_reading = true,
}; };
struct iwl_cfg iwl6030_2abg_cfg = { struct iwl_cfg iwl6030_2abg_cfg = {
@ -633,6 +637,7 @@ struct iwl_cfg iwl6030_2abg_cfg = {
.adv_pm = true, .adv_pm = true,
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
.use_new_eeprom_reading = true,
}; };
struct iwl_cfg iwl6030_2bgn_cfg = { struct iwl_cfg iwl6030_2bgn_cfg = {
@ -653,6 +658,7 @@ struct iwl_cfg iwl6030_2bgn_cfg = {
.adv_pm = true, .adv_pm = true,
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
.use_new_eeprom_reading = true,
}; };
struct iwl_cfg iwl6030_2bg_cfg = { struct iwl_cfg iwl6030_2bg_cfg = {
@ -672,6 +678,7 @@ struct iwl_cfg iwl6030_2bg_cfg = {
.adv_pm = true, .adv_pm = true,
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
.use_new_eeprom_reading = true,
}; };
struct iwl_cfg iwl1030_bgn_cfg = { struct iwl_cfg iwl1030_bgn_cfg = {
@ -692,6 +699,7 @@ struct iwl_cfg iwl1030_bgn_cfg = {
.adv_pm = true, .adv_pm = true,
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
.use_new_eeprom_reading = true,
}; };
struct iwl_cfg iwl1030_bg_cfg = { struct iwl_cfg iwl1030_bg_cfg = {
@ -711,6 +719,7 @@ struct iwl_cfg iwl1030_bg_cfg = {
.adv_pm = true, .adv_pm = true,
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_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, .ht_params = &iwl6000_ht_params,
.need_dc_calib = true, .need_dc_calib = true,
.led_mode = IWL_LED_RF_STATE, .led_mode = IWL_LED_RF_STATE,
.use_new_eeprom_reading = true,
}; };
struct iwl_cfg iwl6050_2abg_cfg = { struct iwl_cfg iwl6050_2abg_cfg = {
@ -841,6 +851,7 @@ struct iwl_cfg iwl130_bgn_cfg = {
.adv_pm = true, .adv_pm = true,
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
.use_new_eeprom_reading = true,
}; };
struct iwl_cfg iwl130_bg_cfg = { struct iwl_cfg iwl130_bg_cfg = {
@ -859,6 +870,7 @@ struct iwl_cfg iwl130_bg_cfg = {
.adv_pm = true, .adv_pm = true,
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
.use_new_eeprom_reading = true,
}; };
MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));

View file

@ -433,7 +433,7 @@ static s8 iwl_update_channel_txpower(struct iwl_priv *priv,
/** /**
* iwlcore_eeprom_enhanced_txpower: process enhanced tx power info * 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 eeprom_section_count = 0;
int section, element; int section, element;
@ -460,7 +460,8 @@ void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv)
* always check for valid entry before process * always check for valid entry before process
* the information * the information
*/ */
if (!enhanced_txpower->common || enhanced_txpower->reserved) if (!(enhanced_txpower->flags || enhanced_txpower->channel) ||
enhanced_txpower->delta_20_in_40)
continue; continue;
for (element = 0; element < eeprom_section_count; element++) { 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);
}

View file

@ -568,6 +568,12 @@ static u32 eeprom_indirect_address(const struct iwl_priv *priv, u32 address)
case INDIRECT_REGULATORY: case INDIRECT_REGULATORY:
offset = iwl_eeprom_query16(priv, EEPROM_LINK_REGULATORY); offset = iwl_eeprom_query16(priv, EEPROM_LINK_REGULATORY);
break; 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: case INDIRECT_CALIBRATION:
offset = iwl_eeprom_query16(priv, EEPROM_LINK_CALIBRATION); offset = iwl_eeprom_query16(priv, EEPROM_LINK_CALIBRATION);
break; break;

View file

@ -412,6 +412,7 @@ struct iwl_cfg {
u8 scan_tx_antennas[IEEE80211_NUM_BANDS]; u8 scan_tx_antennas[IEEE80211_NUM_BANDS];
enum iwl_led_mode led_mode; enum iwl_led_mode led_mode;
const bool adv_pm; const bool adv_pm;
const bool use_new_eeprom_reading; /* temporary, remove later */
}; };
/*************************** /***************************

View file

@ -129,6 +129,17 @@ struct iwl_eeprom_channel {
s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */ s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */
} __packed; } __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 * iwl_eeprom_enhanced_txpwr structure
* This structure presents the enhanced regulatory tx power limit layout * 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 * 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 * into individual structures; each one is 8 bytes in size and contain the
* following information * 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_a_max_pwr: chain a max power in 1/2 dBm
* @chain_b_max_pwr: chain b 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 * @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 * @mimo2_max_pwr: mimo2 max power in 1/2 dBm
* @mimo3_max_pwr: mimo3 max power in 1/2 dBm * @mimo3_max_pwr: mimo3 max power in 1/2 dBm
* *
*/ */
struct iwl_eeprom_enhanced_txpwr { struct iwl_eeprom_enhanced_txpwr {
__le16 common; u8 flags;
u8 channel;
s8 chain_a_max; s8 chain_a_max;
s8 chain_b_max; s8 chain_b_max;
s8 chain_c_max; s8 chain_c_max;
s8 reserved; u8 delta_20_in_40;
s8 mimo2_max; s8 mimo2_max;
s8 mimo3_max; s8 mimo3_max;
} __packed; } __packed;
@ -195,6 +208,8 @@ struct iwl_eeprom_enhanced_txpwr {
#define EEPROM_LINK_CALIBRATION (2*0x67) #define EEPROM_LINK_CALIBRATION (2*0x67)
#define EEPROM_LINK_PROCESS_ADJST (2*0x68) #define EEPROM_LINK_PROCESS_ADJST (2*0x68)
#define EEPROM_LINK_OTHERS (2*0x69) #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 */ /* agn regulatory - indirect access */
#define EEPROM_REG_BAND_1_CHANNELS ((0x08)\ #define EEPROM_REG_BAND_1_CHANNELS ((0x08)\
@ -398,6 +413,8 @@ struct iwl_eeprom_calib_info {
#define INDIRECT_CALIBRATION 0x00040000 #define INDIRECT_CALIBRATION 0x00040000
#define INDIRECT_PROCESS_ADJST 0x00050000 #define INDIRECT_PROCESS_ADJST 0x00050000
#define INDIRECT_OTHERS 0x00060000 #define INDIRECT_OTHERS 0x00060000
#define INDIRECT_TXP_LIMIT 0x00070000
#define INDIRECT_TXP_LIMIT_SIZE 0x00080000
#define INDIRECT_ADDRESS 0x00100000 #define INDIRECT_ADDRESS 0x00100000
/* General */ /* General */

View file

@ -617,7 +617,7 @@ static int lbs_ret_scan(struct lbs_private *priv, unsigned long dummy,
print_ssid(ssid_buf, ssid, ssid_len), print_ssid(ssid_buf, ssid, ssid_len),
LBS_SCAN_RSSI_TO_MBM(rssi)/100); LBS_SCAN_RSSI_TO_MBM(rssi)/100);
if (channel || if (channel &&
!(channel->flags & IEEE80211_CHAN_DISABLED)) !(channel->flags & IEEE80211_CHAN_DISABLED))
cfg80211_inform_bss(wiphy, channel, cfg80211_inform_bss(wiphy, channel,
bssid, le64_to_cpu(*(__le64 *)tsfdesc), bssid, le64_to_cpu(*(__le64 *)tsfdesc),

View file

@ -43,6 +43,7 @@ MODULE_FIRMWARE("isl3887usb");
static struct usb_device_id p54u_table[] __devinitdata = { static struct usb_device_id p54u_table[] __devinitdata = {
/* Version 1 devices (pci chip + net2280) */ /* Version 1 devices (pci chip + net2280) */
{USB_DEVICE(0x0411, 0x0050)}, /* Buffalo WLI2-USB2-G54 */
{USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */ {USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */
{USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */ {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */
{USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */ {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(0x0846, 0x4220)}, /* Netgear WG111 */
{USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */ {USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */
{USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */ {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(0x107b, 0x55f2)}, /* Gateway WGU-210 (Gemtek) */
{USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */ {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(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, 0x2234)}, /* Linksys WUSB54G OEM */
{USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */ {USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */
{USB_DEVICE(0x2001, 0x3701)}, /* DLink DWL-G120 Spinnaker */ {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(0x1435, 0x0427)}, /* Inventel UR054G */
{USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */ {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */
{USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */ {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, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */
{USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */ {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
{USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */ {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */

View file

@ -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 * condition: callbacks we register can be executed at once, before we have
* initialized the struct atm_dev. To protect against this, all callbacks * initialized the struct atm_dev. To protect against this, all callbacks
* abort if atm_dev->dev_data is NULL. */ * 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) { if (!atm_dev) {
usb_err(instance, "%s: failed to register ATM device!\n", __func__); usb_err(instance, "%s: failed to register ATM device!\n", __func__);
return -1; return -1;
@ -966,14 +968,6 @@ static int usbatm_atm_init(struct usbatm_data *instance)
/* temp init ATM device, set to 128kbit */ /* temp init ATM device, set to 128kbit */
atm_dev->link_rate = 128 * 1000 / 424; 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)) { 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); atm_err(instance, "%s: atm_start failed: %d!\n", __func__, ret);
goto fail; goto fail;
@ -992,8 +986,6 @@ static int usbatm_atm_init(struct usbatm_data *instance)
return 0; return 0;
fail: fail:
sysfs_remove_link(&atm_dev->class_dev.kobj, "device");
fail_sysfs:
instance->atm_dev = NULL; instance->atm_dev = NULL;
atm_dev_deregister(atm_dev); /* usbatm_atm_dev_close will eventually be called */ atm_dev_deregister(atm_dev); /* usbatm_atm_dev_close will eventually be called */
return ret; return ret;
@ -1329,7 +1321,6 @@ void usbatm_usb_disconnect(struct usb_interface *intf)
/* ATM finalize */ /* ATM finalize */
if (instance->atm_dev) { if (instance->atm_dev) {
sysfs_remove_link(&instance->atm_dev->class_dev.kobj, "device");
atm_dev_deregister(instance->atm_dev); atm_dev_deregister(instance->atm_dev);
instance->atm_dev = NULL; instance->atm_dev = NULL;
} }

View file

@ -427,8 +427,10 @@ extern rwlock_t vcc_sklist_lock;
#define ATM_SKB(skb) (((struct atm_skb_data *) (skb)->cb)) #define ATM_SKB(skb) (((struct atm_skb_data *) (skb)->cb))
struct atm_dev *atm_dev_register(const char *type,const struct atmdev_ops *ops, struct atm_dev *atm_dev_register(const char *type, struct device *parent,
int number,unsigned long *flags); /* number == -1: pick first available */ const struct atmdev_ops *ops,
int number, /* -1 == pick first available */
unsigned long *flags);
struct atm_dev *atm_dev_lookup(int number); struct atm_dev *atm_dev_lookup(int number);
void atm_dev_deregister(struct atm_dev *dev); void atm_dev_deregister(struct atm_dev *dev);

View file

@ -70,7 +70,7 @@ struct nlmsghdr {
Check NLM_F_EXCL 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_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )
#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) #define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))
#define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(NLMSG_HDRLEN)) #define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(NLMSG_HDRLEN))

View file

@ -769,6 +769,7 @@ struct proto {
void (*unhash)(struct sock *sk); void (*unhash)(struct sock *sk);
void (*rehash)(struct sock *sk); void (*rehash)(struct sock *sk);
int (*get_port)(struct sock *sk, unsigned short snum); int (*get_port)(struct sock *sk, unsigned short snum);
void (*clear_sk)(struct sock *sk, int size);
/* Keeping track of sockets in use */ /* Keeping track of sockets in use */
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
@ -867,6 +868,8 @@ static inline void __sk_prot_rehash(struct sock *sk)
sk->sk_prot->hash(sk); sk->sk_prot->hash(sk);
} }
void sk_prot_clear_portaddr_nulls(struct sock *sk, int size);
/* About 10 seconds */ /* About 10 seconds */
#define SOCK_DESTROY_TIME (10*HZ) #define SOCK_DESTROY_TIME (10*HZ)

View file

@ -143,12 +143,13 @@ static struct class atm_class = {
.dev_uevent = atm_uevent, .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; struct device *cdev = &adev->class_dev;
int i, j, err; int i, j, err;
cdev->class = &atm_class; cdev->class = &atm_class;
cdev->parent = parent;
dev_set_drvdata(cdev, adev); dev_set_drvdata(cdev, adev);
dev_set_name(cdev, "%s%d", adev->type, adev->number); dev_set_name(cdev, "%s%d", adev->type, adev->number);

View file

@ -74,8 +74,9 @@ struct atm_dev *atm_dev_lookup(int number)
} }
EXPORT_SYMBOL(atm_dev_lookup); EXPORT_SYMBOL(atm_dev_lookup);
struct atm_dev *atm_dev_register(const char *type, const struct atmdev_ops *ops, struct atm_dev *atm_dev_register(const char *type, struct device *parent,
int number, unsigned long *flags) const struct atmdev_ops *ops, int number,
unsigned long *flags)
{ {
struct atm_dev *dev, *inuse; 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; 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); pr_err("atm_register_sysfs failed for dev %s\n", type);
atm_proc_dev_deregister(dev); atm_proc_dev_deregister(dev);
goto out_fail; goto out_fail;

View file

@ -42,6 +42,6 @@ static inline void atm_proc_dev_deregister(struct atm_dev *dev)
#endif /* CONFIG_PROC_FS */ #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); void atm_unregister_sysfs(struct atm_dev *adev);
#endif #endif

View file

@ -311,6 +311,7 @@ static void rfcomm_dlc_clear_state(struct rfcomm_dlc *d)
d->state = BT_OPEN; d->state = BT_OPEN;
d->flags = 0; d->flags = 0;
d->mscex = 0; d->mscex = 0;
d->sec_level = BT_SECURITY_LOW;
d->mtu = RFCOMM_DEFAULT_MTU; d->mtu = RFCOMM_DEFAULT_MTU;
d->v24_sig = RFCOMM_V24_RTC | RFCOMM_V24_RTR | RFCOMM_V24_DV; d->v24_sig = RFCOMM_V24_RTC | RFCOMM_V24_RTR | RFCOMM_V24_DV;

View file

@ -445,7 +445,7 @@ static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br,
ip6h = ipv6_hdr(skb); ip6h = ipv6_hdr(skb);
*(__force __be32 *)ip6h = htonl(0x60000000); *(__force __be32 *)ip6h = htonl(0x60000000);
ip6h->payload_len = 8 + sizeof(*mldq); ip6h->payload_len = htons(8 + sizeof(*mldq));
ip6h->nexthdr = IPPROTO_HOPOPTS; ip6h->nexthdr = IPPROTO_HOPOPTS;
ip6h->hop_limit = 1; ip6h->hop_limit = 1;
ipv6_addr_set(&ip6h->saddr, 0, 0, 0, 0); ipv6_addr_set(&ip6h->saddr, 0, 0, 0, 0);

View file

@ -1010,6 +1010,36 @@ static void sock_copy(struct sock *nsk, const struct sock *osk)
#endif #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, static struct sock *sk_prot_alloc(struct proto *prot, gfp_t priority,
int family) int family)
{ {
@ -1022,19 +1052,12 @@ static struct sock *sk_prot_alloc(struct proto *prot, gfp_t priority,
if (!sk) if (!sk)
return sk; return sk;
if (priority & __GFP_ZERO) { if (priority & __GFP_ZERO) {
/* if (prot->clear_sk)
* caches using SLAB_DESTROY_BY_RCU should let prot->clear_sk(sk, prot->obj_size);
* 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));
}
}
else else
sk_prot_clear_nulls(sk, prot->obj_size);
}
} else
sk = kmalloc(prot->obj_size, priority); sk = kmalloc(prot->obj_size, priority);
if (sk != NULL) { if (sk != NULL) {

View file

@ -96,11 +96,13 @@ bool skb_defer_rx_timestamp(struct sk_buff *skb)
struct phy_device *phydev; struct phy_device *phydev;
unsigned int type; unsigned int type;
skb_push(skb, ETH_HLEN); if (skb_headroom(skb) < ETH_HLEN)
return false;
__skb_push(skb, ETH_HLEN);
type = classify(skb); type = classify(skb);
skb_pull(skb, ETH_HLEN); __skb_pull(skb, ETH_HLEN);
switch (type) { switch (type) {
case PTP_CLASS_V1_IPV4: case PTP_CLASS_V1_IPV4:

View file

@ -851,9 +851,13 @@ static void aun_incoming(struct sk_buff *skb, struct aunhdr *ah, size_t len)
{ {
struct iphdr *ip = ip_hdr(skb); struct iphdr *ip = ip_hdr(skb);
unsigned char stn = ntohl(ip->saddr) & 0xff; unsigned char stn = ntohl(ip->saddr) & 0xff;
struct dst_entry *dst = skb_dst(skb);
struct ec_device *edev = NULL;
struct sock *sk = NULL; struct sock *sk = NULL;
struct sk_buff *newskb; struct sk_buff *newskb;
struct ec_device *edev = skb->dev->ec_ptr;
if (dst)
edev = dst->dev->ec_ptr;
if (! edev) if (! edev)
goto bad; goto bad;

View file

@ -1897,6 +1897,7 @@ struct proto udp_prot = {
.compat_setsockopt = compat_udp_setsockopt, .compat_setsockopt = compat_udp_setsockopt,
.compat_getsockopt = compat_udp_getsockopt, .compat_getsockopt = compat_udp_getsockopt,
#endif #endif
.clear_sk = sk_prot_clear_portaddr_nulls,
}; };
EXPORT_SYMBOL(udp_prot); EXPORT_SYMBOL(udp_prot);

View file

@ -57,6 +57,7 @@ struct proto udplite_prot = {
.compat_setsockopt = compat_udp_setsockopt, .compat_setsockopt = compat_udp_setsockopt,
.compat_getsockopt = compat_udp_getsockopt, .compat_getsockopt = compat_udp_getsockopt,
#endif #endif
.clear_sk = sk_prot_clear_portaddr_nulls,
}; };
EXPORT_SYMBOL(udplite_prot); EXPORT_SYMBOL(udplite_prot);

View file

@ -2669,6 +2669,8 @@ static int addrconf_ifdown(struct net_device *dev, int how)
ASSERT_RTNL(); ASSERT_RTNL();
/* Flush routes if device is being removed or it is not loopback */
if (how || !(dev->flags & IFF_LOOPBACK))
rt6_ifdown(net, dev); rt6_ifdown(net, dev);
neigh_ifdown(&nd_tbl, dev); neigh_ifdown(&nd_tbl, dev);
@ -4057,11 +4059,11 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev)
kfree_skb(skb); kfree_skb(skb);
goto errout; 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; return;
errout: errout:
if (err < 0) 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) static inline size_t inet6_prefix_nlmsg_size(void)

View file

@ -1566,11 +1566,16 @@ static void rt6_do_pmtu_disc(struct in6_addr *daddr, struct in6_addr *saddr,
{ {
struct rt6_info *rt, *nrt; struct rt6_info *rt, *nrt;
int allfrag = 0; int allfrag = 0;
again:
rt = rt6_lookup(net, daddr, saddr, ifindex, 0); rt = rt6_lookup(net, daddr, saddr, ifindex, 0);
if (rt == NULL) if (rt == NULL)
return; return;
if (rt6_check_expired(rt)) {
ip6_del_rt(rt);
goto again;
}
if (pmtu >= dst_mtu(&rt->dst)) if (pmtu >= dst_mtu(&rt->dst))
goto out; goto out;

View file

@ -1477,6 +1477,7 @@ struct proto udpv6_prot = {
.compat_setsockopt = compat_udpv6_setsockopt, .compat_setsockopt = compat_udpv6_setsockopt,
.compat_getsockopt = compat_udpv6_getsockopt, .compat_getsockopt = compat_udpv6_getsockopt,
#endif #endif
.clear_sk = sk_prot_clear_portaddr_nulls,
}; };
static struct inet_protosw udpv6_protosw = { static struct inet_protosw udpv6_protosw = {

View file

@ -55,6 +55,7 @@ struct proto udplitev6_prot = {
.compat_setsockopt = compat_udpv6_setsockopt, .compat_setsockopt = compat_udpv6_setsockopt,
.compat_getsockopt = compat_udpv6_getsockopt, .compat_getsockopt = compat_udpv6_getsockopt,
#endif #endif
.clear_sk = sk_prot_clear_portaddr_nulls,
}; };
static struct inet_protosw udplite6_protosw = { static struct inet_protosw udplite6_protosw = {

View file

@ -780,6 +780,9 @@ void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
mutex_lock(&sdata->u.ibss.mtx); 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) { switch (fc & IEEE80211_FCTL_STYPE) {
case IEEE80211_STYPE_PROBE_REQ: case IEEE80211_STYPE_PROBE_REQ:
ieee80211_rx_mgmt_probe_req(sdata, mgmt, skb->len); 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; break;
} }
mgmt_out:
mutex_unlock(&sdata->u.ibss.mtx); mutex_unlock(&sdata->u.ibss.mtx);
} }

View file

@ -1074,11 +1074,13 @@ void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
{ {
struct ieee80211_local *local = sdata->local; struct ieee80211_local *local = sdata->local;
struct ieee80211_work *wk; struct ieee80211_work *wk;
bool cleanup = false;
mutex_lock(&local->mtx); mutex_lock(&local->mtx);
list_for_each_entry(wk, &local->work_list, list) { list_for_each_entry(wk, &local->work_list, list) {
if (wk->sdata != sdata) if (wk->sdata != sdata)
continue; continue;
cleanup = true;
wk->type = IEEE80211_WORK_ABORT; wk->type = IEEE80211_WORK_ABORT;
wk->started = true; wk->started = true;
wk->timeout = jiffies; wk->timeout = jiffies;
@ -1086,6 +1088,7 @@ void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
mutex_unlock(&local->mtx); mutex_unlock(&local->mtx);
/* run cleanups etc. */ /* run cleanups etc. */
if (cleanup)
ieee80211_work_work(&local->work_work); ieee80211_work_work(&local->work_work);
mutex_lock(&local->mtx); mutex_lock(&local->mtx);

View file

@ -2932,6 +2932,7 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optva
struct sctp_association *asoc = NULL; struct sctp_association *asoc = NULL;
struct sctp_setpeerprim prim; struct sctp_setpeerprim prim;
struct sctp_chunk *chunk; struct sctp_chunk *chunk;
struct sctp_af *af;
int err; int err;
sp = sctp_sk(sk); 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)) if (!sctp_state(asoc, ESTABLISHED))
return -ENOTCONN; 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)) if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr))
return -EADDRNOTAVAIL; 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)) if (copy_to_user(optval, &val, len))
return -EFAULT; return -EFAULT;
return -ENOTSUPP; return 0;
} }
/* /*

View file

@ -732,6 +732,21 @@ static int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
return ret; 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, int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
struct kvec *vec, size_t num, size_t size, int flags) struct kvec *vec, size_t num, size_t size, int flags)
{ {

View file

@ -1268,7 +1268,7 @@ struct xfrm_state * xfrm_state_migrate(struct xfrm_state *x,
return xc; return xc;
error: error:
kfree(xc); xfrm_state_put(xc);
return NULL; return NULL;
} }
EXPORT_SYMBOL(xfrm_state_migrate); EXPORT_SYMBOL(xfrm_state_migrate);