Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (75 commits) pppoe.c: Fix kernel panic caused by __pppoe_xmit WAN: Fix a TX IRQ causing BUG() in PC300 and PCI200SYN drivers. bnx2x: Advance a version number to 1.60.01-0 bnx2x: Fixed a compilation warning bnx2x: LSO code was broken on BE platforms qlge: Fix deadlock when cancelling worker. net: fix skb_defer_rx_timestamp() cxgb4vf: Ingress Queue Entry Size needs to be 64 bytes phy: add the IC+ IP1001 driver atm: correct sysfs 'device' link creation and parent relationships MAINTAINERS: remove me from tulip SCTP: Fix SCTP_SET_PEER_PRIMARY_ADDR to accpet v4mapped address enic: Bug Fix: Pass napi reference to the isr that services receive queue ipv6: fix nl group when advertising a new link connector: add module alias net: Document the kernel_recvmsg() function r8169: Fix runtime power management hso: IP checksuming doesn't work on GE0301 option cards xfrm: Fix xfrm_state_migrate leak net: Convert netpoll blocking api in bonding driver to be a counter ...
This commit is contained in:
Коммит
b4fe2a0342
|
@ -5932,7 +5932,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/
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -2591,7 +2591,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");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,10 @@
|
||||||
static struct usb_device_id ath3k_table[] = {
|
static struct usb_device_id ath3k_table[] = {
|
||||||
/* Atheros AR3011 */
|
/* Atheros AR3011 */
|
||||||
{ USB_DEVICE(0x0CF3, 0x3000) },
|
{ USB_DEVICE(0x0CF3, 0x3000) },
|
||||||
|
|
||||||
|
/* Atheros AR3011 with sflash firmware*/
|
||||||
|
{ USB_DEVICE(0x0CF3, 0x3002) },
|
||||||
|
|
||||||
{ } /* Terminating entry */
|
{ } /* Terminating entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,9 @@ static struct usb_device_id blacklist_table[] = {
|
||||||
/* Broadcom BCM2033 without firmware */
|
/* Broadcom BCM2033 without firmware */
|
||||||
{ USB_DEVICE(0x0a5c, 0x2033), .driver_info = BTUSB_IGNORE },
|
{ USB_DEVICE(0x0a5c, 0x2033), .driver_info = BTUSB_IGNORE },
|
||||||
|
|
||||||
|
/* Atheros 3011 with sflash firmware */
|
||||||
|
{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
|
||||||
|
|
||||||
/* Broadcom BCM2035 */
|
/* Broadcom BCM2035 */
|
||||||
{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
|
{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||||
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
|
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||||
|
@ -239,7 +242,8 @@ static void btusb_intr_complete(struct urb *urb)
|
||||||
|
|
||||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
BT_ERR("%s urb %p failed to resubmit (%d)",
|
if (err != -EPERM)
|
||||||
|
BT_ERR("%s urb %p failed to resubmit (%d)",
|
||||||
hdev->name, urb, -err);
|
hdev->name, urb, -err);
|
||||||
usb_unanchor_urb(urb);
|
usb_unanchor_urb(urb);
|
||||||
}
|
}
|
||||||
|
@ -323,7 +327,8 @@ static void btusb_bulk_complete(struct urb *urb)
|
||||||
|
|
||||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
BT_ERR("%s urb %p failed to resubmit (%d)",
|
if (err != -EPERM)
|
||||||
|
BT_ERR("%s urb %p failed to resubmit (%d)",
|
||||||
hdev->name, urb, -err);
|
hdev->name, urb, -err);
|
||||||
usb_unanchor_urb(urb);
|
usb_unanchor_urb(urb);
|
||||||
}
|
}
|
||||||
|
@ -412,7 +417,8 @@ static void btusb_isoc_complete(struct urb *urb)
|
||||||
|
|
||||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
BT_ERR("%s urb %p failed to resubmit (%d)",
|
if (err != -EPERM)
|
||||||
|
BT_ERR("%s urb %p failed to resubmit (%d)",
|
||||||
hdev->name, urb, -err);
|
hdev->name, urb, -err);
|
||||||
usb_unanchor_urb(urb);
|
usb_unanchor_urb(urb);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -381,11 +381,11 @@ static void b44_set_flow_ctrl(struct b44 *bp, u32 local, u32 remote)
|
||||||
__b44_set_flow_ctrl(bp, pause_enab);
|
__b44_set_flow_ctrl(bp, pause_enab);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SSB_DRIVER_MIPS
|
#ifdef CONFIG_BCM47XX
|
||||||
extern char *nvram_get(char *name);
|
#include <asm/mach-bcm47xx/nvram.h>
|
||||||
static void b44_wap54g10_workaround(struct b44 *bp)
|
static void b44_wap54g10_workaround(struct b44 *bp)
|
||||||
{
|
{
|
||||||
const char *str;
|
char buf[20];
|
||||||
u32 val;
|
u32 val;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
@ -394,10 +394,9 @@ static void b44_wap54g10_workaround(struct b44 *bp)
|
||||||
* see https://dev.openwrt.org/ticket/146
|
* see https://dev.openwrt.org/ticket/146
|
||||||
* check and reset bit "isolate"
|
* check and reset bit "isolate"
|
||||||
*/
|
*/
|
||||||
str = nvram_get("boardnum");
|
if (nvram_getenv("boardnum", buf, sizeof(buf)) < 0)
|
||||||
if (!str)
|
|
||||||
return;
|
return;
|
||||||
if (simple_strtoul(str, NULL, 0) == 2) {
|
if (simple_strtoul(buf, NULL, 0) == 2) {
|
||||||
err = __b44_readphy(bp, 0, MII_BMCR, &val);
|
err = __b44_readphy(bp, 0, MII_BMCR, &val);
|
||||||
if (err)
|
if (err)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
|
@ -1235,7 +1235,7 @@ int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id,
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
netdev_for_each_mc_addr(ha, netdev)
|
netdev_for_each_mc_addr(ha, netdev)
|
||||||
memcpy(req->mac[i].byte, ha->addr, ETH_ALEN);
|
memcpy(req->mac[i++].byte, ha->addr, ETH_ALEN);
|
||||||
} else {
|
} else {
|
||||||
req->promiscuous = 1;
|
req->promiscuous = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,8 @@
|
||||||
* (you will need to reboot afterwards) */
|
* (you will need to reboot afterwards) */
|
||||||
/* #define BNX2X_STOP_ON_ERROR */
|
/* #define BNX2X_STOP_ON_ERROR */
|
||||||
|
|
||||||
#define DRV_MODULE_VERSION "1.60.00-4"
|
#define DRV_MODULE_VERSION "1.60.01-0"
|
||||||
#define DRV_MODULE_RELDATE "2010/11/01"
|
#define DRV_MODULE_RELDATE "2010/11/12"
|
||||||
#define BNX2X_BC_VER 0x040200
|
#define BNX2X_BC_VER 0x040200
|
||||||
|
|
||||||
#define BNX2X_MULTI_QUEUE
|
#define BNX2X_MULTI_QUEUE
|
||||||
|
|
|
@ -1782,15 +1782,15 @@ exit_lbl:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline void bnx2x_set_pbd_gso_e2(struct sk_buff *skb,
|
static inline void bnx2x_set_pbd_gso_e2(struct sk_buff *skb, u32 *parsing_data,
|
||||||
struct eth_tx_parse_bd_e2 *pbd,
|
u32 xmit_type)
|
||||||
u32 xmit_type)
|
|
||||||
{
|
{
|
||||||
pbd->parsing_data |= cpu_to_le16(skb_shinfo(skb)->gso_size) <<
|
*parsing_data |= (skb_shinfo(skb)->gso_size <<
|
||||||
ETH_TX_PARSE_BD_E2_LSO_MSS_SHIFT;
|
ETH_TX_PARSE_BD_E2_LSO_MSS_SHIFT) &
|
||||||
|
ETH_TX_PARSE_BD_E2_LSO_MSS;
|
||||||
if ((xmit_type & XMIT_GSO_V6) &&
|
if ((xmit_type & XMIT_GSO_V6) &&
|
||||||
(ipv6_hdr(skb)->nexthdr == NEXTHDR_IPV6))
|
(ipv6_hdr(skb)->nexthdr == NEXTHDR_IPV6))
|
||||||
pbd->parsing_data |= ETH_TX_PARSE_BD_E2_IPV6_WITH_EXT_HDR;
|
*parsing_data |= ETH_TX_PARSE_BD_E2_IPV6_WITH_EXT_HDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1835,15 +1835,15 @@ static inline void bnx2x_set_pbd_gso(struct sk_buff *skb,
|
||||||
* @return header len
|
* @return header len
|
||||||
*/
|
*/
|
||||||
static inline u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb,
|
static inline u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb,
|
||||||
struct eth_tx_parse_bd_e2 *pbd,
|
u32 *parsing_data, u32 xmit_type)
|
||||||
u32 xmit_type)
|
|
||||||
{
|
{
|
||||||
pbd->parsing_data |= cpu_to_le16(tcp_hdrlen(skb)/4) <<
|
*parsing_data |= ((tcp_hdrlen(skb)/4) <<
|
||||||
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT;
|
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) &
|
||||||
|
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW;
|
||||||
|
|
||||||
pbd->parsing_data |= cpu_to_le16(((unsigned char *)tcp_hdr(skb) -
|
*parsing_data |= ((((u8 *)tcp_hdr(skb) - skb->data) / 2) <<
|
||||||
skb->data) / 2) <<
|
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) &
|
||||||
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT;
|
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W;
|
||||||
|
|
||||||
return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data;
|
return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data;
|
||||||
}
|
}
|
||||||
|
@ -1912,6 +1912,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
struct eth_tx_bd *tx_data_bd, *total_pkt_bd = NULL;
|
struct eth_tx_bd *tx_data_bd, *total_pkt_bd = NULL;
|
||||||
struct eth_tx_parse_bd_e1x *pbd_e1x = NULL;
|
struct eth_tx_parse_bd_e1x *pbd_e1x = NULL;
|
||||||
struct eth_tx_parse_bd_e2 *pbd_e2 = NULL;
|
struct eth_tx_parse_bd_e2 *pbd_e2 = NULL;
|
||||||
|
u32 pbd_e2_parsing_data = 0;
|
||||||
u16 pkt_prod, bd_prod;
|
u16 pkt_prod, bd_prod;
|
||||||
int nbd, fp_index;
|
int nbd, fp_index;
|
||||||
dma_addr_t mapping;
|
dma_addr_t mapping;
|
||||||
|
@ -2033,8 +2034,9 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
memset(pbd_e2, 0, sizeof(struct eth_tx_parse_bd_e2));
|
memset(pbd_e2, 0, sizeof(struct eth_tx_parse_bd_e2));
|
||||||
/* Set PBD in checksum offload case */
|
/* Set PBD in checksum offload case */
|
||||||
if (xmit_type & XMIT_CSUM)
|
if (xmit_type & XMIT_CSUM)
|
||||||
hlen = bnx2x_set_pbd_csum_e2(bp,
|
hlen = bnx2x_set_pbd_csum_e2(bp, skb,
|
||||||
skb, pbd_e2, xmit_type);
|
&pbd_e2_parsing_data,
|
||||||
|
xmit_type);
|
||||||
} else {
|
} else {
|
||||||
pbd_e1x = &fp->tx_desc_ring[bd_prod].parse_bd_e1x;
|
pbd_e1x = &fp->tx_desc_ring[bd_prod].parse_bd_e1x;
|
||||||
memset(pbd_e1x, 0, sizeof(struct eth_tx_parse_bd_e1x));
|
memset(pbd_e1x, 0, sizeof(struct eth_tx_parse_bd_e1x));
|
||||||
|
@ -2076,10 +2078,18 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
bd_prod = bnx2x_tx_split(bp, fp, tx_buf, &tx_start_bd,
|
bd_prod = bnx2x_tx_split(bp, fp, tx_buf, &tx_start_bd,
|
||||||
hlen, bd_prod, ++nbd);
|
hlen, bd_prod, ++nbd);
|
||||||
if (CHIP_IS_E2(bp))
|
if (CHIP_IS_E2(bp))
|
||||||
bnx2x_set_pbd_gso_e2(skb, pbd_e2, xmit_type);
|
bnx2x_set_pbd_gso_e2(skb, &pbd_e2_parsing_data,
|
||||||
|
xmit_type);
|
||||||
else
|
else
|
||||||
bnx2x_set_pbd_gso(skb, pbd_e1x, xmit_type);
|
bnx2x_set_pbd_gso(skb, pbd_e1x, xmit_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the PBD's parsing_data field if not zero
|
||||||
|
* (for the chips newer than 57711).
|
||||||
|
*/
|
||||||
|
if (pbd_e2_parsing_data)
|
||||||
|
pbd_e2->parsing_data = cpu_to_le32(pbd_e2_parsing_data);
|
||||||
|
|
||||||
tx_data_bd = (struct eth_tx_bd *)tx_start_bd;
|
tx_data_bd = (struct eth_tx_bd *)tx_start_bd;
|
||||||
|
|
||||||
/* Handle fragmented skb */
|
/* Handle fragmented skb */
|
||||||
|
|
|
@ -838,7 +838,7 @@ static void bnx2x_qm_init_ptr_table(struct bnx2x *bp, int qm_cid_count,
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* SRC initializations
|
* SRC initializations
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
#ifdef BCM_CNIC
|
||||||
/* called during init func stage */
|
/* called during init func stage */
|
||||||
static void bnx2x_src_init_t2(struct bnx2x *bp, struct src_ent *t2,
|
static void bnx2x_src_init_t2(struct bnx2x *bp, struct src_ent *t2,
|
||||||
dma_addr_t t2_mapping, int src_cid_count)
|
dma_addr_t t2_mapping, int src_cid_count)
|
||||||
|
@ -862,5 +862,5 @@ static void bnx2x_src_init_t2(struct bnx2x *bp, struct src_ent *t2,
|
||||||
U64_HI((u64)t2_mapping +
|
U64_HI((u64)t2_mapping +
|
||||||
(src_cid_count-1) * sizeof(struct src_ent)));
|
(src_cid_count-1) * sizeof(struct src_ent)));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endif /* BNX2X_INIT_OPS_H */
|
#endif /* BNX2X_INIT_OPS_H */
|
||||||
|
|
|
@ -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 =
|
||||||
|
@ -1576,7 +1576,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
||||||
|
|
||||||
/* If this is the first slave, then we need to set the master's hardware
|
/* If this is the first slave, then we need to set the master's hardware
|
||||||
* address to be the same as the slave's. */
|
* address to be the same as the slave's. */
|
||||||
if (bond->slave_cnt == 0)
|
if (is_zero_ether_addr(bond->dev->dev_addr))
|
||||||
memcpy(bond->dev->dev_addr, slave_dev->dev_addr,
|
memcpy(bond->dev->dev_addr, slave_dev->dev_addr,
|
||||||
slave_dev->addr_len);
|
slave_dev->addr_len);
|
||||||
|
|
||||||
|
@ -5299,13 +5299,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;
|
||||||
|
@ -5334,9 +5327,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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5353,7 +5343,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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
* License terms: GNU General Public License (GPL) version 2
|
* License terms: GNU General Public License (GPL) version 2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ":" __func__ "():" fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ":" fmt
|
||||||
|
|
||||||
#include <linux/version.h>
|
#include <linux/version.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
* License terms: GNU General Public License (GPL) version 2
|
* License terms: GNU General Public License (GPL) version 2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ":" __func__ "():" fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ":" fmt
|
||||||
|
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
|
|
@ -2408,7 +2408,7 @@ int t4_alloc_mac_filt(struct adapter *adap, unsigned int mbox,
|
||||||
if (index < NEXACT_MAC)
|
if (index < NEXACT_MAC)
|
||||||
ret++;
|
ret++;
|
||||||
else if (hash)
|
else if (hash)
|
||||||
*hash |= (1 << hash_mac_addr(addr[i]));
|
*hash |= (1ULL << hash_mac_addr(addr[i]));
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2269,6 +2269,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
|
||||||
|
@ -2312,6 +2313,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.
|
||||||
|
@ -2320,7 +2328,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;
|
||||||
}
|
}
|
||||||
|
@ -2329,8 +2337,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
|
||||||
|
@ -2346,7 +2353,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -261,6 +261,13 @@ static void ehea_get_ethtool_stats(struct net_device *dev,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ehea_set_flags(struct net_device *dev, u32 data)
|
||||||
|
{
|
||||||
|
return ethtool_op_set_flags(dev, data, ETH_FLAG_LRO
|
||||||
|
| ETH_FLAG_TXVLAN
|
||||||
|
| ETH_FLAG_RXVLAN);
|
||||||
|
}
|
||||||
|
|
||||||
const struct ethtool_ops ehea_ethtool_ops = {
|
const struct ethtool_ops ehea_ethtool_ops = {
|
||||||
.get_settings = ehea_get_settings,
|
.get_settings = ehea_get_settings,
|
||||||
.get_drvinfo = ehea_get_drvinfo,
|
.get_drvinfo = ehea_get_drvinfo,
|
||||||
|
@ -273,6 +280,8 @@ const struct ethtool_ops ehea_ethtool_ops = {
|
||||||
.get_ethtool_stats = ehea_get_ethtool_stats,
|
.get_ethtool_stats = ehea_get_ethtool_stats,
|
||||||
.get_rx_csum = ehea_get_rx_csum,
|
.get_rx_csum = ehea_get_rx_csum,
|
||||||
.set_settings = ehea_set_settings,
|
.set_settings = ehea_set_settings,
|
||||||
|
.get_flags = ethtool_op_get_flags,
|
||||||
|
.set_flags = ehea_set_flags,
|
||||||
.nway_reset = ehea_nway_reset, /* Restart autonegotiation */
|
.nway_reset = ehea_nway_reset, /* Restart autonegotiation */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -683,7 +683,7 @@ static void ehea_proc_skb(struct ehea_port_res *pr, struct ehea_cqe *cqe,
|
||||||
int vlan_extracted = ((cqe->status & EHEA_CQE_VLAN_TAG_XTRACT) &&
|
int vlan_extracted = ((cqe->status & EHEA_CQE_VLAN_TAG_XTRACT) &&
|
||||||
pr->port->vgrp);
|
pr->port->vgrp);
|
||||||
|
|
||||||
if (use_lro) {
|
if (skb->dev->features & NETIF_F_LRO) {
|
||||||
if (vlan_extracted)
|
if (vlan_extracted)
|
||||||
lro_vlan_hwaccel_receive_skb(&pr->lro_mgr, skb,
|
lro_vlan_hwaccel_receive_skb(&pr->lro_mgr, skb,
|
||||||
pr->port->vgrp,
|
pr->port->vgrp,
|
||||||
|
@ -787,7 +787,7 @@ static int ehea_proc_rwqes(struct net_device *dev,
|
||||||
}
|
}
|
||||||
cqe = ehea_poll_rq1(qp, &wqe_index);
|
cqe = ehea_poll_rq1(qp, &wqe_index);
|
||||||
}
|
}
|
||||||
if (use_lro)
|
if (dev->features & NETIF_F_LRO)
|
||||||
lro_flush_all(&pr->lro_mgr);
|
lro_flush_all(&pr->lro_mgr);
|
||||||
|
|
||||||
pr->rx_packets += processed;
|
pr->rx_packets += processed;
|
||||||
|
@ -3278,6 +3278,9 @@ struct ehea_port *ehea_setup_single_port(struct ehea_adapter *adapter,
|
||||||
| NETIF_F_LLTX;
|
| NETIF_F_LLTX;
|
||||||
dev->watchdog_timeo = EHEA_WATCH_DOG_TIMEOUT;
|
dev->watchdog_timeo = EHEA_WATCH_DOG_TIMEOUT;
|
||||||
|
|
||||||
|
if (use_lro)
|
||||||
|
dev->features |= NETIF_F_LRO;
|
||||||
|
|
||||||
INIT_WORK(&port->reset_task, ehea_reset_port);
|
INIT_WORK(&port->reset_task, ehea_reset_port);
|
||||||
|
|
||||||
ret = register_netdev(dev);
|
ret = register_netdev(dev);
|
||||||
|
|
|
@ -1962,7 +1962,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);
|
||||||
|
|
|
@ -104,6 +104,8 @@ static void ri_tasklet(unsigned long dev)
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
dev_kfree_skb(skb);
|
dev_kfree_skb(skb);
|
||||||
stats->tx_dropped++;
|
stats->tx_dropped++;
|
||||||
|
if (skb_queue_len(&dp->tq) != 0)
|
||||||
|
goto resched;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
|
@ -4771,6 +4771,9 @@ void ixgbe_clear_interrupt_scheme(struct ixgbe_adapter *adapter)
|
||||||
adapter->rx_ring[i] = NULL;
|
adapter->rx_ring[i] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
adapter->num_tx_queues = 0;
|
||||||
|
adapter->num_rx_queues = 0;
|
||||||
|
|
||||||
ixgbe_free_q_vectors(adapter);
|
ixgbe_free_q_vectors(adapter);
|
||||||
ixgbe_reset_interrupt_capability(adapter);
|
ixgbe_reset_interrupt_capability(adapter);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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 },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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. */
|
||||||
pm_request_resume(&tp->pci_dev->dev);
|
if (pm)
|
||||||
|
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");
|
||||||
pm_schedule_suspend(&tp->pci_dev->dev, 100);
|
if (pm)
|
||||||
|
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 = {
|
||||||
|
|
|
@ -197,7 +197,9 @@ MODULE_PARM_DESC(debug, "Bitmapped debugging message enable value");
|
||||||
|
|
||||||
static void efx_remove_channels(struct efx_nic *efx);
|
static void efx_remove_channels(struct efx_nic *efx);
|
||||||
static void efx_remove_port(struct efx_nic *efx);
|
static void efx_remove_port(struct efx_nic *efx);
|
||||||
|
static void efx_init_napi(struct efx_nic *efx);
|
||||||
static void efx_fini_napi(struct efx_nic *efx);
|
static void efx_fini_napi(struct efx_nic *efx);
|
||||||
|
static void efx_fini_napi_channel(struct efx_channel *channel);
|
||||||
static void efx_fini_struct(struct efx_nic *efx);
|
static void efx_fini_struct(struct efx_nic *efx);
|
||||||
static void efx_start_all(struct efx_nic *efx);
|
static void efx_start_all(struct efx_nic *efx);
|
||||||
static void efx_stop_all(struct efx_nic *efx);
|
static void efx_stop_all(struct efx_nic *efx);
|
||||||
|
@ -335,8 +337,10 @@ void efx_process_channel_now(struct efx_channel *channel)
|
||||||
|
|
||||||
/* Disable interrupts and wait for ISRs to complete */
|
/* Disable interrupts and wait for ISRs to complete */
|
||||||
efx_nic_disable_interrupts(efx);
|
efx_nic_disable_interrupts(efx);
|
||||||
if (efx->legacy_irq)
|
if (efx->legacy_irq) {
|
||||||
synchronize_irq(efx->legacy_irq);
|
synchronize_irq(efx->legacy_irq);
|
||||||
|
efx->legacy_irq_enabled = false;
|
||||||
|
}
|
||||||
if (channel->irq)
|
if (channel->irq)
|
||||||
synchronize_irq(channel->irq);
|
synchronize_irq(channel->irq);
|
||||||
|
|
||||||
|
@ -351,6 +355,8 @@ void efx_process_channel_now(struct efx_channel *channel)
|
||||||
efx_channel_processed(channel);
|
efx_channel_processed(channel);
|
||||||
|
|
||||||
napi_enable(&channel->napi_str);
|
napi_enable(&channel->napi_str);
|
||||||
|
if (efx->legacy_irq)
|
||||||
|
efx->legacy_irq_enabled = true;
|
||||||
efx_nic_enable_interrupts(efx);
|
efx_nic_enable_interrupts(efx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -426,6 +432,7 @@ efx_alloc_channel(struct efx_nic *efx, int i, struct efx_channel *old_channel)
|
||||||
|
|
||||||
*channel = *old_channel;
|
*channel = *old_channel;
|
||||||
|
|
||||||
|
channel->napi_dev = NULL;
|
||||||
memset(&channel->eventq, 0, sizeof(channel->eventq));
|
memset(&channel->eventq, 0, sizeof(channel->eventq));
|
||||||
|
|
||||||
rx_queue = &channel->rx_queue;
|
rx_queue = &channel->rx_queue;
|
||||||
|
@ -736,9 +743,13 @@ efx_realloc_channels(struct efx_nic *efx, u32 rxq_entries, u32 txq_entries)
|
||||||
if (rc)
|
if (rc)
|
||||||
goto rollback;
|
goto rollback;
|
||||||
|
|
||||||
|
efx_init_napi(efx);
|
||||||
|
|
||||||
/* Destroy old channels */
|
/* Destroy old channels */
|
||||||
for (i = 0; i < efx->n_channels; i++)
|
for (i = 0; i < efx->n_channels; i++) {
|
||||||
|
efx_fini_napi_channel(other_channel[i]);
|
||||||
efx_remove_channel(other_channel[i]);
|
efx_remove_channel(other_channel[i]);
|
||||||
|
}
|
||||||
out:
|
out:
|
||||||
/* Free unused channel structures */
|
/* Free unused channel structures */
|
||||||
for (i = 0; i < efx->n_channels; i++)
|
for (i = 0; i < efx->n_channels; i++)
|
||||||
|
@ -1400,6 +1411,8 @@ static void efx_start_all(struct efx_nic *efx)
|
||||||
efx_start_channel(channel);
|
efx_start_channel(channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (efx->legacy_irq)
|
||||||
|
efx->legacy_irq_enabled = true;
|
||||||
efx_nic_enable_interrupts(efx);
|
efx_nic_enable_interrupts(efx);
|
||||||
|
|
||||||
/* Switch to event based MCDI completions after enabling interrupts.
|
/* Switch to event based MCDI completions after enabling interrupts.
|
||||||
|
@ -1460,8 +1473,10 @@ static void efx_stop_all(struct efx_nic *efx)
|
||||||
|
|
||||||
/* Disable interrupts and wait for ISR to complete */
|
/* Disable interrupts and wait for ISR to complete */
|
||||||
efx_nic_disable_interrupts(efx);
|
efx_nic_disable_interrupts(efx);
|
||||||
if (efx->legacy_irq)
|
if (efx->legacy_irq) {
|
||||||
synchronize_irq(efx->legacy_irq);
|
synchronize_irq(efx->legacy_irq);
|
||||||
|
efx->legacy_irq_enabled = false;
|
||||||
|
}
|
||||||
efx_for_each_channel(channel, efx) {
|
efx_for_each_channel(channel, efx) {
|
||||||
if (channel->irq)
|
if (channel->irq)
|
||||||
synchronize_irq(channel->irq);
|
synchronize_irq(channel->irq);
|
||||||
|
@ -1593,7 +1608,7 @@ static int efx_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
|
||||||
*
|
*
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
static int efx_init_napi(struct efx_nic *efx)
|
static void efx_init_napi(struct efx_nic *efx)
|
||||||
{
|
{
|
||||||
struct efx_channel *channel;
|
struct efx_channel *channel;
|
||||||
|
|
||||||
|
@ -1602,18 +1617,21 @@ static int efx_init_napi(struct efx_nic *efx)
|
||||||
netif_napi_add(channel->napi_dev, &channel->napi_str,
|
netif_napi_add(channel->napi_dev, &channel->napi_str,
|
||||||
efx_poll, napi_weight);
|
efx_poll, napi_weight);
|
||||||
}
|
}
|
||||||
return 0;
|
}
|
||||||
|
|
||||||
|
static void efx_fini_napi_channel(struct efx_channel *channel)
|
||||||
|
{
|
||||||
|
if (channel->napi_dev)
|
||||||
|
netif_napi_del(&channel->napi_str);
|
||||||
|
channel->napi_dev = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void efx_fini_napi(struct efx_nic *efx)
|
static void efx_fini_napi(struct efx_nic *efx)
|
||||||
{
|
{
|
||||||
struct efx_channel *channel;
|
struct efx_channel *channel;
|
||||||
|
|
||||||
efx_for_each_channel(channel, efx) {
|
efx_for_each_channel(channel, efx)
|
||||||
if (channel->napi_dev)
|
efx_fini_napi_channel(channel);
|
||||||
netif_napi_del(&channel->napi_str);
|
|
||||||
channel->napi_dev = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -2335,9 +2353,7 @@ static int efx_pci_probe_main(struct efx_nic *efx)
|
||||||
if (rc)
|
if (rc)
|
||||||
goto fail1;
|
goto fail1;
|
||||||
|
|
||||||
rc = efx_init_napi(efx);
|
efx_init_napi(efx);
|
||||||
if (rc)
|
|
||||||
goto fail2;
|
|
||||||
|
|
||||||
rc = efx->type->init(efx);
|
rc = efx->type->init(efx);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
|
@ -2368,7 +2384,6 @@ static int efx_pci_probe_main(struct efx_nic *efx)
|
||||||
efx->type->fini(efx);
|
efx->type->fini(efx);
|
||||||
fail3:
|
fail3:
|
||||||
efx_fini_napi(efx);
|
efx_fini_napi(efx);
|
||||||
fail2:
|
|
||||||
efx_remove_all(efx);
|
efx_remove_all(efx);
|
||||||
fail1:
|
fail1:
|
||||||
return rc;
|
return rc;
|
||||||
|
|
|
@ -621,6 +621,7 @@ struct efx_filter_state;
|
||||||
* @pci_dev: The PCI device
|
* @pci_dev: The PCI device
|
||||||
* @type: Controller type attributes
|
* @type: Controller type attributes
|
||||||
* @legacy_irq: IRQ number
|
* @legacy_irq: IRQ number
|
||||||
|
* @legacy_irq_enabled: Are IRQs enabled on NIC (INT_EN_KER register)?
|
||||||
* @workqueue: Workqueue for port reconfigures and the HW monitor.
|
* @workqueue: Workqueue for port reconfigures and the HW monitor.
|
||||||
* Work items do not hold and must not acquire RTNL.
|
* Work items do not hold and must not acquire RTNL.
|
||||||
* @workqueue_name: Name of workqueue
|
* @workqueue_name: Name of workqueue
|
||||||
|
@ -709,6 +710,7 @@ struct efx_nic {
|
||||||
struct pci_dev *pci_dev;
|
struct pci_dev *pci_dev;
|
||||||
const struct efx_nic_type *type;
|
const struct efx_nic_type *type;
|
||||||
int legacy_irq;
|
int legacy_irq;
|
||||||
|
bool legacy_irq_enabled;
|
||||||
struct workqueue_struct *workqueue;
|
struct workqueue_struct *workqueue;
|
||||||
char workqueue_name[16];
|
char workqueue_name[16];
|
||||||
struct work_struct reset_work;
|
struct work_struct reset_work;
|
||||||
|
|
|
@ -1418,6 +1418,12 @@ static irqreturn_t efx_legacy_interrupt(int irq, void *dev_id)
|
||||||
u32 queues;
|
u32 queues;
|
||||||
int syserr;
|
int syserr;
|
||||||
|
|
||||||
|
/* Could this be ours? If interrupts are disabled then the
|
||||||
|
* channel state may not be valid.
|
||||||
|
*/
|
||||||
|
if (!efx->legacy_irq_enabled)
|
||||||
|
return result;
|
||||||
|
|
||||||
/* Read the ISR which also ACKs the interrupts */
|
/* Read the ISR which also ACKs the interrupts */
|
||||||
efx_readd(efx, ®, FR_BZ_INT_ISR0);
|
efx_readd(efx, ®, FR_BZ_INT_ISR0);
|
||||||
queues = EFX_EXTRACT_DWORD(reg, 0, 31);
|
queues = EFX_EXTRACT_DWORD(reg, 0, 31);
|
||||||
|
|
|
@ -1509,6 +1509,8 @@ static int stmmac_probe(struct net_device *dev)
|
||||||
pr_warning("\tno valid MAC address;"
|
pr_warning("\tno valid MAC address;"
|
||||||
"please, use ifconfig or nwhwconfig!\n");
|
"please, use ifconfig or nwhwconfig!\n");
|
||||||
|
|
||||||
|
spin_lock_init(&priv->lock);
|
||||||
|
|
||||||
ret = register_netdev(dev);
|
ret = register_netdev(dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("%s: ERROR %i registering the device\n",
|
pr_err("%s: ERROR %i registering the device\n",
|
||||||
|
@ -1520,8 +1522,6 @@ static int stmmac_probe(struct net_device *dev)
|
||||||
dev->name, (dev->features & NETIF_F_SG) ? "on" : "off",
|
dev->name, (dev->features & NETIF_F_SG) ? "on" : "off",
|
||||||
(dev->features & NETIF_F_HW_CSUM) ? "on" : "off");
|
(dev->features & NETIF_F_HW_CSUM) ? "on" : "off");
|
||||||
|
|
||||||
spin_lock_init(&priv->lock);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -688,9 +688,6 @@ static netdev_tx_t dmfe_start_xmit(struct sk_buff *skb,
|
||||||
|
|
||||||
DMFE_DBUG(0, "dmfe_start_xmit", 0);
|
DMFE_DBUG(0, "dmfe_start_xmit", 0);
|
||||||
|
|
||||||
/* Resource flag check */
|
|
||||||
netif_stop_queue(dev);
|
|
||||||
|
|
||||||
/* Too large packet check */
|
/* Too large packet check */
|
||||||
if (skb->len > MAX_PACKET_SIZE) {
|
if (skb->len > MAX_PACKET_SIZE) {
|
||||||
pr_err("big packet = %d\n", (u16)skb->len);
|
pr_err("big packet = %d\n", (u16)skb->len);
|
||||||
|
@ -698,6 +695,9 @@ static netdev_tx_t dmfe_start_xmit(struct sk_buff *skb,
|
||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Resource flag check */
|
||||||
|
netif_stop_queue(dev);
|
||||||
|
|
||||||
spin_lock_irqsave(&db->lock, flags);
|
spin_lock_irqsave(&db->lock, flags);
|
||||||
|
|
||||||
/* No Tx resource check, it never happen nromally */
|
/* No Tx resource check, it never happen nromally */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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,10 +317,12 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
netif_wake_queue(dev);
|
if (count)
|
||||||
|
netif_wake_queue(dev);
|
||||||
spin_unlock(&port->lock);
|
spin_unlock(&port->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1917,7 +1917,8 @@ ath5k_beacon_send(struct ath5k_softc *sc)
|
||||||
sc->bmisscount = 0;
|
sc->bmisscount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sc->opmode == NL80211_IFTYPE_AP && sc->num_ap_vifs > 1) {
|
if ((sc->opmode == NL80211_IFTYPE_AP && sc->num_ap_vifs > 1) ||
|
||||||
|
sc->opmode == NL80211_IFTYPE_MESH_POINT) {
|
||||||
u64 tsf = ath5k_hw_get_tsf64(ah);
|
u64 tsf = ath5k_hw_get_tsf64(ah);
|
||||||
u32 tsftu = TSF_TO_TU(tsf);
|
u32 tsftu = TSF_TO_TU(tsf);
|
||||||
int slot = ((tsftu % sc->bintval) * ATH_BCBUF) / sc->bintval;
|
int slot = ((tsftu % sc->bintval) * ATH_BCBUF) / sc->bintval;
|
||||||
|
@ -1949,8 +1950,9 @@ ath5k_beacon_send(struct ath5k_softc *sc)
|
||||||
/* NB: hw still stops DMA, so proceed */
|
/* NB: hw still stops DMA, so proceed */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* refresh the beacon for AP mode */
|
/* refresh the beacon for AP or MESH mode */
|
||||||
if (sc->opmode == NL80211_IFTYPE_AP)
|
if (sc->opmode == NL80211_IFTYPE_AP ||
|
||||||
|
sc->opmode == NL80211_IFTYPE_MESH_POINT)
|
||||||
ath5k_beacon_update(sc->hw, vif);
|
ath5k_beacon_update(sc->hw, vif);
|
||||||
|
|
||||||
ath5k_hw_set_txdp(ah, sc->bhalq, bf->daddr);
|
ath5k_hw_set_txdp(ah, sc->bhalq, bf->daddr);
|
||||||
|
@ -2851,7 +2853,8 @@ static int ath5k_add_interface(struct ieee80211_hw *hw,
|
||||||
|
|
||||||
/* Assign the vap/adhoc to a beacon xmit slot. */
|
/* Assign the vap/adhoc to a beacon xmit slot. */
|
||||||
if ((avf->opmode == NL80211_IFTYPE_AP) ||
|
if ((avf->opmode == NL80211_IFTYPE_AP) ||
|
||||||
(avf->opmode == NL80211_IFTYPE_ADHOC)) {
|
(avf->opmode == NL80211_IFTYPE_ADHOC) ||
|
||||||
|
(avf->opmode == NL80211_IFTYPE_MESH_POINT)) {
|
||||||
int slot;
|
int slot;
|
||||||
|
|
||||||
WARN_ON(list_empty(&sc->bcbuf));
|
WARN_ON(list_empty(&sc->bcbuf));
|
||||||
|
@ -2870,7 +2873,7 @@ static int ath5k_add_interface(struct ieee80211_hw *hw,
|
||||||
sc->bslot[avf->bslot] = vif;
|
sc->bslot[avf->bslot] = vif;
|
||||||
if (avf->opmode == NL80211_IFTYPE_AP)
|
if (avf->opmode == NL80211_IFTYPE_AP)
|
||||||
sc->num_ap_vifs++;
|
sc->num_ap_vifs++;
|
||||||
else
|
else if (avf->opmode == NL80211_IFTYPE_ADHOC)
|
||||||
sc->num_adhoc_vifs++;
|
sc->num_adhoc_vifs++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,8 @@
|
||||||
#define SUB_NUM_CTL_MODES_AT_5G_40 2 /* excluding HT40, EXT-OFDM */
|
#define SUB_NUM_CTL_MODES_AT_5G_40 2 /* excluding HT40, EXT-OFDM */
|
||||||
#define SUB_NUM_CTL_MODES_AT_2G_40 3 /* excluding HT40, EXT-OFDM, EXT-CCK */
|
#define SUB_NUM_CTL_MODES_AT_2G_40 3 /* excluding HT40, EXT-OFDM, EXT-CCK */
|
||||||
|
|
||||||
|
#define CTL(_tpower, _flag) ((_tpower) | ((_flag) << 6))
|
||||||
|
|
||||||
static const struct ar9300_eeprom ar9300_default = {
|
static const struct ar9300_eeprom ar9300_default = {
|
||||||
.eepromVersion = 2,
|
.eepromVersion = 2,
|
||||||
.templateVersion = 2,
|
.templateVersion = 2,
|
||||||
|
@ -290,20 +292,21 @@ static const struct ar9300_eeprom ar9300_default = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.ctlPowerData_2G = {
|
.ctlPowerData_2G = {
|
||||||
{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } },
|
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
|
||||||
{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } },
|
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
|
||||||
{ { {60, 1}, {60, 0}, {60, 0}, {60, 1} } },
|
{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
|
||||||
|
|
||||||
{ { {60, 1}, {60, 0}, {0, 0}, {0, 0} } },
|
{ { CTL(60, 1), CTL(60, 0), CTL(0, 0), CTL(0, 0) } },
|
||||||
{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } },
|
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
|
||||||
{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } },
|
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
|
||||||
|
|
||||||
{ { {60, 0}, {60, 1}, {60, 1}, {60, 0} } },
|
{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
|
||||||
{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } },
|
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
|
||||||
{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } },
|
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
|
||||||
|
|
||||||
{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } },
|
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
|
||||||
{ { {60, 0}, {60, 1}, {60, 1}, {60, 1} } },
|
{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
|
||||||
|
{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
|
||||||
},
|
},
|
||||||
.modalHeader5G = {
|
.modalHeader5G = {
|
||||||
/* 4 idle,t1,t2,b (4 bits per setting) */
|
/* 4 idle,t1,t2,b (4 bits per setting) */
|
||||||
|
@ -568,56 +571,56 @@ static const struct ar9300_eeprom ar9300_default = {
|
||||||
.ctlPowerData_5G = {
|
.ctlPowerData_5G = {
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{60, 1}, {60, 1}, {60, 1}, {60, 1},
|
CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
|
||||||
{60, 1}, {60, 1}, {60, 1}, {60, 0},
|
CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{60, 1}, {60, 1}, {60, 1}, {60, 1},
|
CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
|
||||||
{60, 1}, {60, 1}, {60, 1}, {60, 0},
|
CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{60, 0}, {60, 1}, {60, 0}, {60, 1},
|
CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
|
||||||
{60, 1}, {60, 1}, {60, 1}, {60, 1},
|
CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{60, 0}, {60, 1}, {60, 1}, {60, 0},
|
CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
|
||||||
{60, 1}, {60, 0}, {60, 0}, {60, 0},
|
CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{60, 1}, {60, 1}, {60, 1}, {60, 0},
|
CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
|
||||||
{60, 0}, {60, 0}, {60, 0}, {60, 0},
|
CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{60, 1}, {60, 1}, {60, 1}, {60, 1},
|
CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
|
||||||
{60, 1}, {60, 0}, {60, 0}, {60, 0},
|
CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{60, 1}, {60, 1}, {60, 1}, {60, 1},
|
CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
|
||||||
{60, 1}, {60, 1}, {60, 1}, {60, 1},
|
CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{60, 1}, {60, 1}, {60, 0}, {60, 1},
|
CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
|
||||||
{60, 1}, {60, 1}, {60, 1}, {60, 0},
|
CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{60, 1}, {60, 0}, {60, 1}, {60, 1},
|
CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
|
||||||
{60, 1}, {60, 1}, {60, 0}, {60, 1},
|
CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -1827,9 +1830,9 @@ static u16 ar9003_hw_get_direct_edge_power(struct ar9300_eeprom *eep,
|
||||||
struct cal_ctl_data_5g *ctl_5g = eep->ctlPowerData_5G;
|
struct cal_ctl_data_5g *ctl_5g = eep->ctlPowerData_5G;
|
||||||
|
|
||||||
if (is2GHz)
|
if (is2GHz)
|
||||||
return ctl_2g[idx].ctlEdges[edge].tPower;
|
return CTL_EDGE_TPOWER(ctl_2g[idx].ctlEdges[edge]);
|
||||||
else
|
else
|
||||||
return ctl_5g[idx].ctlEdges[edge].tPower;
|
return CTL_EDGE_TPOWER(ctl_5g[idx].ctlEdges[edge]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 ar9003_hw_get_indirect_edge_power(struct ar9300_eeprom *eep,
|
static u16 ar9003_hw_get_indirect_edge_power(struct ar9300_eeprom *eep,
|
||||||
|
@ -1847,12 +1850,12 @@ static u16 ar9003_hw_get_indirect_edge_power(struct ar9300_eeprom *eep,
|
||||||
|
|
||||||
if (is2GHz) {
|
if (is2GHz) {
|
||||||
if (ath9k_hw_fbin2freq(ctl_freqbin[edge - 1], 1) < freq &&
|
if (ath9k_hw_fbin2freq(ctl_freqbin[edge - 1], 1) < freq &&
|
||||||
ctl_2g[idx].ctlEdges[edge - 1].flag)
|
CTL_EDGE_FLAGS(ctl_2g[idx].ctlEdges[edge - 1]))
|
||||||
return ctl_2g[idx].ctlEdges[edge - 1].tPower;
|
return CTL_EDGE_TPOWER(ctl_2g[idx].ctlEdges[edge - 1]);
|
||||||
} else {
|
} else {
|
||||||
if (ath9k_hw_fbin2freq(ctl_freqbin[edge - 1], 0) < freq &&
|
if (ath9k_hw_fbin2freq(ctl_freqbin[edge - 1], 0) < freq &&
|
||||||
ctl_5g[idx].ctlEdges[edge - 1].flag)
|
CTL_EDGE_FLAGS(ctl_5g[idx].ctlEdges[edge - 1]))
|
||||||
return ctl_5g[idx].ctlEdges[edge - 1].tPower;
|
return CTL_EDGE_TPOWER(ctl_5g[idx].ctlEdges[edge - 1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return AR9300_MAX_RATE_POWER;
|
return AR9300_MAX_RATE_POWER;
|
||||||
|
|
|
@ -261,17 +261,12 @@ struct cal_tgt_pow_ht {
|
||||||
u8 tPow2x[14];
|
u8 tPow2x[14];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct cal_ctl_edge_pwr {
|
|
||||||
u8 tPower:6,
|
|
||||||
flag:2;
|
|
||||||
} __packed;
|
|
||||||
|
|
||||||
struct cal_ctl_data_2g {
|
struct cal_ctl_data_2g {
|
||||||
struct cal_ctl_edge_pwr ctlEdges[AR9300_NUM_BAND_EDGES_2G];
|
u8 ctlEdges[AR9300_NUM_BAND_EDGES_2G];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct cal_ctl_data_5g {
|
struct cal_ctl_data_5g {
|
||||||
struct cal_ctl_edge_pwr ctlEdges[AR9300_NUM_BAND_EDGES_5G];
|
u8 ctlEdges[AR9300_NUM_BAND_EDGES_5G];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct ar9300_eeprom {
|
struct ar9300_eeprom {
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/leds.h>
|
#include <linux/leds.h>
|
||||||
#include <linux/completion.h>
|
#include <linux/completion.h>
|
||||||
|
#include <linux/pm_qos_params.h>
|
||||||
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
@ -328,7 +329,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp);
|
||||||
struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype);
|
struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype);
|
||||||
void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq);
|
void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq);
|
||||||
int ath_tx_setup(struct ath_softc *sc, int haltype);
|
int ath_tx_setup(struct ath_softc *sc, int haltype);
|
||||||
void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx);
|
bool ath_drain_all_txq(struct ath_softc *sc, bool retry_tx);
|
||||||
void ath_draintxq(struct ath_softc *sc,
|
void ath_draintxq(struct ath_softc *sc,
|
||||||
struct ath_txq *txq, bool retry_tx);
|
struct ath_txq *txq, bool retry_tx);
|
||||||
void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an);
|
void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an);
|
||||||
|
@ -646,6 +647,8 @@ struct ath_softc {
|
||||||
struct ath_descdma txsdma;
|
struct ath_descdma txsdma;
|
||||||
|
|
||||||
struct ath_ant_comb ant_comb;
|
struct ath_ant_comb ant_comb;
|
||||||
|
|
||||||
|
struct pm_qos_request_list pm_qos_req;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ath_wiphy {
|
struct ath_wiphy {
|
||||||
|
@ -675,7 +678,6 @@ static inline void ath_read_cachesize(struct ath_common *common, int *csz)
|
||||||
}
|
}
|
||||||
|
|
||||||
extern struct ieee80211_ops ath9k_ops;
|
extern struct ieee80211_ops ath9k_ops;
|
||||||
extern struct pm_qos_request_list ath9k_pm_qos_req;
|
|
||||||
extern int modparam_nohwcrypt;
|
extern int modparam_nohwcrypt;
|
||||||
extern int led_blink;
|
extern int led_blink;
|
||||||
|
|
||||||
|
|
|
@ -240,16 +240,16 @@ u16 ath9k_hw_get_max_edge_power(u16 freq, struct cal_ctl_edges *pRdEdgesPower,
|
||||||
for (i = 0; (i < num_band_edges) &&
|
for (i = 0; (i < num_band_edges) &&
|
||||||
(pRdEdgesPower[i].bChannel != AR5416_BCHAN_UNUSED); i++) {
|
(pRdEdgesPower[i].bChannel != AR5416_BCHAN_UNUSED); i++) {
|
||||||
if (freq == ath9k_hw_fbin2freq(pRdEdgesPower[i].bChannel, is2GHz)) {
|
if (freq == ath9k_hw_fbin2freq(pRdEdgesPower[i].bChannel, is2GHz)) {
|
||||||
twiceMaxEdgePower = pRdEdgesPower[i].tPower;
|
twiceMaxEdgePower = CTL_EDGE_TPOWER(pRdEdgesPower[i].ctl);
|
||||||
break;
|
break;
|
||||||
} else if ((i > 0) &&
|
} else if ((i > 0) &&
|
||||||
(freq < ath9k_hw_fbin2freq(pRdEdgesPower[i].bChannel,
|
(freq < ath9k_hw_fbin2freq(pRdEdgesPower[i].bChannel,
|
||||||
is2GHz))) {
|
is2GHz))) {
|
||||||
if (ath9k_hw_fbin2freq(pRdEdgesPower[i - 1].bChannel,
|
if (ath9k_hw_fbin2freq(pRdEdgesPower[i - 1].bChannel,
|
||||||
is2GHz) < freq &&
|
is2GHz) < freq &&
|
||||||
pRdEdgesPower[i - 1].flag) {
|
CTL_EDGE_FLAGS(pRdEdgesPower[i - 1].ctl)) {
|
||||||
twiceMaxEdgePower =
|
twiceMaxEdgePower =
|
||||||
pRdEdgesPower[i - 1].tPower;
|
CTL_EDGE_TPOWER(pRdEdgesPower[i - 1].ctl);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -233,6 +233,18 @@
|
||||||
|
|
||||||
#define AR9287_CHECKSUM_LOCATION (AR9287_EEP_START_LOC + 1)
|
#define AR9287_CHECKSUM_LOCATION (AR9287_EEP_START_LOC + 1)
|
||||||
|
|
||||||
|
#define CTL_EDGE_TPOWER(_ctl) ((_ctl) & 0x3f)
|
||||||
|
#define CTL_EDGE_FLAGS(_ctl) (((_ctl) >> 6) & 0x03)
|
||||||
|
|
||||||
|
#define LNA_CTL_BUF_MODE BIT(0)
|
||||||
|
#define LNA_CTL_ISEL_LO BIT(1)
|
||||||
|
#define LNA_CTL_ISEL_HI BIT(2)
|
||||||
|
#define LNA_CTL_BUF_IN BIT(3)
|
||||||
|
#define LNA_CTL_FEM_BAND BIT(4)
|
||||||
|
#define LNA_CTL_LOCAL_BIAS BIT(5)
|
||||||
|
#define LNA_CTL_FORCE_XPA BIT(6)
|
||||||
|
#define LNA_CTL_USE_ANT1 BIT(7)
|
||||||
|
|
||||||
enum eeprom_param {
|
enum eeprom_param {
|
||||||
EEP_NFTHRESH_5,
|
EEP_NFTHRESH_5,
|
||||||
EEP_NFTHRESH_2,
|
EEP_NFTHRESH_2,
|
||||||
|
@ -378,10 +390,7 @@ struct modal_eep_header {
|
||||||
u8 xatten2Margin[AR5416_MAX_CHAINS];
|
u8 xatten2Margin[AR5416_MAX_CHAINS];
|
||||||
u8 ob_ch1;
|
u8 ob_ch1;
|
||||||
u8 db_ch1;
|
u8 db_ch1;
|
||||||
u8 useAnt1:1,
|
u8 lna_ctl;
|
||||||
force_xpaon:1,
|
|
||||||
local_bias:1,
|
|
||||||
femBandSelectUsed:1, xlnabufin:1, xlnaisel:2, xlnabufmode:1;
|
|
||||||
u8 miscBits;
|
u8 miscBits;
|
||||||
u16 xpaBiasLvlFreq[3];
|
u16 xpaBiasLvlFreq[3];
|
||||||
u8 futureModal[6];
|
u8 futureModal[6];
|
||||||
|
@ -535,18 +544,10 @@ struct cal_target_power_ht {
|
||||||
u8 tPow2x[8];
|
u8 tPow2x[8];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
|
||||||
#ifdef __BIG_ENDIAN_BITFIELD
|
|
||||||
struct cal_ctl_edges {
|
struct cal_ctl_edges {
|
||||||
u8 bChannel;
|
u8 bChannel;
|
||||||
u8 flag:2, tPower:6;
|
u8 ctl;
|
||||||
} __packed;
|
} __packed;
|
||||||
#else
|
|
||||||
struct cal_ctl_edges {
|
|
||||||
u8 bChannel;
|
|
||||||
u8 tPower:6, flag:2;
|
|
||||||
} __packed;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct cal_data_op_loop_ar9287 {
|
struct cal_data_op_loop_ar9287 {
|
||||||
u8 pwrPdg[2][5];
|
u8 pwrPdg[2][5];
|
||||||
|
|
|
@ -451,9 +451,10 @@ static void ath9k_hw_def_set_board_values(struct ath_hw *ah,
|
||||||
ath9k_hw_analog_shift_rmw(ah, AR_AN_TOP2,
|
ath9k_hw_analog_shift_rmw(ah, AR_AN_TOP2,
|
||||||
AR_AN_TOP2_LOCALBIAS,
|
AR_AN_TOP2_LOCALBIAS,
|
||||||
AR_AN_TOP2_LOCALBIAS_S,
|
AR_AN_TOP2_LOCALBIAS_S,
|
||||||
pModal->local_bias);
|
!!(pModal->lna_ctl &
|
||||||
|
LNA_CTL_LOCAL_BIAS));
|
||||||
REG_RMW_FIELD(ah, AR_PHY_XPA_CFG, AR_PHY_FORCE_XPA_CFG,
|
REG_RMW_FIELD(ah, AR_PHY_XPA_CFG, AR_PHY_FORCE_XPA_CFG,
|
||||||
pModal->force_xpaon);
|
!!(pModal->lna_ctl & LNA_CTL_FORCE_XPA));
|
||||||
}
|
}
|
||||||
|
|
||||||
REG_RMW_FIELD(ah, AR_PHY_SETTLING, AR_PHY_SETTLING_SWITCH,
|
REG_RMW_FIELD(ah, AR_PHY_SETTLING, AR_PHY_SETTLING_SWITCH,
|
||||||
|
@ -1062,15 +1063,19 @@ static void ath9k_hw_set_def_power_per_rate_table(struct ath_hw *ah,
|
||||||
case 1:
|
case 1:
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
scaledPower -= REDUCE_SCALED_POWER_BY_TWO_CHAIN;
|
if (scaledPower > REDUCE_SCALED_POWER_BY_TWO_CHAIN)
|
||||||
|
scaledPower -= REDUCE_SCALED_POWER_BY_TWO_CHAIN;
|
||||||
|
else
|
||||||
|
scaledPower = 0;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
scaledPower -= REDUCE_SCALED_POWER_BY_THREE_CHAIN;
|
if (scaledPower > REDUCE_SCALED_POWER_BY_THREE_CHAIN)
|
||||||
|
scaledPower -= REDUCE_SCALED_POWER_BY_THREE_CHAIN;
|
||||||
|
else
|
||||||
|
scaledPower = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
scaledPower = max((u16)0, scaledPower);
|
|
||||||
|
|
||||||
if (IS_CHAN_2GHZ(chan)) {
|
if (IS_CHAN_2GHZ(chan)) {
|
||||||
numCtlModes = ARRAY_SIZE(ctlModesFor11g) -
|
numCtlModes = ARRAY_SIZE(ctlModesFor11g) -
|
||||||
SUB_NUM_CTL_MODES_AT_2G_40;
|
SUB_NUM_CTL_MODES_AT_2G_40;
|
||||||
|
@ -1428,9 +1433,9 @@ static u8 ath9k_hw_def_get_num_ant_config(struct ath_hw *ah,
|
||||||
|
|
||||||
num_ant_config = 1;
|
num_ant_config = 1;
|
||||||
|
|
||||||
if (pBase->version >= 0x0E0D)
|
if (pBase->version >= 0x0E0D &&
|
||||||
if (pModal->useAnt1)
|
(pModal->lna_ctl & LNA_CTL_USE_ANT1))
|
||||||
num_ant_config += 1;
|
num_ant_config += 1;
|
||||||
|
|
||||||
return num_ant_config;
|
return num_ant_config;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1024,6 +1024,13 @@ static int ath9k_hif_usb_suspend(struct usb_interface *interface,
|
||||||
struct hif_device_usb *hif_dev =
|
struct hif_device_usb *hif_dev =
|
||||||
(struct hif_device_usb *) usb_get_intfdata(interface);
|
(struct hif_device_usb *) usb_get_intfdata(interface);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The device has to be set to FULLSLEEP mode in case no
|
||||||
|
* interface is up.
|
||||||
|
*/
|
||||||
|
if (!(hif_dev->flags & HIF_USB_START))
|
||||||
|
ath9k_htc_suspend(hif_dev->htc_handle);
|
||||||
|
|
||||||
ath9k_hif_usb_dealloc_urbs(hif_dev);
|
ath9k_hif_usb_dealloc_urbs(hif_dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -455,6 +455,8 @@ u32 ath9k_htc_calcrxfilter(struct ath9k_htc_priv *priv);
|
||||||
void ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv);
|
void ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv);
|
||||||
void ath9k_htc_ps_restore(struct ath9k_htc_priv *priv);
|
void ath9k_htc_ps_restore(struct ath9k_htc_priv *priv);
|
||||||
void ath9k_ps_work(struct work_struct *work);
|
void ath9k_ps_work(struct work_struct *work);
|
||||||
|
bool ath9k_htc_setpower(struct ath9k_htc_priv *priv,
|
||||||
|
enum ath9k_power_mode mode);
|
||||||
|
|
||||||
void ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv);
|
void ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv);
|
||||||
void ath9k_init_leds(struct ath9k_htc_priv *priv);
|
void ath9k_init_leds(struct ath9k_htc_priv *priv);
|
||||||
|
@ -464,6 +466,7 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
|
||||||
u16 devid, char *product);
|
u16 devid, char *product);
|
||||||
void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug);
|
void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug);
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
|
void ath9k_htc_suspend(struct htc_target *htc_handle);
|
||||||
int ath9k_htc_resume(struct htc_target *htc_handle);
|
int ath9k_htc_resume(struct htc_target *htc_handle);
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ATH9K_HTC_DEBUGFS
|
#ifdef CONFIG_ATH9K_HTC_DEBUGFS
|
||||||
|
|
|
@ -891,6 +891,12 @@ void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
|
|
||||||
|
void ath9k_htc_suspend(struct htc_target *htc_handle)
|
||||||
|
{
|
||||||
|
ath9k_htc_setpower(htc_handle->drv_priv, ATH9K_PM_FULL_SLEEP);
|
||||||
|
}
|
||||||
|
|
||||||
int ath9k_htc_resume(struct htc_target *htc_handle)
|
int ath9k_htc_resume(struct htc_target *htc_handle)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
|
@ -63,8 +63,8 @@ static enum htc_phymode ath9k_htc_get_curmode(struct ath9k_htc_priv *priv,
|
||||||
return mode;
|
return mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ath9k_htc_setpower(struct ath9k_htc_priv *priv,
|
bool ath9k_htc_setpower(struct ath9k_htc_priv *priv,
|
||||||
enum ath9k_power_mode mode)
|
enum ath9k_power_mode mode)
|
||||||
{
|
{
|
||||||
bool ret;
|
bool ret;
|
||||||
|
|
||||||
|
|
|
@ -2044,7 +2044,8 @@ u32 ath9k_hw_gpio_get(struct ath_hw *ah, u32 gpio)
|
||||||
val = REG_READ(ah, AR7010_GPIO_IN);
|
val = REG_READ(ah, AR7010_GPIO_IN);
|
||||||
return (MS(val, AR7010_GPIO_IN_VAL) & AR_GPIO_BIT(gpio)) == 0;
|
return (MS(val, AR7010_GPIO_IN_VAL) & AR_GPIO_BIT(gpio)) == 0;
|
||||||
} else if (AR_SREV_9300_20_OR_LATER(ah))
|
} else if (AR_SREV_9300_20_OR_LATER(ah))
|
||||||
return MS_REG_READ(AR9300, gpio) != 0;
|
return (MS(REG_READ(ah, AR_GPIO_IN), AR9300_GPIO_IN_VAL) &
|
||||||
|
AR_GPIO_BIT(gpio)) != 0;
|
||||||
else if (AR_SREV_9271(ah))
|
else if (AR_SREV_9271(ah))
|
||||||
return MS_REG_READ(AR9271, gpio) != 0;
|
return MS_REG_READ(AR9271, gpio) != 0;
|
||||||
else if (AR_SREV_9287_11_OR_LATER(ah))
|
else if (AR_SREV_9287_11_OR_LATER(ah))
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/pm_qos_params.h>
|
|
||||||
|
|
||||||
#include "ath9k.h"
|
#include "ath9k.h"
|
||||||
|
|
||||||
|
@ -180,8 +179,6 @@ static const struct ath_ops ath9k_common_ops = {
|
||||||
.write = ath9k_iowrite32,
|
.write = ath9k_iowrite32,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pm_qos_request_list ath9k_pm_qos_req;
|
|
||||||
|
|
||||||
/**************************/
|
/**************************/
|
||||||
/* Initialization */
|
/* Initialization */
|
||||||
/**************************/
|
/**************************/
|
||||||
|
@ -664,6 +661,8 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
|
||||||
hw->flags |= IEEE80211_HW_MFP_CAPABLE;
|
hw->flags |= IEEE80211_HW_MFP_CAPABLE;
|
||||||
|
|
||||||
hw->wiphy->interface_modes =
|
hw->wiphy->interface_modes =
|
||||||
|
BIT(NL80211_IFTYPE_P2P_GO) |
|
||||||
|
BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||||
BIT(NL80211_IFTYPE_AP) |
|
BIT(NL80211_IFTYPE_AP) |
|
||||||
BIT(NL80211_IFTYPE_WDS) |
|
BIT(NL80211_IFTYPE_WDS) |
|
||||||
BIT(NL80211_IFTYPE_STATION) |
|
BIT(NL80211_IFTYPE_STATION) |
|
||||||
|
@ -759,7 +758,7 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid,
|
||||||
ath_init_leds(sc);
|
ath_init_leds(sc);
|
||||||
ath_start_rfkill_poll(sc);
|
ath_start_rfkill_poll(sc);
|
||||||
|
|
||||||
pm_qos_add_request(&ath9k_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
|
pm_qos_add_request(&sc->pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
|
||||||
PM_QOS_DEFAULT_VALUE);
|
PM_QOS_DEFAULT_VALUE);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -830,7 +829,7 @@ void ath9k_deinit_device(struct ath_softc *sc)
|
||||||
}
|
}
|
||||||
|
|
||||||
ieee80211_unregister_hw(hw);
|
ieee80211_unregister_hw(hw);
|
||||||
pm_qos_remove_request(&ath9k_pm_qos_req);
|
pm_qos_remove_request(&sc->pm_qos_req);
|
||||||
ath_rx_cleanup(sc);
|
ath_rx_cleanup(sc);
|
||||||
ath_tx_cleanup(sc);
|
ath_tx_cleanup(sc);
|
||||||
ath9k_deinit_softc(sc);
|
ath9k_deinit_softc(sc);
|
||||||
|
|
|
@ -703,8 +703,7 @@ int ath9k_hw_rxprocdesc(struct ath_hw *ah, struct ath_desc *ds,
|
||||||
rs->rs_phyerr = phyerr;
|
rs->rs_phyerr = phyerr;
|
||||||
} else if (ads.ds_rxstatus8 & AR_DecryptCRCErr)
|
} else if (ads.ds_rxstatus8 & AR_DecryptCRCErr)
|
||||||
rs->rs_status |= ATH9K_RXERR_DECRYPT;
|
rs->rs_status |= ATH9K_RXERR_DECRYPT;
|
||||||
else if ((ads.ds_rxstatus8 & AR_MichaelErr) &&
|
else if (ads.ds_rxstatus8 & AR_MichaelErr)
|
||||||
rs->rs_keyix != ATH9K_RXKEYIX_INVALID)
|
|
||||||
rs->rs_status |= ATH9K_RXERR_MIC;
|
rs->rs_status |= ATH9K_RXERR_MIC;
|
||||||
else if (ads.ds_rxstatus8 & AR_KeyMiss)
|
else if (ads.ds_rxstatus8 & AR_KeyMiss)
|
||||||
rs->rs_status |= ATH9K_RXERR_DECRYPT;
|
rs->rs_status |= ATH9K_RXERR_DECRYPT;
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/nl80211.h>
|
#include <linux/nl80211.h>
|
||||||
#include <linux/pm_qos_params.h>
|
|
||||||
#include "ath9k.h"
|
#include "ath9k.h"
|
||||||
#include "btcoex.h"
|
#include "btcoex.h"
|
||||||
|
|
||||||
|
@ -245,11 +244,12 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
|
||||||
* the relevant bits of the h/w.
|
* the relevant bits of the h/w.
|
||||||
*/
|
*/
|
||||||
ath9k_hw_set_interrupts(ah, 0);
|
ath9k_hw_set_interrupts(ah, 0);
|
||||||
ath_drain_all_txq(sc, false);
|
stopped = ath_drain_all_txq(sc, false);
|
||||||
|
|
||||||
spin_lock_bh(&sc->rx.pcu_lock);
|
spin_lock_bh(&sc->rx.pcu_lock);
|
||||||
|
|
||||||
stopped = ath_stoprecv(sc);
|
if (!ath_stoprecv(sc))
|
||||||
|
stopped = false;
|
||||||
|
|
||||||
/* XXX: do not flush receive queue here. We don't want
|
/* XXX: do not flush receive queue here. We don't want
|
||||||
* to flush data frames already in queue because of
|
* to flush data frames already in queue because of
|
||||||
|
@ -1244,7 +1244,7 @@ static int ath9k_start(struct ieee80211_hw *hw)
|
||||||
ath9k_btcoex_timer_resume(sc);
|
ath9k_btcoex_timer_resume(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
pm_qos_update_request(&ath9k_pm_qos_req, 55);
|
pm_qos_update_request(&sc->pm_qos_req, 55);
|
||||||
|
|
||||||
mutex_unlock:
|
mutex_unlock:
|
||||||
mutex_unlock(&sc->mutex);
|
mutex_unlock(&sc->mutex);
|
||||||
|
@ -1423,7 +1423,7 @@ static void ath9k_stop(struct ieee80211_hw *hw)
|
||||||
|
|
||||||
sc->sc_flags |= SC_OP_INVALID;
|
sc->sc_flags |= SC_OP_INVALID;
|
||||||
|
|
||||||
pm_qos_update_request(&ath9k_pm_qos_req, PM_QOS_DEFAULT_VALUE);
|
pm_qos_update_request(&sc->pm_qos_req, PM_QOS_DEFAULT_VALUE);
|
||||||
|
|
||||||
mutex_unlock(&sc->mutex);
|
mutex_unlock(&sc->mutex);
|
||||||
|
|
||||||
|
@ -1520,7 +1520,6 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
|
||||||
struct ath_softc *sc = aphy->sc;
|
struct ath_softc *sc = aphy->sc;
|
||||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||||
struct ath_vif *avp = (void *)vif->drv_priv;
|
struct ath_vif *avp = (void *)vif->drv_priv;
|
||||||
int i;
|
|
||||||
|
|
||||||
ath_print(common, ATH_DBG_CONFIG, "Detach Interface\n");
|
ath_print(common, ATH_DBG_CONFIG, "Detach Interface\n");
|
||||||
|
|
||||||
|
@ -1534,21 +1533,24 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
|
||||||
if ((sc->sc_ah->opmode == NL80211_IFTYPE_AP) ||
|
if ((sc->sc_ah->opmode == NL80211_IFTYPE_AP) ||
|
||||||
(sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) ||
|
(sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) ||
|
||||||
(sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) {
|
(sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) {
|
||||||
|
/* Disable SWBA interrupt */
|
||||||
|
sc->sc_ah->imask &= ~ATH9K_INT_SWBA;
|
||||||
ath9k_ps_wakeup(sc);
|
ath9k_ps_wakeup(sc);
|
||||||
|
ath9k_hw_set_interrupts(sc->sc_ah, sc->sc_ah->imask);
|
||||||
ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
|
ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
|
||||||
ath9k_ps_restore(sc);
|
ath9k_ps_restore(sc);
|
||||||
|
tasklet_kill(&sc->bcon_tasklet);
|
||||||
}
|
}
|
||||||
|
|
||||||
ath_beacon_return(sc, avp);
|
ath_beacon_return(sc, avp);
|
||||||
sc->sc_flags &= ~SC_OP_BEACONS;
|
sc->sc_flags &= ~SC_OP_BEACONS;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) {
|
if (sc->nbcnvifs) {
|
||||||
if (sc->beacon.bslot[i] == vif) {
|
/* Re-enable SWBA interrupt */
|
||||||
printk(KERN_DEBUG "%s: vif had allocated beacon "
|
sc->sc_ah->imask |= ATH9K_INT_SWBA;
|
||||||
"slot\n", __func__);
|
ath9k_ps_wakeup(sc);
|
||||||
sc->beacon.bslot[i] = NULL;
|
ath9k_hw_set_interrupts(sc->sc_ah, sc->sc_ah->imask);
|
||||||
sc->beacon.bslot_aphy[i] = NULL;
|
ath9k_ps_restore(sc);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sc->nvifs--;
|
sc->nvifs--;
|
||||||
|
|
|
@ -838,6 +838,10 @@ static bool ath9k_rx_accept(struct ath_common *common,
|
||||||
struct ath_rx_status *rx_stats,
|
struct ath_rx_status *rx_stats,
|
||||||
bool *decrypt_error)
|
bool *decrypt_error)
|
||||||
{
|
{
|
||||||
|
#define is_mc_or_valid_tkip_keyix ((is_mc || \
|
||||||
|
(rx_stats->rs_keyix != ATH9K_RXKEYIX_INVALID && \
|
||||||
|
test_bit(rx_stats->rs_keyix, common->tkip_keymap))))
|
||||||
|
|
||||||
struct ath_hw *ah = common->ah;
|
struct ath_hw *ah = common->ah;
|
||||||
__le16 fc;
|
__le16 fc;
|
||||||
u8 rx_status_len = ah->caps.rx_status_len;
|
u8 rx_status_len = ah->caps.rx_status_len;
|
||||||
|
@ -879,15 +883,18 @@ static bool ath9k_rx_accept(struct ath_common *common,
|
||||||
if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) {
|
if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) {
|
||||||
*decrypt_error = true;
|
*decrypt_error = true;
|
||||||
} else if (rx_stats->rs_status & ATH9K_RXERR_MIC) {
|
} else if (rx_stats->rs_status & ATH9K_RXERR_MIC) {
|
||||||
|
bool is_mc;
|
||||||
/*
|
/*
|
||||||
* The MIC error bit is only valid if the frame
|
* The MIC error bit is only valid if the frame
|
||||||
* is not a control frame or fragment, and it was
|
* is not a control frame or fragment, and it was
|
||||||
* decrypted using a valid TKIP key.
|
* decrypted using a valid TKIP key.
|
||||||
*/
|
*/
|
||||||
|
is_mc = !!is_multicast_ether_addr(hdr->addr1);
|
||||||
|
|
||||||
if (!ieee80211_is_ctl(fc) &&
|
if (!ieee80211_is_ctl(fc) &&
|
||||||
!ieee80211_has_morefrags(fc) &&
|
!ieee80211_has_morefrags(fc) &&
|
||||||
!(le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG) &&
|
!(le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG) &&
|
||||||
test_bit(rx_stats->rs_keyix, common->tkip_keymap))
|
is_mc_or_valid_tkip_keyix)
|
||||||
rxs->flag |= RX_FLAG_MMIC_ERROR;
|
rxs->flag |= RX_FLAG_MMIC_ERROR;
|
||||||
else
|
else
|
||||||
rx_stats->rs_status &= ~ATH9K_RXERR_MIC;
|
rx_stats->rs_status &= ~ATH9K_RXERR_MIC;
|
||||||
|
|
|
@ -984,11 +984,13 @@ enum {
|
||||||
#define AR9287_GPIO_IN_VAL_S 11
|
#define AR9287_GPIO_IN_VAL_S 11
|
||||||
#define AR9271_GPIO_IN_VAL 0xFFFF0000
|
#define AR9271_GPIO_IN_VAL 0xFFFF0000
|
||||||
#define AR9271_GPIO_IN_VAL_S 16
|
#define AR9271_GPIO_IN_VAL_S 16
|
||||||
#define AR9300_GPIO_IN_VAL 0x0001FFFF
|
|
||||||
#define AR9300_GPIO_IN_VAL_S 0
|
|
||||||
#define AR7010_GPIO_IN_VAL 0x0000FFFF
|
#define AR7010_GPIO_IN_VAL 0x0000FFFF
|
||||||
#define AR7010_GPIO_IN_VAL_S 0
|
#define AR7010_GPIO_IN_VAL_S 0
|
||||||
|
|
||||||
|
#define AR_GPIO_IN 0x404c
|
||||||
|
#define AR9300_GPIO_IN_VAL 0x0001FFFF
|
||||||
|
#define AR9300_GPIO_IN_VAL_S 0
|
||||||
|
|
||||||
#define AR_GPIO_OE_OUT (AR_SREV_9300_20_OR_LATER(ah) ? 0x4050 : 0x404c)
|
#define AR_GPIO_OE_OUT (AR_SREV_9300_20_OR_LATER(ah) ? 0x4050 : 0x404c)
|
||||||
#define AR_GPIO_OE_OUT_DRV 0x3
|
#define AR_GPIO_OE_OUT_DRV 0x3
|
||||||
#define AR_GPIO_OE_OUT_DRV_NO 0x0
|
#define AR_GPIO_OE_OUT_DRV_NO 0x0
|
||||||
|
|
|
@ -1120,7 +1120,7 @@ void ath_draintxq(struct ath_softc *sc, struct ath_txq *txq, bool retry_tx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
|
bool ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
|
||||||
{
|
{
|
||||||
struct ath_hw *ah = sc->sc_ah;
|
struct ath_hw *ah = sc->sc_ah;
|
||||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||||
|
@ -1128,7 +1128,7 @@ void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
|
||||||
int i, npend = 0;
|
int i, npend = 0;
|
||||||
|
|
||||||
if (sc->sc_flags & SC_OP_INVALID)
|
if (sc->sc_flags & SC_OP_INVALID)
|
||||||
return;
|
return true;
|
||||||
|
|
||||||
/* Stop beacon queue */
|
/* Stop beacon queue */
|
||||||
ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
|
ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
|
||||||
|
@ -1142,25 +1142,15 @@ void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (npend) {
|
if (npend)
|
||||||
int r;
|
ath_print(common, ATH_DBG_FATAL, "Failed to stop TX DMA!\n");
|
||||||
|
|
||||||
ath_print(common, ATH_DBG_FATAL,
|
|
||||||
"Failed to stop TX DMA. Resetting hardware!\n");
|
|
||||||
|
|
||||||
spin_lock_bh(&sc->sc_resetlock);
|
|
||||||
r = ath9k_hw_reset(ah, sc->sc_ah->curchan, ah->caldata, false);
|
|
||||||
if (r)
|
|
||||||
ath_print(common, ATH_DBG_FATAL,
|
|
||||||
"Unable to reset hardware; reset status %d\n",
|
|
||||||
r);
|
|
||||||
spin_unlock_bh(&sc->sc_resetlock);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
|
for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
|
||||||
if (ATH_TXQ_SETUP(sc, i))
|
if (ATH_TXQ_SETUP(sc, i))
|
||||||
ath_draintxq(sc, &sc->tx.txq[i], retry_tx);
|
ath_draintxq(sc, &sc->tx.txq[i], retry_tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return !npend;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq)
|
void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq)
|
||||||
|
|
|
@ -291,7 +291,8 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len)
|
||||||
|
|
||||||
if (SUPP(CARL9170FW_WLANTX_CAB)) {
|
if (SUPP(CARL9170FW_WLANTX_CAB)) {
|
||||||
ar->hw->wiphy->interface_modes |=
|
ar->hw->wiphy->interface_modes |=
|
||||||
BIT(NL80211_IFTYPE_AP);
|
BIT(NL80211_IFTYPE_AP) |
|
||||||
|
BIT(NL80211_IFTYPE_P2P_GO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1631,7 +1631,8 @@ void *carl9170_alloc(size_t priv_size)
|
||||||
* supports these modes. The code which will add the
|
* supports these modes. The code which will add the
|
||||||
* additional interface_modes is in fw.c.
|
* additional interface_modes is in fw.c.
|
||||||
*/
|
*/
|
||||||
hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
|
hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||||
|
BIT(NL80211_IFTYPE_P2P_CLIENT);
|
||||||
|
|
||||||
hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS |
|
hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS |
|
||||||
IEEE80211_HW_REPORTS_TX_ACK_STATUS |
|
IEEE80211_HW_REPORTS_TX_ACK_STATUS |
|
||||||
|
|
|
@ -810,7 +810,7 @@ static int carl9170_tx_prepare(struct ar9170 *ar, struct sk_buff *skb)
|
||||||
|
|
||||||
mac_tmp = cpu_to_le16(AR9170_TX_MAC_HW_DURATION |
|
mac_tmp = cpu_to_le16(AR9170_TX_MAC_HW_DURATION |
|
||||||
AR9170_TX_MAC_BACKOFF);
|
AR9170_TX_MAC_BACKOFF);
|
||||||
mac_tmp |= cpu_to_le16((hw_queue << AR9170_TX_MAC_QOS_S) &&
|
mac_tmp |= cpu_to_le16((hw_queue << AR9170_TX_MAC_QOS_S) &
|
||||||
AR9170_TX_MAC_QOS);
|
AR9170_TX_MAC_QOS);
|
||||||
|
|
||||||
no_ack = !!(info->flags & IEEE80211_TX_CTL_NO_ACK);
|
no_ack = !!(info->flags & IEEE80211_TX_CTL_NO_ACK);
|
||||||
|
|
|
@ -1170,7 +1170,6 @@ static void if_sdio_remove(struct sdio_func *func)
|
||||||
lbs_deb_sdio("call remove card\n");
|
lbs_deb_sdio("call remove card\n");
|
||||||
lbs_stop_card(card->priv);
|
lbs_stop_card(card->priv);
|
||||||
lbs_remove_card(card->priv);
|
lbs_remove_card(card->priv);
|
||||||
card->priv->surpriseremoved = 1;
|
|
||||||
|
|
||||||
flush_workqueue(card->workqueue);
|
flush_workqueue(card->workqueue);
|
||||||
destroy_workqueue(card->workqueue);
|
destroy_workqueue(card->workqueue);
|
||||||
|
|
|
@ -1055,7 +1055,6 @@ static int __devexit libertas_spi_remove(struct spi_device *spi)
|
||||||
lbs_stop_card(priv);
|
lbs_stop_card(priv);
|
||||||
lbs_remove_card(priv); /* will call free_netdev */
|
lbs_remove_card(priv); /* will call free_netdev */
|
||||||
|
|
||||||
priv->surpriseremoved = 1;
|
|
||||||
free_irq(spi->irq, card);
|
free_irq(spi->irq, card);
|
||||||
if_spi_terminate_spi_thread(card);
|
if_spi_terminate_spi_thread(card);
|
||||||
if (card->pdata->teardown)
|
if (card->pdata->teardown)
|
||||||
|
|
|
@ -915,8 +915,6 @@ void lbs_remove_card(struct lbs_private *priv)
|
||||||
|
|
||||||
lbs_free_adapter(priv);
|
lbs_free_adapter(priv);
|
||||||
lbs_cfg_free(priv);
|
lbs_cfg_free(priv);
|
||||||
|
|
||||||
priv->dev = NULL;
|
|
||||||
free_netdev(dev);
|
free_netdev(dev);
|
||||||
|
|
||||||
lbs_deb_leave(LBS_DEB_MAIN);
|
lbs_deb_leave(LBS_DEB_MAIN);
|
||||||
|
|
|
@ -1392,10 +1392,9 @@ static void orinoco_process_scan_results(struct work_struct *work)
|
||||||
orinoco_add_hostscan_results(priv, buf, len);
|
orinoco_add_hostscan_results(priv, buf, len);
|
||||||
|
|
||||||
kfree(buf);
|
kfree(buf);
|
||||||
} else if (priv->scan_request) {
|
} else {
|
||||||
/* Either abort or complete the scan */
|
/* Either abort or complete the scan */
|
||||||
cfg80211_scan_done(priv->scan_request, (len < 0));
|
orinoco_scan_done(priv, (len < 0));
|
||||||
priv->scan_request = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->scan_lock, flags);
|
spin_lock_irqsave(&priv->scan_lock, flags);
|
||||||
|
@ -1684,6 +1683,8 @@ static int __orinoco_down(struct orinoco_private *priv)
|
||||||
hermes_write_regn(hw, EVACK, 0xffff);
|
hermes_write_regn(hw, EVACK, 0xffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
orinoco_scan_done(priv, true);
|
||||||
|
|
||||||
/* firmware will have to reassociate */
|
/* firmware will have to reassociate */
|
||||||
netif_carrier_off(dev);
|
netif_carrier_off(dev);
|
||||||
priv->last_linkstatus = 0xffff;
|
priv->last_linkstatus = 0xffff;
|
||||||
|
@ -1762,10 +1763,7 @@ void orinoco_reset(struct work_struct *work)
|
||||||
orinoco_unlock(priv, &flags);
|
orinoco_unlock(priv, &flags);
|
||||||
|
|
||||||
/* Scanning support: Notify scan cancellation */
|
/* Scanning support: Notify scan cancellation */
|
||||||
if (priv->scan_request) {
|
orinoco_scan_done(priv, true);
|
||||||
cfg80211_scan_done(priv->scan_request, 1);
|
|
||||||
priv->scan_request = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (priv->hard_reset) {
|
if (priv->hard_reset) {
|
||||||
err = (*priv->hard_reset)(priv);
|
err = (*priv->hard_reset)(priv);
|
||||||
|
@ -1813,6 +1811,12 @@ static int __orinoco_commit(struct orinoco_private *priv)
|
||||||
struct net_device *dev = priv->ndev;
|
struct net_device *dev = priv->ndev;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
/* If we've called commit, we are reconfiguring or bringing the
|
||||||
|
* interface up. Maintaining countermeasures across this would
|
||||||
|
* be confusing, so note that we've disabled them. The port will
|
||||||
|
* be enabled later in orinoco_commit or __orinoco_up. */
|
||||||
|
priv->tkip_cm_active = 0;
|
||||||
|
|
||||||
err = orinoco_hw_program_rids(priv);
|
err = orinoco_hw_program_rids(priv);
|
||||||
|
|
||||||
/* FIXME: what about netif_tx_lock */
|
/* FIXME: what about netif_tx_lock */
|
||||||
|
|
|
@ -151,20 +151,20 @@ orinoco_cs_config(struct pcmcia_device *link)
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = pcmcia_request_irq(link, orinoco_interrupt);
|
|
||||||
if (ret)
|
|
||||||
goto failed;
|
|
||||||
|
|
||||||
/* We initialize the hermes structure before completing PCMCIA
|
|
||||||
* configuration just in case the interrupt handler gets
|
|
||||||
* called. */
|
|
||||||
mem = ioport_map(link->resource[0]->start,
|
mem = ioport_map(link->resource[0]->start,
|
||||||
resource_size(link->resource[0]));
|
resource_size(link->resource[0]));
|
||||||
if (!mem)
|
if (!mem)
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
|
/* We initialize the hermes structure before completing PCMCIA
|
||||||
|
* configuration just in case the interrupt handler gets
|
||||||
|
* called. */
|
||||||
hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING);
|
hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING);
|
||||||
|
|
||||||
|
ret = pcmcia_request_irq(link, orinoco_interrupt);
|
||||||
|
if (ret)
|
||||||
|
goto failed;
|
||||||
|
|
||||||
ret = pcmcia_enable_device(link);
|
ret = pcmcia_enable_device(link);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
|
@ -229,3 +229,11 @@ void orinoco_add_hostscan_results(struct orinoco_private *priv,
|
||||||
priv->scan_request = NULL;
|
priv->scan_request = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void orinoco_scan_done(struct orinoco_private *priv, bool abort)
|
||||||
|
{
|
||||||
|
if (priv->scan_request) {
|
||||||
|
cfg80211_scan_done(priv->scan_request, abort);
|
||||||
|
priv->scan_request = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -16,5 +16,6 @@ void orinoco_add_extscan_result(struct orinoco_private *priv,
|
||||||
void orinoco_add_hostscan_results(struct orinoco_private *dev,
|
void orinoco_add_hostscan_results(struct orinoco_private *dev,
|
||||||
unsigned char *buf,
|
unsigned char *buf,
|
||||||
size_t len);
|
size_t len);
|
||||||
|
void orinoco_scan_done(struct orinoco_private *priv, bool abort);
|
||||||
|
|
||||||
#endif /* _ORINOCO_SCAN_H_ */
|
#endif /* _ORINOCO_SCAN_H_ */
|
||||||
|
|
|
@ -214,21 +214,21 @@ spectrum_cs_config(struct pcmcia_device *link)
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = pcmcia_request_irq(link, orinoco_interrupt);
|
|
||||||
if (ret)
|
|
||||||
goto failed;
|
|
||||||
|
|
||||||
/* We initialize the hermes structure before completing PCMCIA
|
|
||||||
* configuration just in case the interrupt handler gets
|
|
||||||
* called. */
|
|
||||||
mem = ioport_map(link->resource[0]->start,
|
mem = ioport_map(link->resource[0]->start,
|
||||||
resource_size(link->resource[0]));
|
resource_size(link->resource[0]));
|
||||||
if (!mem)
|
if (!mem)
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
|
/* We initialize the hermes structure before completing PCMCIA
|
||||||
|
* configuration just in case the interrupt handler gets
|
||||||
|
* called. */
|
||||||
hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING);
|
hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING);
|
||||||
hw->eeprom_pda = true;
|
hw->eeprom_pda = true;
|
||||||
|
|
||||||
|
ret = pcmcia_request_irq(link, orinoco_interrupt);
|
||||||
|
if (ret)
|
||||||
|
goto failed;
|
||||||
|
|
||||||
ret = pcmcia_enable_device(link);
|
ret = pcmcia_enable_device(link);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
|
@ -911,10 +911,10 @@ static int orinoco_ioctl_set_auth(struct net_device *dev,
|
||||||
*/
|
*/
|
||||||
if (param->value) {
|
if (param->value) {
|
||||||
priv->tkip_cm_active = 1;
|
priv->tkip_cm_active = 1;
|
||||||
ret = hermes_enable_port(hw, 0);
|
ret = hermes_disable_port(hw, 0);
|
||||||
} else {
|
} else {
|
||||||
priv->tkip_cm_active = 0;
|
priv->tkip_cm_active = 0;
|
||||||
ret = hermes_disable_port(hw, 0);
|
ret = hermes_enable_port(hw, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -884,6 +884,7 @@ static int log_write(void __user *log_base,
|
||||||
int r;
|
int r;
|
||||||
if (!write_length)
|
if (!write_length)
|
||||||
return 0;
|
return 0;
|
||||||
|
write_length += write_address % VHOST_PAGE_SIZE;
|
||||||
write_address /= VHOST_PAGE_SIZE;
|
write_address /= VHOST_PAGE_SIZE;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
u64 base = (u64)(unsigned long)log_base;
|
u64 base = (u64)(unsigned long)log_base;
|
||||||
|
@ -897,7 +898,7 @@ static int log_write(void __user *log_base,
|
||||||
if (write_length <= VHOST_PAGE_SIZE)
|
if (write_length <= VHOST_PAGE_SIZE)
|
||||||
break;
|
break;
|
||||||
write_length -= VHOST_PAGE_SIZE;
|
write_length -= VHOST_PAGE_SIZE;
|
||||||
write_address += VHOST_PAGE_SIZE;
|
write_address += 1;
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -230,6 +230,7 @@ enum
|
||||||
LINUX_MIB_TCPMINTTLDROP, /* RFC 5082 */
|
LINUX_MIB_TCPMINTTLDROP, /* RFC 5082 */
|
||||||
LINUX_MIB_TCPDEFERACCEPTDROP,
|
LINUX_MIB_TCPDEFERACCEPTDROP,
|
||||||
LINUX_MIB_IPRPFILTER, /* IP Reverse Path Filter (rp_filter) */
|
LINUX_MIB_IPRPFILTER, /* IP Reverse Path Filter (rp_filter) */
|
||||||
|
LINUX_MIB_TCPTIMEWAITOVERFLOW, /* TCPTimeWaitOverflow */
|
||||||
__LINUX_MIB_MAX
|
__LINUX_MIB_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1155,6 +1155,8 @@ extern void sk_common_release(struct sock *sk);
|
||||||
/* Initialise core socket variables */
|
/* Initialise core socket variables */
|
||||||
extern void sock_init_data(struct socket *sock, struct sock *sk);
|
extern void sock_init_data(struct socket *sock, struct sock *sk);
|
||||||
|
|
||||||
|
extern void sk_filter_release_rcu(struct rcu_head *rcu);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sk_filter_release - release a socket filter
|
* sk_filter_release - release a socket filter
|
||||||
* @fp: filter to remove
|
* @fp: filter to remove
|
||||||
|
@ -1165,7 +1167,7 @@ extern void sock_init_data(struct socket *sock, struct sock *sk);
|
||||||
static inline void sk_filter_release(struct sk_filter *fp)
|
static inline void sk_filter_release(struct sk_filter *fp)
|
||||||
{
|
{
|
||||||
if (atomic_dec_and_test(&fp->refcnt))
|
if (atomic_dec_and_test(&fp->refcnt))
|
||||||
kfree(fp);
|
call_rcu_bh(&fp->rcu, sk_filter_release_rcu);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp)
|
static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -882,7 +882,7 @@ static int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type)
|
||||||
int lm = 0;
|
int lm = 0;
|
||||||
|
|
||||||
if (type != SCO_LINK && type != ESCO_LINK)
|
if (type != SCO_LINK && type != ESCO_LINK)
|
||||||
return 0;
|
return -EINVAL;
|
||||||
|
|
||||||
BT_DBG("hdev %s, bdaddr %s", hdev->name, batostr(bdaddr));
|
BT_DBG("hdev %s, bdaddr %s", hdev->name, batostr(bdaddr));
|
||||||
|
|
||||||
|
@ -908,7 +908,7 @@ static int sco_connect_cfm(struct hci_conn *hcon, __u8 status)
|
||||||
BT_DBG("hcon %p bdaddr %s status %d", hcon, batostr(&hcon->dst), status);
|
BT_DBG("hcon %p bdaddr %s status %d", hcon, batostr(&hcon->dst), status);
|
||||||
|
|
||||||
if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
|
if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
|
||||||
return 0;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!status) {
|
if (!status) {
|
||||||
struct sco_conn *conn;
|
struct sco_conn *conn;
|
||||||
|
@ -927,7 +927,7 @@ static int sco_disconn_cfm(struct hci_conn *hcon, __u8 reason)
|
||||||
BT_DBG("hcon %p reason %d", hcon, reason);
|
BT_DBG("hcon %p reason %d", hcon, reason);
|
||||||
|
|
||||||
if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
|
if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
|
||||||
return 0;
|
return -EINVAL;
|
||||||
|
|
||||||
sco_conn_del(hcon, bt_err(reason));
|
sco_conn_del(hcon, bt_err(reason));
|
||||||
|
|
||||||
|
|
|
@ -589,23 +589,16 @@ int sk_chk_filter(struct sock_filter *filter, int flen)
|
||||||
EXPORT_SYMBOL(sk_chk_filter);
|
EXPORT_SYMBOL(sk_chk_filter);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sk_filter_rcu_release - Release a socket filter by rcu_head
|
* sk_filter_release_rcu - Release a socket filter by rcu_head
|
||||||
* @rcu: rcu_head that contains the sk_filter to free
|
* @rcu: rcu_head that contains the sk_filter to free
|
||||||
*/
|
*/
|
||||||
static void sk_filter_rcu_release(struct rcu_head *rcu)
|
void sk_filter_release_rcu(struct rcu_head *rcu)
|
||||||
{
|
{
|
||||||
struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu);
|
struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu);
|
||||||
|
|
||||||
sk_filter_release(fp);
|
kfree(fp);
|
||||||
}
|
|
||||||
|
|
||||||
static void sk_filter_delayed_uncharge(struct sock *sk, struct sk_filter *fp)
|
|
||||||
{
|
|
||||||
unsigned int size = sk_filter_len(fp);
|
|
||||||
|
|
||||||
atomic_sub(size, &sk->sk_omem_alloc);
|
|
||||||
call_rcu_bh(&fp->rcu, sk_filter_rcu_release);
|
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(sk_filter_release_rcu);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sk_attach_filter - attach a socket filter
|
* sk_attach_filter - attach a socket filter
|
||||||
|
@ -649,7 +642,7 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
|
||||||
rcu_assign_pointer(sk->sk_filter, fp);
|
rcu_assign_pointer(sk->sk_filter, fp);
|
||||||
|
|
||||||
if (old_fp)
|
if (old_fp)
|
||||||
sk_filter_delayed_uncharge(sk, old_fp);
|
sk_filter_uncharge(sk, old_fp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(sk_attach_filter);
|
EXPORT_SYMBOL_GPL(sk_attach_filter);
|
||||||
|
@ -663,7 +656,7 @@ int sk_detach_filter(struct sock *sk)
|
||||||
sock_owned_by_user(sk));
|
sock_owned_by_user(sk));
|
||||||
if (filter) {
|
if (filter) {
|
||||||
rcu_assign_pointer(sk->sk_filter, NULL);
|
rcu_assign_pointer(sk->sk_filter, NULL);
|
||||||
sk_filter_delayed_uncharge(sk, filter);
|
sk_filter_uncharge(sk, filter);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -661,8 +661,10 @@ static int ec_dev_ioctl(struct socket *sock, unsigned int cmd, void __user *arg)
|
||||||
err = 0;
|
err = 0;
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SIOCSIFADDR:
|
case SIOCSIFADDR:
|
||||||
if (!capable(CAP_NET_ADMIN))
|
if (!capable(CAP_NET_ADMIN)) {
|
||||||
return -EPERM;
|
err = -EPERM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
edev = dev->ec_ptr;
|
edev = dev->ec_ptr;
|
||||||
if (edev == NULL) {
|
if (edev == NULL) {
|
||||||
|
@ -849,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;
|
||||||
|
|
|
@ -253,6 +253,7 @@ static const struct snmp_mib snmp4_net_list[] = {
|
||||||
SNMP_MIB_ITEM("TCPMinTTLDrop", LINUX_MIB_TCPMINTTLDROP),
|
SNMP_MIB_ITEM("TCPMinTTLDrop", LINUX_MIB_TCPMINTTLDROP),
|
||||||
SNMP_MIB_ITEM("TCPDeferAcceptDrop", LINUX_MIB_TCPDEFERACCEPTDROP),
|
SNMP_MIB_ITEM("TCPDeferAcceptDrop", LINUX_MIB_TCPDEFERACCEPTDROP),
|
||||||
SNMP_MIB_ITEM("IPReversePathFilter", LINUX_MIB_IPRPFILTER),
|
SNMP_MIB_ITEM("IPReversePathFilter", LINUX_MIB_IPRPFILTER),
|
||||||
|
SNMP_MIB_ITEM("TCPTimeWaitOverflow", LINUX_MIB_TCPTIMEWAITOVERFLOW),
|
||||||
SNMP_MIB_SENTINEL
|
SNMP_MIB_SENTINEL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -347,7 +347,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
|
||||||
* socket up. We've got bigger problems than
|
* socket up. We've got bigger problems than
|
||||||
* non-graceful socket closings.
|
* non-graceful socket closings.
|
||||||
*/
|
*/
|
||||||
LIMIT_NETDEBUG(KERN_INFO "TCP: time wait bucket table overflow\n");
|
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPTIMEWAITOVERFLOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
tcp_update_metrics(sk);
|
tcp_update_metrics(sk);
|
||||||
|
|
|
@ -231,11 +231,10 @@ void tcp_select_initial_window(int __space, __u32 mss,
|
||||||
/* when initializing use the value from init_rcv_wnd
|
/* when initializing use the value from init_rcv_wnd
|
||||||
* rather than the default from above
|
* rather than the default from above
|
||||||
*/
|
*/
|
||||||
if (init_rcv_wnd &&
|
if (init_rcv_wnd)
|
||||||
(*rcv_wnd > init_rcv_wnd * mss))
|
*rcv_wnd = min(*rcv_wnd, init_rcv_wnd * mss);
|
||||||
*rcv_wnd = init_rcv_wnd * mss;
|
else
|
||||||
else if (*rcv_wnd > init_cwnd * mss)
|
*rcv_wnd = min(*rcv_wnd, init_cwnd * mss);
|
||||||
*rcv_wnd = init_cwnd * mss;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the clamp no higher than max representable value */
|
/* Set the clamp no higher than max representable value */
|
||||||
|
@ -386,27 +385,30 @@ struct tcp_out_options {
|
||||||
*/
|
*/
|
||||||
static u8 tcp_cookie_size_check(u8 desired)
|
static u8 tcp_cookie_size_check(u8 desired)
|
||||||
{
|
{
|
||||||
if (desired > 0) {
|
int cookie_size;
|
||||||
|
|
||||||
|
if (desired > 0)
|
||||||
/* previously specified */
|
/* previously specified */
|
||||||
return desired;
|
return desired;
|
||||||
}
|
|
||||||
if (sysctl_tcp_cookie_size <= 0) {
|
cookie_size = ACCESS_ONCE(sysctl_tcp_cookie_size);
|
||||||
|
if (cookie_size <= 0)
|
||||||
/* no default specified */
|
/* no default specified */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
if (sysctl_tcp_cookie_size <= TCP_COOKIE_MIN) {
|
if (cookie_size <= TCP_COOKIE_MIN)
|
||||||
/* value too small, specify minimum */
|
/* value too small, specify minimum */
|
||||||
return TCP_COOKIE_MIN;
|
return TCP_COOKIE_MIN;
|
||||||
}
|
|
||||||
if (sysctl_tcp_cookie_size >= TCP_COOKIE_MAX) {
|
if (cookie_size >= TCP_COOKIE_MAX)
|
||||||
/* value too large, specify maximum */
|
/* value too large, specify maximum */
|
||||||
return TCP_COOKIE_MAX;
|
return TCP_COOKIE_MAX;
|
||||||
}
|
|
||||||
if (0x1 & sysctl_tcp_cookie_size) {
|
if (cookie_size & 1)
|
||||||
/* 8-bit multiple, illegal, fix it */
|
/* 8-bit multiple, illegal, fix it */
|
||||||
return (u8)(sysctl_tcp_cookie_size + 0x1);
|
cookie_size++;
|
||||||
}
|
|
||||||
return (u8)sysctl_tcp_cookie_size;
|
return (u8)cookie_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write previously computed TCP options to the packet.
|
/* Write previously computed TCP options to the packet.
|
||||||
|
@ -1513,6 +1515,7 @@ static int tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb)
|
||||||
struct tcp_sock *tp = tcp_sk(sk);
|
struct tcp_sock *tp = tcp_sk(sk);
|
||||||
const struct inet_connection_sock *icsk = inet_csk(sk);
|
const struct inet_connection_sock *icsk = inet_csk(sk);
|
||||||
u32 send_win, cong_win, limit, in_flight;
|
u32 send_win, cong_win, limit, in_flight;
|
||||||
|
int win_divisor;
|
||||||
|
|
||||||
if (TCP_SKB_CB(skb)->flags & TCPHDR_FIN)
|
if (TCP_SKB_CB(skb)->flags & TCPHDR_FIN)
|
||||||
goto send_now;
|
goto send_now;
|
||||||
|
@ -1544,13 +1547,14 @@ static int tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb)
|
||||||
if ((skb != tcp_write_queue_tail(sk)) && (limit >= skb->len))
|
if ((skb != tcp_write_queue_tail(sk)) && (limit >= skb->len))
|
||||||
goto send_now;
|
goto send_now;
|
||||||
|
|
||||||
if (sysctl_tcp_tso_win_divisor) {
|
win_divisor = ACCESS_ONCE(sysctl_tcp_tso_win_divisor);
|
||||||
|
if (win_divisor) {
|
||||||
u32 chunk = min(tp->snd_wnd, tp->snd_cwnd * tp->mss_cache);
|
u32 chunk = min(tp->snd_wnd, tp->snd_cwnd * tp->mss_cache);
|
||||||
|
|
||||||
/* If at least some fraction of a window is available,
|
/* If at least some fraction of a window is available,
|
||||||
* just use it.
|
* just use it.
|
||||||
*/
|
*/
|
||||||
chunk /= sysctl_tcp_tso_win_divisor;
|
chunk /= win_divisor;
|
||||||
if (limit >= chunk)
|
if (limit >= chunk)
|
||||||
goto send_now;
|
goto send_now;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -4021,11 +4021,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)
|
||||||
|
|
|
@ -1175,6 +1175,8 @@ static void ip6_tnl_link_config(struct ip6_tnl *t)
|
||||||
sizeof (struct ipv6hdr);
|
sizeof (struct ipv6hdr);
|
||||||
|
|
||||||
dev->mtu = rt->rt6i_dev->mtu - sizeof (struct ipv6hdr);
|
dev->mtu = rt->rt6i_dev->mtu - sizeof (struct ipv6hdr);
|
||||||
|
if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT))
|
||||||
|
dev->mtu-=8;
|
||||||
|
|
||||||
if (dev->mtu < IPV6_MIN_MTU)
|
if (dev->mtu < IPV6_MIN_MTU)
|
||||||
dev->mtu = IPV6_MIN_MTU;
|
dev->mtu = IPV6_MIN_MTU;
|
||||||
|
@ -1363,12 +1365,17 @@ static const struct net_device_ops ip6_tnl_netdev_ops = {
|
||||||
|
|
||||||
static void ip6_tnl_dev_setup(struct net_device *dev)
|
static void ip6_tnl_dev_setup(struct net_device *dev)
|
||||||
{
|
{
|
||||||
|
struct ip6_tnl *t;
|
||||||
|
|
||||||
dev->netdev_ops = &ip6_tnl_netdev_ops;
|
dev->netdev_ops = &ip6_tnl_netdev_ops;
|
||||||
dev->destructor = ip6_dev_free;
|
dev->destructor = ip6_dev_free;
|
||||||
|
|
||||||
dev->type = ARPHRD_TUNNEL6;
|
dev->type = ARPHRD_TUNNEL6;
|
||||||
dev->hard_header_len = LL_MAX_HEADER + sizeof (struct ipv6hdr);
|
dev->hard_header_len = LL_MAX_HEADER + sizeof (struct ipv6hdr);
|
||||||
dev->mtu = ETH_DATA_LEN - sizeof (struct ipv6hdr);
|
dev->mtu = ETH_DATA_LEN - sizeof (struct ipv6hdr);
|
||||||
|
t = netdev_priv(dev);
|
||||||
|
if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT))
|
||||||
|
dev->mtu-=8;
|
||||||
dev->flags |= IFF_NOARP;
|
dev->flags |= IFF_NOARP;
|
||||||
dev->addr_len = sizeof(struct in6_addr);
|
dev->addr_len = sizeof(struct in6_addr);
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
dev->features |= NETIF_F_NETNS_LOCAL;
|
||||||
|
|
|
@ -606,8 +606,9 @@ static int ipip6_rcv(struct sk_buff *skb)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
|
/* no tunnel matched, let upstream know, ipsec may handle it */
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
return 1;
|
||||||
out:
|
out:
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -674,4 +674,8 @@ MODULE_LICENSE("GPL");
|
||||||
MODULE_AUTHOR("James Chapman <jchapman@katalix.com>");
|
MODULE_AUTHOR("James Chapman <jchapman@katalix.com>");
|
||||||
MODULE_DESCRIPTION("L2TP over IP");
|
MODULE_DESCRIPTION("L2TP over IP");
|
||||||
MODULE_VERSION("1.0");
|
MODULE_VERSION("1.0");
|
||||||
MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET, SOCK_DGRAM, IPPROTO_L2TP);
|
|
||||||
|
/* Use the value of SOCK_DGRAM (2) directory, because __stringify does't like
|
||||||
|
* enums
|
||||||
|
*/
|
||||||
|
MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET, 2, IPPROTO_L2TP);
|
||||||
|
|
|
@ -317,8 +317,9 @@ static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen)
|
||||||
goto out;
|
goto out;
|
||||||
rc = -ENODEV;
|
rc = -ENODEV;
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
|
rcu_read_lock();
|
||||||
if (sk->sk_bound_dev_if) {
|
if (sk->sk_bound_dev_if) {
|
||||||
llc->dev = dev_get_by_index(&init_net, sk->sk_bound_dev_if);
|
llc->dev = dev_get_by_index_rcu(&init_net, sk->sk_bound_dev_if);
|
||||||
if (llc->dev) {
|
if (llc->dev) {
|
||||||
if (!addr->sllc_arphrd)
|
if (!addr->sllc_arphrd)
|
||||||
addr->sllc_arphrd = llc->dev->type;
|
addr->sllc_arphrd = llc->dev->type;
|
||||||
|
@ -329,13 +330,13 @@ static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen)
|
||||||
!llc_mac_match(addr->sllc_mac,
|
!llc_mac_match(addr->sllc_mac,
|
||||||
llc->dev->dev_addr)) {
|
llc->dev->dev_addr)) {
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
dev_put(llc->dev);
|
|
||||||
llc->dev = NULL;
|
llc->dev = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
llc->dev = dev_getbyhwaddr(&init_net, addr->sllc_arphrd,
|
llc->dev = dev_getbyhwaddr(&init_net, addr->sllc_arphrd,
|
||||||
addr->sllc_mac);
|
addr->sllc_mac);
|
||||||
|
rcu_read_unlock();
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
if (!llc->dev)
|
if (!llc->dev)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -2247,6 +2247,10 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx)
|
||||||
break;
|
break;
|
||||||
case cpu_to_le16(IEEE80211_STYPE_DEAUTH):
|
case cpu_to_le16(IEEE80211_STYPE_DEAUTH):
|
||||||
case cpu_to_le16(IEEE80211_STYPE_DISASSOC):
|
case cpu_to_le16(IEEE80211_STYPE_DISASSOC):
|
||||||
|
if (is_multicast_ether_addr(mgmt->da) &&
|
||||||
|
!is_broadcast_ether_addr(mgmt->da))
|
||||||
|
return RX_DROP_MONITOR;
|
||||||
|
|
||||||
/* process only for station */
|
/* process only for station */
|
||||||
if (sdata->vif.type != NL80211_IFTYPE_STATION)
|
if (sdata->vif.type != NL80211_IFTYPE_STATION)
|
||||||
return RX_DROP_MONITOR;
|
return RX_DROP_MONITOR;
|
||||||
|
@ -2741,6 +2745,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
|
||||||
|
|
||||||
if (ieee80211_prepare_and_rx_handle(&rx, skb, true))
|
if (ieee80211_prepare_and_rx_handle(&rx, skb, true))
|
||||||
return;
|
return;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2780,6 +2785,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
dev_kfree_skb(skb);
|
dev_kfree_skb(skb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1587,7 +1587,12 @@ static void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
|
||||||
list) {
|
list) {
|
||||||
if (!ieee80211_sdata_running(tmp_sdata))
|
if (!ieee80211_sdata_running(tmp_sdata))
|
||||||
continue;
|
continue;
|
||||||
if (tmp_sdata->vif.type != NL80211_IFTYPE_AP)
|
if (tmp_sdata->vif.type ==
|
||||||
|
NL80211_IFTYPE_MONITOR ||
|
||||||
|
tmp_sdata->vif.type ==
|
||||||
|
NL80211_IFTYPE_AP_VLAN ||
|
||||||
|
tmp_sdata->vif.type ==
|
||||||
|
NL80211_IFTYPE_WDS)
|
||||||
continue;
|
continue;
|
||||||
if (compare_ether_addr(tmp_sdata->vif.addr,
|
if (compare_ether_addr(tmp_sdata->vif.addr,
|
||||||
hdr->addr2) == 0) {
|
hdr->addr2) == 0) {
|
||||||
|
@ -1732,15 +1737,13 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
|
||||||
int nh_pos, h_pos;
|
int nh_pos, h_pos;
|
||||||
struct sta_info *sta = NULL;
|
struct sta_info *sta = NULL;
|
||||||
u32 sta_flags = 0;
|
u32 sta_flags = 0;
|
||||||
|
struct sk_buff *tmp_skb;
|
||||||
|
|
||||||
if (unlikely(skb->len < ETH_HLEN)) {
|
if (unlikely(skb->len < ETH_HLEN)) {
|
||||||
ret = NETDEV_TX_OK;
|
ret = NETDEV_TX_OK;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
nh_pos = skb_network_header(skb) - skb->data;
|
|
||||||
h_pos = skb_transport_header(skb) - skb->data;
|
|
||||||
|
|
||||||
/* convert Ethernet header to proper 802.11 header (based on
|
/* convert Ethernet header to proper 802.11 header (based on
|
||||||
* operation mode) */
|
* operation mode) */
|
||||||
ethertype = (skb->data[12] << 8) | skb->data[13];
|
ethertype = (skb->data[12] << 8) | skb->data[13];
|
||||||
|
@ -1913,6 +1916,20 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the skb is shared we need to obtain our own copy.
|
||||||
|
*/
|
||||||
|
if (skb_shared(skb)) {
|
||||||
|
tmp_skb = skb;
|
||||||
|
skb = skb_copy(skb, GFP_ATOMIC);
|
||||||
|
kfree_skb(tmp_skb);
|
||||||
|
|
||||||
|
if (!skb) {
|
||||||
|
ret = NETDEV_TX_OK;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
hdr.frame_control = fc;
|
hdr.frame_control = fc;
|
||||||
hdr.duration_id = 0;
|
hdr.duration_id = 0;
|
||||||
hdr.seq_ctrl = 0;
|
hdr.seq_ctrl = 0;
|
||||||
|
@ -1931,6 +1948,9 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
|
||||||
encaps_len = 0;
|
encaps_len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nh_pos = skb_network_header(skb) - skb->data;
|
||||||
|
h_pos = skb_transport_header(skb) - skb->data;
|
||||||
|
|
||||||
skb_pull(skb, skip_header_bytes);
|
skb_pull(skb, skip_header_bytes);
|
||||||
nh_pos -= skip_header_bytes;
|
nh_pos -= skip_header_bytes;
|
||||||
h_pos -= skip_header_bytes;
|
h_pos -= skip_header_bytes;
|
||||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче