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: (40 commits)
  tg3: Fix tg3_skb_error_unmap()
  net: tracepoint of net_dev_xmit sees freed skb and causes panic
  drivers/net/can/flexcan.c: add missing clk_put
  net: dm9000: Get the chip in a known good state before enabling interrupts
  drivers/net/davinci_emac.c: add missing clk_put
  af-packet: Add flag to distinguish VID 0 from no-vlan.
  caif: Fix race when conditionally taking rtnl lock
  usbnet/cdc_ncm: add missing .reset_resume hook
  vlan: fix typo in vlan_dev_hard_start_xmit()
  net/ipv4: Check for mistakenly passed in non-IPv4 address
  iwl4965: correctly validate temperature value
  bluetooth l2cap: fix locking in l2cap_global_chan_by_psm
  ath9k: fix two more bugs in tx power
  cfg80211: don't drop p2p probe responses
  Revert "net: fix section mismatches"
  drivers/net/usb/catc.c: Fix potential deadlock in catc_ctrl_run()
  sctp: stop pending timers and purge queues when peer restart asoc
  drivers/net: ks8842 Fix crash on received packet when in PIO mode.
  ip_options_compile: properly handle unaligned pointer
  iwlagn: fix incorrect PCI subsystem id for 6150 devices
  ...
This commit is contained in:
Linus Torvalds 2011-06-04 23:16:00 +09:00
commit 0e833d8cfc
60 changed files with 381 additions and 220 deletions

View File

