mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-24 13:44:26 -04:00
Merge commit 'origin/master'
Manually fixed up: drivers/net/fs_enet/fs_enet-main.c
This commit is contained in:
commit
8725f25acc
2632 changed files with 205944 additions and 125823 deletions
|
|
@ -235,6 +235,9 @@ int acpi_check_region(resource_size_t start, resource_size_t n,
|
|||
int acpi_check_mem_region(resource_size_t start, resource_size_t n,
|
||||
const char *name);
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
void __init acpi_old_suspend_ordering(void);
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
#else /* CONFIG_ACPI */
|
||||
|
||||
static inline int early_acpi_boot_init(void)
|
||||
|
|
|
|||
6
include/linux/brcmphy.h
Normal file
6
include/linux/brcmphy.h
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
#define PHY_BRCM_WIRESPEED_ENABLE 0x00000001
|
||||
#define PHY_BRCM_AUTO_PWRDWN_ENABLE 0x00000002
|
||||
#define PHY_BRCM_APD_CLK125_ENABLE 0x00000004
|
||||
#define PHY_BRCM_STD_IBND_DISABLE 0x00000008
|
||||
#define PHY_BRCM_EXT_IBND_RX_ENABLE 0x00000010
|
||||
#define PHY_BRCM_EXT_IBND_TX_ENABLE 0x00000020
|
||||
|
|
@ -148,7 +148,8 @@ struct configfs_attribute {
|
|||
* items. If the item is a group, it may support mkdir(2).
|
||||
* Groups supply one of make_group() and make_item(). If the
|
||||
* group supports make_group(), one can create group children. If it
|
||||
* supports make_item(), one can create config_item children. If it has
|
||||
* supports make_item(), one can create config_item children. make_group()
|
||||
* and make_item() return ERR_PTR() on errors. If it has
|
||||
* default_groups on group->default_groups, it has automatically created
|
||||
* group children. default_groups may coexist alongsize make_group() or
|
||||
* make_item(), but if the group wishes to have only default_groups
|
||||
|
|
|
|||
|
|
@ -4,9 +4,6 @@
|
|||
* Copyright (C) 2001 Russell King
|
||||
* (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
|
||||
*
|
||||
*
|
||||
* $Id: cpufreq.h,v 1.36 2003/01/20 17:31:48 db Exp $
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
|
|
|
|||
|
|
@ -550,11 +550,11 @@ struct cyclades_icount {
|
|||
|
||||
struct cyclades_port {
|
||||
int magic;
|
||||
struct tty_port port;
|
||||
struct cyclades_card *card;
|
||||
int line;
|
||||
int flags; /* defined in tty.h */
|
||||
int type; /* UART type */
|
||||
struct tty_struct *tty;
|
||||
int read_status_mask;
|
||||
int ignore_status_mask;
|
||||
int timeout;
|
||||
|
|
@ -567,13 +567,8 @@ struct cyclades_port {
|
|||
int chip_rev;
|
||||
int custom_divisor;
|
||||
u8 x_char; /* to be pushed out ASAP */
|
||||
int close_delay;
|
||||
unsigned short closing_wait;
|
||||
int count; /* # of fd on device */
|
||||
int breakon;
|
||||
int breakoff;
|
||||
int blocked_open; /* # of blocked opens */
|
||||
unsigned char *xmit_buf;
|
||||
int xmit_head;
|
||||
int xmit_tail;
|
||||
int xmit_cnt;
|
||||
|
|
@ -583,16 +578,14 @@ struct cyclades_port {
|
|||
struct cyclades_monitor mon;
|
||||
struct cyclades_idle_stats idle_stats;
|
||||
struct cyclades_icount icount;
|
||||
wait_queue_head_t open_wait;
|
||||
wait_queue_head_t close_wait;
|
||||
struct completion shutdown_wait;
|
||||
wait_queue_head_t delta_msr_wait;
|
||||
int throttle;
|
||||
};
|
||||
|
||||
#define CLOSING_WAIT_DELAY 30*HZ
|
||||
#define CY_CLOSING_WAIT_NONE 65535
|
||||
#define CY_CLOSING_WAIT_INF 0
|
||||
#define CY_CLOSING_WAIT_NONE ASYNC_CLOSING_WAIT_NONE
|
||||
#define CY_CLOSING_WAIT_INF ASYNC_CLOSING_WAIT_INF
|
||||
|
||||
|
||||
#define CyMAX_CHIPS_PER_CARD 8
|
||||
|
|
|
|||
|
|
@ -364,8 +364,6 @@ static inline unsigned int dccp_hdr_len(const struct sk_buff *skb)
|
|||
/* FIXME: for now we're default to 1 but it should really be 0 */
|
||||
#define DCCPF_INITIAL_SEND_NDP_COUNT 1
|
||||
|
||||
#define DCCP_NDP_LIMIT 0xFFFFFF
|
||||
|
||||
/**
|
||||
* struct dccp_minisock - Minimal DCCP connection representation
|
||||
*
|
||||
|
|
@ -437,7 +435,7 @@ extern int dccp_parse_options(struct sock *sk, struct dccp_request_sock *dreq,
|
|||
struct sk_buff *skb);
|
||||
|
||||
struct dccp_options_received {
|
||||
u32 dccpor_ndp; /* only 24 bits */
|
||||
u64 dccpor_ndp:48;
|
||||
u32 dccpor_timestamp;
|
||||
u32 dccpor_timestamp_echo;
|
||||
u32 dccpor_elapsed_time;
|
||||
|
|
@ -533,7 +531,7 @@ struct dccp_sock {
|
|||
__u16 dccps_r_ack_ratio;
|
||||
__u16 dccps_pcslen;
|
||||
__u16 dccps_pcrlen;
|
||||
unsigned long dccps_ndp_count;
|
||||
__u64 dccps_ndp_count:48;
|
||||
unsigned long dccps_rate_last;
|
||||
struct dccp_minisock dccps_minisock;
|
||||
struct dccp_ackvec *dccps_hc_rx_ackvec;
|
||||
|
|
|
|||
|
|
@ -26,6 +26,8 @@ struct debugfs_blob_wrapper {
|
|||
unsigned long size;
|
||||
};
|
||||
|
||||
extern struct dentry *arch_debugfs_dir;
|
||||
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
|
||||
/* declared over in file.c */
|
||||
|
|
|
|||
|
|
@ -9,11 +9,13 @@
|
|||
#define _LINUX_DEVICE_MAPPER_H
|
||||
|
||||
#include <linux/bio.h>
|
||||
#include <linux/blkdev.h>
|
||||
|
||||
struct dm_target;
|
||||
struct dm_table;
|
||||
struct dm_dev;
|
||||
struct mapped_device;
|
||||
struct bio_vec;
|
||||
|
||||
typedef enum { STATUSTYPE_INFO, STATUSTYPE_TABLE } status_type_t;
|
||||
|
||||
|
|
@ -72,6 +74,9 @@ typedef int (*dm_ioctl_fn) (struct dm_target *ti, struct inode *inode,
|
|||
struct file *filp, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
|
||||
typedef int (*dm_merge_fn) (struct dm_target *ti, struct bvec_merge_data *bvm,
|
||||
struct bio_vec *biovec, int max_size);
|
||||
|
||||
void dm_error(const char *message);
|
||||
|
||||
/*
|
||||
|
|
@ -107,6 +112,7 @@ struct target_type {
|
|||
dm_status_fn status;
|
||||
dm_message_fn message;
|
||||
dm_ioctl_fn ioctl;
|
||||
dm_merge_fn merge;
|
||||
};
|
||||
|
||||
struct io_restrictions {
|
||||
|
|
|
|||
|
|
@ -68,6 +68,8 @@ struct bus_type {
|
|||
int (*resume_early)(struct device *dev);
|
||||
int (*resume)(struct device *dev);
|
||||
|
||||
struct pm_ext_ops *pm;
|
||||
|
||||
struct bus_type_private *p;
|
||||
};
|
||||
|
||||
|
|
@ -131,6 +133,8 @@ struct device_driver {
|
|||
int (*resume) (struct device *dev);
|
||||
struct attribute_group **groups;
|
||||
|
||||
struct pm_ops *pm;
|
||||
|
||||
struct driver_private *p;
|
||||
};
|
||||
|
||||
|
|
@ -197,6 +201,8 @@ struct class {
|
|||
|
||||
int (*suspend)(struct device *dev, pm_message_t state);
|
||||
int (*resume)(struct device *dev);
|
||||
|
||||
struct pm_ops *pm;
|
||||
};
|
||||
|
||||
extern int __must_check class_register(struct class *class);
|
||||
|
|
@ -248,8 +254,11 @@ struct device_type {
|
|||
struct attribute_group **groups;
|
||||
int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
|
||||
void (*release)(struct device *dev);
|
||||
|
||||
int (*suspend)(struct device *dev, pm_message_t state);
|
||||
int (*resume)(struct device *dev);
|
||||
|
||||
struct pm_ops *pm;
|
||||
};
|
||||
|
||||
/* interface for exporting device attributes */
|
||||
|
|
|
|||
|
|
@ -256,9 +256,9 @@ enum {
|
|||
#define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)
|
||||
|
||||
#define DM_VERSION_MAJOR 4
|
||||
#define DM_VERSION_MINOR 13
|
||||
#define DM_VERSION_MINOR 14
|
||||
#define DM_VERSION_PATCHLEVEL 0
|
||||
#define DM_VERSION_EXTRA "-ioctl (2007-10-18)"
|
||||
#define DM_VERSION_EXTRA "-ioctl (2008-04-23)"
|
||||
|
||||
/* Status bits */
|
||||
#define DM_READONLY_FLAG (1 << 0) /* In/Out */
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
#define DM9000_PLATF_32BITONLY (0x0004)
|
||||
#define DM9000_PLATF_EXT_PHY (0x0008)
|
||||
#define DM9000_PLATF_NO_EEPROM (0x0010)
|
||||
#define DM9000_PLATF_SIMPLE_PHY (0x0020) /* Use NSR to find LinkStatus */
|
||||
|
||||
/* platfrom data for platfrom device structure's platfrom_data field */
|
||||
|
||||
|
|
|
|||
|
|
@ -272,6 +272,12 @@ enum ethtool_flags {
|
|||
ETH_FLAG_LRO = (1 << 15), /* LRO is enabled */
|
||||
};
|
||||
|
||||
struct ethtool_rxnfc {
|
||||
__u32 cmd;
|
||||
__u32 flow_type;
|
||||
__u64 data;
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
struct net_device;
|
||||
|
|
@ -396,6 +402,8 @@ struct ethtool_ops {
|
|||
/* the following hooks are obsolete */
|
||||
int (*self_test_count)(struct net_device *);/* use get_sset_count */
|
||||
int (*get_stats_count)(struct net_device *);/* use get_sset_count */
|
||||
int (*get_rxhash)(struct net_device *, struct ethtool_rxnfc *);
|
||||
int (*set_rxhash)(struct net_device *, struct ethtool_rxnfc *);
|
||||
};
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
|
@ -442,6 +450,9 @@ struct ethtool_ops {
|
|||
#define ETHTOOL_GPFLAGS 0x00000027 /* Get driver-private flags bitmap */
|
||||
#define ETHTOOL_SPFLAGS 0x00000028 /* Set driver-private flags bitmap */
|
||||
|
||||
#define ETHTOOL_GRXFH 0x00000029 /* Get RX flow hash configuration */
|
||||
#define ETHTOOL_SRXFH 0x0000002a /* Set RX flow hash configuration */
|
||||
|
||||
/* compatibility with older code */
|
||||
#define SPARC_ETH_GSET ETHTOOL_GSET
|
||||
#define SPARC_ETH_SSET ETHTOOL_SSET
|
||||
|
|
@ -528,4 +539,26 @@ struct ethtool_ops {
|
|||
#define WAKE_MAGIC (1 << 5)
|
||||
#define WAKE_MAGICSECURE (1 << 6) /* only meaningful if WAKE_MAGIC */
|
||||
|
||||
/* L3-L4 network traffic flow types */
|
||||
#define TCP_V4_FLOW 0x01
|
||||
#define UDP_V4_FLOW 0x02
|
||||
#define SCTP_V4_FLOW 0x03
|
||||
#define AH_ESP_V4_FLOW 0x04
|
||||
#define TCP_V6_FLOW 0x05
|
||||
#define UDP_V6_FLOW 0x06
|
||||
#define SCTP_V6_FLOW 0x07
|
||||
#define AH_ESP_V6_FLOW 0x08
|
||||
|
||||
/* L3-L4 network traffic flow hash options */
|
||||
#define RXH_DEV_PORT (1 << 0)
|
||||
#define RXH_L2DA (1 << 1)
|
||||
#define RXH_VLAN (1 << 2)
|
||||
#define RXH_L3_PROTO (1 << 3)
|
||||
#define RXH_IP_SRC (1 << 4)
|
||||
#define RXH_IP_DST (1 << 5)
|
||||
#define RXH_L4_B_0_1 (1 << 6) /* src port in case of TCP/UDP/SCTP */
|
||||
#define RXH_L4_B_2_3 (1 << 7) /* dst port in case of TCP/UDP/SCTP */
|
||||
#define RXH_DISCARD (1 << 31)
|
||||
|
||||
|
||||
#endif /* _LINUX_ETHTOOL_H */
|
||||
|
|
|
|||
|
|
@ -918,12 +918,12 @@ struct file_lock {
|
|||
struct list_head fl_link; /* doubly linked list of all locks */
|
||||
struct list_head fl_block; /* circular list of blocked processes */
|
||||
fl_owner_t fl_owner;
|
||||
unsigned char fl_flags;
|
||||
unsigned char fl_type;
|
||||
unsigned int fl_pid;
|
||||
struct pid *fl_nspid;
|
||||
wait_queue_head_t fl_wait;
|
||||
struct file *fl_file;
|
||||
unsigned char fl_flags;
|
||||
unsigned char fl_type;
|
||||
loff_t fl_start;
|
||||
loff_t fl_end;
|
||||
|
||||
|
|
|
|||
|
|
@ -68,7 +68,6 @@ struct gameport_driver {
|
|||
|
||||
int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mode);
|
||||
void gameport_close(struct gameport *gameport);
|
||||
void gameport_rescan(struct gameport *gameport);
|
||||
|
||||
#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/tty.h>
|
||||
|
||||
struct real_driver {
|
||||
void (*disable_tx_interrupts) (void *);
|
||||
|
|
@ -33,17 +34,12 @@ struct real_driver {
|
|||
|
||||
struct gs_port {
|
||||
int magic;
|
||||
struct tty_port port;
|
||||
unsigned char *xmit_buf;
|
||||
int xmit_head;
|
||||
int xmit_tail;
|
||||
int xmit_cnt;
|
||||
struct mutex port_write_mutex;
|
||||
int flags;
|
||||
wait_queue_head_t open_wait;
|
||||
wait_queue_head_t close_wait;
|
||||
int count;
|
||||
int blocked_open;
|
||||
struct tty_struct *tty;
|
||||
unsigned long event;
|
||||
unsigned short closing_wait;
|
||||
int close_delay;
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ struct gpio_keys_button {
|
|||
char *desc;
|
||||
int type; /* input event type (EV_KEY, EV_SW) */
|
||||
int wakeup; /* configure the button as a wake-up source */
|
||||
int debounce_interval; /* debounce ticks interval in msecs */
|
||||
};
|
||||
|
||||
struct gpio_keys_platform_data {
|
||||
|
|
|
|||
|
|
@ -76,11 +76,10 @@ struct hayes_esp_config {
|
|||
|
||||
struct esp_struct {
|
||||
int magic;
|
||||
struct tty_port port;
|
||||
spinlock_t lock;
|
||||
int port;
|
||||
int io_port;
|
||||
int irq;
|
||||
int flags; /* defined in tty.h */
|
||||
struct tty_struct *tty;
|
||||
int read_status_mask;
|
||||
int ignore_status_mask;
|
||||
int timeout;
|
||||
|
|
@ -93,14 +92,10 @@ struct esp_struct {
|
|||
int MCR; /* Modem control register */
|
||||
unsigned long last_active;
|
||||
int line;
|
||||
int count; /* # of fd on device */
|
||||
int blocked_open; /* # of blocked opens */
|
||||
unsigned char *xmit_buf;
|
||||
int xmit_head;
|
||||
int xmit_tail;
|
||||
int xmit_cnt;
|
||||
wait_queue_head_t open_wait;
|
||||
wait_queue_head_t close_wait;
|
||||
wait_queue_head_t delta_msr_wait;
|
||||
wait_queue_head_t break_wait;
|
||||
struct async_icount icount; /* kernel counters for the 4 input interrupts */
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ struct hdlc_proto {
|
|||
|
||||
/* Pointed to by dev->priv */
|
||||
typedef struct hdlc_device {
|
||||
struct net_device_stats stats;
|
||||
/* used by HDLC layer to take control over HDLC device from hw driver*/
|
||||
int (*attach)(struct net_device *dev,
|
||||
unsigned short encoding, unsigned short parity);
|
||||
|
|
@ -109,12 +108,6 @@ int attach_hdlc_protocol(struct net_device *dev, struct hdlc_proto *proto,
|
|||
/* May be used by hardware driver to gain control over HDLC device */
|
||||
void detach_hdlc_protocol(struct net_device *dev);
|
||||
|
||||
static __inline__ struct net_device_stats *hdlc_stats(struct net_device *dev)
|
||||
{
|
||||
return &dev_to_hdlc(dev)->stats;
|
||||
}
|
||||
|
||||
|
||||
static __inline__ __be16 hdlc_type_trans(struct sk_buff *skb,
|
||||
struct net_device *dev)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -33,15 +33,11 @@
|
|||
|
||||
#define I2C_DRIVERID_MSP3400 1
|
||||
#define I2C_DRIVERID_TUNER 2
|
||||
#define I2C_DRIVERID_TDA8425 4 /* stereo sound processor */
|
||||
#define I2C_DRIVERID_TEA6420 5 /* audio matrix switch */
|
||||
#define I2C_DRIVERID_TEA6415C 6 /* video matrix switch */
|
||||
#define I2C_DRIVERID_TDA9840 7 /* stereo sound processor */
|
||||
#define I2C_DRIVERID_SAA7111A 8 /* video input processor */
|
||||
#define I2C_DRIVERID_SAA7185B 13 /* video encoder */
|
||||
#define I2C_DRIVERID_TEA6300 18 /* audio mixer */
|
||||
#define I2C_DRIVERID_TDA9850 20 /* audio mixer */
|
||||
#define I2C_DRIVERID_TDA9855 21 /* audio mixer */
|
||||
#define I2C_DRIVERID_SAA7110 22 /* video decoder */
|
||||
#define I2C_DRIVERID_MGATVO 23 /* Matrox TVOut */
|
||||
#define I2C_DRIVERID_SAA5249 24 /* SAA5249 and compatibles */
|
||||
|
|
@ -50,9 +46,7 @@
|
|||
#define I2C_DRIVERID_TDA7432 27 /* Stereo sound processor */
|
||||
#define I2C_DRIVERID_TVMIXER 28 /* Mixer driver for tv cards */
|
||||
#define I2C_DRIVERID_TVAUDIO 29 /* Generic TV sound driver */
|
||||
#define I2C_DRIVERID_TDA9873 31 /* TV sound decoder chip */
|
||||
#define I2C_DRIVERID_TDA9875 32 /* TV sound decoder chip */
|
||||
#define I2C_DRIVERID_PIC16C54_PV9 33 /* Audio mux/ir receiver */
|
||||
#define I2C_DRIVERID_BT819 40 /* video decoder */
|
||||
#define I2C_DRIVERID_BT856 41 /* video encoder */
|
||||
#define I2C_DRIVERID_VPX3220 42 /* video decoder+vbi/vtxt */
|
||||
|
|
@ -63,7 +57,6 @@
|
|||
#define I2C_DRIVERID_INDYCAM 58 /* SGI IndyCam */
|
||||
#define I2C_DRIVERID_OVCAMCHIP 61 /* OmniVision CMOS image sens. */
|
||||
#define I2C_DRIVERID_MAX6900 63 /* MAX6900 real-time clock */
|
||||
#define I2C_DRIVERID_TDA9874 66 /* TV sound decoder */
|
||||
#define I2C_DRIVERID_SAA6752HS 67 /* MPEG2 encoder */
|
||||
#define I2C_DRIVERID_TVEEPROM 68 /* TV EEPROM */
|
||||
#define I2C_DRIVERID_WM8775 69 /* wm8775 audio processor */
|
||||
|
|
@ -158,7 +151,6 @@
|
|||
#define I2C_HW_SMBUS_W9968CF 0x04000d
|
||||
#define I2C_HW_SMBUS_OV511 0x04000e /* OV511(+) USB 1.1 webcam ICs */
|
||||
#define I2C_HW_SMBUS_OV518 0x04000f /* OV518(+) USB 1.1 webcam ICs */
|
||||
#define I2C_HW_SMBUS_OVFX2 0x040011 /* Cypress/OmniVision FX2 webcam */
|
||||
#define I2C_HW_SMBUS_CAFE 0x040012 /* Marvell 88ALP01 "CAFE" cam */
|
||||
#define I2C_HW_SMBUS_ALI1563 0x040013
|
||||
|
||||
|
|
|
|||
|
|
@ -98,6 +98,9 @@
|
|||
|
||||
#define IEEE80211_MAX_SSID_LEN 32
|
||||
#define IEEE80211_MAX_MESH_ID_LEN 32
|
||||
#define IEEE80211_QOS_CTL_LEN 2
|
||||
#define IEEE80211_QOS_CTL_TID_MASK 0x000F
|
||||
#define IEEE80211_QOS_CTL_TAG1D_MASK 0x0007
|
||||
|
||||
struct ieee80211_hdr {
|
||||
__le16 frame_control;
|
||||
|
|
@ -109,6 +112,355 @@ struct ieee80211_hdr {
|
|||
u8 addr4[6];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
* ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_has_tods(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_TODS)) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_has_fromds - check if IEEE80211_FCTL_FROMDS is set
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_has_fromds(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FROMDS)) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_has_a4 - check if IEEE80211_FCTL_TODS and IEEE80211_FCTL_FROMDS are set
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_has_a4(__le16 fc)
|
||||
{
|
||||
__le16 tmp = cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS);
|
||||
return (fc & tmp) == tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_has_morefrags - check if IEEE80211_FCTL_MOREFRAGS is set
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_has_morefrags(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_has_retry - check if IEEE80211_FCTL_RETRY is set
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_has_retry(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_RETRY)) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_has_pm - check if IEEE80211_FCTL_PM is set
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_has_pm(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_PM)) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_has_moredata - check if IEEE80211_FCTL_MOREDATA is set
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_has_moredata(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_has_protected - check if IEEE80211_FCTL_PROTECTED is set
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_has_protected(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_PROTECTED)) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_has_order - check if IEEE80211_FCTL_ORDER is set
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_has_order(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_ORDER)) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_mgmt - check if type is IEEE80211_FTYPE_MGMT
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_mgmt(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_MGMT);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_ctl - check if type is IEEE80211_FTYPE_CTL
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_ctl(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_CTL);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_data - check if type is IEEE80211_FTYPE_DATA
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_data(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_DATA);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_data_qos - check if type is IEEE80211_FTYPE_DATA and IEEE80211_STYPE_QOS_DATA is set
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_data_qos(__le16 fc)
|
||||
{
|
||||
/*
|
||||
* mask with QOS_DATA rather than IEEE80211_FCTL_STYPE as we just need
|
||||
* to check the one bit
|
||||
*/
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_STYPE_QOS_DATA)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_data_present - check if type is IEEE80211_FTYPE_DATA and has data
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_data_present(__le16 fc)
|
||||
{
|
||||
/*
|
||||
* mask with 0x40 and test that that bit is clear to only return true
|
||||
* for the data-containing substypes.
|
||||
*/
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | 0x40)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_DATA);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_assoc_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ASSOC_REQ
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_assoc_req(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_REQ);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_assoc_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ASSOC_RESP
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_assoc_resp(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_RESP);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_reassoc_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_REASSOC_REQ
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_reassoc_req(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_REQ);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_reassoc_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_REASSOC_RESP
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_reassoc_resp(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_RESP);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_probe_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_PROBE_REQ
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_probe_req(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_probe_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_PROBE_RESP
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_probe_resp(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_RESP);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_beacon - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_BEACON
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_beacon(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_atim - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ATIM
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_atim(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ATIM);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_disassoc - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_DISASSOC
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_disassoc(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DISASSOC);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_auth - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_AUTH
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_auth(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_deauth - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_DEAUTH
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_deauth(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_action - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ACTION
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_action(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_back_req - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_BACK_REQ
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_back_req(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK_REQ);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_back - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_BACK
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_back(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_pspoll - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_PSPOLL
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_pspoll(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_PSPOLL);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_rts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_RTS
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_rts(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_cts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CTS
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_cts(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_ack - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_ACK
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_ack(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_ACK);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_cfend - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CFEND
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_cfend(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFEND);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_cfendack - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CFENDACK
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_cfendack(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFENDACK);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_nullfunc - check if FTYPE=IEEE80211_FTYPE_DATA and STYPE=IEEE80211_STYPE_NULLFUNC
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline int ieee80211_is_nullfunc(__le16 fc)
|
||||
{
|
||||
return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
|
||||
cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC);
|
||||
}
|
||||
|
||||
struct ieee80211s_hdr {
|
||||
u8 flags;
|
||||
|
|
@ -119,6 +471,40 @@ struct ieee80211s_hdr {
|
|||
u8 eaddr3[6];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
* struct ieee80211_quiet_ie
|
||||
*
|
||||
* This structure refers to "Quiet information element"
|
||||
*/
|
||||
struct ieee80211_quiet_ie {
|
||||
u8 count;
|
||||
u8 period;
|
||||
__le16 duration;
|
||||
__le16 offset;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
* struct ieee80211_msrment_ie
|
||||
*
|
||||
* This structure refers to "Measurement Request/Report information element"
|
||||
*/
|
||||
struct ieee80211_msrment_ie {
|
||||
u8 token;
|
||||
u8 mode;
|
||||
u8 type;
|
||||
u8 request[0];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
* struct ieee80211_channel_sw_ie
|
||||
*
|
||||
* This structure refers to "Channel Switch Announcement information element"
|
||||
*/
|
||||
struct ieee80211_channel_sw_ie {
|
||||
u8 mode;
|
||||
u8 new_ch_num;
|
||||
u8 count;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct ieee80211_mgmt {
|
||||
__le16 frame_control;
|
||||
|
|
@ -194,10 +580,15 @@ struct ieee80211_mgmt {
|
|||
u8 action_code;
|
||||
u8 element_id;
|
||||
u8 length;
|
||||
u8 switch_mode;
|
||||
u8 new_chan;
|
||||
u8 switch_count;
|
||||
struct ieee80211_channel_sw_ie sw_elem;
|
||||
} __attribute__((packed)) chan_switch;
|
||||
struct{
|
||||
u8 action_code;
|
||||
u8 dialog_token;
|
||||
u8 element_id;
|
||||
u8 length;
|
||||
struct ieee80211_msrment_ie msr_elem;
|
||||
} __attribute__((packed)) measurement;
|
||||
struct{
|
||||
u8 action_code;
|
||||
u8 dialog_token;
|
||||
|
|
@ -269,6 +660,10 @@ struct ieee80211_bar {
|
|||
__le16 start_seq_num;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* 802.11 BAR control masks */
|
||||
#define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL 0x0000
|
||||
#define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA 0x0004
|
||||
|
||||
/**
|
||||
* struct ieee80211_ht_cap - HT capabilities
|
||||
*
|
||||
|
|
@ -306,20 +701,33 @@ struct ieee80211_ht_addt_info {
|
|||
#define IEEE80211_HT_CAP_SGI_40 0x0040
|
||||
#define IEEE80211_HT_CAP_DELAY_BA 0x0400
|
||||
#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800
|
||||
/* 802.11n HT capability AMPDU settings */
|
||||
#define IEEE80211_HT_CAP_AMPDU_FACTOR 0x03
|
||||
#define IEEE80211_HT_CAP_AMPDU_DENSITY 0x1C
|
||||
/* 802.11n HT capability MSC set */
|
||||
#define IEEE80211_SUPP_MCS_SET_UEQM 4
|
||||
#define IEEE80211_HT_CAP_MAX_STREAMS 4
|
||||
#define IEEE80211_SUPP_MCS_SET_LEN 10
|
||||
/* maximum streams the spec allows */
|
||||
#define IEEE80211_HT_CAP_MCS_TX_DEFINED 0x01
|
||||
#define IEEE80211_HT_CAP_MCS_TX_RX_DIFF 0x02
|
||||
#define IEEE80211_HT_CAP_MCS_TX_STREAMS 0x0C
|
||||
#define IEEE80211_HT_CAP_MCS_TX_UEQM 0x10
|
||||
/* 802.11n HT IE masks */
|
||||
#define IEEE80211_HT_IE_CHA_SEC_OFFSET 0x03
|
||||
#define IEEE80211_HT_IE_CHA_SEC_NONE 0x00
|
||||
#define IEEE80211_HT_IE_CHA_SEC_ABOVE 0x01
|
||||
#define IEEE80211_HT_IE_CHA_SEC_BELOW 0x03
|
||||
#define IEEE80211_HT_IE_CHA_WIDTH 0x04
|
||||
#define IEEE80211_HT_IE_HT_PROTECTION 0x0003
|
||||
#define IEEE80211_HT_IE_NON_GF_STA_PRSNT 0x0004
|
||||
#define IEEE80211_HT_IE_NON_HT_STA_PRSNT 0x0010
|
||||
|
||||
/* MIMO Power Save Modes */
|
||||
#define WLAN_HT_CAP_MIMO_PS_STATIC 0
|
||||
#define WLAN_HT_CAP_MIMO_PS_DYNAMIC 1
|
||||
#define WLAN_HT_CAP_MIMO_PS_INVALID 2
|
||||
#define WLAN_HT_CAP_MIMO_PS_DISABLED 3
|
||||
#define WLAN_HT_CAP_MIMO_PS_STATIC 0
|
||||
#define WLAN_HT_CAP_MIMO_PS_DYNAMIC 1
|
||||
#define WLAN_HT_CAP_MIMO_PS_INVALID 2
|
||||
#define WLAN_HT_CAP_MIMO_PS_DISABLED 3
|
||||
|
||||
/* Authentication algorithms */
|
||||
#define WLAN_AUTH_OPEN 0
|
||||
|
|
@ -337,11 +745,21 @@ struct ieee80211_ht_addt_info {
|
|||
#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5)
|
||||
#define WLAN_CAPABILITY_PBCC (1<<6)
|
||||
#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7)
|
||||
|
||||
/* 802.11h */
|
||||
#define WLAN_CAPABILITY_SPECTRUM_MGMT (1<<8)
|
||||
#define WLAN_CAPABILITY_QOS (1<<9)
|
||||
#define WLAN_CAPABILITY_SHORT_SLOT_TIME (1<<10)
|
||||
#define WLAN_CAPABILITY_DSSS_OFDM (1<<13)
|
||||
/* measurement */
|
||||
#define IEEE80211_SPCT_MSR_RPRT_MODE_LATE (1<<0)
|
||||
#define IEEE80211_SPCT_MSR_RPRT_MODE_INCAPABLE (1<<1)
|
||||
#define IEEE80211_SPCT_MSR_RPRT_MODE_REFUSED (1<<2)
|
||||
|
||||
#define IEEE80211_SPCT_MSR_RPRT_TYPE_BASIC 0
|
||||
#define IEEE80211_SPCT_MSR_RPRT_TYPE_CCA 1
|
||||
#define IEEE80211_SPCT_MSR_RPRT_TYPE_RPI 2
|
||||
|
||||
|
||||
/* 802.11g ERP information element */
|
||||
#define WLAN_ERP_NON_ERP_PRESENT (1<<0)
|
||||
|
|
@ -512,6 +930,15 @@ enum ieee80211_category {
|
|||
WLAN_CATEGORY_WMM = 17,
|
||||
};
|
||||
|
||||
/* SPECTRUM_MGMT action code */
|
||||
enum ieee80211_spectrum_mgmt_actioncode {
|
||||
WLAN_ACTION_SPCT_MSR_REQ = 0,
|
||||
WLAN_ACTION_SPCT_MSR_RPRT = 1,
|
||||
WLAN_ACTION_SPCT_TPC_REQ = 2,
|
||||
WLAN_ACTION_SPCT_TPC_RPRT = 3,
|
||||
WLAN_ACTION_SPCT_CHL_SWITCH = 4,
|
||||
};
|
||||
|
||||
/* BACK action code */
|
||||
enum ieee80211_back_actioncode {
|
||||
WLAN_ACTION_ADDBA_REQ = 0,
|
||||
|
|
@ -539,64 +966,58 @@ enum ieee80211_back_parties {
|
|||
|
||||
#define WLAN_MAX_KEY_LEN 32
|
||||
|
||||
/**
|
||||
* ieee80211_get_qos_ctl - get pointer to qos control bytes
|
||||
* @hdr: the frame
|
||||
*
|
||||
* The qos ctrl bytes come after the frame_control, duration, seq_num
|
||||
* and 3 or 4 addresses of length ETH_ALEN.
|
||||
* 3 addr: 2 + 2 + 2 + 3*6 = 24
|
||||
* 4 addr: 2 + 2 + 2 + 4*6 = 30
|
||||
*/
|
||||
static inline u8 *ieee80211_get_qos_ctl(struct ieee80211_hdr *hdr)
|
||||
{
|
||||
if (ieee80211_has_a4(hdr->frame_control))
|
||||
return (u8 *)hdr + 30;
|
||||
else
|
||||
return (u8 *)hdr + 24;
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_get_SA - get pointer to SA
|
||||
* @hdr: the frame
|
||||
*
|
||||
* Given an 802.11 frame, this function returns the offset
|
||||
* to the source address (SA). It does not verify that the
|
||||
* header is long enough to contain the address, and the
|
||||
* header must be long enough to contain the frame control
|
||||
* field.
|
||||
*
|
||||
* @hdr: the frame
|
||||
*/
|
||||
static inline u8 *ieee80211_get_SA(struct ieee80211_hdr *hdr)
|
||||
{
|
||||
u8 *raw = (u8 *) hdr;
|
||||
u8 tofrom = (*(raw+1)) & 3; /* get the TODS and FROMDS bits */
|
||||
|
||||
switch (tofrom) {
|
||||
case 2:
|
||||
return hdr->addr3;
|
||||
case 3:
|
||||
return hdr->addr4;
|
||||
}
|
||||
if (ieee80211_has_a4(hdr->frame_control))
|
||||
return hdr->addr4;
|
||||
if (ieee80211_has_fromds(hdr->frame_control))
|
||||
return hdr->addr3;
|
||||
return hdr->addr2;
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_get_DA - get pointer to DA
|
||||
* @hdr: the frame
|
||||
*
|
||||
* Given an 802.11 frame, this function returns the offset
|
||||
* to the destination address (DA). It does not verify that
|
||||
* the header is long enough to contain the address, and the
|
||||
* header must be long enough to contain the frame control
|
||||
* field.
|
||||
*
|
||||
* @hdr: the frame
|
||||
*/
|
||||
static inline u8 *ieee80211_get_DA(struct ieee80211_hdr *hdr)
|
||||
{
|
||||
u8 *raw = (u8 *) hdr;
|
||||
u8 to_ds = (*(raw+1)) & 1; /* get the TODS bit */
|
||||
|
||||
if (to_ds)
|
||||
if (ieee80211_has_tods(hdr->frame_control))
|
||||
return hdr->addr3;
|
||||
return hdr->addr1;
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_get_morefrag - determine whether the MOREFRAGS bit is set
|
||||
*
|
||||
* This function determines whether the "more fragments" bit is set
|
||||
* in the frame.
|
||||
*
|
||||
* @hdr: the frame
|
||||
*/
|
||||
static inline int ieee80211_get_morefrag(struct ieee80211_hdr *hdr)
|
||||
{
|
||||
return (le16_to_cpu(hdr->frame_control) &
|
||||
IEEE80211_FCTL_MOREFRAGS) != 0;
|
||||
else
|
||||
return hdr->addr1;
|
||||
}
|
||||
|
||||
#endif /* IEEE80211_H */
|
||||
|
|
|
|||
|
|
@ -4,8 +4,6 @@
|
|||
* Authors:
|
||||
* Lennert Buytenhek <buytenh@gnu.org>
|
||||
*
|
||||
* $Id: if_bridge.h,v 1.1 2000/02/18 16:47:01 davem Exp $
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
|
|
|
|||
|
|
@ -43,6 +43,9 @@ struct sockaddr_ll
|
|||
#define PACKET_COPY_THRESH 7
|
||||
#define PACKET_AUXDATA 8
|
||||
#define PACKET_ORIGDEV 9
|
||||
#define PACKET_VERSION 10
|
||||
#define PACKET_HDRLEN 11
|
||||
#define PACKET_RESERVE 12
|
||||
|
||||
struct tpacket_stats
|
||||
{
|
||||
|
|
@ -57,6 +60,7 @@ struct tpacket_auxdata
|
|||
__u32 tp_snaplen;
|
||||
__u16 tp_mac;
|
||||
__u16 tp_net;
|
||||
__u16 tp_vlan_tci;
|
||||
};
|
||||
|
||||
struct tpacket_hdr
|
||||
|
|
@ -79,6 +83,26 @@ struct tpacket_hdr
|
|||
#define TPACKET_ALIGN(x) (((x)+TPACKET_ALIGNMENT-1)&~(TPACKET_ALIGNMENT-1))
|
||||
#define TPACKET_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll))
|
||||
|
||||
struct tpacket2_hdr
|
||||
{
|
||||
__u32 tp_status;
|
||||
__u32 tp_len;
|
||||
__u32 tp_snaplen;
|
||||
__u16 tp_mac;
|
||||
__u16 tp_net;
|
||||
__u32 tp_sec;
|
||||
__u32 tp_nsec;
|
||||
__u16 tp_vlan_tci;
|
||||
};
|
||||
|
||||
#define TPACKET2_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll))
|
||||
|
||||
enum tpacket_versions
|
||||
{
|
||||
TPACKET_V1,
|
||||
TPACKET_V2,
|
||||
};
|
||||
|
||||
/*
|
||||
Frame structure:
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
/* $Id: if_ppp.h,v 1.21 2000/03/27 06:03:36 paulus Exp $ */
|
||||
|
||||
/*
|
||||
* if_ppp.h - Point-to-Point Protocol definitions.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -11,14 +11,13 @@
|
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* $Id: if_tun.h,v 1.2 2001/06/01 18:39:47 davem Exp $
|
||||
*/
|
||||
|
||||
#ifndef __IF_TUN_H
|
||||
#define __IF_TUN_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/if_ether.h>
|
||||
|
||||
/* Read queue size */
|
||||
#define TUN_READQ_SIZE 500
|
||||
|
|
@ -33,6 +32,7 @@
|
|||
#define TUN_NO_PI 0x0040
|
||||
#define TUN_ONE_QUEUE 0x0080
|
||||
#define TUN_PERSIST 0x0100
|
||||
#define TUN_VNET_HDR 0x0200
|
||||
|
||||
/* Ioctl defines */
|
||||
#define TUNSETNOCSUM _IOW('T', 200, int)
|
||||
|
|
@ -42,17 +42,43 @@
|
|||
#define TUNSETOWNER _IOW('T', 204, int)
|
||||
#define TUNSETLINK _IOW('T', 205, int)
|
||||
#define TUNSETGROUP _IOW('T', 206, int)
|
||||
#define TUNGETFEATURES _IOR('T', 207, unsigned int)
|
||||
#define TUNSETOFFLOAD _IOW('T', 208, unsigned int)
|
||||
#define TUNSETTXFILTER _IOW('T', 209, unsigned int)
|
||||
|
||||
/* TUNSETIFF ifr flags */
|
||||
#define IFF_TUN 0x0001
|
||||
#define IFF_TAP 0x0002
|
||||
#define IFF_NO_PI 0x1000
|
||||
#define IFF_ONE_QUEUE 0x2000
|
||||
#define IFF_VNET_HDR 0x4000
|
||||
|
||||
/* Features for GSO (TUNSETOFFLOAD). */
|
||||
#define TUN_F_CSUM 0x01 /* You can hand me unchecksummed packets. */
|
||||
#define TUN_F_TSO4 0x02 /* I can handle TSO for IPv4 packets */
|
||||
#define TUN_F_TSO6 0x04 /* I can handle TSO for IPv6 packets */
|
||||
#define TUN_F_TSO_ECN 0x08 /* I can handle TSO with ECN bits. */
|
||||
|
||||
/* Protocol info prepended to the packets (when IFF_NO_PI is not set) */
|
||||
#define TUN_PKT_STRIP 0x0001
|
||||
struct tun_pi {
|
||||
unsigned short flags;
|
||||
__u16 flags;
|
||||
__be16 proto;
|
||||
};
|
||||
#define TUN_PKT_STRIP 0x0001
|
||||
|
||||
/*
|
||||
* Filter spec (used for SETXXFILTER ioctls)
|
||||
* This stuff is applicable only to the TAP (Ethernet) devices.
|
||||
* If the count is zero the filter is disabled and the driver accepts
|
||||
* all packets (promisc mode).
|
||||
* If the filter is enabled in order to accept broadcast packets
|
||||
* broadcast addr must be explicitly included in the addr list.
|
||||
*/
|
||||
#define TUN_FLT_ALLMULTI 0x0001 /* Accept all multicast packets */
|
||||
struct tun_filter {
|
||||
__u16 flags; /* TUN_FLT_ flags see above */
|
||||
__u16 count; /* Number of addresses */
|
||||
__u8 addr[0][ETH_ALEN];
|
||||
};
|
||||
|
||||
#endif /* __IF_TUN_H */
|
||||
|
|
|
|||
|
|
@ -14,10 +14,6 @@
|
|||
#define _LINUX_IF_VLAN_H_
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
/* externally defined structs */
|
||||
struct hlist_node;
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
|
||||
|
|
@ -91,7 +87,7 @@ struct vlan_group {
|
|||
};
|
||||
|
||||
static inline struct net_device *vlan_group_get_device(struct vlan_group *vg,
|
||||
unsigned int vlan_id)
|
||||
u16 vlan_id)
|
||||
{
|
||||
struct net_device **array;
|
||||
array = vg->vlan_devices_arrays[vlan_id / VLAN_GROUP_ARRAY_PART_LEN];
|
||||
|
|
@ -99,7 +95,7 @@ static inline struct net_device *vlan_group_get_device(struct vlan_group *vg,
|
|||
}
|
||||
|
||||
static inline void vlan_group_set_device(struct vlan_group *vg,
|
||||
unsigned int vlan_id,
|
||||
u16 vlan_id,
|
||||
struct net_device *dev)
|
||||
{
|
||||
struct net_device **array;
|
||||
|
|
@ -109,164 +105,81 @@ static inline void vlan_group_set_device(struct vlan_group *vg,
|
|||
array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] = dev;
|
||||
}
|
||||
|
||||
struct vlan_priority_tci_mapping {
|
||||
u32 priority;
|
||||
unsigned short vlan_qos; /* This should be shifted when first set, so we only do it
|
||||
* at provisioning time.
|
||||
* ((skb->priority << 13) & 0xE000)
|
||||
*/
|
||||
struct vlan_priority_tci_mapping *next;
|
||||
};
|
||||
#define vlan_tx_tag_present(__skb) ((__skb)->vlan_tci)
|
||||
#define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci)
|
||||
|
||||
/* Holds information that makes sense if this device is a VLAN device. */
|
||||
struct vlan_dev_info {
|
||||
/** This will be the mapping that correlates skb->priority to
|
||||
* 3 bits of VLAN QOS tags...
|
||||
*/
|
||||
unsigned int nr_ingress_mappings;
|
||||
u32 ingress_priority_map[8];
|
||||
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
|
||||
extern struct net_device *vlan_dev_real_dev(const struct net_device *dev);
|
||||
extern u16 vlan_dev_vlan_id(const struct net_device *dev);
|
||||
|
||||
unsigned int nr_egress_mappings;
|
||||
struct vlan_priority_tci_mapping *egress_priority_map[16]; /* hash table */
|
||||
|
||||
unsigned short vlan_id; /* The VLAN Identifier for this interface. */
|
||||
unsigned short flags; /* (1 << 0) re_order_header This option will cause the
|
||||
* VLAN code to move around the ethernet header on
|
||||
* ingress to make the skb look **exactly** like it
|
||||
* came in from an ethernet port. This destroys some of
|
||||
* the VLAN information in the skb, but it fixes programs
|
||||
* like DHCP that use packet-filtering and don't understand
|
||||
* 802.1Q
|
||||
*/
|
||||
struct net_device *real_dev; /* the underlying device/interface */
|
||||
unsigned char real_dev_addr[ETH_ALEN];
|
||||
struct proc_dir_entry *dent; /* Holds the proc data */
|
||||
unsigned long cnt_inc_headroom_on_tx; /* How many times did we have to grow the skb on TX. */
|
||||
unsigned long cnt_encap_on_xmit; /* How many times did we have to encapsulate the skb on TX. */
|
||||
};
|
||||
|
||||
static inline struct vlan_dev_info *vlan_dev_info(const struct net_device *dev)
|
||||
extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
|
||||
u16 vlan_tci, int polling);
|
||||
#else
|
||||
static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev)
|
||||
{
|
||||
return netdev_priv(dev);
|
||||
BUG();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* inline functions */
|
||||
static inline __u32 vlan_get_ingress_priority(struct net_device *dev,
|
||||
unsigned short vlan_tag)
|
||||
static inline u16 vlan_dev_vlan_id(const struct net_device *dev)
|
||||
{
|
||||
struct vlan_dev_info *vip = vlan_dev_info(dev);
|
||||
|
||||
return vip->ingress_priority_map[(vlan_tag >> 13) & 0x7];
|
||||
BUG();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* VLAN tx hw acceleration helpers. */
|
||||
struct vlan_skb_tx_cookie {
|
||||
u32 magic;
|
||||
u32 vlan_tag;
|
||||
};
|
||||
|
||||
#define VLAN_TX_COOKIE_MAGIC 0x564c414e /* "VLAN" in ascii. */
|
||||
#define VLAN_TX_SKB_CB(__skb) ((struct vlan_skb_tx_cookie *)&((__skb)->cb[0]))
|
||||
#define vlan_tx_tag_present(__skb) \
|
||||
(VLAN_TX_SKB_CB(__skb)->magic == VLAN_TX_COOKIE_MAGIC)
|
||||
#define vlan_tx_tag_get(__skb) (VLAN_TX_SKB_CB(__skb)->vlan_tag)
|
||||
|
||||
/* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */
|
||||
static inline int __vlan_hwaccel_rx(struct sk_buff *skb,
|
||||
struct vlan_group *grp,
|
||||
unsigned short vlan_tag, int polling)
|
||||
static inline int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
|
||||
u16 vlan_tci, int polling)
|
||||
{
|
||||
struct net_device_stats *stats;
|
||||
|
||||
if (skb_bond_should_drop(skb)) {
|
||||
dev_kfree_skb_any(skb);
|
||||
return NET_RX_DROP;
|
||||
}
|
||||
|
||||
skb->dev = vlan_group_get_device(grp, vlan_tag & VLAN_VID_MASK);
|
||||
if (skb->dev == NULL) {
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
/* Not NET_RX_DROP, this is not being dropped
|
||||
* due to congestion.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
skb->dev->last_rx = jiffies;
|
||||
|
||||
stats = &skb->dev->stats;
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += skb->len;
|
||||
|
||||
skb->priority = vlan_get_ingress_priority(skb->dev, vlan_tag);
|
||||
switch (skb->pkt_type) {
|
||||
case PACKET_BROADCAST:
|
||||
break;
|
||||
|
||||
case PACKET_MULTICAST:
|
||||
stats->multicast++;
|
||||
break;
|
||||
|
||||
case PACKET_OTHERHOST:
|
||||
/* Our lower layer thinks this is not local, let's make sure.
|
||||
* This allows the VLAN to have a different MAC than the underlying
|
||||
* device, and still route correctly.
|
||||
*/
|
||||
if (!compare_ether_addr(eth_hdr(skb)->h_dest,
|
||||
skb->dev->dev_addr))
|
||||
skb->pkt_type = PACKET_HOST;
|
||||
break;
|
||||
};
|
||||
|
||||
return (polling ? netif_receive_skb(skb) : netif_rx(skb));
|
||||
BUG();
|
||||
return NET_XMIT_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* vlan_hwaccel_rx - netif_rx wrapper for VLAN RX acceleration
|
||||
* @skb: buffer
|
||||
* @grp: vlan group
|
||||
* @vlan_tci: VLAN TCI as received from the card
|
||||
*/
|
||||
static inline int vlan_hwaccel_rx(struct sk_buff *skb,
|
||||
struct vlan_group *grp,
|
||||
unsigned short vlan_tag)
|
||||
u16 vlan_tci)
|
||||
{
|
||||
return __vlan_hwaccel_rx(skb, grp, vlan_tag, 0);
|
||||
return __vlan_hwaccel_rx(skb, grp, vlan_tci, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* vlan_hwaccel_receive_skb - netif_receive_skb wrapper for VLAN RX acceleration
|
||||
* @skb: buffer
|
||||
* @grp: vlan group
|
||||
* @vlan_tci: VLAN TCI as received from the card
|
||||
*/
|
||||
static inline int vlan_hwaccel_receive_skb(struct sk_buff *skb,
|
||||
struct vlan_group *grp,
|
||||
unsigned short vlan_tag)
|
||||
u16 vlan_tci)
|
||||
{
|
||||
return __vlan_hwaccel_rx(skb, grp, vlan_tag, 1);
|
||||
return __vlan_hwaccel_rx(skb, grp, vlan_tci, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* __vlan_put_tag - regular VLAN tag inserting
|
||||
* @skb: skbuff to tag
|
||||
* @tag: VLAN tag to insert
|
||||
* @vlan_tci: VLAN TCI to insert
|
||||
*
|
||||
* Inserts the VLAN tag into @skb as part of the payload
|
||||
* Returns a VLAN tagged skb. If a new skb is created, @skb is freed.
|
||||
*
|
||||
*
|
||||
* Following the skb_unshare() example, in case of error, the calling function
|
||||
* doesn't have to worry about freeing the original skb.
|
||||
*/
|
||||
static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, unsigned short tag)
|
||||
static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, u16 vlan_tci)
|
||||
{
|
||||
struct vlan_ethhdr *veth;
|
||||
|
||||
if (skb_headroom(skb) < VLAN_HLEN) {
|
||||
struct sk_buff *sk_tmp = skb;
|
||||
skb = skb_realloc_headroom(sk_tmp, VLAN_HLEN);
|
||||
kfree_skb(sk_tmp);
|
||||
if (!skb) {
|
||||
printk(KERN_ERR "vlan: failed to realloc headroom\n");
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
skb = skb_unshare(skb, GFP_ATOMIC);
|
||||
if (!skb) {
|
||||
printk(KERN_ERR "vlan: failed to unshare skbuff\n");
|
||||
return NULL;
|
||||
}
|
||||
if (skb_cow_head(skb, VLAN_HLEN) < 0) {
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
veth = (struct vlan_ethhdr *)skb_push(skb, VLAN_HLEN);
|
||||
|
||||
/* Move the mac addresses to the beginning of the new header. */
|
||||
|
|
@ -275,12 +188,10 @@ static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, unsigned short
|
|||
/* first, the ethernet type */
|
||||
veth->h_vlan_proto = htons(ETH_P_8021Q);
|
||||
|
||||
/* now, the tag */
|
||||
veth->h_vlan_TCI = htons(tag);
|
||||
/* now, the TCI */
|
||||
veth->h_vlan_TCI = htons(vlan_tci);
|
||||
|
||||
skb->protocol = htons(ETH_P_8021Q);
|
||||
skb->mac_header -= VLAN_HLEN;
|
||||
skb->network_header -= VLAN_HLEN;
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
|
@ -288,18 +199,14 @@ static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, unsigned short
|
|||
/**
|
||||
* __vlan_hwaccel_put_tag - hardware accelerated VLAN inserting
|
||||
* @skb: skbuff to tag
|
||||
* @tag: VLAN tag to insert
|
||||
* @vlan_tci: VLAN TCI to insert
|
||||
*
|
||||
* Puts the VLAN tag in @skb->cb[] and lets the device do the rest
|
||||
* Puts the VLAN TCI in @skb->vlan_tci and lets the device do the rest
|
||||
*/
|
||||
static inline struct sk_buff *__vlan_hwaccel_put_tag(struct sk_buff *skb, unsigned short tag)
|
||||
static inline struct sk_buff *__vlan_hwaccel_put_tag(struct sk_buff *skb,
|
||||
u16 vlan_tci)
|
||||
{
|
||||
struct vlan_skb_tx_cookie *cookie;
|
||||
|
||||
cookie = VLAN_TX_SKB_CB(skb);
|
||||
cookie->magic = VLAN_TX_COOKIE_MAGIC;
|
||||
cookie->vlan_tag = tag;
|
||||
|
||||
skb->vlan_tci = vlan_tci;
|
||||
return skb;
|
||||
}
|
||||
|
||||
|
|
@ -308,28 +215,28 @@ static inline struct sk_buff *__vlan_hwaccel_put_tag(struct sk_buff *skb, unsign
|
|||
/**
|
||||
* vlan_put_tag - inserts VLAN tag according to device features
|
||||
* @skb: skbuff to tag
|
||||
* @tag: VLAN tag to insert
|
||||
* @vlan_tci: VLAN TCI to insert
|
||||
*
|
||||
* Assumes skb->dev is the target that will xmit this frame.
|
||||
* Returns a VLAN tagged skb.
|
||||
*/
|
||||
static inline struct sk_buff *vlan_put_tag(struct sk_buff *skb, unsigned short tag)
|
||||
static inline struct sk_buff *vlan_put_tag(struct sk_buff *skb, u16 vlan_tci)
|
||||
{
|
||||
if (skb->dev->features & NETIF_F_HW_VLAN_TX) {
|
||||
return __vlan_hwaccel_put_tag(skb, tag);
|
||||
return __vlan_hwaccel_put_tag(skb, vlan_tci);
|
||||
} else {
|
||||
return __vlan_put_tag(skb, tag);
|
||||
return __vlan_put_tag(skb, vlan_tci);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* __vlan_get_tag - get the VLAN ID that is part of the payload
|
||||
* @skb: skbuff to query
|
||||
* @tag: buffer to store vlaue
|
||||
*
|
||||
* @vlan_tci: buffer to store vlaue
|
||||
*
|
||||
* Returns error if the skb is not of VLAN type
|
||||
*/
|
||||
static inline int __vlan_get_tag(const struct sk_buff *skb, unsigned short *tag)
|
||||
static inline int __vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci)
|
||||
{
|
||||
struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb->data;
|
||||
|
||||
|
|
@ -337,29 +244,25 @@ static inline int __vlan_get_tag(const struct sk_buff *skb, unsigned short *tag)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
*tag = ntohs(veth->h_vlan_TCI);
|
||||
|
||||
*vlan_tci = ntohs(veth->h_vlan_TCI);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* __vlan_hwaccel_get_tag - get the VLAN ID that is in @skb->cb[]
|
||||
* @skb: skbuff to query
|
||||
* @tag: buffer to store vlaue
|
||||
*
|
||||
* Returns error if @skb->cb[] is not set correctly
|
||||
* @vlan_tci: buffer to store vlaue
|
||||
*
|
||||
* Returns error if @skb->vlan_tci is not set correctly
|
||||
*/
|
||||
static inline int __vlan_hwaccel_get_tag(const struct sk_buff *skb,
|
||||
unsigned short *tag)
|
||||
u16 *vlan_tci)
|
||||
{
|
||||
struct vlan_skb_tx_cookie *cookie;
|
||||
|
||||
cookie = VLAN_TX_SKB_CB(skb);
|
||||
if (cookie->magic == VLAN_TX_COOKIE_MAGIC) {
|
||||
*tag = cookie->vlan_tag;
|
||||
if (vlan_tx_tag_present(skb)) {
|
||||
*vlan_tci = skb->vlan_tci;
|
||||
return 0;
|
||||
} else {
|
||||
*tag = 0;
|
||||
*vlan_tci = 0;
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
|
@ -369,16 +272,16 @@ static inline int __vlan_hwaccel_get_tag(const struct sk_buff *skb,
|
|||
/**
|
||||
* vlan_get_tag - get the VLAN ID from the skb
|
||||
* @skb: skbuff to query
|
||||
* @tag: buffer to store vlaue
|
||||
*
|
||||
* @vlan_tci: buffer to store vlaue
|
||||
*
|
||||
* Returns error if the skb is not VLAN tagged
|
||||
*/
|
||||
static inline int vlan_get_tag(const struct sk_buff *skb, unsigned short *tag)
|
||||
static inline int vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci)
|
||||
{
|
||||
if (skb->dev->features & NETIF_F_HW_VLAN_TX) {
|
||||
return __vlan_hwaccel_get_tag(skb, tag);
|
||||
return __vlan_hwaccel_get_tag(skb, vlan_tci);
|
||||
} else {
|
||||
return __vlan_get_tag(skb, tag);
|
||||
return __vlan_get_tag(skb, vlan_tci);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -402,6 +305,7 @@ enum vlan_ioctl_cmds {
|
|||
|
||||
enum vlan_flags {
|
||||
VLAN_FLAG_REORDER_HDR = 0x1,
|
||||
VLAN_FLAG_GVRP = 0x2,
|
||||
};
|
||||
|
||||
enum vlan_name_types {
|
||||
|
|
|
|||
|
|
@ -228,7 +228,6 @@ extern int ip_mc_msfget(struct sock *sk, struct ip_msfilter *msf,
|
|||
extern int ip_mc_gsfget(struct sock *sk, struct group_filter *gsf,
|
||||
struct group_filter __user *optval, int __user *optlen);
|
||||
extern int ip_mc_sf_allow(struct sock *sk, __be32 local, __be32 rmt, int dif);
|
||||
extern void ip_mr_init(void);
|
||||
extern void ip_mc_init_dev(struct in_device *);
|
||||
extern void ip_mc_destroy_dev(struct in_device *);
|
||||
extern void ip_mc_up(struct in_device *);
|
||||
|
|
|
|||
|
|
@ -140,8 +140,8 @@ extern struct group_info init_groups;
|
|||
.nr_cpus_allowed = NR_CPUS, \
|
||||
}, \
|
||||
.tasks = LIST_HEAD_INIT(tsk.tasks), \
|
||||
.ptrace_children= LIST_HEAD_INIT(tsk.ptrace_children), \
|
||||
.ptrace_list = LIST_HEAD_INIT(tsk.ptrace_list), \
|
||||
.ptraced = LIST_HEAD_INIT(tsk.ptraced), \
|
||||
.ptrace_entry = LIST_HEAD_INIT(tsk.ptrace_entry), \
|
||||
.real_parent = &tsk, \
|
||||
.parent = &tsk, \
|
||||
.children = LIST_HEAD_INIT(tsk.children), \
|
||||
|
|
|
|||
|
|
@ -373,6 +373,8 @@ struct input_absinfo {
|
|||
|
||||
#define KEY_WIMAX 246
|
||||
|
||||
/* Range 248 - 255 is reserved for special needs of AT keyboard driver */
|
||||
|
||||
#define BTN_MISC 0x100
|
||||
#define BTN_0 0x100
|
||||
#define BTN_1 0x101
|
||||
|
|
@ -640,6 +642,8 @@ struct input_absinfo {
|
|||
#define SW_RFKILL_ALL 0x03 /* rfkill master switch, type "any"
|
||||
set = radio enabled */
|
||||
#define SW_RADIO SW_RFKILL_ALL /* deprecated */
|
||||
#define SW_MICROPHONE_INSERT 0x04 /* set = inserted */
|
||||
#define SW_DOCK 0x05 /* set = plugged into dock */
|
||||
#define SW_MAX 0x0f
|
||||
#define SW_CNT (SW_MAX+1)
|
||||
|
||||
|
|
@ -1215,11 +1219,6 @@ struct input_handle {
|
|||
struct list_head h_node;
|
||||
};
|
||||
|
||||
#define to_dev(n) container_of(n, struct input_dev, node)
|
||||
#define to_handler(n) container_of(n, struct input_handler, node)
|
||||
#define to_handle(n) container_of(n, struct input_handle, d_node)
|
||||
#define to_handle_h(n) container_of(n, struct input_handle, h_node)
|
||||
|
||||
struct input_dev *input_allocate_device(void);
|
||||
void input_free_device(struct input_dev *dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,3 @@
|
|||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef _IP6_TUNNEL_H
|
||||
#define _IP6_TUNNEL_H
|
||||
|
||||
|
|
|
|||
|
|
@ -163,6 +163,8 @@ struct ipv6_devconf {
|
|||
#ifdef CONFIG_IPV6_MROUTE
|
||||
__s32 mc_forwarding;
|
||||
#endif
|
||||
__s32 disable_ipv6;
|
||||
__s32 accept_dad;
|
||||
void *sysctl;
|
||||
};
|
||||
|
||||
|
|
@ -194,6 +196,8 @@ enum {
|
|||
DEVCONF_OPTIMISTIC_DAD,
|
||||
DEVCONF_ACCEPT_SOURCE_ROUTE,
|
||||
DEVCONF_MC_FORWARDING,
|
||||
DEVCONF_DISABLE_IPV6,
|
||||
DEVCONF_ACCEPT_DAD,
|
||||
DEVCONF_MAX
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -51,25 +51,21 @@
|
|||
*/
|
||||
struct stliport {
|
||||
unsigned long magic;
|
||||
struct tty_port port;
|
||||
unsigned int portnr;
|
||||
unsigned int panelnr;
|
||||
unsigned int brdnr;
|
||||
unsigned long state;
|
||||
unsigned int devnr;
|
||||
int flags;
|
||||
int baud_base;
|
||||
int custom_divisor;
|
||||
int close_delay;
|
||||
int closing_wait;
|
||||
int refcount;
|
||||
int openwaitcnt;
|
||||
int rc;
|
||||
int argsize;
|
||||
void *argp;
|
||||
unsigned int rxmarkmsk;
|
||||
struct tty_struct *tty;
|
||||
wait_queue_head_t open_wait;
|
||||
wait_queue_head_t close_wait;
|
||||
wait_queue_head_t raw_wait;
|
||||
struct asysigs asig;
|
||||
unsigned long addr;
|
||||
|
|
|
|||
|
|
@ -2,8 +2,6 @@
|
|||
#define _LINUX_JOYSTICK_H
|
||||
|
||||
/*
|
||||
* $Id: joystick.h,v 1.3 2000/11/30 11:07:05 vojtech Exp $
|
||||
*
|
||||
* Copyright (C) 1996-2000 Vojtech Pavlik
|
||||
*
|
||||
* Sponsored by SuSE
|
||||
|
|
|
|||
|
|
@ -173,6 +173,30 @@ struct kvm_run {
|
|||
};
|
||||
};
|
||||
|
||||
/* for KVM_REGISTER_COALESCED_MMIO / KVM_UNREGISTER_COALESCED_MMIO */
|
||||
|
||||
struct kvm_coalesced_mmio_zone {
|
||||
__u64 addr;
|
||||
__u32 size;
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
struct kvm_coalesced_mmio {
|
||||
__u64 phys_addr;
|
||||
__u32 len;
|
||||
__u32 pad;
|
||||
__u8 data[8];
|
||||
};
|
||||
|
||||
struct kvm_coalesced_mmio_ring {
|
||||
__u32 first, last;
|
||||
struct kvm_coalesced_mmio coalesced_mmio[0];
|
||||
};
|
||||
|
||||
#define KVM_COALESCED_MMIO_MAX \
|
||||
((PAGE_SIZE - sizeof(struct kvm_coalesced_mmio_ring)) / \
|
||||
sizeof(struct kvm_coalesced_mmio))
|
||||
|
||||
/* for KVM_TRANSLATE */
|
||||
struct kvm_translation {
|
||||
/* in */
|
||||
|
|
@ -294,14 +318,14 @@ struct kvm_trace_rec {
|
|||
__u32 vcpu_id;
|
||||
union {
|
||||
struct {
|
||||
__u32 cycle_lo, cycle_hi;
|
||||
__u64 cycle_u64;
|
||||
__u32 extra_u32[KVM_TRC_EXTRA_MAX];
|
||||
} cycle;
|
||||
struct {
|
||||
__u32 extra_u32[KVM_TRC_EXTRA_MAX];
|
||||
} nocycle;
|
||||
} u;
|
||||
};
|
||||
} __attribute__((packed));
|
||||
|
||||
#define KVMIO 0xAE
|
||||
|
||||
|
|
@ -346,6 +370,7 @@ struct kvm_trace_rec {
|
|||
#define KVM_CAP_NOP_IO_DELAY 12
|
||||
#define KVM_CAP_PV_MMU 13
|
||||
#define KVM_CAP_MP_STATE 14
|
||||
#define KVM_CAP_COALESCED_MMIO 15
|
||||
|
||||
/*
|
||||
* ioctls for VM fds
|
||||
|
|
@ -371,6 +396,10 @@ struct kvm_trace_rec {
|
|||
#define KVM_CREATE_PIT _IO(KVMIO, 0x64)
|
||||
#define KVM_GET_PIT _IOWR(KVMIO, 0x65, struct kvm_pit_state)
|
||||
#define KVM_SET_PIT _IOR(KVMIO, 0x66, struct kvm_pit_state)
|
||||
#define KVM_REGISTER_COALESCED_MMIO \
|
||||
_IOW(KVMIO, 0x67, struct kvm_coalesced_mmio_zone)
|
||||
#define KVM_UNREGISTER_COALESCED_MMIO \
|
||||
_IOW(KVMIO, 0x68, struct kvm_coalesced_mmio_zone)
|
||||
|
||||
/*
|
||||
* ioctls for vcpu fds
|
||||
|
|
|
|||
|
|
@ -52,7 +52,8 @@ struct kvm_io_bus {
|
|||
|
||||
void kvm_io_bus_init(struct kvm_io_bus *bus);
|
||||
void kvm_io_bus_destroy(struct kvm_io_bus *bus);
|
||||
struct kvm_io_device *kvm_io_bus_find_dev(struct kvm_io_bus *bus, gpa_t addr);
|
||||
struct kvm_io_device *kvm_io_bus_find_dev(struct kvm_io_bus *bus,
|
||||
gpa_t addr, int len, int is_write);
|
||||
void kvm_io_bus_register_dev(struct kvm_io_bus *bus,
|
||||
struct kvm_io_device *dev);
|
||||
|
||||
|
|
@ -116,6 +117,10 @@ struct kvm {
|
|||
struct kvm_vm_stat stat;
|
||||
struct kvm_arch arch;
|
||||
atomic_t users_count;
|
||||
#ifdef KVM_COALESCED_MMIO_PAGE_OFFSET
|
||||
struct kvm_coalesced_mmio_dev *coalesced_mmio_dev;
|
||||
struct kvm_coalesced_mmio_ring *coalesced_mmio_ring;
|
||||
#endif
|
||||
};
|
||||
|
||||
/* The guest did something we don't support. */
|
||||
|
|
@ -135,9 +140,6 @@ void kvm_vcpu_uninit(struct kvm_vcpu *vcpu);
|
|||
void vcpu_load(struct kvm_vcpu *vcpu);
|
||||
void vcpu_put(struct kvm_vcpu *vcpu);
|
||||
|
||||
void decache_vcpus_on_cpu(int cpu);
|
||||
|
||||
|
||||
int kvm_init(void *opaque, unsigned int vcpu_size,
|
||||
struct module *module);
|
||||
void kvm_exit(void);
|
||||
|
|
@ -166,6 +168,7 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
|
|||
struct kvm_userspace_memory_region *mem,
|
||||
struct kvm_memory_slot old,
|
||||
int user_alloc);
|
||||
void kvm_arch_flush_shadow(struct kvm *kvm);
|
||||
gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn);
|
||||
struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn);
|
||||
unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn);
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@ void ps2_init(struct ps2dev *ps2dev, struct serio *serio);
|
|||
int ps2_sendbyte(struct ps2dev *ps2dev, unsigned char byte, int timeout);
|
||||
void ps2_drain(struct ps2dev *ps2dev, int maxbytes, int timeout);
|
||||
int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command);
|
||||
int ps2_schedule_command(struct ps2dev *ps2dev, unsigned char *param, int command);
|
||||
int ps2_handle_ack(struct ps2dev *ps2dev, unsigned char data);
|
||||
int ps2_handle_response(struct ps2dev *ps2dev, unsigned char data);
|
||||
void ps2_cmd_aborted(struct ps2dev *ps2dev);
|
||||
|
|
|
|||
|
|
@ -200,10 +200,12 @@ typedef int (*nlm_host_match_fn_t)(void *cur, struct nlm_host *ref);
|
|||
* Server-side lock handling
|
||||
*/
|
||||
__be32 nlmsvc_lock(struct svc_rqst *, struct nlm_file *,
|
||||
struct nlm_lock *, int, struct nlm_cookie *);
|
||||
struct nlm_host *, struct nlm_lock *, int,
|
||||
struct nlm_cookie *);
|
||||
__be32 nlmsvc_unlock(struct nlm_file *, struct nlm_lock *);
|
||||
__be32 nlmsvc_testlock(struct svc_rqst *, struct nlm_file *,
|
||||
struct nlm_lock *, struct nlm_lock *, struct nlm_cookie *);
|
||||
struct nlm_host *, struct nlm_lock *,
|
||||
struct nlm_lock *, struct nlm_cookie *);
|
||||
__be32 nlmsvc_cancel_blocked(struct nlm_file *, struct nlm_lock *);
|
||||
unsigned long nlmsvc_retry_blocked(void);
|
||||
void nlmsvc_traverse_blocks(struct nlm_host *, struct nlm_file *,
|
||||
|
|
@ -224,7 +226,7 @@ void nlmsvc_invalidate_all(void);
|
|||
* Cluster failover support
|
||||
*/
|
||||
int nlmsvc_unlock_all_by_sb(struct super_block *sb);
|
||||
int nlmsvc_unlock_all_by_ip(__be32 server_addr);
|
||||
int nlmsvc_unlock_all_by_ip(struct sockaddr *server_addr);
|
||||
|
||||
static inline struct inode *nlmsvc_file_inode(struct nlm_file *file)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Copyright 2001 Compaq Computer Corporation.
|
||||
* Copyright 2007 OpendHand.
|
||||
* Copyright 2007-2008 OpenedHand Ltd.
|
||||
*/
|
||||
|
||||
#ifndef __ASIC3_H__
|
||||
|
|
@ -16,43 +16,22 @@
|
|||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct asic3 {
|
||||
void __iomem *mapping;
|
||||
unsigned int bus_shift;
|
||||
unsigned int irq_nr;
|
||||
unsigned int irq_base;
|
||||
spinlock_t lock;
|
||||
u16 irq_bothedge[4];
|
||||
struct device *dev;
|
||||
};
|
||||
|
||||
struct asic3_platform_data {
|
||||
struct {
|
||||
u32 dir;
|
||||
u32 init;
|
||||
u32 sleep_mask;
|
||||
u32 sleep_out;
|
||||
u32 batt_fault_out;
|
||||
u32 sleep_conf;
|
||||
u32 alt_function;
|
||||
} gpio_a, gpio_b, gpio_c, gpio_d;
|
||||
|
||||
unsigned int bus_shift;
|
||||
u16 *gpio_config;
|
||||
unsigned int gpio_config_num;
|
||||
|
||||
unsigned int irq_base;
|
||||
|
||||
struct platform_device **children;
|
||||
unsigned int n_children;
|
||||
unsigned int gpio_base;
|
||||
};
|
||||
|
||||
int asic3_gpio_get_value(struct asic3 *asic, unsigned gpio);
|
||||
void asic3_gpio_set_value(struct asic3 *asic, unsigned gpio, int val);
|
||||
|
||||
#define ASIC3_NUM_GPIO_BANKS 4
|
||||
#define ASIC3_GPIOS_PER_BANK 16
|
||||
#define ASIC3_NUM_GPIOS 64
|
||||
#define ASIC3_NR_IRQS ASIC3_NUM_GPIOS + 6
|
||||
|
||||
#define ASIC3_TO_GPIO(gpio) (NR_BUILTIN_GPIO + (gpio))
|
||||
|
||||
#define ASIC3_GPIO_BANK_A 0
|
||||
#define ASIC3_GPIO_BANK_B 1
|
||||
#define ASIC3_GPIO_BANK_C 2
|
||||
|
|
@ -64,32 +43,89 @@ void asic3_gpio_set_value(struct asic3 *asic, unsigned gpio, int val);
|
|||
/* All offsets below are specified with this address bus shift */
|
||||
#define ASIC3_DEFAULT_ADDR_SHIFT 2
|
||||
|
||||
#define ASIC3_OFFSET(base, reg) (ASIC3_##base##_Base + ASIC3_##base##_##reg)
|
||||
#define ASIC3_OFFSET(base, reg) (ASIC3_##base##_BASE + ASIC3_##base##_##reg)
|
||||
#define ASIC3_GPIO_OFFSET(base, reg) \
|
||||
(ASIC3_GPIO_##base##_Base + ASIC3_GPIO_##reg)
|
||||
(ASIC3_GPIO_##base##_BASE + ASIC3_GPIO_##reg)
|
||||
|
||||
#define ASIC3_GPIO_A_Base 0x0000
|
||||
#define ASIC3_GPIO_B_Base 0x0100
|
||||
#define ASIC3_GPIO_C_Base 0x0200
|
||||
#define ASIC3_GPIO_D_Base 0x0300
|
||||
#define ASIC3_GPIO_A_BASE 0x0000
|
||||
#define ASIC3_GPIO_B_BASE 0x0100
|
||||
#define ASIC3_GPIO_C_BASE 0x0200
|
||||
#define ASIC3_GPIO_D_BASE 0x0300
|
||||
|
||||
#define ASIC3_GPIO_Mask 0x00 /* R/W 0:don't mask */
|
||||
#define ASIC3_GPIO_Direction 0x04 /* R/W 0:input */
|
||||
#define ASIC3_GPIO_Out 0x08 /* R/W 0:output low */
|
||||
#define ASIC3_GPIO_TriggerType 0x0c /* R/W 0:level */
|
||||
#define ASIC3_GPIO_EdgeTrigger 0x10 /* R/W 0:falling */
|
||||
#define ASIC3_GPIO_LevelTrigger 0x14 /* R/W 0:low level detect */
|
||||
#define ASIC3_GPIO_SleepMask 0x18 /* R/W 0:don't mask in sleep mode */
|
||||
#define ASIC3_GPIO_SleepOut 0x1c /* R/W level 0:low in sleep mode */
|
||||
#define ASIC3_GPIO_BattFaultOut 0x20 /* R/W level 0:low in batt_fault */
|
||||
#define ASIC3_GPIO_IntStatus 0x24 /* R/W 0:none, 1:detect */
|
||||
#define ASIC3_GPIO_AltFunction 0x28 /* R/W 1:LED register control */
|
||||
#define ASIC3_GPIO_SleepConf 0x2c /*
|
||||
#define ASIC3_GPIO_TO_BANK(gpio) ((gpio) >> 4)
|
||||
#define ASIC3_GPIO_TO_BIT(gpio) ((gpio) - \
|
||||
(ASIC3_GPIOS_PER_BANK * ((gpio) >> 4)))
|
||||
#define ASIC3_GPIO_TO_MASK(gpio) (1 << ASIC3_GPIO_TO_BIT(gpio))
|
||||
#define ASIC3_GPIO_TO_BASE(gpio) (ASIC3_GPIO_A_BASE + (((gpio) >> 4) * 0x0100))
|
||||
#define ASIC3_BANK_TO_BASE(bank) (ASIC3_GPIO_A_BASE + ((bank) * 0x100))
|
||||
|
||||
#define ASIC3_GPIO_MASK 0x00 /* R/W 0:don't mask */
|
||||
#define ASIC3_GPIO_DIRECTION 0x04 /* R/W 0:input */
|
||||
#define ASIC3_GPIO_OUT 0x08 /* R/W 0:output low */
|
||||
#define ASIC3_GPIO_TRIGGER_TYPE 0x0c /* R/W 0:level */
|
||||
#define ASIC3_GPIO_EDGE_TRIGGER 0x10 /* R/W 0:falling */
|
||||
#define ASIC3_GPIO_LEVEL_TRIGGER 0x14 /* R/W 0:low level detect */
|
||||
#define ASIC3_GPIO_SLEEP_MASK 0x18 /* R/W 0:don't mask in sleep mode */
|
||||
#define ASIC3_GPIO_SLEEP_OUT 0x1c /* R/W level 0:low in sleep mode */
|
||||
#define ASIC3_GPIO_BAT_FAULT_OUT 0x20 /* R/W level 0:low in batt_fault */
|
||||
#define ASIC3_GPIO_INT_STATUS 0x24 /* R/W 0:none, 1:detect */
|
||||
#define ASIC3_GPIO_ALT_FUNCTION 0x28 /* R/W 1:LED register control */
|
||||
#define ASIC3_GPIO_SLEEP_CONF 0x2c /*
|
||||
* R/W bit 1: autosleep
|
||||
* 0: disable gposlpout in normal mode,
|
||||
* enable gposlpout in sleep mode.
|
||||
*/
|
||||
#define ASIC3_GPIO_Status 0x30 /* R Pin status */
|
||||
#define ASIC3_GPIO_STATUS 0x30 /* R Pin status */
|
||||
|
||||
/*
|
||||
* ASIC3 GPIO config
|
||||
*
|
||||
* Bits 0..6 gpio number
|
||||
* Bits 7..13 Alternate function
|
||||
* Bit 14 Direction
|
||||
* Bit 15 Initial value
|
||||
*
|
||||
*/
|
||||
#define ASIC3_CONFIG_GPIO_PIN(config) ((config) & 0x7f)
|
||||
#define ASIC3_CONFIG_GPIO_ALT(config) (((config) & (0x7f << 7)) >> 7)
|
||||
#define ASIC3_CONFIG_GPIO_DIR(config) ((config & (1 << 14)) >> 14)
|
||||
#define ASIC3_CONFIG_GPIO_INIT(config) ((config & (1 << 15)) >> 15)
|
||||
#define ASIC3_CONFIG_GPIO(gpio, alt, dir, init) (((gpio) & 0x7f) \
|
||||
| (((alt) & 0x7f) << 7) | (((dir) & 0x1) << 14) \
|
||||
| (((init) & 0x1) << 15))
|
||||
#define ASIC3_CONFIG_GPIO_DEFAULT(gpio, dir, init) \
|
||||
ASIC3_CONFIG_GPIO((gpio), 0, (dir), (init))
|
||||
#define ASIC3_CONFIG_GPIO_DEFAULT_OUT(gpio, init) \
|
||||
ASIC3_CONFIG_GPIO((gpio), 0, 1, (init))
|
||||
|
||||
/*
|
||||
* Alternate functions
|
||||
*/
|
||||
#define ASIC3_GPIOA11_PWM0 ASIC3_CONFIG_GPIO(11, 1, 1, 0)
|
||||
#define ASIC3_GPIOA12_PWM1 ASIC3_CONFIG_GPIO(12, 1, 1, 0)
|
||||
#define ASIC3_GPIOA15_CONTROL_CX ASIC3_CONFIG_GPIO(15, 1, 1, 0)
|
||||
#define ASIC3_GPIOC0_LED0 ASIC3_CONFIG_GPIO(32, 1, 1, 0)
|
||||
#define ASIC3_GPIOC1_LED1 ASIC3_CONFIG_GPIO(33, 1, 1, 0)
|
||||
#define ASIC3_GPIOC2_LED2 ASIC3_CONFIG_GPIO(34, 1, 1, 0)
|
||||
#define ASIC3_GPIOC3_SPI_RXD ASIC3_CONFIG_GPIO(35, 1, 0, 0)
|
||||
#define ASIC3_GPIOC4_CF_nCD ASIC3_CONFIG_GPIO(36, 1, 0, 0)
|
||||
#define ASIC3_GPIOC4_SPI_TXD ASIC3_CONFIG_GPIO(36, 1, 1, 0)
|
||||
#define ASIC3_GPIOC5_SPI_CLK ASIC3_CONFIG_GPIO(37, 1, 1, 0)
|
||||
#define ASIC3_GPIOC5_nCIOW ASIC3_CONFIG_GPIO(37, 1, 1, 0)
|
||||
#define ASIC3_GPIOC6_nCIOR ASIC3_CONFIG_GPIO(38, 1, 1, 0)
|
||||
#define ASIC3_GPIOC7_nPCE_1 ASIC3_CONFIG_GPIO(39, 1, 0, 0)
|
||||
#define ASIC3_GPIOC8_nPCE_2 ASIC3_CONFIG_GPIO(40, 1, 0, 0)
|
||||
#define ASIC3_GPIOC9_nPOE ASIC3_CONFIG_GPIO(41, 1, 0, 0)
|
||||
#define ASIC3_GPIOC10_nPWE ASIC3_CONFIG_GPIO(42, 1, 0, 0)
|
||||
#define ASIC3_GPIOC11_PSKTSEL ASIC3_CONFIG_GPIO(43, 1, 0, 0)
|
||||
#define ASIC3_GPIOC12_nPREG ASIC3_CONFIG_GPIO(44, 1, 0, 0)
|
||||
#define ASIC3_GPIOC13_nPWAIT ASIC3_CONFIG_GPIO(45, 1, 1, 0)
|
||||
#define ASIC3_GPIOC14_nPIOIS16 ASIC3_CONFIG_GPIO(46, 1, 1, 0)
|
||||
#define ASIC3_GPIOC15_nPIOR ASIC3_CONFIG_GPIO(47, 1, 0, 0)
|
||||
#define ASIC3_GPIOD11_nCIOIS16 ASIC3_CONFIG_GPIO(59, 1, 0, 0)
|
||||
#define ASIC3_GPIOD12_nCWAIT ASIC3_CONFIG_GPIO(60, 1, 0, 0)
|
||||
#define ASIC3_GPIOD15_nPIOW ASIC3_CONFIG_GPIO(63, 1, 0, 0)
|
||||
|
||||
|
||||
#define ASIC3_SPI_Base 0x0400
|
||||
#define ASIC3_SPI_Control 0x0000
|
||||
|
|
@ -128,7 +164,7 @@ void asic3_gpio_set_value(struct asic3 *asic, unsigned gpio, int val);
|
|||
#define LED_AUTOSTOP (1 << 5) /* LED ON/OFF auto stop 0:disable, 1:enable */
|
||||
#define LED_ALWAYS (1 << 6) /* LED Interrupt Mask 0:No mask, 1:mask */
|
||||
|
||||
#define ASIC3_CLOCK_Base 0x0A00
|
||||
#define ASIC3_CLOCK_BASE 0x0A00
|
||||
#define ASIC3_CLOCK_CDEX 0x00
|
||||
#define ASIC3_CLOCK_SEL 0x04
|
||||
|
||||
|
|
@ -159,12 +195,12 @@ void asic3_gpio_set_value(struct asic3 *asic, unsigned gpio, int val);
|
|||
#define CLOCK_SEL_CX (1 << 2)
|
||||
|
||||
|
||||
#define ASIC3_INTR_Base 0x0B00
|
||||
#define ASIC3_INTR_BASE 0x0B00
|
||||
|
||||
#define ASIC3_INTR_IntMask 0x00 /* Interrupt mask control */
|
||||
#define ASIC3_INTR_PIntStat 0x04 /* Peripheral interrupt status */
|
||||
#define ASIC3_INTR_IntCPS 0x08 /* Interrupt timer clock pre-scale */
|
||||
#define ASIC3_INTR_IntTBS 0x0c /* Interrupt timer set */
|
||||
#define ASIC3_INTR_INT_MASK 0x00 /* Interrupt mask control */
|
||||
#define ASIC3_INTR_P_INT_STAT 0x04 /* Peripheral interrupt status */
|
||||
#define ASIC3_INTR_INT_CPS 0x08 /* Interrupt timer clock pre-scale */
|
||||
#define ASIC3_INTR_INT_TBS 0x0c /* Interrupt timer set */
|
||||
|
||||
#define ASIC3_INTMASK_GINTMASK (1 << 0) /* Global INTs mask 1:enable */
|
||||
#define ASIC3_INTMASK_GINTEL (1 << 1) /* 1: rising edge, 0: hi level */
|
||||
|
|
@ -227,44 +263,12 @@ void asic3_gpio_set_value(struct asic3 *asic, unsigned gpio, int val);
|
|||
#define ASIC3_EXTCF_CF_SLEEP (1 << 15) /* CF sleep mode control */
|
||||
|
||||
/*********************************************
|
||||
* The Onewire interface registers
|
||||
*
|
||||
* OWM_CMD
|
||||
* OWM_DAT
|
||||
* OWM_INTR
|
||||
* OWM_INTEN
|
||||
* OWM_CLKDIV
|
||||
* The Onewire interface (DS1WM) is handled
|
||||
* by the ds1wm driver.
|
||||
*
|
||||
*********************************************/
|
||||
|
||||
#define ASIC3_OWM_Base 0xC00
|
||||
|
||||
#define ASIC3_OWM_CMD 0x00
|
||||
#define ASIC3_OWM_DAT 0x04
|
||||
#define ASIC3_OWM_INTR 0x08
|
||||
#define ASIC3_OWM_INTEN 0x0C
|
||||
#define ASIC3_OWM_CLKDIV 0x10
|
||||
|
||||
#define ASIC3_OWM_CMD_ONEWR (1 << 0)
|
||||
#define ASIC3_OWM_CMD_SRA (1 << 1)
|
||||
#define ASIC3_OWM_CMD_DQO (1 << 2)
|
||||
#define ASIC3_OWM_CMD_DQI (1 << 3)
|
||||
|
||||
#define ASIC3_OWM_INTR_PD (1 << 0)
|
||||
#define ASIC3_OWM_INTR_PDR (1 << 1)
|
||||
#define ASIC3_OWM_INTR_TBE (1 << 2)
|
||||
#define ASIC3_OWM_INTR_TEMP (1 << 3)
|
||||
#define ASIC3_OWM_INTR_RBF (1 << 4)
|
||||
|
||||
#define ASIC3_OWM_INTEN_EPD (1 << 0)
|
||||
#define ASIC3_OWM_INTEN_IAS (1 << 1)
|
||||
#define ASIC3_OWM_INTEN_ETBE (1 << 2)
|
||||
#define ASIC3_OWM_INTEN_ETMT (1 << 3)
|
||||
#define ASIC3_OWM_INTEN_ERBF (1 << 4)
|
||||
|
||||
#define ASIC3_OWM_CLKDIV_PRE (3 << 0) /* two bits wide at bit 0 */
|
||||
#define ASIC3_OWM_CLKDIV_DIV (7 << 2) /* 3 bits wide at bit 2 */
|
||||
|
||||
#define ASIC3_OWM_BASE 0xC00
|
||||
|
||||
/*****************************************************************************
|
||||
* The SD configuration registers are at a completely different location
|
||||
|
|
@ -492,6 +496,7 @@ void asic3_gpio_set_value(struct asic3 *asic, unsigned gpio, int val);
|
|||
#define ASIC3_SDIO_CTRL_LEDCtrl 0x7C
|
||||
#define ASIC3_SDIO_CTRL_SoftwareReset 0x1C0
|
||||
|
||||
#define ASIC3_MAP_SIZE 0x2000
|
||||
#define ASIC3_MAP_SIZE_32BIT 0x2000
|
||||
#define ASIC3_MAP_SIZE_16BIT 0x1000
|
||||
|
||||
#endif /* __ASIC3_H__ */
|
||||
|
|
|
|||
|
|
@ -144,11 +144,37 @@ static inline int ip_mroute_opt(int opt)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IP_MROUTE
|
||||
extern int ip_mroute_setsockopt(struct sock *, int, char __user *, int);
|
||||
extern int ip_mroute_getsockopt(struct sock *, int, char __user *, int __user *);
|
||||
extern int ipmr_ioctl(struct sock *sk, int cmd, void __user *arg);
|
||||
extern void ip_mr_init(void);
|
||||
extern int ip_mr_init(void);
|
||||
#else
|
||||
static inline
|
||||
int ip_mroute_setsockopt(struct sock *sock,
|
||||
int optname, char __user *optval, int optlen)
|
||||
{
|
||||
return -ENOPROTOOPT;
|
||||
}
|
||||
|
||||
static inline
|
||||
int ip_mroute_getsockopt(struct sock *sock,
|
||||
int optname, char __user *optval, int __user *optlen)
|
||||
{
|
||||
return -ENOPROTOOPT;
|
||||
}
|
||||
|
||||
static inline
|
||||
int ipmr_ioctl(struct sock *sk, int cmd, void __user *arg)
|
||||
{
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
static inline int ip_mr_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct vif_device
|
||||
{
|
||||
|
|
|
|||
|
|
@ -131,11 +131,44 @@ static inline int ip6_mroute_opt(int opt)
|
|||
|
||||
struct sock;
|
||||
|
||||
#ifdef CONFIG_IPV6_MROUTE
|
||||
extern int ip6_mroute_setsockopt(struct sock *, int, char __user *, int);
|
||||
extern int ip6_mroute_getsockopt(struct sock *, int, char __user *, int __user *);
|
||||
extern int ip6_mr_input(struct sk_buff *skb);
|
||||
extern int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg);
|
||||
extern void ip6_mr_init(void);
|
||||
extern int ip6_mr_init(void);
|
||||
extern void ip6_mr_cleanup(void);
|
||||
#else
|
||||
static inline
|
||||
int ip6_mroute_setsockopt(struct sock *sock,
|
||||
int optname, char __user *optval, int optlen)
|
||||
{
|
||||
return -ENOPROTOOPT;
|
||||
}
|
||||
|
||||
static inline
|
||||
int ip6_mroute_getsockopt(struct sock *sock,
|
||||
int optname, char __user *optval, int __user *optlen)
|
||||
{
|
||||
return -ENOPROTOOPT;
|
||||
}
|
||||
|
||||
static inline
|
||||
int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg)
|
||||
{
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
static inline int ip6_mr_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void ip6_mr_cleanup(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct mif_device
|
||||
{
|
||||
|
|
|
|||
|
|
@ -17,30 +17,59 @@
|
|||
|
||||
struct mv643xx_eth_shared_platform_data {
|
||||
struct mbus_dram_target_info *dram;
|
||||
unsigned int t_clk;
|
||||
unsigned int t_clk;
|
||||
};
|
||||
|
||||
struct mv643xx_eth_platform_data {
|
||||
/*
|
||||
* Pointer back to our parent instance, and our port number.
|
||||
*/
|
||||
struct platform_device *shared;
|
||||
int port_number;
|
||||
int port_number;
|
||||
|
||||
/*
|
||||
* Whether a PHY is present, and if yes, at which address.
|
||||
*/
|
||||
struct platform_device *shared_smi;
|
||||
int force_phy_addr;
|
||||
int phy_addr;
|
||||
|
||||
u16 force_phy_addr; /* force override if phy_addr == 0 */
|
||||
u16 phy_addr;
|
||||
/*
|
||||
* Use this MAC address if it is valid, overriding the
|
||||
* address that is already in the hardware.
|
||||
*/
|
||||
u8 mac_addr[6];
|
||||
|
||||
/* If speed is 0, then speed and duplex are autonegotiated. */
|
||||
int speed; /* 0, SPEED_10, SPEED_100, SPEED_1000 */
|
||||
int duplex; /* DUPLEX_HALF or DUPLEX_FULL */
|
||||
/*
|
||||
* If speed is 0, autonegotiation is enabled.
|
||||
* Valid values for speed: 0, SPEED_10, SPEED_100, SPEED_1000.
|
||||
* Valid values for duplex: DUPLEX_HALF, DUPLEX_FULL.
|
||||
*/
|
||||
int speed;
|
||||
int duplex;
|
||||
|
||||
/* non-zero values of the following fields override defaults */
|
||||
u32 tx_queue_size;
|
||||
u32 rx_queue_size;
|
||||
u32 tx_sram_addr;
|
||||
u32 tx_sram_size;
|
||||
u32 rx_sram_addr;
|
||||
u32 rx_sram_size;
|
||||
u8 mac_addr[6]; /* mac address if non-zero*/
|
||||
/*
|
||||
* Which RX/TX queues to use.
|
||||
*/
|
||||
int rx_queue_mask;
|
||||
int tx_queue_mask;
|
||||
|
||||
/*
|
||||
* Override default RX/TX queue sizes if nonzero.
|
||||
*/
|
||||
int rx_queue_size;
|
||||
int tx_queue_size;
|
||||
|
||||
/*
|
||||
* Use on-chip SRAM for RX/TX descriptors if size is nonzero
|
||||
* and sufficient to contain all descriptors for the requested
|
||||
* ring sizes.
|
||||
*/
|
||||
unsigned long rx_sram_addr;
|
||||
int rx_sram_size;
|
||||
unsigned long tx_sram_addr;
|
||||
int tx_sram_size;
|
||||
};
|
||||
|
||||
#endif /* __LINUX_MV643XX_ETH_H */
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -106,23 +106,23 @@ enum sock_shutdown_cmd {
|
|||
/**
|
||||
* struct socket - general BSD socket
|
||||
* @state: socket state (%SS_CONNECTED, etc)
|
||||
* @type: socket type (%SOCK_STREAM, etc)
|
||||
* @flags: socket flags (%SOCK_ASYNC_NOSPACE, etc)
|
||||
* @ops: protocol specific socket operations
|
||||
* @fasync_list: Asynchronous wake up list
|
||||
* @file: File back pointer for gc
|
||||
* @sk: internal networking protocol agnostic socket representation
|
||||
* @wait: wait queue for several uses
|
||||
* @type: socket type (%SOCK_STREAM, etc)
|
||||
*/
|
||||
struct socket {
|
||||
socket_state state;
|
||||
short type;
|
||||
unsigned long flags;
|
||||
const struct proto_ops *ops;
|
||||
struct fasync_struct *fasync_list;
|
||||
struct file *file;
|
||||
struct sock *sk;
|
||||
wait_queue_head_t wait;
|
||||
short type;
|
||||
};
|
||||
|
||||
struct vm_area_struct;
|
||||
|
|
|
|||
|
|
@ -118,14 +118,6 @@ struct wireless_dev;
|
|||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
struct net_device_subqueue
|
||||
{
|
||||
/* Give a control state for each queue. This struct may contain
|
||||
* per-queue locks in the future.
|
||||
*/
|
||||
unsigned long state;
|
||||
};
|
||||
|
||||
/*
|
||||
* Network device statistics. Akin to the 2.0 ether stats but
|
||||
* with byte counters.
|
||||
|
|
@ -281,14 +273,11 @@ struct header_ops {
|
|||
|
||||
enum netdev_state_t
|
||||
{
|
||||
__LINK_STATE_XOFF=0,
|
||||
__LINK_STATE_START,
|
||||
__LINK_STATE_PRESENT,
|
||||
__LINK_STATE_SCHED,
|
||||
__LINK_STATE_NOCARRIER,
|
||||
__LINK_STATE_LINKWATCH_PENDING,
|
||||
__LINK_STATE_DORMANT,
|
||||
__LINK_STATE_QDISC_RUNNING,
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -448,6 +437,20 @@ static inline void napi_synchronize(const struct napi_struct *n)
|
|||
# define napi_synchronize(n) barrier()
|
||||
#endif
|
||||
|
||||
enum netdev_queue_state_t
|
||||
{
|
||||
__QUEUE_STATE_XOFF,
|
||||
};
|
||||
|
||||
struct netdev_queue {
|
||||
struct net_device *dev;
|
||||
struct Qdisc *qdisc;
|
||||
unsigned long state;
|
||||
spinlock_t _xmit_lock;
|
||||
int xmit_lock_owner;
|
||||
struct Qdisc *qdisc_sleeping;
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
/*
|
||||
* The DEVICE structure.
|
||||
* Actually, this whole structure is a big mistake. It mixes I/O
|
||||
|
|
@ -516,7 +519,6 @@ struct net_device
|
|||
#define NETIF_F_LLTX 4096 /* LockLess TX - deprecated. Please */
|
||||
/* do not use LLTX in new drivers */
|
||||
#define NETIF_F_NETNS_LOCAL 8192 /* Does not change network namespaces */
|
||||
#define NETIF_F_MULTI_QUEUE 16384 /* Has multiple TX/RX queues */
|
||||
#define NETIF_F_LRO 32768 /* large receive offload */
|
||||
|
||||
/* Segmentation offload features */
|
||||
|
|
@ -537,8 +539,6 @@ struct net_device
|
|||
#define NETIF_F_V6_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM)
|
||||
#define NETIF_F_ALL_CSUM (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM)
|
||||
|
||||
struct net_device *next_sched;
|
||||
|
||||
/* Interface index. Unique device identifier */
|
||||
int ifindex;
|
||||
int iflink;
|
||||
|
|
@ -594,13 +594,14 @@ struct net_device
|
|||
unsigned char addr_len; /* hardware address length */
|
||||
unsigned short dev_id; /* for shared network cards */
|
||||
|
||||
spinlock_t addr_list_lock;
|
||||
struct dev_addr_list *uc_list; /* Secondary unicast mac addresses */
|
||||
int uc_count; /* Number of installed ucasts */
|
||||
int uc_promisc;
|
||||
struct dev_addr_list *mc_list; /* Multicast mac addresses */
|
||||
int mc_count; /* Number of installed mcasts */
|
||||
int promiscuity;
|
||||
int allmulti;
|
||||
unsigned int promiscuity;
|
||||
unsigned int allmulti;
|
||||
|
||||
|
||||
/* Protocol specific pointers */
|
||||
|
|
@ -624,32 +625,21 @@ struct net_device
|
|||
|
||||
unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */
|
||||
|
||||
/* ingress path synchronizer */
|
||||
spinlock_t ingress_lock;
|
||||
struct Qdisc *qdisc_ingress;
|
||||
struct netdev_queue rx_queue;
|
||||
|
||||
struct netdev_queue *_tx ____cacheline_aligned_in_smp;
|
||||
|
||||
/* Number of TX queues allocated at alloc_netdev_mq() time */
|
||||
unsigned int num_tx_queues;
|
||||
|
||||
/* Number of TX queues currently active in device */
|
||||
unsigned int real_num_tx_queues;
|
||||
|
||||
/*
|
||||
* Cache line mostly used on queue transmit path (qdisc)
|
||||
*/
|
||||
/* device queue lock */
|
||||
spinlock_t queue_lock ____cacheline_aligned_in_smp;
|
||||
struct Qdisc *qdisc;
|
||||
struct Qdisc *qdisc_sleeping;
|
||||
struct list_head qdisc_list;
|
||||
unsigned long tx_queue_len; /* Max frames per queue allowed */
|
||||
|
||||
/* Partially transmitted GSO packet. */
|
||||
struct sk_buff *gso_skb;
|
||||
|
||||
/*
|
||||
* One part is mostly used on xmit path (device)
|
||||
*/
|
||||
/* hard_start_xmit synchronizer */
|
||||
spinlock_t _xmit_lock ____cacheline_aligned_in_smp;
|
||||
/* cpu id of processor entered to hard_start_xmit or -1,
|
||||
if nobody entered there.
|
||||
*/
|
||||
int xmit_lock_owner;
|
||||
void *priv; /* pointer to private data */
|
||||
int (*hard_start_xmit) (struct sk_buff *skb,
|
||||
struct net_device *dev);
|
||||
|
|
@ -728,6 +718,9 @@ struct net_device
|
|||
void (*poll_controller)(struct net_device *dev);
|
||||
#endif
|
||||
|
||||
u16 (*select_queue)(struct net_device *dev,
|
||||
struct sk_buff *skb);
|
||||
|
||||
#ifdef CONFIG_NET_NS
|
||||
/* Network namespace this network device is inside */
|
||||
struct net *nd_net;
|
||||
|
|
@ -740,6 +733,8 @@ struct net_device
|
|||
struct net_bridge_port *br_port;
|
||||
/* macvlan */
|
||||
struct macvlan_port *macvlan_port;
|
||||
/* GARP */
|
||||
struct garp_port *garp_port;
|
||||
|
||||
/* class/net/name entry */
|
||||
struct device dev;
|
||||
|
|
@ -755,16 +750,31 @@ struct net_device
|
|||
/* for setting kernel sock attribute on TCP connection setup */
|
||||
#define GSO_MAX_SIZE 65536
|
||||
unsigned int gso_max_size;
|
||||
|
||||
/* The TX queue control structures */
|
||||
unsigned int egress_subqueue_count;
|
||||
struct net_device_subqueue egress_subqueue[1];
|
||||
};
|
||||
#define to_net_dev(d) container_of(d, struct net_device, dev)
|
||||
|
||||
#define NETDEV_ALIGN 32
|
||||
#define NETDEV_ALIGN_CONST (NETDEV_ALIGN - 1)
|
||||
|
||||
static inline
|
||||
struct netdev_queue *netdev_get_tx_queue(const struct net_device *dev,
|
||||
unsigned int index)
|
||||
{
|
||||
return &dev->_tx[index];
|
||||
}
|
||||
|
||||
static inline void netdev_for_each_tx_queue(struct net_device *dev,
|
||||
void (*f)(struct net_device *,
|
||||
struct netdev_queue *,
|
||||
void *),
|
||||
void *arg)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < dev->num_tx_queues; i++)
|
||||
f(dev, &dev->_tx[i], arg);
|
||||
}
|
||||
|
||||
/*
|
||||
* Net namespace inlines
|
||||
*/
|
||||
|
|
@ -795,7 +805,9 @@ void dev_net_set(struct net_device *dev, struct net *net)
|
|||
*/
|
||||
static inline void *netdev_priv(const struct net_device *dev)
|
||||
{
|
||||
return dev->priv;
|
||||
return (char *)dev + ((sizeof(struct net_device)
|
||||
+ NETDEV_ALIGN_CONST)
|
||||
& ~NETDEV_ALIGN_CONST);
|
||||
}
|
||||
|
||||
/* Set the sysfs physical device reference for the network logical device
|
||||
|
|
@ -830,6 +842,19 @@ static inline void netif_napi_add(struct net_device *dev,
|
|||
set_bit(NAPI_STATE_SCHED, &napi->state);
|
||||
}
|
||||
|
||||
/**
|
||||
* netif_napi_del - remove a napi context
|
||||
* @napi: napi context
|
||||
*
|
||||
* netif_napi_del() removes a napi context from the network device napi list
|
||||
*/
|
||||
static inline void netif_napi_del(struct napi_struct *napi)
|
||||
{
|
||||
#ifdef CONFIG_NETPOLL
|
||||
list_del(&napi->dev_list);
|
||||
#endif
|
||||
}
|
||||
|
||||
struct packet_type {
|
||||
__be16 type; /* This is really htons(ether_type). */
|
||||
struct net_device *dev; /* NULL is wildcarded here */
|
||||
|
|
@ -890,6 +915,7 @@ extern struct net_device *__dev_get_by_name(struct net *net, const char *name);
|
|||
extern int dev_alloc_name(struct net_device *dev, const char *name);
|
||||
extern int dev_open(struct net_device *dev);
|
||||
extern int dev_close(struct net_device *dev);
|
||||
extern void dev_disable_lro(struct net_device *dev);
|
||||
extern int dev_queue_xmit(struct sk_buff *skb);
|
||||
extern int register_netdevice(struct net_device *dev);
|
||||
extern void unregister_netdevice(struct net_device *dev);
|
||||
|
|
@ -939,7 +965,7 @@ static inline int unregister_gifconf(unsigned int family)
|
|||
*/
|
||||
struct softnet_data
|
||||
{
|
||||
struct net_device *output_queue;
|
||||
struct Qdisc *output_queue;
|
||||
struct sk_buff_head input_pkt_queue;
|
||||
struct list_head poll_list;
|
||||
struct sk_buff *completion_queue;
|
||||
|
|
@ -954,12 +980,20 @@ DECLARE_PER_CPU(struct softnet_data,softnet_data);
|
|||
|
||||
#define HAVE_NETIF_QUEUE
|
||||
|
||||
extern void __netif_schedule(struct net_device *dev);
|
||||
extern void __netif_schedule(struct Qdisc *q);
|
||||
|
||||
static inline void netif_schedule(struct net_device *dev)
|
||||
static inline void netif_schedule_queue(struct netdev_queue *txq)
|
||||
{
|
||||
if (!test_bit(__LINK_STATE_XOFF, &dev->state))
|
||||
__netif_schedule(dev);
|
||||
if (!test_bit(__QUEUE_STATE_XOFF, &txq->state))
|
||||
__netif_schedule(txq->qdisc);
|
||||
}
|
||||
|
||||
static inline void netif_tx_schedule_all(struct net_device *dev)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < dev->num_tx_queues; i++)
|
||||
netif_schedule_queue(netdev_get_tx_queue(dev, i));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -968,9 +1002,24 @@ static inline void netif_schedule(struct net_device *dev)
|
|||
*
|
||||
* Allow upper layers to call the device hard_start_xmit routine.
|
||||
*/
|
||||
static inline void netif_tx_start_queue(struct netdev_queue *dev_queue)
|
||||
{
|
||||
clear_bit(__QUEUE_STATE_XOFF, &dev_queue->state);
|
||||
}
|
||||
|
||||
static inline void netif_start_queue(struct net_device *dev)
|
||||
{
|
||||
clear_bit(__LINK_STATE_XOFF, &dev->state);
|
||||
netif_tx_start_queue(netdev_get_tx_queue(dev, 0));
|
||||
}
|
||||
|
||||
static inline void netif_tx_start_all_queues(struct net_device *dev)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < dev->num_tx_queues; i++) {
|
||||
struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
|
||||
netif_tx_start_queue(txq);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -980,16 +1029,31 @@ static inline void netif_start_queue(struct net_device *dev)
|
|||
* Allow upper layers to call the device hard_start_xmit routine.
|
||||
* Used for flow control when transmit resources are available.
|
||||
*/
|
||||
static inline void netif_wake_queue(struct net_device *dev)
|
||||
static inline void netif_tx_wake_queue(struct netdev_queue *dev_queue)
|
||||
{
|
||||
#ifdef CONFIG_NETPOLL_TRAP
|
||||
if (netpoll_trap()) {
|
||||
clear_bit(__LINK_STATE_XOFF, &dev->state);
|
||||
clear_bit(__QUEUE_STATE_XOFF, &dev_queue->state);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
if (test_and_clear_bit(__LINK_STATE_XOFF, &dev->state))
|
||||
__netif_schedule(dev);
|
||||
if (test_and_clear_bit(__QUEUE_STATE_XOFF, &dev_queue->state))
|
||||
__netif_schedule(dev_queue->qdisc);
|
||||
}
|
||||
|
||||
static inline void netif_wake_queue(struct net_device *dev)
|
||||
{
|
||||
netif_tx_wake_queue(netdev_get_tx_queue(dev, 0));
|
||||
}
|
||||
|
||||
static inline void netif_tx_wake_all_queues(struct net_device *dev)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < dev->num_tx_queues; i++) {
|
||||
struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
|
||||
netif_tx_wake_queue(txq);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -999,9 +1063,24 @@ static inline void netif_wake_queue(struct net_device *dev)
|
|||
* Stop upper layers calling the device hard_start_xmit routine.
|
||||
* Used for flow control when transmit resources are unavailable.
|
||||
*/
|
||||
static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue)
|
||||
{
|
||||
set_bit(__QUEUE_STATE_XOFF, &dev_queue->state);
|
||||
}
|
||||
|
||||
static inline void netif_stop_queue(struct net_device *dev)
|
||||
{
|
||||
set_bit(__LINK_STATE_XOFF, &dev->state);
|
||||
netif_tx_stop_queue(netdev_get_tx_queue(dev, 0));
|
||||
}
|
||||
|
||||
static inline void netif_tx_stop_all_queues(struct net_device *dev)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < dev->num_tx_queues; i++) {
|
||||
struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
|
||||
netif_tx_stop_queue(txq);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1010,9 +1089,14 @@ static inline void netif_stop_queue(struct net_device *dev)
|
|||
*
|
||||
* Test if transmit queue on device is currently unable to send.
|
||||
*/
|
||||
static inline int netif_tx_queue_stopped(const struct netdev_queue *dev_queue)
|
||||
{
|
||||
return test_bit(__QUEUE_STATE_XOFF, &dev_queue->state);
|
||||
}
|
||||
|
||||
static inline int netif_queue_stopped(const struct net_device *dev)
|
||||
{
|
||||
return test_bit(__LINK_STATE_XOFF, &dev->state);
|
||||
return netif_tx_queue_stopped(netdev_get_tx_queue(dev, 0));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1042,9 +1126,8 @@ static inline int netif_running(const struct net_device *dev)
|
|||
*/
|
||||
static inline void netif_start_subqueue(struct net_device *dev, u16 queue_index)
|
||||
{
|
||||
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
|
||||
clear_bit(__LINK_STATE_XOFF, &dev->egress_subqueue[queue_index].state);
|
||||
#endif
|
||||
struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
|
||||
clear_bit(__QUEUE_STATE_XOFF, &txq->state);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1056,13 +1139,12 @@ static inline void netif_start_subqueue(struct net_device *dev, u16 queue_index)
|
|||
*/
|
||||
static inline void netif_stop_subqueue(struct net_device *dev, u16 queue_index)
|
||||
{
|
||||
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
|
||||
struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
|
||||
#ifdef CONFIG_NETPOLL_TRAP
|
||||
if (netpoll_trap())
|
||||
return;
|
||||
#endif
|
||||
set_bit(__LINK_STATE_XOFF, &dev->egress_subqueue[queue_index].state);
|
||||
#endif
|
||||
set_bit(__QUEUE_STATE_XOFF, &txq->state);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1075,12 +1157,8 @@ static inline void netif_stop_subqueue(struct net_device *dev, u16 queue_index)
|
|||
static inline int __netif_subqueue_stopped(const struct net_device *dev,
|
||||
u16 queue_index)
|
||||
{
|
||||
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
|
||||
return test_bit(__LINK_STATE_XOFF,
|
||||
&dev->egress_subqueue[queue_index].state);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
|
||||
return test_bit(__QUEUE_STATE_XOFF, &txq->state);
|
||||
}
|
||||
|
||||
static inline int netif_subqueue_stopped(const struct net_device *dev,
|
||||
|
|
@ -1098,15 +1176,13 @@ static inline int netif_subqueue_stopped(const struct net_device *dev,
|
|||
*/
|
||||
static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index)
|
||||
{
|
||||
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
|
||||
struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
|
||||
#ifdef CONFIG_NETPOLL_TRAP
|
||||
if (netpoll_trap())
|
||||
return;
|
||||
#endif
|
||||
if (test_and_clear_bit(__LINK_STATE_XOFF,
|
||||
&dev->egress_subqueue[queue_index].state))
|
||||
__netif_schedule(dev);
|
||||
#endif
|
||||
if (test_and_clear_bit(__QUEUE_STATE_XOFF, &txq->state))
|
||||
__netif_schedule(txq->qdisc);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1114,15 +1190,10 @@ static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index)
|
|||
* @dev: network device
|
||||
*
|
||||
* Check if device has multiple transmit queues
|
||||
* Always falls if NETDEVICE_MULTIQUEUE is not configured
|
||||
*/
|
||||
static inline int netif_is_multiqueue(const struct net_device *dev)
|
||||
{
|
||||
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
|
||||
return (!!(NETIF_F_MULTI_QUEUE & dev->features));
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
return (dev->num_tx_queues > 1);
|
||||
}
|
||||
|
||||
/* Use this variant when it is known for sure that it
|
||||
|
|
@ -1142,6 +1213,7 @@ extern int netif_rx(struct sk_buff *skb);
|
|||
extern int netif_rx_ni(struct sk_buff *skb);
|
||||
#define HAVE_NETIF_RECEIVE_SKB 1
|
||||
extern int netif_receive_skb(struct sk_buff *skb);
|
||||
extern void netif_nit_deliver(struct sk_buff *skb);
|
||||
extern int dev_valid_name(const char *name);
|
||||
extern int dev_ioctl(struct net *net, unsigned int cmd, void __user *);
|
||||
extern int dev_ethtool(struct net *net, struct ifreq *);
|
||||
|
|
@ -1154,7 +1226,8 @@ extern int dev_set_mtu(struct net_device *, int);
|
|||
extern int dev_set_mac_address(struct net_device *,
|
||||
struct sockaddr *);
|
||||
extern int dev_hard_start_xmit(struct sk_buff *skb,
|
||||
struct net_device *dev);
|
||||
struct net_device *dev,
|
||||
struct netdev_queue *txq);
|
||||
|
||||
extern int netdev_budget;
|
||||
|
||||
|
|
@ -1397,62 +1470,121 @@ static inline void netif_rx_complete(struct net_device *dev,
|
|||
*
|
||||
* Get network device transmit lock
|
||||
*/
|
||||
static inline void __netif_tx_lock(struct net_device *dev, int cpu)
|
||||
static inline void __netif_tx_lock(struct netdev_queue *txq, int cpu)
|
||||
{
|
||||
spin_lock(&dev->_xmit_lock);
|
||||
dev->xmit_lock_owner = cpu;
|
||||
spin_lock(&txq->_xmit_lock);
|
||||
txq->xmit_lock_owner = cpu;
|
||||
}
|
||||
|
||||
static inline void __netif_tx_lock_bh(struct netdev_queue *txq)
|
||||
{
|
||||
spin_lock_bh(&txq->_xmit_lock);
|
||||
txq->xmit_lock_owner = smp_processor_id();
|
||||
}
|
||||
|
||||
static inline void netif_tx_lock(struct net_device *dev)
|
||||
{
|
||||
__netif_tx_lock(dev, smp_processor_id());
|
||||
int cpu = smp_processor_id();
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < dev->num_tx_queues; i++) {
|
||||
struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
|
||||
__netif_tx_lock(txq, cpu);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void netif_tx_lock_bh(struct net_device *dev)
|
||||
{
|
||||
spin_lock_bh(&dev->_xmit_lock);
|
||||
dev->xmit_lock_owner = smp_processor_id();
|
||||
local_bh_disable();
|
||||
netif_tx_lock(dev);
|
||||
}
|
||||
|
||||
static inline int __netif_tx_trylock(struct netdev_queue *txq)
|
||||
{
|
||||
int ok = spin_trylock(&txq->_xmit_lock);
|
||||
if (likely(ok))
|
||||
txq->xmit_lock_owner = smp_processor_id();
|
||||
return ok;
|
||||
}
|
||||
|
||||
static inline int netif_tx_trylock(struct net_device *dev)
|
||||
{
|
||||
int ok = spin_trylock(&dev->_xmit_lock);
|
||||
if (likely(ok))
|
||||
dev->xmit_lock_owner = smp_processor_id();
|
||||
return ok;
|
||||
return __netif_tx_trylock(netdev_get_tx_queue(dev, 0));
|
||||
}
|
||||
|
||||
static inline void __netif_tx_unlock(struct netdev_queue *txq)
|
||||
{
|
||||
txq->xmit_lock_owner = -1;
|
||||
spin_unlock(&txq->_xmit_lock);
|
||||
}
|
||||
|
||||
static inline void __netif_tx_unlock_bh(struct netdev_queue *txq)
|
||||
{
|
||||
txq->xmit_lock_owner = -1;
|
||||
spin_unlock_bh(&txq->_xmit_lock);
|
||||
}
|
||||
|
||||
static inline void netif_tx_unlock(struct net_device *dev)
|
||||
{
|
||||
dev->xmit_lock_owner = -1;
|
||||
spin_unlock(&dev->_xmit_lock);
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < dev->num_tx_queues; i++) {
|
||||
struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
|
||||
__netif_tx_unlock(txq);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static inline void netif_tx_unlock_bh(struct net_device *dev)
|
||||
{
|
||||
dev->xmit_lock_owner = -1;
|
||||
spin_unlock_bh(&dev->_xmit_lock);
|
||||
netif_tx_unlock(dev);
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
#define HARD_TX_LOCK(dev, cpu) { \
|
||||
#define HARD_TX_LOCK(dev, txq, cpu) { \
|
||||
if ((dev->features & NETIF_F_LLTX) == 0) { \
|
||||
__netif_tx_lock(dev, cpu); \
|
||||
__netif_tx_lock(txq, cpu); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define HARD_TX_UNLOCK(dev) { \
|
||||
#define HARD_TX_UNLOCK(dev, txq) { \
|
||||
if ((dev->features & NETIF_F_LLTX) == 0) { \
|
||||
netif_tx_unlock(dev); \
|
||||
__netif_tx_unlock(txq); \
|
||||
} \
|
||||
}
|
||||
|
||||
static inline void netif_tx_disable(struct net_device *dev)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
netif_tx_lock_bh(dev);
|
||||
netif_stop_queue(dev);
|
||||
for (i = 0; i < dev->num_tx_queues; i++) {
|
||||
struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
|
||||
netif_tx_stop_queue(txq);
|
||||
}
|
||||
netif_tx_unlock_bh(dev);
|
||||
}
|
||||
|
||||
static inline void netif_addr_lock(struct net_device *dev)
|
||||
{
|
||||
spin_lock(&dev->addr_list_lock);
|
||||
}
|
||||
|
||||
static inline void netif_addr_lock_bh(struct net_device *dev)
|
||||
{
|
||||
spin_lock_bh(&dev->addr_list_lock);
|
||||
}
|
||||
|
||||
static inline void netif_addr_unlock(struct net_device *dev)
|
||||
{
|
||||
spin_unlock(&dev->addr_list_lock);
|
||||
}
|
||||
|
||||
static inline void netif_addr_unlock_bh(struct net_device *dev)
|
||||
{
|
||||
spin_unlock_bh(&dev->addr_list_lock);
|
||||
}
|
||||
|
||||
/* These functions live elsewhere (drivers/net/net_init.c, but related) */
|
||||
|
||||
extern void ether_setup(struct net_device *dev);
|
||||
|
|
@ -1480,9 +1612,10 @@ extern int __dev_addr_delete(struct dev_addr_list **list, int *count, void *ad
|
|||
extern int __dev_addr_add(struct dev_addr_list **list, int *count, void *addr, int alen, int newonly);
|
||||
extern int __dev_addr_sync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count);
|
||||
extern void __dev_addr_unsync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count);
|
||||
extern void dev_set_promiscuity(struct net_device *dev, int inc);
|
||||
extern void dev_set_allmulti(struct net_device *dev, int inc);
|
||||
extern int dev_set_promiscuity(struct net_device *dev, int inc);
|
||||
extern int dev_set_allmulti(struct net_device *dev, int inc);
|
||||
extern void netdev_state_change(struct net_device *dev);
|
||||
extern void netdev_bonding_change(struct net_device *dev);
|
||||
extern void netdev_features_change(struct net_device *dev);
|
||||
/* Load a device via the kmod */
|
||||
extern void dev_load(struct net *net, const char *name);
|
||||
|
|
@ -1509,6 +1642,9 @@ extern void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos);
|
|||
extern void dev_seq_stop(struct seq_file *seq, void *v);
|
||||
#endif
|
||||
|
||||
extern int netdev_class_create_file(struct class_attribute *class_attr);
|
||||
extern void netdev_class_remove_file(struct class_attribute *class_attr);
|
||||
|
||||
extern void linkwatch_run_queue(void);
|
||||
|
||||
extern int netdev_compute_features(unsigned long all, unsigned long one);
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ enum ip_conntrack_events
|
|||
IPCT_NATINFO_BIT = 10,
|
||||
IPCT_NATINFO = (1 << IPCT_NATINFO_BIT),
|
||||
|
||||
/* Counter highest bit has been set */
|
||||
/* Counter highest bit has been set, unused */
|
||||
IPCT_COUNTER_FILLING_BIT = 11,
|
||||
IPCT_COUNTER_FILLING = (1 << IPCT_COUNTER_FILLING_BIT),
|
||||
|
||||
|
|
@ -145,12 +145,6 @@ enum ip_conntrack_expect_events {
|
|||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
struct ip_conntrack_counter
|
||||
{
|
||||
u_int32_t packets;
|
||||
u_int32_t bytes;
|
||||
};
|
||||
|
||||
struct ip_conntrack_stat
|
||||
{
|
||||
unsigned int searched;
|
||||
|
|
|
|||
|
|
@ -81,6 +81,7 @@ enum ctattr_protoinfo {
|
|||
CTA_PROTOINFO_UNSPEC,
|
||||
CTA_PROTOINFO_TCP,
|
||||
CTA_PROTOINFO_DCCP,
|
||||
CTA_PROTOINFO_SCTP,
|
||||
__CTA_PROTOINFO_MAX
|
||||
};
|
||||
#define CTA_PROTOINFO_MAX (__CTA_PROTOINFO_MAX - 1)
|
||||
|
|
@ -103,12 +104,21 @@ enum ctattr_protoinfo_dccp {
|
|||
};
|
||||
#define CTA_PROTOINFO_DCCP_MAX (__CTA_PROTOINFO_DCCP_MAX - 1)
|
||||
|
||||
enum ctattr_protoinfo_sctp {
|
||||
CTA_PROTOINFO_SCTP_UNSPEC,
|
||||
CTA_PROTOINFO_SCTP_STATE,
|
||||
CTA_PROTOINFO_SCTP_VTAG_ORIGINAL,
|
||||
CTA_PROTOINFO_SCTP_VTAG_REPLY,
|
||||
__CTA_PROTOINFO_SCTP_MAX
|
||||
};
|
||||
#define CTA_PROTOINFO_SCTP_MAX (__CTA_PROTOINFO_SCTP_MAX - 1)
|
||||
|
||||
enum ctattr_counters {
|
||||
CTA_COUNTERS_UNSPEC,
|
||||
CTA_COUNTERS_PACKETS, /* old 64bit counters */
|
||||
CTA_COUNTERS_BYTES, /* old 64bit counters */
|
||||
CTA_COUNTERS32_PACKETS,
|
||||
CTA_COUNTERS32_BYTES,
|
||||
CTA_COUNTERS_PACKETS, /* 64bit counters */
|
||||
CTA_COUNTERS_BYTES, /* 64bit counters */
|
||||
CTA_COUNTERS32_PACKETS, /* old 32bit counters, unused */
|
||||
CTA_COUNTERS32_BYTES, /* old 32bit counters, unused */
|
||||
__CTA_COUNTERS_MAX
|
||||
};
|
||||
#define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1)
|
||||
|
|
|
|||
|
|
@ -48,6 +48,9 @@ enum nfulnl_attr_type {
|
|||
NFULA_SEQ, /* instance-local sequence number */
|
||||
NFULA_SEQ_GLOBAL, /* global sequence number */
|
||||
NFULA_GID, /* group id of socket */
|
||||
NFULA_HWTYPE, /* hardware type */
|
||||
NFULA_HWHEADER, /* hardware header */
|
||||
NFULA_HWLEN, /* hardware header length */
|
||||
|
||||
__NFULA_MAX
|
||||
};
|
||||
|
|
|
|||
|
|
@ -4,6 +4,11 @@
|
|||
#define XT_STRING_MAX_PATTERN_SIZE 128
|
||||
#define XT_STRING_MAX_ALGO_NAME_SIZE 16
|
||||
|
||||
enum {
|
||||
XT_STRING_FLAG_INVERT = 0x01,
|
||||
XT_STRING_FLAG_IGNORECASE = 0x02
|
||||
};
|
||||
|
||||
struct xt_string_info
|
||||
{
|
||||
u_int16_t from_offset;
|
||||
|
|
@ -11,7 +16,15 @@ struct xt_string_info
|
|||
char algo[XT_STRING_MAX_ALGO_NAME_SIZE];
|
||||
char pattern[XT_STRING_MAX_PATTERN_SIZE];
|
||||
u_int8_t patlen;
|
||||
u_int8_t invert;
|
||||
union {
|
||||
struct {
|
||||
u_int8_t invert;
|
||||
} v0;
|
||||
|
||||
struct {
|
||||
u_int8_t flags;
|
||||
} v1;
|
||||
} u;
|
||||
|
||||
/* Used internally by the kernel */
|
||||
struct ts_config __attribute__((aligned(8))) *config;
|
||||
|
|
|
|||
40
include/linux/netfilter_bridge/ebt_ip6.h
Normal file
40
include/linux/netfilter_bridge/ebt_ip6.h
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* ebt_ip6
|
||||
*
|
||||
* Authors:
|
||||
* Kuo-Lang Tseng <kuo-lang.tseng@intel.com>
|
||||
* Manohar Castelino <manohar.r.castelino@intel.com>
|
||||
*
|
||||
* Jan 11, 2008
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_BRIDGE_EBT_IP6_H
|
||||
#define __LINUX_BRIDGE_EBT_IP6_H
|
||||
|
||||
#define EBT_IP6_SOURCE 0x01
|
||||
#define EBT_IP6_DEST 0x02
|
||||
#define EBT_IP6_TCLASS 0x04
|
||||
#define EBT_IP6_PROTO 0x08
|
||||
#define EBT_IP6_SPORT 0x10
|
||||
#define EBT_IP6_DPORT 0x20
|
||||
#define EBT_IP6_MASK (EBT_IP6_SOURCE | EBT_IP6_DEST | EBT_IP6_TCLASS |\
|
||||
EBT_IP6_PROTO | EBT_IP6_SPORT | EBT_IP6_DPORT)
|
||||
#define EBT_IP6_MATCH "ip6"
|
||||
|
||||
/* the same values are used for the invflags */
|
||||
struct ebt_ip6_info
|
||||
{
|
||||
struct in6_addr saddr;
|
||||
struct in6_addr daddr;
|
||||
struct in6_addr smsk;
|
||||
struct in6_addr dmsk;
|
||||
uint8_t tclass;
|
||||
uint8_t protocol;
|
||||
uint8_t bitmask;
|
||||
uint8_t invflags;
|
||||
uint16_t sport[2];
|
||||
uint16_t dport[2];
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -4,7 +4,8 @@
|
|||
#define EBT_LOG_IP 0x01 /* if the frame is made by ip, log the ip information */
|
||||
#define EBT_LOG_ARP 0x02
|
||||
#define EBT_LOG_NFLOG 0x04
|
||||
#define EBT_LOG_MASK (EBT_LOG_IP | EBT_LOG_ARP)
|
||||
#define EBT_LOG_IP6 0x08
|
||||
#define EBT_LOG_MASK (EBT_LOG_IP | EBT_LOG_ARP | EBT_LOG_IP6)
|
||||
#define EBT_LOG_PREFIX_SIZE 30
|
||||
#define EBT_LOG_WATCHER "log"
|
||||
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ enum nf_ip_hook_priorities {
|
|||
NF_IP_PRI_MANGLE = -150,
|
||||
NF_IP_PRI_NAT_DST = -100,
|
||||
NF_IP_PRI_FILTER = 0,
|
||||
NF_IP_PRI_SECURITY = 50,
|
||||
NF_IP_PRI_NAT_SRC = 100,
|
||||
NF_IP_PRI_SELINUX_LAST = 225,
|
||||
NF_IP_PRI_CONNTRACK_CONFIRM = INT_MAX,
|
||||
|
|
|
|||
|
|
@ -64,11 +64,14 @@ enum nf_ip6_hook_priorities {
|
|||
NF_IP6_PRI_MANGLE = -150,
|
||||
NF_IP6_PRI_NAT_DST = -100,
|
||||
NF_IP6_PRI_FILTER = 0,
|
||||
NF_IP6_PRI_SECURITY = 50,
|
||||
NF_IP6_PRI_NAT_SRC = 100,
|
||||
NF_IP6_PRI_SELINUX_LAST = 225,
|
||||
NF_IP6_PRI_LAST = INT_MAX,
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#ifdef CONFIG_NETFILTER
|
||||
extern int ip6_route_me_harder(struct sk_buff *skb);
|
||||
extern __sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook,
|
||||
|
|
@ -81,4 +84,6 @@ static inline int ipv6_netfilter_init(void) { return 0; }
|
|||
static inline void ipv6_netfilter_fini(void) { return; }
|
||||
#endif /* CONFIG_NETFILTER */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /*__LINUX_IP6_NETFILTER_H*/
|
||||
|
|
|
|||
|
|
@ -193,7 +193,7 @@ extern int netlink_unregister_notifier(struct notifier_block *nb);
|
|||
|
||||
/* finegrained unicast helpers: */
|
||||
struct sock *netlink_getsockbyfilp(struct file *filp);
|
||||
int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock,
|
||||
int netlink_attachskb(struct sock *sk, struct sk_buff *skb,
|
||||
long *timeo, struct sock *ssk);
|
||||
void netlink_detachskb(struct sock *sk, struct sk_buff *skb);
|
||||
int netlink_sendskb(struct sock *sk, struct sk_buff *skb);
|
||||
|
|
|
|||
|
|
@ -65,9 +65,6 @@
|
|||
#define NFS4_ACE_SUCCESSFUL_ACCESS_ACE_FLAG 0x00000010
|
||||
#define NFS4_ACE_FAILED_ACCESS_ACE_FLAG 0x00000020
|
||||
#define NFS4_ACE_IDENTIFIER_GROUP 0x00000040
|
||||
#define NFS4_ACE_OWNER 0x00000080
|
||||
#define NFS4_ACE_GROUP 0x00000100
|
||||
#define NFS4_ACE_EVERYONE 0x00000200
|
||||
|
||||
#define NFS4_ACE_READ_DATA 0x00000001
|
||||
#define NFS4_ACE_LIST_DIRECTORY 0x00000001
|
||||
|
|
|
|||
|
|
@ -28,20 +28,20 @@
|
|||
#define NFSD_SUPPORTED_MINOR_VERSION 0
|
||||
|
||||
/*
|
||||
* Special flags for nfsd_permission. These must be different from MAY_READ,
|
||||
* MAY_WRITE, and MAY_EXEC.
|
||||
* Flags for nfsd_permission
|
||||
*/
|
||||
#define MAY_NOP 0
|
||||
#define MAY_SATTR 8
|
||||
#define MAY_TRUNC 16
|
||||
#define MAY_LOCK 32
|
||||
#define MAY_OWNER_OVERRIDE 64
|
||||
#define MAY_LOCAL_ACCESS 128 /* IRIX doing local access check on device special file*/
|
||||
#if (MAY_SATTR | MAY_TRUNC | MAY_LOCK | MAY_OWNER_OVERRIDE | MAY_LOCAL_ACCESS) & (MAY_READ | MAY_WRITE | MAY_EXEC)
|
||||
# error "please use a different value for MAY_SATTR or MAY_TRUNC or MAY_LOCK or MAY_LOCAL_ACCESS or MAY_OWNER_OVERRIDE."
|
||||
#endif
|
||||
#define MAY_CREATE (MAY_EXEC|MAY_WRITE)
|
||||
#define MAY_REMOVE (MAY_EXEC|MAY_WRITE|MAY_TRUNC)
|
||||
#define NFSD_MAY_NOP 0
|
||||
#define NFSD_MAY_EXEC 1 /* == MAY_EXEC */
|
||||
#define NFSD_MAY_WRITE 2 /* == MAY_WRITE */
|
||||
#define NFSD_MAY_READ 4 /* == MAY_READ */
|
||||
#define NFSD_MAY_SATTR 8
|
||||
#define NFSD_MAY_TRUNC 16
|
||||
#define NFSD_MAY_LOCK 32
|
||||
#define NFSD_MAY_OWNER_OVERRIDE 64
|
||||
#define NFSD_MAY_LOCAL_ACCESS 128 /* IRIX doing local access check on device special file*/
|
||||
|
||||
#define NFSD_MAY_CREATE (NFSD_MAY_EXEC|NFSD_MAY_WRITE)
|
||||
#define NFSD_MAY_REMOVE (NFSD_MAY_EXEC|NFSD_MAY_WRITE|NFSD_MAY_TRUNC)
|
||||
|
||||
/*
|
||||
* Callback function for readdir
|
||||
|
|
@ -54,6 +54,7 @@ typedef int (*nfsd_dirop_t)(struct inode *, struct dentry *, int, int);
|
|||
extern struct svc_program nfsd_program;
|
||||
extern struct svc_version nfsd_version2, nfsd_version3,
|
||||
nfsd_version4;
|
||||
extern struct mutex nfsd_mutex;
|
||||
extern struct svc_serv *nfsd_serv;
|
||||
|
||||
extern struct seq_operations nfs_exports_op;
|
||||
|
|
|
|||
|
|
@ -98,8 +98,6 @@ struct nfs4_callback {
|
|||
u32 cb_ident;
|
||||
/* RPC client info */
|
||||
atomic_t cb_set; /* successful CB_NULL call */
|
||||
struct rpc_program cb_program;
|
||||
struct rpc_stat cb_stat;
|
||||
struct rpc_clnt * cb_client;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -122,13 +122,13 @@ enum nl80211_commands {
|
|||
NL80211_CMD_NEW_STATION,
|
||||
NL80211_CMD_DEL_STATION,
|
||||
|
||||
/* add commands here */
|
||||
|
||||
NL80211_CMD_GET_MPATH,
|
||||
NL80211_CMD_SET_MPATH,
|
||||
NL80211_CMD_NEW_MPATH,
|
||||
NL80211_CMD_DEL_MPATH,
|
||||
|
||||
/* add commands here */
|
||||
|
||||
/* used to define NL80211_CMD_MAX below */
|
||||
__NL80211_CMD_AFTER_LAST,
|
||||
NL80211_CMD_MAX = __NL80211_CMD_AFTER_LAST - 1
|
||||
|
|
@ -230,18 +230,21 @@ enum nl80211_attrs {
|
|||
|
||||
NL80211_ATTR_MNTR_FLAGS,
|
||||
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
NL80211_ATTR_MESH_ID,
|
||||
NL80211_ATTR_STA_PLINK_ACTION,
|
||||
NL80211_ATTR_MPATH_NEXT_HOP,
|
||||
NL80211_ATTR_MPATH_INFO,
|
||||
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
#define NL80211_MAX_SUPP_RATES 32
|
||||
#define NL80211_MAX_SUPP_RATES 32
|
||||
#define NL80211_TKIP_DATA_OFFSET_ENCR_KEY 0
|
||||
#define NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY 16
|
||||
#define NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY 24
|
||||
|
||||
/**
|
||||
* enum nl80211_iftype - (virtual) interface types
|
||||
|
|
|
|||
|
|
@ -197,6 +197,7 @@ static inline int notifier_to_errno(int ret)
|
|||
#define NETDEV_GOING_DOWN 0x0009
|
||||
#define NETDEV_CHANGENAME 0x000A
|
||||
#define NETDEV_FEAT_CHANGE 0x000B
|
||||
#define NETDEV_BONDING_FAILOVER 0x000C
|
||||
|
||||
#define SYS_DOWN 0x0001 /* Notify of system down */
|
||||
#define SYS_RESTART SYS_DOWN
|
||||
|
|
|
|||
|
|
@ -17,8 +17,7 @@
|
|||
#ifndef LINUX_PCI_H
|
||||
#define LINUX_PCI_H
|
||||
|
||||
/* Include the pci register defines */
|
||||
#include <linux/pci_regs.h>
|
||||
#include <linux/pci_regs.h> /* The pci register defines */
|
||||
|
||||
/*
|
||||
* The PCI interface treats multi-function devices as independent
|
||||
|
|
@ -49,12 +48,22 @@
|
|||
#include <linux/list.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/kobject.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <linux/device.h>
|
||||
|
||||
/* Include the ID list */
|
||||
#include <linux/pci_ids.h>
|
||||
|
||||
/* pci_slot represents a physical slot */
|
||||
struct pci_slot {
|
||||
struct pci_bus *bus; /* The bus this slot is on */
|
||||
struct list_head list; /* node in list of slots on this bus */
|
||||
struct hotplug_slot *hotplug; /* Hotplug info (migrate over time) */
|
||||
unsigned char number; /* PCI_SLOT(pci_dev->devfn) */
|
||||
struct kobject kobj;
|
||||
};
|
||||
|
||||
/* File state for mmap()s on /proc/bus/pci/X/Y */
|
||||
enum pci_mmap_state {
|
||||
pci_mmap_io,
|
||||
|
|
@ -142,6 +151,7 @@ struct pci_dev {
|
|||
|
||||
void *sysdata; /* hook for sys-specific extension */
|
||||
struct proc_dir_entry *procent; /* device entry in /proc/bus/pci */
|
||||
struct pci_slot *slot; /* Physical slot this device is in */
|
||||
|
||||
unsigned int devfn; /* encoded device & function index */
|
||||
unsigned short vendor;
|
||||
|
|
@ -167,6 +177,13 @@ struct pci_dev {
|
|||
pci_power_t current_state; /* Current operating state. In ACPI-speak,
|
||||
this is D0-D3, D0 being fully functional,
|
||||
and D3 being off. */
|
||||
int pm_cap; /* PM capability offset in the
|
||||
configuration space */
|
||||
unsigned int pme_support:5; /* Bitmask of states from which PME#
|
||||
can be generated */
|
||||
unsigned int d1_support:1; /* Low power state D1 is supported */
|
||||
unsigned int d2_support:1; /* Low power state D2 is supported */
|
||||
unsigned int no_d1d2:1; /* Only allow D0 and D3 */
|
||||
|
||||
#ifdef CONFIG_PCIEASPM
|
||||
struct pcie_link_state *link_state; /* ASPM link state. */
|
||||
|
|
@ -191,7 +208,6 @@ struct pci_dev {
|
|||
unsigned int is_added:1;
|
||||
unsigned int is_busmaster:1; /* device is busmaster */
|
||||
unsigned int no_msi:1; /* device may not use msi */
|
||||
unsigned int no_d1d2:1; /* only allow d0 or d3 */
|
||||
unsigned int block_ucfg_access:1; /* userspace config space access is blocked */
|
||||
unsigned int broken_parity_status:1; /* Device generates false positive parity */
|
||||
unsigned int msi_enabled:1;
|
||||
|
|
@ -267,6 +283,7 @@ struct pci_bus {
|
|||
struct list_head children; /* list of child buses */
|
||||
struct list_head devices; /* list of devices on this bus */
|
||||
struct pci_dev *self; /* bridge device as seen by parent */
|
||||
struct list_head slots; /* list of slots on this bus */
|
||||
struct resource *resource[PCI_BUS_NUM_RESOURCES];
|
||||
/* address space routed to this bus */
|
||||
|
||||
|
|
@ -328,7 +345,7 @@ struct pci_bus_region {
|
|||
struct pci_dynids {
|
||||
spinlock_t lock; /* protects list, index */
|
||||
struct list_head list; /* for IDs added at runtime */
|
||||
unsigned int use_driver_data:1; /* pci_driver->driver_data is used */
|
||||
unsigned int use_driver_data:1; /* pci_device_id->driver_data is used */
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
|
@ -390,7 +407,7 @@ struct pci_driver {
|
|||
int (*resume_early) (struct pci_dev *dev);
|
||||
int (*resume) (struct pci_dev *dev); /* Device woken up */
|
||||
void (*shutdown) (struct pci_dev *dev);
|
||||
|
||||
struct pm_ext_ops *pm;
|
||||
struct pci_error_handlers *err_handler;
|
||||
struct device_driver driver;
|
||||
struct pci_dynids dynids;
|
||||
|
|
@ -489,6 +506,10 @@ struct pci_bus *pci_create_bus(struct device *parent, int bus,
|
|||
struct pci_ops *ops, void *sysdata);
|
||||
struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,
|
||||
int busnr);
|
||||
struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr,
|
||||
const char *name);
|
||||
void pci_destroy_slot(struct pci_slot *slot);
|
||||
void pci_update_slot_number(struct pci_slot *slot, int slot_nr);
|
||||
int pci_scan_slot(struct pci_bus *bus, int devfn);
|
||||
struct pci_dev *pci_scan_single_device(struct pci_bus *bus, int devfn);
|
||||
void pci_device_add(struct pci_dev *dev, struct pci_bus *bus);
|
||||
|
|
@ -618,6 +639,8 @@ int pci_restore_state(struct pci_dev *dev);
|
|||
int pci_set_power_state(struct pci_dev *dev, pci_power_t state);
|
||||
pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state);
|
||||
int pci_enable_wake(struct pci_dev *dev, pci_power_t state, int enable);
|
||||
int pci_prepare_to_sleep(struct pci_dev *dev);
|
||||
int pci_back_from_sleep(struct pci_dev *dev);
|
||||
|
||||
/* Functions for PCI Hotplug drivers to use */
|
||||
int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap);
|
||||
|
|
@ -839,6 +862,11 @@ static inline int pci_set_dma_mask(struct pci_dev *dev, u64 mask)
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
static inline int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
|
||||
{
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static inline int pci_set_dma_max_seg_size(struct pci_dev *dev,
|
||||
unsigned int size)
|
||||
{
|
||||
|
|
@ -977,9 +1005,9 @@ static inline void pci_set_drvdata(struct pci_dev *pdev, void *data)
|
|||
/* If you want to know what to call your pci_dev, ask this function.
|
||||
* Again, it's a wrapper around the generic device.
|
||||
*/
|
||||
static inline char *pci_name(struct pci_dev *pdev)
|
||||
static inline const char *pci_name(struct pci_dev *pdev)
|
||||
{
|
||||
return pdev->dev.bus_id;
|
||||
return dev_name(&pdev->dev);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1014,7 +1042,9 @@ enum pci_fixup_pass {
|
|||
pci_fixup_header, /* After reading configuration header */
|
||||
pci_fixup_final, /* Final phase of device fixups */
|
||||
pci_fixup_enable, /* pci_enable_device() time */
|
||||
pci_fixup_resume, /* pci_enable_device() time */
|
||||
pci_fixup_resume, /* pci_device_resume() */
|
||||
pci_fixup_suspend, /* pci_device_suspend */
|
||||
pci_fixup_resume_early, /* pci_device_resume_early() */
|
||||
};
|
||||
|
||||
/* Anonymous variables would be nice... */
|
||||
|
|
@ -1036,6 +1066,12 @@ enum pci_fixup_pass {
|
|||
#define DECLARE_PCI_FIXUP_RESUME(vendor, device, hook) \
|
||||
DECLARE_PCI_FIXUP_SECTION(.pci_fixup_resume, \
|
||||
resume##vendor##device##hook, vendor, device, hook)
|
||||
#define DECLARE_PCI_FIXUP_RESUME_EARLY(vendor, device, hook) \
|
||||
DECLARE_PCI_FIXUP_SECTION(.pci_fixup_resume_early, \
|
||||
resume_early##vendor##device##hook, vendor, device, hook)
|
||||
#define DECLARE_PCI_FIXUP_SUSPEND(vendor, device, hook) \
|
||||
DECLARE_PCI_FIXUP_SECTION(.pci_fixup_suspend, \
|
||||
suspend##vendor##device##hook, vendor, device, hook)
|
||||
|
||||
|
||||
void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev);
|
||||
|
|
@ -1060,7 +1096,10 @@ extern int pci_pci_problems;
|
|||
extern unsigned long pci_cardbus_io_size;
|
||||
extern unsigned long pci_cardbus_mem_size;
|
||||
|
||||
extern int pcibios_add_platform_entries(struct pci_dev *dev);
|
||||
int pcibios_add_platform_entries(struct pci_dev *dev);
|
||||
void pcibios_disable_device(struct pci_dev *dev);
|
||||
int pcibios_set_pcie_reset_state(struct pci_dev *dev,
|
||||
enum pcie_reset_state state);
|
||||
|
||||
#ifdef CONFIG_PCI_MMCONFIG
|
||||
extern void __init pci_mmcfg_early_init(void);
|
||||
|
|
|
|||
|
|
@ -95,9 +95,6 @@ struct hotplug_slot_attribute {
|
|||
* @get_adapter_status: Called to get see if an adapter is present in the slot or not.
|
||||
* If this field is NULL, the value passed in the struct hotplug_slot_info
|
||||
* will be used when this value is requested by a user.
|
||||
* @get_address: Called to get pci address of a slot.
|
||||
* If this field is NULL, the value passed in the struct hotplug_slot_info
|
||||
* will be used when this value is requested by a user.
|
||||
* @get_max_bus_speed: Called to get the max bus speed for a slot.
|
||||
* If this field is NULL, the value passed in the struct hotplug_slot_info
|
||||
* will be used when this value is requested by a user.
|
||||
|
|
@ -120,7 +117,6 @@ struct hotplug_slot_ops {
|
|||
int (*get_attention_status) (struct hotplug_slot *slot, u8 *value);
|
||||
int (*get_latch_status) (struct hotplug_slot *slot, u8 *value);
|
||||
int (*get_adapter_status) (struct hotplug_slot *slot, u8 *value);
|
||||
int (*get_address) (struct hotplug_slot *slot, u32 *value);
|
||||
int (*get_max_bus_speed) (struct hotplug_slot *slot, enum pci_bus_speed *value);
|
||||
int (*get_cur_bus_speed) (struct hotplug_slot *slot, enum pci_bus_speed *value);
|
||||
};
|
||||
|
|
@ -140,7 +136,6 @@ struct hotplug_slot_info {
|
|||
u8 attention_status;
|
||||
u8 latch_status;
|
||||
u8 adapter_status;
|
||||
u32 address;
|
||||
enum pci_bus_speed max_bus_speed;
|
||||
enum pci_bus_speed cur_bus_speed;
|
||||
};
|
||||
|
|
@ -166,15 +161,14 @@ struct hotplug_slot {
|
|||
|
||||
/* Variables below this are for use only by the hotplug pci core. */
|
||||
struct list_head slot_list;
|
||||
struct kobject kobj;
|
||||
struct pci_slot *pci_slot;
|
||||
};
|
||||
#define to_hotplug_slot(n) container_of(n, struct hotplug_slot, kobj)
|
||||
|
||||
extern int pci_hp_register (struct hotplug_slot *slot);
|
||||
extern int pci_hp_deregister (struct hotplug_slot *slot);
|
||||
extern int pci_hp_register(struct hotplug_slot *, struct pci_bus *, int nr);
|
||||
extern int pci_hp_deregister(struct hotplug_slot *slot);
|
||||
extern int __must_check pci_hp_change_slot_info (struct hotplug_slot *slot,
|
||||
struct hotplug_slot_info *info);
|
||||
extern struct kset *pci_hotplug_slots_kset;
|
||||
|
||||
/* PCI Setting Record (Type 0) */
|
||||
struct hpp_type0 {
|
||||
|
|
@ -227,9 +221,9 @@ struct hotplug_params {
|
|||
#include <acpi/acpi.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/actypes.h>
|
||||
extern acpi_status acpi_run_oshp(acpi_handle handle);
|
||||
extern acpi_status acpi_get_hp_params_from_firmware(struct pci_bus *bus,
|
||||
struct hotplug_params *hpp);
|
||||
int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags);
|
||||
int acpi_root_bridge(acpi_handle handle);
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1950,6 +1950,8 @@
|
|||
#define PCI_DEVICE_ID_NX2_5708 0x164c
|
||||
#define PCI_DEVICE_ID_TIGON3_5702FE 0x164d
|
||||
#define PCI_DEVICE_ID_NX2_57710 0x164e
|
||||
#define PCI_DEVICE_ID_NX2_57711 0x164f
|
||||
#define PCI_DEVICE_ID_NX2_57711E 0x1650
|
||||
#define PCI_DEVICE_ID_TIGON3_5705 0x1653
|
||||
#define PCI_DEVICE_ID_TIGON3_5705_2 0x1654
|
||||
#define PCI_DEVICE_ID_TIGON3_5720 0x1658
|
||||
|
|
@ -1982,6 +1984,7 @@
|
|||
#define PCI_DEVICE_ID_TIGON3_5787M 0x1693
|
||||
#define PCI_DEVICE_ID_TIGON3_5782 0x1696
|
||||
#define PCI_DEVICE_ID_TIGON3_5784 0x1698
|
||||
#define PCI_DEVICE_ID_TIGON3_5785 0x1699
|
||||
#define PCI_DEVICE_ID_TIGON3_5786 0x169a
|
||||
#define PCI_DEVICE_ID_TIGON3_5787 0x169b
|
||||
#define PCI_DEVICE_ID_TIGON3_5788 0x169c
|
||||
|
|
|
|||
|
|
@ -231,6 +231,7 @@
|
|||
#define PCI_PM_CAP_PME_D2 0x2000 /* PME# from D2 */
|
||||
#define PCI_PM_CAP_PME_D3 0x4000 /* PME# from D3 (hot) */
|
||||
#define PCI_PM_CAP_PME_D3cold 0x8000 /* PME# from D3 (cold) */
|
||||
#define PCI_PM_CAP_PME_SHIFT 11 /* Start of the PME Mask in PMC */
|
||||
#define PCI_PM_CTRL 4 /* PM control and status register */
|
||||
#define PCI_PM_CTRL_STATE_MASK 0x0003 /* Current power state (D0 to D3) */
|
||||
#define PCI_PM_CTRL_NO_SOFT_RESET 0x0004 /* No reset for D3hot->D0 */
|
||||
|
|
|
|||
|
|
@ -374,6 +374,7 @@ enum
|
|||
TCA_FLOW_ACT,
|
||||
TCA_FLOW_POLICE,
|
||||
TCA_FLOW_EMATCHES,
|
||||
TCA_FLOW_PERTURB,
|
||||
__TCA_FLOW_MAX
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -85,6 +85,26 @@ struct tc_ratespec
|
|||
|
||||
#define TC_RTAB_SIZE 1024
|
||||
|
||||
struct tc_sizespec {
|
||||
unsigned char cell_log;
|
||||
unsigned char size_log;
|
||||
short cell_align;
|
||||
int overhead;
|
||||
unsigned int linklayer;
|
||||
unsigned int mpu;
|
||||
unsigned int mtu;
|
||||
unsigned int tsize;
|
||||
};
|
||||
|
||||
enum {
|
||||
TCA_STAB_UNSPEC,
|
||||
TCA_STAB_BASE,
|
||||
TCA_STAB_DATA,
|
||||
__TCA_STAB_MAX
|
||||
};
|
||||
|
||||
#define TCA_STAB_MAX (__TCA_STAB_MAX - 1)
|
||||
|
||||
/* FIFO section */
|
||||
|
||||
struct tc_fifo_qopt
|
||||
|
|
@ -103,15 +123,6 @@ struct tc_prio_qopt
|
|||
__u8 priomap[TC_PRIO_MAX+1]; /* Map: logical priority -> PRIO band */
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
TCA_PRIO_UNSPEC,
|
||||
TCA_PRIO_MQ,
|
||||
__TCA_PRIO_MAX
|
||||
};
|
||||
|
||||
#define TCA_PRIO_MAX (__TCA_PRIO_MAX - 1)
|
||||
|
||||
/* TBF section */
|
||||
|
||||
struct tc_tbf_qopt
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ struct platform_driver {
|
|||
int (*suspend_late)(struct platform_device *, pm_message_t state);
|
||||
int (*resume_early)(struct platform_device *);
|
||||
int (*resume)(struct platform_device *);
|
||||
struct pm_ext_ops *pm;
|
||||
struct device_driver driver;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -112,7 +112,9 @@ typedef struct pm_message {
|
|||
int event;
|
||||
} pm_message_t;
|
||||
|
||||
/*
|
||||
/**
|
||||
* struct pm_ops - device PM callbacks
|
||||
*
|
||||
* Several driver power state transitions are externally visible, affecting
|
||||
* the state of pending I/O queues and (for drivers that touch hardware)
|
||||
* interrupts, wakeups, DMA, and other hardware state. There may also be
|
||||
|
|
@ -120,6 +122,284 @@ typedef struct pm_message {
|
|||
* to the rest of the driver stack (such as a driver that's ON gating off
|
||||
* clocks which are not in active use).
|
||||
*
|
||||
* The externally visible transitions are handled with the help of the following
|
||||
* callbacks included in this structure:
|
||||
*
|
||||
* @prepare: Prepare the device for the upcoming transition, but do NOT change
|
||||
* its hardware state. Prevent new children of the device from being
|
||||
* registered after @prepare() returns (the driver's subsystem and
|
||||
* generally the rest of the kernel is supposed to prevent new calls to the
|
||||
* probe method from being made too once @prepare() has succeeded). If
|
||||
* @prepare() detects a situation it cannot handle (e.g. registration of a
|
||||
* child already in progress), it may return -EAGAIN, so that the PM core
|
||||
* can execute it once again (e.g. after the new child has been registered)
|
||||
* to recover from the race condition. This method is executed for all
|
||||
* kinds of suspend transitions and is followed by one of the suspend
|
||||
* callbacks: @suspend(), @freeze(), or @poweroff().
|
||||
* The PM core executes @prepare() for all devices before starting to
|
||||
* execute suspend callbacks for any of them, so drivers may assume all of
|
||||
* the other devices to be present and functional while @prepare() is being
|
||||
* executed. In particular, it is safe to make GFP_KERNEL memory
|
||||
* allocations from within @prepare(). However, drivers may NOT assume
|
||||
* anything about the availability of the user space at that time and it
|
||||
* is not correct to request firmware from within @prepare() (it's too
|
||||
* late to do that). [To work around this limitation, drivers may
|
||||
* register suspend and hibernation notifiers that are executed before the
|
||||
* freezing of tasks.]
|
||||
*
|
||||
* @complete: Undo the changes made by @prepare(). This method is executed for
|
||||
* all kinds of resume transitions, following one of the resume callbacks:
|
||||
* @resume(), @thaw(), @restore(). Also called if the state transition
|
||||
* fails before the driver's suspend callback (@suspend(), @freeze(),
|
||||
* @poweroff()) can be executed (e.g. if the suspend callback fails for one
|
||||
* of the other devices that the PM core has unsuccessfully attempted to
|
||||
* suspend earlier).
|
||||
* The PM core executes @complete() after it has executed the appropriate
|
||||
* resume callback for all devices.
|
||||
*
|
||||
* @suspend: Executed before putting the system into a sleep state in which the
|
||||
* contents of main memory are preserved. Quiesce the device, put it into
|
||||
* a low power state appropriate for the upcoming system state (such as
|
||||
* PCI_D3hot), and enable wakeup events as appropriate.
|
||||
*
|
||||
* @resume: Executed after waking the system up from a sleep state in which the
|
||||
* contents of main memory were preserved. Put the device into the
|
||||
* appropriate state, according to the information saved in memory by the
|
||||
* preceding @suspend(). The driver starts working again, responding to
|
||||
* hardware events and software requests. The hardware may have gone
|
||||
* through a power-off reset, or it may have maintained state from the
|
||||
* previous suspend() which the driver may rely on while resuming. On most
|
||||
* platforms, there are no restrictions on availability of resources like
|
||||
* clocks during @resume().
|
||||
*
|
||||
* @freeze: Hibernation-specific, executed before creating a hibernation image.
|
||||
* Quiesce operations so that a consistent image can be created, but do NOT
|
||||
* otherwise put the device into a low power device state and do NOT emit
|
||||
* system wakeup events. Save in main memory the device settings to be
|
||||
* used by @restore() during the subsequent resume from hibernation or by
|
||||
* the subsequent @thaw(), if the creation of the image or the restoration
|
||||
* of main memory contents from it fails.
|
||||
*
|
||||
* @thaw: Hibernation-specific, executed after creating a hibernation image OR
|
||||
* if the creation of the image fails. Also executed after a failing
|
||||
* attempt to restore the contents of main memory from such an image.
|
||||
* Undo the changes made by the preceding @freeze(), so the device can be
|
||||
* operated in the same way as immediately before the call to @freeze().
|
||||
*
|
||||
* @poweroff: Hibernation-specific, executed after saving a hibernation image.
|
||||
* Quiesce the device, put it into a low power state appropriate for the
|
||||
* upcoming system state (such as PCI_D3hot), and enable wakeup events as
|
||||
* appropriate.
|
||||
*
|
||||
* @restore: Hibernation-specific, executed after restoring the contents of main
|
||||
* memory from a hibernation image. Driver starts working again,
|
||||
* responding to hardware events and software requests. Drivers may NOT
|
||||
* make ANY assumptions about the hardware state right prior to @restore().
|
||||
* On most platforms, there are no restrictions on availability of
|
||||
* resources like clocks during @restore().
|
||||
*
|
||||
* All of the above callbacks, except for @complete(), return error codes.
|
||||
* However, the error codes returned by the resume operations, @resume(),
|
||||
* @thaw(), and @restore(), do not cause the PM core to abort the resume
|
||||
* transition during which they are returned. The error codes returned in
|
||||
* that cases are only printed by the PM core to the system logs for debugging
|
||||
* purposes. Still, it is recommended that drivers only return error codes
|
||||
* from their resume methods in case of an unrecoverable failure (i.e. when the
|
||||
* device being handled refuses to resume and becomes unusable) to allow us to
|
||||
* modify the PM core in the future, so that it can avoid attempting to handle
|
||||
* devices that failed to resume and their children.
|
||||
*
|
||||
* It is allowed to unregister devices while the above callbacks are being
|
||||
* executed. However, it is not allowed to unregister a device from within any
|
||||
* of its own callbacks.
|
||||
*/
|
||||
|
||||
struct pm_ops {
|
||||
int (*prepare)(struct device *dev);
|
||||
void (*complete)(struct device *dev);
|
||||
int (*suspend)(struct device *dev);
|
||||
int (*resume)(struct device *dev);
|
||||
int (*freeze)(struct device *dev);
|
||||
int (*thaw)(struct device *dev);
|
||||
int (*poweroff)(struct device *dev);
|
||||
int (*restore)(struct device *dev);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct pm_ext_ops - extended device PM callbacks
|
||||
*
|
||||
* Some devices require certain operations related to suspend and hibernation
|
||||
* to be carried out with interrupts disabled. Thus, 'struct pm_ext_ops' below
|
||||
* is defined, adding callbacks to be executed with interrupts disabled to
|
||||
* 'struct pm_ops'.
|
||||
*
|
||||
* The following callbacks included in 'struct pm_ext_ops' are executed with
|
||||
* the nonboot CPUs switched off and with interrupts disabled on the only
|
||||
* functional CPU. They also are executed with the PM core list of devices
|
||||
* locked, so they must NOT unregister any devices.
|
||||
*
|
||||
* @suspend_noirq: Complete the operations of ->suspend() by carrying out any
|
||||
* actions required for suspending the device that need interrupts to be
|
||||
* disabled
|
||||
*
|
||||
* @resume_noirq: Prepare for the execution of ->resume() by carrying out any
|
||||
* actions required for resuming the device that need interrupts to be
|
||||
* disabled
|
||||
*
|
||||
* @freeze_noirq: Complete the operations of ->freeze() by carrying out any
|
||||
* actions required for freezing the device that need interrupts to be
|
||||
* disabled
|
||||
*
|
||||
* @thaw_noirq: Prepare for the execution of ->thaw() by carrying out any
|
||||
* actions required for thawing the device that need interrupts to be
|
||||
* disabled
|
||||
*
|
||||
* @poweroff_noirq: Complete the operations of ->poweroff() by carrying out any
|
||||
* actions required for handling the device that need interrupts to be
|
||||
* disabled
|
||||
*
|
||||
* @restore_noirq: Prepare for the execution of ->restore() by carrying out any
|
||||
* actions required for restoring the operations of the device that need
|
||||
* interrupts to be disabled
|
||||
*
|
||||
* All of the above callbacks return error codes, but the error codes returned
|
||||
* by the resume operations, @resume_noirq(), @thaw_noirq(), and
|
||||
* @restore_noirq(), do not cause the PM core to abort the resume transition
|
||||
* during which they are returned. The error codes returned in that cases are
|
||||
* only printed by the PM core to the system logs for debugging purposes.
|
||||
* Still, as stated above, it is recommended that drivers only return error
|
||||
* codes from their resume methods if the device being handled fails to resume
|
||||
* and is not usable any more.
|
||||
*/
|
||||
|
||||
struct pm_ext_ops {
|
||||
struct pm_ops base;
|
||||
int (*suspend_noirq)(struct device *dev);
|
||||
int (*resume_noirq)(struct device *dev);
|
||||
int (*freeze_noirq)(struct device *dev);
|
||||
int (*thaw_noirq)(struct device *dev);
|
||||
int (*poweroff_noirq)(struct device *dev);
|
||||
int (*restore_noirq)(struct device *dev);
|
||||
};
|
||||
|
||||
/**
|
||||
* PM_EVENT_ messages
|
||||
*
|
||||
* The following PM_EVENT_ messages are defined for the internal use of the PM
|
||||
* core, in order to provide a mechanism allowing the high level suspend and
|
||||
* hibernation code to convey the necessary information to the device PM core
|
||||
* code:
|
||||
*
|
||||
* ON No transition.
|
||||
*
|
||||
* FREEZE System is going to hibernate, call ->prepare() and ->freeze()
|
||||
* for all devices.
|
||||
*
|
||||
* SUSPEND System is going to suspend, call ->prepare() and ->suspend()
|
||||
* for all devices.
|
||||
*
|
||||
* HIBERNATE Hibernation image has been saved, call ->prepare() and
|
||||
* ->poweroff() for all devices.
|
||||
*
|
||||
* QUIESCE Contents of main memory are going to be restored from a (loaded)
|
||||
* hibernation image, call ->prepare() and ->freeze() for all
|
||||
* devices.
|
||||
*
|
||||
* RESUME System is resuming, call ->resume() and ->complete() for all
|
||||
* devices.
|
||||
*
|
||||
* THAW Hibernation image has been created, call ->thaw() and
|
||||
* ->complete() for all devices.
|
||||
*
|
||||
* RESTORE Contents of main memory have been restored from a hibernation
|
||||
* image, call ->restore() and ->complete() for all devices.
|
||||
*
|
||||
* RECOVER Creation of a hibernation image or restoration of the main
|
||||
* memory contents from a hibernation image has failed, call
|
||||
* ->thaw() and ->complete() for all devices.
|
||||
*/
|
||||
|
||||
#define PM_EVENT_ON 0x0000
|
||||
#define PM_EVENT_FREEZE 0x0001
|
||||
#define PM_EVENT_SUSPEND 0x0002
|
||||
#define PM_EVENT_HIBERNATE 0x0004
|
||||
#define PM_EVENT_QUIESCE 0x0008
|
||||
#define PM_EVENT_RESUME 0x0010
|
||||
#define PM_EVENT_THAW 0x0020
|
||||
#define PM_EVENT_RESTORE 0x0040
|
||||
#define PM_EVENT_RECOVER 0x0080
|
||||
|
||||
#define PM_EVENT_SLEEP (PM_EVENT_SUSPEND | PM_EVENT_HIBERNATE)
|
||||
|
||||
#define PMSG_FREEZE ((struct pm_message){ .event = PM_EVENT_FREEZE, })
|
||||
#define PMSG_QUIESCE ((struct pm_message){ .event = PM_EVENT_QUIESCE, })
|
||||
#define PMSG_SUSPEND ((struct pm_message){ .event = PM_EVENT_SUSPEND, })
|
||||
#define PMSG_HIBERNATE ((struct pm_message){ .event = PM_EVENT_HIBERNATE, })
|
||||
#define PMSG_RESUME ((struct pm_message){ .event = PM_EVENT_RESUME, })
|
||||
#define PMSG_THAW ((struct pm_message){ .event = PM_EVENT_THAW, })
|
||||
#define PMSG_RESTORE ((struct pm_message){ .event = PM_EVENT_RESTORE, })
|
||||
#define PMSG_RECOVER ((struct pm_message){ .event = PM_EVENT_RECOVER, })
|
||||
#define PMSG_ON ((struct pm_message){ .event = PM_EVENT_ON, })
|
||||
|
||||
/**
|
||||
* Device power management states
|
||||
*
|
||||
* These state labels are used internally by the PM core to indicate the current
|
||||
* status of a device with respect to the PM core operations.
|
||||
*
|
||||
* DPM_ON Device is regarded as operational. Set this way
|
||||
* initially and when ->complete() is about to be called.
|
||||
* Also set when ->prepare() fails.
|
||||
*
|
||||
* DPM_PREPARING Device is going to be prepared for a PM transition. Set
|
||||
* when ->prepare() is about to be called.
|
||||
*
|
||||
* DPM_RESUMING Device is going to be resumed. Set when ->resume(),
|
||||
* ->thaw(), or ->restore() is about to be called.
|
||||
*
|
||||
* DPM_SUSPENDING Device has been prepared for a power transition. Set
|
||||
* when ->prepare() has just succeeded.
|
||||
*
|
||||
* DPM_OFF Device is regarded as inactive. Set immediately after
|
||||
* ->suspend(), ->freeze(), or ->poweroff() has succeeded.
|
||||
* Also set when ->resume()_noirq, ->thaw_noirq(), or
|
||||
* ->restore_noirq() is about to be called.
|
||||
*
|
||||
* DPM_OFF_IRQ Device is in a "deep sleep". Set immediately after
|
||||
* ->suspend_noirq(), ->freeze_noirq(), or
|
||||
* ->poweroff_noirq() has just succeeded.
|
||||
*/
|
||||
|
||||
enum dpm_state {
|
||||
DPM_INVALID,
|
||||
DPM_ON,
|
||||
DPM_PREPARING,
|
||||
DPM_RESUMING,
|
||||
DPM_SUSPENDING,
|
||||
DPM_OFF,
|
||||
DPM_OFF_IRQ,
|
||||
};
|
||||
|
||||
struct dev_pm_info {
|
||||
pm_message_t power_state;
|
||||
unsigned can_wakeup:1;
|
||||
unsigned should_wakeup:1;
|
||||
enum dpm_state status; /* Owned by the PM core */
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
struct list_head entry;
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
* The PM_EVENT_ messages are also used by drivers implementing the legacy
|
||||
* suspend framework, based on the ->suspend() and ->resume() callbacks common
|
||||
* for suspend and hibernation transitions, according to the rules below.
|
||||
*/
|
||||
|
||||
/* Necessary, because several drivers use PM_EVENT_PRETHAW */
|
||||
#define PM_EVENT_PRETHAW PM_EVENT_QUIESCE
|
||||
|
||||
/*
|
||||
* One transition is triggered by resume(), after a suspend() call; the
|
||||
* message is implicit:
|
||||
*
|
||||
|
|
@ -164,35 +444,13 @@ typedef struct pm_message {
|
|||
* or from system low-power states such as standby or suspend-to-RAM.
|
||||
*/
|
||||
|
||||
#define PM_EVENT_ON 0
|
||||
#define PM_EVENT_FREEZE 1
|
||||
#define PM_EVENT_SUSPEND 2
|
||||
#define PM_EVENT_HIBERNATE 4
|
||||
#define PM_EVENT_PRETHAW 8
|
||||
|
||||
#define PM_EVENT_SLEEP (PM_EVENT_SUSPEND | PM_EVENT_HIBERNATE)
|
||||
|
||||
#define PMSG_FREEZE ((struct pm_message){ .event = PM_EVENT_FREEZE, })
|
||||
#define PMSG_PRETHAW ((struct pm_message){ .event = PM_EVENT_PRETHAW, })
|
||||
#define PMSG_SUSPEND ((struct pm_message){ .event = PM_EVENT_SUSPEND, })
|
||||
#define PMSG_HIBERNATE ((struct pm_message){ .event = PM_EVENT_HIBERNATE, })
|
||||
#define PMSG_ON ((struct pm_message){ .event = PM_EVENT_ON, })
|
||||
|
||||
struct dev_pm_info {
|
||||
pm_message_t power_state;
|
||||
unsigned can_wakeup:1;
|
||||
unsigned should_wakeup:1;
|
||||
bool sleeping:1; /* Owned by the PM core */
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
struct list_head entry;
|
||||
#endif
|
||||
};
|
||||
|
||||
extern int device_power_down(pm_message_t state);
|
||||
extern void device_power_up(void);
|
||||
extern void device_resume(void);
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
extern void device_pm_lock(void);
|
||||
extern void device_power_up(pm_message_t state);
|
||||
extern void device_resume(pm_message_t state);
|
||||
|
||||
extern void device_pm_unlock(void);
|
||||
extern int device_power_down(pm_message_t state);
|
||||
extern int device_suspend(pm_message_t state);
|
||||
extern int device_prepare_suspend(pm_message_t state);
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,11 @@ static inline void device_init_wakeup(struct device *dev, int val)
|
|||
dev->power.can_wakeup = dev->power.should_wakeup = !!val;
|
||||
}
|
||||
|
||||
static inline void device_set_wakeup_capable(struct device *dev, int val)
|
||||
{
|
||||
dev->power.can_wakeup = !!val;
|
||||
}
|
||||
|
||||
static inline int device_can_wakeup(struct device *dev)
|
||||
{
|
||||
return dev->power.can_wakeup;
|
||||
|
|
@ -47,21 +52,7 @@ static inline void device_set_wakeup_enable(struct device *dev, int val)
|
|||
|
||||
static inline int device_may_wakeup(struct device *dev)
|
||||
{
|
||||
return dev->power.can_wakeup & dev->power.should_wakeup;
|
||||
}
|
||||
|
||||
/*
|
||||
* Platform hook to activate device wakeup capability, if that's not already
|
||||
* handled by enable_irq_wake() etc.
|
||||
* Returns zero on success, else negative errno
|
||||
*/
|
||||
extern int (*platform_enable_wakeup)(struct device *dev, int is_on);
|
||||
|
||||
static inline int call_platform_enable_wakeup(struct device *dev, int is_on)
|
||||
{
|
||||
if (platform_enable_wakeup)
|
||||
return (*platform_enable_wakeup)(dev, is_on);
|
||||
return 0;
|
||||
return dev->power.can_wakeup && dev->power.should_wakeup;
|
||||
}
|
||||
|
||||
#else /* !CONFIG_PM */
|
||||
|
|
@ -72,6 +63,8 @@ static inline void device_init_wakeup(struct device *dev, int val)
|
|||
dev->power.can_wakeup = !!val;
|
||||
}
|
||||
|
||||
static inline void device_set_wakeup_capable(struct device *dev, int val) { }
|
||||
|
||||
static inline int device_can_wakeup(struct device *dev)
|
||||
{
|
||||
return dev->power.can_wakeup;
|
||||
|
|
@ -80,11 +73,6 @@ static inline int device_can_wakeup(struct device *dev)
|
|||
#define device_set_wakeup_enable(dev, val) do {} while (0)
|
||||
#define device_may_wakeup(dev) 0
|
||||
|
||||
static inline int call_platform_enable_wakeup(struct device *dev, int is_on)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* !CONFIG_PM */
|
||||
|
||||
#endif /* _LINUX_PM_WAKEUP_H */
|
||||
|
|
|
|||
|
|
@ -23,8 +23,6 @@
|
|||
* ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
|
||||
* OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
|
||||
* OR MODIFICATIONS.
|
||||
*
|
||||
* $Id: ppp-comp.h,v 1.6 1997/11/27 06:04:44 paulus Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
/* $Id: ppp_defs.h,v 1.2 1994/09/21 01:31:06 paulus Exp $ */
|
||||
|
||||
/*
|
||||
* ppp_defs.h - PPP definitions.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -221,6 +221,7 @@ struct bitmap {
|
|||
unsigned long syncchunk;
|
||||
|
||||
__u64 events_cleared;
|
||||
int need_sync;
|
||||
|
||||
/* bitmap spinlock */
|
||||
spinlock_t lock;
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ struct linear_private_data
|
|||
struct linear_private_data *prev; /* earlier version */
|
||||
dev_info_t **hash_table;
|
||||
sector_t hash_spacing;
|
||||
sector_t array_size;
|
||||
sector_t array_sectors;
|
||||
int preshift; /* shift before dividing by hash_spacing */
|
||||
dev_info_t disks[0];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ extern int sync_page_io(struct block_device *bdev, sector_t sector, int size,
|
|||
struct page *page, int rw);
|
||||
extern void md_do_sync(mddev_t *mddev);
|
||||
extern void md_new_event(mddev_t *mddev);
|
||||
extern void md_allow_write(mddev_t *mddev);
|
||||
extern int md_allow_write(mddev_t *mddev);
|
||||
extern void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev);
|
||||
|
||||
#endif /* CONFIG_MD */
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ struct mdk_rdev_s
|
|||
int sb_loaded;
|
||||
__u64 sb_events;
|
||||
sector_t data_offset; /* start of data in array */
|
||||
sector_t sb_offset;
|
||||
sector_t sb_start; /* offset of the super block (in 512byte sectors) */
|
||||
int sb_size; /* bytes in the superblock */
|
||||
int preferred_minor; /* autorun support */
|
||||
|
||||
|
|
@ -87,6 +87,9 @@ struct mdk_rdev_s
|
|||
#define Blocked 8 /* An error occured on an externally
|
||||
* managed array, don't allow writes
|
||||
* until it is cleared */
|
||||
#define StateChanged 9 /* Faulty or Blocked has changed during
|
||||
* interrupt, so it needs to be
|
||||
* notified by the thread */
|
||||
wait_queue_head_t blocked_wait;
|
||||
|
||||
int desc_nr; /* descriptor index in the superblock */
|
||||
|
|
@ -147,7 +150,7 @@ struct mddev_s
|
|||
int raid_disks;
|
||||
int max_disks;
|
||||
sector_t size; /* used size of component devices */
|
||||
sector_t array_size; /* exported array size */
|
||||
sector_t array_sectors; /* exported array size */
|
||||
__u64 events;
|
||||
|
||||
char uuid[16];
|
||||
|
|
@ -188,6 +191,7 @@ struct mddev_s
|
|||
* NEEDED: we might need to start a resync/recover
|
||||
* RUNNING: a thread is running, or about to be started
|
||||
* SYNC: actually doing a resync, not a recovery
|
||||
* RECOVER: doing recovery, or need to try it.
|
||||
* INTR: resync needs to be aborted for some reason
|
||||
* DONE: thread is done and is waiting to be reaped
|
||||
* REQUEST: user-space has requested a sync (used with SYNC)
|
||||
|
|
@ -198,6 +202,7 @@ struct mddev_s
|
|||
*/
|
||||
#define MD_RECOVERY_RUNNING 0
|
||||
#define MD_RECOVERY_SYNC 1
|
||||
#define MD_RECOVERY_RECOVER 2
|
||||
#define MD_RECOVERY_INTR 3
|
||||
#define MD_RECOVERY_DONE 4
|
||||
#define MD_RECOVERY_NEEDED 5
|
||||
|
|
@ -210,7 +215,8 @@ struct mddev_s
|
|||
|
||||
int in_sync; /* know to not need resync */
|
||||
struct mutex reconfig_mutex;
|
||||
atomic_t active;
|
||||
atomic_t active; /* general refcount */
|
||||
atomic_t openers; /* number of active opens */
|
||||
|
||||
int changed; /* true if we might need to reread partition info */
|
||||
int degraded; /* whether md should consider
|
||||
|
|
@ -227,6 +233,8 @@ struct mddev_s
|
|||
atomic_t recovery_active; /* blocks scheduled, but not written */
|
||||
wait_queue_head_t recovery_wait;
|
||||
sector_t recovery_cp;
|
||||
sector_t resync_min; /* user requested sync
|
||||
* starts here */
|
||||
sector_t resync_max; /* resync should pause
|
||||
* when it gets here */
|
||||
|
||||
|
|
@ -331,6 +339,9 @@ static inline char * mdname (mddev_t * mddev)
|
|||
#define rdev_for_each(rdev, tmp, mddev) \
|
||||
rdev_for_each_list(rdev, tmp, (mddev)->disks)
|
||||
|
||||
#define rdev_for_each_rcu(rdev, mddev) \
|
||||
list_for_each_entry_rcu(rdev, &((mddev)->disks), same_set)
|
||||
|
||||
typedef struct mdk_thread_s {
|
||||
void (*run) (mddev_t *mddev);
|
||||
mddev_t *mddev;
|
||||
|
|
|
|||
|
|
@ -43,14 +43,11 @@
|
|||
*/
|
||||
#define MD_RESERVED_BYTES (64 * 1024)
|
||||
#define MD_RESERVED_SECTORS (MD_RESERVED_BYTES / 512)
|
||||
#define MD_RESERVED_BLOCKS (MD_RESERVED_BYTES / BLOCK_SIZE)
|
||||
|
||||
#define MD_NEW_SIZE_SECTORS(x) ((x & ~(MD_RESERVED_SECTORS - 1)) - MD_RESERVED_SECTORS)
|
||||
#define MD_NEW_SIZE_BLOCKS(x) ((x & ~(MD_RESERVED_BLOCKS - 1)) - MD_RESERVED_BLOCKS)
|
||||
|
||||
#define MD_SB_BYTES 4096
|
||||
#define MD_SB_WORDS (MD_SB_BYTES / 4)
|
||||
#define MD_SB_BLOCKS (MD_SB_BYTES / BLOCK_SIZE)
|
||||
#define MD_SB_SECTORS (MD_SB_BYTES / 512)
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -158,6 +158,43 @@
|
|||
* the compute block completes.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Operations state - intermediate states that are visible outside of sh->lock
|
||||
* In general _idle indicates nothing is running, _run indicates a data
|
||||
* processing operation is active, and _result means the data processing result
|
||||
* is stable and can be acted upon. For simple operations like biofill and
|
||||
* compute that only have an _idle and _run state they are indicated with
|
||||
* sh->state flags (STRIPE_BIOFILL_RUN and STRIPE_COMPUTE_RUN)
|
||||
*/
|
||||
/**
|
||||
* enum check_states - handles syncing / repairing a stripe
|
||||
* @check_state_idle - check operations are quiesced
|
||||
* @check_state_run - check operation is running
|
||||
* @check_state_result - set outside lock when check result is valid
|
||||
* @check_state_compute_run - check failed and we are repairing
|
||||
* @check_state_compute_result - set outside lock when compute result is valid
|
||||
*/
|
||||
enum check_states {
|
||||
check_state_idle = 0,
|
||||
check_state_run, /* parity check */
|
||||
check_state_check_result,
|
||||
check_state_compute_run, /* parity repair */
|
||||
check_state_compute_result,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum reconstruct_states - handles writing or expanding a stripe
|
||||
*/
|
||||
enum reconstruct_states {
|
||||
reconstruct_state_idle = 0,
|
||||
reconstruct_state_prexor_drain_run, /* prexor-write */
|
||||
reconstruct_state_drain_run, /* write */
|
||||
reconstruct_state_run, /* expand */
|
||||
reconstruct_state_prexor_drain_result,
|
||||
reconstruct_state_drain_result,
|
||||
reconstruct_state_result,
|
||||
};
|
||||
|
||||
struct stripe_head {
|
||||
struct hlist_node hash;
|
||||
struct list_head lru; /* inactive_list or handle_list */
|
||||
|
|
@ -169,19 +206,13 @@ struct stripe_head {
|
|||
spinlock_t lock;
|
||||
int bm_seq; /* sequence number for bitmap flushes */
|
||||
int disks; /* disks in stripe */
|
||||
enum check_states check_state;
|
||||
enum reconstruct_states reconstruct_state;
|
||||
/* stripe_operations
|
||||
* @pending - pending ops flags (set for request->issue->complete)
|
||||
* @ack - submitted ops flags (set for issue->complete)
|
||||
* @complete - completed ops flags (set for complete)
|
||||
* @target - STRIPE_OP_COMPUTE_BLK target
|
||||
* @count - raid5_runs_ops is set to run when this is non-zero
|
||||
*/
|
||||
struct stripe_operations {
|
||||
unsigned long pending;
|
||||
unsigned long ack;
|
||||
unsigned long complete;
|
||||
int target;
|
||||
int count;
|
||||
u32 zero_sum_result;
|
||||
} ops;
|
||||
struct r5dev {
|
||||
|
|
@ -202,6 +233,7 @@ struct stripe_head_state {
|
|||
int locked, uptodate, to_read, to_write, failed, written;
|
||||
int to_fill, compute, req_compute, non_overwrite;
|
||||
int failed_num;
|
||||
unsigned long ops_request;
|
||||
};
|
||||
|
||||
/* r6_state - extra state data only relevant to r6 */
|
||||
|
|
@ -228,9 +260,7 @@ struct r6_state {
|
|||
#define R5_Wantfill 12 /* dev->toread contains a bio that needs
|
||||
* filling
|
||||
*/
|
||||
#define R5_Wantprexor 13 /* distinguish blocks ready for rmw from
|
||||
* other "towrites"
|
||||
*/
|
||||
#define R5_Wantdrain 13 /* dev->towrite needs to be drained */
|
||||
/*
|
||||
* Write method
|
||||
*/
|
||||
|
|
@ -254,8 +284,10 @@ struct r6_state {
|
|||
#define STRIPE_EXPAND_READY 11
|
||||
#define STRIPE_IO_STARTED 12 /* do not count towards 'bypass_count' */
|
||||
#define STRIPE_FULL_WRITE 13 /* all blocks are set to be overwritten */
|
||||
#define STRIPE_BIOFILL_RUN 14
|
||||
#define STRIPE_COMPUTE_RUN 15
|
||||
/*
|
||||
* Operations flags (in issue order)
|
||||
* Operation request flags
|
||||
*/
|
||||
#define STRIPE_OP_BIOFILL 0
|
||||
#define STRIPE_OP_COMPUTE_BLK 1
|
||||
|
|
@ -263,14 +295,6 @@ struct r6_state {
|
|||
#define STRIPE_OP_BIODRAIN 3
|
||||
#define STRIPE_OP_POSTXOR 4
|
||||
#define STRIPE_OP_CHECK 5
|
||||
#define STRIPE_OP_IO 6
|
||||
|
||||
/* modifiers to the base operations
|
||||
* STRIPE_OP_MOD_REPAIR_PD - compute the parity block and write it back
|
||||
* STRIPE_OP_MOD_DMA_CHECK - parity is not corrupted by the check
|
||||
*/
|
||||
#define STRIPE_OP_MOD_REPAIR_PD 7
|
||||
#define STRIPE_OP_MOD_DMA_CHECK 8
|
||||
|
||||
/*
|
||||
* Plugging:
|
||||
|
|
|
|||
|
|
@ -34,26 +34,37 @@
|
|||
* RFKILL_TYPE_BLUETOOTH: switch is on a bluetooth device.
|
||||
* RFKILL_TYPE_UWB: switch is on a ultra wideband device.
|
||||
* RFKILL_TYPE_WIMAX: switch is on a WiMAX device.
|
||||
* RFKILL_TYPE_WWAN: switch is on a wireless WAN device.
|
||||
*/
|
||||
enum rfkill_type {
|
||||
RFKILL_TYPE_WLAN ,
|
||||
RFKILL_TYPE_BLUETOOTH,
|
||||
RFKILL_TYPE_UWB,
|
||||
RFKILL_TYPE_WIMAX,
|
||||
RFKILL_TYPE_WWAN,
|
||||
RFKILL_TYPE_MAX,
|
||||
};
|
||||
|
||||
enum rfkill_state {
|
||||
RFKILL_STATE_OFF = 0,
|
||||
RFKILL_STATE_ON = 1,
|
||||
RFKILL_STATE_SOFT_BLOCKED = 0, /* Radio output blocked */
|
||||
RFKILL_STATE_UNBLOCKED = 1, /* Radio output allowed */
|
||||
RFKILL_STATE_HARD_BLOCKED = 2, /* Output blocked, non-overrideable */
|
||||
};
|
||||
|
||||
/*
|
||||
* These are DEPRECATED, drivers using them should be verified to
|
||||
* comply with the rfkill usage guidelines in Documentation/rfkill.txt
|
||||
* and then converted to use the new names for rfkill_state
|
||||
*/
|
||||
#define RFKILL_STATE_OFF RFKILL_STATE_SOFT_BLOCKED
|
||||
#define RFKILL_STATE_ON RFKILL_STATE_UNBLOCKED
|
||||
|
||||
/**
|
||||
* struct rfkill - rfkill control structure.
|
||||
* @name: Name of the switch.
|
||||
* @type: Radio type which the button controls, the value stored
|
||||
* here should be a value from enum rfkill_type.
|
||||
* @state: State of the switch (on/off).
|
||||
* @state: State of the switch, "UNBLOCKED" means radio can operate.
|
||||
* @user_claim_unsupported: Whether the hardware supports exclusive
|
||||
* RF-kill control by userspace. Set this before registering.
|
||||
* @user_claim: Set when the switch is controlled exlusively by userspace.
|
||||
|
|
@ -61,6 +72,12 @@ enum rfkill_state {
|
|||
* @data: Pointer to the RF button drivers private data which will be
|
||||
* passed along when toggling radio state.
|
||||
* @toggle_radio(): Mandatory handler to control state of the radio.
|
||||
* only RFKILL_STATE_SOFT_BLOCKED and RFKILL_STATE_UNBLOCKED are
|
||||
* valid parameters.
|
||||
* @get_state(): handler to read current radio state from hardware,
|
||||
* may be called from atomic context, should return 0 on success.
|
||||
* Either this handler OR judicious use of rfkill_force_state() is
|
||||
* MANDATORY for any driver capable of RFKILL_STATE_HARD_BLOCKED.
|
||||
* @led_trigger: A LED trigger for this button's LED.
|
||||
* @dev: Device structure integrating the switch into device tree.
|
||||
* @node: Used to place switch into list of all switches known to the
|
||||
|
|
@ -80,6 +97,7 @@ struct rfkill {
|
|||
|
||||
void *data;
|
||||
int (*toggle_radio)(void *data, enum rfkill_state state);
|
||||
int (*get_state)(void *data, enum rfkill_state *state);
|
||||
|
||||
#ifdef CONFIG_RFKILL_LEDS
|
||||
struct led_trigger led_trigger;
|
||||
|
|
@ -95,6 +113,21 @@ void rfkill_free(struct rfkill *rfkill);
|
|||
int rfkill_register(struct rfkill *rfkill);
|
||||
void rfkill_unregister(struct rfkill *rfkill);
|
||||
|
||||
int rfkill_force_state(struct rfkill *rfkill, enum rfkill_state state);
|
||||
|
||||
/**
|
||||
* rfkill_state_complement - return complementar state
|
||||
* @state: state to return the complement of
|
||||
*
|
||||
* Returns RFKILL_STATE_SOFT_BLOCKED if @state is RFKILL_STATE_UNBLOCKED,
|
||||
* returns RFKILL_STATE_UNBLOCKED otherwise.
|
||||
*/
|
||||
static inline enum rfkill_state rfkill_state_complement(enum rfkill_state state)
|
||||
{
|
||||
return (state == RFKILL_STATE_UNBLOCKED) ?
|
||||
RFKILL_STATE_SOFT_BLOCKED : RFKILL_STATE_UNBLOCKED;
|
||||
}
|
||||
|
||||
/**
|
||||
* rfkill_get_led_name - Get the LED trigger name for the button's LED.
|
||||
* This function might return a NULL pointer if registering of the
|
||||
|
|
@ -110,4 +143,11 @@ static inline char *rfkill_get_led_name(struct rfkill *rfkill)
|
|||
#endif
|
||||
}
|
||||
|
||||
/* rfkill notification chain */
|
||||
#define RFKILL_STATE_CHANGED 0x0001 /* state of a normal rfkill
|
||||
switch has changed */
|
||||
|
||||
int register_rfkill_notifier(struct notifier_block *nb);
|
||||
int unregister_rfkill_notifier(struct notifier_block *nb);
|
||||
|
||||
#endif /* RFKILL_H */
|
||||
|
|
|
|||
|
|
@ -482,6 +482,7 @@ enum
|
|||
TCA_RATE,
|
||||
TCA_FCNT,
|
||||
TCA_STATS2,
|
||||
TCA_STAB,
|
||||
__TCA_MAX
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1062,12 +1062,6 @@ struct task_struct {
|
|||
#endif
|
||||
|
||||
struct list_head tasks;
|
||||
/*
|
||||
* ptrace_list/ptrace_children forms the list of my children
|
||||
* that were stolen by a ptracer.
|
||||
*/
|
||||
struct list_head ptrace_children;
|
||||
struct list_head ptrace_list;
|
||||
|
||||
struct mm_struct *mm, *active_mm;
|
||||
|
||||
|
|
@ -1089,18 +1083,25 @@ struct task_struct {
|
|||
/*
|
||||
* pointers to (original) parent process, youngest child, younger sibling,
|
||||
* older sibling, respectively. (p->father can be replaced with
|
||||
* p->parent->pid)
|
||||
* p->real_parent->pid)
|
||||
*/
|
||||
struct task_struct *real_parent; /* real parent process (when being debugged) */
|
||||
struct task_struct *parent; /* parent process */
|
||||
struct task_struct *real_parent; /* real parent process */
|
||||
struct task_struct *parent; /* recipient of SIGCHLD, wait4() reports */
|
||||
/*
|
||||
* children/sibling forms the list of my children plus the
|
||||
* tasks I'm ptracing.
|
||||
* children/sibling forms the list of my natural children
|
||||
*/
|
||||
struct list_head children; /* list of my children */
|
||||
struct list_head sibling; /* linkage in my parent's children list */
|
||||
struct task_struct *group_leader; /* threadgroup leader */
|
||||
|
||||
/*
|
||||
* ptraced is the list of tasks this task is using ptrace on.
|
||||
* This includes both natural children and PTRACE_ATTACH targets.
|
||||
* p->ptrace_entry is p's link on the p->parent->ptraced list.
|
||||
*/
|
||||
struct list_head ptraced;
|
||||
struct list_head ptrace_entry;
|
||||
|
||||
/* PID/PID hash table linkage. */
|
||||
struct pid_link pids[PIDTYPE_MAX];
|
||||
struct list_head thread_group;
|
||||
|
|
@ -1876,9 +1877,6 @@ extern void wait_task_inactive(struct task_struct * p);
|
|||
#define wait_task_inactive(p) do { } while (0)
|
||||
#endif
|
||||
|
||||
#define remove_parent(p) list_del_init(&(p)->sibling)
|
||||
#define add_parent(p) list_add_tail(&(p)->sibling,&(p)->parent->children)
|
||||
|
||||
#define next_task(p) list_entry(rcu_dereference((p)->tasks.next), struct task_struct, tasks)
|
||||
|
||||
#define for_each_process(p) \
|
||||
|
|
|
|||
|
|
@ -14,7 +14,10 @@ struct seq_net_private {
|
|||
|
||||
int seq_open_net(struct inode *, struct file *,
|
||||
const struct seq_operations *, int);
|
||||
int single_open_net(struct inode *, struct file *file,
|
||||
int (*show)(struct seq_file *, void *));
|
||||
int seq_release_net(struct inode *, struct file *);
|
||||
int single_release_net(struct inode *, struct file *);
|
||||
static inline struct net *seq_file_net(struct seq_file *seq)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
|
|
|
|||
|
|
@ -190,6 +190,7 @@ struct uart_ops {
|
|||
void (*break_ctl)(struct uart_port *, int ctl);
|
||||
int (*startup)(struct uart_port *);
|
||||
void (*shutdown)(struct uart_port *);
|
||||
void (*flush_buffer)(struct uart_port *);
|
||||
void (*set_termios)(struct uart_port *, struct ktermios *new,
|
||||
struct ktermios *old);
|
||||
void (*set_ldisc)(struct uart_port *);
|
||||
|
|
@ -343,13 +344,15 @@ typedef unsigned int __bitwise__ uif_t;
|
|||
* stuff here.
|
||||
*/
|
||||
struct uart_info {
|
||||
struct tty_struct *tty;
|
||||
struct tty_port port;
|
||||
struct circ_buf xmit;
|
||||
uif_t flags;
|
||||
|
||||
/*
|
||||
* Definitions for info->flags. These are _private_ to serial_core, and
|
||||
* are specific to this structure. They may be queried by low level drivers.
|
||||
*
|
||||
* FIXME: use the ASY_ definitions
|
||||
*/
|
||||
#define UIF_CHECK_CD ((__force uif_t) (1 << 25))
|
||||
#define UIF_CTS_FLOW ((__force uif_t) (1 << 26))
|
||||
|
|
@ -357,11 +360,7 @@ struct uart_info {
|
|||
#define UIF_INITIALIZED ((__force uif_t) (1 << 31))
|
||||
#define UIF_SUSPENDED ((__force uif_t) (1 << 30))
|
||||
|
||||
int blocked_open;
|
||||
|
||||
struct tasklet_struct tlet;
|
||||
|
||||
wait_queue_head_t open_wait;
|
||||
wait_queue_head_t delta_msr_wait;
|
||||
};
|
||||
|
||||
|
|
@ -438,8 +437,8 @@ int uart_resume_port(struct uart_driver *reg, struct uart_port *port);
|
|||
#define uart_circ_chars_free(circ) \
|
||||
(CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE))
|
||||
|
||||
#define uart_tx_stopped(port) \
|
||||
((port)->info->tty->stopped || (port)->info->tty->hw_stopped)
|
||||
#define uart_tx_stopped(portp) \
|
||||
((portp)->info->port.tty->stopped || (portp)->info->port.tty->hw_stopped)
|
||||
|
||||
/*
|
||||
* The following are helper functions for the low level drivers.
|
||||
|
|
@ -450,7 +449,7 @@ uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
|
|||
#ifdef SUPPORT_SYSRQ
|
||||
if (port->sysrq) {
|
||||
if (ch && time_before(jiffies, port->sysrq)) {
|
||||
handle_sysrq(ch, port->info ? port->info->tty : NULL);
|
||||
handle_sysrq(ch, port->info ? port->info->port.tty : NULL);
|
||||
port->sysrq = 0;
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -479,7 +478,7 @@ static inline int uart_handle_break(struct uart_port *port)
|
|||
}
|
||||
#endif
|
||||
if (port->flags & UPF_SAK)
|
||||
do_SAK(info->tty);
|
||||
do_SAK(info->port.tty);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -502,9 +501,9 @@ uart_handle_dcd_change(struct uart_port *port, unsigned int status)
|
|||
|
||||
if (info->flags & UIF_CHECK_CD) {
|
||||
if (status)
|
||||
wake_up_interruptible(&info->open_wait);
|
||||
else if (info->tty)
|
||||
tty_hangup(info->tty);
|
||||
wake_up_interruptible(&info->port.open_wait);
|
||||
else if (info->port.tty)
|
||||
tty_hangup(info->port.tty);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -517,7 +516,7 @@ static inline void
|
|||
uart_handle_cts_change(struct uart_port *port, unsigned int status)
|
||||
{
|
||||
struct uart_info *info = port->info;
|
||||
struct tty_struct *tty = info->tty;
|
||||
struct tty_struct *tty = info->port.tty;
|
||||
|
||||
port->icount.cts++;
|
||||
|
||||
|
|
@ -543,7 +542,7 @@ static inline void
|
|||
uart_insert_char(struct uart_port *port, unsigned int status,
|
||||
unsigned int overrun, unsigned int ch, unsigned int flag)
|
||||
{
|
||||
struct tty_struct *tty = port->info->tty;
|
||||
struct tty_struct *tty = port->info->port.tty;
|
||||
|
||||
if ((status & port->ignore_status_mask & ~overrun) == 0)
|
||||
tty_insert_flip_char(tty, ch, flag);
|
||||
|
|
|
|||
|
|
@ -175,7 +175,7 @@ static inline void serio_unpin_driver(struct serio *serio)
|
|||
#define SERIO_8042_XL 0x06
|
||||
|
||||
/*
|
||||
* Serio types
|
||||
* Serio protocols
|
||||
*/
|
||||
#define SERIO_UNKNOWN 0x00
|
||||
#define SERIO_MSC 0x01
|
||||
|
|
@ -212,5 +212,7 @@ static inline void serio_unpin_driver(struct serio *serio)
|
|||
#define SERIO_TAOSEVM 0x34
|
||||
#define SERIO_FUJITSU 0x35
|
||||
#define SERIO_ZHENHUA 0x36
|
||||
#define SERIO_INEXIO 0x37
|
||||
#define SERIO_TOUCHIT213 0x37
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -246,6 +246,7 @@ typedef unsigned char *sk_buff_data_t;
|
|||
* @dma_cookie: a cookie to one of several possible DMA operations
|
||||
* done by skb DMA functions
|
||||
* @secmark: security marking
|
||||
* @vlan_tci: vlan tag control information
|
||||
*/
|
||||
|
||||
struct sk_buff {
|
||||
|
|
@ -305,9 +306,7 @@ struct sk_buff {
|
|||
#endif
|
||||
|
||||
int iif;
|
||||
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
|
||||
__u16 queue_mapping;
|
||||
#endif
|
||||
#ifdef CONFIG_NET_SCHED
|
||||
__u16 tc_index; /* traffic control index */
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
|
|
@ -328,6 +327,8 @@ struct sk_buff {
|
|||
|
||||
__u32 mark;
|
||||
|
||||
__u16 vlan_tci;
|
||||
|
||||
sk_buff_data_t transport_header;
|
||||
sk_buff_data_t network_header;
|
||||
sk_buff_data_t mac_header;
|
||||
|
|
@ -1671,25 +1672,17 @@ static inline void skb_init_secmark(struct sk_buff *skb)
|
|||
|
||||
static inline void skb_set_queue_mapping(struct sk_buff *skb, u16 queue_mapping)
|
||||
{
|
||||
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
|
||||
skb->queue_mapping = queue_mapping;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline u16 skb_get_queue_mapping(struct sk_buff *skb)
|
||||
{
|
||||
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
|
||||
return skb->queue_mapping;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void skb_copy_queue_mapping(struct sk_buff *to, const struct sk_buff *from)
|
||||
{
|
||||
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
|
||||
to->queue_mapping = from->queue_mapping;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int skb_is_gso(const struct sk_buff *skb)
|
||||
|
|
@ -1702,6 +1695,20 @@ static inline int skb_is_gso_v6(const struct sk_buff *skb)
|
|||
return skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6;
|
||||
}
|
||||
|
||||
extern void __skb_warn_lro_forwarding(const struct sk_buff *skb);
|
||||
|
||||
static inline bool skb_warn_if_lro(const struct sk_buff *skb)
|
||||
{
|
||||
/* LRO sets gso_size but not gso_type, whereas if GSO is really
|
||||
* wanted then gso_type will be set. */
|
||||
struct skb_shared_info *shinfo = skb_shinfo(skb);
|
||||
if (shinfo->gso_size != 0 && unlikely(shinfo->gso_type == 0)) {
|
||||
__skb_warn_lro_forwarding(skb);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void skb_forward_csum(struct sk_buff *skb)
|
||||
{
|
||||
/* Unfortunately we don't support this one. Any brave souls? */
|
||||
|
|
|
|||
12
include/linux/smc911x.h
Normal file
12
include/linux/smc911x.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef __SMC911X_H__
|
||||
#define __SMC911X_H__
|
||||
|
||||
#define SMC911X_USE_16BIT (1 << 0)
|
||||
#define SMC911X_USE_32BIT (1 << 1)
|
||||
|
||||
struct smc911x_platdata {
|
||||
unsigned long flags;
|
||||
unsigned long irq_flags; /* IRQF_... */
|
||||
};
|
||||
|
||||
#endif /* __SMC911X_H__ */
|
||||
|
|
@ -306,10 +306,10 @@ extern int csum_partial_copy_fromiovecend(unsigned char *kdata,
|
|||
int offset,
|
||||
unsigned int len, __wsum *csump);
|
||||
|
||||
extern int verify_iovec(struct msghdr *m, struct iovec *iov, char *address, int mode);
|
||||
extern int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode);
|
||||
extern int memcpy_toiovec(struct iovec *v, unsigned char *kdata, int len);
|
||||
extern int move_addr_to_user(void *kaddr, int klen, void __user *uaddr, int __user *ulen);
|
||||
extern int move_addr_to_kernel(void __user *uaddr, int ulen, void *kaddr);
|
||||
extern int move_addr_to_user(struct sockaddr *kaddr, int klen, void __user *uaddr, int __user *ulen);
|
||||
extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr);
|
||||
extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ struct sonet_stats {
|
|||
/* clear error insertion */
|
||||
#define SONET_GETDIAG _IOR('a',ATMIOC_PHYTYP+4,int)
|
||||
/* query error insertion */
|
||||
#define SONET_SETFRAMING _IO('a',ATMIOC_PHYTYP+5)
|
||||
#define SONET_SETFRAMING _IOW('a',ATMIOC_PHYTYP+5,int)
|
||||
/* set framing mode (SONET/SDH) */
|
||||
#define SONET_GETFRAMING _IOR('a',ATMIOC_PHYTYP+6,int)
|
||||
/* get framing mode */
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
||||
#include <linux/ssb/ssb_regs.h>
|
||||
|
||||
|
|
@ -137,9 +138,6 @@ struct ssb_device {
|
|||
const struct ssb_bus_ops *ops;
|
||||
|
||||
struct device *dev;
|
||||
/* Pointer to the device that has to be used for
|
||||
* any DMA related operation. */
|
||||
struct device *dma_dev;
|
||||
|
||||
struct ssb_bus *bus;
|
||||
struct ssb_device_id id;
|
||||
|
|
@ -399,13 +397,151 @@ static inline void ssb_block_write(struct ssb_device *dev, const void *buffer,
|
|||
#endif /* CONFIG_SSB_BLOCKIO */
|
||||
|
||||
|
||||
/* The SSB DMA API. Use this API for any DMA operation on the device.
|
||||
* This API basically is a wrapper that calls the correct DMA API for
|
||||
* the host device type the SSB device is attached to. */
|
||||
|
||||
/* Translation (routing) bits that need to be ORed to DMA
|
||||
* addresses before they are given to a device. */
|
||||
extern u32 ssb_dma_translation(struct ssb_device *dev);
|
||||
#define SSB_DMA_TRANSLATION_MASK 0xC0000000
|
||||
#define SSB_DMA_TRANSLATION_SHIFT 30
|
||||
|
||||
extern int ssb_dma_set_mask(struct ssb_device *ssb_dev, u64 mask);
|
||||
extern int ssb_dma_set_mask(struct ssb_device *dev, u64 mask);
|
||||
|
||||
extern void * ssb_dma_alloc_consistent(struct ssb_device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t gfp_flags);
|
||||
extern void ssb_dma_free_consistent(struct ssb_device *dev, size_t size,
|
||||
void *vaddr, dma_addr_t dma_handle,
|
||||
gfp_t gfp_flags);
|
||||
|
||||
static inline void __cold __ssb_dma_not_implemented(struct ssb_device *dev)
|
||||
{
|
||||
#ifdef CONFIG_SSB_DEBUG
|
||||
printk(KERN_ERR "SSB: BUG! Calling DMA API for "
|
||||
"unsupported bustype %d\n", dev->bus->bustype);
|
||||
#endif /* DEBUG */
|
||||
}
|
||||
|
||||
static inline int ssb_dma_mapping_error(struct ssb_device *dev, dma_addr_t addr)
|
||||
{
|
||||
switch (dev->bus->bustype) {
|
||||
case SSB_BUSTYPE_PCI:
|
||||
return pci_dma_mapping_error(addr);
|
||||
case SSB_BUSTYPE_SSB:
|
||||
return dma_mapping_error(addr);
|
||||
default:
|
||||
__ssb_dma_not_implemented(dev);
|
||||
}
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline dma_addr_t ssb_dma_map_single(struct ssb_device *dev, void *p,
|
||||
size_t size, enum dma_data_direction dir)
|
||||
{
|
||||
switch (dev->bus->bustype) {
|
||||
case SSB_BUSTYPE_PCI:
|
||||
return pci_map_single(dev->bus->host_pci, p, size, dir);
|
||||
case SSB_BUSTYPE_SSB:
|
||||
return dma_map_single(dev->dev, p, size, dir);
|
||||
default:
|
||||
__ssb_dma_not_implemented(dev);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void ssb_dma_unmap_single(struct ssb_device *dev, dma_addr_t dma_addr,
|
||||
size_t size, enum dma_data_direction dir)
|
||||
{
|
||||
switch (dev->bus->bustype) {
|
||||
case SSB_BUSTYPE_PCI:
|
||||
pci_unmap_single(dev->bus->host_pci, dma_addr, size, dir);
|
||||
return;
|
||||
case SSB_BUSTYPE_SSB:
|
||||
dma_unmap_single(dev->dev, dma_addr, size, dir);
|
||||
return;
|
||||
default:
|
||||
__ssb_dma_not_implemented(dev);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void ssb_dma_sync_single_for_cpu(struct ssb_device *dev,
|
||||
dma_addr_t dma_addr,
|
||||
size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
switch (dev->bus->bustype) {
|
||||
case SSB_BUSTYPE_PCI:
|
||||
pci_dma_sync_single_for_cpu(dev->bus->host_pci, dma_addr,
|
||||
size, dir);
|
||||
return;
|
||||
case SSB_BUSTYPE_SSB:
|
||||
dma_sync_single_for_cpu(dev->dev, dma_addr, size, dir);
|
||||
return;
|
||||
default:
|
||||
__ssb_dma_not_implemented(dev);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void ssb_dma_sync_single_for_device(struct ssb_device *dev,
|
||||
dma_addr_t dma_addr,
|
||||
size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
switch (dev->bus->bustype) {
|
||||
case SSB_BUSTYPE_PCI:
|
||||
pci_dma_sync_single_for_device(dev->bus->host_pci, dma_addr,
|
||||
size, dir);
|
||||
return;
|
||||
case SSB_BUSTYPE_SSB:
|
||||
dma_sync_single_for_device(dev->dev, dma_addr, size, dir);
|
||||
return;
|
||||
default:
|
||||
__ssb_dma_not_implemented(dev);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void ssb_dma_sync_single_range_for_cpu(struct ssb_device *dev,
|
||||
dma_addr_t dma_addr,
|
||||
unsigned long offset,
|
||||
size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
switch (dev->bus->bustype) {
|
||||
case SSB_BUSTYPE_PCI:
|
||||
/* Just sync everything. That's all the PCI API can do. */
|
||||
pci_dma_sync_single_for_cpu(dev->bus->host_pci, dma_addr,
|
||||
offset + size, dir);
|
||||
return;
|
||||
case SSB_BUSTYPE_SSB:
|
||||
dma_sync_single_range_for_cpu(dev->dev, dma_addr, offset,
|
||||
size, dir);
|
||||
return;
|
||||
default:
|
||||
__ssb_dma_not_implemented(dev);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void ssb_dma_sync_single_range_for_device(struct ssb_device *dev,
|
||||
dma_addr_t dma_addr,
|
||||
unsigned long offset,
|
||||
size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
switch (dev->bus->bustype) {
|
||||
case SSB_BUSTYPE_PCI:
|
||||
/* Just sync everything. That's all the PCI API can do. */
|
||||
pci_dma_sync_single_for_device(dev->bus->host_pci, dma_addr,
|
||||
offset + size, dir);
|
||||
return;
|
||||
case SSB_BUSTYPE_SSB:
|
||||
dma_sync_single_range_for_device(dev->dev, dma_addr, offset,
|
||||
size, dir);
|
||||
return;
|
||||
default:
|
||||
__ssb_dma_not_implemented(dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_SSB_PCIHOST
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ struct stlrq {
|
|||
*/
|
||||
struct stlport {
|
||||
unsigned long magic;
|
||||
struct tty_port port;
|
||||
unsigned int portnr;
|
||||
unsigned int panelnr;
|
||||
unsigned int brdnr;
|
||||
|
|
@ -76,12 +77,10 @@ struct stlport {
|
|||
int uartaddr;
|
||||
unsigned int pagenr;
|
||||
unsigned long istate;
|
||||
int flags;
|
||||
int baud_base;
|
||||
int custom_divisor;
|
||||
int close_delay;
|
||||
int closing_wait;
|
||||
int refcount;
|
||||
int openwaitcnt;
|
||||
int brklen;
|
||||
unsigned int sigs;
|
||||
|
|
@ -92,9 +91,6 @@ struct stlport {
|
|||
unsigned long clk;
|
||||
unsigned long hwid;
|
||||
void *uartp;
|
||||
struct tty_struct *tty;
|
||||
wait_queue_head_t open_wait;
|
||||
wait_queue_head_t close_wait;
|
||||
comstats_t stats;
|
||||
struct stlrq tx;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@
|
|||
* Andy Adamson <andros@umich.edu>
|
||||
* Bruce Fields <bfields@umich.edu>
|
||||
* Copyright (c) 2000 The Regents of the University of Michigan
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_SUNRPC_AUTH_GSS_H
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@
|
|||
* Andy Adamson <andros@umich.edu>
|
||||
* Bruce Fields <bfields@umich.edu>
|
||||
* Copyright (c) 2000 The Regents of the University of Michigan
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_SUNRPC_GSS_API_H
|
||||
|
|
|
|||
|
|
@ -51,6 +51,9 @@ struct krb5_ctx {
|
|||
|
||||
extern spinlock_t krb5_seq_lock;
|
||||
|
||||
/* The length of the Kerberos GSS token header */
|
||||
#define GSS_KRB5_TOK_HDR_LEN (16)
|
||||
|
||||
#define KG_TOK_MIC_MSG 0x0101
|
||||
#define KG_TOK_WRAP_MSG 0x0201
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
/*
|
||||
* This is the RPC server thread function prototype
|
||||
*/
|
||||
typedef void (*svc_thread_fn)(struct svc_rqst *);
|
||||
typedef int (*svc_thread_fn)(void *);
|
||||
|
||||
/*
|
||||
*
|
||||
|
|
@ -80,7 +80,6 @@ struct svc_serv {
|
|||
struct module * sv_module; /* optional module to count when
|
||||
* adding threads */
|
||||
svc_thread_fn sv_function; /* main function for threads */
|
||||
int sv_kill_signal; /* signal to kill threads */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -388,8 +387,8 @@ struct svc_rqst *svc_prepare_thread(struct svc_serv *serv,
|
|||
struct svc_pool *pool);
|
||||
void svc_exit_thread(struct svc_rqst *);
|
||||
struct svc_serv * svc_create_pooled(struct svc_program *, unsigned int,
|
||||
void (*shutdown)(struct svc_serv*),
|
||||
svc_thread_fn, int sig, struct module *);
|
||||
void (*shutdown)(struct svc_serv*), svc_thread_fn,
|
||||
struct module *);
|
||||
int svc_set_num_threads(struct svc_serv *, struct svc_pool *, int);
|
||||
void svc_destroy(struct svc_serv *);
|
||||
int svc_process(struct svc_rqst *);
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ extern atomic_t rdma_stat_sq_prod;
|
|||
*/
|
||||
struct svc_rdma_op_ctxt {
|
||||
struct svc_rdma_op_ctxt *read_hdr;
|
||||
struct list_head free_list;
|
||||
int hdr_count;
|
||||
struct xdr_buf arg;
|
||||
struct list_head dto_q;
|
||||
enum ib_wr_opcode wr_op;
|
||||
|
|
@ -86,6 +86,31 @@ struct svc_rdma_op_ctxt {
|
|||
struct page *pages[RPCSVC_MAXPAGES];
|
||||
};
|
||||
|
||||
/*
|
||||
* NFS_ requests are mapped on the client side by the chunk lists in
|
||||
* the RPCRDMA header. During the fetching of the RPC from the client
|
||||
* and the writing of the reply to the client, the memory in the
|
||||
* client and the memory in the server must be mapped as contiguous
|
||||
* vaddr/len for access by the hardware. These data strucures keep
|
||||
* these mappings.
|
||||
*
|
||||
* For an RDMA_WRITE, the 'sge' maps the RPC REPLY. For RDMA_READ, the
|
||||
* 'sge' in the svc_rdma_req_map maps the server side RPC reply and the
|
||||
* 'ch' field maps the read-list of the RPCRDMA header to the 'sge'
|
||||
* mapping of the reply.
|
||||
*/
|
||||
struct svc_rdma_chunk_sge {
|
||||
int start; /* sge no for this chunk */
|
||||
int count; /* sge count for this chunk */
|
||||
};
|
||||
struct svc_rdma_req_map {
|
||||
unsigned long count;
|
||||
union {
|
||||
struct kvec sge[RPCSVC_MAXPAGES];
|
||||
struct svc_rdma_chunk_sge ch[RPCSVC_MAXPAGES];
|
||||
};
|
||||
};
|
||||
|
||||
#define RDMACTXT_F_LAST_CTXT 2
|
||||
|
||||
struct svcxprt_rdma {
|
||||
|
|
@ -93,7 +118,6 @@ struct svcxprt_rdma {
|
|||
struct rdma_cm_id *sc_cm_id; /* RDMA connection id */
|
||||
struct list_head sc_accept_q; /* Conn. waiting accept */
|
||||
int sc_ord; /* RDMA read limit */
|
||||
wait_queue_head_t sc_read_wait;
|
||||
int sc_max_sge;
|
||||
|
||||
int sc_sq_depth; /* Depth of SQ */
|
||||
|
|
@ -104,12 +128,8 @@ struct svcxprt_rdma {
|
|||
|
||||
struct ib_pd *sc_pd;
|
||||
|
||||
atomic_t sc_dma_used;
|
||||
atomic_t sc_ctxt_used;
|
||||
struct list_head sc_ctxt_free;
|
||||
int sc_ctxt_cnt;
|
||||
int sc_ctxt_bump;
|
||||
int sc_ctxt_max;
|
||||
spinlock_t sc_ctxt_lock;
|
||||
struct list_head sc_rq_dto_q;
|
||||
spinlock_t sc_rq_dto_lock;
|
||||
struct ib_qp *sc_qp;
|
||||
|
|
@ -173,6 +193,8 @@ extern int svc_rdma_post_recv(struct svcxprt_rdma *);
|
|||
extern int svc_rdma_create_listen(struct svc_serv *, int, struct sockaddr *);
|
||||
extern struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *);
|
||||
extern void svc_rdma_put_context(struct svc_rdma_op_ctxt *, int);
|
||||
extern struct svc_rdma_req_map *svc_rdma_get_req_map(void);
|
||||
extern void svc_rdma_put_req_map(struct svc_rdma_req_map *);
|
||||
extern void svc_sq_reap(struct svcxprt_rdma *);
|
||||
extern void svc_rq_reap(struct svcxprt_rdma *);
|
||||
extern struct svc_xprt_class svc_rdma_class;
|
||||
|
|
|
|||
|
|
@ -3,9 +3,6 @@
|
|||
*
|
||||
* Bruce Fields <bfields@umich.edu>
|
||||
* Copyright (c) 2002 The Regents of the Unviersity of Michigan
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_SUNRPC_SVCAUTH_GSS_H
|
||||
|
|
|
|||
|
|
@ -86,6 +86,11 @@ typedef int __bitwise suspend_state_t;
|
|||
* that implement @begin(), but platforms implementing @begin() should
|
||||
* also provide a @end() which cleans up transitions aborted before
|
||||
* @enter().
|
||||
*
|
||||
* @recover: Recover the platform from a suspend failure.
|
||||
* Called by the PM core if the suspending of devices fails.
|
||||
* This callback is optional and should only be implemented by platforms
|
||||
* which require special recovery actions in that situation.
|
||||
*/
|
||||
struct platform_suspend_ops {
|
||||
int (*valid)(suspend_state_t state);
|
||||
|
|
@ -94,6 +99,7 @@ struct platform_suspend_ops {
|
|||
int (*enter)(suspend_state_t state);
|
||||
void (*finish)(void);
|
||||
void (*end)(void);
|
||||
void (*recover)(void);
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
|
|
@ -149,7 +155,7 @@ extern void mark_free_pages(struct zone *zone);
|
|||
* The methods in this structure allow a platform to carry out special
|
||||
* operations required by it during a hibernation transition.
|
||||
*
|
||||
* All the methods below must be implemented.
|
||||
* All the methods below, except for @recover(), must be implemented.
|
||||
*
|
||||
* @begin: Tell the platform driver that we're starting hibernation.
|
||||
* Called right after shrinking memory and before freezing devices.
|
||||
|
|
@ -189,6 +195,11 @@ extern void mark_free_pages(struct zone *zone);
|
|||
* @restore_cleanup: Clean up after a failing image restoration.
|
||||
* Called right after the nonboot CPUs have been enabled and before
|
||||
* thawing devices (runs with IRQs on).
|
||||
*
|
||||
* @recover: Recover the platform from a failure to suspend devices.
|
||||
* Called by the PM core if the suspending of devices during hibernation
|
||||
* fails. This callback is optional and should only be implemented by
|
||||
* platforms which require special recovery actions in that situation.
|
||||
*/
|
||||
struct platform_hibernation_ops {
|
||||
int (*begin)(void);
|
||||
|
|
@ -200,6 +211,7 @@ struct platform_hibernation_ops {
|
|||
void (*leave)(void);
|
||||
int (*pre_restore)(void);
|
||||
void (*restore_cleanup)(void);
|
||||
void (*recover)(void);
|
||||
};
|
||||
|
||||
#ifdef CONFIG_HIBERNATION
|
||||
|
|
|
|||
|
|
@ -224,6 +224,12 @@ struct tcp_options_received {
|
|||
u16 mss_clamp; /* Maximal mss, negotiated at connection setup */
|
||||
};
|
||||
|
||||
/* This is the max number of SACKS that we'll generate and process. It's safe
|
||||
* to increse this, although since:
|
||||
* size = TCPOLEN_SACK_BASE_ALIGNED (4) + n * TCPOLEN_SACK_PERBLOCK (8)
|
||||
* only four options will fit in a standard TCP header */
|
||||
#define TCP_NUM_SACKS 4
|
||||
|
||||
struct tcp_request_sock {
|
||||
struct inet_request_sock req;
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
|
|
@ -291,10 +297,9 @@ struct tcp_sock {
|
|||
u32 rcv_ssthresh; /* Current window clamp */
|
||||
|
||||
u32 frto_highmark; /* snd_nxt when RTO occurred */
|
||||
u8 reordering; /* Packet reordering metric. */
|
||||
u16 advmss; /* Advertised MSS */
|
||||
u8 frto_counter; /* Number of new acks after RTO */
|
||||
u8 nonagle; /* Disable Nagle algorithm? */
|
||||
u8 keepalive_probes; /* num of allowed keep alive probes */
|
||||
|
||||
/* RTT measurement */
|
||||
u32 srtt; /* smoothed round trip time << 3 */
|
||||
|
|
@ -305,6 +310,10 @@ struct tcp_sock {
|
|||
|
||||
u32 packets_out; /* Packets which are "in flight" */
|
||||
u32 retrans_out; /* Retransmitted packets out */
|
||||
|
||||
u16 urg_data; /* Saved octet of OOB data and control flags */
|
||||
u8 urg_mode; /* In urgent mode */
|
||||
u8 ecn_flags; /* ECN status bits. */
|
||||
/*
|
||||
* Options received (usually on last packet, some only on SYN packets).
|
||||
*/
|
||||
|
|
@ -320,13 +329,24 @@ struct tcp_sock {
|
|||
u32 snd_cwnd_used;
|
||||
u32 snd_cwnd_stamp;
|
||||
|
||||
struct sk_buff_head out_of_order_queue; /* Out of order segments go here */
|
||||
|
||||
u32 rcv_wnd; /* Current receiver window */
|
||||
u32 write_seq; /* Tail(+1) of data held in tcp send buffer */
|
||||
u32 pushed_seq; /* Last pushed seq, required to talk to windows */
|
||||
u32 lost_out; /* Lost packets */
|
||||
u32 sacked_out; /* SACK'd packets */
|
||||
u32 fackets_out; /* FACK'd packets */
|
||||
u32 tso_deferred;
|
||||
u32 bytes_acked; /* Appropriate Byte Counting - RFC3465 */
|
||||
|
||||
/* SACKs data */
|
||||
/* from STCP, retrans queue hinting */
|
||||
struct sk_buff* lost_skb_hint;
|
||||
struct sk_buff *scoreboard_skb_hint;
|
||||
struct sk_buff *retransmit_skb_hint;
|
||||
struct sk_buff *forward_skb_hint;
|
||||
|
||||
struct sk_buff_head out_of_order_queue; /* Out of order segments go here */
|
||||
|
||||
/* SACKs data, these 2 need to be together (see tcp_build_and_update_options) */
|
||||
struct tcp_sack_block duplicate_sack[1]; /* D-SACK block */
|
||||
struct tcp_sack_block selective_acks[4]; /* The SACKS themselves*/
|
||||
|
||||
|
|
@ -337,23 +357,14 @@ struct tcp_sock {
|
|||
* sacked_out > 0)
|
||||
*/
|
||||
|
||||
/* from STCP, retrans queue hinting */
|
||||
struct sk_buff* lost_skb_hint;
|
||||
|
||||
struct sk_buff *scoreboard_skb_hint;
|
||||
struct sk_buff *retransmit_skb_hint;
|
||||
struct sk_buff *forward_skb_hint;
|
||||
|
||||
int lost_cnt_hint;
|
||||
int retransmit_cnt_hint;
|
||||
|
||||
u32 lost_retrans_low; /* Sent seq after any rxmit (lowest) */
|
||||
|
||||
u16 advmss; /* Advertised MSS */
|
||||
u8 reordering; /* Packet reordering metric. */
|
||||
u8 keepalive_probes; /* num of allowed keep alive probes */
|
||||
u32 prior_ssthresh; /* ssthresh saved at recovery start */
|
||||
u32 lost_out; /* Lost packets */
|
||||
u32 sacked_out; /* SACK'd packets */
|
||||
u32 fackets_out; /* FACK'd packets */
|
||||
u32 high_seq; /* snd_nxt at onset of congestion */
|
||||
|
||||
u32 retrans_stamp; /* Timestamp of the last retransmit,
|
||||
|
|
@ -361,23 +372,16 @@ struct tcp_sock {
|
|||
* the first SYN. */
|
||||
u32 undo_marker; /* tracking retrans started here. */
|
||||
int undo_retrans; /* number of undoable retransmissions. */
|
||||
u32 urg_seq; /* Seq of received urgent pointer */
|
||||
u16 urg_data; /* Saved octet of OOB data and control flags */
|
||||
u8 urg_mode; /* In urgent mode */
|
||||
u8 ecn_flags; /* ECN status bits. */
|
||||
u32 snd_up; /* Urgent pointer */
|
||||
|
||||
u32 total_retrans; /* Total retransmits for entire connection */
|
||||
u32 bytes_acked; /* Appropriate Byte Counting - RFC3465 */
|
||||
|
||||
u32 urg_seq; /* Seq of received urgent pointer */
|
||||
u32 snd_up; /* Urgent pointer */
|
||||
|
||||
unsigned int keepalive_time; /* time before keep alive takes place */
|
||||
unsigned int keepalive_intvl; /* time interval between keep alive probes */
|
||||
int linger2;
|
||||
|
||||
unsigned long last_synq_overflow;
|
||||
|
||||
u32 tso_deferred;
|
||||
|
||||
/* Receiver side RTT estimation */
|
||||
struct {
|
||||
u32 rtt;
|
||||
|
|
@ -405,6 +409,8 @@ struct tcp_sock {
|
|||
/* TCP MD5 Signagure Option information */
|
||||
struct tcp_md5sig_info *md5sig_info;
|
||||
#endif
|
||||
|
||||
int linger2;
|
||||
};
|
||||
|
||||
static inline struct tcp_sock *tcp_sk(const struct sock *sk)
|
||||
|
|
|
|||
|
|
@ -10,10 +10,8 @@
|
|||
|
||||
struct ts_config;
|
||||
|
||||
/**
|
||||
* TS_AUTOLOAD - Automatically load textsearch modules when needed
|
||||
*/
|
||||
#define TS_AUTOLOAD 1
|
||||
#define TS_AUTOLOAD 1 /* Automatically load textsearch modules when needed */
|
||||
#define TS_IGNORECASE 2 /* Searches string case insensitively */
|
||||
|
||||
/**
|
||||
* struct ts_state - search state
|
||||
|
|
@ -39,7 +37,7 @@ struct ts_state
|
|||
struct ts_ops
|
||||
{
|
||||
const char *name;
|
||||
struct ts_config * (*init)(const void *, unsigned int, gfp_t);
|
||||
struct ts_config * (*init)(const void *, unsigned int, gfp_t, int);
|
||||
unsigned int (*find)(struct ts_config *,
|
||||
struct ts_state *);
|
||||
void (*destroy)(struct ts_config *);
|
||||
|
|
@ -52,12 +50,14 @@ struct ts_ops
|
|||
/**
|
||||
* struct ts_config - search configuration
|
||||
* @ops: operations of chosen algorithm
|
||||
* @flags: flags
|
||||
* @get_next_block: callback to fetch the next block to search in
|
||||
* @finish: callback to finalize a search
|
||||
*/
|
||||
struct ts_config
|
||||
{
|
||||
struct ts_ops *ops;
|
||||
int flags;
|
||||
|
||||
/**
|
||||
* get_next_block - fetch next block of data
|
||||
|
|
@ -162,11 +162,10 @@ static inline struct ts_config *alloc_ts_config(size_t payload,
|
|||
{
|
||||
struct ts_config *conf;
|
||||
|
||||
conf = kmalloc(TS_PRIV_ALIGN(sizeof(*conf)) + payload, gfp_mask);
|
||||
conf = kzalloc(TS_PRIV_ALIGN(sizeof(*conf)) + payload, gfp_mask);
|
||||
if (conf == NULL)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
memset(conf, 0, TS_PRIV_ALIGN(sizeof(*conf)) + payload);
|
||||
return conf;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
* include/linux/tipc_config.h: Include file for TIPC configuration interface
|
||||
*
|
||||
* Copyright (c) 2003-2006, Ericsson AB
|
||||
* Copyright (c) 2005, Wind River Systems
|
||||
* Copyright (c) 2005-2007, Wind River Systems
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
|
@ -135,6 +135,14 @@
|
|||
#define TIPC_CMD_SET_MAX_SLAVES 0x800A /* tx unsigned, rx none */
|
||||
#define TIPC_CMD_SET_NETID 0x800B /* tx unsigned, rx none */
|
||||
|
||||
/*
|
||||
* Reserved commands:
|
||||
* May not be issued by any process.
|
||||
* Used internally by TIPC.
|
||||
*/
|
||||
|
||||
#define TIPC_CMD_NOT_NET_ADMIN 0xC001 /* tx none, rx none */
|
||||
|
||||
/*
|
||||
* TLV types defined for TIPC
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -71,7 +71,8 @@ struct tty_bufhead {
|
|||
struct tty_buffer *head; /* Queue head */
|
||||
struct tty_buffer *tail; /* Active buffer */
|
||||
struct tty_buffer *free; /* Free queue head */
|
||||
int memory_used; /* Buffer space used excluding free queue */
|
||||
int memory_used; /* Buffer space used excluding
|
||||
free queue */
|
||||
};
|
||||
/*
|
||||
* When a break, frame error, or parity error happens, these codes are
|
||||
|
|
@ -101,71 +102,96 @@ struct tty_bufhead {
|
|||
#define LNEXT_CHAR(tty) ((tty)->termios->c_cc[VLNEXT])
|
||||
#define EOL2_CHAR(tty) ((tty)->termios->c_cc[VEOL2])
|
||||
|
||||
#define _I_FLAG(tty,f) ((tty)->termios->c_iflag & (f))
|
||||
#define _O_FLAG(tty,f) ((tty)->termios->c_oflag & (f))
|
||||
#define _C_FLAG(tty,f) ((tty)->termios->c_cflag & (f))
|
||||
#define _L_FLAG(tty,f) ((tty)->termios->c_lflag & (f))
|
||||
#define _I_FLAG(tty, f) ((tty)->termios->c_iflag & (f))
|
||||
#define _O_FLAG(tty, f) ((tty)->termios->c_oflag & (f))
|
||||
#define _C_FLAG(tty, f) ((tty)->termios->c_cflag & (f))
|
||||
#define _L_FLAG(tty, f) ((tty)->termios->c_lflag & (f))
|
||||
|
||||
#define I_IGNBRK(tty) _I_FLAG((tty),IGNBRK)
|
||||
#define I_BRKINT(tty) _I_FLAG((tty),BRKINT)
|
||||
#define I_IGNPAR(tty) _I_FLAG((tty),IGNPAR)
|
||||
#define I_PARMRK(tty) _I_FLAG((tty),PARMRK)
|
||||
#define I_INPCK(tty) _I_FLAG((tty),INPCK)
|
||||
#define I_ISTRIP(tty) _I_FLAG((tty),ISTRIP)
|
||||
#define I_INLCR(tty) _I_FLAG((tty),INLCR)
|
||||
#define I_IGNCR(tty) _I_FLAG((tty),IGNCR)
|
||||
#define I_ICRNL(tty) _I_FLAG((tty),ICRNL)
|
||||
#define I_IUCLC(tty) _I_FLAG((tty),IUCLC)
|
||||
#define I_IXON(tty) _I_FLAG((tty),IXON)
|
||||
#define I_IXANY(tty) _I_FLAG((tty),IXANY)
|
||||
#define I_IXOFF(tty) _I_FLAG((tty),IXOFF)
|
||||
#define I_IMAXBEL(tty) _I_FLAG((tty),IMAXBEL)
|
||||
#define I_IUTF8(tty) _I_FLAG((tty),IUTF8)
|
||||
#define I_IGNBRK(tty) _I_FLAG((tty), IGNBRK)
|
||||
#define I_BRKINT(tty) _I_FLAG((tty), BRKINT)
|
||||
#define I_IGNPAR(tty) _I_FLAG((tty), IGNPAR)
|
||||
#define I_PARMRK(tty) _I_FLAG((tty), PARMRK)
|
||||
#define I_INPCK(tty) _I_FLAG((tty), INPCK)
|
||||
#define I_ISTRIP(tty) _I_FLAG((tty), ISTRIP)
|
||||
#define I_INLCR(tty) _I_FLAG((tty), INLCR)
|
||||
#define I_IGNCR(tty) _I_FLAG((tty), IGNCR)
|
||||
#define I_ICRNL(tty) _I_FLAG((tty), ICRNL)
|
||||
#define I_IUCLC(tty) _I_FLAG((tty), IUCLC)
|
||||
#define I_IXON(tty) _I_FLAG((tty), IXON)
|
||||
#define I_IXANY(tty) _I_FLAG((tty), IXANY)
|
||||
#define I_IXOFF(tty) _I_FLAG((tty), IXOFF)
|
||||
#define I_IMAXBEL(tty) _I_FLAG((tty), IMAXBEL)
|
||||
#define I_IUTF8(tty) _I_FLAG((tty), IUTF8)
|
||||
|
||||
#define O_OPOST(tty) _O_FLAG((tty),OPOST)
|
||||
#define O_OLCUC(tty) _O_FLAG((tty),OLCUC)
|
||||
#define O_ONLCR(tty) _O_FLAG((tty),ONLCR)
|
||||
#define O_OCRNL(tty) _O_FLAG((tty),OCRNL)
|
||||
#define O_ONOCR(tty) _O_FLAG((tty),ONOCR)
|
||||
#define O_ONLRET(tty) _O_FLAG((tty),ONLRET)
|
||||
#define O_OFILL(tty) _O_FLAG((tty),OFILL)
|
||||
#define O_OFDEL(tty) _O_FLAG((tty),OFDEL)
|
||||
#define O_NLDLY(tty) _O_FLAG((tty),NLDLY)
|
||||
#define O_CRDLY(tty) _O_FLAG((tty),CRDLY)
|
||||
#define O_TABDLY(tty) _O_FLAG((tty),TABDLY)
|
||||
#define O_BSDLY(tty) _O_FLAG((tty),BSDLY)
|
||||
#define O_VTDLY(tty) _O_FLAG((tty),VTDLY)
|
||||
#define O_FFDLY(tty) _O_FLAG((tty),FFDLY)
|
||||
#define O_OPOST(tty) _O_FLAG((tty), OPOST)
|
||||
#define O_OLCUC(tty) _O_FLAG((tty), OLCUC)
|
||||
#define O_ONLCR(tty) _O_FLAG((tty), ONLCR)
|
||||
#define O_OCRNL(tty) _O_FLAG((tty), OCRNL)
|
||||
#define O_ONOCR(tty) _O_FLAG((tty), ONOCR)
|
||||
#define O_ONLRET(tty) _O_FLAG((tty), ONLRET)
|
||||
#define O_OFILL(tty) _O_FLAG((tty), OFILL)
|
||||
#define O_OFDEL(tty) _O_FLAG((tty), OFDEL)
|
||||
#define O_NLDLY(tty) _O_FLAG((tty), NLDLY)
|
||||
#define O_CRDLY(tty) _O_FLAG((tty), CRDLY)
|
||||
#define O_TABDLY(tty) _O_FLAG((tty), TABDLY)
|
||||
#define O_BSDLY(tty) _O_FLAG((tty), BSDLY)
|
||||
#define O_VTDLY(tty) _O_FLAG((tty), VTDLY)
|
||||
#define O_FFDLY(tty) _O_FLAG((tty), FFDLY)
|
||||
|
||||
#define C_BAUD(tty) _C_FLAG((tty),CBAUD)
|
||||
#define C_CSIZE(tty) _C_FLAG((tty),CSIZE)
|
||||
#define C_CSTOPB(tty) _C_FLAG((tty),CSTOPB)
|
||||
#define C_CREAD(tty) _C_FLAG((tty),CREAD)
|
||||
#define C_PARENB(tty) _C_FLAG((tty),PARENB)
|
||||
#define C_PARODD(tty) _C_FLAG((tty),PARODD)
|
||||
#define C_HUPCL(tty) _C_FLAG((tty),HUPCL)
|
||||
#define C_CLOCAL(tty) _C_FLAG((tty),CLOCAL)
|
||||
#define C_CIBAUD(tty) _C_FLAG((tty),CIBAUD)
|
||||
#define C_CRTSCTS(tty) _C_FLAG((tty),CRTSCTS)
|
||||
#define C_BAUD(tty) _C_FLAG((tty), CBAUD)
|
||||
#define C_CSIZE(tty) _C_FLAG((tty), CSIZE)
|
||||
#define C_CSTOPB(tty) _C_FLAG((tty), CSTOPB)
|
||||
#define C_CREAD(tty) _C_FLAG((tty), CREAD)
|
||||
#define C_PARENB(tty) _C_FLAG((tty), PARENB)
|
||||
#define C_PARODD(tty) _C_FLAG((tty), PARODD)
|
||||
#define C_HUPCL(tty) _C_FLAG((tty), HUPCL)
|
||||
#define C_CLOCAL(tty) _C_FLAG((tty), CLOCAL)
|
||||
#define C_CIBAUD(tty) _C_FLAG((tty), CIBAUD)
|
||||
#define C_CRTSCTS(tty) _C_FLAG((tty), CRTSCTS)
|
||||
|
||||
#define L_ISIG(tty) _L_FLAG((tty),ISIG)
|
||||
#define L_ICANON(tty) _L_FLAG((tty),ICANON)
|
||||
#define L_XCASE(tty) _L_FLAG((tty),XCASE)
|
||||
#define L_ECHO(tty) _L_FLAG((tty),ECHO)
|
||||
#define L_ECHOE(tty) _L_FLAG((tty),ECHOE)
|
||||
#define L_ECHOK(tty) _L_FLAG((tty),ECHOK)
|
||||
#define L_ECHONL(tty) _L_FLAG((tty),ECHONL)
|
||||
#define L_NOFLSH(tty) _L_FLAG((tty),NOFLSH)
|
||||
#define L_TOSTOP(tty) _L_FLAG((tty),TOSTOP)
|
||||
#define L_ECHOCTL(tty) _L_FLAG((tty),ECHOCTL)
|
||||
#define L_ECHOPRT(tty) _L_FLAG((tty),ECHOPRT)
|
||||
#define L_ECHOKE(tty) _L_FLAG((tty),ECHOKE)
|
||||
#define L_FLUSHO(tty) _L_FLAG((tty),FLUSHO)
|
||||
#define L_PENDIN(tty) _L_FLAG((tty),PENDIN)
|
||||
#define L_IEXTEN(tty) _L_FLAG((tty),IEXTEN)
|
||||
#define L_ISIG(tty) _L_FLAG((tty), ISIG)
|
||||
#define L_ICANON(tty) _L_FLAG((tty), ICANON)
|
||||
#define L_XCASE(tty) _L_FLAG((tty), XCASE)
|
||||
#define L_ECHO(tty) _L_FLAG((tty), ECHO)
|
||||
#define L_ECHOE(tty) _L_FLAG((tty), ECHOE)
|
||||
#define L_ECHOK(tty) _L_FLAG((tty), ECHOK)
|
||||
#define L_ECHONL(tty) _L_FLAG((tty), ECHONL)
|
||||
#define L_NOFLSH(tty) _L_FLAG((tty), NOFLSH)
|
||||
#define L_TOSTOP(tty) _L_FLAG((tty), TOSTOP)
|
||||
#define L_ECHOCTL(tty) _L_FLAG((tty), ECHOCTL)
|
||||
#define L_ECHOPRT(tty) _L_FLAG((tty), ECHOPRT)
|
||||
#define L_ECHOKE(tty) _L_FLAG((tty), ECHOKE)
|
||||
#define L_FLUSHO(tty) _L_FLAG((tty), FLUSHO)
|
||||
#define L_PENDIN(tty) _L_FLAG((tty), PENDIN)
|
||||
#define L_IEXTEN(tty) _L_FLAG((tty), IEXTEN)
|
||||
|
||||
struct device;
|
||||
struct signal_struct;
|
||||
|
||||
/*
|
||||
* Port level information. Each device keeps its own port level information
|
||||
* so provide a common structure for those ports wanting to use common support
|
||||
* routines.
|
||||
*
|
||||
* The tty port has a different lifetime to the tty so must be kept apart.
|
||||
* In addition be careful as tty -> port mappings are valid for the life
|
||||
* of the tty object but in many cases port -> tty mappings are valid only
|
||||
* until a hangup so don't use the wrong path.
|
||||
*/
|
||||
|
||||
struct tty_port {
|
||||
struct tty_struct *tty; /* Back pointer */
|
||||
int blocked_open; /* Waiting to open */
|
||||
int count; /* Usage count */
|
||||
wait_queue_head_t open_wait; /* Open waiters */
|
||||
wait_queue_head_t close_wait; /* Close waiters */
|
||||
unsigned long flags; /* TTY flags ASY_*/
|
||||
struct mutex mutex; /* Locking */
|
||||
unsigned char *xmit_buf; /* Optional buffer */
|
||||
int close_delay; /* Close port delay */
|
||||
int closing_wait; /* Delay for output */
|
||||
};
|
||||
|
||||
/*
|
||||
* Where all of the state associated with a tty is kept while the tty
|
||||
* is open. Since the termios state should be kept even if the tty
|
||||
|
|
@ -185,6 +211,7 @@ struct tty_struct {
|
|||
struct tty_driver *driver;
|
||||
const struct tty_operations *ops;
|
||||
int index;
|
||||
/* The ldisc objects are protected by tty_ldisc_lock at the moment */
|
||||
struct tty_ldisc ldisc;
|
||||
struct mutex termios_mutex;
|
||||
spinlock_t ctrl_lock;
|
||||
|
|
@ -213,7 +240,7 @@ struct tty_struct {
|
|||
struct list_head tty_files;
|
||||
|
||||
#define N_TTY_BUF_SIZE 4096
|
||||
|
||||
|
||||
/*
|
||||
* The following is data for the N_TTY line discipline. For
|
||||
* historical reasons, this is included in the tty structure.
|
||||
|
|
@ -241,6 +268,7 @@ struct tty_struct {
|
|||
spinlock_t read_lock;
|
||||
/* If the tty has a pending do_SAK, queue it here - akpm */
|
||||
struct work_struct SAK_work;
|
||||
struct tty_port *port;
|
||||
};
|
||||
|
||||
/* tty magic number */
|
||||
|
|
@ -248,14 +276,14 @@ struct tty_struct {
|
|||
|
||||
/*
|
||||
* These bits are used in the flags field of the tty structure.
|
||||
*
|
||||
*
|
||||
* So that interrupts won't be able to mess up the queues,
|
||||
* copy_to_cooked must be atomic with respect to itself, as must
|
||||
* tty->write. Thus, you must use the inline functions set_bit() and
|
||||
* clear_bit() to make things atomic.
|
||||
*/
|
||||
#define TTY_THROTTLED 0 /* Call unthrottle() at threshold min */
|
||||
#define TTY_IO_ERROR 1 /* Canse an I/O error (may be no ldisc too) */
|
||||
#define TTY_IO_ERROR 1 /* Cause an I/O error (may be no ldisc too) */
|
||||
#define TTY_OTHER_CLOSED 2 /* Other side (if any) has closed */
|
||||
#define TTY_EXCLUSIVE 3 /* Exclusive open mode */
|
||||
#define TTY_DEBUG 4 /* Debugging */
|
||||
|
|
@ -285,11 +313,11 @@ extern int vcs_init(void);
|
|||
extern int tty_paranoia_check(struct tty_struct *tty, struct inode *inode,
|
||||
const char *routine);
|
||||
extern char *tty_name(struct tty_struct *tty, char *buf);
|
||||
extern void tty_wait_until_sent(struct tty_struct * tty, long timeout);
|
||||
extern int tty_check_change(struct tty_struct * tty);
|
||||
extern void stop_tty(struct tty_struct * tty);
|
||||
extern void start_tty(struct tty_struct * tty);
|
||||
extern int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc);
|
||||
extern void tty_wait_until_sent(struct tty_struct *tty, long timeout);
|
||||
extern int tty_check_change(struct tty_struct *tty);
|
||||
extern void stop_tty(struct tty_struct *tty);
|
||||
extern void start_tty(struct tty_struct *tty);
|
||||
extern int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc);
|
||||
extern int tty_unregister_ldisc(int disc);
|
||||
extern int tty_register_driver(struct tty_driver *driver);
|
||||
extern int tty_unregister_driver(struct tty_driver *driver);
|
||||
|
|
@ -310,10 +338,10 @@ extern int is_current_pgrp_orphaned(void);
|
|||
extern struct pid *tty_get_pgrp(struct tty_struct *tty);
|
||||
extern int is_ignored(int sig);
|
||||
extern int tty_signal(int sig, struct tty_struct *tty);
|
||||
extern void tty_hangup(struct tty_struct * tty);
|
||||
extern void tty_vhangup(struct tty_struct * tty);
|
||||
extern void tty_hangup(struct tty_struct *tty);
|
||||
extern void tty_vhangup(struct tty_struct *tty);
|
||||
extern void tty_unhangup(struct file *filp);
|
||||
extern int tty_hung_up_p(struct file * filp);
|
||||
extern int tty_hung_up_p(struct file *filp);
|
||||
extern void do_SAK(struct tty_struct *tty);
|
||||
extern void __do_SAK(struct tty_struct *tty);
|
||||
extern void disassociate_ctty(int priv);
|
||||
|
|
@ -322,17 +350,17 @@ extern void tty_flip_buffer_push(struct tty_struct *tty);
|
|||
extern speed_t tty_get_baud_rate(struct tty_struct *tty);
|
||||
extern speed_t tty_termios_baud_rate(struct ktermios *termios);
|
||||
extern speed_t tty_termios_input_baud_rate(struct ktermios *termios);
|
||||
extern void tty_termios_encode_baud_rate(struct ktermios *termios, speed_t ibaud, speed_t obaud);
|
||||
extern void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud);
|
||||
extern void tty_termios_encode_baud_rate(struct ktermios *termios,
|
||||
speed_t ibaud, speed_t obaud);
|
||||
extern void tty_encode_baud_rate(struct tty_struct *tty,
|
||||
speed_t ibaud, speed_t obaud);
|
||||
extern void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old);
|
||||
extern int tty_termios_hw_change(struct ktermios *a, struct ktermios *b);
|
||||
|
||||
extern struct tty_ldisc *tty_ldisc_ref(struct tty_struct *);
|
||||
extern void tty_ldisc_deref(struct tty_ldisc *);
|
||||
extern struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *);
|
||||
|
||||
extern struct tty_ldisc *tty_ldisc_get(int);
|
||||
extern void tty_ldisc_put(int);
|
||||
extern const struct file_operations tty_ldiscs_proc_fops;
|
||||
|
||||
extern void tty_wakeup(struct tty_struct *tty);
|
||||
extern void tty_ldisc_flush(struct tty_struct *tty);
|
||||
|
|
@ -351,10 +379,14 @@ extern void tty_write_unlock(struct tty_struct *tty);
|
|||
extern int tty_write_lock(struct tty_struct *tty, int ndelay);
|
||||
#define tty_is_writelocked(tty) (mutex_is_locked(&tty->atomic_write_lock))
|
||||
|
||||
extern void tty_port_init(struct tty_port *port);
|
||||
extern int tty_port_alloc_xmit_buf(struct tty_port *port);
|
||||
extern void tty_port_free_xmit_buf(struct tty_port *port);
|
||||
|
||||
|
||||
|
||||
/* n_tty.c */
|
||||
extern struct tty_ldisc tty_ldisc_N_TTY;
|
||||
extern struct tty_ldisc_ops tty_ldisc_N_TTY;
|
||||
|
||||
/* tty_audit.c */
|
||||
#ifdef CONFIG_AUDIT
|
||||
|
|
@ -363,7 +395,8 @@ extern void tty_audit_add_data(struct tty_struct *tty, unsigned char *data,
|
|||
extern void tty_audit_exit(void);
|
||||
extern void tty_audit_fork(struct signal_struct *sig);
|
||||
extern void tty_audit_push(struct tty_struct *tty);
|
||||
extern void tty_audit_push_task(struct task_struct *tsk, uid_t loginuid, u32 sessionid);
|
||||
extern void tty_audit_push_task(struct task_struct *tsk,
|
||||
uid_t loginuid, u32 sessionid);
|
||||
#else
|
||||
static inline void tty_audit_add_data(struct tty_struct *tty,
|
||||
unsigned char *data, size_t size)
|
||||
|
|
@ -378,19 +411,20 @@ static inline void tty_audit_fork(struct signal_struct *sig)
|
|||
static inline void tty_audit_push(struct tty_struct *tty)
|
||||
{
|
||||
}
|
||||
static inline void tty_audit_push_task(struct task_struct *tsk, uid_t loginuid, u32 sessionid)
|
||||
static inline void tty_audit_push_task(struct task_struct *tsk,
|
||||
uid_t loginuid, u32 sessionid)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/* tty_ioctl.c */
|
||||
extern int n_tty_ioctl(struct tty_struct * tty, struct file * file,
|
||||
extern int n_tty_ioctl(struct tty_struct *tty, struct file *file,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
|
||||
/* serial.c */
|
||||
|
||||
extern void serial_console_init(void);
|
||||
|
||||
|
||||
/* pcxx.c */
|
||||
|
||||
extern int pcxe_open(struct tty_struct *tty, struct file *filp);
|
||||
|
|
@ -401,7 +435,7 @@ extern void console_print(const char *);
|
|||
|
||||
/* vt.c */
|
||||
|
||||
extern int vt_ioctl(struct tty_struct *tty, struct file * file,
|
||||
extern int vt_ioctl(struct tty_struct *tty, struct file *file,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@
|
|||
#include <linux/fs.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
struct tty_ldisc {
|
||||
struct tty_ldisc_ops {
|
||||
int magic;
|
||||
char *name;
|
||||
int num;
|
||||
|
|
@ -142,6 +142,11 @@ struct tty_ldisc {
|
|||
int refcount;
|
||||
};
|
||||
|
||||
struct tty_ldisc {
|
||||
struct tty_ldisc_ops *ops;
|
||||
int refcount;
|
||||
};
|
||||
|
||||
#define TTY_LDISC_MAGIC 0x5403
|
||||
|
||||
#define LDISC_FLAG_DEFINED 0x00000001
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ struct udphdr {
|
|||
#ifdef __KERNEL__
|
||||
#include <net/inet_sock.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <net/netns/hash.h>
|
||||
|
||||
static inline struct udphdr *udp_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
|
|
@ -46,6 +47,11 @@ static inline struct udphdr *udp_hdr(const struct sk_buff *skb)
|
|||
|
||||
#define UDP_HTABLE_SIZE 128
|
||||
|
||||
static inline int udp_hashfn(struct net *net, const unsigned num)
|
||||
{
|
||||
return (num + net_hash_mix(net)) & (UDP_HTABLE_SIZE - 1);
|
||||
}
|
||||
|
||||
struct udp_sock {
|
||||
/* inet_sock has to be the first member */
|
||||
struct inet_sock inet;
|
||||
|
|
|
|||
|
|
@ -160,6 +160,7 @@ struct usb_interface {
|
|||
unsigned is_active:1; /* the interface is not suspended */
|
||||
unsigned sysfs_files_created:1; /* the sysfs attributes exist */
|
||||
unsigned needs_remote_wakeup:1; /* driver requires remote wakeup */
|
||||
unsigned needs_binding:1; /* needs delayed unbind/rebind */
|
||||
|
||||
struct device dev; /* interface specific device info */
|
||||
struct device *usb_dev;
|
||||
|
|
@ -293,7 +294,7 @@ struct usb_devmap {
|
|||
struct usb_bus {
|
||||
struct device *controller; /* host/master side hardware */
|
||||
int busnum; /* Bus number (in order of reg) */
|
||||
char *bus_name; /* stable id (PCI slot_name etc) */
|
||||
const char *bus_name; /* stable id (PCI slot_name etc) */
|
||||
u8 uses_dma; /* Does the host controller use DMA? */
|
||||
u8 otg_port; /* 0, or number of OTG/HNP port */
|
||||
unsigned is_b_host:1; /* true during some HNP roleswitches */
|
||||
|
|
@ -497,8 +498,6 @@ extern int usb_lock_device_for_reset(struct usb_device *udev,
|
|||
|
||||
/* USB port reset for device reinitialization */
|
||||
extern int usb_reset_device(struct usb_device *dev);
|
||||
extern int usb_reset_composite_device(struct usb_device *dev,
|
||||
struct usb_interface *iface);
|
||||
|
||||
extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id);
|
||||
|
||||
|
|
@ -958,9 +957,9 @@ struct usbdrv_wrap {
|
|||
* @resume: Called when the device is being resumed by the system.
|
||||
* @reset_resume: Called when the suspended device has been reset instead
|
||||
* of being resumed.
|
||||
* @pre_reset: Called by usb_reset_composite_device() when the device
|
||||
* @pre_reset: Called by usb_reset_device() when the device
|
||||
* is about to be reset.
|
||||
* @post_reset: Called by usb_reset_composite_device() after the device
|
||||
* @post_reset: Called by usb_reset_device() after the device
|
||||
* has been reset
|
||||
* @id_table: USB drivers use ID table to support hotplugging.
|
||||
* Export this with MODULE_DEVICE_TABLE(usb,...). This must be set
|
||||
|
|
@ -972,6 +971,8 @@ struct usbdrv_wrap {
|
|||
* added to this driver by preventing the sysfs file from being created.
|
||||
* @supports_autosuspend: if set to 0, the USB core will not allow autosuspend
|
||||
* for interfaces bound to this driver.
|
||||
* @soft_unbind: if set to 1, the USB core will not kill URBs and disable
|
||||
* endpoints before calling the driver's disconnect method.
|
||||
*
|
||||
* USB interface drivers must provide a name, probe() and disconnect()
|
||||
* methods, and an id_table. Other driver fields are optional.
|
||||
|
|
@ -1012,6 +1013,7 @@ struct usb_driver {
|
|||
struct usbdrv_wrap drvwrap;
|
||||
unsigned int no_dynamic_id:1;
|
||||
unsigned int supports_autosuspend:1;
|
||||
unsigned int soft_unbind:1;
|
||||
};
|
||||
#define to_usb_driver(d) container_of(d, struct usb_driver, drvwrap.driver)
|
||||
|
||||
|
|
|
|||
338
include/linux/usb/composite.h
Normal file
338
include/linux/usb/composite.h
Normal file
|
|
@ -0,0 +1,338 @@
|
|||
/*
|
||||
* composite.h -- framework for usb gadgets which are composite devices
|
||||
*
|
||||
* Copyright (C) 2006-2008 David Brownell
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_USB_COMPOSITE_H
|
||||
#define __LINUX_USB_COMPOSITE_H
|
||||
|
||||
/*
|
||||
* This framework is an optional layer on top of the USB Gadget interface,
|
||||
* making it easier to build (a) Composite devices, supporting multiple
|
||||
* functions within any single configuration, and (b) Multi-configuration
|
||||
* devices, also supporting multiple functions but without necessarily
|
||||
* having more than one function per configuration.
|
||||
*
|
||||
* Example: a device with a single configuration supporting both network
|
||||
* link and mass storage functions is a composite device. Those functions
|
||||
* might alternatively be packaged in individual configurations, but in
|
||||
* the composite model the host can use both functions at the same time.
|
||||
*/
|
||||
|
||||
#include <linux/usb/ch9.h>
|
||||
#include <linux/usb/gadget.h>
|
||||
|
||||
|
||||
struct usb_configuration;
|
||||
|
||||
/**
|
||||
* struct usb_function - describes one function of a configuration
|
||||
* @name: For diagnostics, identifies the function.
|
||||
* @strings: tables of strings, keyed by identifiers assigned during bind()
|
||||
* and by language IDs provided in control requests
|
||||
* @descriptors: Table of full (or low) speed descriptors, using interface and
|
||||
* string identifiers assigned during @bind(). If this pointer is null,
|
||||
* the function will not be available at full speed (or at low speed).
|
||||
* @hs_descriptors: Table of high speed descriptors, using interface and
|
||||
* string identifiers assigned during @bind(). If this pointer is null,
|
||||
* the function will not be available at high speed.
|
||||
* @config: assigned when @usb_add_function() is called; this is the
|
||||
* configuration with which this function is associated.
|
||||
* @bind: Before the gadget can register, all of its functions bind() to the
|
||||
* available resources including string and interface identifiers used
|
||||
* in interface or class descriptors; endpoints; I/O buffers; and so on.
|
||||
* @unbind: Reverses @bind; called as a side effect of unregistering the
|
||||
* driver which added this function.
|
||||
* @set_alt: (REQUIRED) Reconfigures altsettings; function drivers may
|
||||
* initialize usb_ep.driver data at this time (when it is used).
|
||||
* Note that setting an interface to its current altsetting resets
|
||||
* interface state, and that all interfaces have a disabled state.
|
||||
* @get_alt: Returns the active altsetting. If this is not provided,
|
||||
* then only altsetting zero is supported.
|
||||
* @disable: (REQUIRED) Indicates the function should be disabled. Reasons
|
||||
* include host resetting or reconfiguring the gadget, and disconnection.
|
||||
* @setup: Used for interface-specific control requests.
|
||||
* @suspend: Notifies functions when the host stops sending USB traffic.
|
||||
* @resume: Notifies functions when the host restarts USB traffic.
|
||||
*
|
||||
* A single USB function uses one or more interfaces, and should in most
|
||||
* cases support operation at both full and high speeds. Each function is
|
||||
* associated by @usb_add_function() with a one configuration; that function
|
||||
* causes @bind() to be called so resources can be allocated as part of
|
||||
* setting up a gadget driver. Those resources include endpoints, which
|
||||
* should be allocated using @usb_ep_autoconfig().
|
||||
*
|
||||
* To support dual speed operation, a function driver provides descriptors
|
||||
* for both high and full speed operation. Except in rare cases that don't
|
||||
* involve bulk endpoints, each speed needs different endpoint descriptors.
|
||||
*
|
||||
* Function drivers choose their own strategies for managing instance data.
|
||||
* The simplest strategy just declares it "static', which means the function
|
||||
* can only be activated once. If the function needs to be exposed in more
|
||||
* than one configuration at a given speed, it needs to support multiple
|
||||
* usb_function structures (one for each configuration).
|
||||
*
|
||||
* A more complex strategy might encapsulate a @usb_function structure inside
|
||||
* a driver-specific instance structure to allows multiple activations. An
|
||||
* example of multiple activations might be a CDC ACM function that supports
|
||||
* two or more distinct instances within the same configuration, providing
|
||||
* several independent logical data links to a USB host.
|
||||
*/
|
||||
struct usb_function {
|
||||
const char *name;
|
||||
struct usb_gadget_strings **strings;
|
||||
struct usb_descriptor_header **descriptors;
|
||||
struct usb_descriptor_header **hs_descriptors;
|
||||
|
||||
struct usb_configuration *config;
|
||||
|
||||
/* REVISIT: bind() functions can be marked __init, which
|
||||
* makes trouble for section mismatch analysis. See if
|
||||
* we can't restructure things to avoid mismatching.
|
||||
* Related: unbind() may kfree() but bind() won't...
|
||||
*/
|
||||
|
||||
/* configuration management: bind/unbind */
|
||||
int (*bind)(struct usb_configuration *,
|
||||
struct usb_function *);
|
||||
void (*unbind)(struct usb_configuration *,
|
||||
struct usb_function *);
|
||||
|
||||
/* runtime state management */
|
||||
int (*set_alt)(struct usb_function *,
|
||||
unsigned interface, unsigned alt);
|
||||
int (*get_alt)(struct usb_function *,
|
||||
unsigned interface);
|
||||
void (*disable)(struct usb_function *);
|
||||
int (*setup)(struct usb_function *,
|
||||
const struct usb_ctrlrequest *);
|
||||
void (*suspend)(struct usb_function *);
|
||||
void (*resume)(struct usb_function *);
|
||||
|
||||
/* internals */
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
int usb_add_function(struct usb_configuration *, struct usb_function *);
|
||||
|
||||
int usb_interface_id(struct usb_configuration *, struct usb_function *);
|
||||
|
||||
/**
|
||||
* ep_choose - select descriptor endpoint at current device speed
|
||||
* @g: gadget, connected and running at some speed
|
||||
* @hs: descriptor to use for high speed operation
|
||||
* @fs: descriptor to use for full or low speed operation
|
||||
*/
|
||||
static inline struct usb_endpoint_descriptor *
|
||||
ep_choose(struct usb_gadget *g, struct usb_endpoint_descriptor *hs,
|
||||
struct usb_endpoint_descriptor *fs)
|
||||
{
|
||||
if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
|
||||
return hs;
|
||||
return fs;
|
||||
}
|
||||
|
||||
#define MAX_CONFIG_INTERFACES 16 /* arbitrary; max 255 */
|
||||
|
||||
/**
|
||||
* struct usb_configuration - represents one gadget configuration
|
||||
* @label: For diagnostics, describes the configuration.
|
||||
* @strings: Tables of strings, keyed by identifiers assigned during @bind()
|
||||
* and by language IDs provided in control requests.
|
||||
* @descriptors: Table of descriptors preceding all function descriptors.
|
||||
* Examples include OTG and vendor-specific descriptors.
|
||||
* @bind: Called from @usb_add_config() to allocate resources unique to this
|
||||
* configuration and to call @usb_add_function() for each function used.
|
||||
* @unbind: Reverses @bind; called as a side effect of unregistering the
|
||||
* driver which added this configuration.
|
||||
* @setup: Used to delegate control requests that aren't handled by standard
|
||||
* device infrastructure or directed at a specific interface.
|
||||
* @bConfigurationValue: Copied into configuration descriptor.
|
||||
* @iConfiguration: Copied into configuration descriptor.
|
||||
* @bmAttributes: Copied into configuration descriptor.
|
||||
* @bMaxPower: Copied into configuration descriptor.
|
||||
* @cdev: assigned by @usb_add_config() before calling @bind(); this is
|
||||
* the device associated with this configuration.
|
||||
*
|
||||
* Configurations are building blocks for gadget drivers structured around
|
||||
* function drivers. Simple USB gadgets require only one function and one
|
||||
* configuration, and handle dual-speed hardware by always providing the same
|
||||
* functionality. Slightly more complex gadgets may have more than one
|
||||
* single-function configuration at a given speed; or have configurations
|
||||
* that only work at one speed.
|
||||
*
|
||||
* Composite devices are, by definition, ones with configurations which
|
||||
* include more than one function.
|
||||
*
|
||||
* The lifecycle of a usb_configuration includes allocation, initialization
|
||||
* of the fields described above, and calling @usb_add_config() to set up
|
||||
* internal data and bind it to a specific device. The configuration's
|
||||
* @bind() method is then used to initialize all the functions and then
|
||||
* call @usb_add_function() for them.
|
||||
*
|
||||
* Those functions would normally be independant of each other, but that's
|
||||
* not mandatory. CDC WMC devices are an example where functions often
|
||||
* depend on other functions, with some functions subsidiary to others.
|
||||
* Such interdependency may be managed in any way, so long as all of the
|
||||
* descriptors complete by the time the composite driver returns from
|
||||
* its bind() routine.
|
||||
*/
|
||||
struct usb_configuration {
|
||||
const char *label;
|
||||
struct usb_gadget_strings **strings;
|
||||
const struct usb_descriptor_header **descriptors;
|
||||
|
||||
/* REVISIT: bind() functions can be marked __init, which
|
||||
* makes trouble for section mismatch analysis. See if
|
||||
* we can't restructure things to avoid mismatching...
|
||||
*/
|
||||
|
||||
/* configuration management: bind/unbind */
|
||||
int (*bind)(struct usb_configuration *);
|
||||
void (*unbind)(struct usb_configuration *);
|
||||
int (*setup)(struct usb_configuration *,
|
||||
const struct usb_ctrlrequest *);
|
||||
|
||||
/* fields in the config descriptor */
|
||||
u8 bConfigurationValue;
|
||||
u8 iConfiguration;
|
||||
u8 bmAttributes;
|
||||
u8 bMaxPower;
|
||||
|
||||
struct usb_composite_dev *cdev;
|
||||
|
||||
/* internals */
|
||||
struct list_head list;
|
||||
struct list_head functions;
|
||||
u8 next_interface_id;
|
||||
unsigned highspeed:1;
|
||||
unsigned fullspeed:1;
|
||||
struct usb_function *interface[MAX_CONFIG_INTERFACES];
|
||||
};
|
||||
|
||||
int usb_add_config(struct usb_composite_dev *,
|
||||
struct usb_configuration *);
|
||||
|
||||
/**
|
||||
* struct usb_composite_driver - groups configurations into a gadget
|
||||
* @name: For diagnostics, identifies the driver.
|
||||
* @dev: Template descriptor for the device, including default device
|
||||
* identifiers.
|
||||
* @strings: tables of strings, keyed by identifiers assigned during bind()
|
||||
* and language IDs provided in control requests
|
||||
* @bind: (REQUIRED) Used to allocate resources that are shared across the
|
||||
* whole device, such as string IDs, and add its configurations using
|
||||
* @usb_add_config(). This may fail by returning a negative errno
|
||||
* value; it should return zero on successful initialization.
|
||||
* @unbind: Reverses @bind(); called as a side effect of unregistering
|
||||
* this driver.
|
||||
*
|
||||
* Devices default to reporting self powered operation. Devices which rely
|
||||
* on bus powered operation should report this in their @bind() method.
|
||||
*
|
||||
* Before returning from @bind, various fields in the template descriptor
|
||||
* may be overridden. These include the idVendor/idProduct/bcdDevice values
|
||||
* normally to bind the appropriate host side driver, and the three strings
|
||||
* (iManufacturer, iProduct, iSerialNumber) normally used to provide user
|
||||
* meaningful device identifiers. (The strings will not be defined unless
|
||||
* they are defined in @dev and @strings.) The correct ep0 maxpacket size
|
||||
* is also reported, as defined by the underlying controller driver.
|
||||
*/
|
||||
struct usb_composite_driver {
|
||||
const char *name;
|
||||
const struct usb_device_descriptor *dev;
|
||||
struct usb_gadget_strings **strings;
|
||||
|
||||
/* REVISIT: bind() functions can be marked __init, which
|
||||
* makes trouble for section mismatch analysis. See if
|
||||
* we can't restructure things to avoid mismatching...
|
||||
*/
|
||||
|
||||
int (*bind)(struct usb_composite_dev *);
|
||||
int (*unbind)(struct usb_composite_dev *);
|
||||
};
|
||||
|
||||
extern int usb_composite_register(struct usb_composite_driver *);
|
||||
extern void usb_composite_unregister(struct usb_composite_driver *);
|
||||
|
||||
|
||||
/**
|
||||
* struct usb_composite_device - represents one composite usb gadget
|
||||
* @gadget: read-only, abstracts the gadget's usb peripheral controller
|
||||
* @req: used for control responses; buffer is pre-allocated
|
||||
* @bufsiz: size of buffer pre-allocated in @req
|
||||
* @config: the currently active configuration
|
||||
*
|
||||
* One of these devices is allocated and initialized before the
|
||||
* associated device driver's bind() is called.
|
||||
*
|
||||
* OPEN ISSUE: it appears that some WUSB devices will need to be
|
||||
* built by combining a normal (wired) gadget with a wireless one.
|
||||
* This revision of the gadget framework should probably try to make
|
||||
* sure doing that won't hurt too much.
|
||||
*
|
||||
* One notion for how to handle Wireless USB devices involves:
|
||||
* (a) a second gadget here, discovery mechanism TBD, but likely
|
||||
* needing separate "register/unregister WUSB gadget" calls;
|
||||
* (b) updates to usb_gadget to include flags "is it wireless",
|
||||
* "is it wired", plus (presumably in a wrapper structure)
|
||||
* bandgroup and PHY info;
|
||||
* (c) presumably a wireless_ep wrapping a usb_ep, and reporting
|
||||
* wireless-specific parameters like maxburst and maxsequence;
|
||||
* (d) configurations that are specific to wireless links;
|
||||
* (e) function drivers that understand wireless configs and will
|
||||
* support wireless for (additional) function instances;
|
||||
* (f) a function to support association setup (like CBAF), not
|
||||
* necessarily requiring a wireless adapter;
|
||||
* (g) composite device setup that can create one or more wireless
|
||||
* configs, including appropriate association setup support;
|
||||
* (h) more, TBD.
|
||||
*/
|
||||
struct usb_composite_dev {
|
||||
struct usb_gadget *gadget;
|
||||
struct usb_request *req;
|
||||
unsigned bufsiz;
|
||||
|
||||
struct usb_configuration *config;
|
||||
|
||||
/* internals */
|
||||
struct usb_device_descriptor desc;
|
||||
struct list_head configs;
|
||||
struct usb_composite_driver *driver;
|
||||
u8 next_string_id;
|
||||
|
||||
spinlock_t lock;
|
||||
|
||||
/* REVISIT use and existence of lock ... */
|
||||
};
|
||||
|
||||
extern int usb_string_id(struct usb_composite_dev *c);
|
||||
|
||||
/* messaging utils */
|
||||
#define DBG(d, fmt, args...) \
|
||||
dev_dbg(&(d)->gadget->dev , fmt , ## args)
|
||||
#define VDBG(d, fmt, args...) \
|
||||
dev_vdbg(&(d)->gadget->dev , fmt , ## args)
|
||||
#define ERROR(d, fmt, args...) \
|
||||
dev_err(&(d)->gadget->dev , fmt , ## args)
|
||||
#define WARN(d, fmt, args...) \
|
||||
dev_warn(&(d)->gadget->dev , fmt , ## args)
|
||||
#define INFO(d, fmt, args...) \
|
||||
dev_info(&(d)->gadget->dev , fmt , ## args)
|
||||
|
||||
#endif /* __LINUX_USB_COMPOSITE_H */
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue