Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
This commit is contained in:
@@ -144,6 +144,7 @@ void __iomem *acpi_os_map_memory(acpi_physical_address where,
|
||||
acpi_size length);
|
||||
|
||||
void acpi_os_unmap_memory(void __iomem * logical_address, acpi_size size);
|
||||
void early_acpi_os_unmap_memory(void __iomem * virt, acpi_size size);
|
||||
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
acpi_status
|
||||
|
||||
@@ -130,6 +130,10 @@ acpi_get_table_header(acpi_string signature,
|
||||
struct acpi_table_header *out_table_header);
|
||||
|
||||
acpi_status
|
||||
acpi_get_table_with_size(acpi_string signature,
|
||||
u32 instance, struct acpi_table_header **out_table,
|
||||
acpi_size *tbl_size);
|
||||
acpi_status
|
||||
acpi_get_table(acpi_string signature,
|
||||
u32 instance, struct acpi_table_header **out_table);
|
||||
|
||||
|
||||
@@ -80,4 +80,56 @@ extern void setup_per_cpu_areas(void);
|
||||
#define DECLARE_PER_CPU(type, name) extern PER_CPU_ATTRIBUTES \
|
||||
__typeof__(type) per_cpu_var(name)
|
||||
|
||||
/*
|
||||
* Optional methods for optimized non-lvalue per-cpu variable access.
|
||||
*
|
||||
* @var can be a percpu variable or a field of it and its size should
|
||||
* equal char, int or long. percpu_read() evaluates to a lvalue and
|
||||
* all others to void.
|
||||
*
|
||||
* These operations are guaranteed to be atomic w.r.t. preemption.
|
||||
* The generic versions use plain get/put_cpu_var(). Archs are
|
||||
* encouraged to implement single-instruction alternatives which don't
|
||||
* require preemption protection.
|
||||
*/
|
||||
#ifndef percpu_read
|
||||
# define percpu_read(var) \
|
||||
({ \
|
||||
typeof(per_cpu_var(var)) __tmp_var__; \
|
||||
__tmp_var__ = get_cpu_var(var); \
|
||||
put_cpu_var(var); \
|
||||
__tmp_var__; \
|
||||
})
|
||||
#endif
|
||||
|
||||
#define __percpu_generic_to_op(var, val, op) \
|
||||
do { \
|
||||
get_cpu_var(var) op val; \
|
||||
put_cpu_var(var); \
|
||||
} while (0)
|
||||
|
||||
#ifndef percpu_write
|
||||
# define percpu_write(var, val) __percpu_generic_to_op(var, (val), =)
|
||||
#endif
|
||||
|
||||
#ifndef percpu_add
|
||||
# define percpu_add(var, val) __percpu_generic_to_op(var, (val), +=)
|
||||
#endif
|
||||
|
||||
#ifndef percpu_sub
|
||||
# define percpu_sub(var, val) __percpu_generic_to_op(var, (val), -=)
|
||||
#endif
|
||||
|
||||
#ifndef percpu_and
|
||||
# define percpu_and(var, val) __percpu_generic_to_op(var, (val), &=)
|
||||
#endif
|
||||
|
||||
#ifndef percpu_or
|
||||
# define percpu_or(var, val) __percpu_generic_to_op(var, (val), |=)
|
||||
#endif
|
||||
|
||||
#ifndef percpu_xor
|
||||
# define percpu_xor(var, val) __percpu_generic_to_op(var, (val), ^=)
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_GENERIC_PERCPU_H_ */
|
||||
|
||||
@@ -9,7 +9,7 @@ extern char __bss_start[], __bss_stop[];
|
||||
extern char __init_begin[], __init_end[];
|
||||
extern char _sinittext[], _einittext[];
|
||||
extern char _end[];
|
||||
extern char __per_cpu_start[], __per_cpu_end[];
|
||||
extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[];
|
||||
extern char __kprobes_text_start[], __kprobes_text_end[];
|
||||
extern char __initdata_begin[], __initdata_end[];
|
||||
extern char __start_rodata[], __end_rodata[];
|
||||
|
||||
@@ -427,12 +427,59 @@
|
||||
*(.initcall7.init) \
|
||||
*(.initcall7s.init)
|
||||
|
||||
#define PERCPU(align) \
|
||||
. = ALIGN(align); \
|
||||
VMLINUX_SYMBOL(__per_cpu_start) = .; \
|
||||
.data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { \
|
||||
/**
|
||||
* PERCPU_VADDR - define output section for percpu area
|
||||
* @vaddr: explicit base address (optional)
|
||||
* @phdr: destination PHDR (optional)
|
||||
*
|
||||
* Macro which expands to output section for percpu area. If @vaddr
|
||||
* is not blank, it specifies explicit base address and all percpu
|
||||
* symbols will be offset from the given address. If blank, @vaddr
|
||||
* always equals @laddr + LOAD_OFFSET.
|
||||
*
|
||||
* @phdr defines the output PHDR to use if not blank. Be warned that
|
||||
* output PHDR is sticky. If @phdr is specified, the next output
|
||||
* section in the linker script will go there too. @phdr should have
|
||||
* a leading colon.
|
||||
*
|
||||
* Note that this macros defines __per_cpu_load as an absolute symbol.
|
||||
* If there is no need to put the percpu section at a predetermined
|
||||
* address, use PERCPU().
|
||||
*/
|
||||
#define PERCPU_VADDR(vaddr, phdr) \
|
||||
VMLINUX_SYMBOL(__per_cpu_load) = .; \
|
||||
.data.percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \
|
||||
- LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__per_cpu_start) = .; \
|
||||
*(.data.percpu.first) \
|
||||
*(.data.percpu.page_aligned) \
|
||||
*(.data.percpu) \
|
||||
*(.data.percpu.shared_aligned) \
|
||||
} \
|
||||
VMLINUX_SYMBOL(__per_cpu_end) = .;
|
||||
VMLINUX_SYMBOL(__per_cpu_end) = .; \
|
||||
} phdr \
|
||||
. = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data.percpu);
|
||||
|
||||
/**
|
||||
* PERCPU - define output section for percpu area, simple version
|
||||
* @align: required alignment
|
||||
*
|
||||
* Align to @align and outputs output section for percpu area. This
|
||||
* macro doesn't maniuplate @vaddr or @phdr and __per_cpu_load and
|
||||
* __per_cpu_start will be identical.
|
||||
*
|
||||
* This macro is equivalent to ALIGN(align); PERCPU_VADDR( , ) except
|
||||
* that __per_cpu_load is defined as a relative symbol against
|
||||
* .data.percpu which is required for relocatable x86_32
|
||||
* configuration.
|
||||
*/
|
||||
#define PERCPU(align) \
|
||||
. = ALIGN(align); \
|
||||
.data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__per_cpu_load) = .; \
|
||||
VMLINUX_SYMBOL(__per_cpu_start) = .; \
|
||||
*(.data.percpu.first) \
|
||||
*(.data.percpu.page_aligned) \
|
||||
*(.data.percpu) \
|
||||
*(.data.percpu.shared_aligned) \
|
||||
VMLINUX_SYMBOL(__per_cpu_end) = .; \
|
||||
}
|
||||
|
||||
+76
-1
@@ -758,6 +758,8 @@ struct drm_driver {
|
||||
|
||||
int (*proc_init)(struct drm_minor *minor);
|
||||
void (*proc_cleanup)(struct drm_minor *minor);
|
||||
int (*debugfs_init)(struct drm_minor *minor);
|
||||
void (*debugfs_cleanup)(struct drm_minor *minor);
|
||||
|
||||
/**
|
||||
* Driver-specific constructor for drm_gem_objects, to set up
|
||||
@@ -793,6 +795,48 @@ struct drm_driver {
|
||||
#define DRM_MINOR_CONTROL 2
|
||||
#define DRM_MINOR_RENDER 3
|
||||
|
||||
|
||||
/**
|
||||
* debugfs node list. This structure represents a debugfs file to
|
||||
* be created by the drm core
|
||||
*/
|
||||
struct drm_debugfs_list {
|
||||
const char *name; /** file name */
|
||||
int (*show)(struct seq_file*, void*); /** show callback */
|
||||
u32 driver_features; /**< Required driver features for this entry */
|
||||
};
|
||||
|
||||
/**
|
||||
* debugfs node structure. This structure represents a debugfs file.
|
||||
*/
|
||||
struct drm_debugfs_node {
|
||||
struct list_head list;
|
||||
struct drm_minor *minor;
|
||||
struct drm_debugfs_list *debugfs_ent;
|
||||
struct dentry *dent;
|
||||
};
|
||||
|
||||
/**
|
||||
* Info file list entry. This structure represents a debugfs or proc file to
|
||||
* be created by the drm core
|
||||
*/
|
||||
struct drm_info_list {
|
||||
const char *name; /** file name */
|
||||
int (*show)(struct seq_file*, void*); /** show callback */
|
||||
u32 driver_features; /**< Required driver features for this entry */
|
||||
void *data;
|
||||
};
|
||||
|
||||
/**
|
||||
* debugfs node structure. This structure represents a debugfs file.
|
||||
*/
|
||||
struct drm_info_node {
|
||||
struct list_head list;
|
||||
struct drm_minor *minor;
|
||||
struct drm_info_list *info_ent;
|
||||
struct dentry *dent;
|
||||
};
|
||||
|
||||
/**
|
||||
* DRM minor structure. This structure represents a drm minor number.
|
||||
*/
|
||||
@@ -802,7 +846,12 @@ struct drm_minor {
|
||||
dev_t device; /**< Device number for mknod */
|
||||
struct device kdev; /**< Linux device */
|
||||
struct drm_device *dev;
|
||||
struct proc_dir_entry *dev_root; /**< proc directory entry */
|
||||
|
||||
struct proc_dir_entry *proc_root; /**< proc directory entry */
|
||||
struct drm_info_node proc_nodes;
|
||||
struct dentry *debugfs_root;
|
||||
struct drm_info_node debugfs_nodes;
|
||||
|
||||
struct drm_master *master; /* currently active master for this node */
|
||||
struct list_head master_list;
|
||||
struct drm_mode_group mode_group;
|
||||
@@ -1258,6 +1307,7 @@ extern unsigned int drm_debug;
|
||||
|
||||
extern struct class *drm_class;
|
||||
extern struct proc_dir_entry *drm_proc_root;
|
||||
extern struct dentry *drm_debugfs_root;
|
||||
|
||||
extern struct idr drm_minors_idr;
|
||||
|
||||
@@ -1268,6 +1318,31 @@ extern int drm_proc_init(struct drm_minor *minor, int minor_id,
|
||||
struct proc_dir_entry *root);
|
||||
extern int drm_proc_cleanup(struct drm_minor *minor, struct proc_dir_entry *root);
|
||||
|
||||
/* Debugfs support */
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
extern int drm_debugfs_init(struct drm_minor *minor, int minor_id,
|
||||
struct dentry *root);
|
||||
extern int drm_debugfs_create_files(struct drm_info_list *files, int count,
|
||||
struct dentry *root, struct drm_minor *minor);
|
||||
extern int drm_debugfs_remove_files(struct drm_info_list *files, int count,
|
||||
struct drm_minor *minor);
|
||||
extern int drm_debugfs_cleanup(struct drm_minor *minor);
|
||||
#endif
|
||||
|
||||
/* Info file support */
|
||||
extern int drm_name_info(struct seq_file *m, void *data);
|
||||
extern int drm_vm_info(struct seq_file *m, void *data);
|
||||
extern int drm_queues_info(struct seq_file *m, void *data);
|
||||
extern int drm_bufs_info(struct seq_file *m, void *data);
|
||||
extern int drm_vblank_info(struct seq_file *m, void *data);
|
||||
extern int drm_clients_info(struct seq_file *m, void* data);
|
||||
extern int drm_gem_name_info(struct seq_file *m, void *data);
|
||||
extern int drm_gem_object_info(struct seq_file *m, void* data);
|
||||
|
||||
#if DRM_DEBUG_CODE
|
||||
extern int drm_vma_info(struct seq_file *m, void *data);
|
||||
#endif
|
||||
|
||||
/* Scatter Gather Support (drm_scatter.h) */
|
||||
extern void drm_sg_cleanup(struct drm_sg_mem * entry);
|
||||
extern int drm_sg_alloc_ioctl(struct drm_device *dev, void *data,
|
||||
|
||||
@@ -418,4 +418,6 @@
|
||||
{0x8086, 0x2e02, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
|
||||
{0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
|
||||
{0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
|
||||
{0x8086, 0xa001, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
|
||||
{0x8086, 0xa011, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \
|
||||
{0, 0, 0}
|
||||
|
||||
@@ -79,6 +79,7 @@ typedef int (*acpi_table_handler) (struct acpi_table_header *table);
|
||||
typedef int (*acpi_table_entry_handler) (struct acpi_subtable_header *header, const unsigned long end);
|
||||
|
||||
char * __acpi_map_table (unsigned long phys_addr, unsigned long size);
|
||||
void __acpi_unmap_table(char *map, unsigned long size);
|
||||
int early_acpi_boot_init(void);
|
||||
int acpi_boot_init (void);
|
||||
int acpi_boot_table_init (void);
|
||||
|
||||
+19
-17
@@ -65,23 +65,20 @@ extern void free_bootmem(unsigned long addr, unsigned long size);
|
||||
#define BOOTMEM_DEFAULT 0
|
||||
#define BOOTMEM_EXCLUSIVE (1<<0)
|
||||
|
||||
extern int reserve_bootmem(unsigned long addr,
|
||||
unsigned long size,
|
||||
int flags);
|
||||
extern int reserve_bootmem_node(pg_data_t *pgdat,
|
||||
unsigned long physaddr,
|
||||
unsigned long size,
|
||||
int flags);
|
||||
#ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE
|
||||
extern int reserve_bootmem(unsigned long addr, unsigned long size, int flags);
|
||||
#endif
|
||||
unsigned long physaddr,
|
||||
unsigned long size,
|
||||
int flags);
|
||||
|
||||
extern void *__alloc_bootmem_nopanic(unsigned long size,
|
||||
extern void *__alloc_bootmem(unsigned long size,
|
||||
unsigned long align,
|
||||
unsigned long goal);
|
||||
extern void *__alloc_bootmem(unsigned long size,
|
||||
extern void *__alloc_bootmem_nopanic(unsigned long size,
|
||||
unsigned long align,
|
||||
unsigned long goal);
|
||||
extern void *__alloc_bootmem_low(unsigned long size,
|
||||
unsigned long align,
|
||||
unsigned long goal);
|
||||
extern void *__alloc_bootmem_node(pg_data_t *pgdat,
|
||||
unsigned long size,
|
||||
unsigned long align,
|
||||
@@ -90,30 +87,35 @@ extern void *__alloc_bootmem_node_nopanic(pg_data_t *pgdat,
|
||||
unsigned long size,
|
||||
unsigned long align,
|
||||
unsigned long goal);
|
||||
extern void *__alloc_bootmem_low(unsigned long size,
|
||||
unsigned long align,
|
||||
unsigned long goal);
|
||||
extern void *__alloc_bootmem_low_node(pg_data_t *pgdat,
|
||||
unsigned long size,
|
||||
unsigned long align,
|
||||
unsigned long goal);
|
||||
#ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE
|
||||
|
||||
#define alloc_bootmem(x) \
|
||||
__alloc_bootmem(x, SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS))
|
||||
#define alloc_bootmem_nopanic(x) \
|
||||
__alloc_bootmem_nopanic(x, SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS))
|
||||
#define alloc_bootmem_low(x) \
|
||||
__alloc_bootmem_low(x, SMP_CACHE_BYTES, 0)
|
||||
#define alloc_bootmem_pages(x) \
|
||||
__alloc_bootmem(x, PAGE_SIZE, __pa(MAX_DMA_ADDRESS))
|
||||
#define alloc_bootmem_pages_nopanic(x) \
|
||||
__alloc_bootmem_nopanic(x, PAGE_SIZE, __pa(MAX_DMA_ADDRESS))
|
||||
#define alloc_bootmem_low_pages(x) \
|
||||
__alloc_bootmem_low(x, PAGE_SIZE, 0)
|
||||
#define alloc_bootmem_node(pgdat, x) \
|
||||
__alloc_bootmem_node(pgdat, x, SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS))
|
||||
#define alloc_bootmem_pages_node(pgdat, x) \
|
||||
__alloc_bootmem_node(pgdat, x, PAGE_SIZE, __pa(MAX_DMA_ADDRESS))
|
||||
#define alloc_bootmem_pages_node_nopanic(pgdat, x) \
|
||||
__alloc_bootmem_node_nopanic(pgdat, x, PAGE_SIZE, __pa(MAX_DMA_ADDRESS))
|
||||
|
||||
#define alloc_bootmem_low(x) \
|
||||
__alloc_bootmem_low(x, SMP_CACHE_BYTES, 0)
|
||||
#define alloc_bootmem_low_pages(x) \
|
||||
__alloc_bootmem_low(x, PAGE_SIZE, 0)
|
||||
#define alloc_bootmem_low_pages_node(pgdat, x) \
|
||||
__alloc_bootmem_low_node(pgdat, x, PAGE_SIZE, 0)
|
||||
#endif /* !CONFIG_HAVE_ARCH_BOOTMEM_NODE */
|
||||
|
||||
extern int reserve_bootmem_generic(unsigned long addr, unsigned long size,
|
||||
int flags);
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#ifndef BSG_H
|
||||
#define BSG_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define BSG_PROTOCOL_SCSI 0
|
||||
|
||||
#define BSG_SUB_PROTOCOL_SCSI_CMD 0
|
||||
|
||||
@@ -165,15 +165,8 @@ int sync_mapping_buffers(struct address_space *mapping);
|
||||
void unmap_underlying_metadata(struct block_device *bdev, sector_t block);
|
||||
|
||||
void mark_buffer_async_write(struct buffer_head *bh);
|
||||
void invalidate_bdev(struct block_device *);
|
||||
int sync_blockdev(struct block_device *bdev);
|
||||
void __wait_on_buffer(struct buffer_head *);
|
||||
wait_queue_head_t *bh_waitq_head(struct buffer_head *bh);
|
||||
int fsync_bdev(struct block_device *);
|
||||
struct super_block *freeze_bdev(struct block_device *);
|
||||
int thaw_bdev(struct block_device *, struct super_block *);
|
||||
int fsync_super(struct super_block *);
|
||||
int fsync_no_super(struct block_device *);
|
||||
struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block,
|
||||
unsigned size);
|
||||
struct buffer_head *__getblk(struct block_device *bdev, sector_t block,
|
||||
|
||||
@@ -125,4 +125,21 @@ int clk_set_parent(struct clk *clk, struct clk *parent);
|
||||
*/
|
||||
struct clk *clk_get_parent(struct clk *clk);
|
||||
|
||||
/**
|
||||
* clk_get_sys - get a clock based upon the device name
|
||||
* @dev_id: device name
|
||||
* @con_id: connection ID
|
||||
*
|
||||
* Returns a struct clk corresponding to the clock producer, or
|
||||
* valid IS_ERR() condition containing errno. The implementation
|
||||
* uses @dev_id and @con_id to determine the clock consumer, and
|
||||
* thereby the clock producer. In contrast to clk_get() this function
|
||||
* takes the device name instead of the device itself for identification.
|
||||
*
|
||||
* Drivers must assume that the clock source is not enabled.
|
||||
*
|
||||
* clk_get_sys should not be called from within interrupt context.
|
||||
*/
|
||||
struct clk *clk_get_sys(const char *dev_id, const char *con_id);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -125,6 +125,13 @@ struct compat_dirent {
|
||||
char d_name[256];
|
||||
};
|
||||
|
||||
struct compat_ustat {
|
||||
compat_daddr_t f_tfree;
|
||||
compat_ino_t f_tinode;
|
||||
char f_fname[6];
|
||||
char f_fpack[6];
|
||||
};
|
||||
|
||||
typedef union compat_sigval {
|
||||
compat_int_t sival_int;
|
||||
compat_uptr_t sival_ptr;
|
||||
@@ -178,6 +185,7 @@ long compat_sys_semtimedop(int semid, struct sembuf __user *tsems,
|
||||
unsigned nsems, const struct compat_timespec __user *timeout);
|
||||
asmlinkage long compat_sys_keyctl(u32 option,
|
||||
u32 arg2, u32 arg3, u32 arg4, u32 arg5);
|
||||
asmlinkage long compat_sys_ustat(unsigned dev, struct compat_ustat __user *u32);
|
||||
|
||||
asmlinkage ssize_t compat_sys_readv(unsigned long fd,
|
||||
const struct compat_iovec __user *vec, unsigned long vlen);
|
||||
|
||||
@@ -112,7 +112,7 @@ struct dentry {
|
||||
struct list_head d_subdirs; /* our children */
|
||||
struct list_head d_alias; /* inode alias list */
|
||||
unsigned long d_time; /* used by d_revalidate */
|
||||
struct dentry_operations *d_op;
|
||||
const struct dentry_operations *d_op;
|
||||
struct super_block *d_sb; /* The root of the dentry tree */
|
||||
void *d_fsdata; /* fs-specific data */
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
#ifndef DECOMPRESS_BUNZIP2_H
|
||||
#define DECOMPRESS_BUNZIP2_H
|
||||
|
||||
int bunzip2(unsigned char *inbuf, int len,
|
||||
int(*fill)(void*, unsigned int),
|
||||
int(*flush)(void*, unsigned int),
|
||||
unsigned char *output,
|
||||
int *pos,
|
||||
void(*error)(char *x));
|
||||
#endif
|
||||
@@ -0,0 +1,33 @@
|
||||
#ifndef DECOMPRESS_GENERIC_H
|
||||
#define DECOMPRESS_GENERIC_H
|
||||
|
||||
/* Minimal chunksize to be read.
|
||||
*Bzip2 prefers at least 4096
|
||||
*Lzma prefers 0x10000 */
|
||||
#define COMPR_IOBUF_SIZE 4096
|
||||
|
||||
typedef int (*decompress_fn) (unsigned char *inbuf, int len,
|
||||
int(*fill)(void*, unsigned int),
|
||||
int(*writebb)(void*, unsigned int),
|
||||
unsigned char *output,
|
||||
int *posp,
|
||||
void(*error)(char *x));
|
||||
|
||||
/* inbuf - input buffer
|
||||
*len - len of pre-read data in inbuf
|
||||
*fill - function to fill inbuf if empty
|
||||
*writebb - function to write out outbug
|
||||
*posp - if non-null, input position (number of bytes read) will be
|
||||
* returned here
|
||||
*
|
||||
*If len != 0, the inbuf is initialized (with as much data), and fill
|
||||
*should not be called
|
||||
*If len = 0, the inbuf is allocated, but empty. Its size is IOBUF_SIZE
|
||||
*fill should be called (repeatedly...) to read data, at most IOBUF_SIZE
|
||||
*/
|
||||
|
||||
/* Utility routine to detect the decompression method */
|
||||
decompress_fn decompress_method(const unsigned char *inbuf, int len,
|
||||
const char **name);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,13 @@
|
||||
#ifndef INFLATE_H
|
||||
#define INFLATE_H
|
||||
|
||||
/* Other housekeeping constants */
|
||||
#define INBUFSIZ 4096
|
||||
|
||||
int gunzip(unsigned char *inbuf, int len,
|
||||
int(*fill)(void*, unsigned int),
|
||||
int(*flush)(void*, unsigned int),
|
||||
unsigned char *output,
|
||||
int *pos,
|
||||
void(*error_fn)(char *x));
|
||||
#endif
|
||||
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* linux/compr_mm.h
|
||||
*
|
||||
* Memory management for pre-boot and ramdisk uncompressors
|
||||
*
|
||||
* Authors: Alain Knaff <alain@knaff.lu>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef DECOMPR_MM_H
|
||||
#define DECOMPR_MM_H
|
||||
|
||||
#ifdef STATIC
|
||||
|
||||
/* Code active when included from pre-boot environment: */
|
||||
|
||||
/* A trivial malloc implementation, adapted from
|
||||
* malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994
|
||||
*/
|
||||
static unsigned long malloc_ptr;
|
||||
static int malloc_count;
|
||||
|
||||
static void *malloc(int size)
|
||||
{
|
||||
void *p;
|
||||
|
||||
if (size < 0)
|
||||
error("Malloc error");
|
||||
if (!malloc_ptr)
|
||||
malloc_ptr = free_mem_ptr;
|
||||
|
||||
malloc_ptr = (malloc_ptr + 3) & ~3; /* Align */
|
||||
|
||||
p = (void *)malloc_ptr;
|
||||
malloc_ptr += size;
|
||||
|
||||
if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr)
|
||||
error("Out of memory");
|
||||
|
||||
malloc_count++;
|
||||
return p;
|
||||
}
|
||||
|
||||
static void free(void *where)
|
||||
{
|
||||
malloc_count--;
|
||||
if (!malloc_count)
|
||||
malloc_ptr = free_mem_ptr;
|
||||
}
|
||||
|
||||
#define large_malloc(a) malloc(a)
|
||||
#define large_free(a) free(a)
|
||||
|
||||
#define set_error_fn(x)
|
||||
|
||||
#define INIT
|
||||
|
||||
#else /* STATIC */
|
||||
|
||||
/* Code active when compiled standalone for use when loading ramdisk: */
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
/* Use defines rather than static inline in order to avoid spurious
|
||||
* warnings when not needed (indeed large_malloc / large_free are not
|
||||
* needed by inflate */
|
||||
|
||||
#define malloc(a) kmalloc(a, GFP_KERNEL)
|
||||
#define free(a) kfree(a)
|
||||
|
||||
#define large_malloc(a) vmalloc(a)
|
||||
#define large_free(a) vfree(a)
|
||||
|
||||
static void(*error)(char *m);
|
||||
#define set_error_fn(x) error = x;
|
||||
|
||||
#define INIT __init
|
||||
#define STATIC
|
||||
|
||||
#include <linux/init.h>
|
||||
|
||||
#endif /* STATIC */
|
||||
|
||||
#endif /* DECOMPR_MM_H */
|
||||
@@ -0,0 +1,12 @@
|
||||
#ifndef DECOMPRESS_UNLZMA_H
|
||||
#define DECOMPRESS_UNLZMA_H
|
||||
|
||||
int unlzma(unsigned char *, int,
|
||||
int(*fill)(void*, unsigned int),
|
||||
int(*flush)(void*, unsigned int),
|
||||
unsigned char *output,
|
||||
int *posp,
|
||||
void(*error)(char *x)
|
||||
);
|
||||
|
||||
#endif
|
||||
@@ -111,6 +111,15 @@ static inline void elf_core_copy_regs(elf_gregset_t *elfregs, struct pt_regs *re
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void elf_core_copy_kernel_regs(elf_gregset_t *elfregs, struct pt_regs *regs)
|
||||
{
|
||||
#ifdef ELF_CORE_COPY_KERNEL_REGS
|
||||
ELF_CORE_COPY_KERNEL_REGS((*elfregs), regs);
|
||||
#else
|
||||
elf_core_copy_regs(elfregs, regs);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int elf_core_copy_task_regs(struct task_struct *t, elf_gregset_t* elfregs)
|
||||
{
|
||||
#ifdef ELF_CORE_COPY_TASK_REGS
|
||||
|
||||
+185
-33
@@ -25,10 +25,12 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/firewire-constants.h>
|
||||
|
||||
#define FW_CDEV_EVENT_BUS_RESET 0x00
|
||||
#define FW_CDEV_EVENT_RESPONSE 0x01
|
||||
#define FW_CDEV_EVENT_REQUEST 0x02
|
||||
#define FW_CDEV_EVENT_ISO_INTERRUPT 0x03
|
||||
#define FW_CDEV_EVENT_BUS_RESET 0x00
|
||||
#define FW_CDEV_EVENT_RESPONSE 0x01
|
||||
#define FW_CDEV_EVENT_REQUEST 0x02
|
||||
#define FW_CDEV_EVENT_ISO_INTERRUPT 0x03
|
||||
#define FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED 0x04
|
||||
#define FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED 0x05
|
||||
|
||||
/**
|
||||
* struct fw_cdev_event_common - Common part of all fw_cdev_event_ types
|
||||
@@ -136,7 +138,24 @@ struct fw_cdev_event_request {
|
||||
* This event is sent when the controller has completed an &fw_cdev_iso_packet
|
||||
* with the %FW_CDEV_ISO_INTERRUPT bit set. In the receive case, the headers
|
||||
* stripped of all packets up until and including the interrupt packet are
|
||||
* returned in the @header field.
|
||||
* returned in the @header field. The amount of header data per packet is as
|
||||
* specified at iso context creation by &fw_cdev_create_iso_context.header_size.
|
||||
*
|
||||
* In version 1 of this ABI, header data consisted of the 1394 isochronous
|
||||
* packet header, followed by quadlets from the packet payload if
|
||||
* &fw_cdev_create_iso_context.header_size > 4.
|
||||
*
|
||||
* In version 2 of this ABI, header data consist of the 1394 isochronous
|
||||
* packet header, followed by a timestamp quadlet if
|
||||
* &fw_cdev_create_iso_context.header_size > 4, followed by quadlets from the
|
||||
* packet payload if &fw_cdev_create_iso_context.header_size > 8.
|
||||
*
|
||||
* Behaviour of ver. 1 of this ABI is no longer available since ABI ver. 2.
|
||||
*
|
||||
* Format of 1394 iso packet header: 16 bits len, 2 bits tag, 6 bits channel,
|
||||
* 4 bits tcode, 4 bits sy, in big endian byte order. Format of timestamp:
|
||||
* 16 bits invalid, 3 bits cycleSeconds, 13 bits cycleCount, in big endian byte
|
||||
* order.
|
||||
*/
|
||||
struct fw_cdev_event_iso_interrupt {
|
||||
__u64 closure;
|
||||
@@ -146,6 +165,35 @@ struct fw_cdev_event_iso_interrupt {
|
||||
__u32 header[0];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct fw_cdev_event_iso_resource - Iso resources were allocated or freed
|
||||
* @closure: See &fw_cdev_event_common;
|
||||
* set by %FW_CDEV_IOC_(DE)ALLOCATE_ISO_RESOURCE(_ONCE) ioctl
|
||||
* @type: %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or
|
||||
* %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED
|
||||
* @handle: Reference by which an allocated resource can be deallocated
|
||||
* @channel: Isochronous channel which was (de)allocated, if any
|
||||
* @bandwidth: Bandwidth allocation units which were (de)allocated, if any
|
||||
*
|
||||
* An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED event is sent after an isochronous
|
||||
* resource was allocated at the IRM. The client has to check @channel and
|
||||
* @bandwidth for whether the allocation actually succeeded.
|
||||
*
|
||||
* An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event is sent after an isochronous
|
||||
* resource was deallocated at the IRM. It is also sent when automatic
|
||||
* reallocation after a bus reset failed.
|
||||
*
|
||||
* @channel is <0 if no channel was (de)allocated or if reallocation failed.
|
||||
* @bandwidth is 0 if no bandwidth was (de)allocated or if reallocation failed.
|
||||
*/
|
||||
struct fw_cdev_event_iso_resource {
|
||||
__u64 closure;
|
||||
__u32 type;
|
||||
__u32 handle;
|
||||
__s32 channel;
|
||||
__s32 bandwidth;
|
||||
};
|
||||
|
||||
/**
|
||||
* union fw_cdev_event - Convenience union of fw_cdev_event_ types
|
||||
* @common: Valid for all types
|
||||
@@ -153,6 +201,9 @@ struct fw_cdev_event_iso_interrupt {
|
||||
* @response: Valid if @common.type == %FW_CDEV_EVENT_RESPONSE
|
||||
* @request: Valid if @common.type == %FW_CDEV_EVENT_REQUEST
|
||||
* @iso_interrupt: Valid if @common.type == %FW_CDEV_EVENT_ISO_INTERRUPT
|
||||
* @iso_resource: Valid if @common.type ==
|
||||
* %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or
|
||||
* %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED
|
||||
*
|
||||
* Convenience union for userspace use. Events could be read(2) into an
|
||||
* appropriately aligned char buffer and then cast to this union for further
|
||||
@@ -163,33 +214,47 @@ struct fw_cdev_event_iso_interrupt {
|
||||
* not fit will be discarded so that the next read(2) will return a new event.
|
||||
*/
|
||||
union fw_cdev_event {
|
||||
struct fw_cdev_event_common common;
|
||||
struct fw_cdev_event_bus_reset bus_reset;
|
||||
struct fw_cdev_event_response response;
|
||||
struct fw_cdev_event_request request;
|
||||
struct fw_cdev_event_iso_interrupt iso_interrupt;
|
||||
struct fw_cdev_event_common common;
|
||||
struct fw_cdev_event_bus_reset bus_reset;
|
||||
struct fw_cdev_event_response response;
|
||||
struct fw_cdev_event_request request;
|
||||
struct fw_cdev_event_iso_interrupt iso_interrupt;
|
||||
struct fw_cdev_event_iso_resource iso_resource;
|
||||
};
|
||||
|
||||
#define FW_CDEV_IOC_GET_INFO _IOWR('#', 0x00, struct fw_cdev_get_info)
|
||||
#define FW_CDEV_IOC_SEND_REQUEST _IOW('#', 0x01, struct fw_cdev_send_request)
|
||||
#define FW_CDEV_IOC_ALLOCATE _IOWR('#', 0x02, struct fw_cdev_allocate)
|
||||
#define FW_CDEV_IOC_DEALLOCATE _IOW('#', 0x03, struct fw_cdev_deallocate)
|
||||
#define FW_CDEV_IOC_SEND_RESPONSE _IOW('#', 0x04, struct fw_cdev_send_response)
|
||||
#define FW_CDEV_IOC_INITIATE_BUS_RESET _IOW('#', 0x05, struct fw_cdev_initiate_bus_reset)
|
||||
#define FW_CDEV_IOC_ADD_DESCRIPTOR _IOWR('#', 0x06, struct fw_cdev_add_descriptor)
|
||||
#define FW_CDEV_IOC_REMOVE_DESCRIPTOR _IOW('#', 0x07, struct fw_cdev_remove_descriptor)
|
||||
/* available since kernel version 2.6.22 */
|
||||
#define FW_CDEV_IOC_GET_INFO _IOWR('#', 0x00, struct fw_cdev_get_info)
|
||||
#define FW_CDEV_IOC_SEND_REQUEST _IOW('#', 0x01, struct fw_cdev_send_request)
|
||||
#define FW_CDEV_IOC_ALLOCATE _IOWR('#', 0x02, struct fw_cdev_allocate)
|
||||
#define FW_CDEV_IOC_DEALLOCATE _IOW('#', 0x03, struct fw_cdev_deallocate)
|
||||
#define FW_CDEV_IOC_SEND_RESPONSE _IOW('#', 0x04, struct fw_cdev_send_response)
|
||||
#define FW_CDEV_IOC_INITIATE_BUS_RESET _IOW('#', 0x05, struct fw_cdev_initiate_bus_reset)
|
||||
#define FW_CDEV_IOC_ADD_DESCRIPTOR _IOWR('#', 0x06, struct fw_cdev_add_descriptor)
|
||||
#define FW_CDEV_IOC_REMOVE_DESCRIPTOR _IOW('#', 0x07, struct fw_cdev_remove_descriptor)
|
||||
#define FW_CDEV_IOC_CREATE_ISO_CONTEXT _IOWR('#', 0x08, struct fw_cdev_create_iso_context)
|
||||
#define FW_CDEV_IOC_QUEUE_ISO _IOWR('#', 0x09, struct fw_cdev_queue_iso)
|
||||
#define FW_CDEV_IOC_START_ISO _IOW('#', 0x0a, struct fw_cdev_start_iso)
|
||||
#define FW_CDEV_IOC_STOP_ISO _IOW('#', 0x0b, struct fw_cdev_stop_iso)
|
||||
|
||||
#define FW_CDEV_IOC_CREATE_ISO_CONTEXT _IOWR('#', 0x08, struct fw_cdev_create_iso_context)
|
||||
#define FW_CDEV_IOC_QUEUE_ISO _IOWR('#', 0x09, struct fw_cdev_queue_iso)
|
||||
#define FW_CDEV_IOC_START_ISO _IOW('#', 0x0a, struct fw_cdev_start_iso)
|
||||
#define FW_CDEV_IOC_STOP_ISO _IOW('#', 0x0b, struct fw_cdev_stop_iso)
|
||||
#define FW_CDEV_IOC_GET_CYCLE_TIMER _IOR('#', 0x0c, struct fw_cdev_get_cycle_timer)
|
||||
/* available since kernel version 2.6.24 */
|
||||
#define FW_CDEV_IOC_GET_CYCLE_TIMER _IOR('#', 0x0c, struct fw_cdev_get_cycle_timer)
|
||||
|
||||
/* FW_CDEV_VERSION History
|
||||
*
|
||||
* 1 Feb 18, 2007: Initial version.
|
||||
/* available since kernel version 2.6.30 */
|
||||
#define FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE _IOWR('#', 0x0d, struct fw_cdev_allocate_iso_resource)
|
||||
#define FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE _IOW('#', 0x0e, struct fw_cdev_deallocate)
|
||||
#define FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE _IOW('#', 0x0f, struct fw_cdev_allocate_iso_resource)
|
||||
#define FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE _IOW('#', 0x10, struct fw_cdev_allocate_iso_resource)
|
||||
#define FW_CDEV_IOC_GET_SPEED _IO('#', 0x11) /* returns speed code */
|
||||
#define FW_CDEV_IOC_SEND_BROADCAST_REQUEST _IOW('#', 0x12, struct fw_cdev_send_request)
|
||||
#define FW_CDEV_IOC_SEND_STREAM_PACKET _IOW('#', 0x13, struct fw_cdev_send_stream_packet)
|
||||
|
||||
/*
|
||||
* FW_CDEV_VERSION History
|
||||
* 1 (2.6.22) - initial version
|
||||
* 2 (2.6.30) - changed &fw_cdev_event_iso_interrupt.header if
|
||||
* &fw_cdev_create_iso_context.header_size is 8 or more
|
||||
*/
|
||||
#define FW_CDEV_VERSION 1
|
||||
#define FW_CDEV_VERSION 2
|
||||
|
||||
/**
|
||||
* struct fw_cdev_get_info - General purpose information ioctl
|
||||
@@ -201,7 +266,7 @@ union fw_cdev_event {
|
||||
* case, @rom_length is updated with the actual length of the
|
||||
* configuration ROM.
|
||||
* @rom: If non-zero, address of a buffer to be filled by a copy of the
|
||||
* local node's configuration ROM
|
||||
* device's configuration ROM
|
||||
* @bus_reset: If non-zero, address of a buffer to be filled by a
|
||||
* &struct fw_cdev_event_bus_reset with the current state
|
||||
* of the bus. This does not cause a bus reset to happen.
|
||||
@@ -229,7 +294,7 @@ struct fw_cdev_get_info {
|
||||
* Send a request to the device. This ioctl implements all outgoing requests.
|
||||
* Both quadlet and block request specify the payload as a pointer to the data
|
||||
* in the @data field. Once the transaction completes, the kernel writes an
|
||||
* &fw_cdev_event_request event back. The @closure field is passed back to
|
||||
* &fw_cdev_event_response event back. The @closure field is passed back to
|
||||
* user space in the response event.
|
||||
*/
|
||||
struct fw_cdev_send_request {
|
||||
@@ -284,9 +349,9 @@ struct fw_cdev_allocate {
|
||||
};
|
||||
|
||||
/**
|
||||
* struct fw_cdev_deallocate - Free an address range allocation
|
||||
* @handle: Handle to the address range, as returned by the kernel when the
|
||||
* range was allocated
|
||||
* struct fw_cdev_deallocate - Free a CSR address range or isochronous resource
|
||||
* @handle: Handle to the address range or iso resource, as returned by the
|
||||
* kernel when the range or resource was allocated
|
||||
*/
|
||||
struct fw_cdev_deallocate {
|
||||
__u32 handle;
|
||||
@@ -329,6 +394,9 @@ struct fw_cdev_initiate_bus_reset {
|
||||
* If successful, the kernel adds the descriptor and writes back a handle to the
|
||||
* kernel-side object to be used for later removal of the descriptor block and
|
||||
* immediate key.
|
||||
*
|
||||
* This ioctl affects the configuration ROMs of all local nodes.
|
||||
* The ioctl only succeeds on device files which represent a local node.
|
||||
*/
|
||||
struct fw_cdev_add_descriptor {
|
||||
__u32 immediate;
|
||||
@@ -344,7 +412,7 @@ struct fw_cdev_add_descriptor {
|
||||
* descriptor was added
|
||||
*
|
||||
* Remove a descriptor block and accompanying immediate key from the local
|
||||
* node's configuration ROM.
|
||||
* nodes' configuration ROMs.
|
||||
*/
|
||||
struct fw_cdev_remove_descriptor {
|
||||
__u32 handle;
|
||||
@@ -370,6 +438,9 @@ struct fw_cdev_remove_descriptor {
|
||||
*
|
||||
* If a context was successfully created, the kernel writes back a handle to the
|
||||
* context, which must be passed in for subsequent operations on that context.
|
||||
*
|
||||
* Note that the effect of a @header_size > 4 depends on
|
||||
* &fw_cdev_get_info.version, as documented at &fw_cdev_event_iso_interrupt.
|
||||
*/
|
||||
struct fw_cdev_create_iso_context {
|
||||
__u32 type;
|
||||
@@ -473,10 +544,91 @@ struct fw_cdev_stop_iso {
|
||||
* The %FW_CDEV_IOC_GET_CYCLE_TIMER ioctl reads the isochronous cycle timer
|
||||
* and also the system clock. This allows to express the receive time of an
|
||||
* isochronous packet as a system time with microsecond accuracy.
|
||||
*
|
||||
* @cycle_timer consists of 7 bits cycleSeconds, 13 bits cycleCount, and
|
||||
* 12 bits cycleOffset, in host byte order.
|
||||
*/
|
||||
struct fw_cdev_get_cycle_timer {
|
||||
__u64 local_time;
|
||||
__u32 cycle_timer;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct fw_cdev_allocate_iso_resource - (De)allocate a channel or bandwidth
|
||||
* @closure: Passed back to userspace in correponding iso resource events
|
||||
* @channels: Isochronous channels of which one is to be (de)allocated
|
||||
* @bandwidth: Isochronous bandwidth units to be (de)allocated
|
||||
* @handle: Handle to the allocation, written by the kernel (only valid in
|
||||
* case of %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE ioctls)
|
||||
*
|
||||
* The %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE ioctl initiates allocation of an
|
||||
* isochronous channel and/or of isochronous bandwidth at the isochronous
|
||||
* resource manager (IRM). Only one of the channels specified in @channels is
|
||||
* allocated. An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED is sent after
|
||||
* communication with the IRM, indicating success or failure in the event data.
|
||||
* The kernel will automatically reallocate the resources after bus resets.
|
||||
* Should a reallocation fail, an %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event
|
||||
* will be sent. The kernel will also automatically deallocate the resources
|
||||
* when the file descriptor is closed.
|
||||
*
|
||||
* The %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE ioctl can be used to initiate
|
||||
* deallocation of resources which were allocated as described above.
|
||||
* An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event concludes this operation.
|
||||
*
|
||||
* The %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE ioctl is a variant of allocation
|
||||
* without automatic re- or deallocation.
|
||||
* An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED event concludes this operation,
|
||||
* indicating success or failure in its data.
|
||||
*
|
||||
* The %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE ioctl works like
|
||||
* %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE except that resources are freed
|
||||
* instead of allocated.
|
||||
* An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event concludes this operation.
|
||||
*
|
||||
* To summarize, %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE allocates iso resources
|
||||
* for the lifetime of the fd or handle.
|
||||
* In contrast, %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE allocates iso resources
|
||||
* for the duration of a bus generation.
|
||||
*
|
||||
* @channels is a host-endian bitfield with the least significant bit
|
||||
* representing channel 0 and the most significant bit representing channel 63:
|
||||
* 1ULL << c for each channel c that is a candidate for (de)allocation.
|
||||
*
|
||||
* @bandwidth is expressed in bandwidth allocation units, i.e. the time to send
|
||||
* one quadlet of data (payload or header data) at speed S1600.
|
||||
*/
|
||||
struct fw_cdev_allocate_iso_resource {
|
||||
__u64 closure;
|
||||
__u64 channels;
|
||||
__u32 bandwidth;
|
||||
__u32 handle;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct fw_cdev_send_stream_packet - send an asynchronous stream packet
|
||||
* @length: Length of outgoing payload, in bytes
|
||||
* @tag: Data format tag
|
||||
* @channel: Isochronous channel to transmit to
|
||||
* @sy: Synchronization code
|
||||
* @closure: Passed back to userspace in the response event
|
||||
* @data: Userspace pointer to payload
|
||||
* @generation: The bus generation where packet is valid
|
||||
* @speed: Speed to transmit at
|
||||
*
|
||||
* The %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl sends an asynchronous stream packet
|
||||
* to every device which is listening to the specified channel. The kernel
|
||||
* writes an &fw_cdev_event_response event which indicates success or failure of
|
||||
* the transmission.
|
||||
*/
|
||||
struct fw_cdev_send_stream_packet {
|
||||
__u32 length;
|
||||
__u32 tag;
|
||||
__u32 channel;
|
||||
__u32 sy;
|
||||
__u64 closure;
|
||||
__u64 data;
|
||||
__u32 generation;
|
||||
__u32 speed;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_FIREWIRE_CDEV_H */
|
||||
|
||||
+185
-35
@@ -1064,34 +1064,147 @@ extern int lease_modify(struct file_lock **, int);
|
||||
extern int lock_may_read(struct inode *, loff_t start, unsigned long count);
|
||||
extern int lock_may_write(struct inode *, loff_t start, unsigned long count);
|
||||
#else /* !CONFIG_FILE_LOCKING */
|
||||
#define fcntl_getlk(a, b) ({ -EINVAL; })
|
||||
#define fcntl_setlk(a, b, c, d) ({ -EACCES; })
|
||||
static inline int fcntl_getlk(struct file *file, struct flock __user *user)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int fcntl_setlk(unsigned int fd, struct file *file,
|
||||
unsigned int cmd, struct flock __user *user)
|
||||
{
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
#if BITS_PER_LONG == 32
|
||||
#define fcntl_getlk64(a, b) ({ -EINVAL; })
|
||||
#define fcntl_setlk64(a, b, c, d) ({ -EACCES; })
|
||||
static inline int fcntl_getlk64(struct file *file, struct flock64 __user *user)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int fcntl_setlk64(unsigned int fd, struct file *file,
|
||||
unsigned int cmd, struct flock64 __user *user)
|
||||
{
|
||||
return -EACCES;
|
||||
}
|
||||
#endif
|
||||
#define fcntl_setlease(a, b, c) ({ 0; })
|
||||
#define fcntl_getlease(a) ({ 0; })
|
||||
#define locks_init_lock(a) ({ })
|
||||
#define __locks_copy_lock(a, b) ({ })
|
||||
#define locks_copy_lock(a, b) ({ })
|
||||
#define locks_remove_posix(a, b) ({ })
|
||||
#define locks_remove_flock(a) ({ })
|
||||
#define posix_test_lock(a, b) ({ 0; })
|
||||
#define posix_lock_file(a, b, c) ({ -ENOLCK; })
|
||||
#define posix_lock_file_wait(a, b) ({ -ENOLCK; })
|
||||
#define posix_unblock_lock(a, b) (-ENOENT)
|
||||
#define vfs_test_lock(a, b) ({ 0; })
|
||||
#define vfs_lock_file(a, b, c, d) (-ENOLCK)
|
||||
#define vfs_cancel_lock(a, b) ({ 0; })
|
||||
#define flock_lock_file_wait(a, b) ({ -ENOLCK; })
|
||||
#define __break_lease(a, b) ({ 0; })
|
||||
#define lease_get_mtime(a, b) ({ })
|
||||
#define generic_setlease(a, b, c) ({ -EINVAL; })
|
||||
#define vfs_setlease(a, b, c) ({ -EINVAL; })
|
||||
#define lease_modify(a, b) ({ -EINVAL; })
|
||||
#define lock_may_read(a, b, c) ({ 1; })
|
||||
#define lock_may_write(a, b, c) ({ 1; })
|
||||
static inline int fcntl_setlease(unsigned int fd, struct file *filp, long arg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int fcntl_getlease(struct file *filp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void locks_init_lock(struct file_lock *fl)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void __locks_copy_lock(struct file_lock *new, struct file_lock *fl)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void locks_copy_lock(struct file_lock *new, struct file_lock *fl)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void locks_remove_posix(struct file *filp, fl_owner_t owner)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void locks_remove_flock(struct file *filp)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void posix_test_lock(struct file *filp, struct file_lock *fl)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline int posix_lock_file(struct file *filp, struct file_lock *fl,
|
||||
struct file_lock *conflock)
|
||||
{
|
||||
return -ENOLCK;
|
||||
}
|
||||
|
||||
static inline int posix_lock_file_wait(struct file *filp, struct file_lock *fl)
|
||||
{
|
||||
return -ENOLCK;
|
||||
}
|
||||
|
||||
static inline int posix_unblock_lock(struct file *filp,
|
||||
struct file_lock *waiter)
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static inline int vfs_test_lock(struct file *filp, struct file_lock *fl)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int vfs_lock_file(struct file *filp, unsigned int cmd,
|
||||
struct file_lock *fl, struct file_lock *conf)
|
||||
{
|
||||
return -ENOLCK;
|
||||
}
|
||||
|
||||
static inline int vfs_cancel_lock(struct file *filp, struct file_lock *fl)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int flock_lock_file_wait(struct file *filp,
|
||||
struct file_lock *request)
|
||||
{
|
||||
return -ENOLCK;
|
||||
}
|
||||
|
||||
static inline int __break_lease(struct inode *inode, unsigned int mode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void lease_get_mtime(struct inode *inode, struct timespec *time)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline int generic_setlease(struct file *filp, long arg,
|
||||
struct file_lock **flp)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int vfs_setlease(struct file *filp, long arg,
|
||||
struct file_lock **lease)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int lease_modify(struct file_lock **before, int arg)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int lock_may_read(struct inode *inode, loff_t start,
|
||||
unsigned long len)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int lock_may_write(struct inode *inode, loff_t start,
|
||||
unsigned long len)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif /* !CONFIG_FILE_LOCKING */
|
||||
|
||||
|
||||
@@ -1607,7 +1720,7 @@ struct super_block *sget(struct file_system_type *type,
|
||||
extern int get_sb_pseudo(struct file_system_type *, char *,
|
||||
const struct super_operations *ops, unsigned long,
|
||||
struct vfsmount *mnt);
|
||||
extern int simple_set_mnt(struct vfsmount *mnt, struct super_block *sb);
|
||||
extern void simple_set_mnt(struct vfsmount *mnt, struct super_block *sb);
|
||||
int __put_super_and_need_restart(struct super_block *sb);
|
||||
|
||||
/* Alas, no aliases. Too much hassle with bringing module.h everywhere */
|
||||
@@ -1688,13 +1801,44 @@ static inline int break_lease(struct inode *inode, unsigned int mode)
|
||||
return 0;
|
||||
}
|
||||
#else /* !CONFIG_FILE_LOCKING */
|
||||
#define locks_mandatory_locked(a) ({ 0; })
|
||||
#define locks_mandatory_area(a, b, c, d, e) ({ 0; })
|
||||
#define __mandatory_lock(a) ({ 0; })
|
||||
#define mandatory_lock(a) ({ 0; })
|
||||
#define locks_verify_locked(a) ({ 0; })
|
||||
#define locks_verify_truncate(a, b, c) ({ 0; })
|
||||
#define break_lease(a, b) ({ 0; })
|
||||
static inline int locks_mandatory_locked(struct inode *inode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int locks_mandatory_area(int rw, struct inode *inode,
|
||||
struct file *filp, loff_t offset,
|
||||
size_t count)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int __mandatory_lock(struct inode *inode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int mandatory_lock(struct inode *inode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int locks_verify_locked(struct inode *inode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int locks_verify_truncate(struct inode *inode, struct file *filp,
|
||||
size_t size)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int break_lease(struct inode *inode, unsigned int mode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_FILE_LOCKING */
|
||||
|
||||
/* fs/open.c */
|
||||
@@ -1731,6 +1875,13 @@ extern void bd_set_size(struct block_device *, loff_t size);
|
||||
extern void bd_forget(struct inode *inode);
|
||||
extern void bdput(struct block_device *);
|
||||
extern struct block_device *open_by_devnum(dev_t, fmode_t);
|
||||
extern void invalidate_bdev(struct block_device *);
|
||||
extern int sync_blockdev(struct block_device *bdev);
|
||||
extern struct super_block *freeze_bdev(struct block_device *);
|
||||
extern int thaw_bdev(struct block_device *bdev, struct super_block *sb);
|
||||
extern int fsync_bdev(struct block_device *);
|
||||
extern int fsync_super(struct super_block *);
|
||||
extern int fsync_no_super(struct block_device *);
|
||||
#else
|
||||
static inline void bd_forget(struct inode *inode) {}
|
||||
#endif
|
||||
@@ -1882,7 +2033,6 @@ static inline void allow_write_access(struct file *file)
|
||||
if (file)
|
||||
atomic_inc(&file->f_path.dentry->d_inode->i_writecount);
|
||||
}
|
||||
extern int do_pipe(int *);
|
||||
extern int do_pipe_flags(int *, int);
|
||||
extern struct file *create_read_pipe(struct file *f, int flags);
|
||||
extern struct file *create_write_pipe(int flags);
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
#ifndef _LINUX_I2C_ALGO_PCA_H
|
||||
#define _LINUX_I2C_ALGO_PCA_H
|
||||
|
||||
/* Clock speeds for the bus */
|
||||
/* Chips known to the pca algo */
|
||||
#define I2C_PCA_CHIP_9564 0x00
|
||||
#define I2C_PCA_CHIP_9665 0x01
|
||||
|
||||
/* Internal period for PCA9665 oscilator */
|
||||
#define I2C_PCA_OSC_PER 3 /* e10-8s */
|
||||
|
||||
/* Clock speeds for the bus for PCA9564*/
|
||||
#define I2C_PCA_CON_330kHz 0x00
|
||||
#define I2C_PCA_CON_288kHz 0x01
|
||||
#define I2C_PCA_CON_217kHz 0x02
|
||||
@@ -18,6 +25,26 @@
|
||||
#define I2C_PCA_ADR 0x02 /* OWN ADR Read/Write */
|
||||
#define I2C_PCA_CON 0x03 /* CONTROL Read/Write */
|
||||
|
||||
/* PCA9665 registers */
|
||||
#define I2C_PCA_INDPTR 0x00 /* INDIRECT Pointer Write Only */
|
||||
#define I2C_PCA_IND 0x02 /* INDIRECT Read/Write */
|
||||
|
||||
/* PCA9665 indirect registers */
|
||||
#define I2C_PCA_ICOUNT 0x00 /* Byte Count for buffered mode */
|
||||
#define I2C_PCA_IADR 0x01 /* OWN ADR */
|
||||
#define I2C_PCA_ISCLL 0x02 /* SCL LOW period */
|
||||
#define I2C_PCA_ISCLH 0x03 /* SCL HIGH period */
|
||||
#define I2C_PCA_ITO 0x04 /* TIMEOUT */
|
||||
#define I2C_PCA_IPRESET 0x05 /* Parallel bus reset */
|
||||
#define I2C_PCA_IMODE 0x06 /* I2C Bus mode */
|
||||
|
||||
/* PCA9665 I2C bus mode */
|
||||
#define I2C_PCA_MODE_STD 0x00 /* Standard mode */
|
||||
#define I2C_PCA_MODE_FAST 0x01 /* Fast mode */
|
||||
#define I2C_PCA_MODE_FASTP 0x02 /* Fast Plus mode */
|
||||
#define I2C_PCA_MODE_TURBO 0x03 /* Turbo mode */
|
||||
|
||||
|
||||
#define I2C_PCA_CON_AA 0x80 /* Assert Acknowledge */
|
||||
#define I2C_PCA_CON_ENSIO 0x40 /* Enable */
|
||||
#define I2C_PCA_CON_STA 0x20 /* Start */
|
||||
@@ -31,7 +58,9 @@ struct i2c_algo_pca_data {
|
||||
int (*read_byte) (void *data, int reg);
|
||||
int (*wait_for_completion) (void *data);
|
||||
void (*reset_chip) (void *data);
|
||||
/* i2c_clock values are defined in linux/i2c-algo-pca.h */
|
||||
/* For PCA9564, use one of the predefined frequencies:
|
||||
* 330000, 288000, 217000, 146000, 88000, 59000, 44000, 36000
|
||||
* For PCA9665, use the frequency you want here. */
|
||||
unsigned int i2c_clock;
|
||||
};
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ struct i2c_pca9564_pf_platform_data {
|
||||
* not supplied (negative value), but it
|
||||
* cannot exit some error conditions then */
|
||||
int i2c_clock_speed; /* values are defined in linux/i2c-algo-pca.h */
|
||||
int timeout; /* timeout = this value * 10us */
|
||||
int timeout; /* timeout in jiffies */
|
||||
};
|
||||
|
||||
#endif /* I2C_PCA9564_PLATFORM_H */
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
|
||||
#define ETH_P_AOE 0x88A2 /* ATA over Ethernet */
|
||||
#define ETH_P_TIPC 0x88CA /* TIPC */
|
||||
#define ETH_P_FCOE 0x8906 /* Fibre Channel over Ethernet */
|
||||
#define ETH_P_EDSA 0xDADA /* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */
|
||||
|
||||
/*
|
||||
|
||||
@@ -484,6 +484,7 @@ int show_interrupts(struct seq_file *p, void *v);
|
||||
struct irq_desc;
|
||||
|
||||
extern int early_irq_init(void);
|
||||
extern int arch_probe_nr_irqs(void);
|
||||
extern int arch_early_irq_init(void);
|
||||
extern int arch_init_chip_data(struct irq_desc *desc, int cpu);
|
||||
|
||||
|
||||
+83
-3
@@ -180,11 +180,11 @@ struct irq_desc {
|
||||
unsigned int irqs_unhandled;
|
||||
spinlock_t lock;
|
||||
#ifdef CONFIG_SMP
|
||||
cpumask_t affinity;
|
||||
cpumask_var_t affinity;
|
||||
unsigned int cpu;
|
||||
#endif
|
||||
#ifdef CONFIG_GENERIC_PENDING_IRQ
|
||||
cpumask_t pending_mask;
|
||||
cpumask_var_t pending_mask;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_PROC_FS
|
||||
struct proc_dir_entry *dir;
|
||||
@@ -414,4 +414,84 @@ extern int set_irq_msi(unsigned int irq, struct msi_desc *entry);
|
||||
|
||||
#endif /* !CONFIG_S390 */
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/**
|
||||
* init_alloc_desc_masks - allocate cpumasks for irq_desc
|
||||
* @desc: pointer to irq_desc struct
|
||||
* @cpu: cpu which will be handling the cpumasks
|
||||
* @boot: true if need bootmem
|
||||
*
|
||||
* Allocates affinity and pending_mask cpumask if required.
|
||||
* Returns true if successful (or not required).
|
||||
* Side effect: affinity has all bits set, pending_mask has all bits clear.
|
||||
*/
|
||||
static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu,
|
||||
bool boot)
|
||||
{
|
||||
int node;
|
||||
|
||||
if (boot) {
|
||||
alloc_bootmem_cpumask_var(&desc->affinity);
|
||||
cpumask_setall(desc->affinity);
|
||||
|
||||
#ifdef CONFIG_GENERIC_PENDING_IRQ
|
||||
alloc_bootmem_cpumask_var(&desc->pending_mask);
|
||||
cpumask_clear(desc->pending_mask);
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
node = cpu_to_node(cpu);
|
||||
|
||||
if (!alloc_cpumask_var_node(&desc->affinity, GFP_ATOMIC, node))
|
||||
return false;
|
||||
cpumask_setall(desc->affinity);
|
||||
|
||||
#ifdef CONFIG_GENERIC_PENDING_IRQ
|
||||
if (!alloc_cpumask_var_node(&desc->pending_mask, GFP_ATOMIC, node)) {
|
||||
free_cpumask_var(desc->affinity);
|
||||
return false;
|
||||
}
|
||||
cpumask_clear(desc->pending_mask);
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* init_copy_desc_masks - copy cpumasks for irq_desc
|
||||
* @old_desc: pointer to old irq_desc struct
|
||||
* @new_desc: pointer to new irq_desc struct
|
||||
*
|
||||
* Insures affinity and pending_masks are copied to new irq_desc.
|
||||
* If !CONFIG_CPUMASKS_OFFSTACK the cpumasks are embedded in the
|
||||
* irq_desc struct so the copy is redundant.
|
||||
*/
|
||||
|
||||
static inline void init_copy_desc_masks(struct irq_desc *old_desc,
|
||||
struct irq_desc *new_desc)
|
||||
{
|
||||
#ifdef CONFIG_CPUMASKS_OFFSTACK
|
||||
cpumask_copy(new_desc->affinity, old_desc->affinity);
|
||||
|
||||
#ifdef CONFIG_GENERIC_PENDING_IRQ
|
||||
cpumask_copy(new_desc->pending_mask, old_desc->pending_mask);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#else /* !CONFIG_SMP */
|
||||
|
||||
static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu,
|
||||
bool boot)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline void init_copy_desc_masks(struct irq_desc *old_desc,
|
||||
struct irq_desc *new_desc)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
#endif /* _LINUX_IRQ_H */
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
# define for_each_irq_desc_reverse(irq, desc) \
|
||||
for (irq = nr_irqs - 1; irq >= 0; irq--)
|
||||
|
||||
#else /* CONFIG_GENERIC_HARDIRQS */
|
||||
|
||||
extern int nr_irqs;
|
||||
|
||||
+19
-3
@@ -182,6 +182,14 @@ struct kprobe_blackpoint {
|
||||
DECLARE_PER_CPU(struct kprobe *, current_kprobe);
|
||||
DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
|
||||
|
||||
/*
|
||||
* For #ifdef avoidance:
|
||||
*/
|
||||
static inline int kprobes_built_in(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KRETPROBES
|
||||
extern void arch_prepare_kretprobe(struct kretprobe_instance *ri,
|
||||
struct pt_regs *regs);
|
||||
@@ -271,8 +279,16 @@ void unregister_kretprobes(struct kretprobe **rps, int num);
|
||||
void kprobe_flush_task(struct task_struct *tk);
|
||||
void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
|
||||
|
||||
#else /* CONFIG_KPROBES */
|
||||
#else /* !CONFIG_KPROBES: */
|
||||
|
||||
static inline int kprobes_built_in(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline struct kprobe *get_kprobe(void *addr)
|
||||
{
|
||||
return NULL;
|
||||
@@ -329,5 +345,5 @@ static inline void unregister_kretprobes(struct kretprobe **rps, int num)
|
||||
static inline void kprobe_flush_task(struct task_struct *tk)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_KPROBES */
|
||||
#endif /* _LINUX_KPROBES_H */
|
||||
#endif /* CONFIG_KPROBES */
|
||||
#endif /* _LINUX_KPROBES_H */
|
||||
|
||||
@@ -49,4 +49,5 @@
|
||||
#define FUTEXFS_SUPER_MAGIC 0xBAD1DEA
|
||||
#define INOTIFYFS_SUPER_MAGIC 0x2BAD1DEA
|
||||
|
||||
#define STACK_END_MAGIC 0x57AC6E9D
|
||||
#endif /* __LINUX_MAGIC_H__ */
|
||||
|
||||
@@ -171,5 +171,6 @@
|
||||
#define VIOTAPE_MAJOR 230
|
||||
|
||||
#define BLOCK_EXT_MAJOR 259
|
||||
#define SCSI_OSD_MAJOR 260 /* open-osd's OSD scsi device */
|
||||
|
||||
#endif
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#define TUN_MINOR 200
|
||||
#define MWAVE_MINOR 219 /* ACP/Mwave Modem */
|
||||
#define MPT_MINOR 220
|
||||
#define MPT2SAS_MINOR 221
|
||||
#define HPET_MINOR 228
|
||||
#define FUSE_MINOR 229
|
||||
#define KVM_MINOR 232
|
||||
|
||||
+49
-33
@@ -1,5 +1,5 @@
|
||||
#ifndef MMIOTRACE_H
|
||||
#define MMIOTRACE_H
|
||||
#ifndef _LINUX_MMIOTRACE_H
|
||||
#define _LINUX_MMIOTRACE_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/list.h>
|
||||
@@ -13,28 +13,34 @@ typedef void (*kmmio_post_handler_t)(struct kmmio_probe *,
|
||||
unsigned long condition, struct pt_regs *);
|
||||
|
||||
struct kmmio_probe {
|
||||
struct list_head list; /* kmmio internal list */
|
||||
unsigned long addr; /* start location of the probe point */
|
||||
unsigned long len; /* length of the probe region */
|
||||
kmmio_pre_handler_t pre_handler; /* Called before addr is executed. */
|
||||
kmmio_post_handler_t post_handler; /* Called after addr is executed */
|
||||
void *private;
|
||||
/* kmmio internal list: */
|
||||
struct list_head list;
|
||||
/* start location of the probe point: */
|
||||
unsigned long addr;
|
||||
/* length of the probe region: */
|
||||
unsigned long len;
|
||||
/* Called before addr is executed: */
|
||||
kmmio_pre_handler_t pre_handler;
|
||||
/* Called after addr is executed: */
|
||||
kmmio_post_handler_t post_handler;
|
||||
void *private;
|
||||
};
|
||||
|
||||
/* kmmio is active by some kmmio_probes? */
|
||||
static inline int is_kmmio_active(void)
|
||||
{
|
||||
extern unsigned int kmmio_count;
|
||||
return kmmio_count;
|
||||
}
|
||||
extern unsigned int kmmio_count;
|
||||
|
||||
extern int register_kmmio_probe(struct kmmio_probe *p);
|
||||
extern void unregister_kmmio_probe(struct kmmio_probe *p);
|
||||
|
||||
#ifdef CONFIG_MMIOTRACE
|
||||
/* kmmio is active by some kmmio_probes? */
|
||||
static inline int is_kmmio_active(void)
|
||||
{
|
||||
return kmmio_count;
|
||||
}
|
||||
|
||||
/* Called from page fault handler. */
|
||||
extern int kmmio_handler(struct pt_regs *regs, unsigned long addr);
|
||||
|
||||
#ifdef CONFIG_MMIOTRACE
|
||||
/* Called from ioremap.c */
|
||||
extern void mmiotrace_ioremap(resource_size_t offset, unsigned long size,
|
||||
void __iomem *addr);
|
||||
@@ -43,7 +49,17 @@ extern void mmiotrace_iounmap(volatile void __iomem *addr);
|
||||
/* For anyone to insert markers. Remember trailing newline. */
|
||||
extern int mmiotrace_printk(const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 1, 2)));
|
||||
#else
|
||||
#else /* !CONFIG_MMIOTRACE: */
|
||||
static inline int is_kmmio_active(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int kmmio_handler(struct pt_regs *regs, unsigned long addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void mmiotrace_ioremap(resource_size_t offset,
|
||||
unsigned long size, void __iomem *addr)
|
||||
{
|
||||
@@ -63,28 +79,28 @@ static inline int mmiotrace_printk(const char *fmt, ...)
|
||||
#endif /* CONFIG_MMIOTRACE */
|
||||
|
||||
enum mm_io_opcode {
|
||||
MMIO_READ = 0x1, /* struct mmiotrace_rw */
|
||||
MMIO_WRITE = 0x2, /* struct mmiotrace_rw */
|
||||
MMIO_PROBE = 0x3, /* struct mmiotrace_map */
|
||||
MMIO_UNPROBE = 0x4, /* struct mmiotrace_map */
|
||||
MMIO_UNKNOWN_OP = 0x5, /* struct mmiotrace_rw */
|
||||
MMIO_READ = 0x1, /* struct mmiotrace_rw */
|
||||
MMIO_WRITE = 0x2, /* struct mmiotrace_rw */
|
||||
MMIO_PROBE = 0x3, /* struct mmiotrace_map */
|
||||
MMIO_UNPROBE = 0x4, /* struct mmiotrace_map */
|
||||
MMIO_UNKNOWN_OP = 0x5, /* struct mmiotrace_rw */
|
||||
};
|
||||
|
||||
struct mmiotrace_rw {
|
||||
resource_size_t phys; /* PCI address of register */
|
||||
unsigned long value;
|
||||
unsigned long pc; /* optional program counter */
|
||||
int map_id;
|
||||
unsigned char opcode; /* one of MMIO_{READ,WRITE,UNKNOWN_OP} */
|
||||
unsigned char width; /* size of register access in bytes */
|
||||
resource_size_t phys; /* PCI address of register */
|
||||
unsigned long value;
|
||||
unsigned long pc; /* optional program counter */
|
||||
int map_id;
|
||||
unsigned char opcode; /* one of MMIO_{READ,WRITE,UNKNOWN_OP} */
|
||||
unsigned char width; /* size of register access in bytes */
|
||||
};
|
||||
|
||||
struct mmiotrace_map {
|
||||
resource_size_t phys; /* base address in PCI space */
|
||||
unsigned long virt; /* base virtual address */
|
||||
unsigned long len; /* mapping size */
|
||||
int map_id;
|
||||
unsigned char opcode; /* MMIO_PROBE or MMIO_UNPROBE */
|
||||
resource_size_t phys; /* base address in PCI space */
|
||||
unsigned long virt; /* base virtual address */
|
||||
unsigned long len; /* mapping size */
|
||||
int map_id;
|
||||
unsigned char opcode; /* MMIO_PROBE or MMIO_UNPROBE */
|
||||
};
|
||||
|
||||
/* in kernel/trace/trace_mmiotrace.c */
|
||||
@@ -94,4 +110,4 @@ extern void mmio_trace_rw(struct mmiotrace_rw *rw);
|
||||
extern void mmio_trace_mapping(struct mmiotrace_map *map);
|
||||
extern int mmio_trace_printk(const char *fmt, va_list args);
|
||||
|
||||
#endif /* MMIOTRACE_H */
|
||||
#endif /* _LINUX_MMIOTRACE_H */
|
||||
|
||||
@@ -204,7 +204,7 @@ void ncp_update_inode2(struct inode *, struct ncp_entry_info *);
|
||||
/* linux/fs/ncpfs/dir.c */
|
||||
extern const struct inode_operations ncp_dir_inode_operations;
|
||||
extern const struct file_operations ncp_dir_operations;
|
||||
extern struct dentry_operations ncp_root_dentry_operations;
|
||||
extern const struct dentry_operations ncp_root_dentry_operations;
|
||||
int ncp_conn_logged_in(struct super_block *);
|
||||
int ncp_date_dos2unix(__le16 time, __le16 date);
|
||||
void ncp_date_unix2dos(int unix_date, __le16 * time, __le16 * date);
|
||||
|
||||
@@ -594,6 +594,14 @@ struct net_device_ops {
|
||||
#define HAVE_NETDEV_POLL
|
||||
void (*ndo_poll_controller)(struct net_device *dev);
|
||||
#endif
|
||||
#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
|
||||
int (*ndo_fcoe_ddp_setup)(struct net_device *dev,
|
||||
u16 xid,
|
||||
struct scatterlist *sgl,
|
||||
unsigned int sgc);
|
||||
int (*ndo_fcoe_ddp_done)(struct net_device *dev,
|
||||
u16 xid);
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -662,14 +670,17 @@ struct net_device
|
||||
#define NETIF_F_GRO 16384 /* Generic receive offload */
|
||||
#define NETIF_F_LRO 32768 /* large receive offload */
|
||||
|
||||
#define NETIF_F_FCOE_CRC (1 << 24) /* FCoE CRC32 */
|
||||
|
||||
/* Segmentation offload features */
|
||||
#define NETIF_F_GSO_SHIFT 16
|
||||
#define NETIF_F_GSO_MASK 0xffff0000
|
||||
#define NETIF_F_GSO_MASK 0x00ff0000
|
||||
#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
|
||||
#define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
|
||||
#define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
|
||||
#define NETIF_F_TSO_ECN (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT)
|
||||
#define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)
|
||||
#define NETIF_F_FSO (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT)
|
||||
|
||||
/* List of features with software fallbacks. */
|
||||
#define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6)
|
||||
@@ -852,6 +863,11 @@ struct net_device
|
||||
struct dcbnl_rtnl_ops *dcbnl_ops;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
|
||||
/* max exchange id for FCoE LRO by ddp */
|
||||
unsigned int fcoe_ddp_xid;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_COMPAT_NET_DEV_OPS
|
||||
struct {
|
||||
int (*init)(struct net_device *dev);
|
||||
|
||||
@@ -415,7 +415,7 @@ extern const struct inode_operations nfs_dir_inode_operations;
|
||||
extern const struct inode_operations nfs3_dir_inode_operations;
|
||||
#endif /* CONFIG_NFS_V3 */
|
||||
extern const struct file_operations nfs_dir_operations;
|
||||
extern struct dentry_operations nfs_dentry_operations;
|
||||
extern const struct dentry_operations nfs_dentry_operations;
|
||||
|
||||
extern void nfs_force_lookup_revalidate(struct inode *dir);
|
||||
extern int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fh, struct nfs_fattr *fattr);
|
||||
|
||||
@@ -785,7 +785,7 @@ struct nfs_access_entry;
|
||||
*/
|
||||
struct nfs_rpc_ops {
|
||||
u32 version; /* Protocol version */
|
||||
struct dentry_operations *dentry_ops;
|
||||
const struct dentry_operations *dentry_ops;
|
||||
const struct inode_operations *dir_inode_ops;
|
||||
const struct inode_operations *file_inode_ops;
|
||||
|
||||
|
||||
@@ -1237,6 +1237,7 @@
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_21 0x0451
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_22 0x0452
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_23 0x0453
|
||||
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_SMBUS 0x0542
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_24 0x054C
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_25 0x054D
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_26 0x054E
|
||||
@@ -1247,11 +1248,14 @@
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_31 0x07DF
|
||||
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560
|
||||
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE 0x056C
|
||||
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP78S_SMBUS 0x0752
|
||||
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_32 0x0760
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_33 0x0761
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_34 0x0762
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_35 0x0763
|
||||
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_SMBUS 0x07D8
|
||||
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP79_SMBUS 0x0AA2
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_36 0x0AB0
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_37 0x0AB1
|
||||
#define PCI_DEVICE_ID_NVIDIA_NVENET_38 0x0AB2
|
||||
@@ -1475,6 +1479,7 @@
|
||||
#define PCI_DEVICE_ID_SERVERWORKS_HT1000IDE 0x0214
|
||||
#define PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2 0x0217
|
||||
#define PCI_DEVICE_ID_SERVERWORKS_CSB6LPC 0x0227
|
||||
#define PCI_DEVICE_ID_SERVERWORKS_HT1100LD 0x0408
|
||||
|
||||
#define PCI_VENDOR_ID_SBE 0x1176
|
||||
#define PCI_DEVICE_ID_SBE_WANXL100 0x0301
|
||||
|
||||
+108
-53
@@ -5,53 +5,66 @@
|
||||
#include <linux/slab.h> /* For kmalloc() */
|
||||
#include <linux/smp.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/pfn.h>
|
||||
|
||||
#include <asm/percpu.h>
|
||||
|
||||
#ifndef PER_CPU_BASE_SECTION
|
||||
#ifdef CONFIG_SMP
|
||||
#define PER_CPU_BASE_SECTION ".data.percpu"
|
||||
#else
|
||||
#define PER_CPU_BASE_SECTION ".data"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define DEFINE_PER_CPU(type, name) \
|
||||
__attribute__((__section__(".data.percpu"))) \
|
||||
PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name
|
||||
|
||||
#ifdef MODULE
|
||||
#define SHARED_ALIGNED_SECTION ".data.percpu"
|
||||
#define PER_CPU_SHARED_ALIGNED_SECTION ""
|
||||
#else
|
||||
#define SHARED_ALIGNED_SECTION ".data.percpu.shared_aligned"
|
||||
#define PER_CPU_SHARED_ALIGNED_SECTION ".shared_aligned"
|
||||
#endif
|
||||
#define PER_CPU_FIRST_SECTION ".first"
|
||||
|
||||
#else
|
||||
|
||||
#define PER_CPU_SHARED_ALIGNED_SECTION ""
|
||||
#define PER_CPU_FIRST_SECTION ""
|
||||
|
||||
#endif
|
||||
|
||||
#define DEFINE_PER_CPU_SECTION(type, name, section) \
|
||||
__attribute__((__section__(PER_CPU_BASE_SECTION section))) \
|
||||
PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name
|
||||
|
||||
#define DEFINE_PER_CPU(type, name) \
|
||||
DEFINE_PER_CPU_SECTION(type, name, "")
|
||||
|
||||
#define DEFINE_PER_CPU_SHARED_ALIGNED(type, name) \
|
||||
__attribute__((__section__(SHARED_ALIGNED_SECTION))) \
|
||||
PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name \
|
||||
DEFINE_PER_CPU_SECTION(type, name, PER_CPU_SHARED_ALIGNED_SECTION) \
|
||||
____cacheline_aligned_in_smp
|
||||
|
||||
#define DEFINE_PER_CPU_PAGE_ALIGNED(type, name) \
|
||||
__attribute__((__section__(".data.percpu.page_aligned"))) \
|
||||
PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name
|
||||
#else
|
||||
#define DEFINE_PER_CPU(type, name) \
|
||||
PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name
|
||||
#define DEFINE_PER_CPU_PAGE_ALIGNED(type, name) \
|
||||
DEFINE_PER_CPU_SECTION(type, name, ".page_aligned")
|
||||
|
||||
#define DEFINE_PER_CPU_SHARED_ALIGNED(type, name) \
|
||||
DEFINE_PER_CPU(type, name)
|
||||
|
||||
#define DEFINE_PER_CPU_PAGE_ALIGNED(type, name) \
|
||||
DEFINE_PER_CPU(type, name)
|
||||
#endif
|
||||
#define DEFINE_PER_CPU_FIRST(type, name) \
|
||||
DEFINE_PER_CPU_SECTION(type, name, PER_CPU_FIRST_SECTION)
|
||||
|
||||
#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var)
|
||||
#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var)
|
||||
|
||||
/* Enough to cover all DEFINE_PER_CPUs in kernel, including modules. */
|
||||
#ifndef PERCPU_ENOUGH_ROOM
|
||||
/* enough to cover all DEFINE_PER_CPUs in modules */
|
||||
#ifdef CONFIG_MODULES
|
||||
#define PERCPU_MODULE_RESERVE 8192
|
||||
#define PERCPU_MODULE_RESERVE (8 << 10)
|
||||
#else
|
||||
#define PERCPU_MODULE_RESERVE 0
|
||||
#define PERCPU_MODULE_RESERVE 0
|
||||
#endif
|
||||
|
||||
#ifndef PERCPU_ENOUGH_ROOM
|
||||
#define PERCPU_ENOUGH_ROOM \
|
||||
(__per_cpu_end - __per_cpu_start + PERCPU_MODULE_RESERVE)
|
||||
#endif /* PERCPU_ENOUGH_ROOM */
|
||||
(ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES) + \
|
||||
PERCPU_MODULE_RESERVE)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Must be an lvalue. Since @var must be a simple identifier,
|
||||
@@ -65,52 +78,94 @@
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
#ifdef CONFIG_HAVE_DYNAMIC_PER_CPU_AREA
|
||||
|
||||
/* minimum unit size, also is the maximum supported allocation size */
|
||||
#define PCPU_MIN_UNIT_SIZE PFN_ALIGN(64 << 10)
|
||||
|
||||
/*
|
||||
* PERCPU_DYNAMIC_RESERVE indicates the amount of free area to piggy
|
||||
* back on the first chunk for dynamic percpu allocation if arch is
|
||||
* manually allocating and mapping it for faster access (as a part of
|
||||
* large page mapping for example).
|
||||
*
|
||||
* The following values give between one and two pages of free space
|
||||
* after typical minimal boot (2-way SMP, single disk and NIC) with
|
||||
* both defconfig and a distro config on x86_64 and 32. More
|
||||
* intelligent way to determine this would be nice.
|
||||
*/
|
||||
#if BITS_PER_LONG > 32
|
||||
#define PERCPU_DYNAMIC_RESERVE (20 << 10)
|
||||
#else
|
||||
#define PERCPU_DYNAMIC_RESERVE (12 << 10)
|
||||
#endif
|
||||
|
||||
extern void *pcpu_base_addr;
|
||||
|
||||
typedef struct page * (*pcpu_get_page_fn_t)(unsigned int cpu, int pageno);
|
||||
typedef void (*pcpu_populate_pte_fn_t)(unsigned long addr);
|
||||
|
||||
extern size_t __init pcpu_setup_first_chunk(pcpu_get_page_fn_t get_page_fn,
|
||||
size_t static_size, size_t reserved_size,
|
||||
ssize_t dyn_size, ssize_t unit_size,
|
||||
void *base_addr,
|
||||
pcpu_populate_pte_fn_t populate_pte_fn);
|
||||
|
||||
extern ssize_t __init pcpu_embed_first_chunk(
|
||||
size_t static_size, size_t reserved_size,
|
||||
ssize_t dyn_size, ssize_t unit_size);
|
||||
|
||||
/*
|
||||
* Use this to get to a cpu's version of the per-cpu object
|
||||
* dynamically allocated. Non-atomic access to the current CPU's
|
||||
* version should probably be combined with get_cpu()/put_cpu().
|
||||
*/
|
||||
#define per_cpu_ptr(ptr, cpu) SHIFT_PERCPU_PTR((ptr), per_cpu_offset((cpu)))
|
||||
|
||||
extern void *__alloc_reserved_percpu(size_t size, size_t align);
|
||||
|
||||
#else /* CONFIG_HAVE_DYNAMIC_PER_CPU_AREA */
|
||||
|
||||
struct percpu_data {
|
||||
void *ptrs[1];
|
||||
};
|
||||
|
||||
#define __percpu_disguise(pdata) (struct percpu_data *)~(unsigned long)(pdata)
|
||||
/*
|
||||
* Use this to get to a cpu's version of the per-cpu object dynamically
|
||||
* allocated. Non-atomic access to the current CPU's version should
|
||||
* probably be combined with get_cpu()/put_cpu().
|
||||
*/
|
||||
#define percpu_ptr(ptr, cpu) \
|
||||
({ \
|
||||
struct percpu_data *__p = __percpu_disguise(ptr); \
|
||||
(__typeof__(ptr))__p->ptrs[(cpu)]; \
|
||||
|
||||
#define per_cpu_ptr(ptr, cpu) \
|
||||
({ \
|
||||
struct percpu_data *__p = __percpu_disguise(ptr); \
|
||||
(__typeof__(ptr))__p->ptrs[(cpu)]; \
|
||||
})
|
||||
|
||||
extern void *__percpu_alloc_mask(size_t size, gfp_t gfp, cpumask_t *mask);
|
||||
extern void percpu_free(void *__pdata);
|
||||
#endif /* CONFIG_HAVE_DYNAMIC_PER_CPU_AREA */
|
||||
|
||||
extern void *__alloc_percpu(size_t size, size_t align);
|
||||
extern void free_percpu(void *__pdata);
|
||||
|
||||
#else /* CONFIG_SMP */
|
||||
|
||||
#define percpu_ptr(ptr, cpu) ({ (void)(cpu); (ptr); })
|
||||
#define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); (ptr); })
|
||||
|
||||
static __always_inline void *__percpu_alloc_mask(size_t size, gfp_t gfp, cpumask_t *mask)
|
||||
static inline void *__alloc_percpu(size_t size, size_t align)
|
||||
{
|
||||
return kzalloc(size, gfp);
|
||||
/*
|
||||
* Can't easily make larger alignment work with kmalloc. WARN
|
||||
* on it. Larger alignment should only be used for module
|
||||
* percpu sections on SMP for which this path isn't used.
|
||||
*/
|
||||
WARN_ON_ONCE(align > SMP_CACHE_BYTES);
|
||||
return kzalloc(size, GFP_KERNEL);
|
||||
}
|
||||
|
||||
static inline void percpu_free(void *__pdata)
|
||||
static inline void free_percpu(void *p)
|
||||
{
|
||||
kfree(__pdata);
|
||||
kfree(p);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
#define percpu_alloc_mask(size, gfp, mask) \
|
||||
__percpu_alloc_mask((size), (gfp), &(mask))
|
||||
|
||||
#define percpu_alloc(size, gfp) percpu_alloc_mask((size), (gfp), cpu_online_map)
|
||||
|
||||
/* (legacy) interface for use without CPU hotplug handling */
|
||||
|
||||
#define __alloc_percpu(size) percpu_alloc_mask((size), GFP_KERNEL, \
|
||||
cpu_possible_map)
|
||||
#define alloc_percpu(type) (type *)__alloc_percpu(sizeof(type))
|
||||
#define free_percpu(ptr) percpu_free((ptr))
|
||||
#define per_cpu_ptr(ptr, cpu) percpu_ptr((ptr), (cpu))
|
||||
#define alloc_percpu(type) (type *)__alloc_percpu(sizeof(type), \
|
||||
__alignof__(type))
|
||||
|
||||
#endif /* __LINUX_PERCPU_H */
|
||||
|
||||
@@ -198,6 +198,7 @@ struct mem_dqblk {
|
||||
qsize_t dqb_bhardlimit; /* absolute limit on disk blks alloc */
|
||||
qsize_t dqb_bsoftlimit; /* preferred limit on disk blks */
|
||||
qsize_t dqb_curspace; /* current used space */
|
||||
qsize_t dqb_rsvspace; /* current reserved space for delalloc*/
|
||||
qsize_t dqb_ihardlimit; /* absolute limit on allocated inodes */
|
||||
qsize_t dqb_isoftlimit; /* preferred inode limit */
|
||||
qsize_t dqb_curinodes; /* current # allocated inodes */
|
||||
@@ -276,8 +277,6 @@ struct dquot {
|
||||
struct mem_dqblk dq_dqb; /* Diskquota usage */
|
||||
};
|
||||
|
||||
#define NODQUOT (struct dquot *)NULL
|
||||
|
||||
#define QUOTA_OK 0
|
||||
#define NO_QUOTA 1
|
||||
|
||||
@@ -308,6 +307,14 @@ struct dquot_operations {
|
||||
int (*release_dquot) (struct dquot *); /* Quota is going to be deleted from disk */
|
||||
int (*mark_dirty) (struct dquot *); /* Dquot is marked dirty */
|
||||
int (*write_info) (struct super_block *, int); /* Write of quota "superblock" */
|
||||
/* reserve quota for delayed block allocation */
|
||||
int (*reserve_space) (struct inode *, qsize_t, int);
|
||||
/* claim reserved quota for delayed alloc */
|
||||
int (*claim_space) (struct inode *, qsize_t);
|
||||
/* release rsved quota for delayed alloc */
|
||||
void (*release_rsv) (struct inode *, qsize_t);
|
||||
/* get reserved quota for delayed alloc */
|
||||
qsize_t (*get_reserved_space) (struct inode *);
|
||||
};
|
||||
|
||||
/* Operations handling requests from userspace */
|
||||
|
||||
+78
-41
@@ -35,6 +35,11 @@ void dquot_destroy(struct dquot *dquot);
|
||||
int dquot_alloc_space(struct inode *inode, qsize_t number, int prealloc);
|
||||
int dquot_alloc_inode(const struct inode *inode, qsize_t number);
|
||||
|
||||
int dquot_reserve_space(struct inode *inode, qsize_t number, int prealloc);
|
||||
int dquot_claim_space(struct inode *inode, qsize_t number);
|
||||
void dquot_release_reserved_space(struct inode *inode, qsize_t number);
|
||||
qsize_t dquot_get_reserved_space(struct inode *inode);
|
||||
|
||||
int dquot_free_space(struct inode *inode, qsize_t number);
|
||||
int dquot_free_inode(const struct inode *inode, qsize_t number);
|
||||
|
||||
@@ -183,6 +188,16 @@ static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
if (sb_any_quota_active(inode->i_sb)) {
|
||||
/* Used space is updated in alloc_space() */
|
||||
if (inode->i_sb->dq_op->reserve_space(inode, nr, 0) == NO_QUOTA)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_alloc_inode(struct inode *inode)
|
||||
{
|
||||
if (sb_any_quota_active(inode->i_sb)) {
|
||||
@@ -193,6 +208,31 @@ static inline int vfs_dq_alloc_inode(struct inode *inode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert in-memory reserved quotas to real consumed quotas
|
||||
*/
|
||||
static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
if (sb_any_quota_active(inode->i_sb)) {
|
||||
if (inode->i_sb->dq_op->claim_space(inode, nr) == NO_QUOTA)
|
||||
return 1;
|
||||
} else
|
||||
inode_add_bytes(inode, nr);
|
||||
|
||||
mark_inode_dirty(inode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Release reserved (in-memory) quotas
|
||||
*/
|
||||
static inline
|
||||
void vfs_dq_release_reservation_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
if (sb_any_quota_active(inode->i_sb))
|
||||
inode->i_sb->dq_op->release_rsv(inode, nr);
|
||||
}
|
||||
|
||||
static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
if (sb_any_quota_active(inode->i_sb))
|
||||
@@ -339,6 +379,22 @@ static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_alloc_space(inode, nr);
|
||||
}
|
||||
|
||||
static inline
|
||||
int vfs_dq_release_reservation_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
inode_sub_bytes(inode, nr);
|
||||
@@ -354,67 +410,48 @@ static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr)
|
||||
|
||||
static inline int vfs_dq_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_prealloc_space_nodirty(inode,
|
||||
nr << inode->i_sb->s_blocksize_bits);
|
||||
return vfs_dq_prealloc_space_nodirty(inode, nr << inode->i_blkbits);
|
||||
}
|
||||
|
||||
static inline int vfs_dq_prealloc_block(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_prealloc_space(inode,
|
||||
nr << inode->i_sb->s_blocksize_bits);
|
||||
return vfs_dq_prealloc_space(inode, nr << inode->i_blkbits);
|
||||
}
|
||||
|
||||
static inline int vfs_dq_alloc_block_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_alloc_space_nodirty(inode,
|
||||
nr << inode->i_sb->s_blocksize_bits);
|
||||
return vfs_dq_alloc_space_nodirty(inode, nr << inode->i_blkbits);
|
||||
}
|
||||
|
||||
static inline int vfs_dq_alloc_block(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_alloc_space(inode,
|
||||
nr << inode->i_sb->s_blocksize_bits);
|
||||
return vfs_dq_alloc_space(inode, nr << inode->i_blkbits);
|
||||
}
|
||||
|
||||
static inline int vfs_dq_reserve_block(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_reserve_space(inode, nr << inode->i_blkbits);
|
||||
}
|
||||
|
||||
static inline int vfs_dq_claim_block(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_claim_space(inode, nr << inode->i_blkbits);
|
||||
}
|
||||
|
||||
static inline
|
||||
void vfs_dq_release_reservation_block(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
vfs_dq_release_reservation_space(inode, nr << inode->i_blkbits);
|
||||
}
|
||||
|
||||
static inline void vfs_dq_free_block_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
vfs_dq_free_space_nodirty(inode, nr << inode->i_sb->s_blocksize_bits);
|
||||
vfs_dq_free_space_nodirty(inode, nr << inode->i_blkbits);
|
||||
}
|
||||
|
||||
static inline void vfs_dq_free_block(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
vfs_dq_free_space(inode, nr << inode->i_sb->s_blocksize_bits);
|
||||
vfs_dq_free_space(inode, nr << inode->i_blkbits);
|
||||
}
|
||||
|
||||
/*
|
||||
* Define uppercase equivalents for compatibility with old function names
|
||||
* Can go away when we think all users have been converted (15/04/2008)
|
||||
*/
|
||||
#define DQUOT_INIT(inode) vfs_dq_init(inode)
|
||||
#define DQUOT_DROP(inode) vfs_dq_drop(inode)
|
||||
#define DQUOT_PREALLOC_SPACE_NODIRTY(inode, nr) \
|
||||
vfs_dq_prealloc_space_nodirty(inode, nr)
|
||||
#define DQUOT_PREALLOC_SPACE(inode, nr) vfs_dq_prealloc_space(inode, nr)
|
||||
#define DQUOT_ALLOC_SPACE_NODIRTY(inode, nr) \
|
||||
vfs_dq_alloc_space_nodirty(inode, nr)
|
||||
#define DQUOT_ALLOC_SPACE(inode, nr) vfs_dq_alloc_space(inode, nr)
|
||||
#define DQUOT_PREALLOC_BLOCK_NODIRTY(inode, nr) \
|
||||
vfs_dq_prealloc_block_nodirty(inode, nr)
|
||||
#define DQUOT_PREALLOC_BLOCK(inode, nr) vfs_dq_prealloc_block(inode, nr)
|
||||
#define DQUOT_ALLOC_BLOCK_NODIRTY(inode, nr) \
|
||||
vfs_dq_alloc_block_nodirty(inode, nr)
|
||||
#define DQUOT_ALLOC_BLOCK(inode, nr) vfs_dq_alloc_block(inode, nr)
|
||||
#define DQUOT_ALLOC_INODE(inode) vfs_dq_alloc_inode(inode)
|
||||
#define DQUOT_FREE_SPACE_NODIRTY(inode, nr) \
|
||||
vfs_dq_free_space_nodirty(inode, nr)
|
||||
#define DQUOT_FREE_SPACE(inode, nr) vfs_dq_free_space(inode, nr)
|
||||
#define DQUOT_FREE_BLOCK_NODIRTY(inode, nr) \
|
||||
vfs_dq_free_block_nodirty(inode, nr)
|
||||
#define DQUOT_FREE_BLOCK(inode, nr) vfs_dq_free_block(inode, nr)
|
||||
#define DQUOT_FREE_INODE(inode) vfs_dq_free_inode(inode)
|
||||
#define DQUOT_TRANSFER(inode, iattr) vfs_dq_transfer(inode, iattr)
|
||||
#define DQUOT_SYNC(sb) vfs_dq_sync(sb)
|
||||
#define DQUOT_OFF(sb, remount) vfs_dq_off(sb, remount)
|
||||
#define DQUOT_ON_REMOUNT(sb) vfs_dq_quota_on_remount(sb)
|
||||
|
||||
#endif /* _LINUX_QUOTAOPS_ */
|
||||
|
||||
+14
-2
@@ -1185,10 +1185,9 @@ struct task_struct {
|
||||
pid_t pid;
|
||||
pid_t tgid;
|
||||
|
||||
#ifdef CONFIG_CC_STACKPROTECTOR
|
||||
/* Canary value for the -fstack-protector gcc feature */
|
||||
unsigned long stack_canary;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* pointers to (original) parent process, youngest child, younger sibling,
|
||||
* older sibling, respectively. (p->father can be replaced with
|
||||
@@ -2107,6 +2106,19 @@ static inline int object_is_on_stack(void *obj)
|
||||
|
||||
extern void thread_info_cache_init(void);
|
||||
|
||||
#ifdef CONFIG_DEBUG_STACK_USAGE
|
||||
static inline unsigned long stack_not_used(struct task_struct *p)
|
||||
{
|
||||
unsigned long *n = end_of_stack(p);
|
||||
|
||||
do { /* Skip over canary */
|
||||
n++;
|
||||
} while (!*n);
|
||||
|
||||
return (unsigned long)n - (unsigned long)end_of_stack(p);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* set thread flags in other task's structures
|
||||
* - see asm/thread_info.h for TIF_xxxx flags available
|
||||
*/
|
||||
|
||||
@@ -237,6 +237,8 @@ enum {
|
||||
SKB_GSO_TCP_ECN = 1 << 3,
|
||||
|
||||
SKB_GSO_TCPV6 = 1 << 4,
|
||||
|
||||
SKB_GSO_FCOE = 1 << 5,
|
||||
};
|
||||
|
||||
#if BITS_PER_LONG > 32
|
||||
|
||||
@@ -176,6 +176,12 @@ static inline void init_call_single_data(void)
|
||||
#define put_cpu() preempt_enable()
|
||||
#define put_cpu_no_resched() preempt_enable_no_resched()
|
||||
|
||||
/*
|
||||
* Callback to arch code if there's nosmp or maxcpus=0 on the
|
||||
* boot command line:
|
||||
*/
|
||||
extern void arch_disable_smp_support(void);
|
||||
|
||||
void smp_setup_processor_id(void);
|
||||
|
||||
#endif /* __LINUX_SMP_H */
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
#ifndef _LINUX_STACKPROTECTOR_H
|
||||
#define _LINUX_STACKPROTECTOR_H 1
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/random.h>
|
||||
|
||||
#ifdef CONFIG_CC_STACKPROTECTOR
|
||||
# include <asm/stackprotector.h>
|
||||
#else
|
||||
static inline void boot_init_stack_canary(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -193,5 +193,11 @@ int arch_update_cpu_topology(void);
|
||||
#ifndef topology_core_siblings
|
||||
#define topology_core_siblings(cpu) cpumask_of_cpu(cpu)
|
||||
#endif
|
||||
#ifndef topology_thread_cpumask
|
||||
#define topology_thread_cpumask(cpu) cpumask_of(cpu)
|
||||
#endif
|
||||
#ifndef topology_core_cpumask
|
||||
#define topology_core_cpumask(cpu) cpumask_of(cpu)
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_TOPOLOGY_H */
|
||||
|
||||
@@ -95,6 +95,9 @@ extern struct vm_struct *remove_vm_area(const void *addr);
|
||||
|
||||
extern int map_vm_area(struct vm_struct *area, pgprot_t prot,
|
||||
struct page ***pages);
|
||||
extern int map_kernel_range_noflush(unsigned long start, unsigned long size,
|
||||
pgprot_t prot, struct page **pages);
|
||||
extern void unmap_kernel_range_noflush(unsigned long addr, unsigned long size);
|
||||
extern void unmap_kernel_range(unsigned long addr, unsigned long size);
|
||||
|
||||
/* Allocate/destroy a 'vmalloc' VM area. */
|
||||
@@ -110,5 +113,6 @@ extern long vwrite(char *buf, char *addr, unsigned long count);
|
||||
*/
|
||||
extern rwlock_t vmlist_lock;
|
||||
extern struct vm_struct *vmlist;
|
||||
extern __init void vm_area_register_early(struct vm_struct *vm, size_t align);
|
||||
|
||||
#endif /* _LINUX_VMALLOC_H */
|
||||
|
||||
@@ -24,13 +24,6 @@
|
||||
* FCoE - Fibre Channel over Ethernet.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The FCoE ethertype eventually goes in net/if_ether.h.
|
||||
*/
|
||||
#ifndef ETH_P_FCOE
|
||||
#define ETH_P_FCOE 0x8906 /* FCOE ether type */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* FC_FCOE_OUI hasn't been standardized yet. XXX TBD.
|
||||
*/
|
||||
|
||||
+2
-17
@@ -54,8 +54,7 @@
|
||||
#define fr_eof(fp) (fr_cb(fp)->fr_eof)
|
||||
#define fr_flags(fp) (fr_cb(fp)->fr_flags)
|
||||
#define fr_max_payload(fp) (fr_cb(fp)->fr_max_payload)
|
||||
#define fr_cmd(fp) (fr_cb(fp)->fr_cmd)
|
||||
#define fr_dir(fp) (fr_cmd(fp)->sc_data_direction)
|
||||
#define fr_fsp(fp) (fr_cb(fp)->fr_fsp)
|
||||
#define fr_crc(fp) (fr_cb(fp)->fr_crc)
|
||||
|
||||
struct fc_frame {
|
||||
@@ -66,7 +65,7 @@ struct fcoe_rcv_info {
|
||||
struct packet_type *ptype;
|
||||
struct fc_lport *fr_dev; /* transport layer private pointer */
|
||||
struct fc_seq *fr_seq; /* for use with exchange manager */
|
||||
struct scsi_cmnd *fr_cmd; /* for use of scsi command */
|
||||
struct fc_fcp_pkt *fr_fsp; /* for the corresponding fcp I/O */
|
||||
u32 fr_crc;
|
||||
u16 fr_max_payload; /* max FC payload */
|
||||
enum fc_sof fr_sof; /* start of frame delimiter */
|
||||
@@ -218,20 +217,6 @@ static inline bool fc_frame_is_cmd(const struct fc_frame *fp)
|
||||
return fc_frame_rctl(fp) == FC_RCTL_DD_UNSOL_CMD;
|
||||
}
|
||||
|
||||
static inline bool fc_frame_is_read(const struct fc_frame *fp)
|
||||
{
|
||||
if (fc_frame_is_cmd(fp) && fr_cmd(fp))
|
||||
return fr_dir(fp) == DMA_FROM_DEVICE;
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool fc_frame_is_write(const struct fc_frame *fp)
|
||||
{
|
||||
if (fc_frame_is_cmd(fp) && fr_cmd(fp))
|
||||
return fr_dir(fp) == DMA_TO_DEVICE;
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for leaks.
|
||||
* Print the frame header of any currently allocated frame, assuming there
|
||||
|
||||
@@ -245,6 +245,7 @@ struct fc_fcp_pkt {
|
||||
*/
|
||||
struct fcp_cmnd cdb_cmd;
|
||||
size_t xfer_len;
|
||||
u16 xfer_ddp; /* this xfer is ddped */
|
||||
u32 xfer_contig_end; /* offset of end of contiguous xfer */
|
||||
u16 max_payload; /* max payload size in bytes */
|
||||
|
||||
@@ -267,6 +268,15 @@ struct fc_fcp_pkt {
|
||||
u8 recov_retry; /* count of recovery retries */
|
||||
struct fc_seq *recov_seq; /* sequence for REC or SRR */
|
||||
};
|
||||
/*
|
||||
* FC_FCP HELPER FUNCTIONS
|
||||
*****************************/
|
||||
static inline bool fc_fcp_is_read(const struct fc_fcp_pkt *fsp)
|
||||
{
|
||||
if (fsp && fsp->cmd)
|
||||
return fsp->cmd->sc_data_direction == DMA_FROM_DEVICE;
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Structure and function definitions for managing Fibre Channel Exchanges
|
||||
@@ -399,6 +409,21 @@ struct libfc_function_template {
|
||||
void *arg),
|
||||
void *arg, unsigned int timer_msec);
|
||||
|
||||
/*
|
||||
* Sets up the DDP context for a given exchange id on the given
|
||||
* scatterlist if LLD supports DDP for large receive.
|
||||
*
|
||||
* STATUS: OPTIONAL
|
||||
*/
|
||||
int (*ddp_setup)(struct fc_lport *lp, u16 xid,
|
||||
struct scatterlist *sgl, unsigned int sgc);
|
||||
/*
|
||||
* Completes the DDP transfer and returns the length of data DDPed
|
||||
* for the given exchange id.
|
||||
*
|
||||
* STATUS: OPTIONAL
|
||||
*/
|
||||
int (*ddp_done)(struct fc_lport *lp, u16 xid);
|
||||
/*
|
||||
* Send a frame using an existing sequence and exchange.
|
||||
*
|
||||
@@ -654,6 +679,7 @@ struct fc_lport {
|
||||
u16 link_speed;
|
||||
u16 link_supported_speeds;
|
||||
u16 lro_xid; /* max xid for fcoe lro */
|
||||
unsigned int lso_max; /* max large send size */
|
||||
struct fc_ns_fts fcts; /* FC-4 type masks */
|
||||
struct fc_els_rnid_gen rnid_gen; /* RNID information */
|
||||
|
||||
@@ -820,6 +846,11 @@ int fc_change_queue_type(struct scsi_device *sdev, int tag_type);
|
||||
*/
|
||||
void fc_fcp_destroy(struct fc_lport *);
|
||||
|
||||
/*
|
||||
* Set up direct-data placement for this I/O request
|
||||
*/
|
||||
void fc_fcp_ddp_setup(struct fc_fcp_pkt *fsp, u16 xid);
|
||||
|
||||
/*
|
||||
* ELS/CT interface
|
||||
*****************************/
|
||||
|
||||
@@ -124,24 +124,6 @@ static inline u16 skb_fc_rxid(const struct sk_buff *skb)
|
||||
return be16_to_cpu(skb_fc_header(skb)->fh_rx_id);
|
||||
}
|
||||
|
||||
/* FIXME - DMA_BIDIRECTIONAL ? */
|
||||
#define skb_cb(skb) ((struct fcoe_rcv_info *)&((skb)->cb[0]))
|
||||
#define skb_cmd(skb) (skb_cb(skb)->fr_cmd)
|
||||
#define skb_dir(skb) (skb_cmd(skb)->sc_data_direction)
|
||||
static inline bool skb_fc_is_read(const struct sk_buff *skb)
|
||||
{
|
||||
if (skb_fc_is_cmd(skb) && skb_cmd(skb))
|
||||
return skb_dir(skb) == DMA_FROM_DEVICE;
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool skb_fc_is_write(const struct sk_buff *skb)
|
||||
{
|
||||
if (skb_fc_is_cmd(skb) && skb_cmd(skb))
|
||||
return skb_dir(skb) == DMA_TO_DEVICE;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* libfcoe funcs */
|
||||
int fcoe_reset(struct Scsi_Host *shost);
|
||||
u64 fcoe_wwn_from_mac(unsigned char mac[MAX_ADDR_LEN],
|
||||
|
||||
+8
-11
@@ -45,18 +45,10 @@ struct iscsi_session;
|
||||
struct iscsi_nopin;
|
||||
struct device;
|
||||
|
||||
/* #define DEBUG_SCSI */
|
||||
#ifdef DEBUG_SCSI
|
||||
#define debug_scsi(fmt...) printk(KERN_INFO "iscsi: " fmt)
|
||||
#else
|
||||
#define debug_scsi(fmt...)
|
||||
#endif
|
||||
|
||||
#define ISCSI_DEF_XMIT_CMDS_MAX 128 /* must be power of 2 */
|
||||
#define ISCSI_MGMT_CMDS_MAX 15
|
||||
|
||||
#define ISCSI_DEF_CMD_PER_LUN 32
|
||||
#define ISCSI_MAX_CMD_PER_LUN 128
|
||||
#define ISCSI_DEF_CMD_PER_LUN 32
|
||||
|
||||
/* Task Mgmt states */
|
||||
enum {
|
||||
@@ -326,6 +318,9 @@ struct iscsi_host {
|
||||
spinlock_t lock;
|
||||
int num_sessions;
|
||||
int state;
|
||||
|
||||
struct workqueue_struct *workq;
|
||||
char workq_name[20];
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -351,7 +346,8 @@ extern int iscsi_host_get_param(struct Scsi_Host *shost,
|
||||
enum iscsi_host_param param, char *buf);
|
||||
extern int iscsi_host_add(struct Scsi_Host *shost, struct device *pdev);
|
||||
extern struct Scsi_Host *iscsi_host_alloc(struct scsi_host_template *sht,
|
||||
int dd_data_size, uint16_t qdepth);
|
||||
int dd_data_size,
|
||||
bool xmit_can_sleep);
|
||||
extern void iscsi_host_remove(struct Scsi_Host *shost);
|
||||
extern void iscsi_host_free(struct Scsi_Host *shost);
|
||||
|
||||
@@ -382,11 +378,12 @@ extern void iscsi_conn_stop(struct iscsi_cls_conn *, int);
|
||||
extern int iscsi_conn_bind(struct iscsi_cls_session *, struct iscsi_cls_conn *,
|
||||
int);
|
||||
extern void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err);
|
||||
extern void iscsi_session_failure(struct iscsi_cls_session *cls_session,
|
||||
extern void iscsi_session_failure(struct iscsi_session *session,
|
||||
enum iscsi_err err);
|
||||
extern int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
|
||||
enum iscsi_param param, char *buf);
|
||||
extern void iscsi_suspend_tx(struct iscsi_conn *conn);
|
||||
extern void iscsi_conn_queue_work(struct iscsi_conn *conn);
|
||||
|
||||
#define iscsi_conn_printk(prefix, _c, fmt, a...) \
|
||||
iscsi_cls_conn_printk(prefix, ((struct iscsi_conn *)_c)->cls_conn, \
|
||||
|
||||
@@ -0,0 +1,327 @@
|
||||
#ifndef __OSD_ATTRIBUTES_H__
|
||||
#define __OSD_ATTRIBUTES_H__
|
||||
|
||||
#include "osd_protocol.h"
|
||||
|
||||
/*
|
||||
* Contains types and constants that define attribute pages and attribute
|
||||
* numbers and their data types.
|
||||
*/
|
||||
|
||||
#define ATTR_SET(pg, id, l, ptr) \
|
||||
{ .attr_page = pg, .attr_id = id, .len = l, .val_ptr = ptr }
|
||||
|
||||
#define ATTR_DEF(pg, id, l) ATTR_SET(pg, id, l, NULL)
|
||||
|
||||
/* osd-r10 4.7.3 Attributes pages */
|
||||
enum {
|
||||
OSD_APAGE_OBJECT_FIRST = 0x0,
|
||||
OSD_APAGE_OBJECT_DIRECTORY = 0,
|
||||
OSD_APAGE_OBJECT_INFORMATION = 1,
|
||||
OSD_APAGE_OBJECT_QUOTAS = 2,
|
||||
OSD_APAGE_OBJECT_TIMESTAMP = 3,
|
||||
OSD_APAGE_OBJECT_COLLECTIONS = 4,
|
||||
OSD_APAGE_OBJECT_SECURITY = 5,
|
||||
OSD_APAGE_OBJECT_LAST = 0x2fffffff,
|
||||
|
||||
OSD_APAGE_PARTITION_FIRST = 0x30000000,
|
||||
OSD_APAGE_PARTITION_DIRECTORY = OSD_APAGE_PARTITION_FIRST + 0,
|
||||
OSD_APAGE_PARTITION_INFORMATION = OSD_APAGE_PARTITION_FIRST + 1,
|
||||
OSD_APAGE_PARTITION_QUOTAS = OSD_APAGE_PARTITION_FIRST + 2,
|
||||
OSD_APAGE_PARTITION_TIMESTAMP = OSD_APAGE_PARTITION_FIRST + 3,
|
||||
OSD_APAGE_PARTITION_SECURITY = OSD_APAGE_PARTITION_FIRST + 5,
|
||||
OSD_APAGE_PARTITION_LAST = 0x5FFFFFFF,
|
||||
|
||||
OSD_APAGE_COLLECTION_FIRST = 0x60000000,
|
||||
OSD_APAGE_COLLECTION_DIRECTORY = OSD_APAGE_COLLECTION_FIRST + 0,
|
||||
OSD_APAGE_COLLECTION_INFORMATION = OSD_APAGE_COLLECTION_FIRST + 1,
|
||||
OSD_APAGE_COLLECTION_TIMESTAMP = OSD_APAGE_COLLECTION_FIRST + 3,
|
||||
OSD_APAGE_COLLECTION_SECURITY = OSD_APAGE_COLLECTION_FIRST + 5,
|
||||
OSD_APAGE_COLLECTION_LAST = 0x8FFFFFFF,
|
||||
|
||||
OSD_APAGE_ROOT_FIRST = 0x90000000,
|
||||
OSD_APAGE_ROOT_DIRECTORY = OSD_APAGE_ROOT_FIRST + 0,
|
||||
OSD_APAGE_ROOT_INFORMATION = OSD_APAGE_ROOT_FIRST + 1,
|
||||
OSD_APAGE_ROOT_QUOTAS = OSD_APAGE_ROOT_FIRST + 2,
|
||||
OSD_APAGE_ROOT_TIMESTAMP = OSD_APAGE_ROOT_FIRST + 3,
|
||||
OSD_APAGE_ROOT_SECURITY = OSD_APAGE_ROOT_FIRST + 5,
|
||||
OSD_APAGE_ROOT_LAST = 0xBFFFFFFF,
|
||||
|
||||
OSD_APAGE_RESERVED_TYPE_FIRST = 0xC0000000,
|
||||
OSD_APAGE_RESERVED_TYPE_LAST = 0xEFFFFFFF,
|
||||
|
||||
OSD_APAGE_COMMON_FIRST = 0xF0000000,
|
||||
OSD_APAGE_COMMON_LAST = 0xFFFFFFFE,
|
||||
|
||||
OSD_APAGE_REQUEST_ALL = 0xFFFFFFFF,
|
||||
};
|
||||
|
||||
/* subcategories of attr pages within each range above */
|
||||
enum {
|
||||
OSD_APAGE_STD_FIRST = 0x0,
|
||||
OSD_APAGE_STD_DIRECTORY = 0,
|
||||
OSD_APAGE_STD_INFORMATION = 1,
|
||||
OSD_APAGE_STD_QUOTAS = 2,
|
||||
OSD_APAGE_STD_TIMESTAMP = 3,
|
||||
OSD_APAGE_STD_COLLECTIONS = 4,
|
||||
OSD_APAGE_STD_POLICY_SECURITY = 5,
|
||||
OSD_APAGE_STD_LAST = 0x0000007F,
|
||||
|
||||
OSD_APAGE_RESERVED_FIRST = 0x00000080,
|
||||
OSD_APAGE_RESERVED_LAST = 0x00007FFF,
|
||||
|
||||
OSD_APAGE_OTHER_STD_FIRST = 0x00008000,
|
||||
OSD_APAGE_OTHER_STD_LAST = 0x0000EFFF,
|
||||
|
||||
OSD_APAGE_PUBLIC_FIRST = 0x0000F000,
|
||||
OSD_APAGE_PUBLIC_LAST = 0x0000FFFF,
|
||||
|
||||
OSD_APAGE_APP_DEFINED_FIRST = 0x00010000,
|
||||
OSD_APAGE_APP_DEFINED_LAST = 0x1FFFFFFF,
|
||||
|
||||
OSD_APAGE_VENDOR_SPECIFIC_FIRST = 0x20000000,
|
||||
OSD_APAGE_VENDOR_SPECIFIC_LAST = 0x2FFFFFFF,
|
||||
};
|
||||
|
||||
enum {
|
||||
OSD_ATTR_PAGE_IDENTIFICATION = 0, /* in all pages 40 bytes */
|
||||
};
|
||||
|
||||
struct page_identification {
|
||||
u8 vendor_identification[8];
|
||||
u8 page_identification[32];
|
||||
} __packed;
|
||||
|
||||
struct osd_attr_page_header {
|
||||
__be32 page_number;
|
||||
__be32 page_length;
|
||||
} __packed;
|
||||
|
||||
/* 7.1.2.8 Root Information attributes page (OSD_APAGE_ROOT_INFORMATION) */
|
||||
enum {
|
||||
OSD_ATTR_RI_OSD_SYSTEM_ID = 0x3, /* 20 */
|
||||
OSD_ATTR_RI_VENDOR_IDENTIFICATION = 0x4, /* 8 */
|
||||
OSD_ATTR_RI_PRODUCT_IDENTIFICATION = 0x5, /* 16 */
|
||||
OSD_ATTR_RI_PRODUCT_MODEL = 0x6, /* 32 */
|
||||
OSD_ATTR_RI_PRODUCT_REVISION_LEVEL = 0x7, /* 4 */
|
||||
OSD_ATTR_RI_PRODUCT_SERIAL_NUMBER = 0x8, /* variable */
|
||||
OSD_ATTR_RI_OSD_NAME = 0x9, /* variable */
|
||||
OSD_ATTR_RI_TOTAL_CAPACITY = 0x80, /* 8 */
|
||||
OSD_ATTR_RI_USED_CAPACITY = 0x81, /* 8 */
|
||||
OSD_ATTR_RI_NUMBER_OF_PARTITIONS = 0xC0, /* 8 */
|
||||
OSD_ATTR_RI_CLOCK = 0x100, /* 6 */
|
||||
};
|
||||
/* Root_Information_attributes_page does not have a get_page structure */
|
||||
|
||||
/* 7.1.2.9 Partition Information attributes page
|
||||
* (OSD_APAGE_PARTITION_INFORMATION)
|
||||
*/
|
||||
enum {
|
||||
OSD_ATTR_PI_PARTITION_ID = 0x1, /* 8 */
|
||||
OSD_ATTR_PI_USERNAME = 0x9, /* variable */
|
||||
OSD_ATTR_PI_USED_CAPACITY = 0x81, /* 8 */
|
||||
OSD_ATTR_PI_NUMBER_OF_OBJECTS = 0xC1, /* 8 */
|
||||
};
|
||||
/* Partition Information attributes page does not have a get_page structure */
|
||||
|
||||
/* 7.1.2.10 Collection Information attributes page
|
||||
* (OSD_APAGE_COLLECTION_INFORMATION)
|
||||
*/
|
||||
enum {
|
||||
OSD_ATTR_CI_PARTITION_ID = 0x1, /* 8 */
|
||||
OSD_ATTR_CI_COLLECTION_OBJECT_ID = 0x2, /* 8 */
|
||||
OSD_ATTR_CI_USERNAME = 0x9, /* variable */
|
||||
OSD_ATTR_CI_USED_CAPACITY = 0x81, /* 8 */
|
||||
};
|
||||
/* Collection Information attributes page does not have a get_page structure */
|
||||
|
||||
/* 7.1.2.11 User Object Information attributes page
|
||||
* (OSD_APAGE_OBJECT_INFORMATION)
|
||||
*/
|
||||
enum {
|
||||
OSD_ATTR_OI_PARTITION_ID = 0x1, /* 8 */
|
||||
OSD_ATTR_OI_OBJECT_ID = 0x2, /* 8 */
|
||||
OSD_ATTR_OI_USERNAME = 0x9, /* variable */
|
||||
OSD_ATTR_OI_USED_CAPACITY = 0x81, /* 8 */
|
||||
OSD_ATTR_OI_LOGICAL_LENGTH = 0x82, /* 8 */
|
||||
};
|
||||
/* Object Information attributes page does not have a get_page structure */
|
||||
|
||||
/* 7.1.2.12 Root Quotas attributes page (OSD_APAGE_ROOT_QUOTAS) */
|
||||
enum {
|
||||
OSD_ATTR_RQ_DEFAULT_MAXIMUM_USER_OBJECT_LENGTH = 0x1, /* 8 */
|
||||
OSD_ATTR_RQ_PARTITION_CAPACITY_QUOTA = 0x10001, /* 8 */
|
||||
OSD_ATTR_RQ_PARTITION_OBJECT_COUNT = 0x10002, /* 8 */
|
||||
OSD_ATTR_RQ_PARTITION_COLLECTIONS_PER_USER_OBJECT = 0x10081, /* 4 */
|
||||
OSD_ATTR_RQ_PARTITION_COUNT = 0x20002, /* 8 */
|
||||
};
|
||||
|
||||
struct Root_Quotas_attributes_page {
|
||||
struct osd_attr_page_header hdr; /* id=R+2, size=0x24 */
|
||||
__be64 default_maximum_user_object_length;
|
||||
__be64 partition_capacity_quota;
|
||||
__be64 partition_object_count;
|
||||
__be64 partition_collections_per_user_object;
|
||||
__be64 partition_count;
|
||||
} __packed;
|
||||
|
||||
/* 7.1.2.13 Partition Quotas attributes page (OSD_APAGE_PARTITION_QUOTAS)*/
|
||||
enum {
|
||||
OSD_ATTR_PQ_DEFAULT_MAXIMUM_USER_OBJECT_LENGTH = 0x1, /* 8 */
|
||||
OSD_ATTR_PQ_CAPACITY_QUOTA = 0x10001, /* 8 */
|
||||
OSD_ATTR_PQ_OBJECT_COUNT = 0x10002, /* 8 */
|
||||
OSD_ATTR_PQ_COLLECTIONS_PER_USER_OBJECT = 0x10081, /* 4 */
|
||||
};
|
||||
|
||||
struct Partition_Quotas_attributes_page {
|
||||
struct osd_attr_page_header hdr; /* id=P+2, size=0x1C */
|
||||
__be64 default_maximum_user_object_length;
|
||||
__be64 capacity_quota;
|
||||
__be64 object_count;
|
||||
__be64 collections_per_user_object;
|
||||
} __packed;
|
||||
|
||||
/* 7.1.2.14 User Object Quotas attributes page (OSD_APAGE_OBJECT_QUOTAS) */
|
||||
enum {
|
||||
OSD_ATTR_OQ_MAXIMUM_LENGTH = 0x1, /* 8 */
|
||||
};
|
||||
|
||||
struct Object_Quotas_attributes_page {
|
||||
struct osd_attr_page_header hdr; /* id=U+2, size=0x8 */
|
||||
__be64 maximum_length;
|
||||
} __packed;
|
||||
|
||||
/* 7.1.2.15 Root Timestamps attributes page (OSD_APAGE_ROOT_TIMESTAMP) */
|
||||
enum {
|
||||
OSD_ATTR_RT_ATTRIBUTES_ACCESSED_TIME = 0x2, /* 6 */
|
||||
OSD_ATTR_RT_ATTRIBUTES_MODIFIED_TIME = 0x3, /* 6 */
|
||||
OSD_ATTR_RT_TIMESTAMP_BYPASS = 0xFFFFFFFE, /* 1 */
|
||||
};
|
||||
|
||||
struct root_timestamps_attributes_page {
|
||||
struct osd_attr_page_header hdr; /* id=R+3, size=0xD */
|
||||
struct osd_timestamp attributes_accessed_time;
|
||||
struct osd_timestamp attributes_modified_time;
|
||||
u8 timestamp_bypass;
|
||||
} __packed;
|
||||
|
||||
/* 7.1.2.16 Partition Timestamps attributes page
|
||||
* (OSD_APAGE_PARTITION_TIMESTAMP)
|
||||
*/
|
||||
enum {
|
||||
OSD_ATTR_PT_CREATED_TIME = 0x1, /* 6 */
|
||||
OSD_ATTR_PT_ATTRIBUTES_ACCESSED_TIME = 0x2, /* 6 */
|
||||
OSD_ATTR_PT_ATTRIBUTES_MODIFIED_TIME = 0x3, /* 6 */
|
||||
OSD_ATTR_PT_DATA_ACCESSED_TIME = 0x4, /* 6 */
|
||||
OSD_ATTR_PT_DATA_MODIFIED_TIME = 0x5, /* 6 */
|
||||
OSD_ATTR_PT_TIMESTAMP_BYPASS = 0xFFFFFFFE, /* 1 */
|
||||
};
|
||||
|
||||
struct partition_timestamps_attributes_page {
|
||||
struct osd_attr_page_header hdr; /* id=P+3, size=0x1F */
|
||||
struct osd_timestamp created_time;
|
||||
struct osd_timestamp attributes_accessed_time;
|
||||
struct osd_timestamp attributes_modified_time;
|
||||
struct osd_timestamp data_accessed_time;
|
||||
struct osd_timestamp data_modified_time;
|
||||
u8 timestamp_bypass;
|
||||
} __packed;
|
||||
|
||||
/* 7.1.2.17/18 Collection/Object Timestamps attributes page
|
||||
* (OSD_APAGE_COLLECTION_TIMESTAMP/OSD_APAGE_OBJECT_TIMESTAMP)
|
||||
*/
|
||||
enum {
|
||||
OSD_ATTR_OT_CREATED_TIME = 0x1, /* 6 */
|
||||
OSD_ATTR_OT_ATTRIBUTES_ACCESSED_TIME = 0x2, /* 6 */
|
||||
OSD_ATTR_OT_ATTRIBUTES_MODIFIED_TIME = 0x3, /* 6 */
|
||||
OSD_ATTR_OT_DATA_ACCESSED_TIME = 0x4, /* 6 */
|
||||
OSD_ATTR_OT_DATA_MODIFIED_TIME = 0x5, /* 6 */
|
||||
};
|
||||
|
||||
/* same for collection */
|
||||
struct object_timestamps_attributes_page {
|
||||
struct osd_attr_page_header hdr; /* id=C+3/3, size=0x1E */
|
||||
struct osd_timestamp created_time;
|
||||
struct osd_timestamp attributes_accessed_time;
|
||||
struct osd_timestamp attributes_modified_time;
|
||||
struct osd_timestamp data_accessed_time;
|
||||
struct osd_timestamp data_modified_time;
|
||||
} __packed;
|
||||
|
||||
/* 7.1.2.19 Collections attributes page */
|
||||
/* TBD */
|
||||
|
||||
/* 7.1.2.20 Root Policy/Security attributes page (OSD_APAGE_ROOT_SECURITY) */
|
||||
enum {
|
||||
OSD_ATTR_RS_DEFAULT_SECURITY_METHOD = 0x1, /* 1 */
|
||||
OSD_ATTR_RS_OLDEST_VALID_NONCE_LIMIT = 0x2, /* 6 */
|
||||
OSD_ATTR_RS_NEWEST_VALID_NONCE_LIMIT = 0x3, /* 6 */
|
||||
OSD_ATTR_RS_PARTITION_DEFAULT_SECURITY_METHOD = 0x6, /* 1 */
|
||||
OSD_ATTR_RS_SUPPORTED_SECURITY_METHODS = 0x7, /* 2 */
|
||||
OSD_ATTR_RS_ADJUSTABLE_CLOCK = 0x9, /* 6 */
|
||||
OSD_ATTR_RS_MASTER_KEY_IDENTIFIER = 0x7FFD, /* 0 or 7 */
|
||||
OSD_ATTR_RS_ROOT_KEY_IDENTIFIER = 0x7FFE, /* 0 or 7 */
|
||||
OSD_ATTR_RS_SUPPORTED_INTEGRITY_ALGORITHM_0 = 0x80000000,/* 1,(x16)*/
|
||||
OSD_ATTR_RS_SUPPORTED_DH_GROUP_0 = 0x80000010,/* 1,(x16)*/
|
||||
};
|
||||
|
||||
struct root_security_attributes_page {
|
||||
struct osd_attr_page_header hdr; /* id=R+5, size=0x3F */
|
||||
u8 default_security_method;
|
||||
u8 partition_default_security_method;
|
||||
__be16 supported_security_methods;
|
||||
u8 mki_valid_rki_valid;
|
||||
struct osd_timestamp oldest_valid_nonce_limit;
|
||||
struct osd_timestamp newest_valid_nonce_limit;
|
||||
struct osd_timestamp adjustable_clock;
|
||||
u8 master_key_identifier[32-25];
|
||||
u8 root_key_identifier[39-32];
|
||||
u8 supported_integrity_algorithm[16];
|
||||
u8 supported_dh_group[16];
|
||||
} __packed;
|
||||
|
||||
/* 7.1.2.21 Partition Policy/Security attributes page
|
||||
* (OSD_APAGE_PARTITION_SECURITY)
|
||||
*/
|
||||
enum {
|
||||
OSD_ATTR_PS_DEFAULT_SECURITY_METHOD = 0x1, /* 1 */
|
||||
OSD_ATTR_PS_OLDEST_VALID_NONCE = 0x2, /* 6 */
|
||||
OSD_ATTR_PS_NEWEST_VALID_NONCE = 0x3, /* 6 */
|
||||
OSD_ATTR_PS_REQUEST_NONCE_LIST_DEPTH = 0x4, /* 2 */
|
||||
OSD_ATTR_PS_FROZEN_WORKING_KEY_BIT_MASK = 0x5, /* 2 */
|
||||
OSD_ATTR_PS_PARTITION_KEY_IDENTIFIER = 0x7FFF, /* 0 or 7 */
|
||||
OSD_ATTR_PS_WORKING_KEY_IDENTIFIER_FIRST = 0x8000, /* 0 or 7 */
|
||||
OSD_ATTR_PS_WORKING_KEY_IDENTIFIER_LAST = 0x800F, /* 0 or 7 */
|
||||
OSD_ATTR_PS_POLICY_ACCESS_TAG = 0x40000001, /* 4 */
|
||||
OSD_ATTR_PS_USER_OBJECT_POLICY_ACCESS_TAG = 0x40000002, /* 4 */
|
||||
};
|
||||
|
||||
struct partition_security_attributes_page {
|
||||
struct osd_attr_page_header hdr; /* id=p+5, size=0x8f */
|
||||
u8 reserved[3];
|
||||
u8 default_security_method;
|
||||
struct osd_timestamp oldest_valid_nonce;
|
||||
struct osd_timestamp newest_valid_nonce;
|
||||
__be16 request_nonce_list_depth;
|
||||
__be16 frozen_working_key_bit_mask;
|
||||
__be32 policy_access_tag;
|
||||
__be32 user_object_policy_access_tag;
|
||||
u8 pki_valid;
|
||||
__be16 wki_00_0f_vld;
|
||||
struct osd_key_identifier partition_key_identifier;
|
||||
struct osd_key_identifier working_key_identifiers[16];
|
||||
} __packed;
|
||||
|
||||
/* 7.1.2.22/23 Collection/Object Policy-Security attributes page
|
||||
* (OSD_APAGE_COLLECTION_SECURITY/OSD_APAGE_OBJECT_SECURITY)
|
||||
*/
|
||||
enum {
|
||||
OSD_ATTR_OS_POLICY_ACCESS_TAG = 0x40000001, /* 4 */
|
||||
};
|
||||
|
||||
struct object_security_attributes_page {
|
||||
struct osd_attr_page_header hdr; /* id=C+5/5, size=4 */
|
||||
__be32 policy_access_tag;
|
||||
} __packed;
|
||||
|
||||
#endif /*ndef __OSD_ATTRIBUTES_H__*/
|
||||
@@ -0,0 +1,433 @@
|
||||
/*
|
||||
* osd_initiator.h - OSD initiator API definition
|
||||
*
|
||||
* Copyright (C) 2008 Panasas Inc. All rights reserved.
|
||||
*
|
||||
* Authors:
|
||||
* Boaz Harrosh <bharrosh@panasas.com>
|
||||
* Benny Halevy <bhalevy@panasas.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2
|
||||
*
|
||||
*/
|
||||
#ifndef __OSD_INITIATOR_H__
|
||||
#define __OSD_INITIATOR_H__
|
||||
|
||||
#include "osd_protocol.h"
|
||||
#include "osd_types.h"
|
||||
|
||||
#include <linux/blkdev.h>
|
||||
|
||||
/* Note: "NI" in comments below means "Not Implemented yet" */
|
||||
|
||||
/* Configure of code:
|
||||
* #undef if you *don't* want OSD v1 support in runtime.
|
||||
* If #defined the initiator will dynamically configure to encode OSD v1
|
||||
* CDB's if the target is detected to be OSD v1 only.
|
||||
* OSD v2 only commands, options, and attributes will be ignored if target
|
||||
* is v1 only.
|
||||
* If #defined will result in bigger/slower code (OK Slower maybe not)
|
||||
* Q: Should this be CONFIG_SCSI_OSD_VER1_SUPPORT and set from Kconfig?
|
||||
*/
|
||||
#define OSD_VER1_SUPPORT y
|
||||
|
||||
enum osd_std_version {
|
||||
OSD_VER_NONE = 0,
|
||||
OSD_VER1 = 1,
|
||||
OSD_VER2 = 2,
|
||||
};
|
||||
|
||||
/*
|
||||
* Object-based Storage Device.
|
||||
* This object represents an OSD device.
|
||||
* It is not a full linux device in any way. It is only
|
||||
* a place to hang resources associated with a Linux
|
||||
* request Q and some default properties.
|
||||
*/
|
||||
struct osd_dev {
|
||||
struct scsi_device *scsi_device;
|
||||
unsigned def_timeout;
|
||||
|
||||
#ifdef OSD_VER1_SUPPORT
|
||||
enum osd_std_version version;
|
||||
#endif
|
||||
};
|
||||
|
||||
/* Retrieve/return osd_dev(s) for use by Kernel clients */
|
||||
struct osd_dev *osduld_path_lookup(const char *dev_name); /*Use IS_ERR/ERR_PTR*/
|
||||
void osduld_put_device(struct osd_dev *od);
|
||||
|
||||
/* Add/remove test ioctls from external modules */
|
||||
typedef int (do_test_fn)(struct osd_dev *od, unsigned cmd, unsigned long arg);
|
||||
int osduld_register_test(unsigned ioctl, do_test_fn *do_test);
|
||||
void osduld_unregister_test(unsigned ioctl);
|
||||
|
||||
/* These are called by uld at probe time */
|
||||
void osd_dev_init(struct osd_dev *od, struct scsi_device *scsi_device);
|
||||
void osd_dev_fini(struct osd_dev *od);
|
||||
|
||||
/* some hi level device operations */
|
||||
int osd_auto_detect_ver(struct osd_dev *od, void *caps); /* GFP_KERNEL */
|
||||
|
||||
/* we might want to use function vector in the future */
|
||||
static inline void osd_dev_set_ver(struct osd_dev *od, enum osd_std_version v)
|
||||
{
|
||||
#ifdef OSD_VER1_SUPPORT
|
||||
od->version = v;
|
||||
#endif
|
||||
}
|
||||
|
||||
struct osd_request;
|
||||
typedef void (osd_req_done_fn)(struct osd_request *or, void *private);
|
||||
|
||||
struct osd_request {
|
||||
struct osd_cdb cdb;
|
||||
struct osd_data_out_integrity_info out_data_integ;
|
||||
struct osd_data_in_integrity_info in_data_integ;
|
||||
|
||||
struct osd_dev *osd_dev;
|
||||
struct request *request;
|
||||
|
||||
struct _osd_req_data_segment {
|
||||
void *buff;
|
||||
unsigned alloc_size; /* 0 here means: don't call kfree */
|
||||
unsigned total_bytes;
|
||||
} set_attr, enc_get_attr, get_attr;
|
||||
|
||||
struct _osd_io_info {
|
||||
struct bio *bio;
|
||||
u64 total_bytes;
|
||||
struct request *req;
|
||||
struct _osd_req_data_segment *last_seg;
|
||||
u8 *pad_buff;
|
||||
} out, in;
|
||||
|
||||
gfp_t alloc_flags;
|
||||
unsigned timeout;
|
||||
unsigned retries;
|
||||
u8 sense[OSD_MAX_SENSE_LEN];
|
||||
enum osd_attributes_mode attributes_mode;
|
||||
|
||||
osd_req_done_fn *async_done;
|
||||
void *async_private;
|
||||
int async_error;
|
||||
};
|
||||
|
||||
/* OSD Version control */
|
||||
static inline bool osd_req_is_ver1(struct osd_request *or)
|
||||
{
|
||||
#ifdef OSD_VER1_SUPPORT
|
||||
return or->osd_dev->version == OSD_VER1;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* How to use the osd library:
|
||||
*
|
||||
* osd_start_request
|
||||
* Allocates a request.
|
||||
*
|
||||
* osd_req_*
|
||||
* Call one of, to encode the desired operation.
|
||||
*
|
||||
* osd_add_{get,set}_attr
|
||||
* Optionally add attributes to the CDB, list or page mode.
|
||||
*
|
||||
* osd_finalize_request
|
||||
* Computes final data out/in offsets and signs the request,
|
||||
* making it ready for execution.
|
||||
*
|
||||
* osd_execute_request
|
||||
* May be called to execute it through the block layer. Other wise submit
|
||||
* the associated block request in some other way.
|
||||
*
|
||||
* After execution:
|
||||
* osd_req_decode_sense
|
||||
* Decodes sense information to verify execution results.
|
||||
*
|
||||
* osd_req_decode_get_attr
|
||||
* Retrieve osd_add_get_attr_list() values if used.
|
||||
*
|
||||
* osd_end_request
|
||||
* Must be called to deallocate the request.
|
||||
*/
|
||||
|
||||
/**
|
||||
* osd_start_request - Allocate and initialize an osd_request
|
||||
*
|
||||
* @osd_dev: OSD device that holds the scsi-device and default values
|
||||
* that the request is associated with.
|
||||
* @gfp: The allocation flags to use for request allocation, and all
|
||||
* subsequent allocations. This will be stored at
|
||||
* osd_request->alloc_flags, can be changed by user later
|
||||
*
|
||||
* Allocate osd_request and initialize all members to the
|
||||
* default/initial state.
|
||||
*/
|
||||
struct osd_request *osd_start_request(struct osd_dev *od, gfp_t gfp);
|
||||
|
||||
enum osd_req_options {
|
||||
OSD_REQ_FUA = 0x08, /* Force Unit Access */
|
||||
OSD_REQ_DPO = 0x10, /* Disable Page Out */
|
||||
|
||||
OSD_REQ_BYPASS_TIMESTAMPS = 0x80,
|
||||
};
|
||||
|
||||
/**
|
||||
* osd_finalize_request - Sign request and prepare request for execution
|
||||
*
|
||||
* @or: osd_request to prepare
|
||||
* @options: combination of osd_req_options bit flags or 0.
|
||||
* @cap: A Pointer to an OSD_CAP_LEN bytes buffer that is received from
|
||||
* The security manager as capabilities for this cdb.
|
||||
* @cap_key: The cryptographic key used to sign the cdb/data. Can be null
|
||||
* if NOSEC is used.
|
||||
*
|
||||
* The actual request and bios are only allocated here, so are the get_attr
|
||||
* buffers that will receive the returned attributes. Copy's @cap to cdb.
|
||||
* Sign the cdb/data with @cap_key.
|
||||
*/
|
||||
int osd_finalize_request(struct osd_request *or,
|
||||
u8 options, const void *cap, const u8 *cap_key);
|
||||
|
||||
/**
|
||||
* osd_execute_request - Execute the request synchronously through block-layer
|
||||
*
|
||||
* @or: osd_request to Executed
|
||||
*
|
||||
* Calls blk_execute_rq to q the command and waits for completion.
|
||||
*/
|
||||
int osd_execute_request(struct osd_request *or);
|
||||
|
||||
/**
|
||||
* osd_execute_request_async - Execute the request without waitting.
|
||||
*
|
||||
* @or: - osd_request to Executed
|
||||
* @done: (Optional) - Called at end of execution
|
||||
* @private: - Will be passed to @done function
|
||||
*
|
||||
* Calls blk_execute_rq_nowait to queue the command. When execution is done
|
||||
* optionally calls @done with @private as parameter. @or->async_error will
|
||||
* have the return code
|
||||
*/
|
||||
int osd_execute_request_async(struct osd_request *or,
|
||||
osd_req_done_fn *done, void *private);
|
||||
|
||||
/**
|
||||
* osd_req_decode_sense_full - Decode sense information after execution.
|
||||
*
|
||||
* @or: - osd_request to examine
|
||||
* @osi - Recievs a more detailed error report information (optional).
|
||||
* @silent - Do not print to dmsg (Even if enabled)
|
||||
* @bad_obj_list - Some commands act on multiple objects. Failed objects will
|
||||
* be recieved here (optional)
|
||||
* @max_obj - Size of @bad_obj_list.
|
||||
* @bad_attr_list - List of failing attributes (optional)
|
||||
* @max_attr - Size of @bad_attr_list.
|
||||
*
|
||||
* After execution, sense + return code can be analyzed using this function. The
|
||||
* return code is the final disposition on the error. So it is possible that a
|
||||
* CHECK_CONDITION was returned from target but this will return NO_ERROR, for
|
||||
* example on recovered errors. All parameters are optional if caller does
|
||||
* not need any returned information.
|
||||
* Note: This function will also dump the error to dmsg according to settings
|
||||
* of the SCSI_OSD_DPRINT_SENSE Kconfig value. Set @silent if you know the
|
||||
* command would routinely fail, to not spam the dmsg file.
|
||||
*/
|
||||
struct osd_sense_info {
|
||||
int key; /* one of enum scsi_sense_keys */
|
||||
int additional_code ; /* enum osd_additional_sense_codes */
|
||||
union { /* Sense specific information */
|
||||
u16 sense_info;
|
||||
u16 cdb_field_offset; /* scsi_invalid_field_in_cdb */
|
||||
};
|
||||
union { /* Command specific information */
|
||||
u64 command_info;
|
||||
};
|
||||
|
||||
u32 not_initiated_command_functions; /* osd_command_functions_bits */
|
||||
u32 completed_command_functions; /* osd_command_functions_bits */
|
||||
struct osd_obj_id obj;
|
||||
struct osd_attr attr;
|
||||
};
|
||||
|
||||
int osd_req_decode_sense_full(struct osd_request *or,
|
||||
struct osd_sense_info *osi, bool silent,
|
||||
struct osd_obj_id *bad_obj_list, int max_obj,
|
||||
struct osd_attr *bad_attr_list, int max_attr);
|
||||
|
||||
static inline int osd_req_decode_sense(struct osd_request *or,
|
||||
struct osd_sense_info *osi)
|
||||
{
|
||||
return osd_req_decode_sense_full(or, osi, false, NULL, 0, NULL, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* osd_end_request - return osd_request to free store
|
||||
*
|
||||
* @or: osd_request to free
|
||||
*
|
||||
* Deallocate all osd_request resources (struct req's, BIOs, buffers, etc.)
|
||||
*/
|
||||
void osd_end_request(struct osd_request *or);
|
||||
|
||||
/*
|
||||
* CDB Encoding
|
||||
*
|
||||
* Note: call only one of the following methods.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Device commands
|
||||
*/
|
||||
void osd_req_set_master_seed_xchg(struct osd_request *or, ...);/* NI */
|
||||
void osd_req_set_master_key(struct osd_request *or, ...);/* NI */
|
||||
|
||||
void osd_req_format(struct osd_request *or, u64 tot_capacity);
|
||||
|
||||
/* list all partitions
|
||||
* @list header must be initialized to zero on first run.
|
||||
*
|
||||
* Call osd_is_obj_list_done() to find if we got the complete list.
|
||||
*/
|
||||
int osd_req_list_dev_partitions(struct osd_request *or,
|
||||
osd_id initial_id, struct osd_obj_id_list *list, unsigned nelem);
|
||||
|
||||
void osd_req_flush_obsd(struct osd_request *or,
|
||||
enum osd_options_flush_scope_values);
|
||||
|
||||
void osd_req_perform_scsi_command(struct osd_request *or,
|
||||
const u8 *cdb, ...);/* NI */
|
||||
void osd_req_task_management(struct osd_request *or, ...);/* NI */
|
||||
|
||||
/*
|
||||
* Partition commands
|
||||
*/
|
||||
void osd_req_create_partition(struct osd_request *or, osd_id partition);
|
||||
void osd_req_remove_partition(struct osd_request *or, osd_id partition);
|
||||
|
||||
void osd_req_set_partition_key(struct osd_request *or,
|
||||
osd_id partition, u8 new_key_id[OSD_CRYPTO_KEYID_SIZE],
|
||||
u8 seed[OSD_CRYPTO_SEED_SIZE]);/* NI */
|
||||
|
||||
/* list all collections in the partition
|
||||
* @list header must be init to zero on first run.
|
||||
*
|
||||
* Call osd_is_obj_list_done() to find if we got the complete list.
|
||||
*/
|
||||
int osd_req_list_partition_collections(struct osd_request *or,
|
||||
osd_id partition, osd_id initial_id, struct osd_obj_id_list *list,
|
||||
unsigned nelem);
|
||||
|
||||
/* list all objects in the partition
|
||||
* @list header must be init to zero on first run.
|
||||
*
|
||||
* Call osd_is_obj_list_done() to find if we got the complete list.
|
||||
*/
|
||||
int osd_req_list_partition_objects(struct osd_request *or,
|
||||
osd_id partition, osd_id initial_id, struct osd_obj_id_list *list,
|
||||
unsigned nelem);
|
||||
|
||||
void osd_req_flush_partition(struct osd_request *or,
|
||||
osd_id partition, enum osd_options_flush_scope_values);
|
||||
|
||||
/*
|
||||
* Collection commands
|
||||
*/
|
||||
void osd_req_create_collection(struct osd_request *or,
|
||||
const struct osd_obj_id *);/* NI */
|
||||
void osd_req_remove_collection(struct osd_request *or,
|
||||
const struct osd_obj_id *);/* NI */
|
||||
|
||||
/* list all objects in the collection */
|
||||
int osd_req_list_collection_objects(struct osd_request *or,
|
||||
const struct osd_obj_id *, osd_id initial_id,
|
||||
struct osd_obj_id_list *list, unsigned nelem);
|
||||
|
||||
/* V2 only filtered list of objects in the collection */
|
||||
void osd_req_query(struct osd_request *or, ...);/* NI */
|
||||
|
||||
void osd_req_flush_collection(struct osd_request *or,
|
||||
const struct osd_obj_id *, enum osd_options_flush_scope_values);
|
||||
|
||||
void osd_req_get_member_attrs(struct osd_request *or, ...);/* V2-only NI */
|
||||
void osd_req_set_member_attrs(struct osd_request *or, ...);/* V2-only NI */
|
||||
|
||||
/*
|
||||
* Object commands
|
||||
*/
|
||||
void osd_req_create_object(struct osd_request *or, struct osd_obj_id *);
|
||||
void osd_req_remove_object(struct osd_request *or, struct osd_obj_id *);
|
||||
|
||||
void osd_req_write(struct osd_request *or,
|
||||
const struct osd_obj_id *, struct bio *data_out, u64 offset);
|
||||
void osd_req_append(struct osd_request *or,
|
||||
const struct osd_obj_id *, struct bio *data_out);/* NI */
|
||||
void osd_req_create_write(struct osd_request *or,
|
||||
const struct osd_obj_id *, struct bio *data_out, u64 offset);/* NI */
|
||||
void osd_req_clear(struct osd_request *or,
|
||||
const struct osd_obj_id *, u64 offset, u64 len);/* NI */
|
||||
void osd_req_punch(struct osd_request *or,
|
||||
const struct osd_obj_id *, u64 offset, u64 len);/* V2-only NI */
|
||||
|
||||
void osd_req_flush_object(struct osd_request *or,
|
||||
const struct osd_obj_id *, enum osd_options_flush_scope_values,
|
||||
/*V2*/ u64 offset, /*V2*/ u64 len);
|
||||
|
||||
void osd_req_read(struct osd_request *or,
|
||||
const struct osd_obj_id *, struct bio *data_in, u64 offset);
|
||||
|
||||
/*
|
||||
* Root/Partition/Collection/Object Attributes commands
|
||||
*/
|
||||
|
||||
/* get before set */
|
||||
void osd_req_get_attributes(struct osd_request *or, const struct osd_obj_id *);
|
||||
|
||||
/* set before get */
|
||||
void osd_req_set_attributes(struct osd_request *or, const struct osd_obj_id *);
|
||||
|
||||
/*
|
||||
* Attributes appended to most commands
|
||||
*/
|
||||
|
||||
/* Attributes List mode (or V2 CDB) */
|
||||
/*
|
||||
* TODO: In ver2 if at finalize time only one attr was set and no gets,
|
||||
* then the Attributes CDB mode is used automatically to save IO.
|
||||
*/
|
||||
|
||||
/* set a list of attributes. */
|
||||
int osd_req_add_set_attr_list(struct osd_request *or,
|
||||
const struct osd_attr *, unsigned nelem);
|
||||
|
||||
/* get a list of attributes */
|
||||
int osd_req_add_get_attr_list(struct osd_request *or,
|
||||
const struct osd_attr *, unsigned nelem);
|
||||
|
||||
/*
|
||||
* Attributes list decoding
|
||||
* Must be called after osd_request.request was executed
|
||||
* It is called in a loop to decode the returned get_attr
|
||||
* (see osd_add_get_attr)
|
||||
*/
|
||||
int osd_req_decode_get_attr_list(struct osd_request *or,
|
||||
struct osd_attr *, int *nelem, void **iterator);
|
||||
|
||||
/* Attributes Page mode */
|
||||
|
||||
/*
|
||||
* Read an attribute page and optionally set one attribute
|
||||
*
|
||||
* Retrieves the attribute page directly to a user buffer.
|
||||
* @attr_page_data shall stay valid until end of execution.
|
||||
* See osd_attributes.h for common page structures
|
||||
*/
|
||||
int osd_req_add_get_attr_page(struct osd_request *or,
|
||||
u32 page_id, void *attr_page_data, unsigned max_page_len,
|
||||
const struct osd_attr *set_one);
|
||||
|
||||
#endif /* __OSD_LIB_H__ */
|
||||
@@ -0,0 +1,579 @@
|
||||
/*
|
||||
* osd_protocol.h - OSD T10 standard C definitions.
|
||||
*
|
||||
* Copyright (C) 2008 Panasas Inc. All rights reserved.
|
||||
*
|
||||
* Authors:
|
||||
* Boaz Harrosh <bharrosh@panasas.com>
|
||||
* Benny Halevy <bhalevy@panasas.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2
|
||||
*
|
||||
* This file contains types and constants that are defined by the protocol
|
||||
* Note: All names and symbols are taken from the OSD standard's text.
|
||||
*/
|
||||
#ifndef __OSD_PROTOCOL_H__
|
||||
#define __OSD_PROTOCOL_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <scsi/scsi.h>
|
||||
|
||||
enum {
|
||||
OSDv1_ADDITIONAL_CDB_LENGTH = 192,
|
||||
OSDv1_TOTAL_CDB_LEN = OSDv1_ADDITIONAL_CDB_LENGTH + 8,
|
||||
OSDv1_CAP_LEN = 80,
|
||||
/* Latest supported version */
|
||||
/* OSD_ADDITIONAL_CDB_LENGTH = 216,*/
|
||||
OSD_ADDITIONAL_CDB_LENGTH =
|
||||
OSDv1_ADDITIONAL_CDB_LENGTH, /* FIXME: Pete rev-001 sup */
|
||||
OSD_TOTAL_CDB_LEN = OSD_ADDITIONAL_CDB_LENGTH + 8,
|
||||
/* OSD_CAP_LEN = 104,*/
|
||||
OSD_CAP_LEN = OSDv1_CAP_LEN,/* FIXME: Pete rev-001 sup */
|
||||
|
||||
OSD_SYSTEMID_LEN = 20,
|
||||
OSD_CRYPTO_KEYID_SIZE = 20,
|
||||
/*FIXME: OSDv2_CRYPTO_KEYID_SIZE = 32,*/
|
||||
OSD_CRYPTO_SEED_SIZE = 4,
|
||||
OSD_CRYPTO_NONCE_SIZE = 12,
|
||||
OSD_MAX_SENSE_LEN = 252, /* from SPC-3 */
|
||||
|
||||
OSD_PARTITION_FIRST_ID = 0x10000,
|
||||
OSD_OBJECT_FIRST_ID = 0x10000,
|
||||
};
|
||||
|
||||
/* (osd-r10 5.2.4)
|
||||
* osd2r03: 5.2.3 Caching control bits
|
||||
*/
|
||||
enum osd_options_byte {
|
||||
OSD_CDB_FUA = 0x08, /* Force Unit Access */
|
||||
OSD_CDB_DPO = 0x10, /* Disable Page Out */
|
||||
};
|
||||
|
||||
/*
|
||||
* osd2r03: 5.2.5 Isolation.
|
||||
* First 3 bits, V2-only.
|
||||
* Also for attr 110h "default isolation method" at Root Information page
|
||||
*/
|
||||
enum osd_options_byte_isolation {
|
||||
OSD_ISOLATION_DEFAULT = 0,
|
||||
OSD_ISOLATION_NONE = 1,
|
||||
OSD_ISOLATION_STRICT = 2,
|
||||
OSD_ISOLATION_RANGE = 4,
|
||||
OSD_ISOLATION_FUNCTIONAL = 5,
|
||||
OSD_ISOLATION_VENDOR = 7,
|
||||
};
|
||||
|
||||
/* (osd-r10: 6.7)
|
||||
* osd2r03: 6.8 FLUSH, FLUSH COLLECTION, FLUSH OSD, FLUSH PARTITION
|
||||
*/
|
||||
enum osd_options_flush_scope_values {
|
||||
OSD_CDB_FLUSH_ALL = 0,
|
||||
OSD_CDB_FLUSH_ATTR_ONLY = 1,
|
||||
|
||||
OSD_CDB_FLUSH_ALL_RECURSIVE = 2,
|
||||
/* V2-only */
|
||||
OSD_CDB_FLUSH_ALL_RANGE = 2,
|
||||
};
|
||||
|
||||
/* osd2r03: 5.2.10 Timestamps control */
|
||||
enum {
|
||||
OSD_CDB_NORMAL_TIMESTAMPS = 0,
|
||||
OSD_CDB_BYPASS_TIMESTAMPS = 0x7f,
|
||||
};
|
||||
|
||||
/* (osd-r10: 5.2.2.1)
|
||||
* osd2r03: 5.2.4.1 Get and set attributes CDB format selection
|
||||
* 2 bits at second nibble of command_specific_options byte
|
||||
*/
|
||||
enum osd_attributes_mode {
|
||||
/* V2-only */
|
||||
OSD_CDB_SET_ONE_ATTR = 0x10,
|
||||
|
||||
OSD_CDB_GET_ATTR_PAGE_SET_ONE = 0x20,
|
||||
OSD_CDB_GET_SET_ATTR_LISTS = 0x30,
|
||||
|
||||
OSD_CDB_GET_SET_ATTR_MASK = 0x30,
|
||||
};
|
||||
|
||||
/* (osd-r10: 4.12.5)
|
||||
* osd2r03: 4.14.5 Data-In and Data-Out buffer offsets
|
||||
* byte offset = mantissa * (2^(exponent+8))
|
||||
* struct {
|
||||
* unsigned mantissa: 28;
|
||||
* int exponent: 04;
|
||||
* }
|
||||
*/
|
||||
typedef __be32 __bitwise osd_cdb_offset;
|
||||
|
||||
enum {
|
||||
OSD_OFFSET_UNUSED = 0xFFFFFFFF,
|
||||
OSD_OFFSET_MAX_BITS = 28,
|
||||
|
||||
OSDv1_OFFSET_MIN_SHIFT = 8,
|
||||
OSD_OFFSET_MIN_SHIFT = 3,
|
||||
OSD_OFFSET_MAX_SHIFT = 16,
|
||||
};
|
||||
|
||||
/* Return the smallest allowed encoded offset that contains @offset.
|
||||
*
|
||||
* The actual encoded offset returned is @offset + *padding.
|
||||
* (up to max_shift, non-inclusive)
|
||||
*/
|
||||
osd_cdb_offset __osd_encode_offset(u64 offset, unsigned *padding,
|
||||
int min_shift, int max_shift);
|
||||
|
||||
/* Minimum alignment is 256 bytes
|
||||
* Note: Seems from std v1 that exponent can be from 0+8 to 0xE+8 (inclusive)
|
||||
* which is 8 to 23 but IBM code restricts it to 16, so be it.
|
||||
*/
|
||||
static inline osd_cdb_offset osd_encode_offset_v1(u64 offset, unsigned *padding)
|
||||
{
|
||||
return __osd_encode_offset(offset, padding,
|
||||
OSDv1_OFFSET_MIN_SHIFT, OSD_OFFSET_MAX_SHIFT);
|
||||
}
|
||||
|
||||
/* Minimum 8 bytes alignment
|
||||
* Same as v1 but since exponent can be signed than a less than
|
||||
* 256 alignment can be reached with small offsets (<2GB)
|
||||
*/
|
||||
static inline osd_cdb_offset osd_encode_offset_v2(u64 offset, unsigned *padding)
|
||||
{
|
||||
return __osd_encode_offset(offset, padding,
|
||||
OSD_OFFSET_MIN_SHIFT, OSD_OFFSET_MAX_SHIFT);
|
||||
}
|
||||
|
||||
/* osd2r03: 5.2.1 Overview */
|
||||
struct osd_cdb_head {
|
||||
struct scsi_varlen_cdb_hdr varlen_cdb;
|
||||
/*10*/ u8 options;
|
||||
u8 command_specific_options;
|
||||
u8 timestamp_control;
|
||||
/*13*/ u8 reserved1[3];
|
||||
/*16*/ __be64 partition;
|
||||
/*24*/ __be64 object;
|
||||
/*32*/ union { /* V1 vs V2 alignment differences */
|
||||
struct __osdv1_cdb_addr_len {
|
||||
/*32*/ __be32 list_identifier;/* Rarely used */
|
||||
/*36*/ __be64 length;
|
||||
/*44*/ __be64 start_address;
|
||||
} __packed v1;
|
||||
|
||||
struct __osdv2_cdb_addr_len {
|
||||
/* called allocation_length in some commands */
|
||||
/*32*/ __be64 length;
|
||||
/*40*/ __be64 start_address;
|
||||
/*48*/ __be32 list_identifier;/* Rarely used */
|
||||
} __packed v2;
|
||||
};
|
||||
/*52*/ union { /* selected attributes mode Page/List/Single */
|
||||
struct osd_attributes_page_mode {
|
||||
/*52*/ __be32 get_attr_page;
|
||||
/*56*/ __be32 get_attr_alloc_length;
|
||||
/*60*/ osd_cdb_offset get_attr_offset;
|
||||
|
||||
/*64*/ __be32 set_attr_page;
|
||||
/*68*/ __be32 set_attr_id;
|
||||
/*72*/ __be32 set_attr_length;
|
||||
/*76*/ osd_cdb_offset set_attr_offset;
|
||||
/*80*/ } __packed attrs_page;
|
||||
|
||||
struct osd_attributes_list_mode {
|
||||
/*52*/ __be32 get_attr_desc_bytes;
|
||||
/*56*/ osd_cdb_offset get_attr_desc_offset;
|
||||
|
||||
/*60*/ __be32 get_attr_alloc_length;
|
||||
/*64*/ osd_cdb_offset get_attr_offset;
|
||||
|
||||
/*68*/ __be32 set_attr_bytes;
|
||||
/*72*/ osd_cdb_offset set_attr_offset;
|
||||
__be32 not_used;
|
||||
/*80*/ } __packed attrs_list;
|
||||
|
||||
/* osd2r03:5.2.4.2 Set one attribute value using CDB fields */
|
||||
struct osd_attributes_cdb_mode {
|
||||
/*52*/ __be32 set_attr_page;
|
||||
/*56*/ __be32 set_attr_id;
|
||||
/*60*/ __be16 set_attr_len;
|
||||
/*62*/ u8 set_attr_val[18];
|
||||
/*80*/ } __packed attrs_cdb;
|
||||
/*52*/ u8 get_set_attributes_parameters[28];
|
||||
};
|
||||
} __packed;
|
||||
/*80*/
|
||||
|
||||
/*160 v1*/
|
||||
/*184 v2*/
|
||||
struct osd_security_parameters {
|
||||
/*160*/u8 integrity_check_value[OSD_CRYPTO_KEYID_SIZE];
|
||||
/*180*/u8 request_nonce[OSD_CRYPTO_NONCE_SIZE];
|
||||
/*192*/osd_cdb_offset data_in_integrity_check_offset;
|
||||
/*196*/osd_cdb_offset data_out_integrity_check_offset;
|
||||
} __packed;
|
||||
/*200 v1*/
|
||||
/*224 v2*/
|
||||
|
||||
/* FIXME: osdv2_security_parameters */
|
||||
|
||||
struct osdv1_cdb {
|
||||
struct osd_cdb_head h;
|
||||
u8 caps[OSDv1_CAP_LEN];
|
||||
struct osd_security_parameters sec_params;
|
||||
} __packed;
|
||||
|
||||
struct osdv2_cdb {
|
||||
struct osd_cdb_head h;
|
||||
u8 caps[OSD_CAP_LEN];
|
||||
struct osd_security_parameters sec_params;
|
||||
/* FIXME: osdv2_security_parameters */
|
||||
} __packed;
|
||||
|
||||
struct osd_cdb {
|
||||
union {
|
||||
struct osdv1_cdb v1;
|
||||
struct osdv2_cdb v2;
|
||||
u8 buff[OSD_TOTAL_CDB_LEN];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
static inline struct osd_cdb_head *osd_cdb_head(struct osd_cdb *ocdb)
|
||||
{
|
||||
return (struct osd_cdb_head *)ocdb->buff;
|
||||
}
|
||||
|
||||
/* define both version actions
|
||||
* Ex name = FORMAT_OSD we have OSD_ACT_FORMAT_OSD && OSDv1_ACT_FORMAT_OSD
|
||||
*/
|
||||
#define OSD_ACT___(Name, Num) \
|
||||
OSD_ACT_##Name = __constant_cpu_to_be16(0x8880 + Num), \
|
||||
OSDv1_ACT_##Name = __constant_cpu_to_be16(0x8800 + Num),
|
||||
|
||||
/* V2 only actions */
|
||||
#define OSD_ACT_V2(Name, Num) \
|
||||
OSD_ACT_##Name = __constant_cpu_to_be16(0x8880 + Num),
|
||||
|
||||
#define OSD_ACT_V1_V2(Name, Num1, Num2) \
|
||||
OSD_ACT_##Name = __constant_cpu_to_be16(Num2), \
|
||||
OSDv1_ACT_##Name = __constant_cpu_to_be16(Num1),
|
||||
|
||||
enum osd_service_actions {
|
||||
OSD_ACT_V2(OBJECT_STRUCTURE_CHECK, 0x00)
|
||||
OSD_ACT___(FORMAT_OSD, 0x01)
|
||||
OSD_ACT___(CREATE, 0x02)
|
||||
OSD_ACT___(LIST, 0x03)
|
||||
OSD_ACT_V2(PUNCH, 0x04)
|
||||
OSD_ACT___(READ, 0x05)
|
||||
OSD_ACT___(WRITE, 0x06)
|
||||
OSD_ACT___(APPEND, 0x07)
|
||||
OSD_ACT___(FLUSH, 0x08)
|
||||
OSD_ACT_V2(CLEAR, 0x09)
|
||||
OSD_ACT___(REMOVE, 0x0A)
|
||||
OSD_ACT___(CREATE_PARTITION, 0x0B)
|
||||
OSD_ACT___(REMOVE_PARTITION, 0x0C)
|
||||
OSD_ACT___(GET_ATTRIBUTES, 0x0E)
|
||||
OSD_ACT___(SET_ATTRIBUTES, 0x0F)
|
||||
OSD_ACT___(CREATE_AND_WRITE, 0x12)
|
||||
OSD_ACT___(CREATE_COLLECTION, 0x15)
|
||||
OSD_ACT___(REMOVE_COLLECTION, 0x16)
|
||||
OSD_ACT___(LIST_COLLECTION, 0x17)
|
||||
OSD_ACT___(SET_KEY, 0x18)
|
||||
OSD_ACT___(SET_MASTER_KEY, 0x19)
|
||||
OSD_ACT___(FLUSH_COLLECTION, 0x1A)
|
||||
OSD_ACT___(FLUSH_PARTITION, 0x1B)
|
||||
OSD_ACT___(FLUSH_OSD, 0x1C)
|
||||
|
||||
OSD_ACT_V2(QUERY, 0x20)
|
||||
OSD_ACT_V2(REMOVE_MEMBER_OBJECTS, 0x21)
|
||||
OSD_ACT_V2(GET_MEMBER_ATTRIBUTES, 0x22)
|
||||
OSD_ACT_V2(SET_MEMBER_ATTRIBUTES, 0x23)
|
||||
OSD_ACT_V2(READ_MAP, 0x31)
|
||||
|
||||
OSD_ACT_V1_V2(PERFORM_SCSI_COMMAND, 0x8F7E, 0x8F7C)
|
||||
OSD_ACT_V1_V2(SCSI_TASK_MANAGEMENT, 0x8F7F, 0x8F7D)
|
||||
/* 0x8F80 to 0x8FFF are Vendor specific */
|
||||
};
|
||||
|
||||
/* osd2r03: 7.1.3.2 List entry format for retrieving attributes */
|
||||
struct osd_attributes_list_attrid {
|
||||
__be32 attr_page;
|
||||
__be32 attr_id;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* osd2r03: 7.1.3.3 List entry format for retrieved attributes and
|
||||
* for setting attributes
|
||||
* NOTE: v2 is 8-bytes aligned, v1 is not aligned.
|
||||
*/
|
||||
struct osd_attributes_list_element {
|
||||
__be32 attr_page;
|
||||
__be32 attr_id;
|
||||
__be16 attr_bytes;
|
||||
u8 attr_val[0];
|
||||
} __packed;
|
||||
|
||||
enum {
|
||||
OSDv1_ATTRIBUTES_ELEM_ALIGN = 1,
|
||||
OSD_ATTRIBUTES_ELEM_ALIGN = 8,
|
||||
};
|
||||
|
||||
enum {
|
||||
OSD_ATTR_LIST_ALL_PAGES = 0xFFFFFFFF,
|
||||
OSD_ATTR_LIST_ALL_IN_PAGE = 0xFFFFFFFF,
|
||||
};
|
||||
|
||||
static inline unsigned osdv1_attr_list_elem_size(unsigned len)
|
||||
{
|
||||
return ALIGN(len + sizeof(struct osd_attributes_list_element),
|
||||
OSDv1_ATTRIBUTES_ELEM_ALIGN);
|
||||
}
|
||||
|
||||
static inline unsigned osdv2_attr_list_elem_size(unsigned len)
|
||||
{
|
||||
return ALIGN(len + sizeof(struct osd_attributes_list_element),
|
||||
OSD_ATTRIBUTES_ELEM_ALIGN);
|
||||
}
|
||||
|
||||
/*
|
||||
* osd2r03: 7.1.3 OSD attributes lists (Table 184) — List type values
|
||||
*/
|
||||
enum osd_attr_list_types {
|
||||
OSD_ATTR_LIST_GET = 0x1, /* descriptors only */
|
||||
OSD_ATTR_LIST_SET_RETRIEVE = 0x9, /*descriptors/values variable-length*/
|
||||
OSD_V2_ATTR_LIST_MULTIPLE = 0xE, /* ver2, Multiple Objects lists*/
|
||||
OSD_V1_ATTR_LIST_CREATE_MULTIPLE = 0xF,/*ver1, used by create_multple*/
|
||||
};
|
||||
|
||||
/* osd2r03: 7.1.3.4 Multi-object retrieved attributes format */
|
||||
struct osd_attributes_list_multi_header {
|
||||
__be64 object_id;
|
||||
u8 object_type; /* object_type enum below */
|
||||
u8 reserved[5];
|
||||
__be16 list_bytes;
|
||||
/* followed by struct osd_attributes_list_element's */
|
||||
};
|
||||
|
||||
struct osdv1_attributes_list_header {
|
||||
u8 type; /* low 4-bit only */
|
||||
u8 pad;
|
||||
__be16 list_bytes; /* Initiator shall set to Zero. Only set by target */
|
||||
/*
|
||||
* type=9 followed by struct osd_attributes_list_element's
|
||||
* type=E followed by struct osd_attributes_list_multi_header's
|
||||
*/
|
||||
} __packed;
|
||||
|
||||
static inline unsigned osdv1_list_size(struct osdv1_attributes_list_header *h)
|
||||
{
|
||||
return be16_to_cpu(h->list_bytes);
|
||||
}
|
||||
|
||||
struct osdv2_attributes_list_header {
|
||||
u8 type; /* lower 4-bits only */
|
||||
u8 pad[3];
|
||||
/*4*/ __be32 list_bytes; /* Initiator shall set to zero. Only set by target */
|
||||
/*
|
||||
* type=9 followed by struct osd_attributes_list_element's
|
||||
* type=E followed by struct osd_attributes_list_multi_header's
|
||||
*/
|
||||
} __packed;
|
||||
|
||||
static inline unsigned osdv2_list_size(struct osdv2_attributes_list_header *h)
|
||||
{
|
||||
return be32_to_cpu(h->list_bytes);
|
||||
}
|
||||
|
||||
/* (osd-r10 6.13)
|
||||
* osd2r03: 6.15 LIST (Table 79) LIST command parameter data.
|
||||
* for root_lstchg below
|
||||
*/
|
||||
enum {
|
||||
OSD_OBJ_ID_LIST_PAR = 0x1, /* V1-only. Not used in V2 */
|
||||
OSD_OBJ_ID_LIST_LSTCHG = 0x2,
|
||||
};
|
||||
|
||||
/*
|
||||
* osd2r03: 6.15.2 LIST command parameter data
|
||||
* (Also for LIST COLLECTION)
|
||||
*/
|
||||
struct osd_obj_id_list {
|
||||
__be64 list_bytes; /* bytes in list excluding list_bytes (-8) */
|
||||
__be64 continuation_id;
|
||||
__be32 list_identifier;
|
||||
u8 pad[3];
|
||||
u8 root_lstchg;
|
||||
__be64 object_ids[0];
|
||||
} __packed;
|
||||
|
||||
static inline bool osd_is_obj_list_done(struct osd_obj_id_list *list,
|
||||
bool *is_changed)
|
||||
{
|
||||
*is_changed = (0 != (list->root_lstchg & OSD_OBJ_ID_LIST_LSTCHG));
|
||||
return 0 != list->continuation_id;
|
||||
}
|
||||
|
||||
/*
|
||||
* osd2r03: 4.12.4.5 The ALLDATA security method
|
||||
*/
|
||||
struct osd_data_out_integrity_info {
|
||||
__be64 data_bytes;
|
||||
__be64 set_attributes_bytes;
|
||||
__be64 get_attributes_bytes;
|
||||
__be64 integrity_check_value;
|
||||
} __packed;
|
||||
|
||||
struct osd_data_in_integrity_info {
|
||||
__be64 data_bytes;
|
||||
__be64 retrieved_attributes_bytes;
|
||||
__be64 integrity_check_value;
|
||||
} __packed;
|
||||
|
||||
struct osd_timestamp {
|
||||
u8 time[6]; /* number of milliseconds since 1/1/1970 UT (big endian) */
|
||||
} __packed;
|
||||
/* FIXME: define helper functions to convert to/from osd time format */
|
||||
|
||||
/*
|
||||
* Capability & Security definitions
|
||||
* osd2r03: 4.11.2.2 Capability format
|
||||
* osd2r03: 5.2.8 Security parameters
|
||||
*/
|
||||
|
||||
struct osd_key_identifier {
|
||||
u8 id[7]; /* if you know why 7 please email bharrosh@panasas.com */
|
||||
} __packed;
|
||||
|
||||
/* for osd_capability.format */
|
||||
enum {
|
||||
OSD_SEC_CAP_FORMAT_NO_CAPS = 0,
|
||||
OSD_SEC_CAP_FORMAT_VER1 = 1,
|
||||
OSD_SEC_CAP_FORMAT_VER2 = 2,
|
||||
};
|
||||
|
||||
/* security_method */
|
||||
enum {
|
||||
OSD_SEC_NOSEC = 0,
|
||||
OSD_SEC_CAPKEY = 1,
|
||||
OSD_SEC_CMDRSP = 2,
|
||||
OSD_SEC_ALLDATA = 3,
|
||||
};
|
||||
|
||||
enum object_type {
|
||||
OSD_SEC_OBJ_ROOT = 0x1,
|
||||
OSD_SEC_OBJ_PARTITION = 0x2,
|
||||
OSD_SEC_OBJ_COLLECTION = 0x40,
|
||||
OSD_SEC_OBJ_USER = 0x80,
|
||||
};
|
||||
|
||||
enum osd_capability_bit_masks {
|
||||
OSD_SEC_CAP_APPEND = BIT(0),
|
||||
OSD_SEC_CAP_OBJ_MGMT = BIT(1),
|
||||
OSD_SEC_CAP_REMOVE = BIT(2),
|
||||
OSD_SEC_CAP_CREATE = BIT(3),
|
||||
OSD_SEC_CAP_SET_ATTR = BIT(4),
|
||||
OSD_SEC_CAP_GET_ATTR = BIT(5),
|
||||
OSD_SEC_CAP_WRITE = BIT(6),
|
||||
OSD_SEC_CAP_READ = BIT(7),
|
||||
|
||||
OSD_SEC_CAP_NONE1 = BIT(8),
|
||||
OSD_SEC_CAP_NONE2 = BIT(9),
|
||||
OSD_SEC_CAP_NONE3 = BIT(10),
|
||||
OSD_SEC_CAP_QUERY = BIT(11), /*v2 only*/
|
||||
OSD_SEC_CAP_M_OBJECT = BIT(12), /*v2 only*/
|
||||
OSD_SEC_CAP_POL_SEC = BIT(13),
|
||||
OSD_SEC_CAP_GLOBAL = BIT(14),
|
||||
OSD_SEC_CAP_DEV_MGMT = BIT(15),
|
||||
};
|
||||
|
||||
/* for object_descriptor_type (hi nibble used) */
|
||||
enum {
|
||||
OSD_SEC_OBJ_DESC_NONE = 0, /* Not allowed */
|
||||
OSD_SEC_OBJ_DESC_OBJ = 1 << 4, /* v1: also collection */
|
||||
OSD_SEC_OBJ_DESC_PAR = 2 << 4, /* also root */
|
||||
OSD_SEC_OBJ_DESC_COL = 3 << 4, /* v2 only */
|
||||
};
|
||||
|
||||
/* (osd-r10:4.9.2.2)
|
||||
* osd2r03:4.11.2.2 Capability format
|
||||
*/
|
||||
struct osd_capability_head {
|
||||
u8 format; /* low nibble */
|
||||
u8 integrity_algorithm__key_version; /* MAKE_BYTE(integ_alg, key_ver) */
|
||||
u8 security_method;
|
||||
u8 reserved1;
|
||||
/*04*/ struct osd_timestamp expiration_time;
|
||||
/*10*/ u8 audit[20];
|
||||
/*30*/ u8 discriminator[12];
|
||||
/*42*/ struct osd_timestamp object_created_time;
|
||||
/*48*/ u8 object_type;
|
||||
/*49*/ u8 permissions_bit_mask[5];
|
||||
/*54*/ u8 reserved2;
|
||||
/*55*/ u8 object_descriptor_type; /* high nibble */
|
||||
} __packed;
|
||||
|
||||
/*56 v1*/
|
||||
struct osdv1_cap_object_descriptor {
|
||||
union {
|
||||
struct {
|
||||
/*56*/ __be32 policy_access_tag;
|
||||
/*60*/ __be64 allowed_partition_id;
|
||||
/*68*/ __be64 allowed_object_id;
|
||||
/*76*/ __be32 reserved;
|
||||
} __packed obj_desc;
|
||||
|
||||
/*56*/ u8 object_descriptor[24];
|
||||
};
|
||||
} __packed;
|
||||
/*80 v1*/
|
||||
|
||||
/*56 v2*/
|
||||
struct osd_cap_object_descriptor {
|
||||
union {
|
||||
struct {
|
||||
/*56*/ __be32 allowed_attributes_access;
|
||||
/*60*/ __be32 policy_access_tag;
|
||||
/*64*/ __be16 boot_epoch;
|
||||
/*66*/ u8 reserved[6];
|
||||
/*72*/ __be64 allowed_partition_id;
|
||||
/*80*/ __be64 allowed_object_id;
|
||||
/*88*/ __be64 allowed_range_length;
|
||||
/*96*/ __be64 allowed_range_start;
|
||||
} __packed obj_desc;
|
||||
|
||||
/*56*/ u8 object_descriptor[48];
|
||||
};
|
||||
} __packed;
|
||||
/*104 v2*/
|
||||
|
||||
struct osdv1_capability {
|
||||
struct osd_capability_head h;
|
||||
struct osdv1_cap_object_descriptor od;
|
||||
} __packed;
|
||||
|
||||
struct osd_capability {
|
||||
struct osd_capability_head h;
|
||||
/* struct osd_cap_object_descriptor od;*/
|
||||
struct osdv1_cap_object_descriptor od; /* FIXME: Pete rev-001 sup */
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* osd_sec_set_caps - set cap-bits into the capabilities header
|
||||
*
|
||||
* @cap: The osd_capability_head to set cap bits to.
|
||||
* @bit_mask: Use an ORed list of enum osd_capability_bit_masks values
|
||||
*
|
||||
* permissions_bit_mask is unaligned use below to set into caps
|
||||
* in a version independent way
|
||||
*/
|
||||
static inline void osd_sec_set_caps(struct osd_capability_head *cap,
|
||||
u16 bit_mask)
|
||||
{
|
||||
/*
|
||||
*Note: The bits above are defined LE order this is because this way
|
||||
* they can grow in the future to more then 16, and still retain
|
||||
* there constant values.
|
||||
*/
|
||||
put_unaligned_le16(bit_mask, &cap->permissions_bit_mask);
|
||||
}
|
||||
|
||||
#endif /* ndef __OSD_PROTOCOL_H__ */
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* osd_sec.h - OSD security manager API
|
||||
*
|
||||
* Copyright (C) 2008 Panasas Inc. All rights reserved.
|
||||
*
|
||||
* Authors:
|
||||
* Boaz Harrosh <bharrosh@panasas.com>
|
||||
* Benny Halevy <bhalevy@panasas.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2
|
||||
*
|
||||
*/
|
||||
#ifndef __OSD_SEC_H__
|
||||
#define __OSD_SEC_H__
|
||||
|
||||
#include "osd_protocol.h"
|
||||
#include "osd_types.h"
|
||||
|
||||
/*
|
||||
* Contains types and constants of osd capabilities and security
|
||||
* encoding/decoding.
|
||||
* API is trying to keep security abstract so initiator of an object
|
||||
* based pNFS client knows as little as possible about security and
|
||||
* capabilities. It is the Server's osd-initiator place to know more.
|
||||
* Also can be used by osd-target.
|
||||
*/
|
||||
void osd_sec_encode_caps(void *caps, ...);/* NI */
|
||||
void osd_sec_init_nosec_doall_caps(void *caps,
|
||||
const struct osd_obj_id *obj, bool is_collection, const bool is_v1);
|
||||
|
||||
bool osd_is_sec_alldata(struct osd_security_parameters *sec_params);
|
||||
|
||||
/* Conditionally sign the CDB according to security setting in ocdb
|
||||
* with cap_key */
|
||||
void osd_sec_sign_cdb(struct osd_cdb *ocdb, const u8 *cap_key);
|
||||
|
||||
/* Unconditionally sign the BIO data with cap_key.
|
||||
* Check for osd_is_sec_alldata() was done prior to calling this. */
|
||||
void osd_sec_sign_data(void *data_integ, struct bio *bio, const u8 *cap_key);
|
||||
|
||||
/* Version independent copy of caps into the cdb */
|
||||
void osd_set_caps(struct osd_cdb *cdb, const void *caps);
|
||||
|
||||
#endif /* ndef __OSD_SEC_H__ */
|
||||
@@ -0,0 +1,260 @@
|
||||
/*
|
||||
* osd_sense.h - OSD Related sense handling definitions.
|
||||
*
|
||||
* Copyright (C) 2008 Panasas Inc. All rights reserved.
|
||||
*
|
||||
* Authors:
|
||||
* Boaz Harrosh <bharrosh@panasas.com>
|
||||
* Benny Halevy <bhalevy@panasas.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2
|
||||
*
|
||||
* This file contains types and constants that are defined by the protocol
|
||||
* Note: All names and symbols are taken from the OSD standard's text.
|
||||
*/
|
||||
#ifndef __OSD_SENSE_H__
|
||||
#define __OSD_SENSE_H__
|
||||
|
||||
#include <scsi/osd_protocol.h>
|
||||
|
||||
/* SPC3r23 4.5.6 Sense key and sense code definitions table 27 */
|
||||
enum scsi_sense_keys {
|
||||
scsi_sk_no_sense = 0x0,
|
||||
scsi_sk_recovered_error = 0x1,
|
||||
scsi_sk_not_ready = 0x2,
|
||||
scsi_sk_medium_error = 0x3,
|
||||
scsi_sk_hardware_error = 0x4,
|
||||
scsi_sk_illegal_request = 0x5,
|
||||
scsi_sk_unit_attention = 0x6,
|
||||
scsi_sk_data_protect = 0x7,
|
||||
scsi_sk_blank_check = 0x8,
|
||||
scsi_sk_vendor_specific = 0x9,
|
||||
scsi_sk_copy_aborted = 0xa,
|
||||
scsi_sk_aborted_command = 0xb,
|
||||
scsi_sk_volume_overflow = 0xd,
|
||||
scsi_sk_miscompare = 0xe,
|
||||
scsi_sk_reserved = 0xf,
|
||||
};
|
||||
|
||||
/* SPC3r23 4.5.6 Sense key and sense code definitions table 28 */
|
||||
/* Note: only those which can be returned by an OSD target. Most of
|
||||
* these errors are taken care of by the generic scsi layer.
|
||||
*/
|
||||
enum osd_additional_sense_codes {
|
||||
scsi_no_additional_sense_information = 0x0000,
|
||||
scsi_operation_in_progress = 0x0016,
|
||||
scsi_cleaning_requested = 0x0017,
|
||||
scsi_lunr_cause_not_reportable = 0x0400,
|
||||
scsi_logical_unit_is_in_process_of_becoming_ready = 0x0401,
|
||||
scsi_lunr_initializing_command_required = 0x0402,
|
||||
scsi_lunr_manual_intervention_required = 0x0403,
|
||||
scsi_lunr_operation_in_progress = 0x0407,
|
||||
scsi_lunr_selftest_in_progress = 0x0409,
|
||||
scsi_luna_asymmetric_access_state_transition = 0x040a,
|
||||
scsi_luna_target_port_in_standby_state = 0x040b,
|
||||
scsi_luna_target_port_in_unavailable_state = 0x040c,
|
||||
scsi_lunr_notify_enable_spinup_required = 0x0411,
|
||||
scsi_logical_unit_does_not_respond_to_selection = 0x0500,
|
||||
scsi_logical_unit_communication_failure = 0x0800,
|
||||
scsi_logical_unit_communication_timeout = 0x0801,
|
||||
scsi_logical_unit_communication_parity_error = 0x0802,
|
||||
scsi_error_log_overflow = 0x0a00,
|
||||
scsi_warning = 0x0b00,
|
||||
scsi_warning_specified_temperature_exceeded = 0x0b01,
|
||||
scsi_warning_enclosure_degraded = 0x0b02,
|
||||
scsi_write_error_unexpected_unsolicited_data = 0x0c0c,
|
||||
scsi_write_error_not_enough_unsolicited_data = 0x0c0d,
|
||||
scsi_invalid_information_unit = 0x0e00,
|
||||
scsi_invalid_field_in_command_information_unit = 0x0e03,
|
||||
scsi_read_error_failed_retransmission_request = 0x1113,
|
||||
scsi_parameter_list_length_error = 0x1a00,
|
||||
scsi_invalid_command_operation_code = 0x2000,
|
||||
scsi_invalid_field_in_cdb = 0x2400,
|
||||
osd_security_audit_value_frozen = 0x2404,
|
||||
osd_security_working_key_frozen = 0x2405,
|
||||
osd_nonce_not_unique = 0x2406,
|
||||
osd_nonce_timestamp_out_of_range = 0x2407,
|
||||
scsi_logical_unit_not_supported = 0x2500,
|
||||
scsi_invalid_field_in_parameter_list = 0x2600,
|
||||
scsi_parameter_not_supported = 0x2601,
|
||||
scsi_parameter_value_invalid = 0x2602,
|
||||
scsi_invalid_release_of_persistent_reservation = 0x2604,
|
||||
osd_invalid_dataout_buffer_integrity_check_value = 0x260f,
|
||||
scsi_not_ready_to_ready_change_medium_may_have_changed = 0x2800,
|
||||
scsi_power_on_reset_or_bus_device_reset_occurred = 0x2900,
|
||||
scsi_power_on_occurred = 0x2901,
|
||||
scsi_scsi_bus_reset_occurred = 0x2902,
|
||||
scsi_bus_device_reset_function_occurred = 0x2903,
|
||||
scsi_device_internal_reset = 0x2904,
|
||||
scsi_transceiver_mode_changed_to_single_ended = 0x2905,
|
||||
scsi_transceiver_mode_changed_to_lvd = 0x2906,
|
||||
scsi_i_t_nexus_loss_occurred = 0x2907,
|
||||
scsi_parameters_changed = 0x2a00,
|
||||
scsi_mode_parameters_changed = 0x2a01,
|
||||
scsi_asymmetric_access_state_changed = 0x2a06,
|
||||
scsi_priority_changed = 0x2a08,
|
||||
scsi_command_sequence_error = 0x2c00,
|
||||
scsi_previous_busy_status = 0x2c07,
|
||||
scsi_previous_task_set_full_status = 0x2c08,
|
||||
scsi_previous_reservation_conflict_status = 0x2c09,
|
||||
osd_partition_or_collection_contains_user_objects = 0x2c0a,
|
||||
scsi_commands_cleared_by_another_initiator = 0x2f00,
|
||||
scsi_cleaning_failure = 0x3007,
|
||||
scsi_enclosure_failure = 0x3400,
|
||||
scsi_enclosure_services_failure = 0x3500,
|
||||
scsi_unsupported_enclosure_function = 0x3501,
|
||||
scsi_enclosure_services_unavailable = 0x3502,
|
||||
scsi_enclosure_services_transfer_failure = 0x3503,
|
||||
scsi_enclosure_services_transfer_refused = 0x3504,
|
||||
scsi_enclosure_services_checksum_error = 0x3505,
|
||||
scsi_rounded_parameter = 0x3700,
|
||||
osd_read_past_end_of_user_object = 0x3b17,
|
||||
scsi_logical_unit_has_not_self_configured_yet = 0x3e00,
|
||||
scsi_logical_unit_failure = 0x3e01,
|
||||
scsi_timeout_on_logical_unit = 0x3e02,
|
||||
scsi_logical_unit_failed_selftest = 0x3e03,
|
||||
scsi_logical_unit_unable_to_update_selftest_log = 0x3e04,
|
||||
scsi_target_operating_conditions_have_changed = 0x3f00,
|
||||
scsi_microcode_has_been_changed = 0x3f01,
|
||||
scsi_inquiry_data_has_changed = 0x3f03,
|
||||
scsi_echo_buffer_overwritten = 0x3f0f,
|
||||
scsi_diagnostic_failure_on_component_nn_first = 0x4080,
|
||||
scsi_diagnostic_failure_on_component_nn_last = 0x40ff,
|
||||
scsi_message_error = 0x4300,
|
||||
scsi_internal_target_failure = 0x4400,
|
||||
scsi_select_or_reselect_failure = 0x4500,
|
||||
scsi_scsi_parity_error = 0x4700,
|
||||
scsi_data_phase_crc_error_detected = 0x4701,
|
||||
scsi_scsi_parity_error_detected_during_st_data_phase = 0x4702,
|
||||
scsi_asynchronous_information_protection_error_detected = 0x4704,
|
||||
scsi_protocol_service_crc_error = 0x4705,
|
||||
scsi_phy_test_function_in_progress = 0x4706,
|
||||
scsi_invalid_message_error = 0x4900,
|
||||
scsi_command_phase_error = 0x4a00,
|
||||
scsi_data_phase_error = 0x4b00,
|
||||
scsi_logical_unit_failed_self_configuration = 0x4c00,
|
||||
scsi_overlapped_commands_attempted = 0x4e00,
|
||||
osd_quota_error = 0x5507,
|
||||
scsi_failure_prediction_threshold_exceeded = 0x5d00,
|
||||
scsi_failure_prediction_threshold_exceeded_false = 0x5dff,
|
||||
scsi_voltage_fault = 0x6500,
|
||||
};
|
||||
|
||||
enum scsi_descriptor_types {
|
||||
scsi_sense_information = 0x0,
|
||||
scsi_sense_command_specific_information = 0x1,
|
||||
scsi_sense_key_specific = 0x2,
|
||||
scsi_sense_field_replaceable_unit = 0x3,
|
||||
scsi_sense_stream_commands = 0x4,
|
||||
scsi_sense_block_commands = 0x5,
|
||||
osd_sense_object_identification = 0x6,
|
||||
osd_sense_response_integrity_check = 0x7,
|
||||
osd_sense_attribute_identification = 0x8,
|
||||
scsi_sense_ata_return = 0x9,
|
||||
|
||||
scsi_sense_Reserved_first = 0x0A,
|
||||
scsi_sense_Reserved_last = 0x7F,
|
||||
scsi_sense_Vendor_specific_first = 0x80,
|
||||
scsi_sense_Vendor_specific_last = 0xFF,
|
||||
};
|
||||
|
||||
struct scsi_sense_descriptor { /* for picking into desc type */
|
||||
u8 descriptor_type; /* one of enum scsi_descriptor_types */
|
||||
u8 additional_length; /* n - 1 */
|
||||
u8 data[];
|
||||
} __packed;
|
||||
|
||||
/* OSD deploys only scsi descriptor_based sense buffers */
|
||||
struct scsi_sense_descriptor_based {
|
||||
/*0*/ u8 response_code; /* 0x72 or 0x73 */
|
||||
/*1*/ u8 sense_key; /* one of enum scsi_sense_keys (4 lower bits) */
|
||||
/*2*/ __be16 additional_sense_code; /* enum osd_additional_sense_codes */
|
||||
/*4*/ u8 Reserved[3];
|
||||
/*7*/ u8 additional_sense_length; /* n - 7 */
|
||||
/*8*/ struct scsi_sense_descriptor ssd[0]; /* variable length, 1 or more */
|
||||
} __packed;
|
||||
|
||||
/* some descriptors deployed by OSD */
|
||||
|
||||
/* SPC3r23 4.5.2.3 Command-specific information sense data descriptor */
|
||||
/* Note: this is the same for descriptor_type=00 but with type=00 the
|
||||
* Reserved[0] == 0x80 (ie. bit-7 set)
|
||||
*/
|
||||
struct scsi_sense_command_specific_data_descriptor {
|
||||
/*0*/ u8 descriptor_type; /* (00h/01h) */
|
||||
/*1*/ u8 additional_length; /* (0Ah) */
|
||||
/*2*/ u8 Reserved[2];
|
||||
/*4*/ __be64 information;
|
||||
} __packed;
|
||||
/*12*/
|
||||
|
||||
struct scsi_sense_key_specific_data_descriptor {
|
||||
/*0*/ u8 descriptor_type; /* (02h) */
|
||||
/*1*/ u8 additional_length; /* (06h) */
|
||||
/*2*/ u8 Reserved[2];
|
||||
/* SKSV, C/D, Reserved (2), BPV, BIT POINTER (3) */
|
||||
/*4*/ u8 sksv_cd_bpv_bp;
|
||||
/*5*/ __be16 value; /* field-pointer/progress-value/retry-count/... */
|
||||
/*7*/ u8 Reserved2;
|
||||
} __packed;
|
||||
/*8*/
|
||||
|
||||
/* 4.16.2.1 OSD error identification sense data descriptor - table 52 */
|
||||
/* Note: these bits are defined LE order for easy definition, this way the BIT()
|
||||
* number is the same as in the documentation. Below members at
|
||||
* osd_sense_identification_data_descriptor are therefore defined __le32.
|
||||
*/
|
||||
enum osd_command_functions_bits {
|
||||
OSD_CFB_COMMAND = BIT(4),
|
||||
OSD_CFB_CMD_CAP_VERIFIED = BIT(5),
|
||||
OSD_CFB_VALIDATION = BIT(7),
|
||||
OSD_CFB_IMP_ST_ATT = BIT(12),
|
||||
OSD_CFB_SET_ATT = BIT(20),
|
||||
OSD_CFB_SA_CAP_VERIFIED = BIT(21),
|
||||
OSD_CFB_GET_ATT = BIT(28),
|
||||
OSD_CFB_GA_CAP_VERIFIED = BIT(29),
|
||||
};
|
||||
|
||||
struct osd_sense_identification_data_descriptor {
|
||||
/*0*/ u8 descriptor_type; /* (06h) */
|
||||
/*1*/ u8 additional_length; /* (1Eh) */
|
||||
/*2*/ u8 Reserved[6];
|
||||
/*8*/ __le32 not_initiated_functions; /*osd_command_functions_bits*/
|
||||
/*12*/ __le32 completed_functions; /*osd_command_functions_bits*/
|
||||
/*16*/ __be64 partition_id;
|
||||
/*24*/ __be64 object_id;
|
||||
} __packed;
|
||||
/*32*/
|
||||
|
||||
struct osd_sense_response_integrity_check_descriptor {
|
||||
/*0*/ u8 descriptor_type; /* (07h) */
|
||||
/*1*/ u8 additional_length; /* (20h) */
|
||||
/*2*/ u8 integrity_check_value[32]; /*FIXME: OSDv2_CRYPTO_KEYID_SIZE*/
|
||||
} __packed;
|
||||
/*34*/
|
||||
|
||||
struct osd_sense_attributes_data_descriptor {
|
||||
/*0*/ u8 descriptor_type; /* (08h) */
|
||||
/*1*/ u8 additional_length; /* (n-2) */
|
||||
/*2*/ u8 Reserved[6];
|
||||
struct osd_sense_attr {
|
||||
/*8*/ __be32 attr_page;
|
||||
/*12*/ __be32 attr_id;
|
||||
/*16*/ } sense_attrs[0]; /* 1 or more */
|
||||
} __packed;
|
||||
/*variable*/
|
||||
|
||||
/* Dig into scsi_sk_illegal_request/scsi_invalid_field_in_cdb errors */
|
||||
|
||||
/*FIXME: Support also field in CAPS*/
|
||||
#define OSD_CDB_OFFSET(F) offsetof(struct osd_cdb_head, F)
|
||||
|
||||
enum osdv2_cdb_field_offset {
|
||||
OSDv1_CFO_STARTING_BYTE = OSD_CDB_OFFSET(v1.start_address),
|
||||
OSD_CFO_STARTING_BYTE = OSD_CDB_OFFSET(v2.start_address),
|
||||
OSD_CFO_PARTITION_ID = OSD_CDB_OFFSET(partition),
|
||||
OSD_CFO_OBJECT_ID = OSD_CDB_OFFSET(object),
|
||||
};
|
||||
|
||||
#endif /* ndef __OSD_SENSE_H__ */
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* osd_types.h - Types and constants which are not part of the protocol.
|
||||
*
|
||||
* Copyright (C) 2008 Panasas Inc. All rights reserved.
|
||||
*
|
||||
* Authors:
|
||||
* Boaz Harrosh <bharrosh@panasas.com>
|
||||
* Benny Halevy <bhalevy@panasas.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2
|
||||
*
|
||||
* Contains types and constants that are implementation specific and are
|
||||
* used by more than one part of the osd library.
|
||||
* (Eg initiator/target/security_manager/...)
|
||||
*/
|
||||
#ifndef __OSD_TYPES_H__
|
||||
#define __OSD_TYPES_H__
|
||||
|
||||
struct osd_systemid {
|
||||
u8 data[OSD_SYSTEMID_LEN];
|
||||
};
|
||||
|
||||
typedef u64 __bitwise osd_id;
|
||||
|
||||
struct osd_obj_id {
|
||||
osd_id partition;
|
||||
osd_id id;
|
||||
};
|
||||
|
||||
static const struct __weak osd_obj_id osd_root_object = {0, 0};
|
||||
|
||||
struct osd_attr {
|
||||
u32 attr_page;
|
||||
u32 attr_id;
|
||||
u16 len; /* byte count of operand */
|
||||
void *val_ptr; /* in network order */
|
||||
};
|
||||
|
||||
#endif /* ndef __OSD_TYPES_H__ */
|
||||
+3
-28
@@ -9,7 +9,8 @@
|
||||
#define _SCSI_SCSI_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
|
||||
struct scsi_cmnd;
|
||||
|
||||
/*
|
||||
* The maximum number of SG segments that we will put inside a
|
||||
@@ -263,6 +264,7 @@ static inline int scsi_status_is_good(int status)
|
||||
#define TYPE_RAID 0x0c
|
||||
#define TYPE_ENCLOSURE 0x0d /* Enclosure Services Device */
|
||||
#define TYPE_RBC 0x0e
|
||||
#define TYPE_OSD 0x11
|
||||
#define TYPE_NO_LUN 0x7f
|
||||
|
||||
/* SCSI protocols; these are taken from SPC-3 section 7.5 */
|
||||
@@ -402,16 +404,6 @@ static inline int scsi_is_wlun(unsigned int lun)
|
||||
#define DRIVER_HARD 0x07
|
||||
#define DRIVER_SENSE 0x08
|
||||
|
||||
#define SUGGEST_RETRY 0x10
|
||||
#define SUGGEST_ABORT 0x20
|
||||
#define SUGGEST_REMAP 0x30
|
||||
#define SUGGEST_DIE 0x40
|
||||
#define SUGGEST_SENSE 0x80
|
||||
#define SUGGEST_IS_OK 0xff
|
||||
|
||||
#define DRIVER_MASK 0x0f
|
||||
#define SUGGEST_MASK 0xf0
|
||||
|
||||
/*
|
||||
* Internal return values.
|
||||
*/
|
||||
@@ -447,23 +439,6 @@ static inline int scsi_is_wlun(unsigned int lun)
|
||||
#define msg_byte(result) (((result) >> 8) & 0xff)
|
||||
#define host_byte(result) (((result) >> 16) & 0xff)
|
||||
#define driver_byte(result) (((result) >> 24) & 0xff)
|
||||
#define suggestion(result) (driver_byte(result) & SUGGEST_MASK)
|
||||
|
||||
static inline void set_msg_byte(struct scsi_cmnd *cmd, char status)
|
||||
{
|
||||
cmd->result |= status << 8;
|
||||
}
|
||||
|
||||
static inline void set_host_byte(struct scsi_cmnd *cmd, char status)
|
||||
{
|
||||
cmd->result |= status << 16;
|
||||
}
|
||||
|
||||
static inline void set_driver_byte(struct scsi_cmnd *cmd, char status)
|
||||
{
|
||||
cmd->result |= status << 24;
|
||||
}
|
||||
|
||||
|
||||
#define sense_class(sense) (((sense) >> 4) & 0x7)
|
||||
#define sense_error(sense) ((sense) & 0xf)
|
||||
|
||||
@@ -291,4 +291,19 @@ static inline struct scsi_data_buffer *scsi_prot(struct scsi_cmnd *cmd)
|
||||
#define scsi_for_each_prot_sg(cmd, sg, nseg, __i) \
|
||||
for_each_sg(scsi_prot_sglist(cmd), sg, nseg, __i)
|
||||
|
||||
static inline void set_msg_byte(struct scsi_cmnd *cmd, char status)
|
||||
{
|
||||
cmd->result |= status << 8;
|
||||
}
|
||||
|
||||
static inline void set_host_byte(struct scsi_cmnd *cmd, char status)
|
||||
{
|
||||
cmd->result |= status << 16;
|
||||
}
|
||||
|
||||
static inline void set_driver_byte(struct scsi_cmnd *cmd, char status)
|
||||
{
|
||||
cmd->result |= status << 24;
|
||||
}
|
||||
|
||||
#endif /* _SCSI_SCSI_CMND_H */
|
||||
|
||||
@@ -340,6 +340,7 @@ extern int scsi_mode_select(struct scsi_device *sdev, int pf, int sp,
|
||||
struct scsi_sense_hdr *);
|
||||
extern int scsi_test_unit_ready(struct scsi_device *sdev, int timeout,
|
||||
int retries, struct scsi_sense_hdr *sshdr);
|
||||
extern unsigned char *scsi_get_vpd_page(struct scsi_device *, u8 page);
|
||||
extern int scsi_device_set_state(struct scsi_device *sdev,
|
||||
enum scsi_device_state state);
|
||||
extern struct scsi_event *sdev_evt_alloc(enum scsi_device_event evt_type,
|
||||
@@ -370,12 +371,6 @@ extern int scsi_execute_req(struct scsi_device *sdev, const unsigned char *cmd,
|
||||
int data_direction, void *buffer, unsigned bufflen,
|
||||
struct scsi_sense_hdr *, int timeout, int retries,
|
||||
int *resid);
|
||||
extern int scsi_execute_async(struct scsi_device *sdev,
|
||||
const unsigned char *cmd, int cmd_len, int data_direction,
|
||||
void *buffer, unsigned bufflen, int use_sg,
|
||||
int timeout, int retries, void *privdata,
|
||||
void (*done)(void *, char *, int, int),
|
||||
gfp_t gfp);
|
||||
|
||||
static inline int __must_check scsi_device_reprobe(struct scsi_device *sdev)
|
||||
{
|
||||
@@ -400,7 +395,8 @@ static inline unsigned int sdev_id(struct scsi_device *sdev)
|
||||
*/
|
||||
static inline int scsi_device_online(struct scsi_device *sdev)
|
||||
{
|
||||
return sdev->sdev_state != SDEV_OFFLINE;
|
||||
return (sdev->sdev_state != SDEV_OFFLINE &&
|
||||
sdev->sdev_state != SDEV_DEL);
|
||||
}
|
||||
static inline int scsi_device_blocked(struct scsi_device *sdev)
|
||||
{
|
||||
|
||||
@@ -88,7 +88,7 @@ struct iscsi_transport {
|
||||
uint64_t host_param_mask;
|
||||
struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep,
|
||||
uint16_t cmds_max, uint16_t qdepth,
|
||||
uint32_t sn, uint32_t *hn);
|
||||
uint32_t sn);
|
||||
void (*destroy_session) (struct iscsi_cls_session *session);
|
||||
struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess,
|
||||
uint32_t cid);
|
||||
@@ -206,8 +206,6 @@ struct iscsi_cls_session {
|
||||
struct iscsi_cls_host {
|
||||
atomic_t nr_scans;
|
||||
struct mutex mutex;
|
||||
struct workqueue_struct *scan_workq;
|
||||
char scan_workq_name[20];
|
||||
};
|
||||
|
||||
extern void iscsi_host_for_each_session(struct Scsi_Host *shost,
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* broadsheetfb.h - definitions for the broadsheet framebuffer driver
|
||||
*
|
||||
* Copyright (C) 2008 by Jaya Kumar
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file COPYING in the main directory of this archive for
|
||||
* more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_BROADSHEETFB_H_
|
||||
#define _LINUX_BROADSHEETFB_H_
|
||||
|
||||
/* Broadsheet command defines */
|
||||
#define BS_CMD_INIT_SYS_RUN 0x06
|
||||
#define BS_CMD_INIT_DSPE_CFG 0x09
|
||||
#define BS_CMD_INIT_DSPE_TMG 0x0A
|
||||
#define BS_CMD_INIT_ROTMODE 0x0B
|
||||
#define BS_CMD_RD_REG 0x10
|
||||
#define BS_CMD_WR_REG 0x11
|
||||
#define BS_CMD_LD_IMG 0x20
|
||||
#define BS_CMD_LD_IMG_AREA 0x22
|
||||
#define BS_CMD_LD_IMG_END 0x23
|
||||
#define BS_CMD_WAIT_DSPE_TRG 0x28
|
||||
#define BS_CMD_WAIT_DSPE_FREND 0x29
|
||||
#define BS_CMD_RD_WFM_INFO 0x30
|
||||
#define BS_CMD_UPD_INIT 0x32
|
||||
#define BS_CMD_UPD_FULL 0x33
|
||||
#define BS_CMD_UPD_GDRV_CLR 0x37
|
||||
|
||||
/* Broadsheet pin interface specific defines */
|
||||
#define BS_CS 0x01
|
||||
#define BS_DC 0x02
|
||||
#define BS_WR 0x03
|
||||
|
||||
/* struct used by broadsheet. board specific stuff comes from *board */
|
||||
struct broadsheetfb_par {
|
||||
struct fb_info *info;
|
||||
struct broadsheet_board *board;
|
||||
void (*write_reg)(struct broadsheetfb_par *, u16 reg, u16 val);
|
||||
u16 (*read_reg)(struct broadsheetfb_par *, u16 reg);
|
||||
wait_queue_head_t waitq;
|
||||
};
|
||||
|
||||
/* board specific routines */
|
||||
struct broadsheet_board {
|
||||
struct module *owner;
|
||||
int (*init)(struct broadsheetfb_par *);
|
||||
int (*wait_for_rdy)(struct broadsheetfb_par *);
|
||||
void (*set_ctl)(struct broadsheetfb_par *, unsigned char, u8);
|
||||
void (*set_hdb)(struct broadsheetfb_par *, u16);
|
||||
u16 (*get_hdb)(struct broadsheetfb_par *);
|
||||
void (*cleanup)(struct broadsheetfb_par *);
|
||||
int (*get_panel_type)(void);
|
||||
int (*setup_irq)(struct fb_info *);
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user