diff options
Diffstat (limited to 'include')
46 files changed, 602 insertions, 210 deletions
diff --git a/include/asm-generic/socket.h b/include/asm-generic/socket.h index 49c1704173e..b1bea03274d 100644 --- a/include/asm-generic/socket.h +++ b/include/asm-generic/socket.h @@ -67,4 +67,9 @@  #define SO_WIFI_STATUS		41  #define SCM_WIFI_STATUS	SO_WIFI_STATUS +#define SO_PEEK_OFF		42 + +/* Instruct lower device to use last 4-bytes of skb data as FCS */ +#define SO_NOFCS		43 +  #endif /* __ASM_GENERIC_SOCKET_H */ diff --git a/include/linux/Kbuild b/include/linux/Kbuild index c94e71781b7..4b0b7ed4a99 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild @@ -238,6 +238,7 @@ header-y += magic.h  header-y += major.h  header-y += map_to_7segment.h  header-y += matroxfb.h +header-y += mdio.h  header-y += media.h  header-y += mempolicy.h  header-y += meye.h diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h index 83c209f3949..b9f65fbee42 100644 --- a/include/linux/bcma/bcma.h +++ b/include/linux/bcma/bcma.h @@ -136,6 +136,7 @@ struct bcma_device {  	bool dev_registered;  	u8 core_index; +	u8 core_unit;  	u32 addr;  	u32 wrap; @@ -195,6 +196,7 @@ struct bcma_bus {  	struct list_head cores;  	u8 nr_cores;  	u8 init_done:1; +	u8 num;  	struct bcma_drv_cc drv_cc;  	struct bcma_drv_pci drv_pci; diff --git a/include/linux/bcma/bcma_driver_chipcommon.h b/include/linux/bcma/bcma_driver_chipcommon.h index a33086a7530..e72938b1071 100644 --- a/include/linux/bcma/bcma_driver_chipcommon.h +++ b/include/linux/bcma/bcma_driver_chipcommon.h @@ -181,6 +181,22 @@  #define BCMA_CC_FLASH_CFG		0x0128  #define  BCMA_CC_FLASH_CFG_DS		0x0010	/* Data size, 0=8bit, 1=16bit */  #define BCMA_CC_FLASH_WAITCNT		0x012C +#define BCMA_CC_SROM_CONTROL		0x0190 +#define  BCMA_CC_SROM_CONTROL_START	0x80000000 +#define  BCMA_CC_SROM_CONTROL_BUSY	0x80000000 +#define  BCMA_CC_SROM_CONTROL_OPCODE	0x60000000 +#define  BCMA_CC_SROM_CONTROL_OP_READ	0x00000000 +#define  BCMA_CC_SROM_CONTROL_OP_WRITE	0x20000000 +#define  BCMA_CC_SROM_CONTROL_OP_WRDIS	0x40000000 +#define  BCMA_CC_SROM_CONTROL_OP_WREN	0x60000000 +#define  BCMA_CC_SROM_CONTROL_OTPSEL	0x00000010 +#define  BCMA_CC_SROM_CONTROL_LOCK	0x00000008 +#define  BCMA_CC_SROM_CONTROL_SIZE_MASK	0x00000006 +#define  BCMA_CC_SROM_CONTROL_SIZE_1K	0x00000000 +#define  BCMA_CC_SROM_CONTROL_SIZE_4K	0x00000002 +#define  BCMA_CC_SROM_CONTROL_SIZE_16K	0x00000004 +#define  BCMA_CC_SROM_CONTROL_SIZE_SHIFT	1 +#define  BCMA_CC_SROM_CONTROL_PRESENT	0x00000001  /* 0x1E0 is defined as shared BCMA_CLKCTLST */  #define BCMA_CC_HW_WORKAROUND		0x01E4 /* Hardware workaround (rev >= 20) */  #define BCMA_CC_UART0_DATA		0x0300 diff --git a/include/linux/bcma/bcma_driver_pci.h b/include/linux/bcma/bcma_driver_pci.h index 3871b668caf..46c71e27d31 100644 --- a/include/linux/bcma/bcma_driver_pci.h +++ b/include/linux/bcma/bcma_driver_pci.h @@ -53,6 +53,35 @@ struct pci_dev;  #define  BCMA_CORE_PCI_SBTOPCI1_MASK		0xFC000000  #define BCMA_CORE_PCI_SBTOPCI2			0x0108	/* Backplane to PCI translation 2 (sbtopci2) */  #define  BCMA_CORE_PCI_SBTOPCI2_MASK		0xC0000000 +#define BCMA_CORE_PCI_CONFIG_ADDR		0x0120	/* pcie config space access */ +#define BCMA_CORE_PCI_CONFIG_DATA		0x0124	/* pcie config space access */ +#define BCMA_CORE_PCI_MDIO_CONTROL		0x0128	/* controls the mdio access */ +#define  BCMA_CORE_PCI_MDIOCTL_DIVISOR_MASK	0x7f	/* clock to be used on MDIO */ +#define  BCMA_CORE_PCI_MDIOCTL_DIVISOR_VAL	0x2 +#define  BCMA_CORE_PCI_MDIOCTL_PREAM_EN		0x80	/* Enable preamble sequnce */ +#define  BCMA_CORE_PCI_MDIOCTL_ACCESS_DONE	0x100	/* Tranaction complete */ +#define BCMA_CORE_PCI_MDIO_DATA			0x012c	/* Data to the mdio access */ +#define  BCMA_CORE_PCI_MDIODATA_MASK		0x0000ffff /* data 2 bytes */ +#define  BCMA_CORE_PCI_MDIODATA_TA		0x00020000 /* Turnaround */ +#define  BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD	18	/* Regaddr shift (rev < 10) */ +#define  BCMA_CORE_PCI_MDIODATA_REGADDR_MASK_OLD	0x003c0000 /* Regaddr Mask (rev < 10) */ +#define  BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF_OLD	22	/* Physmedia devaddr shift (rev < 10) */ +#define  BCMA_CORE_PCI_MDIODATA_DEVADDR_MASK_OLD	0x0fc00000 /* Physmedia devaddr Mask (rev < 10) */ +#define  BCMA_CORE_PCI_MDIODATA_REGADDR_SHF	18	/* Regaddr shift */ +#define  BCMA_CORE_PCI_MDIODATA_REGADDR_MASK	0x007c0000 /* Regaddr Mask */ +#define  BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF	23	/* Physmedia devaddr shift */ +#define  BCMA_CORE_PCI_MDIODATA_DEVADDR_MASK	0x0f800000 /* Physmedia devaddr Mask */ +#define  BCMA_CORE_PCI_MDIODATA_WRITE		0x10000000 /* write Transaction */ +#define  BCMA_CORE_PCI_MDIODATA_READ		0x20000000 /* Read Transaction */ +#define  BCMA_CORE_PCI_MDIODATA_START		0x40000000 /* start of Transaction */ +#define  BCMA_CORE_PCI_MDIODATA_DEV_ADDR	0x0	/* dev address for serdes */ +#define  BCMA_CORE_PCI_MDIODATA_BLK_ADDR	0x1F	/* blk address for serdes */ +#define  BCMA_CORE_PCI_MDIODATA_DEV_PLL		0x1d	/* SERDES PLL Dev */ +#define  BCMA_CORE_PCI_MDIODATA_DEV_TX		0x1e	/* SERDES TX Dev */ +#define  BCMA_CORE_PCI_MDIODATA_DEV_RX		0x1f	/* SERDES RX Dev */ +#define BCMA_CORE_PCI_PCIEIND_ADDR		0x0130	/* indirect access to the internal register */ +#define BCMA_CORE_PCI_PCIEIND_DATA		0x0134	/* Data to/from the internal regsiter */ +#define BCMA_CORE_PCI_CLKREQENCTRL		0x0138	/*  >= rev 6, Clkreq rdma control */  #define BCMA_CORE_PCI_PCICFG0			0x0400	/* PCI config space 0 (rev >= 8) */  #define BCMA_CORE_PCI_PCICFG1			0x0500	/* PCI config space 1 (rev >= 8) */  #define BCMA_CORE_PCI_PCICFG2			0x0600	/* PCI config space 2 (rev >= 8) */ @@ -72,20 +101,114 @@ struct pci_dev;  #define  BCMA_CORE_PCI_SBTOPCI_RC_READL		0x00000010 /* Memory read line */  #define  BCMA_CORE_PCI_SBTOPCI_RC_READM		0x00000020 /* Memory read multiple */ +/* PCIE protocol PHY diagnostic registers */ +#define BCMA_CORE_PCI_PLP_MODEREG		0x200	/* Mode */ +#define BCMA_CORE_PCI_PLP_STATUSREG		0x204	/* Status */ +#define  BCMA_CORE_PCI_PLP_POLARITYINV_STAT	0x10	/* Status reg PCIE_PLP_STATUSREG */ +#define BCMA_CORE_PCI_PLP_LTSSMCTRLREG		0x208	/* LTSSM control */ +#define BCMA_CORE_PCI_PLP_LTLINKNUMREG		0x20c	/* Link Training Link number */ +#define BCMA_CORE_PCI_PLP_LTLANENUMREG		0x210	/* Link Training Lane number */ +#define BCMA_CORE_PCI_PLP_LTNFTSREG		0x214	/* Link Training N_FTS */ +#define BCMA_CORE_PCI_PLP_ATTNREG		0x218	/* Attention */ +#define BCMA_CORE_PCI_PLP_ATTNMASKREG		0x21C	/* Attention Mask */ +#define BCMA_CORE_PCI_PLP_RXERRCTR		0x220	/* Rx Error */ +#define BCMA_CORE_PCI_PLP_RXFRMERRCTR		0x224	/* Rx Framing Error */ +#define BCMA_CORE_PCI_PLP_RXERRTHRESHREG	0x228	/* Rx Error threshold */ +#define BCMA_CORE_PCI_PLP_TESTCTRLREG		0x22C	/* Test Control reg */ +#define BCMA_CORE_PCI_PLP_SERDESCTRLOVRDREG	0x230	/* SERDES Control Override */ +#define BCMA_CORE_PCI_PLP_TIMINGOVRDREG		0x234	/* Timing param override */ +#define BCMA_CORE_PCI_PLP_RXTXSMDIAGREG		0x238	/* RXTX State Machine Diag */ +#define BCMA_CORE_PCI_PLP_LTSSMDIAGREG		0x23C	/* LTSSM State Machine Diag */ + +/* PCIE protocol DLLP diagnostic registers */ +#define BCMA_CORE_PCI_DLLP_LCREG		0x100	/* Link Control */ +#define BCMA_CORE_PCI_DLLP_LSREG		0x104	/* Link Status */ +#define BCMA_CORE_PCI_DLLP_LAREG		0x108	/* Link Attention */ +#define  BCMA_CORE_PCI_DLLP_LSREG_LINKUP	(1 << 16) +#define BCMA_CORE_PCI_DLLP_LAMASKREG		0x10C	/* Link Attention Mask */ +#define BCMA_CORE_PCI_DLLP_NEXTTXSEQNUMREG	0x110	/* Next Tx Seq Num */ +#define BCMA_CORE_PCI_DLLP_ACKEDTXSEQNUMREG	0x114	/* Acked Tx Seq Num */ +#define BCMA_CORE_PCI_DLLP_PURGEDTXSEQNUMREG	0x118	/* Purged Tx Seq Num */ +#define BCMA_CORE_PCI_DLLP_RXSEQNUMREG		0x11C	/* Rx Sequence Number */ +#define BCMA_CORE_PCI_DLLP_LRREG		0x120	/* Link Replay */ +#define BCMA_CORE_PCI_DLLP_LACKTOREG		0x124	/* Link Ack Timeout */ +#define BCMA_CORE_PCI_DLLP_PMTHRESHREG		0x128	/* Power Management Threshold */ +#define BCMA_CORE_PCI_DLLP_RTRYWPREG		0x12C	/* Retry buffer write ptr */ +#define BCMA_CORE_PCI_DLLP_RTRYRPREG		0x130	/* Retry buffer Read ptr */ +#define BCMA_CORE_PCI_DLLP_RTRYPPREG		0x134	/* Retry buffer Purged ptr */ +#define BCMA_CORE_PCI_DLLP_RTRRWREG		0x138	/* Retry buffer Read/Write */ +#define BCMA_CORE_PCI_DLLP_ECTHRESHREG		0x13C	/* Error Count Threshold */ +#define BCMA_CORE_PCI_DLLP_TLPERRCTRREG		0x140	/* TLP Error Counter */ +#define BCMA_CORE_PCI_DLLP_ERRCTRREG		0x144	/* Error Counter */ +#define BCMA_CORE_PCI_DLLP_NAKRXCTRREG		0x148	/* NAK Received Counter */ +#define BCMA_CORE_PCI_DLLP_TESTREG		0x14C	/* Test */ +#define BCMA_CORE_PCI_DLLP_PKTBIST		0x150	/* Packet BIST */ +#define BCMA_CORE_PCI_DLLP_PCIE11		0x154	/* DLLP PCIE 1.1 reg */ + +/* SERDES RX registers */ +#define BCMA_CORE_PCI_SERDES_RX_CTRL		1	/* Rx cntrl */ +#define  BCMA_CORE_PCI_SERDES_RX_CTRL_FORCE	0x80	/* rxpolarity_force */ +#define  BCMA_CORE_PCI_SERDES_RX_CTRL_POLARITY	0x40	/* rxpolarity_value */ +#define BCMA_CORE_PCI_SERDES_RX_TIMER1		2	/* Rx Timer1 */ +#define BCMA_CORE_PCI_SERDES_RX_CDR		6	/* CDR */ +#define BCMA_CORE_PCI_SERDES_RX_CDRBW		7	/* CDR BW */ + +/* SERDES PLL registers */ +#define BCMA_CORE_PCI_SERDES_PLL_CTRL		1	/* PLL control reg */ +#define BCMA_CORE_PCI_PLL_CTRL_FREQDET_EN	0x4000	/* bit 14 is FREQDET on */ +  /* PCIcore specific boardflags */  #define BCMA_CORE_PCI_BFL_NOPCI			0x00000400 /* Board leaves PCI floating */ +/* PCIE Config space accessing MACROS */ +#define BCMA_CORE_PCI_CFG_BUS_SHIFT		24	/* Bus shift */ +#define BCMA_CORE_PCI_CFG_SLOT_SHIFT		19	/* Slot/Device shift */ +#define BCMA_CORE_PCI_CFG_FUN_SHIFT		16	/* Function shift */ +#define BCMA_CORE_PCI_CFG_OFF_SHIFT		0	/* Register shift */ + +#define BCMA_CORE_PCI_CFG_BUS_MASK		0xff	/* Bus mask */ +#define BCMA_CORE_PCI_CFG_SLOT_MASK		0x1f	/* Slot/Device mask */ +#define BCMA_CORE_PCI_CFG_FUN_MASK		7	/* Function mask */ +#define BCMA_CORE_PCI_CFG_OFF_MASK		0xfff	/* Register mask */ + +/* PCIE Root Capability Register bits (Host mode only) */ +#define BCMA_CORE_PCI_RC_CRS_VISIBILITY		0x0001 + +struct bcma_drv_pci; + +#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE +struct bcma_drv_pci_host { +	struct bcma_drv_pci *pdev; + +	u32 host_cfg_addr; +	spinlock_t cfgspace_lock; + +	struct pci_controller pci_controller; +	struct pci_ops pci_ops; +	struct resource mem_resource; +	struct resource io_resource; +}; +#endif +  struct bcma_drv_pci {  	struct bcma_device *core;  	u8 setup_done:1; +	u8 hostmode:1; + +#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE +	struct bcma_drv_pci_host *host_controller; +#endif  };  /* Register access */  #define pcicore_read32(pc, offset)		bcma_read32((pc)->core, offset)  #define pcicore_write32(pc, offset, val)	bcma_write32((pc)->core, offset, val) -extern void bcma_core_pci_init(struct bcma_drv_pci *pc); +extern void __devinit bcma_core_pci_init(struct bcma_drv_pci *pc);  extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc,  				 struct bcma_device *core, bool enable); +extern int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev); +extern int bcma_core_pci_plat_dev_init(struct pci_dev *dev); +  #endif /* LINUX_BCMA_DRIVER_PCI_H_ */ diff --git a/include/linux/bcma/bcma_regs.h b/include/linux/bcma/bcma_regs.h index 9faae2ae02e..5a71d571964 100644 --- a/include/linux/bcma/bcma_regs.h +++ b/include/linux/bcma/bcma_regs.h @@ -56,4 +56,31 @@  #define  BCMA_PCI_GPIO_XTAL		0x40	/* PCI config space GPIO 14 for Xtal powerup */  #define  BCMA_PCI_GPIO_PLL		0x80	/* PCI config space GPIO 15 for PLL powerdown */ +/* SiliconBackplane Address Map. + * All regions may not exist on all chips. + */ +#define BCMA_SOC_SDRAM_BASE		0x00000000U	/* Physical SDRAM */ +#define BCMA_SOC_PCI_MEM		0x08000000U	/* Host Mode sb2pcitranslation0 (64 MB) */ +#define BCMA_SOC_PCI_MEM_SZ		(64 * 1024 * 1024) +#define BCMA_SOC_PCI_CFG		0x0c000000U	/* Host Mode sb2pcitranslation1 (64 MB) */ +#define BCMA_SOC_SDRAM_SWAPPED		0x10000000U	/* Byteswapped Physical SDRAM */ +#define BCMA_SOC_SDRAM_R2		0x80000000U	/* Region 2 for sdram (512 MB) */ + + +#define BCMA_SOC_PCI_DMA		0x40000000U	/* Client Mode sb2pcitranslation2 (1 GB) */ +#define BCMA_SOC_PCI_DMA2		0x80000000U	/* Client Mode sb2pcitranslation2 (1 GB) */ +#define BCMA_SOC_PCI_DMA_SZ		0x40000000U	/* Client Mode sb2pcitranslation2 size in bytes */ +#define BCMA_SOC_PCIE_DMA_L32		0x00000000U	/* PCIE Client Mode sb2pcitranslation2 +							 * (2 ZettaBytes), low 32 bits +							 */ +#define BCMA_SOC_PCIE_DMA_H32		0x80000000U	/* PCIE Client Mode sb2pcitranslation2 +							 * (2 ZettaBytes), high 32 bits +							 */ + +#define BCMA_SOC_PCI1_MEM		0x40000000U	/* Host Mode sb2pcitranslation0 (64 MB) */ +#define BCMA_SOC_PCI1_CFG		0x44000000U	/* Host Mode sb2pcitranslation1 (64 MB) */ +#define BCMA_SOC_PCIE1_DMA_H32		0xc0000000U	/* PCIE Client Mode sb2pcitranslation2 +							 * (2 ZettaBytes), high 32 bits +							 */ +  #endif /* LINUX_BCMA_REGS_H_ */ diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index a0969fcb72b..5d2efe7e3f1 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h @@ -92,7 +92,7 @@ void can_bus_off(struct net_device *dev);  void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,  		      unsigned int idx); -void can_get_echo_skb(struct net_device *dev, unsigned int idx); +unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx);  void can_free_echo_skb(struct net_device *dev, unsigned int idx);  struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf); diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h index 05955cf0993..8a1835855fa 100644 --- a/include/linux/etherdevice.h +++ b/include/linux/etherdevice.h @@ -140,17 +140,18 @@ static inline void random_ether_addr(u8 *addr)  }  /** - * dev_hw_addr_random - Create random MAC and set device flag + * eth_hw_addr_random - Generate software assigned random Ethernet and + * set device flag   * @dev: pointer to net_device structure - * @hwaddr: Pointer to a six-byte array containing the Ethernet address   * - * Generate random MAC to be used by a device and set addr_assign_type - * so the state can be read by sysfs and be used by udev. + * Generate a random Ethernet address (MAC) to be used by a net device + * and set addr_assign_type so the state can be read by sysfs and be + * used by userspace.   */ -static inline void dev_hw_addr_random(struct net_device *dev, u8 *hwaddr) +static inline void eth_hw_addr_random(struct net_device *dev)  {  	dev->addr_assign_type |= NET_ADDR_RANDOM; -	random_ether_addr(hwaddr); +	random_ether_addr(dev->dev_addr);  }  /** diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index da5b2de99ae..e1d9e0ede30 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h @@ -30,10 +30,15 @@ struct ethtool_cmd {  				 * access it */  	__u8	duplex;		/* Duplex, half or full */  	__u8	port;		/* Which connector port */ -	__u8	phy_address; +	__u8	phy_address;	/* MDIO PHY address (PRTAD for clause 45). +				 * May be read-only or read-write +				 * depending on the driver. +				 */  	__u8	transceiver;	/* Which transceiver to use */  	__u8	autoneg;	/* Enable or disable autonegotiation */ -	__u8	mdio_support; +	__u8	mdio_support;	/* MDIO protocols supported.  Read-only. +				 * Not set by all drivers. +				 */  	__u32	maxtxpkt;	/* Tx pkts before generating tx int */  	__u32	maxrxpkt;	/* Rx pkts before generating rx int */  	__u16	speed_hi;       /* The forced speed (upper @@ -59,6 +64,20 @@ static inline __u32 ethtool_cmd_speed(const struct ethtool_cmd *ep)  	return (ep->speed_hi << 16) | ep->speed;  } +/* Device supports clause 22 register access to PHY or peripherals + * using the interface defined in <linux/mii.h>.  This should not be + * set if there are known to be no such peripherals present or if + * the driver only emulates clause 22 registers for compatibility. + */ +#define ETH_MDIO_SUPPORTS_C22	1 + +/* Device supports clause 45 register access to PHY or peripherals + * using the interface defined in <linux/mii.h> and <linux/mdio.h>. + * This should not be set if there are known to be no such peripherals + * present. + */ +#define ETH_MDIO_SUPPORTS_C45	2 +  #define ETHTOOL_FWVERS_LEN	32  #define ETHTOOL_BUSINFO_LEN	32  /* these strings are set to whatever the driver author decides... */ diff --git a/include/linux/if.h b/include/linux/if.h index 06b6ef60c82..f995c663c49 100644 --- a/include/linux/if.h +++ b/include/linux/if.h @@ -80,6 +80,8 @@  					 * skbs on transmit */  #define IFF_UNICAST_FLT	0x20000		/* Supports unicast filtering	*/  #define IFF_TEAM_PORT	0x40000		/* device used as team port */ +#define IFF_SUPP_NOFCS	0x80000		/* device supports sending custom FCS */ +  #define IF_GET_IFACE	0x0001		/* for querying only */  #define IF_GET_PROTO	0x0002 diff --git a/include/linux/in.h b/include/linux/in.h index 01129c0ea87..e0337f11d92 100644 --- a/include/linux/in.h +++ b/include/linux/in.h @@ -111,6 +111,7 @@ struct in_addr {  #define MCAST_LEAVE_SOURCE_GROUP	47  #define MCAST_MSFILTER			48  #define IP_MULTICAST_ALL		49 +#define IP_UNICAST_IF			50  #define MCAST_EXCLUDE	0  #define MCAST_INCLUDE	1 diff --git a/include/linux/in6.h b/include/linux/in6.h index 097a34b5556..5c83d9e3eb8 100644 --- a/include/linux/in6.h +++ b/include/linux/in6.h @@ -271,6 +271,7 @@ struct in6_flowlabel_req {  #define IPV6_ORIGDSTADDR        74  #define IPV6_RECVORIGDSTADDR    IPV6_ORIGDSTADDR  #define IPV6_TRANSPARENT        75 +#define IPV6_UNICAST_IF         76  /*   * Multicast Routing: diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 6318268dcaf..8260ef77976 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -233,6 +233,11 @@ static inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb)  	return (struct ipv6hdr *)skb_transport_header(skb);  } +static inline __u8 ipv6_tclass(const struct ipv6hdr *iph) +{ +	return (ntohl(*(__be32 *)iph) >> 20) & 0xff; +} +  /*      This structure contains results of exthdrs parsing     as offsets from skb->nh. @@ -324,6 +329,7 @@ struct ipv6_pinfo {  				__unused_2:6;  	__s16			mcast_hops:9;  #endif +	int			ucast_oif;  	int			mcast_oif;  	/* pktoption flags */ @@ -360,7 +366,7 @@ struct ipv6_pinfo {  				dontfrag:1;  	__u8			min_hopcount;  	__u8			tclass; -	__u8			padding; +	__u8			rcv_tclass;  	__u32			dst_cookie; diff --git a/include/linux/mdio.h b/include/linux/mdio.h index b1494aced21..ec90da7232c 100644 --- a/include/linux/mdio.h +++ b/include/linux/mdio.h @@ -273,6 +273,8 @@ static inline __u16 mdio_phy_id_c45(int prtad, int devad)  	return MDIO_PHY_ID_C45 | (prtad << 5) | devad;  } +#ifdef __KERNEL__ +  static inline bool mdio_phy_id_is_c45(int phy_id)  {  	return (phy_id & MDIO_PHY_ID_C45) && !(phy_id & ~MDIO_PHY_ID_C45_MASK); @@ -288,11 +290,6 @@ static inline __u16 mdio_phy_id_devad(int phy_id)  	return phy_id & MDIO_PHY_ID_DEVAD;  } -#define MDIO_SUPPORTS_C22		1 -#define MDIO_SUPPORTS_C45		2 - -#ifdef __KERNEL__  -  /**   * struct mdio_if_info - Ethernet controller MDIO interface   * @prtad: PRTAD of the PHY (%MDIO_PRTAD_NONE if not present/unknown) @@ -321,6 +318,8 @@ struct mdio_if_info {  #define MDIO_PRTAD_NONE			(-1)  #define MDIO_DEVAD_NONE			(-1) +#define MDIO_SUPPORTS_C22		1 +#define MDIO_SUPPORTS_C45		2  #define MDIO_EMULATE_C22		4  struct ethtool_cmd; diff --git a/include/linux/mlx4/qp.h b/include/linux/mlx4/qp.h index bee8fa23127..091f9e7dc8b 100644 --- a/include/linux/mlx4/qp.h +++ b/include/linux/mlx4/qp.h @@ -212,7 +212,10 @@ struct mlx4_wqe_ctrl_seg {  	 * [1]   SE (solicited event)  	 * [0]   FL (force loopback)  	 */ -	__be32			srcrb_flags; +	union { +		__be32			srcrb_flags; +		__be16			srcrb_flags16[2]; +	};  	/*  	 * imm is immediate data for send/RDMA write w/ immediate;  	 * also invalidation key for send with invalidate; input diff --git a/include/linux/net.h b/include/linux/net.h index b29923006b1..be60c7f5e14 100644 --- a/include/linux/net.h +++ b/include/linux/net.h @@ -206,6 +206,7 @@ struct proto_ops {  				      int offset, size_t size, int flags);  	ssize_t 	(*splice_read)(struct socket *sock,  loff_t *ppos,  				       struct pipe_inode_info *pipe, size_t len, unsigned int flags); +	void		(*set_peek_off)(struct sock *sk, int val);  };  #define DECLARE_SOCKADDR(type, dst, src)	\ diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h index 77f5202977c..5ac32123035 100644 --- a/include/linux/netdev_features.h +++ b/include/linux/netdev_features.h @@ -54,6 +54,8 @@ enum {  	NETIF_F_RXCSUM_BIT,		/* Receive checksumming offload */  	NETIF_F_NOCACHE_COPY_BIT,	/* Use no-cache copyfromuser */  	NETIF_F_LOOPBACK_BIT,		/* Enable loopback */ +	NETIF_F_RXFCS_BIT,		/* Append FCS to skb pkt data */ +	NETIF_F_RXALL_BIT,		/* Receive errored frames too */  	/*  	 * Add your fresh new feature above and remember to update @@ -98,6 +100,8 @@ enum {  #define NETIF_F_TSO		__NETIF_F(TSO)  #define NETIF_F_UFO		__NETIF_F(UFO)  #define NETIF_F_VLAN_CHALLENGED	__NETIF_F(VLAN_CHALLENGED) +#define NETIF_F_RXFCS		__NETIF_F(RXFCS) +#define NETIF_F_RXALL		__NETIF_F(RXALL)  /* Features valid for ethtool to change */  /* = all defined minus driver/device-class-related */ diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 0eac07c9525..f1b7d037c2c 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1082,7 +1082,8 @@ struct net_device {  	const struct header_ops *header_ops;  	unsigned int		flags;	/* interface flags (a la BSD)	*/ -	unsigned int		priv_flags; /* Like 'flags' but invisible to userspace. */ +	unsigned int		priv_flags; /* Like 'flags' but invisible to userspace. +					     * See if.h for definitions. */  	unsigned short		gflags;  	unsigned short		padded;	/* How much padding added by alloc_netdev() */ @@ -2650,6 +2651,11 @@ static inline int netif_is_bond_slave(struct net_device *dev)  	return dev->flags & IFF_SLAVE && dev->priv_flags & IFF_BONDING;  } +static inline bool netif_supports_nofcs(struct net_device *dev) +{ +	return dev->priv_flags & IFF_SUPP_NOFCS; +} +  extern struct pernet_operations __net_initdata loopback_net_ops;  /* Logging, debugging and troubleshooting/diagnostic helpers. */ diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h index debf1aefd75..d498a4426eb 100644 --- a/include/linux/netfilter/nfnetlink_conntrack.h +++ b/include/linux/netfilter/nfnetlink_conntrack.h @@ -43,6 +43,7 @@ enum ctattr_type {  	CTA_ZONE,  	CTA_SECCTX,  	CTA_TIMESTAMP, +	CTA_MARK_MASK,  	__CTA_MAX  };  #define CTA_MAX (__CTA_MAX - 1) diff --git a/include/linux/netlink.h b/include/linux/netlink.h index 52e48959cfa..a2092f582a7 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h @@ -225,6 +225,7 @@ struct netlink_callback {  	int			(*dump)(struct sk_buff * skb,  					struct netlink_callback *cb);  	int			(*done)(struct netlink_callback *cb); +	void			*data;  	u16			family;  	u16			min_dump_alloc;  	unsigned int		prev_seq, seq; @@ -237,22 +238,8 @@ struct netlink_notify {  	int protocol;  }; -static __inline__ struct nlmsghdr * -__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags) -{ -	struct nlmsghdr *nlh; -	int size = NLMSG_LENGTH(len); - -	nlh = (struct nlmsghdr*)skb_put(skb, NLMSG_ALIGN(size)); -	nlh->nlmsg_type = type; -	nlh->nlmsg_len = size; -	nlh->nlmsg_flags = flags; -	nlh->nlmsg_pid = pid; -	nlh->nlmsg_seq = seq; -	if (!__builtin_constant_p(size) || NLMSG_ALIGN(size) - size != 0) -		memset(NLMSG_DATA(nlh) + len, 0, NLMSG_ALIGN(size) - size); -	return nlh; -} +struct nlmsghdr * +__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags);  #define NLMSG_NEW(skb, pid, seq, type, len, flags) \  ({	if (unlikely(skb_tailroom(skb) < (int)NLMSG_SPACE(len))) \ @@ -262,11 +249,16 @@ __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)  #define NLMSG_PUT(skb, pid, seq, type, len) \  	NLMSG_NEW(skb, pid, seq, type, len, 0) +struct netlink_dump_control { +	int (*dump)(struct sk_buff *skb, struct netlink_callback *); +	int (*done)(struct netlink_callback*); +	void *data; +	u16 min_dump_alloc; +}; +  extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,  			      const struct nlmsghdr *nlh, -			      int (*dump)(struct sk_buff *skb, struct netlink_callback*), -			      int (*done)(struct netlink_callback*), -			      u16 min_dump_alloc); +			      struct netlink_dump_control *control);  #define NL_NONROOT_RECV 0x1 diff --git a/include/linux/nfc.h b/include/linux/nfc.h index 01d4e5d6032..b4999abcb2a 100644 --- a/include/linux/nfc.h +++ b/include/linux/nfc.h @@ -89,6 +89,8 @@ enum nfc_commands {   * @NFC_ATTR_TARGET_SEL_RES: NFC-A targets extra information (useful if the   *	target is not NFC-Forum compliant)   * @NFC_ATTR_TARGET_NFCID1: NFC-A targets identifier, max 10 bytes + * @NFC_ATTR_TARGET_SENSB_RES: NFC-B targets extra information, max 12 bytes + * @NFC_ATTR_TARGET_SENSF_RES: NFC-F targets extra information, max 18 bytes   * @NFC_ATTR_COMM_MODE: Passive or active mode   * @NFC_ATTR_RF_MODE: Initiator or target   */ @@ -101,6 +103,8 @@ enum nfc_attrs {  	NFC_ATTR_TARGET_SENS_RES,  	NFC_ATTR_TARGET_SEL_RES,  	NFC_ATTR_TARGET_NFCID1, +	NFC_ATTR_TARGET_SENSB_RES, +	NFC_ATTR_TARGET_SENSF_RES,  	NFC_ATTR_COMM_MODE,  	NFC_ATTR_RF_MODE,  /* private: internal use only */ @@ -109,6 +113,9 @@ enum nfc_attrs {  #define NFC_ATTR_MAX (__NFC_ATTR_AFTER_LAST - 1)  #define NFC_DEVICE_NAME_MAXSIZE 8 +#define NFC_NFCID1_MAXSIZE 10 +#define NFC_SENSB_RES_MAXSIZE 12 +#define NFC_SENSF_RES_MAXSIZE 18  /* NFC protocols */  #define NFC_PROTO_JEWEL		1 diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index 0f5ff373982..ad56e21a9f1 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h @@ -1475,6 +1475,7 @@ enum nl80211_attrs {  #define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS  #define NL80211_MAX_SUPP_RATES			32 +#define NL80211_MAX_SUPP_HT_RATES		77  #define NL80211_MAX_SUPP_REG_RULES		32  #define NL80211_TKIP_DATA_OFFSET_ENCR_KEY	0  #define NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY	16 @@ -2104,6 +2105,9 @@ enum nl80211_mntr_flags {   * TUs) during which a mesh STA can send only one Action frame containing a   * PERR element.   * + * @NL80211_MESHCONF_FORWARDING: set Mesh STA as forwarding or non-forwarding + * or forwarding entity (default is TRUE - forwarding entity) + *   * @NL80211_MESHCONF_ATTR_MAX: highest possible mesh configuration attribute   *   * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use @@ -2128,6 +2132,7 @@ enum nl80211_meshconf_params {  	NL80211_MESHCONF_HWMP_RANN_INTERVAL,  	NL80211_MESHCONF_GATE_ANNOUNCEMENTS,  	NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, +	NL80211_MESHCONF_FORWARDING,  	/* keep last */  	__NL80211_MESHCONF_ATTR_AFTER_LAST, @@ -2401,12 +2406,15 @@ enum nl80211_key_attributes {   *	in an array of rates as defined in IEEE 802.11 7.3.2.2 (u8 values with   *	1 = 500 kbps) but without the IE length restriction (at most   *	%NL80211_MAX_SUPP_RATES in a single array). + * @NL80211_TXRATE_MCS: HT (MCS) rates allowed for TX rate selection + *	in an array of MCS numbers.   * @__NL80211_TXRATE_AFTER_LAST: internal   * @NL80211_TXRATE_MAX: highest TX rate attribute   */  enum nl80211_tx_rate_attributes {  	__NL80211_TXRATE_INVALID,  	NL80211_TXRATE_LEGACY, +	NL80211_TXRATE_MCS,  	/* keep last */  	__NL80211_TXRATE_AFTER_LAST, diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h index 0d5b79365d0..410b33d014d 100644 --- a/include/linux/pkt_sched.h +++ b/include/linux/pkt_sched.h @@ -127,6 +127,27 @@ struct tc_multiq_qopt {  	__u16	max_bands;		/* Maximum number of queues */  }; +/* PLUG section */ + +#define TCQ_PLUG_BUFFER                0 +#define TCQ_PLUG_RELEASE_ONE           1 +#define TCQ_PLUG_RELEASE_INDEFINITE    2 +#define TCQ_PLUG_LIMIT                 3 + +struct tc_plug_qopt { +	/* TCQ_PLUG_BUFFER: Inset a plug into the queue and +	 *  buffer any incoming packets +	 * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head +	 *   to beginning of the next plug. +	 * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue. +	 *   Stop buffering packets until the next TCQ_PLUG_BUFFER +	 *   command is received (just act as a pass-thru queue). +	 * TCQ_PLUG_LIMIT: Increase/decrease queue size +	 */ +	int             action; +	__u32           limit; +}; +  /* TBF section */  struct tc_tbf_qopt { diff --git a/include/linux/sh_eth.h b/include/linux/sh_eth.h index 2076acf8294..b17d765ded8 100644 --- a/include/linux/sh_eth.h +++ b/include/linux/sh_eth.h @@ -20,6 +20,7 @@ struct sh_eth_plat_data {  	unsigned char mac_addr[6];  	unsigned no_ether_link:1;  	unsigned ether_link_active_low:1; +	unsigned needs_init:1;  };  #endif diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index ae86adee374..79ef8209bbb 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -361,6 +361,7 @@ typedef unsigned char *sk_buff_data_t;   *		ports.   *	@wifi_acked_valid: wifi_acked was set   *	@wifi_acked: whether frame was acked on wifi or not + *	@no_fcs:  Request NIC to treat last 4 bytes as Ethernet FCS   *	@dma_cookie: a cookie to one of several possible DMA operations   *		done by skb DMA functions   *	@secmark: security marking @@ -438,6 +439,11 @@ struct sk_buff {  #endif  	int			skb_iif; + +	__u32			rxhash; + +	__u16			vlan_tci; +  #ifdef CONFIG_NET_SCHED  	__u16			tc_index;	/* traffic control index */  #ifdef CONFIG_NET_CLS_ACT @@ -445,8 +451,6 @@ struct sk_buff {  #endif  #endif -	__u32			rxhash; -  	__u16			queue_mapping;  	kmemcheck_bitfield_begin(flags2);  #ifdef CONFIG_IPV6_NDISC_NODETYPE @@ -456,7 +460,8 @@ struct sk_buff {  	__u8			l4_rxhash:1;  	__u8			wifi_acked_valid:1;  	__u8			wifi_acked:1; -	/* 10/12 bit hole (depending on ndisc_nodetype presence) */ +	__u8			no_fcs:1; +	/* 9/11 bit hole (depending on ndisc_nodetype presence) */  	kmemcheck_bitfield_end(flags2);  #ifdef CONFIG_NET_DMA @@ -470,8 +475,6 @@ struct sk_buff {  		__u32		dropcount;  	}; -	__u16			vlan_tci; -  	sk_buff_data_t		transport_header;  	sk_buff_data_t		network_header;  	sk_buff_data_t		mac_header; @@ -876,6 +879,24 @@ static inline struct sk_buff *skb_peek(const struct sk_buff_head *list_)  }  /** + *	skb_peek_next - peek skb following the given one from a queue + *	@skb: skb to start from + *	@list_: list to peek at + * + *	Returns %NULL when the end of the list is met or a pointer to the + *	next element. The reference count is not incremented and the + *	reference is therefore volatile. Use with caution. + */ +static inline struct sk_buff *skb_peek_next(struct sk_buff *skb, +		const struct sk_buff_head *list_) +{ +	struct sk_buff *next = skb->next; +	if (next == (struct sk_buff *)list_) +		next = NULL; +	return next; +} + +/**   *	skb_peek_tail - peek at the tail of an &sk_buff_head   *	@list_: list to peek at   * @@ -2055,7 +2076,7 @@ static inline void skb_frag_add_head(struct sk_buff *skb, struct sk_buff *frag)  	for (iter = skb_shinfo(skb)->frag_list; iter; iter = iter->next)  extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags, -					   int *peeked, int *err); +					   int *peeked, int *off, int *err);  extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,  					 int noblock, int *err);  extern unsigned int    datagram_poll(struct file *file, struct socket *sock, diff --git a/include/linux/snmp.h b/include/linux/snmp.h index c1241c42817..8ee8af4e6da 100644 --- a/include/linux/snmp.h +++ b/include/linux/snmp.h @@ -232,6 +232,7 @@ enum  	LINUX_MIB_TCPTIMEWAITOVERFLOW,		/* TCPTimeWaitOverflow */  	LINUX_MIB_TCPREQQFULLDOCOOKIES,		/* TCPReqQFullDoCookies */  	LINUX_MIB_TCPREQQFULLDROP,		/* TCPReqQFullDrop */ +	LINUX_MIB_TCPRETRANSFAIL,		/* TCPRetransFail */  	__LINUX_MIB_MAX  }; diff --git a/include/linux/ssb/ssb.h b/include/linux/ssb/ssb.h index dcf35b0f303..bbc2612cb64 100644 --- a/include/linux/ssb/ssb.h +++ b/include/linux/ssb/ssb.h @@ -16,6 +16,12 @@ struct pcmcia_device;  struct ssb_bus;  struct ssb_driver; +struct ssb_sprom_core_pwr_info { +	u8 itssi_2g, itssi_5g; +	u8 maxpwr_2g, maxpwr_5gl, maxpwr_5g, maxpwr_5gh; +	u16 pa_2g[3], pa_5gl[3], pa_5g[3], pa_5gh[3]; +}; +  struct ssb_sprom {  	u8 revision;  	u8 il0mac[6];		/* MAC address for 802.11b/g */ @@ -82,6 +88,8 @@ struct ssb_sprom {  	u16 boardflags2_hi;	/* Board flags (bits 48-63) */  	/* TODO store board flags in a single u64 */ +	struct ssb_sprom_core_pwr_info core_pwr_info[4]; +  	/* Antenna gain values for up to 4 antennas  	 * on each band. Values in dBm/4 (Q5.2). Negative gain means the  	 * loss in the connectors is bigger than the gain. */ diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h index c814ae6eeb2..40b1ef8595e 100644 --- a/include/linux/ssb/ssb_regs.h +++ b/include/linux/ssb/ssb_regs.h @@ -449,6 +449,39 @@  #define SSB_SPROM8_TS_SLP_OPT_CORRX	0x00B6  #define SSB_SPROM8_FOC_HWIQ_IQSWP	0x00B8  #define SSB_SPROM8_PHYCAL_TEMPDELTA	0x00BA + +/* There are 4 blocks with power info sharing the same layout */ +#define SSB_SROM8_PWR_INFO_CORE0	0x00C0 +#define SSB_SROM8_PWR_INFO_CORE1	0x00E0 +#define SSB_SROM8_PWR_INFO_CORE2	0x0100 +#define SSB_SROM8_PWR_INFO_CORE3	0x0120 + +#define SSB_SROM8_2G_MAXP_ITSSI		0x00 +#define  SSB_SPROM8_2G_MAXP		0x00FF +#define  SSB_SPROM8_2G_ITSSI		0xFF00 +#define  SSB_SPROM8_2G_ITSSI_SHIFT	8 +#define SSB_SROM8_2G_PA_0		0x02	/* 2GHz power amp settings */ +#define SSB_SROM8_2G_PA_1		0x04 +#define SSB_SROM8_2G_PA_2		0x06 +#define SSB_SROM8_5G_MAXP_ITSSI		0x08	/* 5GHz ITSSI and 5.3GHz Max Power */ +#define  SSB_SPROM8_5G_MAXP		0x00FF +#define  SSB_SPROM8_5G_ITSSI		0xFF00 +#define  SSB_SPROM8_5G_ITSSI_SHIFT	8 +#define SSB_SPROM8_5GHL_MAXP		0x0A	/* 5.2GHz and 5.8GHz Max Power */ +#define  SSB_SPROM8_5GH_MAXP		0x00FF +#define  SSB_SPROM8_5GL_MAXP		0xFF00 +#define  SSB_SPROM8_5GL_MAXP_SHIFT	8 +#define SSB_SROM8_5G_PA_0		0x0C	/* 5.3GHz power amp settings */ +#define SSB_SROM8_5G_PA_1		0x0E +#define SSB_SROM8_5G_PA_2		0x10 +#define SSB_SROM8_5GL_PA_0		0x12	/* 5.2GHz power amp settings */ +#define SSB_SROM8_5GL_PA_1		0x14 +#define SSB_SROM8_5GL_PA_2		0x16 +#define SSB_SROM8_5GH_PA_0		0x18	/* 5.8GHz power amp settings */ +#define SSB_SROM8_5GH_PA_1		0x1A +#define SSB_SROM8_5GH_PA_2		0x1C + +/* TODO: Make it deprecated */  #define SSB_SPROM8_MAXP_BG		0x00C0  /* Max Power 2GHz in path 1 */  #define  SSB_SPROM8_MAXP_BG_MASK	0x00FF  /* Mask for Max Power 2GHz */  #define  SSB_SPROM8_ITSSI_BG		0xFF00	/* Mask for path 1 itssi_bg */ @@ -473,6 +506,7 @@  #define SSB_SPROM8_PA1HIB0		0x00D8	/* 5.8GHz power amp settings */  #define SSB_SPROM8_PA1HIB1		0x00DA  #define SSB_SPROM8_PA1HIB2		0x00DC +  #define SSB_SPROM8_CCK2GPO		0x0140	/* CCK power offset */  #define SSB_SPROM8_OFDM2GPO		0x0142	/* 2.4GHz OFDM power offset */  #define SSB_SPROM8_OFDM5GPO		0x0146	/* 5.3GHz OFDM power offset */ diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 3c7ffdb40dc..b6c62d29438 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -464,7 +464,7 @@ struct tcp_sock {  	const struct tcp_sock_af_ops	*af_specific;  /* TCP MD5 Signature Option information */ -	struct tcp_md5sig_info	*md5sig_info; +	struct tcp_md5sig_info	__rcu *md5sig_info;  #endif  	/* When the cookie options are generated and exchanged, then this @@ -487,8 +487,7 @@ struct tcp_timewait_sock {  	u32			  tw_ts_recent;  	long			  tw_ts_recent_stamp;  #ifdef CONFIG_TCP_MD5SIG -	u16			  tw_md5_keylen; -	u8			  tw_md5_key[TCP_MD5SIG_MAXKEYLEN]; +	struct tcp_md5sig_key	*tw_md5_key;  #endif  	/* Few sockets in timewait have cookies; in that case, then this  	 * object holds a reference to them (tw_cookie_values->kref). diff --git a/include/net/addrconf.h b/include/net/addrconf.h index f68dce2d8d8..757a17638b1 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h @@ -160,7 +160,6 @@ extern void addrconf_prefix_rcv(struct net_device *dev,  extern int ipv6_sock_ac_join(struct sock *sk,int ifindex, const struct in6_addr *addr);  extern int ipv6_sock_ac_drop(struct sock *sk,int ifindex, const struct in6_addr *addr);  extern void ipv6_sock_ac_close(struct sock *sk); -extern int inet6_ac_check(struct sock *sk, const struct in6_addr *addr, int ifindex);  extern int ipv6_dev_ac_inc(struct net_device *dev, const struct in6_addr *addr);  extern int __ipv6_dev_ac_dec(struct inet6_dev *idev, const struct in6_addr *addr); diff --git a/include/net/arp.h b/include/net/arp.h index 0013dc87940..4a1f3fb562e 100644 --- a/include/net/arp.h +++ b/include/net/arp.h @@ -15,14 +15,14 @@ static inline u32 arp_hashfn(u32 key, const struct net_device *dev, u32 hash_rnd  	return val * hash_rnd;  } -static inline struct neighbour *__ipv4_neigh_lookup(struct neigh_table *tbl, struct net_device *dev, u32 key) +static inline struct neighbour *__ipv4_neigh_lookup(struct net_device *dev, u32 key)  {  	struct neigh_hash_table *nht;  	struct neighbour *n;  	u32 hash_val;  	rcu_read_lock_bh(); -	nht = rcu_dereference_bh(tbl->nht); +	nht = rcu_dereference_bh(arp_tbl.nht);  	hash_val = arp_hashfn(key, dev, nht->hash_rnd[0]) >> (32 - nht->hash_shift);  	for (n = rcu_dereference_bh(nht->hash_buckets[hash_val]);  	     n != NULL; diff --git a/include/net/caif/caif_hsi.h b/include/net/caif/caif_hsi.h index 8d552519ff6..6db8ecf52aa 100644 --- a/include/net/caif/caif_hsi.h +++ b/include/net/caif/caif_hsi.h @@ -138,6 +138,7 @@ struct cfhsi {  	u8 *rx_ptr;  	u8 *tx_buf;  	u8 *rx_buf; +	u8 *rx_flip_buf;  	spinlock_t lock;  	int flow_off_sent;  	u32 q_low_mark; diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index a067d30ce73..e0c9ff3a197 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -120,6 +120,7 @@ enum ieee80211_channel_flags {   * @band: band this channel belongs to.   * @max_antenna_gain: maximum antenna gain in dBi   * @max_power: maximum transmission power (in dBm) + * @max_reg_power: maximum regulatory transmission power (in dBm)   * @beacon_found: helper to regulatory code to indicate when a beacon   *	has been found on this channel. Use regulatory_hint_found_beacon()   *	to enable this, this is useful only on 5 GHz band. @@ -133,6 +134,7 @@ struct ieee80211_channel {  	u32 flags;  	int max_antenna_gain;  	int max_power; +	int max_reg_power;  	bool beacon_found;  	u32 orig_flags;  	int orig_mag, orig_mpwr; @@ -796,6 +798,7 @@ struct mesh_config {  	 * mesh gate, but not necessarily using the gate announcement protocol.  	 * Still keeping the same nomenclature to be in sync with the spec. */  	bool  dot11MeshGateAnnouncementProtocol; +	bool dot11MeshForwarding;  };  /** @@ -1036,10 +1039,6 @@ const u8 *ieee80211_bss_get_ie(struct cfg80211_bss *bss, u8 ie);   * @key_len: length of WEP key for shared key authentication   * @key_idx: index of WEP key for shared key authentication   * @key: WEP key for shared key authentication - * @local_state_change: This is a request for a local state only, i.e., no - *	Authentication frame is to be transmitted and authentication state is - *	to be changed without having to wait for a response from the peer STA - *	(AP).   */  struct cfg80211_auth_request {  	struct cfg80211_bss *bss; @@ -1048,7 +1047,6 @@ struct cfg80211_auth_request {  	enum nl80211_auth_type auth_type;  	const u8 *key;  	u8 key_len, key_idx; -	bool local_state_change;  };  /** @@ -1065,7 +1063,11 @@ enum cfg80211_assoc_req_flags {   *   * This structure provides information needed to complete IEEE 802.11   * (re)association. - * @bss: The BSS to associate with. + * @bss: The BSS to associate with. If the call is successful the driver + *	is given a reference that it must release, normally via a call to + *	cfg80211_send_rx_assoc(), or, if association timed out, with a + *	call to cfg80211_put_bss() (in addition to calling + *	cfg80211_send_assoc_timeout())   * @ie: Extra IEs to add to (Re)Association Request frame or %NULL   * @ie_len: Length of ie buffer in octets   * @use_mfp: Use management frame protection (IEEE 802.11w) in this association @@ -1093,19 +1095,16 @@ struct cfg80211_assoc_request {   * This structure provides information needed to complete IEEE 802.11   * deauthentication.   * - * @bss: the BSS to deauthenticate from + * @bssid: the BSSID of the BSS to deauthenticate from   * @ie: Extra IEs to add to Deauthentication frame or %NULL   * @ie_len: Length of ie buffer in octets   * @reason_code: The reason code for the deauthentication - * @local_state_change: This is a request for a local state only, i.e., no - *	Deauthentication frame is to be transmitted.   */  struct cfg80211_deauth_request { -	struct cfg80211_bss *bss; +	const u8 *bssid;  	const u8 *ie;  	size_t ie_len;  	u16 reason_code; -	bool local_state_change;  };  /** @@ -1148,6 +1147,10 @@ struct cfg80211_disassoc_request {   * @beacon_interval: beacon interval to use   * @privacy: this is a protected network, keys will be configured   *	after joining + * @control_port: whether user space controls IEEE 802.1X port, i.e., + *	sets/clears %NL80211_STA_FLAG_AUTHORIZED. If true, the driver is + *	required to assume that the port is unauthorized until authorized by + *	user space. Otherwise, port is marked authorized by default.   * @basic_rates: bitmap of basic rates to use when creating the IBSS   * @mcast_rate: per-band multicast rate index + 1 (0: disabled)   */ @@ -1162,6 +1165,7 @@ struct cfg80211_ibss_params {  	u32 basic_rates;  	bool channel_fixed;  	bool privacy; +	bool control_port;  	int mcast_rate[IEEE80211_NUM_BANDS];  }; @@ -1229,8 +1233,7 @@ enum wiphy_params_flags {  struct cfg80211_bitrate_mask {  	struct {  		u32 legacy; -		/* TODO: add support for masking MCS rates; e.g.: */ -		/* u8 mcs[IEEE80211_HT_MCS_MASK_LEN]; */ +		u8 mcs[IEEE80211_HT_MCS_MASK_LEN];  	} control[IEEE80211_NUM_BANDS];  };  /** @@ -2204,8 +2207,6 @@ struct cfg80211_conn;  struct cfg80211_internal_bss;  struct cfg80211_cached_keys; -#define MAX_AUTH_BSSES		4 -  /**   * struct wireless_dev - wireless per-netdev state   * @@ -2269,8 +2270,6 @@ struct wireless_dev {  	struct list_head event_list;  	spinlock_t event_lock; -	struct cfg80211_internal_bss *authtry_bsses[MAX_AUTH_BSSES]; -	struct cfg80211_internal_bss *auth_bsses[MAX_AUTH_BSSES];  	struct cfg80211_internal_bss *current_bss; /* associated / joined */  	struct ieee80211_channel *channel; @@ -2725,6 +2724,20 @@ struct cfg80211_bss *cfg80211_get_mesh(struct wiphy *wiphy,  				       struct ieee80211_channel *channel,  				       const u8 *meshid, size_t meshidlen,  				       const u8 *meshcfg); +/** + * cfg80211_ref_bss - reference BSS struct + * @bss: the BSS struct to reference + * + * Increments the refcount of the given BSS struct. + */ +void cfg80211_ref_bss(struct cfg80211_bss *bss); + +/** + * cfg80211_put_bss - unref BSS struct + * @bss: the BSS struct + * + * Decrements the refcount of the given BSS struct. + */  void cfg80211_put_bss(struct cfg80211_bss *bss);  /** @@ -2762,20 +2775,10 @@ void cfg80211_send_rx_auth(struct net_device *dev, const u8 *buf, size_t len);  void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr);  /** - * __cfg80211_auth_canceled - notify cfg80211 that authentication was canceled - * @dev: network device - * @addr: The MAC address of the device with which the authentication timed out - * - * When a pending authentication had no action yet, the driver may decide - * to not send a deauth frame, but in that case must calls this function - * to tell cfg80211 about this decision. It is only valid to call this - * function within the deauth() callback. - */ -void __cfg80211_auth_canceled(struct net_device *dev, const u8 *addr); - -/**   * cfg80211_send_rx_assoc - notification of processed association   * @dev: network device + * @bss: the BSS struct association was requested for, the struct reference + *	is owned by cfg80211 after this call   * @buf: (re)association response frame (header + body)   * @len: length of the frame data   * @@ -2784,7 +2787,8 @@ void __cfg80211_auth_canceled(struct net_device *dev, const u8 *addr);   * function or cfg80211_send_assoc_timeout() to indicate the result of   * cfg80211_ops::assoc() call. This function may sleep.   */ -void cfg80211_send_rx_assoc(struct net_device *dev, const u8 *buf, size_t len); +void cfg80211_send_rx_assoc(struct net_device *dev, struct cfg80211_bss *bss, +			    const u8 *buf, size_t len);  /**   * cfg80211_send_assoc_timeout - notification of timed out association diff --git a/include/net/dn.h b/include/net/dn.h index 298521e0d8a..814af0b9387 100644 --- a/include/net/dn.h +++ b/include/net/dn.h @@ -3,6 +3,7 @@  #include <linux/dn.h>  #include <net/sock.h> +#include <net/flow.h>  #include <asm/byteorder.h>  #include <asm/unaligned.h> diff --git a/include/net/genetlink.h b/include/net/genetlink.h index 7db32995ccd..ccb68880abf 100644 --- a/include/net/genetlink.h +++ b/include/net/genetlink.h @@ -131,35 +131,8 @@ extern void genl_unregister_mc_group(struct genl_family *family,  extern void genl_notify(struct sk_buff *skb, struct net *net, u32 pid,  			u32 group, struct nlmsghdr *nlh, gfp_t flags); -/** - * genlmsg_put - Add generic netlink header to netlink message - * @skb: socket buffer holding the message - * @pid: netlink pid the message is addressed to - * @seq: sequence number (usually the one of the sender) - * @family: generic netlink family - * @flags netlink message flags - * @cmd: generic netlink command - * - * Returns pointer to user specific header - */ -static inline void *genlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, -				struct genl_family *family, int flags, u8 cmd) -{ -	struct nlmsghdr *nlh; -	struct genlmsghdr *hdr; - -	nlh = nlmsg_put(skb, pid, seq, family->id, GENL_HDRLEN + -			family->hdrsize, flags); -	if (nlh == NULL) -		return NULL; - -	hdr = nlmsg_data(nlh); -	hdr->cmd = cmd; -	hdr->version = family->version; -	hdr->reserved = 0; - -	return (char *) hdr + GENL_HDRLEN; -} +void *genlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, +				struct genl_family *family, int flags, u8 cmd);  /**   * genlmsg_nlhdr - Obtain netlink header from user specified header diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index e3e405106af..ae17e1352d7 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h @@ -132,6 +132,7 @@ struct rtable;   * @tos - TOS   * @mc_ttl - Multicasting TTL   * @is_icsk - is this an inet_connection_sock? + * @uc_index - Unicast outgoing device index   * @mc_index - Multicast device index   * @mc_list - Group array   * @cork - info to build ip hdr on each ip frag while socket is corked @@ -167,6 +168,8 @@ struct inet_sock {  				transparent:1,  				mc_all:1,  				nodefrag:1; +	__u8			rcv_tos; +	int			uc_index;  	int			mc_index;  	__be32			mc_addr;  	struct ip_mc_socklist __rcu	*mc_list; diff --git a/include/net/iucv/af_iucv.h b/include/net/iucv/af_iucv.h index 0954ec95915..2e1d5ecc2d1 100644 --- a/include/net/iucv/af_iucv.h +++ b/include/net/iucv/af_iucv.h @@ -113,6 +113,7 @@ struct iucv_sock {  	spinlock_t		accept_q_lock;  	struct sock		*parent;  	struct iucv_path	*path; +	struct net_device	*hs_dev;  	struct sk_buff_head	send_skb_q;  	struct sk_buff_head	backlog_skb_q;  	struct sock_msg_q	message_q; @@ -131,6 +132,7 @@ struct iucv_sock {  /* iucv socket options (SOL_IUCV) */  #define SO_IPRMDATA_MSG	0x0080		/* send/recv IPRM_DATA msgs */  #define SO_MSGLIMIT	0x1000		/* get/set IUCV MSGLIMIT */ +#define SO_MSGSIZE	0x0800		/* get maximum msgsize */  /* iucv related control messages (scm) */  #define SCM_IUCV_TRGCLS	0x0001		/* target class control message */ diff --git a/include/net/mac80211.h b/include/net/mac80211.h index d49928ba5d0..cbff4f94a20 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -852,6 +852,21 @@ struct ieee80211_channel_switch {  };  /** + * enum ieee80211_vif_flags - virtual interface flags + * + * @IEEE80211_VIF_BEACON_FILTER: the device performs beacon filtering + *	on this virtual interface to avoid unnecessary CPU wakeups + * @IEEE80211_VIF_SUPPORTS_CQM_RSSI: the device can do connection quality + *	monitoring on this virtual interface -- i.e. it can monitor + *	connection quality related parameters, such as the RSSI level and + *	provide notifications if configured trigger levels are reached. + */ +enum ieee80211_vif_flags { +	IEEE80211_VIF_BEACON_FILTER		= BIT(0), +	IEEE80211_VIF_SUPPORTS_CQM_RSSI		= BIT(1), +}; + +/**   * struct ieee80211_vif - per-interface data   *   * Data in this structure is continually present for driver @@ -863,6 +878,10 @@ struct ieee80211_channel_switch {   * @addr: address of this interface   * @p2p: indicates whether this AP or STA interface is a p2p   *	interface, i.e. a GO or p2p-sta respectively + * @driver_flags: flags/capabilities the driver has for this interface, + *	these need to be set (or cleared) when the interface is added + *	or, if supported by the driver, the interface type is changed + *	at runtime, mac80211 will never touch this field   * @drv_priv: data area for driver use, will always be aligned to   *	sizeof(void *).   */ @@ -871,6 +890,7 @@ struct ieee80211_vif {  	struct ieee80211_bss_conf bss_conf;  	u8 addr[ETH_ALEN];  	bool p2p; +	u32 driver_flags;  	/* must be last */  	u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *))));  }; @@ -962,6 +982,25 @@ enum set_key_cmd {  };  /** + * enum ieee80211_sta_state - station state + * + * @IEEE80211_STA_NOTEXIST: station doesn't exist at all, + *	this is a special state for add/remove transitions + * @IEEE80211_STA_NONE: station exists without special state + * @IEEE80211_STA_AUTH: station is authenticated + * @IEEE80211_STA_ASSOC: station is associated + * @IEEE80211_STA_AUTHORIZED: station is authorized (802.1X) + */ +enum ieee80211_sta_state { +	/* NOTE: These need to be ordered correctly! */ +	IEEE80211_STA_NOTEXIST, +	IEEE80211_STA_NONE, +	IEEE80211_STA_AUTH, +	IEEE80211_STA_ASSOC, +	IEEE80211_STA_AUTHORIZED, +}; + +/**   * struct ieee80211_sta - station table entry   *   * A station table entry represents a station we are possibly @@ -1079,10 +1118,6 @@ enum sta_notify_cmd {   * @IEEE80211_HW_MFP_CAPABLE:   *	Hardware supports management frame protection (MFP, IEEE 802.11w).   * - * @IEEE80211_HW_BEACON_FILTER: - *	Hardware supports dropping of irrelevant beacon frames to - *	avoid waking up cpu. - *   * @IEEE80211_HW_SUPPORTS_STATIC_SMPS:   *	Hardware supports static spatial multiplexing powersave,   *	ie. can turn off all but one chain even on HT connections @@ -1108,11 +1143,6 @@ enum sta_notify_cmd {   *      When this flag is set, signaling beacon-loss will cause an immediate   *      change to disassociated state.   * - * @IEEE80211_HW_SUPPORTS_CQM_RSSI: - *	Hardware can do connection quality monitoring - i.e. it can monitor - *	connection quality related parameters, such as the RSSI level and - *	provide notifications if configured trigger levels are reached. - *   * @IEEE80211_HW_NEED_DTIM_PERIOD:   *	This device needs to know the DTIM period for the BSS before   *	associating. @@ -1134,6 +1164,10 @@ enum sta_notify_cmd {   * @IEEE80211_HW_TX_AMPDU_SETUP_IN_HW: The device handles TX A-MPDU session   *	setup strictly in HW. mac80211 should not attempt to do this in   *	software. + * + * @IEEE80211_HW_SCAN_WHILE_IDLE: The device can do hw scan while + *	being idle (i.e. mac80211 doesn't have to go idle-off during the + *	the scan).   */  enum ieee80211_hw_flags {  	IEEE80211_HW_HAS_RATE_CONTROL			= 1<<0, @@ -1150,16 +1184,17 @@ enum ieee80211_hw_flags {  	IEEE80211_HW_PS_NULLFUNC_STACK			= 1<<11,  	IEEE80211_HW_SUPPORTS_DYNAMIC_PS		= 1<<12,  	IEEE80211_HW_MFP_CAPABLE			= 1<<13, -	IEEE80211_HW_BEACON_FILTER			= 1<<14, +	/* reuse bit 14 */  	IEEE80211_HW_SUPPORTS_STATIC_SMPS		= 1<<15,  	IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS		= 1<<16,  	IEEE80211_HW_SUPPORTS_UAPSD			= 1<<17,  	IEEE80211_HW_REPORTS_TX_ACK_STATUS		= 1<<18,  	IEEE80211_HW_CONNECTION_MONITOR			= 1<<19, -	IEEE80211_HW_SUPPORTS_CQM_RSSI			= 1<<20, +	/* reuse bit 20 */  	IEEE80211_HW_SUPPORTS_PER_STA_GTK		= 1<<21,  	IEEE80211_HW_AP_LINK_PS				= 1<<22,  	IEEE80211_HW_TX_AMPDU_SETUP_IN_HW		= 1<<23, +	IEEE80211_HW_SCAN_WHILE_IDLE			= 1<<24,  };  /** @@ -1446,8 +1481,8 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);   * way the host will only receive beacons where some relevant information   * (for example ERP protection or WMM settings) have changed.   * - * Beacon filter support is advertised with the %IEEE80211_HW_BEACON_FILTER - * hardware capability. The driver needs to enable beacon filter support + * Beacon filter support is advertised with the %IEEE80211_VIF_BEACON_FILTER + * interface capability. The driver needs to enable beacon filter support   * whenever power save is enabled, that is %IEEE80211_CONF_PS is set. When   * power save is enabled, the stack will not check for beacon loss and the   * driver needs to notify about loss of beacons with ieee80211_beacon_loss(). @@ -1963,6 +1998,13 @@ enum ieee80211_frame_release_type {   *	in AP mode, this callback will not be called when the flag   *	%IEEE80211_HW_AP_LINK_PS is set. Must be atomic.   * + * @sta_state: Notifies low level driver about state transition of a + *	station (which can be the AP, a client, IBSS/WDS/mesh peer etc.) + *	This callback is mutually exclusive with @sta_add/@sta_remove. + *	It must not fail for down transitions but may fail for transitions + *	up the list of states. + *	The callback can sleep. + *   * @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max),   *	bursting) for a hardware TX queue.   *	Returns a negative error code on failure. @@ -2182,6 +2224,10 @@ struct ieee80211_ops {  			  struct ieee80211_sta *sta);  	void (*sta_notify)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,  			enum sta_notify_cmd, struct ieee80211_sta *sta); +	int (*sta_state)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, +			 struct ieee80211_sta *sta, +			 enum ieee80211_sta_state old_state, +			 enum ieee80211_sta_state new_state);  	int (*conf_tx)(struct ieee80211_hw *hw,  		       struct ieee80211_vif *vif, u16 queue,  		       const struct ieee80211_tx_queue_params *params); @@ -3316,7 +3362,7 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,   *   * @vif: &struct ieee80211_vif pointer from the add_interface callback.   * - * When beacon filtering is enabled with %IEEE80211_HW_BEACON_FILTER and + * When beacon filtering is enabled with %IEEE80211_VIF_BEACON_FILTER and   * %IEEE80211_CONF_PS is set, the driver needs to inform whenever the   * hardware is not receiving beacons with this function.   */ @@ -3327,7 +3373,7 @@ void ieee80211_beacon_loss(struct ieee80211_vif *vif);   *   * @vif: &struct ieee80211_vif pointer from the add_interface callback.   * - * When beacon filtering is enabled with %IEEE80211_HW_BEACON_FILTER, and + * When beacon filtering is enabled with %IEEE80211_VIF_BEACON_FILTER, and   * %IEEE80211_CONF_PS and %IEEE80211_HW_CONNECTION_MONITOR are set, the driver   * needs to inform if the connection to the AP has been lost.   * @@ -3397,7 +3443,7 @@ void ieee80211_enable_dyn_ps(struct ieee80211_vif *vif);   * @rssi_event: the RSSI trigger event type   * @gfp: context flags   * - * When the %IEEE80211_HW_SUPPORTS_CQM_RSSI is set, and a connection quality + * When the %IEEE80211_VIF_SUPPORTS_CQM_RSSI is set, and a connection quality   * monitoring is configured with an rssi threshold, the driver will inform   * whenever the rssi level reaches the threshold.   */ @@ -3540,6 +3586,7 @@ struct ieee80211_tx_rate_control {  	bool rts, short_preamble;  	u8 max_rate_idx;  	u32 rate_idx_mask; +	u8 rate_idx_mcs_mask[IEEE80211_HT_MCS_MASK_LEN];  	bool bss;  }; diff --git a/include/net/ndisc.h b/include/net/ndisc.h index e3133c23980..6f9c25a76cd 100644 --- a/include/net/ndisc.h +++ b/include/net/ndisc.h @@ -133,7 +133,6 @@ extern void			ndisc_send_rs(struct net_device *dev,  					      const struct in6_addr *daddr);  extern void			ndisc_send_redirect(struct sk_buff *skb, -						    struct neighbour *neigh,  						    const struct in6_addr *target);  extern int			ndisc_mc_map(const struct in6_addr *addr, char *buf, diff --git a/include/net/netlink.h b/include/net/netlink.h index cb1f3504687..f394fe5d764 100644 --- a/include/net/netlink.h +++ b/include/net/netlink.h @@ -441,41 +441,6 @@ static inline int nlmsg_report(const struct nlmsghdr *nlh)  	nla_for_each_attr(pos, nlmsg_attrdata(nlh, hdrlen), \  			  nlmsg_attrlen(nlh, hdrlen), rem) -#if 0 -/* FIXME: Enable once all users have been converted */ - -/** - * __nlmsg_put - Add a new netlink message to an skb - * @skb: socket buffer to store message in - * @pid: netlink process id - * @seq: sequence number of message - * @type: message type - * @payload: length of message payload - * @flags: message flags - * - * The caller is responsible to ensure that the skb provides enough - * tailroom for both the netlink header and payload. - */ -static inline struct nlmsghdr *__nlmsg_put(struct sk_buff *skb, u32 pid, -					   u32 seq, int type, int payload, -					   int flags) -{ -	struct nlmsghdr *nlh; - -	nlh = (struct nlmsghdr *) skb_put(skb, nlmsg_total_size(payload)); -	nlh->nlmsg_type = type; -	nlh->nlmsg_len = nlmsg_msg_size(payload); -	nlh->nlmsg_flags = flags; -	nlh->nlmsg_pid = pid; -	nlh->nlmsg_seq = seq; - -	memset((unsigned char *) nlmsg_data(nlh) + payload, 0, -	       nlmsg_padlen(payload)); - -	return nlh; -} -#endif -  /**   * nlmsg_put - Add a new netlink message to an skb   * @skb: socket buffer to store message in diff --git a/include/net/nfc/nci.h b/include/net/nfc/nci.h index 2be95e2626c..276094b91d7 100644 --- a/include/net/nfc/nci.h +++ b/include/net/nfc/nci.h @@ -116,6 +116,11 @@  #define NCI_DISC_MAP_MODE_POLL					0x01  #define NCI_DISC_MAP_MODE_LISTEN				0x02 +/* NCI Discover Notification Type */ +#define NCI_DISCOVER_NTF_TYPE_LAST				0x00 +#define NCI_DISCOVER_NTF_TYPE_LAST_NFCC				0x01 +#define NCI_DISCOVER_NTF_TYPE_MORE				0x02 +  /* NCI Deactivation Type */  #define NCI_DEACTIVATE_TYPE_IDLE_MODE				0x00  #define NCI_DEACTIVATE_TYPE_SLEEP_MODE				0x01 @@ -207,6 +212,13 @@ struct nci_rf_disc_cmd {  	struct disc_config		disc_configs[NCI_MAX_NUM_RF_CONFIGS];  } __packed; +#define NCI_OP_RF_DISCOVER_SELECT_CMD	nci_opcode_pack(NCI_GID_RF_MGMT, 0x04) +struct nci_rf_discover_select_cmd { +	__u8	rf_discovery_id; +	__u8	rf_protocol; +	__u8	rf_interface; +} __packed; +  #define NCI_OP_RF_DEACTIVATE_CMD	nci_opcode_pack(NCI_GID_RF_MGMT, 0x06)  struct nci_rf_deactivate_cmd {  	__u8	type; @@ -244,6 +256,8 @@ struct nci_core_init_rsp_2 {  #define NCI_OP_RF_DISCOVER_RSP		nci_opcode_pack(NCI_GID_RF_MGMT, 0x03) +#define NCI_OP_RF_DISCOVER_SELECT_RSP	nci_opcode_pack(NCI_GID_RF_MGMT, 0x04) +  #define NCI_OP_RF_DEACTIVATE_RSP	nci_opcode_pack(NCI_GID_RF_MGMT, 0x06)  /* --------------------------- */ @@ -260,13 +274,15 @@ struct nci_core_conn_credit_ntf {  	struct conn_credit_entry	conn_entries[NCI_MAX_NUM_CONN];  } __packed; +#define NCI_OP_CORE_GENERIC_ERROR_NTF	nci_opcode_pack(NCI_GID_CORE, 0x07) +  #define NCI_OP_CORE_INTF_ERROR_NTF	nci_opcode_pack(NCI_GID_CORE, 0x08)  struct nci_core_intf_error_ntf {  	__u8	status;  	__u8	conn_id;  } __packed; -#define NCI_OP_RF_INTF_ACTIVATED_NTF	nci_opcode_pack(NCI_GID_RF_MGMT, 0x05) +#define NCI_OP_RF_DISCOVER_NTF		nci_opcode_pack(NCI_GID_RF_MGMT, 0x03)  struct rf_tech_specific_params_nfca_poll {  	__u16	sens_res;  	__u8	nfcid1_len;	/* 0, 4, 7, or 10 Bytes */ @@ -275,11 +291,43 @@ struct rf_tech_specific_params_nfca_poll {  	__u8	sel_res;  } __packed; +struct rf_tech_specific_params_nfcb_poll { +	__u8	sensb_res_len; +	__u8	sensb_res[12];	/* 11 or 12 Bytes */ +} __packed; + +struct rf_tech_specific_params_nfcf_poll { +	__u8	bit_rate; +	__u8	sensf_res_len; +	__u8	sensf_res[18];	/* 16 or 18 Bytes */ +} __packed; + +struct nci_rf_discover_ntf { +	__u8	rf_discovery_id; +	__u8	rf_protocol; +	__u8	rf_tech_and_mode; +	__u8	rf_tech_specific_params_len; + +	union { +		struct rf_tech_specific_params_nfca_poll nfca_poll; +		struct rf_tech_specific_params_nfcb_poll nfcb_poll; +		struct rf_tech_specific_params_nfcf_poll nfcf_poll; +	} rf_tech_specific_params; + +	__u8	ntf_type; +} __packed; + +#define NCI_OP_RF_INTF_ACTIVATED_NTF	nci_opcode_pack(NCI_GID_RF_MGMT, 0x05)  struct activation_params_nfca_poll_iso_dep {  	__u8	rats_res_len;  	__u8	rats_res[20];  }; +struct activation_params_nfcb_poll_iso_dep { +	__u8	attrib_res_len; +	__u8	attrib_res[50]; +}; +  struct nci_rf_intf_activated_ntf {  	__u8	rf_discovery_id;  	__u8	rf_interface; @@ -291,6 +339,8 @@ struct nci_rf_intf_activated_ntf {  	union {  		struct rf_tech_specific_params_nfca_poll nfca_poll; +		struct rf_tech_specific_params_nfcb_poll nfcb_poll; +		struct rf_tech_specific_params_nfcf_poll nfcf_poll;  	} rf_tech_specific_params;  	__u8	data_exch_rf_tech_and_mode; @@ -300,6 +350,7 @@ struct nci_rf_intf_activated_ntf {  	union {  		struct activation_params_nfca_poll_iso_dep nfca_poll_iso_dep; +		struct activation_params_nfcb_poll_iso_dep nfcb_poll_iso_dep;  	} activation_params;  } __packed; diff --git a/include/net/nfc/nci_core.h b/include/net/nfc/nci_core.h index bccd89e9d4c..86fee8b5c65 100644 --- a/include/net/nfc/nci_core.h +++ b/include/net/nfc/nci_core.h @@ -34,21 +34,31 @@  #include <net/nfc/nfc.h>  #include <net/nfc/nci.h> -/* NCI device state */ -enum { +/* NCI device flags */ +enum nci_flag {  	NCI_INIT,  	NCI_UP, +	NCI_DATA_EXCHANGE, +	NCI_DATA_EXCHANGE_TO, +}; + +/* NCI device states */ +enum nci_state { +	NCI_IDLE,  	NCI_DISCOVERY, +	NCI_W4_ALL_DISCOVERIES, +	NCI_W4_HOST_SELECT,  	NCI_POLL_ACTIVE, -	NCI_DATA_EXCHANGE,  };  /* NCI timeouts */  #define NCI_RESET_TIMEOUT			5000  #define NCI_INIT_TIMEOUT			5000  #define NCI_RF_DISC_TIMEOUT			5000 -#define NCI_RF_DEACTIVATE_TIMEOUT		5000 +#define NCI_RF_DISC_SELECT_TIMEOUT		5000 +#define NCI_RF_DEACTIVATE_TIMEOUT		30000  #define NCI_CMD_TIMEOUT				5000 +#define NCI_DATA_TIMEOUT			700  struct nci_dev; @@ -59,6 +69,7 @@ struct nci_ops {  };  #define NCI_MAX_SUPPORTED_RF_INTERFACES		4 +#define NCI_MAX_DISCOVERED_TARGETS		10  /* NCI Core structures */  struct nci_dev { @@ -68,12 +79,14 @@ struct nci_dev {  	int			tx_headroom;  	int			tx_tailroom; +	atomic_t		state;  	unsigned long		flags;  	atomic_t		cmd_cnt;  	atomic_t		credits_cnt;  	struct timer_list	cmd_timer; +	struct timer_list	data_timer;  	struct workqueue_struct	*cmd_wq;  	struct work_struct	cmd_work; @@ -96,9 +109,11 @@ struct nci_dev {  	void			*driver_data;  	__u32			poll_prots; -	__u32			target_available_prots;  	__u32			target_active_prot; +	struct nfc_target	targets[NCI_MAX_DISCOVERED_TARGETS]; +	int			n_targets; +  	/* received during NCI_OP_CORE_RESET_RSP */  	__u8			nci_ver; @@ -169,6 +184,7 @@ int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload);  int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb);  void nci_data_exchange_complete(struct nci_dev *ndev, struct sk_buff *skb,  				int err); +void nci_clear_target_list(struct nci_dev *ndev);  /* ----- NCI requests ----- */  #define NCI_REQ_DONE		0 diff --git a/include/net/nfc/nfc.h b/include/net/nfc/nfc.h index 8696b773a69..d253278e5a9 100644 --- a/include/net/nfc/nfc.h +++ b/include/net/nfc/nfc.h @@ -24,6 +24,7 @@  #ifndef __NET_NFC_H  #define __NET_NFC_H +#include <linux/nfc.h>  #include <linux/device.h>  #include <linux/skbuff.h> @@ -65,7 +66,6 @@ struct nfc_ops {  #define NFC_TARGET_IDX_ANY -1  #define NFC_MAX_GT_LEN 48 -#define NFC_MAX_NFCID1_LEN 10  struct nfc_target {  	u32 idx; @@ -73,7 +73,11 @@ struct nfc_target {  	u16 sens_res;  	u8 sel_res;  	u8 nfcid1_len; -	u8 nfcid1[NFC_MAX_NFCID1_LEN]; +	u8 nfcid1[NFC_NFCID1_MAXSIZE]; +	u8 sensb_res_len; +	u8 sensb_res[NFC_SENSB_RES_MAXSIZE]; +	u8 sensf_res_len; +	u8 sensf_res[NFC_SENSF_RES_MAXSIZE];  };  struct nfc_genl_data { @@ -83,7 +87,6 @@ struct nfc_genl_data {  struct nfc_dev {  	unsigned idx; -	unsigned target_idx;  	struct nfc_target *targets;  	int n_targets;  	int targets_generation; diff --git a/include/net/sock.h b/include/net/sock.h index 91c1c8baf02..ba761e7de25 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -357,6 +357,7 @@ struct sock {  	struct page		*sk_sndmsg_page;  	struct sk_buff		*sk_send_head;  	__u32			sk_sndmsg_off; +	__s32			sk_peek_off;  	int			sk_write_pending;  #ifdef CONFIG_SECURITY  	void			*sk_security; @@ -373,6 +374,30 @@ struct sock {  	void                    (*sk_destruct)(struct sock *sk);  }; +static inline int sk_peek_offset(struct sock *sk, int flags) +{ +	if ((flags & MSG_PEEK) && (sk->sk_peek_off >= 0)) +		return sk->sk_peek_off; +	else +		return 0; +} + +static inline void sk_peek_offset_bwd(struct sock *sk, int val) +{ +	if (sk->sk_peek_off >= 0) { +		if (sk->sk_peek_off >= val) +			sk->sk_peek_off -= val; +		else +			sk->sk_peek_off = 0; +	} +} + +static inline void sk_peek_offset_fwd(struct sock *sk, int val) +{ +	if (sk->sk_peek_off >= 0) +		sk->sk_peek_off += val; +} +  /*   * Hashed lists helper routines   */ @@ -590,6 +615,10 @@ enum sock_flags {  	SOCK_RXQ_OVFL,  	SOCK_ZEROCOPY, /* buffers from userspace */  	SOCK_WIFI_STATUS, /* push wifi status to userspace */ +	SOCK_NOFCS, /* Tell NIC not to do the Ethernet FCS. +		     * Will use last 4 bytes of packet sent from +		     * user-space instead. +		     */  };  static inline void sock_copy_flags(struct sock *nsk, struct sock *osk) diff --git a/include/net/tcp.h b/include/net/tcp.h index 2d80c291fff..8607e6aad42 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1138,35 +1138,27 @@ static inline void tcp_clear_all_retrans_hints(struct tcp_sock *tp)  /* MD5 Signature */  struct crypto_hash; +union tcp_md5_addr { +	struct in_addr  a4; +#if IS_ENABLED(CONFIG_IPV6) +	struct in6_addr	a6; +#endif +}; +  /* - key database */  struct tcp_md5sig_key { -	u8			*key; +	struct hlist_node	node;  	u8			keylen; -}; - -struct tcp4_md5sig_key { -	struct tcp_md5sig_key	base; -	__be32			addr; -}; - -struct tcp6_md5sig_key { -	struct tcp_md5sig_key	base; -#if 0 -	u32			scope_id;	/* XXX */ -#endif -	struct in6_addr		addr; +	u8			family; /* AF_INET or AF_INET6 */ +	union tcp_md5_addr	addr; +	u8			key[TCP_MD5SIG_MAXKEYLEN]; +	struct rcu_head		rcu;  };  /* - sock block */  struct tcp_md5sig_info { -	struct tcp4_md5sig_key	*keys4; -#if IS_ENABLED(CONFIG_IPV6) -	struct tcp6_md5sig_key	*keys6; -	u32			entries6; -	u32			alloced6; -#endif -	u32			entries4; -	u32			alloced4; +	struct hlist_head	head; +	struct rcu_head		rcu;  };  /* - pseudo header */ @@ -1203,19 +1195,25 @@ extern int tcp_v4_md5_hash_skb(char *md5_hash, struct tcp_md5sig_key *key,  			       const struct sock *sk,  			       const struct request_sock *req,  			       const struct sk_buff *skb); -extern struct tcp_md5sig_key * tcp_v4_md5_lookup(struct sock *sk, -						 struct sock *addr_sk); -extern int tcp_v4_md5_do_add(struct sock *sk, __be32 addr, u8 *newkey, -			     u8 newkeylen); -extern int tcp_v4_md5_do_del(struct sock *sk, __be32 addr); +extern int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr, +			  int family, const u8 *newkey, +			  u8 newkeylen, gfp_t gfp); +extern int tcp_md5_do_del(struct sock *sk, const union tcp_md5_addr *addr, +			  int family); +extern struct tcp_md5sig_key *tcp_v4_md5_lookup(struct sock *sk, +					 struct sock *addr_sk);  #ifdef CONFIG_TCP_MD5SIG -#define tcp_twsk_md5_key(twsk)	((twsk)->tw_md5_keylen ? 		 \ -				 &(struct tcp_md5sig_key) {		 \ -					.key = (twsk)->tw_md5_key,	 \ -					.keylen = (twsk)->tw_md5_keylen, \ -				} : NULL) +extern struct tcp_md5sig_key *tcp_md5_do_lookup(struct sock *sk, +			const union tcp_md5_addr *addr, int family); +#define tcp_twsk_md5_key(twsk)	((twsk)->tw_md5_key)  #else +static inline struct tcp_md5sig_key *tcp_md5_do_lookup(struct sock *sk, +					 const union tcp_md5_addr *addr, +					 int family) +{ +	return NULL; +}  #define tcp_twsk_md5_key(twsk)	NULL  #endif @@ -1471,10 +1469,6 @@ struct tcp_sock_af_ops {  						  const struct sock *sk,  						  const struct request_sock *req,  						  const struct sk_buff *skb); -	int			(*md5_add) (struct sock *sk, -					    struct sock *addr_sk, -					    u8 *newkey, -					    u8 len);  	int			(*md5_parse) (struct sock *sk,  					      char __user *optval,  					      int optlen); diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 89174e29dca..96239e78e62 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -1566,11 +1566,6 @@ extern struct xfrm_algo_desc *xfrm_calg_get_byname(const char *name, int probe);  extern struct xfrm_algo_desc *xfrm_aead_get_byname(const char *name, int icv_len,  						   int probe); -struct hash_desc; -struct scatterlist; -typedef int (icv_update_fn_t)(struct hash_desc *, struct scatterlist *, -			      unsigned int); -  static inline int xfrm_addr_cmp(const xfrm_address_t *a,  				const xfrm_address_t *b,  				int family)  |