@ -185,7 +185,7 @@ static int max_interrupt_work = 10;
static int nopnp; static int nopnp;
#endif #endif
static int el3_common_init(struct net_device *dev); static int __devinit el3_common_init(struct net_device *dev);
static void el3_common_remove(struct net_device *dev); static void el3_common_remove(struct net_device *dev);
static ushort id_read_eeprom(int index); static ushort id_read_eeprom(int index);
static ushort read_eeprom(int ioaddr, int index); static ushort read_eeprom(int ioaddr, int index);
@ -395,7 +395,7 @@ static struct isa_driver el3_isa_driver = {
static int isa_registered; static int isa_registered;
#ifdef CONFIG_PNP #ifdef CONFIG_PNP
static const struct pnp_device_id el3_pnp_ids[] __devinitconst = { static struct pnp_device_id el3_pnp_ids[] = {
{ .id = "TCM5090" }, /* 3Com Etherlink III (TP) */ { .id = "TCM5090" }, /* 3Com Etherlink III (TP) */
{ .id = "TCM5091" }, /* 3Com Etherlink III */ { .id = "TCM5091" }, /* 3Com Etherlink III */
{ .id = "TCM5094" }, /* 3Com Etherlink III (combo) */ { .id = "TCM5094" }, /* 3Com Etherlink III (combo) */
@ -478,7 +478,7 @@ static int pnp_registered;
#endif /* CONFIG_PNP */ #endif /* CONFIG_PNP */
#ifdef CONFIG_EISA #ifdef CONFIG_EISA
static const struct eisa_device_id el3_eisa_ids[] __devinitconst = { static struct eisa_device_id el3_eisa_ids[] = {
{ "TCM5090" }, { "TCM5090" },
{ "TCM5091" }, { "TCM5091" },
{ "TCM5092" }, { "TCM5092" },
@ -508,7 +508,7 @@ static int eisa_registered;
#ifdef CONFIG_MCA #ifdef CONFIG_MCA
static int el3_mca_probe(struct device *dev); static int el3_mca_probe(struct device *dev);
static const short el3_mca_adapter_ids[] __devinitconst = { static short el3_mca_adapter_ids[] __initdata = {
0x627c, 0x627c,
0x627d, 0x627d,
0x62db, 0x62db,
@ -517,7 +517,7 @@ static const short el3_mca_adapter_ids[] __devinitconst = {
0x0000 0x0000
}; };
static const char *const el3_mca_adapter_names[] __devinitconst = { static char *el3_mca_adapter_names[] __initdata = {
"3Com 3c529 EtherLink III (10base2)", "3Com 3c529 EtherLink III (10base2)",
"3Com 3c529 EtherLink III (10baseT)", "3Com 3c529 EtherLink III (10baseT)",
"3Com 3c529 EtherLink III (test mode)", "3Com 3c529 EtherLink III (test mode)",
@ -601,7 +601,7 @@ static void el3_common_remove (struct net_device *dev)
} }
#ifdef CONFIG_MCA #ifdef CONFIG_MCA
static int __devinit el3_mca_probe(struct device *device) static int __init el3_mca_probe(struct device *device)
{ {
/* Based on Erik Nygren's (nygren@mit.edu) 3c529 patch, /* Based on Erik Nygren's (nygren@mit.edu) 3c529 patch,
* heavily modified by Chris Beauregard * heavily modified by Chris Beauregard
@ -671,7 +671,7 @@ static int __devinit el3_mca_probe(struct device *device)
#endif /* CONFIG_MCA */ #endif /* CONFIG_MCA */
#ifdef CONFIG_EISA #ifdef CONFIG_EISA
static int __devinit el3_eisa_probe (struct device *device) static int __init el3_eisa_probe (struct device *device)
{ {
short i; short i;
int ioaddr, irq, if_port; int ioaddr, irq, if_port;

View File

@ -901,14 +901,14 @@ static const struct dev_pm_ops vortex_pm_ops = {
#endif /* !CONFIG_PM */ #endif /* !CONFIG_PM */
#ifdef CONFIG_EISA #ifdef CONFIG_EISA
static const struct eisa_device_id vortex_eisa_ids[] __devinitconst = { static struct eisa_device_id vortex_eisa_ids[] = {
{ "TCM5920", CH_3C592 }, { "TCM5920", CH_3C592 },
{ "TCM5970", CH_3C597 }, { "TCM5970", CH_3C597 },
{ "" } { "" }
}; };
MODULE_DEVICE_TABLE(eisa, vortex_eisa_ids); MODULE_DEVICE_TABLE(eisa, vortex_eisa_ids);
static int __devinit vortex_eisa_probe(struct device *device) static int __init vortex_eisa_probe(struct device *device)
{ {
void __iomem *ioaddr; void __iomem *ioaddr;
struct eisa_device *edev; struct eisa_device *edev;

View File

@ -923,7 +923,7 @@ static int __devinit flexcan_probe(struct platform_device *pdev)
mem_size = resource_size(mem); mem_size = resource_size(mem);
if (!request_mem_region(mem->start, mem_size, pdev->name)) { if (!request_mem_region(mem->start, mem_size, pdev->name)) {
err = -EBUSY; err = -EBUSY;
goto failed_req; goto failed_get;
} }
base = ioremap(mem->start, mem_size); base = ioremap(mem->start, mem_size);
@ -977,9 +977,8 @@ static int __devinit flexcan_probe(struct platform_device *pdev)
iounmap(base); iounmap(base);
failed_map: failed_map:
release_mem_region(mem->start, mem_size); release_mem_region(mem->start, mem_size);
failed_req:
clk_put(clk);
failed_get: failed_get:
clk_put(clk);
failed_clock: failed_clock:
return err; return err;
} }

View File

@ -1781,8 +1781,8 @@ static int __devinit davinci_emac_probe(struct platform_device *pdev)
ndev = alloc_etherdev(sizeof(struct emac_priv)); ndev = alloc_etherdev(sizeof(struct emac_priv));
if (!ndev) { if (!ndev) {
dev_err(&pdev->dev, "error allocating net_device\n"); dev_err(&pdev->dev, "error allocating net_device\n");
clk_put(emac_clk); rc = -ENOMEM;
return -ENOMEM; goto free_clk;
} }
platform_set_drvdata(pdev, ndev); platform_set_drvdata(pdev, ndev);
@ -1796,7 +1796,8 @@ static int __devinit davinci_emac_probe(struct platform_device *pdev)
pdata = pdev->dev.platform_data; pdata = pdev->dev.platform_data;
if (!pdata) { if (!pdata) {
dev_err(&pdev->dev, "no platform data\n"); dev_err(&pdev->dev, "no platform data\n");
return -ENODEV; rc = -ENODEV;
goto probe_quit;
} }
/* MAC addr and PHY mask , RMII enable info from platform_data */ /* MAC addr and PHY mask , RMII enable info from platform_data */
@ -1929,8 +1930,9 @@ no_dma:
iounmap(priv->remap_addr); iounmap(priv->remap_addr);
probe_quit: probe_quit:
clk_put(emac_clk);
free_netdev(ndev); free_netdev(ndev);
free_clk:
clk_put(emac_clk);
return rc; return rc;
} }

View File

@ -331,18 +331,18 @@ static struct {
"DE422",\ "DE422",\
""} ""}
static const char* const depca_signature[] __devinitconst = DEPCA_SIGNATURE; static char* __initdata depca_signature[] = DEPCA_SIGNATURE;
enum depca_type { enum depca_type {
DEPCA, de100, de101, de200, de201, de202, de210, de212, de422, unknown DEPCA, de100, de101, de200, de201, de202, de210, de212, de422, unknown
}; };
static const char depca_string[] = "depca"; static char depca_string[] = "depca";
static int depca_device_remove (struct device *device); static int depca_device_remove (struct device *device);
#ifdef CONFIG_EISA #ifdef CONFIG_EISA
static const struct eisa_device_id depca_eisa_ids[] __devinitconst = { static struct eisa_device_id depca_eisa_ids[] = {
{ "DEC4220", de422 }, { "DEC4220", de422 },
{ "" } { "" }
}; };
@ -367,19 +367,19 @@ static struct eisa_driver depca_eisa_driver = {
#define DE210_ID 0x628d #define DE210_ID 0x628d
#define DE212_ID 0x6def #define DE212_ID 0x6def
static const short depca_mca_adapter_ids[] __devinitconst = { static short depca_mca_adapter_ids[] = {
DE210_ID, DE210_ID,
DE212_ID, DE212_ID,
0x0000 0x0000
}; };
static const char *depca_mca_adapter_name[] = { static char *depca_mca_adapter_name[] = {
"DEC EtherWORKS MC Adapter (DE210)", "DEC EtherWORKS MC Adapter (DE210)",
"DEC EtherWORKS MC Adapter (DE212)", "DEC EtherWORKS MC Adapter (DE212)",
NULL NULL
}; };
static const enum depca_type depca_mca_adapter_type[] = { static enum depca_type depca_mca_adapter_type[] = {
de210, de210,
de212, de212,
0 0
@ -541,9 +541,10 @@ static void SetMulticastFilter(struct net_device *dev);
static int load_packet(struct net_device *dev, struct sk_buff *skb); static int load_packet(struct net_device *dev, struct sk_buff *skb);
static void depca_dbg_open(struct net_device *dev); static void depca_dbg_open(struct net_device *dev);
static const u_char de1xx_irq[] __devinitconst = { 2, 3, 4, 5, 7, 9, 0 }; static u_char de1xx_irq[] __initdata = { 2, 3, 4, 5, 7, 9, 0 };
static const u_char de2xx_irq[] __devinitconst = { 5, 9, 10, 11, 15, 0 }; static u_char de2xx_irq[] __initdata = { 5, 9, 10, 11, 15, 0 };
static const u_char de422_irq[] __devinitconst = { 5, 9, 10, 11, 0 }; static u_char de422_irq[] __initdata = { 5, 9, 10, 11, 0 };
static u_char *depca_irq;
static int irq; static int irq;
static int io; static int io;
@ -579,7 +580,7 @@ static const struct net_device_ops depca_netdev_ops = {
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
}; };
static int __devinit depca_hw_init (struct net_device *dev, struct device *device) static int __init depca_hw_init (struct net_device *dev, struct device *device)
{ {
struct depca_private *lp; struct depca_private *lp;
int i, j, offset, netRAM, mem_len, status = 0; int i, j, offset, netRAM, mem_len, status = 0;
@ -747,7 +748,6 @@ static int __devinit depca_hw_init (struct net_device *dev, struct device *devic
if (dev->irq < 2) { if (dev->irq < 2) {
unsigned char irqnum; unsigned char irqnum;
unsigned long irq_mask, delay; unsigned long irq_mask, delay;
const u_char *depca_irq;
irq_mask = probe_irq_on(); irq_mask = probe_irq_on();
@ -770,7 +770,6 @@ static int __devinit depca_hw_init (struct net_device *dev, struct device *devic
break; break;
default: default:
depca_irq = NULL;
break; /* Not reached */ break; /* Not reached */
} }
@ -1303,7 +1302,7 @@ static void SetMulticastFilter(struct net_device *dev)
} }
} }
static int __devinit depca_common_init (u_long ioaddr, struct net_device **devp) static int __init depca_common_init (u_long ioaddr, struct net_device **devp)
{ {
int status = 0; int status = 0;
@ -1334,7 +1333,7 @@ static int __devinit depca_common_init (u_long ioaddr, struct net_device **devp)
/* /*
** Microchannel bus I/O device probe ** Microchannel bus I/O device probe
*/ */
static int __devinit depca_mca_probe(struct device *device) static int __init depca_mca_probe(struct device *device)
{ {
unsigned char pos[2]; unsigned char pos[2];
unsigned char where; unsigned char where;
@ -1458,7 +1457,7 @@ static int __devinit depca_mca_probe(struct device *device)
** ISA bus I/O device probe ** ISA bus I/O device probe
*/ */
static void __devinit depca_platform_probe (void) static void __init depca_platform_probe (void)
{ {
int i; int i;
struct platform_device *pldev; struct platform_device *pldev;
@ -1498,7 +1497,7 @@ static void __devinit depca_platform_probe (void)
} }
} }
static enum depca_type __devinit depca_shmem_probe (ulong *mem_start) static enum depca_type __init depca_shmem_probe (ulong *mem_start)
{ {
u_long mem_base[] = DEPCA_RAM_BASE_ADDRESSES; u_long mem_base[] = DEPCA_RAM_BASE_ADDRESSES;
enum depca_type adapter = unknown; enum depca_type adapter = unknown;
@ -1559,7 +1558,7 @@ static int __devinit depca_isa_probe (struct platform_device *device)
*/ */
#ifdef CONFIG_EISA #ifdef CONFIG_EISA
static int __devinit depca_eisa_probe (struct device *device) static int __init depca_eisa_probe (struct device *device)
{ {
enum depca_type adapter = unknown; enum depca_type adapter = unknown;
struct eisa_device *edev; struct eisa_device *edev;
@ -1630,7 +1629,7 @@ static int __devexit depca_device_remove (struct device *device)
** and Boot (readb) ROM. This will also give us a clue to the network RAM ** and Boot (readb) ROM. This will also give us a clue to the network RAM
** base address. ** base address.
*/ */
static int __devinit DepcaSignature(char *name, u_long base_addr) static int __init DepcaSignature(char *name, u_long base_addr)
{ {
u_int i, j, k; u_int i, j, k;
void __iomem *ptr; void __iomem *ptr;

View File

@ -1157,9 +1157,6 @@ dm9000_open(struct net_device *dev)
irqflags |= IRQF_SHARED; irqflags |= IRQF_SHARED;
if (request_irq(dev->irq, dm9000_interrupt, irqflags, dev->name, dev))
return -EAGAIN;
/* GPIO0 on pre-activate PHY, Reg 1F is not set by reset */ /* GPIO0 on pre-activate PHY, Reg 1F is not set by reset */
iow(db, DM9000_GPR, 0); /* REG_1F bit0 activate phyxcer */ iow(db, DM9000_GPR, 0); /* REG_1F bit0 activate phyxcer */
mdelay(1); /* delay needs by DM9000B */ mdelay(1); /* delay needs by DM9000B */
@ -1168,6 +1165,9 @@ dm9000_open(struct net_device *dev)
dm9000_reset(db); dm9000_reset(db);
dm9000_init_dm9000(dev); dm9000_init_dm9000(dev);
if (request_irq(dev->irq, dm9000_interrupt, irqflags, dev->name, dev))
return -EAGAIN;
/* Init driver variable */ /* Init driver variable */
db->dbug_cnt = 0; db->dbug_cnt = 0;

View File

@ -188,14 +188,14 @@ struct hp100_private {
* variables * variables
*/ */
#ifdef CONFIG_ISA #ifdef CONFIG_ISA
static const char *const hp100_isa_tbl[] __devinitconst = { static const char *hp100_isa_tbl[] = {
"HWPF150", /* HP J2573 rev A */ "HWPF150", /* HP J2573 rev A */
"HWP1950", /* HP J2573 */ "HWP1950", /* HP J2573 */
}; };
#endif #endif
#ifdef CONFIG_EISA #ifdef CONFIG_EISA
static const struct eisa_device_id hp100_eisa_tbl[] __devinitconst = { static struct eisa_device_id hp100_eisa_tbl[] = {
{ "HWPF180" }, /* HP J2577 rev A */ { "HWPF180" }, /* HP J2577 rev A */
{ "HWP1920" }, /* HP 27248B */ { "HWP1920" }, /* HP 27248B */
{ "HWP1940" }, /* HP J2577 */ { "HWP1940" }, /* HP J2577 */
@ -336,7 +336,7 @@ static __devinit const char *hp100_read_id(int ioaddr)
} }
#ifdef CONFIG_ISA #ifdef CONFIG_ISA
static __devinit int hp100_isa_probe1(struct net_device *dev, int ioaddr) static __init int hp100_isa_probe1(struct net_device *dev, int ioaddr)
{ {
const char *sig; const char *sig;
int i; int i;
@ -372,7 +372,7 @@ static __devinit int hp100_isa_probe1(struct net_device *dev, int ioaddr)
* EISA and PCI are handled by device infrastructure. * EISA and PCI are handled by device infrastructure.
*/ */
static int __devinit hp100_isa_probe(struct net_device *dev, int addr) static int __init hp100_isa_probe(struct net_device *dev, int addr)
{ {
int err = -ENODEV; int err = -ENODEV;
@ -396,7 +396,7 @@ static int __devinit hp100_isa_probe(struct net_device *dev, int addr)
#endif /* CONFIG_ISA */ #endif /* CONFIG_ISA */
#if !defined(MODULE) && defined(CONFIG_ISA) #if !defined(MODULE) && defined(CONFIG_ISA)
struct net_device * __devinit hp100_probe(int unit) struct net_device * __init hp100_probe(int unit)
{ {
struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private)); struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private));
int err; int err;
@ -2843,7 +2843,7 @@ static void cleanup_dev(struct net_device *d)
} }
#ifdef CONFIG_EISA #ifdef CONFIG_EISA
static int __devinit hp100_eisa_probe (struct device *gendev) static int __init hp100_eisa_probe (struct device *gendev)
{ {
struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private)); struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private));
struct eisa_device *edev = to_eisa_device(gendev); struct eisa_device *edev = to_eisa_device(gendev);

View File

@ -895,12 +895,12 @@ static int ibmlana_irq;
static int ibmlana_io; static int ibmlana_io;
static int startslot; /* counts through slots when probing multiple devices */ static int startslot; /* counts through slots when probing multiple devices */
static const short ibmlana_adapter_ids[] __devinitconst = { static short ibmlana_adapter_ids[] __initdata = {
IBM_LANA_ID, IBM_LANA_ID,
0x0000 0x0000
}; };
static const char *const ibmlana_adapter_names[] __devinitconst = { static char *ibmlana_adapter_names[] __devinitdata = {
"IBM LAN Adapter/A", "IBM LAN Adapter/A",
NULL NULL
}; };

View File

@ -222,19 +222,19 @@ static void smsc_ircc_set_transceiver_for_speed(struct smsc_ircc_cb *self, u32 s
static void smsc_ircc_sir_wait_hw_transmitter_finish(struct smsc_ircc_cb *self); static void smsc_ircc_sir_wait_hw_transmitter_finish(struct smsc_ircc_cb *self);
/* Probing */ /* Probing */
static int smsc_ircc_look_for_chips(void); static int __init smsc_ircc_look_for_chips(void);
static const struct smsc_chip * smsc_ircc_probe(unsigned short cfg_base, u8 reg, const struct smsc_chip *chip, char *type); static const struct smsc_chip * __init smsc_ircc_probe(unsigned short cfg_base, u8 reg, const struct smsc_chip *chip, char *type);
static int smsc_superio_flat(const struct smsc_chip *chips, unsigned short cfg_base, char *type); static int __init smsc_superio_flat(const struct smsc_chip *chips, unsigned short cfg_base, char *type);
static int smsc_superio_paged(const struct smsc_chip *chips, unsigned short cfg_base, char *type); static int __init smsc_superio_paged(const struct smsc_chip *chips, unsigned short cfg_base, char *type);
static int smsc_superio_fdc(unsigned short cfg_base); static int __init smsc_superio_fdc(unsigned short cfg_base);
static int smsc_superio_lpc(unsigned short cfg_base); static int __init smsc_superio_lpc(unsigned short cfg_base);
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
static int preconfigure_smsc_chip(struct smsc_ircc_subsystem_configuration *conf); static int __init preconfigure_smsc_chip(struct smsc_ircc_subsystem_configuration *conf);
static int preconfigure_through_82801(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); static int __init preconfigure_through_82801(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf);
static void preconfigure_ali_port(struct pci_dev *dev, static void __init preconfigure_ali_port(struct pci_dev *dev,
unsigned short port); unsigned short port);
static int preconfigure_through_ali(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); static int __init preconfigure_through_ali(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf);
static int smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg,
unsigned short ircc_fir, unsigned short ircc_fir,
unsigned short ircc_sir, unsigned short ircc_sir,
unsigned char ircc_dma, unsigned char ircc_dma,
@ -366,7 +366,7 @@ static inline void register_bank(int iobase, int bank)
} }
/* PNP hotplug support */ /* PNP hotplug support */
static const struct pnp_device_id smsc_ircc_pnp_table[] __devinitconst = { static const struct pnp_device_id smsc_ircc_pnp_table[] = {
{ .id = "SMCf010", .driver_data = 0 }, { .id = "SMCf010", .driver_data = 0 },
/* and presumably others */ /* and presumably others */
{ } { }
@ -515,7 +515,7 @@ static const struct net_device_ops smsc_ircc_netdev_ops = {
* Try to open driver instance * Try to open driver instance
* *
*/ */
static int __devinit smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq) static int __init smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq)
{ {
struct smsc_ircc_cb *self; struct smsc_ircc_cb *self;
struct net_device *dev; struct net_device *dev;
@ -2273,7 +2273,7 @@ static int __init smsc_superio_paged(const struct smsc_chip *chips, unsigned sho
} }
static int __devinit smsc_access(unsigned short cfg_base, unsigned char reg) static int __init smsc_access(unsigned short cfg_base, unsigned char reg)
{ {
IRDA_DEBUG(1, "%s\n", __func__); IRDA_DEBUG(1, "%s\n", __func__);
@ -2281,7 +2281,7 @@ static int __devinit smsc_access(unsigned short cfg_base, unsigned char reg)
return inb(cfg_base) != reg ? -1 : 0; return inb(cfg_base) != reg ? -1 : 0;
} }
static const struct smsc_chip * __devinit smsc_ircc_probe(unsigned short cfg_base, u8 reg, const struct smsc_chip *chip, char *type) static const struct smsc_chip * __init smsc_ircc_probe(unsigned short cfg_base, u8 reg, const struct smsc_chip *chip, char *type)
{ {
u8 devid, xdevid, rev; u8 devid, xdevid, rev;
@ -2406,7 +2406,7 @@ static int __init smsc_superio_lpc(unsigned short cfg_base)
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
#define PCIID_VENDOR_INTEL 0x8086 #define PCIID_VENDOR_INTEL 0x8086
#define PCIID_VENDOR_ALI 0x10b9 #define PCIID_VENDOR_ALI 0x10b9
static const struct smsc_ircc_subsystem_configuration subsystem_configurations[] __devinitconst = { static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __initdata = {
/* /*
* Subsystems needing entries: * Subsystems needing entries:
* 0x10b9:0x1533 0x103c:0x0850 HP nx9010 family * 0x10b9:0x1533 0x103c:0x0850 HP nx9010 family
@ -2532,7 +2532,7 @@ static const struct smsc_ircc_subsystem_configuration subsystem_configurations[]
* (FIR port, SIR port, FIR DMA, FIR IRQ) * (FIR port, SIR port, FIR DMA, FIR IRQ)
* through the chip configuration port. * through the chip configuration port.
*/ */
static int __devinit preconfigure_smsc_chip(struct static int __init preconfigure_smsc_chip(struct
smsc_ircc_subsystem_configuration smsc_ircc_subsystem_configuration
*conf) *conf)
{ {
@ -2633,7 +2633,7 @@ static int __devinit preconfigure_smsc_chip(struct
* or Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge. * or Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge.
* They all work the same way! * They all work the same way!
*/ */
static int __devinit preconfigure_through_82801(struct pci_dev *dev, static int __init preconfigure_through_82801(struct pci_dev *dev,
struct struct
smsc_ircc_subsystem_configuration smsc_ircc_subsystem_configuration
*conf) *conf)
@ -2786,7 +2786,7 @@ static int __devinit preconfigure_through_82801(struct pci_dev *dev,
* This is based on reverse-engineering since ALi does not * This is based on reverse-engineering since ALi does not
* provide any data sheet for the 1533 chip. * provide any data sheet for the 1533 chip.
*/ */
static void __devinit preconfigure_ali_port(struct pci_dev *dev, static void __init preconfigure_ali_port(struct pci_dev *dev,
unsigned short port) unsigned short port)
{ {
unsigned char reg; unsigned char reg;
@ -2824,7 +2824,7 @@ static void __devinit preconfigure_ali_port(struct pci_dev *dev,
IRDA_MESSAGE("Activated ALi 1533 ISA bridge port 0x%04x.\n", port); IRDA_MESSAGE("Activated ALi 1533 ISA bridge port 0x%04x.\n", port);
} }
static int __devinit preconfigure_through_ali(struct pci_dev *dev, static int __init preconfigure_through_ali(struct pci_dev *dev,
struct struct
smsc_ircc_subsystem_configuration smsc_ircc_subsystem_configuration
*conf) *conf)
@ -2837,7 +2837,7 @@ static int __devinit preconfigure_through_ali(struct pci_dev *dev,
return preconfigure_smsc_chip(conf); return preconfigure_smsc_chip(conf);
} }
static int __devinit smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg,
unsigned short ircc_fir, unsigned short ircc_fir,
unsigned short ircc_sir, unsigned short ircc_sir,
unsigned char ircc_dma, unsigned char ircc_dma,
@ -2849,7 +2849,7 @@ static int __devinit smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg,
int ret = 0; int ret = 0;
for_each_pci_dev(dev) { for_each_pci_dev(dev) {
const struct smsc_ircc_subsystem_configuration *conf; struct smsc_ircc_subsystem_configuration *conf;
/* /*
* Cache the subsystem vendor/device: * Cache the subsystem vendor/device:

View File

@ -661,7 +661,7 @@ static void ks8842_rx_frame(struct net_device *netdev,
/* check the status */ /* check the status */
if ((status & RXSR_VALID) && !(status & RXSR_ERROR)) { if ((status & RXSR_VALID) && !(status & RXSR_ERROR)) {
struct sk_buff *skb = netdev_alloc_skb_ip_align(netdev, len); struct sk_buff *skb = netdev_alloc_skb_ip_align(netdev, len + 3);
if (skb) { if (skb) {

View File

@ -80,20 +80,17 @@ static void ne3210_block_output(struct net_device *dev, int count, const unsigne
#define NE3210_DEBUG 0x0 #define NE3210_DEBUG 0x0
static const unsigned char irq_map[] __devinitconst = static unsigned char irq_map[] __initdata = {15, 12, 11, 10, 9, 7, 5, 3};
{ 15, 12, 11, 10, 9, 7, 5, 3 }; static unsigned int shmem_map[] __initdata = {0xff0, 0xfe0, 0xfff0, 0xd8, 0xffe0, 0xffc0, 0xd0, 0x0};
static const unsigned int shmem_map[] __devinitconst = static const char *ifmap[] __initdata = {"UTP", "?", "BNC", "AUI"};
{ 0xff0, 0xfe0, 0xfff0, 0xd8, 0xffe0, 0xffc0, 0xd0, 0x0 }; static int ifmap_val[] __initdata = {
static const char *const ifmap[] __devinitconst =
{ "UTP", "?", "BNC", "AUI" };
static const int ifmap_val[] __devinitconst = {
IF_PORT_10BASET, IF_PORT_10BASET,
IF_PORT_UNKNOWN, IF_PORT_UNKNOWN,
IF_PORT_10BASE2, IF_PORT_10BASE2,
IF_PORT_AUI, IF_PORT_AUI,
}; };
static int __devinit ne3210_eisa_probe (struct device *device) static int __init ne3210_eisa_probe (struct device *device)
{ {
unsigned long ioaddr, phys_mem; unsigned long ioaddr, phys_mem;
int i, retval, port_index; int i, retval, port_index;
@ -316,7 +313,7 @@ static void ne3210_block_output(struct net_device *dev, int count,
memcpy_toio(shmem, buf, count); memcpy_toio(shmem, buf, count);
} }
static const struct eisa_device_id ne3210_ids[] __devinitconst = { static struct eisa_device_id ne3210_ids[] = {
{ "EGL0101" }, { "EGL0101" },
{ "NVL1801" }, { "NVL1801" },
{ "" }, { "" },

View File

@ -156,7 +156,7 @@ static const struct {
{ 14, 15 } { 14, 15 }
}; };
static const short smc_mca_adapter_ids[] __devinitconst = { static short smc_mca_adapter_ids[] __initdata = {
0x61c8, 0x61c8,
0x61c9, 0x61c9,
0x6fc0, 0x6fc0,
@ -168,7 +168,7 @@ static const short smc_mca_adapter_ids[] __devinitconst = {
0x0000 0x0000
}; };
static const char *const smc_mca_adapter_names[] __devinitconst = { static char *smc_mca_adapter_names[] __initdata = {
"SMC Ethercard PLUS Elite/A BNC/AUI (WD8013EP/A)", "SMC Ethercard PLUS Elite/A BNC/AUI (WD8013EP/A)",
"SMC Ethercard PLUS Elite/A UTP/AUI (WD8013WP/A)", "SMC Ethercard PLUS Elite/A UTP/AUI (WD8013WP/A)",
"WD Ethercard PLUS/A (WD8003E/A or WD8003ET/A)", "WD Ethercard PLUS/A (WD8003E/A or WD8003ET/A)",
@ -199,7 +199,7 @@ static const struct net_device_ops ultramca_netdev_ops = {
#endif #endif
}; };
static int __devinit ultramca_probe(struct device *gen_dev) static int __init ultramca_probe(struct device *gen_dev)
{ {
unsigned short ioaddr; unsigned short ioaddr;
struct net_device *dev; struct net_device *dev;

View File

@ -5774,7 +5774,7 @@ static void tg3_skb_error_unmap(struct tg3_napi *tnapi,
dma_unmap_addr(txb, mapping), dma_unmap_addr(txb, mapping),
skb_headlen(skb), skb_headlen(skb),
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
for (i = 0; i <= last; i++) { for (i = 0; i < last; i++) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
entry = NEXT_TX(entry); entry = NEXT_TX(entry);

View File

@ -727,7 +727,7 @@ static int __devexit madgemc_remove(struct device *device)
return 0; return 0;
} }
static const short madgemc_adapter_ids[] __devinitconst = { static short madgemc_adapter_ids[] __initdata = {
0x002d, 0x002d,
0x0000 0x0000
}; };

View File

@ -1995,7 +1995,7 @@ SetMulticastFilter(struct net_device *dev)
static u_char de4x5_irq[] = EISA_ALLOWED_IRQ_LIST; static u_char de4x5_irq[] = EISA_ALLOWED_IRQ_LIST;
static int __devinit de4x5_eisa_probe (struct device *gendev) static int __init de4x5_eisa_probe (struct device *gendev)
{ {
struct eisa_device *edev; struct eisa_device *edev;
u_long iobase; u_long iobase;
@ -2097,7 +2097,7 @@ static int __devexit de4x5_eisa_remove (struct device *device)
return 0; return 0;
} }
static const struct eisa_device_id de4x5_eisa_ids[] __devinitconst = { static struct eisa_device_id de4x5_eisa_ids[] = {
{ "DEC4250", 0 }, /* 0 is the board name index... */ { "DEC4250", 0 }, /* 0 is the board name index... */
{ "" } { "" }
}; };

View File

@ -495,7 +495,7 @@ static void catc_ctrl_run(struct catc *catc)
if (!q->dir && q->buf && q->len) if (!q->dir && q->buf && q->len)
memcpy(catc->ctrl_buf, q->buf, q->len); memcpy(catc->ctrl_buf, q->buf, q->len);
if ((status = usb_submit_urb(catc->ctrl_urb, GFP_KERNEL))) if ((status = usb_submit_urb(catc->ctrl_urb, GFP_ATOMIC)))
err("submit(ctrl_urb) status %d", status); err("submit(ctrl_urb) status %d", status);
} }

View File

@ -54,7 +54,7 @@
#include <linux/usb/usbnet.h> #include <linux/usb/usbnet.h>
#include <linux/usb/cdc.h> #include <linux/usb/cdc.h>
#define DRIVER_VERSION "24-May-2011" #define DRIVER_VERSION "01-June-2011"
/* CDC NCM subclass 3.2.1 */ /* CDC NCM subclass 3.2.1 */
#define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10 #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10
@ -1234,6 +1234,7 @@ static struct usb_driver cdc_ncm_driver = {
.disconnect = cdc_ncm_disconnect, .disconnect = cdc_ncm_disconnect,
.suspend = usbnet_suspend, .suspend = usbnet_suspend,
.resume = usbnet_resume, .resume = usbnet_resume,
.reset_resume = usbnet_resume,
.supports_autosuspend = 1, .supports_autosuspend = 1,
}; };

View File

@ -26,7 +26,6 @@ config ATH9K
config ATH9K_PCI config ATH9K_PCI
bool "Atheros ath9k PCI/PCIe bus support" bool "Atheros ath9k PCI/PCIe bus support"
depends on ATH9K && PCI depends on ATH9K && PCI
default PCI
---help--- ---help---
This option enables the PCI bus support in ath9k. This option enables the PCI bus support in ath9k.

View File

@ -829,7 +829,7 @@ static bool ar9002_hw_init_cal(struct ath_hw *ah, struct ath9k_channel *chan)
if (AR_SREV_9271(ah)) { if (AR_SREV_9271(ah)) {
if (!ar9285_hw_cl_cal(ah, chan)) if (!ar9285_hw_cl_cal(ah, chan))
return false; return false;
} else if (AR_SREV_9285_12_OR_LATER(ah)) { } else if (AR_SREV_9285(ah) && AR_SREV_9285_12_OR_LATER(ah)) {
if (!ar9285_hw_clc(ah, chan)) if (!ar9285_hw_clc(ah, chan))
return false; return false;
} else { } else {

View File

@ -4645,10 +4645,16 @@ static void ar9003_hw_set_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;
} }

View File

@ -1381,3 +1381,25 @@ void ar9003_hw_bb_watchdog_dbg_info(struct ath_hw *ah)
"==== BB update: done ====\n\n"); "==== BB update: done ====\n\n");
} }
EXPORT_SYMBOL(ar9003_hw_bb_watchdog_dbg_info); EXPORT_SYMBOL(ar9003_hw_bb_watchdog_dbg_info);
void ar9003_hw_disable_phy_restart(struct ath_hw *ah)
{
u32 val;
/* While receiving unsupported rate frame rx state machine
* gets into a state 0xb and if phy_restart happens in that
* state, BB would go hang. If RXSM is in 0xb state after
* first bb panic, ensure to disable the phy_restart.
*/
if (!((MS(ah->bb_watchdog_last_status,
AR_PHY_WATCHDOG_RX_OFDM_SM) == 0xb) ||
ah->bb_hang_rx_ofdm))
return;
ah->bb_hang_rx_ofdm = true;
val = REG_READ(ah, AR_PHY_RESTART);
val &= ~AR_PHY_RESTART_ENA;
REG_WRITE(ah, AR_PHY_RESTART, val);
}
EXPORT_SYMBOL(ar9003_hw_disable_phy_restart);

View File

@ -524,10 +524,16 @@ static void ath9k_hw_set_ar9287_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); scaledPower = max((u16)0, scaledPower);

View File

@ -1555,9 +1555,12 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
if (ah->btcoex_hw.enabled) if (ah->btcoex_hw.enabled)
ath9k_hw_btcoex_enable(ah); ath9k_hw_btcoex_enable(ah);
if (AR_SREV_9300_20_OR_LATER(ah)) if (AR_SREV_9300_20_OR_LATER(ah)) {
ar9003_hw_bb_watchdog_config(ah); ar9003_hw_bb_watchdog_config(ah);
ar9003_hw_disable_phy_restart(ah);
}
ath9k_hw_apply_gpio_override(ah); ath9k_hw_apply_gpio_override(ah);
return 0; return 0;

View File

@ -842,6 +842,7 @@ struct ath_hw {
u32 bb_watchdog_last_status; u32 bb_watchdog_last_status;
u32 bb_watchdog_timeout_ms; /* in ms, 0 to disable */ u32 bb_watchdog_timeout_ms; /* in ms, 0 to disable */
u8 bb_hang_rx_ofdm; /* true if bb hang due to rx_ofdm */
unsigned int paprd_target_power; unsigned int paprd_target_power;
unsigned int paprd_training_power; unsigned int paprd_training_power;
@ -990,6 +991,7 @@ void ar9002_hw_enable_wep_aggregation(struct ath_hw *ah);
void ar9003_hw_bb_watchdog_config(struct ath_hw *ah); void ar9003_hw_bb_watchdog_config(struct ath_hw *ah);
void ar9003_hw_bb_watchdog_read(struct ath_hw *ah); void ar9003_hw_bb_watchdog_read(struct ath_hw *ah);
void ar9003_hw_bb_watchdog_dbg_info(struct ath_hw *ah); void ar9003_hw_bb_watchdog_dbg_info(struct ath_hw *ah);
void ar9003_hw_disable_phy_restart(struct ath_hw *ah);
void ar9003_paprd_enable(struct ath_hw *ah, bool val); void ar9003_paprd_enable(struct ath_hw *ah, bool val);
void ar9003_paprd_populate_single_table(struct ath_hw *ah, void ar9003_paprd_populate_single_table(struct ath_hw *ah,
struct ath9k_hw_cal_data *caldata, struct ath9k_hw_cal_data *caldata,

View File

@ -670,7 +670,8 @@ void ath9k_tasklet(unsigned long data)
u32 status = sc->intrstatus; u32 status = sc->intrstatus;
u32 rxmask; u32 rxmask;
if (status & ATH9K_INT_FATAL) { if ((status & ATH9K_INT_FATAL) ||
(status & ATH9K_INT_BB_WATCHDOG)) {
ath_reset(sc, true); ath_reset(sc, true);
return; return;
} }
@ -737,6 +738,7 @@ irqreturn_t ath_isr(int irq, void *dev)
{ {
#define SCHED_INTR ( \ #define SCHED_INTR ( \
ATH9K_INT_FATAL | \ ATH9K_INT_FATAL | \
ATH9K_INT_BB_WATCHDOG | \
ATH9K_INT_RXORN | \ ATH9K_INT_RXORN | \
ATH9K_INT_RXEOL | \ ATH9K_INT_RXEOL | \
ATH9K_INT_RX | \ ATH9K_INT_RX | \

View File

@ -689,7 +689,8 @@ static void ath_rc_rate_set_series(const struct ath_rate_table *rate_table,
if (WLAN_RC_PHY_HT(rate_table->info[rix].phy)) { if (WLAN_RC_PHY_HT(rate_table->info[rix].phy)) {
rate->flags |= IEEE80211_TX_RC_MCS; rate->flags |= IEEE80211_TX_RC_MCS;
if (WLAN_RC_PHY_40(rate_table->info[rix].phy)) if (WLAN_RC_PHY_40(rate_table->info[rix].phy) &&
conf_is_ht40(&txrc->hw->conf))
rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH; rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
if (WLAN_RC_PHY_SGI(rate_table->info[rix].phy)) if (WLAN_RC_PHY_SGI(rate_table->info[rix].phy))
rate->flags |= IEEE80211_TX_RC_SHORT_GI; rate->flags |= IEEE80211_TX_RC_SHORT_GI;

View File

@ -3093,7 +3093,7 @@ static int b43_nphy_cal_tx_iq_lo(struct b43_wldev *dev,
int freq; int freq;
bool avoid = false; bool avoid = false;
u8 length; u8 length;
u16 tmp, core, type, count, max, numb, last, cmd; u16 tmp, core, type, count, max, numb, last = 0, cmd;
const u16 *table; const u16 *table;
bool phy6or5x; bool phy6or5x;

View File

@ -628,11 +628,11 @@ void iwl4965_rx_reply_rx(struct iwl_priv *priv,
/* rx_status carries information about the packet to mac80211 */ /* rx_status carries information about the packet to mac80211 */
rx_status.mactime = le64_to_cpu(phy_res->timestamp); rx_status.mactime = le64_to_cpu(phy_res->timestamp);
rx_status.band = (phy_res->phy_flags & RX_RES_PHY_FLAGS_BAND_24_MSK) ?
IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ;
rx_status.freq = rx_status.freq =
ieee80211_channel_to_frequency(le16_to_cpu(phy_res->channel), ieee80211_channel_to_frequency(le16_to_cpu(phy_res->channel),
rx_status.band); rx_status.band);
rx_status.band = (phy_res->phy_flags & RX_RES_PHY_FLAGS_BAND_24_MSK) ?
IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ;
rx_status.rate_idx = rx_status.rate_idx =
iwl4965_hwrate_to_mac80211_idx(rate_n_flags, rx_status.band); iwl4965_hwrate_to_mac80211_idx(rate_n_flags, rx_status.band);
rx_status.flag = 0; rx_status.flag = 0;

View File

@ -1543,7 +1543,7 @@ static void iwl4965_temperature_calib(struct iwl_priv *priv)
s32 temp; s32 temp;
temp = iwl4965_hw_get_temperature(priv); temp = iwl4965_hw_get_temperature(priv);
if (temp < 0) if (IWL_TX_POWER_TEMPERATURE_OUT_OF_RANGE(temp))
return; return;
if (priv->temperature != temp) { if (priv->temperature != temp) {

View File

@ -603,19 +603,27 @@ struct iwl_cfg iwl6050_2abg_cfg = {
IWL_DEVICE_6050, IWL_DEVICE_6050,
}; };
#define IWL_DEVICE_6150 \
.fw_name_pre = IWL6050_FW_PRE, \
.ucode_api_max = IWL6050_UCODE_API_MAX, \
.ucode_api_min = IWL6050_UCODE_API_MIN, \
.ops = &iwl6150_ops, \
.eeprom_ver = EEPROM_6150_EEPROM_VERSION, \
.eeprom_calib_ver = EEPROM_6150_TX_POWER_VERSION, \
.base_params = &iwl6050_base_params, \
.need_dc_calib = true, \
.led_mode = IWL_LED_BLINK, \
.internal_wimax_coex = true
struct iwl_cfg iwl6150_bgn_cfg = { struct iwl_cfg iwl6150_bgn_cfg = {
.name = "Intel(R) Centrino(R) Wireless-N + WiMAX 6150 BGN", .name = "Intel(R) Centrino(R) Wireless-N + WiMAX 6150 BGN",
.fw_name_pre = IWL6050_FW_PRE, IWL_DEVICE_6150,
.ucode_api_max = IWL6050_UCODE_API_MAX,
.ucode_api_min = IWL6050_UCODE_API_MIN,
.eeprom_ver = EEPROM_6150_EEPROM_VERSION,
.eeprom_calib_ver = EEPROM_6150_TX_POWER_VERSION,
.ops = &iwl6150_ops,
.base_params = &iwl6050_base_params,
.ht_params = &iwl6000_ht_params, .ht_params = &iwl6000_ht_params,
.need_dc_calib = true, };
.led_mode = IWL_LED_RF_STATE,
.internal_wimax_coex = true, struct iwl_cfg iwl6150_bg_cfg = {
.name = "Intel(R) Centrino(R) Wireless-N + WiMAX 6150 BG",
IWL_DEVICE_6150,
}; };
struct iwl_cfg iwl6000_3agn_cfg = { struct iwl_cfg iwl6000_3agn_cfg = {

View File

@ -3831,11 +3831,11 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
/* 6150 WiFi/WiMax Series */ /* 6150 WiFi/WiMax Series */
{IWL_PCI_DEVICE(0x0885, 0x1305, iwl6150_bgn_cfg)}, {IWL_PCI_DEVICE(0x0885, 0x1305, iwl6150_bgn_cfg)},
{IWL_PCI_DEVICE(0x0885, 0x1306, iwl6150_bgn_cfg)}, {IWL_PCI_DEVICE(0x0885, 0x1307, iwl6150_bg_cfg)},
{IWL_PCI_DEVICE(0x0885, 0x1325, iwl6150_bgn_cfg)}, {IWL_PCI_DEVICE(0x0885, 0x1325, iwl6150_bgn_cfg)},
{IWL_PCI_DEVICE(0x0885, 0x1326, iwl6150_bgn_cfg)}, {IWL_PCI_DEVICE(0x0885, 0x1327, iwl6150_bg_cfg)},
{IWL_PCI_DEVICE(0x0886, 0x1315, iwl6150_bgn_cfg)}, {IWL_PCI_DEVICE(0x0886, 0x1315, iwl6150_bgn_cfg)},
{IWL_PCI_DEVICE(0x0886, 0x1316, iwl6150_bgn_cfg)}, {IWL_PCI_DEVICE(0x0886, 0x1317, iwl6150_bg_cfg)},
/* 1000 Series WiFi */ /* 1000 Series WiFi */
{IWL_PCI_DEVICE(0x0083, 0x1205, iwl1000_bgn_cfg)}, {IWL_PCI_DEVICE(0x0083, 0x1205, iwl1000_bgn_cfg)},

View File

@ -89,6 +89,7 @@ extern struct iwl_cfg iwl6000_3agn_cfg;
extern struct iwl_cfg iwl6050_2agn_cfg; extern struct iwl_cfg iwl6050_2agn_cfg;
extern struct iwl_cfg iwl6050_2abg_cfg; extern struct iwl_cfg iwl6050_2abg_cfg;
extern struct iwl_cfg iwl6150_bgn_cfg; extern struct iwl_cfg iwl6150_bgn_cfg;
extern struct iwl_cfg iwl6150_bg_cfg;
extern struct iwl_cfg iwl1000_bgn_cfg; extern struct iwl_cfg iwl1000_bgn_cfg;
extern struct iwl_cfg iwl1000_bg_cfg; extern struct iwl_cfg iwl1000_bg_cfg;
extern struct iwl_cfg iwl100_bgn_cfg; extern struct iwl_cfg iwl100_bgn_cfg;

View File

@ -994,6 +994,8 @@ static void lbs_submit_command(struct lbs_private *priv,
cmd = cmdnode->cmdbuf; cmd = cmdnode->cmdbuf;
spin_lock_irqsave(&priv->driver_lock, flags); spin_lock_irqsave(&priv->driver_lock, flags);
priv->seqnum++;
cmd->seqnum = cpu_to_le16(priv->seqnum);
priv->cur_cmd = cmdnode; priv->cur_cmd = cmdnode;
spin_unlock_irqrestore(&priv->driver_lock, flags); spin_unlock_irqrestore(&priv->driver_lock, flags);
@ -1621,11 +1623,9 @@ struct cmd_ctrl_node *__lbs_cmd_async(struct lbs_private *priv,
/* Copy the incoming command to the buffer */ /* Copy the incoming command to the buffer */
memcpy(cmdnode->cmdbuf, in_cmd, in_cmd_size); memcpy(cmdnode->cmdbuf, in_cmd, in_cmd_size);
/* Set sequence number, clean result, move to buffer */ /* Set command, clean result, move to buffer */
priv->seqnum++;
cmdnode->cmdbuf->command = cpu_to_le16(command); cmdnode->cmdbuf->command = cpu_to_le16(command);
cmdnode->cmdbuf->size = cpu_to_le16(in_cmd_size); cmdnode->cmdbuf->size = cpu_to_le16(in_cmd_size);
cmdnode->cmdbuf->seqnum = cpu_to_le16(priv->seqnum);
cmdnode->cmdbuf->result = 0; cmdnode->cmdbuf->result = 0;
lbs_deb_host("PREP_CMD: command 0x%04x\n", command); lbs_deb_host("PREP_CMD: command 0x%04x\n", command);

View File

@ -167,8 +167,8 @@
/* Rx unit register */ /* Rx unit register */
#define CARD_RX_UNIT_REG 0x63 #define CARD_RX_UNIT_REG 0x63
/* Event header Len*/ /* Event header len w/o 4 bytes of interface header */
#define MWIFIEX_EVENT_HEADER_LEN 8 #define MWIFIEX_EVENT_HEADER_LEN 4
/* Max retry number of CMD53 write */ /* Max retry number of CMD53 write */
#define MAX_WRITE_IOMEM_RETRY 2 #define MAX_WRITE_IOMEM_RETRY 2

View File

@ -166,7 +166,6 @@ config RT2800USB_RT35XX
config RT2800USB_RT53XX config RT2800USB_RT53XX
bool "rt2800usb - Include support for rt53xx devices (EXPERIMENTAL)" bool "rt2800usb - Include support for rt53xx devices (EXPERIMENTAL)"
depends on EXPERIMENTAL depends on EXPERIMENTAL
default y
---help--- ---help---
This adds support for rt53xx wireless chipset family to the This adds support for rt53xx wireless chipset family to the
rt2800pci driver. rt2800pci driver.

View File

@ -669,11 +669,6 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
&rx_status, &rx_status,
(u8 *) pdesc, skb); (u8 *) pdesc, skb);
pci_unmap_single(rtlpci->pdev,
*((dma_addr_t *) skb->cb),
rtlpci->rxbuffersize,
PCI_DMA_FROMDEVICE);
skb_put(skb, rtlpriv->cfg->ops->get_desc((u8 *) pdesc, skb_put(skb, rtlpriv->cfg->ops->get_desc((u8 *) pdesc,
false, false,
HW_DESC_RXPKT_LEN)); HW_DESC_RXPKT_LEN));
@ -690,6 +685,21 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
hdr = rtl_get_hdr(skb); hdr = rtl_get_hdr(skb);
fc = rtl_get_fc(skb); fc = rtl_get_fc(skb);
/* try for new buffer - if allocation fails, drop
* frame and reuse old buffer
*/
new_skb = dev_alloc_skb(rtlpci->rxbuffersize);
if (unlikely(!new_skb)) {
RT_TRACE(rtlpriv, (COMP_INTR | COMP_RECV),
DBG_DMESG,
("can't alloc skb for rx\n"));
goto done;
}
pci_unmap_single(rtlpci->pdev,
*((dma_addr_t *) skb->cb),
rtlpci->rxbuffersize,
PCI_DMA_FROMDEVICE);
if (!stats.crc || !stats.hwerror) { if (!stats.crc || !stats.hwerror) {
memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, memcpy(IEEE80211_SKB_RXCB(skb), &rx_status,
sizeof(rx_status)); sizeof(rx_status));
@ -758,15 +768,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
rtl_lps_leave(hw); rtl_lps_leave(hw);
} }
new_skb = dev_alloc_skb(rtlpci->rxbuffersize);
if (unlikely(!new_skb)) {
RT_TRACE(rtlpriv, (COMP_INTR | COMP_RECV),
DBG_DMESG,
("can't alloc skb for rx\n"));
goto done;
}
skb = new_skb; skb = new_skb;
/*skb->dev = dev; */
rtlpci->rx_ring[rx_queue_idx].rx_buf[rtlpci-> rtlpci->rx_ring[rx_queue_idx].rx_buf[rtlpci->
rx_ring rx_ring
@ -1113,6 +1115,13 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw)
rtlpci->rx_ring[rx_queue_idx].idx = 0; rtlpci->rx_ring[rx_queue_idx].idx = 0;
/* If amsdu_8k is disabled, set buffersize to 4096. This
* change will reduce memory fragmentation.
*/
if (rtlpci->rxbuffersize > 4096 &&
rtlpriv->rtlhal.disable_amsdu_8k)
rtlpci->rxbuffersize = 4096;
for (i = 0; i < rtlpci->rxringcount; i++) { for (i = 0; i < rtlpci->rxringcount; i++) {
struct sk_buff *skb = struct sk_buff *skb =
dev_alloc_skb(rtlpci->rxbuffersize); dev_alloc_skb(rtlpci->rxbuffersize);

View File

@ -1157,6 +1157,9 @@ struct conf_sched_scan_settings {
/* time to wait on the channel for passive scans (in TUs) */ /* time to wait on the channel for passive scans (in TUs) */
u32 dwell_time_passive; u32 dwell_time_passive;
/* time to wait on the channel for DFS scans (in TUs) */
u32 dwell_time_dfs;
/* number of probe requests to send on each channel in active scans */ /* number of probe requests to send on each channel in active scans */
u8 num_probe_reqs; u8 num_probe_reqs;

View File

@ -311,6 +311,7 @@ static struct conf_drv_settings default_conf = {
.min_dwell_time_active = 8, .min_dwell_time_active = 8,
.max_dwell_time_active = 30, .max_dwell_time_active = 30,
.dwell_time_passive = 100, .dwell_time_passive = 100,
.dwell_time_dfs = 150,
.num_probe_reqs = 2, .num_probe_reqs = 2,
.rssi_threshold = -90, .rssi_threshold = -90,
.snr_threshold = 0, .snr_threshold = 0,

View File

@ -331,16 +331,22 @@ wl1271_scan_get_sched_scan_channels(struct wl1271 *wl,
struct conf_sched_scan_settings *c = &wl->conf.sched_scan; struct conf_sched_scan_settings *c = &wl->conf.sched_scan;
int i, j; int i, j;
u32 flags; u32 flags;
bool force_passive = !req->n_ssids;
for (i = 0, j = start; for (i = 0, j = start;
i < req->n_channels && j < MAX_CHANNELS_ALL_BANDS; i < req->n_channels && j < MAX_CHANNELS_ALL_BANDS;
i++) { i++) {
flags = req->channels[i]->flags; flags = req->channels[i]->flags;
if (!(flags & IEEE80211_CHAN_DISABLED) && if (force_passive)
((flags & IEEE80211_CHAN_PASSIVE_SCAN) == passive) && flags |= IEEE80211_CHAN_PASSIVE_SCAN;
((flags & IEEE80211_CHAN_RADAR) == radar) &&
(req->channels[i]->band == band)) { if ((req->channels[i]->band == band) &&
!(flags & IEEE80211_CHAN_DISABLED) &&
(!!(flags & IEEE80211_CHAN_RADAR) == radar) &&
/* if radar is set, we ignore the passive flag */
(radar ||
!!(flags & IEEE80211_CHAN_PASSIVE_SCAN) == passive)) {
wl1271_debug(DEBUG_SCAN, "band %d, center_freq %d ", wl1271_debug(DEBUG_SCAN, "band %d, center_freq %d ",
req->channels[i]->band, req->channels[i]->band,
req->channels[i]->center_freq); req->channels[i]->center_freq);
@ -350,7 +356,12 @@ wl1271_scan_get_sched_scan_channels(struct wl1271 *wl,
wl1271_debug(DEBUG_SCAN, "max_power %d", wl1271_debug(DEBUG_SCAN, "max_power %d",
req->channels[i]->max_power); req->channels[i]->max_power);
if (flags & IEEE80211_CHAN_PASSIVE_SCAN) { if (flags & IEEE80211_CHAN_RADAR) {
channels[j].flags |= SCAN_CHANNEL_FLAGS_DFS;
channels[j].passive_duration =
cpu_to_le16(c->dwell_time_dfs);
}
else if (flags & IEEE80211_CHAN_PASSIVE_SCAN) {
channels[j].passive_duration = channels[j].passive_duration =
cpu_to_le16(c->dwell_time_passive); cpu_to_le16(c->dwell_time_passive);
} else { } else {
@ -359,7 +370,7 @@ wl1271_scan_get_sched_scan_channels(struct wl1271 *wl,
channels[j].max_duration = channels[j].max_duration =
cpu_to_le16(c->max_dwell_time_active); cpu_to_le16(c->max_dwell_time_active);
} }
channels[j].tx_power_att = req->channels[j]->max_power; channels[j].tx_power_att = req->channels[i]->max_power;
channels[j].channel = req->channels[i]->hw_value; channels[j].channel = req->channels[i]->hw_value;
j++; j++;
@ -386,7 +397,11 @@ wl1271_scan_sched_scan_channels(struct wl1271 *wl,
wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels, wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels,
IEEE80211_BAND_2GHZ, IEEE80211_BAND_2GHZ,
false, false, idx); false, false, idx);
idx += cfg->active[0]; /*
* 5GHz channels always start at position 14, not immediately
* after the last 2.4GHz channel
*/
idx = 14;
cfg->passive[1] = cfg->passive[1] =
wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels, wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels,
@ -394,22 +409,23 @@ wl1271_scan_sched_scan_channels(struct wl1271 *wl,
false, true, idx); false, true, idx);
idx += cfg->passive[1]; idx += cfg->passive[1];
cfg->active[1] =
wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels,
IEEE80211_BAND_5GHZ,
false, false, 14);
idx += cfg->active[1];
cfg->dfs = cfg->dfs =
wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels, wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels,
IEEE80211_BAND_5GHZ, IEEE80211_BAND_5GHZ,
true, false, idx); true, true, idx);
idx += cfg->dfs; idx += cfg->dfs;
cfg->active[1] =
wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels,
IEEE80211_BAND_5GHZ,
false, false, idx);
idx += cfg->active[1];
wl1271_debug(DEBUG_SCAN, " 2.4GHz: active %d passive %d", wl1271_debug(DEBUG_SCAN, " 2.4GHz: active %d passive %d",
cfg->active[0], cfg->passive[0]); cfg->active[0], cfg->passive[0]);
wl1271_debug(DEBUG_SCAN, " 5GHz: active %d passive %d", wl1271_debug(DEBUG_SCAN, " 5GHz: active %d passive %d",
cfg->active[1], cfg->passive[1]); cfg->active[1], cfg->passive[1]);
wl1271_debug(DEBUG_SCAN, " DFS: %d", cfg->dfs);
return idx; return idx;
} }
@ -421,6 +437,7 @@ int wl1271_scan_sched_scan_config(struct wl1271 *wl,
struct wl1271_cmd_sched_scan_config *cfg = NULL; struct wl1271_cmd_sched_scan_config *cfg = NULL;
struct conf_sched_scan_settings *c = &wl->conf.sched_scan; struct conf_sched_scan_settings *c = &wl->conf.sched_scan;
int i, total_channels, ret; int i, total_channels, ret;
bool force_passive = !req->n_ssids;
wl1271_debug(DEBUG_CMD, "cmd sched_scan scan config"); wl1271_debug(DEBUG_CMD, "cmd sched_scan scan config");
@ -444,7 +461,7 @@ int wl1271_scan_sched_scan_config(struct wl1271 *wl,
for (i = 0; i < SCAN_MAX_CYCLE_INTERVALS; i++) for (i = 0; i < SCAN_MAX_CYCLE_INTERVALS; i++)
cfg->intervals[i] = cpu_to_le32(req->interval); cfg->intervals[i] = cpu_to_le32(req->interval);
if (req->ssids[0].ssid_len && req->ssids[0].ssid) { if (!force_passive && req->ssids[0].ssid_len && req->ssids[0].ssid) {
cfg->filter_type = SCAN_SSID_FILTER_SPECIFIC; cfg->filter_type = SCAN_SSID_FILTER_SPECIFIC;
cfg->ssid_len = req->ssids[0].ssid_len; cfg->ssid_len = req->ssids[0].ssid_len;
memcpy(cfg->ssid, req->ssids[0].ssid, memcpy(cfg->ssid, req->ssids[0].ssid,
@ -461,7 +478,7 @@ int wl1271_scan_sched_scan_config(struct wl1271 *wl,
goto out; goto out;
} }
if (cfg->active[0]) { if (!force_passive && cfg->active[0]) {
ret = wl1271_cmd_build_probe_req(wl, req->ssids[0].ssid, ret = wl1271_cmd_build_probe_req(wl, req->ssids[0].ssid,
req->ssids[0].ssid_len, req->ssids[0].ssid_len,
ies->ie[IEEE80211_BAND_2GHZ], ies->ie[IEEE80211_BAND_2GHZ],
@ -473,7 +490,7 @@ int wl1271_scan_sched_scan_config(struct wl1271 *wl,
} }
} }
if (cfg->active[1]) { if (!force_passive && cfg->active[1]) {
ret = wl1271_cmd_build_probe_req(wl, req->ssids[0].ssid, ret = wl1271_cmd_build_probe_req(wl, req->ssids[0].ssid,
req->ssids[0].ssid_len, req->ssids[0].ssid_len,
ies->ie[IEEE80211_BAND_5GHZ], ies->ie[IEEE80211_BAND_5GHZ],

View File

@ -137,6 +137,9 @@ enum {
SCAN_BSS_TYPE_ANY, SCAN_BSS_TYPE_ANY,
}; };
#define SCAN_CHANNEL_FLAGS_DFS BIT(0)
#define SCAN_CHANNEL_FLAGS_DFS_ENABLED BIT(1)
struct conn_scan_ch_params { struct conn_scan_ch_params {
__le16 min_duration; __le16 min_duration;
__le16 max_duration; __le16 max_duration;

View File

@ -1533,6 +1533,31 @@ static void __exit usb_exit(void)
module_init(usb_init); module_init(usb_init);
module_exit(usb_exit); module_exit(usb_exit);
static int zd_ep_regs_out_msg(struct usb_device *udev, void *data, int len,
int *actual_length, int timeout)
{
/* In USB 2.0 mode EP_REGS_OUT endpoint is interrupt type. However in
* USB 1.1 mode endpoint is bulk. Select correct type URB by endpoint
* descriptor.
*/
struct usb_host_endpoint *ep;
unsigned int pipe;
pipe = usb_sndintpipe(udev, EP_REGS_OUT);
ep = usb_pipe_endpoint(udev, pipe);
if (!ep)
return -EINVAL;
if (usb_endpoint_xfer_int(&ep->desc)) {
return usb_interrupt_msg(udev, pipe, data, len,
actual_length, timeout);
} else {
pipe = usb_sndbulkpipe(udev, EP_REGS_OUT);
return usb_bulk_msg(udev, pipe, data, len, actual_length,
timeout);
}
}
static int usb_int_regs_length(unsigned int count) static int usb_int_regs_length(unsigned int count)
{ {
return sizeof(struct usb_int_regs) + count * sizeof(struct reg_data); return sizeof(struct usb_int_regs) + count * sizeof(struct reg_data);
@ -1648,15 +1673,14 @@ int zd_usb_ioread16v(struct zd_usb *usb, u16 *values,
udev = zd_usb_to_usbdev(usb); udev = zd_usb_to_usbdev(usb);
prepare_read_regs_int(usb); prepare_read_regs_int(usb);
r = usb_interrupt_msg(udev, usb_sndintpipe(udev, EP_REGS_OUT), r = zd_ep_regs_out_msg(udev, req, req_len, &actual_req_len, 50 /*ms*/);
req, req_len, &actual_req_len, 50 /* ms */);
if (r) { if (r) {
dev_dbg_f(zd_usb_dev(usb), dev_dbg_f(zd_usb_dev(usb),
"error in usb_interrupt_msg(). Error number %d\n", r); "error in zd_ep_regs_out_msg(). Error number %d\n", r);
goto error; goto error;
} }
if (req_len != actual_req_len) { if (req_len != actual_req_len) {
dev_dbg_f(zd_usb_dev(usb), "error in usb_interrupt_msg()\n" dev_dbg_f(zd_usb_dev(usb), "error in zd_ep_regs_out_msg()\n"
" req_len %d != actual_req_len %d\n", " req_len %d != actual_req_len %d\n",
req_len, actual_req_len); req_len, actual_req_len);
r = -EIO; r = -EIO;
@ -1818,9 +1842,17 @@ int zd_usb_iowrite16v_async(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs,
rw->value = cpu_to_le16(ioreqs[i].value); rw->value = cpu_to_le16(ioreqs[i].value);
} }
usb_fill_int_urb(urb, udev, usb_sndintpipe(udev, EP_REGS_OUT), /* In USB 2.0 mode endpoint is interrupt type. However in USB 1.1 mode
req, req_len, iowrite16v_urb_complete, usb, * endpoint is bulk. Select correct type URB by endpoint descriptor.
ep->desc.bInterval); */
if (usb_endpoint_xfer_int(&ep->desc))
usb_fill_int_urb(urb, udev, usb_sndintpipe(udev, EP_REGS_OUT),
req, req_len, iowrite16v_urb_complete, usb,
ep->desc.bInterval);
else
usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_REGS_OUT),
req, req_len, iowrite16v_urb_complete, usb);
urb->transfer_flags |= URB_FREE_BUFFER; urb->transfer_flags |= URB_FREE_BUFFER;
/* Submit previous URB */ /* Submit previous URB */
@ -1924,15 +1956,14 @@ int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits)
} }
udev = zd_usb_to_usbdev(usb); udev = zd_usb_to_usbdev(usb);
r = usb_interrupt_msg(udev, usb_sndintpipe(udev, EP_REGS_OUT), r = zd_ep_regs_out_msg(udev, req, req_len, &actual_req_len, 50 /*ms*/);
req, req_len, &actual_req_len, 50 /* ms */);
if (r) { if (r) {
dev_dbg_f(zd_usb_dev(usb), dev_dbg_f(zd_usb_dev(usb),
"error in usb_interrupt_msg(). Error number %d\n", r); "error in zd_ep_regs_out_msg(). Error number %d\n", r);
goto out; goto out;
} }
if (req_len != actual_req_len) { if (req_len != actual_req_len) {
dev_dbg_f(zd_usb_dev(usb), "error in usb_interrupt_msg()" dev_dbg_f(zd_usb_dev(usb), "error in zd_ep_regs_out_msg()"
" req_len %d != actual_req_len %d\n", " req_len %d != actual_req_len %d\n",
req_len, actual_req_len); req_len, actual_req_len);
r = -EIO; r = -EIO;

View File

@ -1003,8 +1003,12 @@ struct ieee80211_ht_info {
#define WLAN_CAPABILITY_ESS (1<<0) #define WLAN_CAPABILITY_ESS (1<<0)
#define WLAN_CAPABILITY_IBSS (1<<1) #define WLAN_CAPABILITY_IBSS (1<<1)
/* A mesh STA sets the ESS and IBSS capability bits to zero */ /*
#define WLAN_CAPABILITY_IS_MBSS(cap) \ * A mesh STA sets the ESS and IBSS capability bits to zero.
* however, this holds true for p2p probe responses (in the p2p_find
* phase) as well.
*/
#define WLAN_CAPABILITY_IS_STA_BSS(cap) \
(!((cap) & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS))) (!((cap) & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS)))
#define WLAN_CAPABILITY_CF_POLLABLE (1<<2) #define WLAN_CAPABILITY_CF_POLLABLE (1<<2)

View File

@ -70,6 +70,7 @@ struct tpacket_auxdata {
#define TP_STATUS_COPY 0x2 #define TP_STATUS_COPY 0x2
#define TP_STATUS_LOSING 0x4 #define TP_STATUS_LOSING 0x4
#define TP_STATUS_CSUMNOTREADY 0x8 #define TP_STATUS_CSUMNOTREADY 0x8
#define TP_STATUS_VLAN_VALID 0x10 /* auxdata has valid tp_vlan_tci */
/* Tx ring - header status */ /* Tx ring - header status */
#define TP_STATUS_AVAILABLE 0x0 #define TP_STATUS_AVAILABLE 0x0

View File

@ -107,6 +107,7 @@ typedef enum {
SCTP_CMD_UPDATE_INITTAG, /* Update peer inittag */ SCTP_CMD_UPDATE_INITTAG, /* Update peer inittag */
SCTP_CMD_SEND_MSG, /* Send the whole use message */ SCTP_CMD_SEND_MSG, /* Send the whole use message */
SCTP_CMD_SEND_NEXT_ASCONF, /* Send the next ASCONF after ACK */ SCTP_CMD_SEND_NEXT_ASCONF, /* Send the next ASCONF after ACK */
SCTP_CMD_PURGE_ASCONF_QUEUE, /* Purge all asconf queues.*/
SCTP_CMD_LAST SCTP_CMD_LAST
} sctp_verb_t; } sctp_verb_t;

View File

@ -1993,7 +1993,7 @@ void sctp_assoc_clean_asconf_ack_cache(const struct sctp_association *asoc);
struct sctp_chunk *sctp_assoc_lookup_asconf_ack( struct sctp_chunk *sctp_assoc_lookup_asconf_ack(
const struct sctp_association *asoc, const struct sctp_association *asoc,
__be32 serial); __be32 serial);
void sctp_asconf_queue_teardown(struct sctp_association *asoc);
int sctp_cmp_addr_exact(const union sctp_addr *ss1, int sctp_cmp_addr_exact(const union sctp_addr *ss1,
const union sctp_addr *ss2); const union sctp_addr *ss2);

View File

@ -12,22 +12,24 @@
TRACE_EVENT(net_dev_xmit, TRACE_EVENT(net_dev_xmit,
TP_PROTO(struct sk_buff *skb, TP_PROTO(struct sk_buff *skb,
int rc), int rc,
struct net_device *dev,
unsigned int skb_len),
TP_ARGS(skb, rc), TP_ARGS(skb, rc, dev, skb_len),
TP_STRUCT__entry( TP_STRUCT__entry(
__field( void *, skbaddr ) __field( void *, skbaddr )
__field( unsigned int, len ) __field( unsigned int, len )
__field( int, rc ) __field( int, rc )
__string( name, skb->dev->name ) __string( name, dev->name )
), ),
TP_fast_assign( TP_fast_assign(
__entry->skbaddr = skb; __entry->skbaddr = skb;
__entry->len = skb->len; __entry->len = skb_len;
__entry->rc = rc; __entry->rc = rc;
__assign_str(name, skb->dev->name); __assign_str(name, dev->name);
), ),
TP_printk("dev=%s skbaddr=%p len=%u rc=%d", TP_printk("dev=%s skbaddr=%p len=%u rc=%d",

View File

@ -165,7 +165,7 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
u64_stats_update_begin(&stats->syncp); u64_stats_update_begin(&stats->syncp);
stats->tx_packets++; stats->tx_packets++;
stats->tx_bytes += len; stats->tx_bytes += len;
u64_stats_update_begin(&stats->syncp); u64_stats_update_end(&stats->syncp);
} else { } else {
this_cpu_inc(vlan_dev_info(dev)->vlan_pcpu_stats->tx_dropped); this_cpu_inc(vlan_dev_info(dev)->vlan_pcpu_stats->tx_dropped);
} }

View File

@ -906,7 +906,7 @@ static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm, bdaddr
if (c->psm == psm) { if (c->psm == psm) {
/* Exact match. */ /* Exact match. */
if (!bacmp(&bt_sk(sk)->src, src)) { if (!bacmp(&bt_sk(sk)->src, src)) {
read_unlock_bh(&chan_list_lock); read_unlock(&chan_list_lock);
return c; return c;
} }

View File

@ -139,17 +139,14 @@ static void close_work(struct work_struct *work)
struct chnl_net *dev = NULL; struct chnl_net *dev = NULL;
struct list_head *list_node; struct list_head *list_node;
struct list_head *_tmp; struct list_head *_tmp;
/* May be called with or without RTNL lock held */
int islocked = rtnl_is_locked(); rtnl_lock();
if (!islocked)
rtnl_lock();
list_for_each_safe(list_node, _tmp, &chnl_net_list) { list_for_each_safe(list_node, _tmp, &chnl_net_list) {
dev = list_entry(list_node, struct chnl_net, list_field); dev = list_entry(list_node, struct chnl_net, list_field);
if (dev->state == CAIF_SHUTDOWN) if (dev->state == CAIF_SHUTDOWN)
dev_close(dev->netdev); dev_close(dev->netdev);
} }
if (!islocked) rtnl_unlock();
rtnl_unlock();
} }
static DECLARE_WORK(close_worker, close_work); static DECLARE_WORK(close_worker, close_work);

View File

@ -2096,6 +2096,7 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
{ {
const struct net_device_ops *ops = dev->netdev_ops; const struct net_device_ops *ops = dev->netdev_ops;
int rc = NETDEV_TX_OK; int rc = NETDEV_TX_OK;
unsigned int skb_len;
if (likely(!skb->next)) { if (likely(!skb->next)) {
u32 features; u32 features;
@ -2146,8 +2147,9 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
} }
} }
skb_len = skb->len;
rc = ops->ndo_start_xmit(skb, dev); rc = ops->ndo_start_xmit(skb, dev);
trace_net_dev_xmit(skb, rc); trace_net_dev_xmit(skb, rc, dev, skb_len);
if (rc == NETDEV_TX_OK) if (rc == NETDEV_TX_OK)
txq_trans_update(txq); txq_trans_update(txq);
return rc; return rc;
@ -2167,8 +2169,9 @@ gso:
if (dev->priv_flags & IFF_XMIT_DST_RELEASE) if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
skb_dst_drop(nskb); skb_dst_drop(nskb);
skb_len = nskb->len;
rc = ops->ndo_start_xmit(nskb, dev); rc = ops->ndo_start_xmit(nskb, dev);
trace_net_dev_xmit(nskb, rc); trace_net_dev_xmit(nskb, rc, dev, skb_len);
if (unlikely(rc != NETDEV_TX_OK)) { if (unlikely(rc != NETDEV_TX_OK)) {
if (rc & ~NETDEV_TX_MASK) if (rc & ~NETDEV_TX_MASK)
goto out_kfree_gso_skb; goto out_kfree_gso_skb;

View File

@ -465,6 +465,9 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
if (addr_len < sizeof(struct sockaddr_in)) if (addr_len < sizeof(struct sockaddr_in))
goto out; goto out;
if (addr->sin_family != AF_INET)
goto out;
chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr); chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr);
/* Not specified by any standard per-se, however it breaks too /* Not specified by any standard per-se, however it breaks too

View File

@ -14,6 +14,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/types.h> #include <linux/types.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/unaligned.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/ip.h> #include <linux/ip.h>
#include <linux/icmp.h> #include <linux/icmp.h>
@ -350,7 +351,7 @@ int ip_options_compile(struct net *net,
goto error; goto error;
} }
if (optptr[2] <= optlen) { if (optptr[2] <= optlen) {
__be32 *timeptr = NULL; unsigned char *timeptr = NULL;
if (optptr[2]+3 > optptr[1]) { if (optptr[2]+3 > optptr[1]) {
pp_ptr = optptr + 2; pp_ptr = optptr + 2;
goto error; goto error;
@ -359,7 +360,7 @@ int ip_options_compile(struct net *net,
case IPOPT_TS_TSONLY: case IPOPT_TS_TSONLY:
opt->ts = optptr - iph; opt->ts = optptr - iph;
if (skb) if (skb)
timeptr = (__be32*)&optptr[optptr[2]-1]; timeptr = &optptr[optptr[2]-1];
opt->ts_needtime = 1; opt->ts_needtime = 1;
optptr[2] += 4; optptr[2] += 4;
break; break;
@ -371,7 +372,7 @@ int ip_options_compile(struct net *net,
opt->ts = optptr - iph; opt->ts = optptr - iph;
if (rt) { if (rt) {
memcpy(&optptr[optptr[2]-1], &rt->rt_spec_dst, 4); memcpy(&optptr[optptr[2]-1], &rt->rt_spec_dst, 4);
timeptr = (__be32*)&optptr[optptr[2]+3]; timeptr = &optptr[optptr[2]+3];
} }
opt->ts_needaddr = 1; opt->ts_needaddr = 1;
opt->ts_needtime = 1; opt->ts_needtime = 1;
@ -389,7 +390,7 @@ int ip_options_compile(struct net *net,
if (inet_addr_type(net, addr) == RTN_UNICAST) if (inet_addr_type(net, addr) == RTN_UNICAST)
break; break;
if (skb) if (skb)
timeptr = (__be32*)&optptr[optptr[2]+3]; timeptr = &optptr[optptr[2]+3];
} }
opt->ts_needtime = 1; opt->ts_needtime = 1;
optptr[2] += 8; optptr[2] += 8;
@ -403,10 +404,10 @@ int ip_options_compile(struct net *net,
} }
if (timeptr) { if (timeptr) {
struct timespec tv; struct timespec tv;
__be32 midtime; u32 midtime;
getnstimeofday(&tv); getnstimeofday(&tv);
midtime = htonl((tv.tv_sec % 86400) * MSEC_PER_SEC + tv.tv_nsec / NSEC_PER_MSEC); midtime = (tv.tv_sec % 86400) * MSEC_PER_SEC + tv.tv_nsec / NSEC_PER_MSEC;
memcpy(timeptr, &midtime, sizeof(__be32)); put_unaligned_be32(midtime, timeptr);
opt->is_changed = 1; opt->is_changed = 1;
} }
} else { } else {

View File

@ -232,6 +232,9 @@ static u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata,
WARN_ON(!ieee80211_set_channel_type(local, sdata, channel_type)); WARN_ON(!ieee80211_set_channel_type(local, sdata, channel_type));
} }
ieee80211_stop_queues_by_reason(&sdata->local->hw,
IEEE80211_QUEUE_STOP_REASON_CSA);
/* channel_type change automatically detected */ /* channel_type change automatically detected */
ieee80211_hw_config(local, 0); ieee80211_hw_config(local, 0);
@ -245,6 +248,9 @@ static u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata,
rcu_read_unlock(); rcu_read_unlock();
} }
ieee80211_wake_queues_by_reason(&sdata->local->hw,
IEEE80211_QUEUE_STOP_REASON_CSA);
ht_opmode = le16_to_cpu(hti->operation_mode); ht_opmode = le16_to_cpu(hti->operation_mode);
/* if bss configuration changed store the new one */ /* if bss configuration changed store the new one */
@ -1089,6 +1095,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
local->hw.conf.flags &= ~IEEE80211_CONF_PS; local->hw.conf.flags &= ~IEEE80211_CONF_PS;
config_changed |= IEEE80211_CONF_CHANGE_PS; config_changed |= IEEE80211_CONF_CHANGE_PS;
} }
local->ps_sdata = NULL;
ieee80211_hw_config(local, config_changed); ieee80211_hw_config(local, config_changed);

View File

@ -15,7 +15,6 @@
#include <linux/if_arp.h> #include <linux/if_arp.h>
#include <linux/rtnetlink.h> #include <linux/rtnetlink.h>
#include <linux/pm_qos_params.h> #include <linux/pm_qos_params.h>
#include <linux/slab.h>
#include <net/sch_generic.h> #include <net/sch_generic.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <net/mac80211.h> #include <net/mac80211.h>

View File

@ -798,7 +798,12 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
getnstimeofday(&ts); getnstimeofday(&ts);
h.h2->tp_sec = ts.tv_sec; h.h2->tp_sec = ts.tv_sec;
h.h2->tp_nsec = ts.tv_nsec; h.h2->tp_nsec = ts.tv_nsec;
h.h2->tp_vlan_tci = vlan_tx_tag_get(skb); if (vlan_tx_tag_present(skb)) {
h.h2->tp_vlan_tci = vlan_tx_tag_get(skb);
status |= TP_STATUS_VLAN_VALID;
} else {
h.h2->tp_vlan_tci = 0;
}
hdrlen = sizeof(*h.h2); hdrlen = sizeof(*h.h2);
break; break;
default: default:
@ -1725,8 +1730,12 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock,
aux.tp_snaplen = skb->len; aux.tp_snaplen = skb->len;
aux.tp_mac = 0; aux.tp_mac = 0;
aux.tp_net = skb_network_offset(skb); aux.tp_net = skb_network_offset(skb);
aux.tp_vlan_tci = vlan_tx_tag_get(skb); if (vlan_tx_tag_present(skb)) {
aux.tp_vlan_tci = vlan_tx_tag_get(skb);
aux.tp_status |= TP_STATUS_VLAN_VALID;
} else {
aux.tp_vlan_tci = 0;
}
put_cmsg(msg, SOL_PACKET, PACKET_AUXDATA, sizeof(aux), &aux); put_cmsg(msg, SOL_PACKET, PACKET_AUXDATA, sizeof(aux), &aux);
} }

View File

@ -444,15 +444,7 @@ void sctp_association_free(struct sctp_association *asoc)
asoc->peer.transport_count = 0; asoc->peer.transport_count = 0;
/* Free any cached ASCONF_ACK chunk. */ sctp_asconf_queue_teardown(asoc);
sctp_assoc_free_asconf_acks(asoc);
/* Free the ASCONF queue. */
sctp_assoc_free_asconf_queue(asoc);
/* Free any cached ASCONF chunk. */
if (asoc->addip_last_asconf)
sctp_chunk_free(asoc->addip_last_asconf);
/* AUTH - Free the endpoint shared keys */ /* AUTH - Free the endpoint shared keys */
sctp_auth_destroy_keys(&asoc->endpoint_shared_keys); sctp_auth_destroy_keys(&asoc->endpoint_shared_keys);
@ -1646,3 +1638,16 @@ struct sctp_chunk *sctp_assoc_lookup_asconf_ack(
return NULL; return NULL;
} }
void sctp_asconf_queue_teardown(struct sctp_association *asoc)
{
/* Free any cached ASCONF_ACK chunk. */
sctp_assoc_free_asconf_acks(asoc);
/* Free the ASCONF queue. */
sctp_assoc_free_asconf_queue(asoc);
/* Free any cached ASCONF chunk. */
if (asoc->addip_last_asconf)
sctp_chunk_free(asoc->addip_last_asconf);
}

View File

@ -1670,6 +1670,9 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
case SCTP_CMD_SEND_NEXT_ASCONF: case SCTP_CMD_SEND_NEXT_ASCONF:
sctp_cmd_send_asconf(asoc); sctp_cmd_send_asconf(asoc);
break; break;
case SCTP_CMD_PURGE_ASCONF_QUEUE:
sctp_asconf_queue_teardown(asoc);
break;
default: default:
pr_warn("Impossible command: %u, %p\n", pr_warn("Impossible command: %u, %p\n",
cmd->verb, cmd->obj.ptr); cmd->verb, cmd->obj.ptr);

View File

@ -1718,11 +1718,21 @@ static sctp_disposition_t sctp_sf_do_dupcook_a(const struct sctp_endpoint *ep,
return SCTP_DISPOSITION_CONSUME; return SCTP_DISPOSITION_CONSUME;
} }
/* For now, fail any unsent/unacked data. Consider the optional /* For now, stop pending T3-rtx and SACK timers, fail any unsent/unacked
* choice of resending of this data. * data. Consider the optional choice of resending of this data.
*/ */
sctp_add_cmd_sf(commands, SCTP_CMD_T3_RTX_TIMERS_STOP, SCTP_NULL());
sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
SCTP_TO(SCTP_EVENT_TIMEOUT_SACK));
sctp_add_cmd_sf(commands, SCTP_CMD_PURGE_OUTQUEUE, SCTP_NULL()); sctp_add_cmd_sf(commands, SCTP_CMD_PURGE_OUTQUEUE, SCTP_NULL());
/* Stop pending T4-rto timer, teardown ASCONF queue, ASCONF-ACK queue
* and ASCONF-ACK cache.
*/
sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO));
sctp_add_cmd_sf(commands, SCTP_CMD_PURGE_ASCONF_QUEUE, SCTP_NULL());
repl = sctp_make_cookie_ack(new_asoc, chunk); repl = sctp_make_cookie_ack(new_asoc, chunk);
if (!repl) if (!repl)
goto nomem; goto nomem;

View File

@ -3406,12 +3406,12 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
i = 0; i = 0;
if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) { if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) {
nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
request->ssids[i].ssid_len = nla_len(attr);
if (request->ssids[i].ssid_len > IEEE80211_MAX_SSID_LEN) { if (request->ssids[i].ssid_len > IEEE80211_MAX_SSID_LEN) {
err = -EINVAL; err = -EINVAL;
goto out_free; goto out_free;
} }
memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
request->ssids[i].ssid_len = nla_len(attr);
i++; i++;
} }
} }
@ -3572,6 +3572,7 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) { if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) {
nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS],
tmp) { tmp) {
request->ssids[i].ssid_len = nla_len(attr);
if (request->ssids[i].ssid_len > if (request->ssids[i].ssid_len >
IEEE80211_MAX_SSID_LEN) { IEEE80211_MAX_SSID_LEN) {
err = -EINVAL; err = -EINVAL;
@ -3579,7 +3580,6 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
} }
memcpy(request->ssids[i].ssid, nla_data(attr), memcpy(request->ssids[i].ssid, nla_data(attr),
nla_len(attr)); nla_len(attr));
request->ssids[i].ssid_len = nla_len(attr);
i++; i++;
} }
} }

View File

@ -267,13 +267,35 @@ static bool is_bss(struct cfg80211_bss *a,
return memcmp(ssidie + 2, ssid, ssid_len) == 0; return memcmp(ssidie + 2, ssid, ssid_len) == 0;
} }
static bool is_mesh_bss(struct cfg80211_bss *a)
{
const u8 *ie;
if (!WLAN_CAPABILITY_IS_STA_BSS(a->capability))
return false;
ie = cfg80211_find_ie(WLAN_EID_MESH_ID,
a->information_elements,
a->len_information_elements);
if (!ie)
return false;
ie = cfg80211_find_ie(WLAN_EID_MESH_CONFIG,
a->information_elements,
a->len_information_elements);
if (!ie)
return false;
return true;
}
static bool is_mesh(struct cfg80211_bss *a, static bool is_mesh(struct cfg80211_bss *a,
const u8 *meshid, size_t meshidlen, const u8 *meshid, size_t meshidlen,
const u8 *meshcfg) const u8 *meshcfg)
{ {
const u8 *ie; const u8 *ie;
if (!WLAN_CAPABILITY_IS_MBSS(a->capability)) if (!WLAN_CAPABILITY_IS_STA_BSS(a->capability))
return false; return false;
ie = cfg80211_find_ie(WLAN_EID_MESH_ID, ie = cfg80211_find_ie(WLAN_EID_MESH_ID,
@ -311,7 +333,7 @@ static int cmp_bss(struct cfg80211_bss *a,
if (a->channel != b->channel) if (a->channel != b->channel)
return b->channel->center_freq - a->channel->center_freq; return b->channel->center_freq - a->channel->center_freq;
if (WLAN_CAPABILITY_IS_MBSS(a->capability | b->capability)) { if (is_mesh_bss(a) && is_mesh_bss(b)) {
r = cmp_ies(WLAN_EID_MESH_ID, r = cmp_ies(WLAN_EID_MESH_ID,
a->information_elements, a->information_elements,
a->len_information_elements, a->len_information_elements,
@ -457,7 +479,6 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
struct cfg80211_internal_bss *res) struct cfg80211_internal_bss *res)
{ {
struct cfg80211_internal_bss *found = NULL; struct cfg80211_internal_bss *found = NULL;
const u8 *meshid, *meshcfg;
/* /*
* The reference to "res" is donated to this function. * The reference to "res" is donated to this function.
@ -470,22 +491,6 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
res->ts = jiffies; res->ts = jiffies;
if (WLAN_CAPABILITY_IS_MBSS(res->pub.capability)) {
/* must be mesh, verify */
meshid = cfg80211_find_ie(WLAN_EID_MESH_ID,
res->pub.information_elements,
res->pub.len_information_elements);
meshcfg = cfg80211_find_ie(WLAN_EID_MESH_CONFIG,
res->pub.information_elements,
res->pub.len_information_elements);
if (!meshid || !meshcfg ||
meshcfg[1] != sizeof(struct ieee80211_meshconf_ie)) {
/* bogus mesh */
kref_put(&res->ref, bss_release);
return NULL;
}
}
spin_lock_bh(&dev->bss_lock); spin_lock_bh(&dev->bss_lock);
found = rb_find_bss(dev, res); found = rb_find_bss(dev, res);