Merge ../linux-2.6 by hand
This commit is contained in:
commit
23fd07750a
2476 changed files with 119495 additions and 59935 deletions
|
@ -42,13 +42,18 @@ enum {
|
|||
ATA_SECT_SIZE = 512,
|
||||
|
||||
ATA_ID_WORDS = 256,
|
||||
ATA_ID_PROD_OFS = 27,
|
||||
ATA_ID_FW_REV_OFS = 23,
|
||||
ATA_ID_SERNO_OFS = 10,
|
||||
ATA_ID_MAJOR_VER = 80,
|
||||
ATA_ID_PIO_MODES = 64,
|
||||
ATA_ID_FW_REV_OFS = 23,
|
||||
ATA_ID_PROD_OFS = 27,
|
||||
ATA_ID_OLD_PIO_MODES = 51,
|
||||
ATA_ID_FIELD_VALID = 53,
|
||||
ATA_ID_MWDMA_MODES = 63,
|
||||
ATA_ID_PIO_MODES = 64,
|
||||
ATA_ID_EIDE_DMA_MIN = 65,
|
||||
ATA_ID_EIDE_PIO = 67,
|
||||
ATA_ID_EIDE_PIO_IORDY = 68,
|
||||
ATA_ID_UDMA_MODES = 88,
|
||||
ATA_ID_MAJOR_VER = 80,
|
||||
ATA_ID_PIO4 = (1 << 1),
|
||||
|
||||
ATA_PCI_CTL_OFS = 2,
|
||||
|
@ -128,10 +133,15 @@ enum {
|
|||
ATA_CMD_PIO_READ_EXT = 0x24,
|
||||
ATA_CMD_PIO_WRITE = 0x30,
|
||||
ATA_CMD_PIO_WRITE_EXT = 0x34,
|
||||
ATA_CMD_READ_MULTI = 0xC4,
|
||||
ATA_CMD_READ_MULTI_EXT = 0x29,
|
||||
ATA_CMD_WRITE_MULTI = 0xC5,
|
||||
ATA_CMD_WRITE_MULTI_EXT = 0x39,
|
||||
ATA_CMD_SET_FEATURES = 0xEF,
|
||||
ATA_CMD_PACKET = 0xA0,
|
||||
ATA_CMD_VERIFY = 0x40,
|
||||
ATA_CMD_VERIFY_EXT = 0x42,
|
||||
ATA_CMD_INIT_DEV_PARAMS = 0x91,
|
||||
|
||||
/* SETFEATURES stuff */
|
||||
SETFEATURES_XFER = 0x03,
|
||||
|
@ -146,14 +156,14 @@ enum {
|
|||
XFER_MW_DMA_2 = 0x22,
|
||||
XFER_MW_DMA_1 = 0x21,
|
||||
XFER_MW_DMA_0 = 0x20,
|
||||
XFER_SW_DMA_2 = 0x12,
|
||||
XFER_SW_DMA_1 = 0x11,
|
||||
XFER_SW_DMA_0 = 0x10,
|
||||
XFER_PIO_4 = 0x0C,
|
||||
XFER_PIO_3 = 0x0B,
|
||||
XFER_PIO_2 = 0x0A,
|
||||
XFER_PIO_1 = 0x09,
|
||||
XFER_PIO_0 = 0x08,
|
||||
XFER_SW_DMA_2 = 0x12,
|
||||
XFER_SW_DMA_1 = 0x11,
|
||||
XFER_SW_DMA_0 = 0x10,
|
||||
XFER_PIO_SLOW = 0x00,
|
||||
|
||||
/* ATAPI stuff */
|
||||
|
@ -181,6 +191,7 @@ enum {
|
|||
ATA_TFLAG_ISADDR = (1 << 1), /* enable r/w to nsect/lba regs */
|
||||
ATA_TFLAG_DEVICE = (1 << 2), /* enable r/w to device reg */
|
||||
ATA_TFLAG_WRITE = (1 << 3), /* data dir: host->dev==1 (write) */
|
||||
ATA_TFLAG_LBA = (1 << 4), /* enable LBA */
|
||||
};
|
||||
|
||||
enum ata_tf_protocols {
|
||||
|
@ -250,7 +261,19 @@ struct ata_taskfile {
|
|||
((u64) (id)[(n) + 1] << 16) | \
|
||||
((u64) (id)[(n) + 0]) )
|
||||
|
||||
static inline int atapi_cdb_len(u16 *dev_id)
|
||||
static inline int ata_id_current_chs_valid(const u16 *id)
|
||||
{
|
||||
/* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command
|
||||
has not been issued to the device then the values of
|
||||
id[54] to id[56] are vendor specific. */
|
||||
return (id[53] & 0x01) && /* Current translation valid */
|
||||
id[54] && /* cylinders in current translation */
|
||||
id[55] && /* heads in current translation */
|
||||
id[55] <= 16 &&
|
||||
id[56]; /* sectors in current translation */
|
||||
}
|
||||
|
||||
static inline int atapi_cdb_len(const u16 *dev_id)
|
||||
{
|
||||
u16 tmp = dev_id[0] & 0x3;
|
||||
switch (tmp) {
|
||||
|
@ -260,7 +283,7 @@ static inline int atapi_cdb_len(u16 *dev_id)
|
|||
}
|
||||
}
|
||||
|
||||
static inline int is_atapi_taskfile(struct ata_taskfile *tf)
|
||||
static inline int is_atapi_taskfile(const struct ata_taskfile *tf)
|
||||
{
|
||||
return (tf->protocol == ATA_PROT_ATAPI) ||
|
||||
(tf->protocol == ATA_PROT_ATAPI_NODATA) ||
|
||||
|
|
|
@ -260,11 +260,11 @@ extern int audit_filter_user(struct netlink_skb_parms *cb, int type);
|
|||
#ifdef CONFIG_AUDIT
|
||||
/* These are defined in audit.c */
|
||||
/* Public API */
|
||||
extern void audit_log(struct audit_context *ctx, int gfp_mask,
|
||||
extern void audit_log(struct audit_context *ctx, gfp_t gfp_mask,
|
||||
int type, const char *fmt, ...)
|
||||
__attribute__((format(printf,4,5)));
|
||||
|
||||
extern struct audit_buffer *audit_log_start(struct audit_context *ctx, int gfp_mask, int type);
|
||||
extern struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type);
|
||||
extern void audit_log_format(struct audit_buffer *ab,
|
||||
const char *fmt, ...)
|
||||
__attribute__((format(printf,2,3)));
|
||||
|
|
|
@ -301,7 +301,7 @@ extern struct bio *bio_map_user_iov(struct request_queue *,
|
|||
struct sg_iovec *, int, int);
|
||||
extern void bio_unmap_user(struct bio *);
|
||||
extern struct bio *bio_map_kern(struct request_queue *, void *, unsigned int,
|
||||
unsigned int);
|
||||
gfp_t);
|
||||
extern void bio_set_pages_dirty(struct bio *bio);
|
||||
extern void bio_check_pages_dirty(struct bio *bio);
|
||||
extern struct bio *bio_copy_user(struct request_queue *, unsigned long, unsigned int, int);
|
||||
|
|
|
@ -40,6 +40,8 @@
|
|||
* bitmap_weight(src, nbits) Hamming Weight: number set bits
|
||||
* bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n
|
||||
* bitmap_shift_left(dst, src, n, nbits) *dst = *src << n
|
||||
* bitmap_remap(dst, src, old, new, nbits) *dst = map(old, new)(src)
|
||||
* bitmap_bitremap(oldbit, old, new, nbits) newbit = map(old, new)(oldbit)
|
||||
* bitmap_scnprintf(buf, len, src, nbits) Print bitmap src to buf
|
||||
* bitmap_parse(ubuf, ulen, dst, nbits) Parse bitmap dst from user buf
|
||||
* bitmap_scnlistprintf(buf, len, src, nbits) Print bitmap src as list to buf
|
||||
|
@ -104,6 +106,10 @@ extern int bitmap_scnlistprintf(char *buf, unsigned int len,
|
|||
const unsigned long *src, int nbits);
|
||||
extern int bitmap_parselist(const char *buf, unsigned long *maskp,
|
||||
int nmaskbits);
|
||||
extern void bitmap_remap(unsigned long *dst, const unsigned long *src,
|
||||
const unsigned long *old, const unsigned long *new, int bits);
|
||||
extern int bitmap_bitremap(int oldbit,
|
||||
const unsigned long *old, const unsigned long *new, int bits);
|
||||
extern int bitmap_find_free_region(unsigned long *bitmap, int bits, int order);
|
||||
extern void bitmap_release_region(unsigned long *bitmap, int pos, int order);
|
||||
extern int bitmap_allocate_region(unsigned long *bitmap, int pos, int order);
|
||||
|
|
|
@ -96,8 +96,8 @@ struct io_context {
|
|||
|
||||
void put_io_context(struct io_context *ioc);
|
||||
void exit_io_context(void);
|
||||
struct io_context *current_io_context(int gfp_flags);
|
||||
struct io_context *get_io_context(int gfp_flags);
|
||||
struct io_context *current_io_context(gfp_t gfp_flags);
|
||||
struct io_context *get_io_context(gfp_t gfp_flags);
|
||||
void copy_io_context(struct io_context **pdst, struct io_context **psrc);
|
||||
void swap_io_context(struct io_context **ioc1, struct io_context **ioc2);
|
||||
|
||||
|
@ -107,9 +107,9 @@ typedef void (rq_end_io_fn)(struct request *);
|
|||
struct request_list {
|
||||
int count[2];
|
||||
int starved[2];
|
||||
int elvpriv;
|
||||
mempool_t *rq_pool;
|
||||
wait_queue_head_t wait[2];
|
||||
wait_queue_head_t drain;
|
||||
};
|
||||
|
||||
#define BLK_MAX_CDB 16
|
||||
|
@ -203,6 +203,7 @@ struct request {
|
|||
enum rq_flag_bits {
|
||||
__REQ_RW, /* not set, read. set, write */
|
||||
__REQ_FAILFAST, /* no low level driver retries */
|
||||
__REQ_SORTED, /* elevator knows about this request */
|
||||
__REQ_SOFTBARRIER, /* may not be passed by ioscheduler */
|
||||
__REQ_HARDBARRIER, /* may not be passed by drive either */
|
||||
__REQ_CMD, /* is a regular fs rw request */
|
||||
|
@ -210,6 +211,7 @@ enum rq_flag_bits {
|
|||
__REQ_STARTED, /* drive already may have started this one */
|
||||
__REQ_DONTPREP, /* don't call prep for this one */
|
||||
__REQ_QUEUED, /* uses queueing */
|
||||
__REQ_ELVPRIV, /* elevator private data attached */
|
||||
/*
|
||||
* for ATA/ATAPI devices
|
||||
*/
|
||||
|
@ -235,6 +237,7 @@ enum rq_flag_bits {
|
|||
|
||||
#define REQ_RW (1 << __REQ_RW)
|
||||
#define REQ_FAILFAST (1 << __REQ_FAILFAST)
|
||||
#define REQ_SORTED (1 << __REQ_SORTED)
|
||||
#define REQ_SOFTBARRIER (1 << __REQ_SOFTBARRIER)
|
||||
#define REQ_HARDBARRIER (1 << __REQ_HARDBARRIER)
|
||||
#define REQ_CMD (1 << __REQ_CMD)
|
||||
|
@ -242,6 +245,7 @@ enum rq_flag_bits {
|
|||
#define REQ_STARTED (1 << __REQ_STARTED)
|
||||
#define REQ_DONTPREP (1 << __REQ_DONTPREP)
|
||||
#define REQ_QUEUED (1 << __REQ_QUEUED)
|
||||
#define REQ_ELVPRIV (1 << __REQ_ELVPRIV)
|
||||
#define REQ_PC (1 << __REQ_PC)
|
||||
#define REQ_BLOCK_PC (1 << __REQ_BLOCK_PC)
|
||||
#define REQ_SENSE (1 << __REQ_SENSE)
|
||||
|
@ -332,6 +336,12 @@ struct request_queue
|
|||
prepare_flush_fn *prepare_flush_fn;
|
||||
end_flush_fn *end_flush_fn;
|
||||
|
||||
/*
|
||||
* Dispatch queue sorting
|
||||
*/
|
||||
sector_t end_sector;
|
||||
struct request *boundary_rq;
|
||||
|
||||
/*
|
||||
* Auto-unplugging state
|
||||
*/
|
||||
|
@ -354,7 +364,7 @@ struct request_queue
|
|||
* queue needs bounce pages for pages above this limit
|
||||
*/
|
||||
unsigned long bounce_pfn;
|
||||
unsigned int bounce_gfp;
|
||||
gfp_t bounce_gfp;
|
||||
|
||||
/*
|
||||
* various queue flags, see QUEUE_* below
|
||||
|
@ -405,8 +415,6 @@ struct request_queue
|
|||
unsigned int sg_reserved_size;
|
||||
int node;
|
||||
|
||||
struct list_head drain_list;
|
||||
|
||||
/*
|
||||
* reserved for flush operations
|
||||
*/
|
||||
|
@ -434,7 +442,7 @@ enum {
|
|||
#define QUEUE_FLAG_DEAD 5 /* queue being torn down */
|
||||
#define QUEUE_FLAG_REENTER 6 /* Re-entrancy avoidance */
|
||||
#define QUEUE_FLAG_PLUGGED 7 /* queue is plugged */
|
||||
#define QUEUE_FLAG_DRAIN 8 /* draining queue for sched switch */
|
||||
#define QUEUE_FLAG_ELVSWITCH 8 /* don't use elevator, just do FIFO */
|
||||
#define QUEUE_FLAG_FLUSH 9 /* doing barrier flush sequence */
|
||||
|
||||
#define blk_queue_plugged(q) test_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags)
|
||||
|
@ -454,6 +462,7 @@ enum {
|
|||
#define blk_pm_request(rq) \
|
||||
((rq)->flags & (REQ_PM_SUSPEND | REQ_PM_RESUME))
|
||||
|
||||
#define blk_sorted_rq(rq) ((rq)->flags & REQ_SORTED)
|
||||
#define blk_barrier_rq(rq) ((rq)->flags & REQ_HARDBARRIER)
|
||||
#define blk_barrier_preflush(rq) ((rq)->flags & REQ_BAR_PREFLUSH)
|
||||
#define blk_barrier_postflush(rq) ((rq)->flags & REQ_BAR_POSTFLUSH)
|
||||
|
@ -550,7 +559,7 @@ extern void generic_make_request(struct bio *bio);
|
|||
extern void blk_put_request(struct request *);
|
||||
extern void blk_end_sync_rq(struct request *rq);
|
||||
extern void blk_attempt_remerge(request_queue_t *, struct request *);
|
||||
extern struct request *blk_get_request(request_queue_t *, int, int);
|
||||
extern struct request *blk_get_request(request_queue_t *, int, gfp_t);
|
||||
extern void blk_insert_request(request_queue_t *, struct request *, int, void *);
|
||||
extern void blk_requeue_request(request_queue_t *, struct request *);
|
||||
extern void blk_plug_device(request_queue_t *);
|
||||
|
@ -565,7 +574,7 @@ extern void blk_run_queue(request_queue_t *);
|
|||
extern void blk_queue_activity_fn(request_queue_t *, activity_fn *, void *);
|
||||
extern int blk_rq_map_user(request_queue_t *, struct request *, void __user *, unsigned int);
|
||||
extern int blk_rq_unmap_user(struct bio *, unsigned int);
|
||||
extern int blk_rq_map_kern(request_queue_t *, struct request *, void *, unsigned int, unsigned int);
|
||||
extern int blk_rq_map_kern(request_queue_t *, struct request *, void *, unsigned int, gfp_t);
|
||||
extern int blk_rq_map_user_iov(request_queue_t *, struct request *, struct sg_iovec *, int);
|
||||
extern int blk_execute_rq(request_queue_t *, struct gendisk *,
|
||||
struct request *, int);
|
||||
|
@ -611,12 +620,21 @@ extern void end_request(struct request *req, int uptodate);
|
|||
|
||||
static inline void blkdev_dequeue_request(struct request *req)
|
||||
{
|
||||
BUG_ON(list_empty(&req->queuelist));
|
||||
elv_dequeue_request(req->q, req);
|
||||
}
|
||||
|
||||
list_del_init(&req->queuelist);
|
||||
/*
|
||||
* This should be in elevator.h, but that requires pulling in rq and q
|
||||
*/
|
||||
static inline void elv_dispatch_add_tail(struct request_queue *q,
|
||||
struct request *rq)
|
||||
{
|
||||
if (q->last_merge == rq)
|
||||
q->last_merge = NULL;
|
||||
|
||||
if (req->rl)
|
||||
elv_remove_request(req->q, req);
|
||||
q->end_sector = rq_end_sector(rq);
|
||||
q->boundary_rq = rq;
|
||||
list_add_tail(&rq->queuelist, &q->queue_head);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -650,12 +668,10 @@ extern void blk_dump_rq_flags(struct request *, char *);
|
|||
extern void generic_unplug_device(request_queue_t *);
|
||||
extern void __generic_unplug_device(request_queue_t *);
|
||||
extern long nr_blockdev_pages(void);
|
||||
extern void blk_wait_queue_drained(request_queue_t *, int);
|
||||
extern void blk_finish_queue_drain(request_queue_t *);
|
||||
|
||||
int blk_get_queue(request_queue_t *);
|
||||
request_queue_t *blk_alloc_queue(int gfp_mask);
|
||||
request_queue_t *blk_alloc_queue_node(int,int);
|
||||
request_queue_t *blk_alloc_queue(gfp_t);
|
||||
request_queue_t *blk_alloc_queue_node(gfp_t, int);
|
||||
#define blk_put_queue(q) blk_cleanup_queue((q))
|
||||
|
||||
/*
|
||||
|
|
|
@ -126,8 +126,8 @@ BUFFER_FNS(Eopnotsupp, eopnotsupp)
|
|||
/* If we *know* page->private refers to buffer_heads */
|
||||
#define page_buffers(page) \
|
||||
({ \
|
||||
BUG_ON(!PagePrivate(page)); \
|
||||
((struct buffer_head *)(page)->private); \
|
||||
BUG_ON(!PagePrivate(page)); \
|
||||
((struct buffer_head *)page_private(page)); \
|
||||
})
|
||||
#define page_has_buffers(page) PagePrivate(page)
|
||||
|
||||
|
@ -188,8 +188,9 @@ extern int buffer_heads_over_limit;
|
|||
* Generic address_space_operations implementations for buffer_head-backed
|
||||
* address_spaces.
|
||||
*/
|
||||
int try_to_release_page(struct page * page, int gfp_mask);
|
||||
int try_to_release_page(struct page * page, gfp_t gfp_mask);
|
||||
int block_invalidatepage(struct page *page, unsigned long offset);
|
||||
int do_invalidatepage(struct page *page, unsigned long offset);
|
||||
int block_write_full_page(struct page *page, get_block_t *get_block,
|
||||
struct writeback_control *wbc);
|
||||
int block_read_full_page(struct page*, get_block_t*);
|
||||
|
@ -219,7 +220,7 @@ static inline void attach_page_buffers(struct page *page,
|
|||
{
|
||||
page_cache_get(page);
|
||||
SetPagePrivate(page);
|
||||
page->private = (unsigned long)head;
|
||||
set_page_private(page, (unsigned long)head);
|
||||
}
|
||||
|
||||
static inline void get_bh(struct buffer_head *bh)
|
||||
|
|
|
@ -32,6 +32,7 @@ struct cpu {
|
|||
};
|
||||
|
||||
extern int register_cpu(struct cpu *, int, struct node *);
|
||||
extern struct sys_device *get_cpu_sysdev(int cpu);
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
extern void unregister_cpu(struct cpu *, struct node *);
|
||||
#endif
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/completion.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <asm/div64.h>
|
||||
|
||||
#define CPUFREQ_NAME_LEN 16
|
||||
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
* see bitmap_scnprintf() and bitmap_parse() in lib/bitmap.c.
|
||||
* For details of cpulist_scnprintf() and cpulist_parse(), see
|
||||
* bitmap_scnlistprintf() and bitmap_parselist(), also in bitmap.c.
|
||||
* For details of cpu_remap(), see bitmap_bitremap in lib/bitmap.c
|
||||
* For details of cpus_remap(), see bitmap_remap in lib/bitmap.c.
|
||||
*
|
||||
* The available cpumask operations are:
|
||||
*
|
||||
|
@ -50,6 +52,8 @@
|
|||
* int cpumask_parse(ubuf, ulen, mask) Parse ascii string as cpumask
|
||||
* int cpulist_scnprintf(buf, len, mask) Format cpumask as list for printing
|
||||
* int cpulist_parse(buf, map) Parse ascii string as cpulist
|
||||
* int cpu_remap(oldbit, old, new) newbit = map(old, new)(oldbit)
|
||||
* int cpus_remap(dst, src, old, new) *dst = map(old, new)(src)
|
||||
*
|
||||
* for_each_cpu_mask(cpu, mask) for-loop cpu over mask
|
||||
*
|
||||
|
@ -294,6 +298,22 @@ static inline int __cpulist_parse(const char *buf, cpumask_t *dstp, int nbits)
|
|||
return bitmap_parselist(buf, dstp->bits, nbits);
|
||||
}
|
||||
|
||||
#define cpu_remap(oldbit, old, new) \
|
||||
__cpu_remap((oldbit), &(old), &(new), NR_CPUS)
|
||||
static inline int __cpu_remap(int oldbit,
|
||||
const cpumask_t *oldp, const cpumask_t *newp, int nbits)
|
||||
{
|
||||
return bitmap_bitremap(oldbit, oldp->bits, newp->bits, nbits);
|
||||
}
|
||||
|
||||
#define cpus_remap(dst, src, old, new) \
|
||||
__cpus_remap(&(dst), &(src), &(old), &(new), NR_CPUS)
|
||||
static inline void __cpus_remap(cpumask_t *dstp, const cpumask_t *srcp,
|
||||
const cpumask_t *oldp, const cpumask_t *newp, int nbits)
|
||||
{
|
||||
bitmap_remap(dstp->bits, srcp->bits, oldp->bits, newp->bits, nbits);
|
||||
}
|
||||
|
||||
#if NR_CPUS > 1
|
||||
#define for_each_cpu_mask(cpu, mask) \
|
||||
for ((cpu) = first_cpu(mask); \
|
||||
|
|
|
@ -37,8 +37,6 @@
|
|||
#include <linux/cycx_x25.h>
|
||||
#endif
|
||||
|
||||
#define is_digit(ch) (((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')?1:0)
|
||||
|
||||
/* Adapter Data Space.
|
||||
* This structure is needed because we handle multiple cards, otherwise
|
||||
* static data would do it.
|
||||
|
|
|
@ -60,6 +60,5 @@ extern int cycx_peek(struct cycx_hw *hw, u32 addr, void *buf, u32 len);
|
|||
extern int cycx_poke(struct cycx_hw *hw, u32 addr, void *buf, u32 len);
|
||||
extern int cycx_exec(void __iomem *addr);
|
||||
|
||||
extern void cycx_inten(struct cycx_hw *hw);
|
||||
extern void cycx_intr(struct cycx_hw *hw);
|
||||
#endif /* _CYCX_DRV_H */
|
||||
|
|
|
@ -28,19 +28,6 @@
|
|||
#define BUS_ID_SIZE KOBJ_NAME_LEN
|
||||
|
||||
|
||||
enum {
|
||||
SUSPEND_NOTIFY,
|
||||
SUSPEND_SAVE_STATE,
|
||||
SUSPEND_DISABLE,
|
||||
SUSPEND_POWER_DOWN,
|
||||
};
|
||||
|
||||
enum {
|
||||
RESUME_POWER_ON,
|
||||
RESUME_RESTORE_STATE,
|
||||
RESUME_ENABLE,
|
||||
};
|
||||
|
||||
struct device;
|
||||
struct device_driver;
|
||||
struct class;
|
||||
|
@ -115,8 +102,8 @@ struct device_driver {
|
|||
int (*probe) (struct device * dev);
|
||||
int (*remove) (struct device * dev);
|
||||
void (*shutdown) (struct device * dev);
|
||||
int (*suspend) (struct device * dev, pm_message_t state, u32 level);
|
||||
int (*resume) (struct device * dev, u32 level);
|
||||
int (*suspend) (struct device * dev, pm_message_t state);
|
||||
int (*resume) (struct device * dev);
|
||||
};
|
||||
|
||||
|
||||
|
@ -190,7 +177,43 @@ struct class_attribute class_attr_##_name = __ATTR(_name,_mode,_show,_store)
|
|||
extern int class_create_file(struct class *, const struct class_attribute *);
|
||||
extern void class_remove_file(struct class *, const struct class_attribute *);
|
||||
|
||||
struct class_device_attribute {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct class_device *, char * buf);
|
||||
ssize_t (*store)(struct class_device *, const char * buf, size_t count);
|
||||
};
|
||||
|
||||
#define CLASS_DEVICE_ATTR(_name,_mode,_show,_store) \
|
||||
struct class_device_attribute class_device_attr_##_name = \
|
||||
__ATTR(_name,_mode,_show,_store)
|
||||
|
||||
extern int class_device_create_file(struct class_device *,
|
||||
const struct class_device_attribute *);
|
||||
|
||||
/**
|
||||
* struct class_device - class devices
|
||||
* @class: pointer to the parent class for this class device. This is required.
|
||||
* @devt: for internal use by the driver core only.
|
||||
* @node: for internal use by the driver core only.
|
||||
* @kobj: for internal use by the driver core only.
|
||||
* @devt_attr: for internal use by the driver core only.
|
||||
* @dev: if set, a symlink to the struct device is created in the sysfs
|
||||
* directory for this struct class device.
|
||||
* @class_data: pointer to whatever you want to store here for this struct
|
||||
* class_device. Use class_get_devdata() and class_set_devdata() to get and
|
||||
* set this pointer.
|
||||
* @parent: pointer to a struct class_device that is the parent of this struct
|
||||
* class_device. If NULL, this class_device will show up at the root of the
|
||||
* struct class in sysfs (which is probably what you want to have happen.)
|
||||
* @release: pointer to a release function for this struct class_device. If
|
||||
* set, this will be called instead of the class specific release function.
|
||||
* Only use this if you want to override the default release function, like
|
||||
* when you are nesting class_device structures.
|
||||
* @hotplug: pointer to a hotplug function for this struct class_device. If
|
||||
* set, this will be called instead of the class specific hotplug function.
|
||||
* Only use this if you want to override the default hotplug function, like
|
||||
* when you are nesting class_device structures.
|
||||
*/
|
||||
struct class_device {
|
||||
struct list_head node;
|
||||
|
||||
|
@ -198,9 +221,14 @@ struct class_device {
|
|||
struct class * class; /* required */
|
||||
dev_t devt; /* dev_t, creates the sysfs "dev" */
|
||||
struct class_device_attribute *devt_attr;
|
||||
struct class_device_attribute uevent_attr;
|
||||
struct device * dev; /* not necessary, but nice to have */
|
||||
void * class_data; /* class-specific data */
|
||||
struct class_device *parent; /* parent of this child device, if there is one */
|
||||
|
||||
void (*release)(struct class_device *dev);
|
||||
int (*hotplug)(struct class_device *dev, char **envp,
|
||||
int num_envp, char *buffer, int buffer_size);
|
||||
char class_id[BUS_ID_SIZE]; /* unique to this class */
|
||||
};
|
||||
|
||||
|
@ -228,18 +256,6 @@ extern int class_device_rename(struct class_device *, char *);
|
|||
extern struct class_device * class_device_get(struct class_device *);
|
||||
extern void class_device_put(struct class_device *);
|
||||
|
||||
struct class_device_attribute {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct class_device *, char * buf);
|
||||
ssize_t (*store)(struct class_device *, const char * buf, size_t count);
|
||||
};
|
||||
|
||||
#define CLASS_DEVICE_ATTR(_name,_mode,_show,_store) \
|
||||
struct class_device_attribute class_device_attr_##_name = \
|
||||
__ATTR(_name,_mode,_show,_store)
|
||||
|
||||
extern int class_device_create_file(struct class_device *,
|
||||
const struct class_device_attribute *);
|
||||
extern void class_device_remove_file(struct class_device *,
|
||||
const struct class_device_attribute *);
|
||||
extern int class_device_create_bin_file(struct class_device *,
|
||||
|
@ -251,8 +267,8 @@ struct class_interface {
|
|||
struct list_head node;
|
||||
struct class *class;
|
||||
|
||||
int (*add) (struct class_device *);
|
||||
void (*remove) (struct class_device *);
|
||||
int (*add) (struct class_device *, struct class_interface *);
|
||||
void (*remove) (struct class_device *, struct class_interface *);
|
||||
};
|
||||
|
||||
extern int class_interface_register(struct class_interface *);
|
||||
|
@ -260,12 +276,29 @@ extern void class_interface_unregister(struct class_interface *);
|
|||
|
||||
extern struct class *class_create(struct module *owner, char *name);
|
||||
extern void class_destroy(struct class *cls);
|
||||
extern struct class_device *class_device_create(struct class *cls, dev_t devt,
|
||||
struct device *device, char *fmt, ...)
|
||||
__attribute__((format(printf,4,5)));
|
||||
extern struct class_device *class_device_create(struct class *cls,
|
||||
struct class_device *parent,
|
||||
dev_t devt,
|
||||
struct device *device,
|
||||
char *fmt, ...)
|
||||
__attribute__((format(printf,5,6)));
|
||||
extern void class_device_destroy(struct class *cls, dev_t devt);
|
||||
|
||||
|
||||
/* interface for exporting device attributes */
|
||||
struct device_attribute {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
|
||||
char *buf);
|
||||
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count);
|
||||
};
|
||||
|
||||
#define DEVICE_ATTR(_name,_mode,_show,_store) \
|
||||
struct device_attribute dev_attr_##_name = __ATTR(_name,_mode,_show,_store)
|
||||
|
||||
extern int device_create_file(struct device *device, struct device_attribute * entry);
|
||||
extern void device_remove_file(struct device * dev, struct device_attribute * attr);
|
||||
struct device {
|
||||
struct klist klist_children;
|
||||
struct klist_node knode_parent; /* node in sibling list */
|
||||
|
@ -275,6 +308,7 @@ struct device {
|
|||
|
||||
struct kobject kobj;
|
||||
char bus_id[BUS_ID_SIZE]; /* position on parent bus */
|
||||
struct device_attribute uevent_attr;
|
||||
|
||||
struct semaphore sem; /* semaphore to synchronize calls to
|
||||
* its driver.
|
||||
|
@ -343,23 +377,6 @@ extern int device_attach(struct device * dev);
|
|||
extern void driver_attach(struct device_driver * drv);
|
||||
|
||||
|
||||
/* driverfs interface for exporting device attributes */
|
||||
|
||||
struct device_attribute {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
|
||||
char *buf);
|
||||
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count);
|
||||
};
|
||||
|
||||
#define DEVICE_ATTR(_name,_mode,_show,_store) \
|
||||
struct device_attribute dev_attr_##_name = __ATTR(_name,_mode,_show,_store)
|
||||
|
||||
|
||||
extern int device_create_file(struct device *device, struct device_attribute * entry);
|
||||
extern void device_remove_file(struct device * dev, struct device_attribute * attr);
|
||||
|
||||
/*
|
||||
* Platform "fixup" functions - allow the platform to have their say
|
||||
* about devices and actions that the general device layer doesn't
|
||||
|
|
|
@ -60,7 +60,7 @@ struct dmi_device {
|
|||
void *device_data; /* Type specific data */
|
||||
};
|
||||
|
||||
#if defined(CONFIG_X86) && !defined(CONFIG_X86_64)
|
||||
#if defined(CONFIG_X86_32)
|
||||
|
||||
extern int dmi_check_system(struct dmi_system_id *list);
|
||||
extern char * dmi_get_system_info(int field);
|
||||
|
|
|
@ -8,18 +8,17 @@ typedef void (elevator_merge_req_fn) (request_queue_t *, struct request *, struc
|
|||
|
||||
typedef void (elevator_merged_fn) (request_queue_t *, struct request *);
|
||||
|
||||
typedef struct request *(elevator_next_req_fn) (request_queue_t *);
|
||||
typedef int (elevator_dispatch_fn) (request_queue_t *, int);
|
||||
|
||||
typedef void (elevator_add_req_fn) (request_queue_t *, struct request *, int);
|
||||
typedef void (elevator_add_req_fn) (request_queue_t *, struct request *);
|
||||
typedef int (elevator_queue_empty_fn) (request_queue_t *);
|
||||
typedef void (elevator_remove_req_fn) (request_queue_t *, struct request *);
|
||||
typedef void (elevator_requeue_req_fn) (request_queue_t *, struct request *);
|
||||
typedef struct request *(elevator_request_list_fn) (request_queue_t *, struct request *);
|
||||
typedef void (elevator_completed_req_fn) (request_queue_t *, struct request *);
|
||||
typedef int (elevator_may_queue_fn) (request_queue_t *, int, struct bio *);
|
||||
|
||||
typedef int (elevator_set_req_fn) (request_queue_t *, struct request *, struct bio *, int);
|
||||
typedef int (elevator_set_req_fn) (request_queue_t *, struct request *, struct bio *, gfp_t);
|
||||
typedef void (elevator_put_req_fn) (request_queue_t *, struct request *);
|
||||
typedef void (elevator_activate_req_fn) (request_queue_t *, struct request *);
|
||||
typedef void (elevator_deactivate_req_fn) (request_queue_t *, struct request *);
|
||||
|
||||
typedef int (elevator_init_fn) (request_queue_t *, elevator_t *);
|
||||
|
@ -31,10 +30,9 @@ struct elevator_ops
|
|||
elevator_merged_fn *elevator_merged_fn;
|
||||
elevator_merge_req_fn *elevator_merge_req_fn;
|
||||
|
||||
elevator_next_req_fn *elevator_next_req_fn;
|
||||
elevator_dispatch_fn *elevator_dispatch_fn;
|
||||
elevator_add_req_fn *elevator_add_req_fn;
|
||||
elevator_remove_req_fn *elevator_remove_req_fn;
|
||||
elevator_requeue_req_fn *elevator_requeue_req_fn;
|
||||
elevator_activate_req_fn *elevator_activate_req_fn;
|
||||
elevator_deactivate_req_fn *elevator_deactivate_req_fn;
|
||||
|
||||
elevator_queue_empty_fn *elevator_queue_empty_fn;
|
||||
|
@ -81,15 +79,15 @@ struct elevator_queue
|
|||
/*
|
||||
* block elevator interface
|
||||
*/
|
||||
extern void elv_dispatch_sort(request_queue_t *, struct request *);
|
||||
extern void elv_add_request(request_queue_t *, struct request *, int, int);
|
||||
extern void __elv_add_request(request_queue_t *, struct request *, int, int);
|
||||
extern int elv_merge(request_queue_t *, struct request **, struct bio *);
|
||||
extern void elv_merge_requests(request_queue_t *, struct request *,
|
||||
struct request *);
|
||||
extern void elv_merged_request(request_queue_t *, struct request *);
|
||||
extern void elv_remove_request(request_queue_t *, struct request *);
|
||||
extern void elv_dequeue_request(request_queue_t *, struct request *);
|
||||
extern void elv_requeue_request(request_queue_t *, struct request *);
|
||||
extern void elv_deactivate_request(request_queue_t *, struct request *);
|
||||
extern int elv_queue_empty(request_queue_t *);
|
||||
extern struct request *elv_next_request(struct request_queue *q);
|
||||
extern struct request *elv_former_request(request_queue_t *, struct request *);
|
||||
|
@ -98,7 +96,7 @@ extern int elv_register_queue(request_queue_t *q);
|
|||
extern void elv_unregister_queue(request_queue_t *q);
|
||||
extern int elv_may_queue(request_queue_t *, int, struct bio *);
|
||||
extern void elv_completed_request(request_queue_t *, struct request *);
|
||||
extern int elv_set_request(request_queue_t *, struct request *, struct bio *, int);
|
||||
extern int elv_set_request(request_queue_t *, struct request *, struct bio *, gfp_t);
|
||||
extern void elv_put_request(request_queue_t *, struct request *);
|
||||
|
||||
/*
|
||||
|
@ -142,4 +140,6 @@ enum {
|
|||
ELV_MQUEUE_MUST,
|
||||
};
|
||||
|
||||
#define rq_end_sector(rq) ((rq)->sector + (rq)->nr_sectors)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -104,6 +104,22 @@ static inline void random_ether_addr(u8 *addr)
|
|||
addr [0] &= 0xfe; /* clear multicast bit */
|
||||
addr [0] |= 0x02; /* set local assignment bit (IEEE802) */
|
||||
}
|
||||
|
||||
/**
|
||||
* compare_ether_addr - Compare two Ethernet addresses
|
||||
* @addr1: Pointer to a six-byte array containing the Ethernet address
|
||||
* @addr2 Pointer other six-byte array containing the Ethernet address
|
||||
*
|
||||
* Compare two ethernet addresses, returns 0 if equal
|
||||
*/
|
||||
static inline unsigned compare_ether_addr(const u8 *_a, const u8 *_b)
|
||||
{
|
||||
const u16 *a = (const u16 *) _a;
|
||||
const u16 *b = (const u16 *) _b;
|
||||
|
||||
BUILD_BUG_ON(ETH_ALEN != 6);
|
||||
return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2])) != 0;
|
||||
}
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _LINUX_ETHERDEVICE_H */
|
||||
|
|
|
@ -269,6 +269,8 @@ u32 ethtool_op_get_tso(struct net_device *dev);
|
|||
int ethtool_op_set_tso(struct net_device *dev, u32 data);
|
||||
int ethtool_op_get_perm_addr(struct net_device *dev,
|
||||
struct ethtool_perm_addr *addr, u8 *data);
|
||||
u32 ethtool_op_get_ufo(struct net_device *dev);
|
||||
int ethtool_op_set_ufo(struct net_device *dev, u32 data);
|
||||
|
||||
/**
|
||||
* ðtool_ops - Alter and report network device settings
|
||||
|
@ -298,6 +300,8 @@ int ethtool_op_get_perm_addr(struct net_device *dev,
|
|||
* set_sg: Turn scatter-gather on or off
|
||||
* get_tso: Report whether TCP segmentation offload is enabled
|
||||
* set_tso: Turn TCP segmentation offload on or off
|
||||
* get_ufo: Report whether UDP fragmentation offload is enabled
|
||||
* set_ufo: Turn UDP fragmentation offload on or off
|
||||
* self_test: Run specified self-tests
|
||||
* get_strings: Return a set of strings that describe the requested objects
|
||||
* phys_id: Identify the device
|
||||
|
@ -364,6 +368,8 @@ struct ethtool_ops {
|
|||
int (*get_perm_addr)(struct net_device *, struct ethtool_perm_addr *, u8 *);
|
||||
int (*begin)(struct net_device *);
|
||||
void (*complete)(struct net_device *);
|
||||
u32 (*get_ufo)(struct net_device *);
|
||||
int (*set_ufo)(struct net_device *, u32);
|
||||
};
|
||||
|
||||
/* CMDs currently supported */
|
||||
|
@ -400,6 +406,8 @@ struct ethtool_ops {
|
|||
#define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */
|
||||
#define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */
|
||||
#define ETHTOOL_GPERMADDR 0x00000020 /* Get permanent hardware address */
|
||||
#define ETHTOOL_GUFO 0x00000021 /* Get UFO enable (ethtool_value) */
|
||||
#define ETHTOOL_SUFO 0x00000022 /* Set UFO enable (ethtool_value) */
|
||||
|
||||
/* compatibility with older code */
|
||||
#define SPARC_ETH_GSET ETHTOOL_GSET
|
||||
|
|
|
@ -320,7 +320,7 @@ struct address_space_operations {
|
|||
/* Unfortunately this kludge is needed for FIBMAP. Don't use it */
|
||||
sector_t (*bmap)(struct address_space *, sector_t);
|
||||
int (*invalidatepage) (struct page *, unsigned long);
|
||||
int (*releasepage) (struct page *, int);
|
||||
int (*releasepage) (struct page *, gfp_t);
|
||||
ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov,
|
||||
loff_t offset, unsigned long nr_segs);
|
||||
struct page* (*get_xip_page)(struct address_space *, sector_t,
|
||||
|
@ -574,7 +574,14 @@ struct file_ra_state {
|
|||
#define RA_FLAG_INCACHE 0x02 /* file is already in cache */
|
||||
|
||||
struct file {
|
||||
struct list_head f_list;
|
||||
/*
|
||||
* fu_list becomes invalid after file_free is called and queued via
|
||||
* fu_rcuhead for RCU freeing
|
||||
*/
|
||||
union {
|
||||
struct list_head fu_list;
|
||||
struct rcu_head fu_rcuhead;
|
||||
} f_u;
|
||||
struct dentry *f_dentry;
|
||||
struct vfsmount *f_vfsmnt;
|
||||
struct file_operations *f_op;
|
||||
|
@ -598,7 +605,6 @@ struct file {
|
|||
spinlock_t f_ep_lock;
|
||||
#endif /* #ifdef CONFIG_EPOLL */
|
||||
struct address_space *f_mapping;
|
||||
struct rcu_head f_rcuhead;
|
||||
};
|
||||
extern spinlock_t files_lock;
|
||||
#define file_list_lock() spin_lock(&files_lock);
|
||||
|
|
136
include/linux/fs_enet_pd.h
Normal file
136
include/linux/fs_enet_pd.h
Normal file
|
@ -0,0 +1,136 @@
|
|||
/*
|
||||
* Platform information definitions for the
|
||||
* universal Freescale Ethernet driver.
|
||||
*
|
||||
* Copyright (c) 2003 Intracom S.A.
|
||||
* by Pantelis Antoniou <panto@intracom.gr>
|
||||
*
|
||||
* 2005 (c) MontaVista Software, Inc.
|
||||
* Vitaly Bordug <vbordug@ru.mvista.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public License
|
||||
* version 2. This program is licensed "as is" without any warranty of any
|
||||
* kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#ifndef FS_ENET_PD_H
|
||||
#define FS_ENET_PD_H
|
||||
|
||||
#include <linux/version.h>
|
||||
#include <asm/types.h>
|
||||
|
||||
#define FS_ENET_NAME "fs_enet"
|
||||
|
||||
enum fs_id {
|
||||
fsid_fec1,
|
||||
fsid_fec2,
|
||||
fsid_fcc1,
|
||||
fsid_fcc2,
|
||||
fsid_fcc3,
|
||||
fsid_scc1,
|
||||
fsid_scc2,
|
||||
fsid_scc3,
|
||||
fsid_scc4,
|
||||
};
|
||||
|
||||
#define FS_MAX_INDEX 9
|
||||
|
||||
static inline int fs_get_fec_index(enum fs_id id)
|
||||
{
|
||||
if (id >= fsid_fec1 && id <= fsid_fec2)
|
||||
return id - fsid_fec1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static inline int fs_get_fcc_index(enum fs_id id)
|
||||
{
|
||||
if (id >= fsid_fcc1 && id <= fsid_fcc3)
|
||||
return id - fsid_fcc1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static inline int fs_get_scc_index(enum fs_id id)
|
||||
{
|
||||
if (id >= fsid_scc1 && id <= fsid_scc4)
|
||||
return id - fsid_scc1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
enum fs_mii_method {
|
||||
fsmii_fixed,
|
||||
fsmii_fec,
|
||||
fsmii_bitbang,
|
||||
};
|
||||
|
||||
enum fs_ioport {
|
||||
fsiop_porta,
|
||||
fsiop_portb,
|
||||
fsiop_portc,
|
||||
fsiop_portd,
|
||||
fsiop_porte,
|
||||
};
|
||||
|
||||
struct fs_mii_bus_info {
|
||||
int method; /* mii method */
|
||||
int id; /* the id of the mii_bus */
|
||||
int disable_aneg; /* if the controller needs to negothiate speed & duplex */
|
||||
int lpa; /* the default board-specific vallues will be applied otherwise */
|
||||
|
||||
union {
|
||||
struct {
|
||||
int duplex;
|
||||
int speed;
|
||||
} fixed;
|
||||
|
||||
struct {
|
||||
/* nothing */
|
||||
} fec;
|
||||
|
||||
struct {
|
||||
/* nothing */
|
||||
} scc;
|
||||
|
||||
struct {
|
||||
int mdio_port; /* port & bit for MDIO */
|
||||
int mdio_bit;
|
||||
int mdc_port; /* port & bit for MDC */
|
||||
int mdc_bit;
|
||||
int delay; /* delay in us */
|
||||
} bitbang;
|
||||
} i;
|
||||
};
|
||||
|
||||
struct fs_platform_info {
|
||||
|
||||
void(*init_ioports)(void);
|
||||
/* device specific information */
|
||||
int fs_no; /* controller index */
|
||||
|
||||
u32 cp_page; /* CPM page */
|
||||
u32 cp_block; /* CPM sblock */
|
||||
|
||||
u32 clk_trx; /* some stuff for pins & mux configuration*/
|
||||
u32 clk_route;
|
||||
u32 clk_mask;
|
||||
|
||||
u32 mem_offset;
|
||||
u32 dpram_offset;
|
||||
u32 fcc_regs_c;
|
||||
|
||||
u32 device_flags;
|
||||
|
||||
int phy_addr; /* the phy address (-1 no phy) */
|
||||
int phy_irq; /* the phy irq (if it exists) */
|
||||
|
||||
const struct fs_mii_bus_info *bus_info;
|
||||
|
||||
int rx_ring, tx_ring; /* number of buffers on rx */
|
||||
__u8 macaddr[6]; /* mac address */
|
||||
int rx_copybreak; /* limit we copy small frames */
|
||||
int use_napi; /* use NAPI */
|
||||
int napi_weight; /* NAPI weight */
|
||||
|
||||
int use_rmii; /* use RMII mode */
|
||||
};
|
||||
|
||||
#endif
|
|
@ -61,7 +61,6 @@ struct fuse_kstatfs {
|
|||
#define FATTR_SIZE (1 << 3)
|
||||
#define FATTR_ATIME (1 << 4)
|
||||
#define FATTR_MTIME (1 << 5)
|
||||
#define FATTR_CTIME (1 << 6)
|
||||
|
||||
/**
|
||||
* Flags returned by the OPEN request
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <asm/io.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/timer.h>
|
||||
|
||||
struct gameport {
|
||||
|
||||
|
|
|
@ -119,7 +119,7 @@ struct gendisk {
|
|||
int policy;
|
||||
|
||||
atomic_t sync_io; /* RAID */
|
||||
unsigned long stamp, stamp_idle;
|
||||
unsigned long stamp;
|
||||
int in_flight;
|
||||
#ifdef CONFIG_SMP
|
||||
struct disk_stats *dkstats;
|
||||
|
@ -132,6 +132,7 @@ struct gendisk {
|
|||
struct disk_attribute {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct gendisk *, char *);
|
||||
ssize_t (*store)(struct gendisk *, const char *, size_t);
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -12,8 +12,8 @@ struct vm_area_struct;
|
|||
* GFP bitmasks..
|
||||
*/
|
||||
/* Zone modifiers in GFP_ZONEMASK (see linux/mmzone.h - low two bits) */
|
||||
#define __GFP_DMA 0x01u
|
||||
#define __GFP_HIGHMEM 0x02u
|
||||
#define __GFP_DMA ((__force gfp_t)0x01u)
|
||||
#define __GFP_HIGHMEM ((__force gfp_t)0x02u)
|
||||
|
||||
/*
|
||||
* Action modifiers - doesn't change the zoning
|
||||
|
@ -26,24 +26,24 @@ struct vm_area_struct;
|
|||
*
|
||||
* __GFP_NORETRY: The VM implementation must not retry indefinitely.
|
||||
*/
|
||||
#define __GFP_WAIT 0x10u /* Can wait and reschedule? */
|
||||
#define __GFP_HIGH 0x20u /* Should access emergency pools? */
|
||||
#define __GFP_IO 0x40u /* Can start physical IO? */
|
||||
#define __GFP_FS 0x80u /* Can call down to low-level FS? */
|
||||
#define __GFP_COLD 0x100u /* Cache-cold page required */
|
||||
#define __GFP_NOWARN 0x200u /* Suppress page allocation failure warning */
|
||||
#define __GFP_REPEAT 0x400u /* Retry the allocation. Might fail */
|
||||
#define __GFP_NOFAIL 0x800u /* Retry for ever. Cannot fail */
|
||||
#define __GFP_NORETRY 0x1000u /* Do not retry. Might fail */
|
||||
#define __GFP_NO_GROW 0x2000u /* Slab internal usage */
|
||||
#define __GFP_COMP 0x4000u /* Add compound page metadata */
|
||||
#define __GFP_ZERO 0x8000u /* Return zeroed page on success */
|
||||
#define __GFP_NOMEMALLOC 0x10000u /* Don't use emergency reserves */
|
||||
#define __GFP_NORECLAIM 0x20000u /* No realy zone reclaim during allocation */
|
||||
#define __GFP_HARDWALL 0x40000u /* Enforce hardwall cpuset memory allocs */
|
||||
#define __GFP_WAIT ((__force gfp_t)0x10u) /* Can wait and reschedule? */
|
||||
#define __GFP_HIGH ((__force gfp_t)0x20u) /* Should access emergency pools? */
|
||||
#define __GFP_IO ((__force gfp_t)0x40u) /* Can start physical IO? */
|
||||
#define __GFP_FS ((__force gfp_t)0x80u) /* Can call down to low-level FS? */
|
||||
#define __GFP_COLD ((__force gfp_t)0x100u) /* Cache-cold page required */
|
||||
#define __GFP_NOWARN ((__force gfp_t)0x200u) /* Suppress page allocation failure warning */
|
||||
#define __GFP_REPEAT ((__force gfp_t)0x400u) /* Retry the allocation. Might fail */
|
||||
#define __GFP_NOFAIL ((__force gfp_t)0x800u) /* Retry for ever. Cannot fail */
|
||||
#define __GFP_NORETRY ((__force gfp_t)0x1000u)/* Do not retry. Might fail */
|
||||
#define __GFP_NO_GROW ((__force gfp_t)0x2000u)/* Slab internal usage */
|
||||
#define __GFP_COMP ((__force gfp_t)0x4000u)/* Add compound page metadata */
|
||||
#define __GFP_ZERO ((__force gfp_t)0x8000u)/* Return zeroed page on success */
|
||||
#define __GFP_NOMEMALLOC ((__force gfp_t)0x10000u) /* Don't use emergency reserves */
|
||||
#define __GFP_NORECLAIM ((__force gfp_t)0x20000u) /* No realy zone reclaim during allocation */
|
||||
#define __GFP_HARDWALL ((__force gfp_t)0x40000u) /* Enforce hardwall cpuset memory allocs */
|
||||
|
||||
#define __GFP_BITS_SHIFT 20 /* Room for 20 __GFP_FOO bits */
|
||||
#define __GFP_BITS_MASK ((1 << __GFP_BITS_SHIFT) - 1)
|
||||
#define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1))
|
||||
|
||||
/* if you forget to add the bitmask here kernel will crash, period */
|
||||
#define GFP_LEVEL_MASK (__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_FS| \
|
||||
|
@ -64,6 +64,7 @@ struct vm_area_struct;
|
|||
|
||||
#define GFP_DMA __GFP_DMA
|
||||
|
||||
#define gfp_zone(mask) ((__force int)((mask) & (__force gfp_t)GFP_ZONEMASK))
|
||||
|
||||
/*
|
||||
* There is only one page-allocator function, and two main namespaces to
|
||||
|
@ -94,7 +95,7 @@ static inline struct page *alloc_pages_node(int nid, gfp_t gfp_mask,
|
|||
return NULL;
|
||||
|
||||
return __alloc_pages(gfp_mask, order,
|
||||
NODE_DATA(nid)->node_zonelists + (gfp_mask & GFP_ZONEMASK));
|
||||
NODE_DATA(nid)->node_zonelists + gfp_zone(gfp_mask));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
|
|
483
include/linux/hil.h
Normal file
483
include/linux/hil.h
Normal file
|
@ -0,0 +1,483 @@
|
|||
#ifndef _HIL_H_
|
||||
#define _HIL_H_
|
||||
|
||||
/*
|
||||
* Hewlett Packard Human Interface Loop (HP-HIL) Protocol -- header.
|
||||
*
|
||||
* Copyright (c) 2001 Brian S. Julin
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL").
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
*
|
||||
* References:
|
||||
* HP-HIL Technical Reference Manual. Hewlett Packard Product No. 45918A
|
||||
*
|
||||
* A note of thanks to HP for providing and shipping reference materials
|
||||
* free of charge to help in the development of HIL support for Linux.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <asm/types.h>
|
||||
|
||||
/* Physical constants relevant to raw loop/device timing.
|
||||
*/
|
||||
|
||||
#define HIL_CLOCK 8MHZ
|
||||
#define HIL_EK1_CLOCK 30HZ
|
||||
#define HIL_EK2_CLOCK 60HZ
|
||||
|
||||
#define HIL_TIMEOUT_DEV 5 /* ms */
|
||||
#define HIL_TIMEOUT_DEVS 10 /* ms */
|
||||
#define HIL_TIMEOUT_NORESP 10 /* ms */
|
||||
#define HIL_TIMEOUT_DEVS_DATA 16 /* ms */
|
||||
#define HIL_TIMEOUT_SELFTEST 200 /* ms */
|
||||
|
||||
|
||||
/* Actual wire line coding. These will only be useful if someone is
|
||||
* implementing a software MLC to run HIL devices on a non-parisc machine.
|
||||
*/
|
||||
|
||||
#define HIL_WIRE_PACKET_LEN 15
|
||||
enum hil_wire_bitpos {
|
||||
HIL_WIRE_START = 0,
|
||||
HIL_WIRE_ADDR2,
|
||||
HIL_WIRE_ADDR1,
|
||||
HIL_WIRE_ADDR0,
|
||||
HIL_WIRE_COMMAND,
|
||||
HIL_WIRE_DATA7,
|
||||
HIL_WIRE_DATA6,
|
||||
HIL_WIRE_DATA5,
|
||||
HIL_WIRE_DATA4,
|
||||
HIL_WIRE_DATA3,
|
||||
HIL_WIRE_DATA2,
|
||||
HIL_WIRE_DATA1,
|
||||
HIL_WIRE_DATA0,
|
||||
HIL_WIRE_PARITY,
|
||||
HIL_WIRE_STOP
|
||||
};
|
||||
|
||||
/* HP documentation uses these bit positions to refer to commands;
|
||||
* we will call these "packets".
|
||||
*/
|
||||
enum hil_pkt_bitpos {
|
||||
HIL_PKT_CMD = 0x00000800,
|
||||
HIL_PKT_ADDR2 = 0x00000400,
|
||||
HIL_PKT_ADDR1 = 0x00000200,
|
||||
HIL_PKT_ADDR0 = 0x00000100,
|
||||
HIL_PKT_ADDR_MASK = 0x00000700,
|
||||
HIL_PKT_ADDR_SHIFT = 8,
|
||||
HIL_PKT_DATA7 = 0x00000080,
|
||||
HIL_PKT_DATA6 = 0x00000040,
|
||||
HIL_PKT_DATA5 = 0x00000020,
|
||||
HIL_PKT_DATA4 = 0x00000010,
|
||||
HIL_PKT_DATA3 = 0x00000008,
|
||||
HIL_PKT_DATA2 = 0x00000004,
|
||||
HIL_PKT_DATA1 = 0x00000002,
|
||||
HIL_PKT_DATA0 = 0x00000001,
|
||||
HIL_PKT_DATA_MASK = 0x000000FF,
|
||||
HIL_PKT_DATA_SHIFT = 0
|
||||
};
|
||||
|
||||
/* The HIL MLC also has several error/status/control bits. We extend the
|
||||
* "packet" to include these when direct access to the MLC is available,
|
||||
* or emulate them in cases where they are not available.
|
||||
*
|
||||
* This way the device driver knows that the underlying MLC driver
|
||||
* has had to deal with loop errors.
|
||||
*/
|
||||
enum hil_error_bitpos {
|
||||
HIL_ERR_OB = 0x00000800, /* MLC is busy sending an auto-poll,
|
||||
or we have filled up the output
|
||||
buffer and must wait. */
|
||||
HIL_ERR_INT = 0x00010000, /* A normal interrupt has occurred. */
|
||||
HIL_ERR_NMI = 0x00020000, /* An NMI has occurred. */
|
||||
HIL_ERR_LERR = 0x00040000, /* A poll didn't come back. */
|
||||
HIL_ERR_PERR = 0x01000000, /* There was a Parity Error. */
|
||||
HIL_ERR_FERR = 0x02000000, /* There was a Framing Error. */
|
||||
HIL_ERR_FOF = 0x04000000 /* Input FIFO Overflowed. */
|
||||
};
|
||||
|
||||
enum hil_control_bitpos {
|
||||
HIL_CTRL_TEST = 0x00010000,
|
||||
HIL_CTRL_IPF = 0x00040000,
|
||||
HIL_CTRL_APE = 0x02000000
|
||||
};
|
||||
|
||||
/* Bits 30,31 are unused, we use them to control write behavior. */
|
||||
#define HIL_DO_ALTER_CTRL 0x40000000 /* Write MSW of packet to control
|
||||
before writing LSW to loop */
|
||||
#define HIL_CTRL_ONLY 0xc0000000 /* *Only* alter the control registers */
|
||||
|
||||
/* This gives us a 32-bit "packet"
|
||||
*/
|
||||
typedef u32 hil_packet;
|
||||
|
||||
|
||||
/* HIL Loop commands
|
||||
*/
|
||||
enum hil_command {
|
||||
HIL_CMD_IFC = 0x00, /* Interface Clear */
|
||||
HIL_CMD_EPT = 0x01, /* Enter Pass-Thru Mode */
|
||||
HIL_CMD_ELB = 0x02, /* Enter Loop-Back Mode */
|
||||
HIL_CMD_IDD = 0x03, /* Identify and Describe */
|
||||
HIL_CMD_DSR = 0x04, /* Device Soft Reset */
|
||||
HIL_CMD_PST = 0x05, /* Perform Self Test */
|
||||
HIL_CMD_RRG = 0x06, /* Read Register */
|
||||
HIL_CMD_WRG = 0x07, /* Write Register */
|
||||
HIL_CMD_ACF = 0x08, /* Auto Configure */
|
||||
HIL_CMDID_ACF = 0x07, /* Auto Configure bits with incremented ID */
|
||||
HIL_CMD_POL = 0x10, /* Poll */
|
||||
HIL_CMDCT_POL = 0x0f, /* Poll command bits with item count */
|
||||
HIL_CMD_RPL = 0x20, /* RePoll */
|
||||
HIL_CMDCT_RPL = 0x0f, /* RePoll command bits with item count */
|
||||
HIL_CMD_RNM = 0x30, /* Report Name */
|
||||
HIL_CMD_RST = 0x31, /* Report Status */
|
||||
HIL_CMD_EXD = 0x32, /* Extended Describe */
|
||||
HIL_CMD_RSC = 0x33, /* Report Security Code */
|
||||
|
||||
/* 0x34 to 0x3c reserved for future use */
|
||||
|
||||
HIL_CMD_DKA = 0x3d, /* Disable Keyswitch Autorepeat */
|
||||
HIL_CMD_EK1 = 0x3e, /* Enable Keyswitch Autorepeat 1 */
|
||||
HIL_CMD_EK2 = 0x3f, /* Enable Keyswitch Autorepeat 2 */
|
||||
HIL_CMD_PR1 = 0x40, /* Prompt1 */
|
||||
HIL_CMD_PR2 = 0x41, /* Prompt2 */
|
||||
HIL_CMD_PR3 = 0x42, /* Prompt3 */
|
||||
HIL_CMD_PR4 = 0x43, /* Prompt4 */
|
||||
HIL_CMD_PR5 = 0x44, /* Prompt5 */
|
||||
HIL_CMD_PR6 = 0x45, /* Prompt6 */
|
||||
HIL_CMD_PR7 = 0x46, /* Prompt7 */
|
||||
HIL_CMD_PRM = 0x47, /* Prompt (General Purpose) */
|
||||
HIL_CMD_AK1 = 0x48, /* Acknowlege1 */
|
||||
HIL_CMD_AK2 = 0x49, /* Acknowlege2 */
|
||||
HIL_CMD_AK3 = 0x4a, /* Acknowlege3 */
|
||||
HIL_CMD_AK4 = 0x4b, /* Acknowlege4 */
|
||||
HIL_CMD_AK5 = 0x4c, /* Acknowlege5 */
|
||||
HIL_CMD_AK6 = 0x4d, /* Acknowlege6 */
|
||||
HIL_CMD_AK7 = 0x4e, /* Acknowlege7 */
|
||||
HIL_CMD_ACK = 0x4f, /* Acknowlege (General Purpose) */
|
||||
|
||||
/* 0x50 to 0x78 reserved for future use */
|
||||
/* 0x80 to 0xEF device-specific commands */
|
||||
/* 0xf0 to 0xf9 reserved for future use */
|
||||
|
||||
HIL_CMD_RIO = 0xfa, /* Register I/O Error */
|
||||
HIL_CMD_SHR = 0xfb, /* System Hard Reset */
|
||||
HIL_CMD_TER = 0xfc, /* Transmission Error */
|
||||
HIL_CMD_CAE = 0xfd, /* Configuration Address Error */
|
||||
HIL_CMD_DHR = 0xfe, /* Device Hard Reset */
|
||||
|
||||
/* 0xff is prohibited from use. */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Response "records" to HIL commands
|
||||
*/
|
||||
|
||||
/* Device ID byte
|
||||
*/
|
||||
#define HIL_IDD_DID_TYPE_MASK 0xe0 /* Primary type bits */
|
||||
#define HIL_IDD_DID_TYPE_KB_INTEGRAL 0xa0 /* Integral keyboard */
|
||||
#define HIL_IDD_DID_TYPE_KB_ITF 0xc0 /* ITD keyboard */
|
||||
#define HIL_IDD_DID_TYPE_KB_RSVD 0xe0 /* Reserved keyboard type */
|
||||
#define HIL_IDD_DID_TYPE_KB_LANG_MASK 0x1f /* Keyboard locale bits */
|
||||
#define HIL_IDD_DID_KBLANG_USE_ESD 0x00 /* Use ESD Locale instead */
|
||||
#define HIL_IDD_DID_TYPE_ABS 0x80 /* Absolute Positioners */
|
||||
#define HIL_IDD_DID_ABS_RSVD1_MASK 0xf8 /* Reserved */
|
||||
#define HIL_IDD_DID_ABS_RSVD1 0x98
|
||||
#define HIL_IDD_DID_ABS_TABLET_MASK 0xf8 /* Tablets and digitizers */
|
||||
#define HIL_IDD_DID_ABS_TABLET 0x90
|
||||
#define HIL_IDD_DID_ABS_TSCREEN_MASK 0xfc /* Touch screens */
|
||||
#define HIL_IDD_DID_ABS_TSCREEN 0x8c
|
||||
#define HIL_IDD_DID_ABS_RSVD2_MASK 0xfc /* Reserved */
|
||||
#define HIL_IDD_DID_ABS_RSVD2 0x88
|
||||
#define HIL_IDD_DID_ABS_RSVD3_MASK 0xfc /* Reserved */
|
||||
#define HIL_IDD_DID_ABS_RSVD3 0x80
|
||||
#define HIL_IDD_DID_TYPE_REL 0x60 /* Relative Positioners */
|
||||
#define HIL_IDD_DID_REL_RSVD1_MASK 0xf0 /* Reserved */
|
||||
#define HIL_IDD_DID_REL_RSVD1 0x70
|
||||
#define HIL_IDD_DID_REL_RSVD2_MASK 0xfc /* Reserved */
|
||||
#define HIL_IDD_DID_REL_RSVD2 0x6c
|
||||
#define HIL_IDD_DID_REL_MOUSE_MASK 0xfc /* Mouse */
|
||||
#define HIL_IDD_DID_REL_MOUSE 0x68
|
||||
#define HIL_IDD_DID_REL_QUAD_MASK 0xf8 /* Other Quadrature Devices */
|
||||
#define HIL_IDD_DID_REL_QUAD 0x60
|
||||
#define HIL_IDD_DID_TYPE_CHAR 0x40 /* Character Entry */
|
||||
#define HIL_IDD_DID_CHAR_BARCODE_MASK 0xfc /* Barcode Reader */
|
||||
#define HIL_IDD_DID_CHAR_BARCODE 0x5c
|
||||
#define HIL_IDD_DID_CHAR_RSVD1_MASK 0xfc /* Reserved */
|
||||
#define HIL_IDD_DID_CHAR_RSVD1 0x58
|
||||
#define HIL_IDD_DID_CHAR_RSVD2_MASK 0xf8 /* Reserved */
|
||||
#define HIL_IDD_DID_CHAR_RSVD2 0x50
|
||||
#define HIL_IDD_DID_CHAR_RSVD3_MASK 0xf0 /* Reserved */
|
||||
#define HIL_IDD_DID_CHAR_RSVD3 0x40
|
||||
#define HIL_IDD_DID_TYPE_OTHER 0x20 /* Miscellaneous */
|
||||
#define HIL_IDD_DID_OTHER_RSVD1_MASK 0xf0 /* Reserved */
|
||||
#define HIL_IDD_DID_OTHER_RSVD1 0x30
|
||||
#define HIL_IDD_DID_OTHER_BARCODE_MASK 0xfc /* Tone Generator */
|
||||
#define HIL_IDD_DID_OTHER_BARCODE 0x2c
|
||||
#define HIL_IDD_DID_OTHER_RSVD2_MASK 0xfc /* Reserved */
|
||||
#define HIL_IDD_DID_OTHER_RSVD2 0x28
|
||||
#define HIL_IDD_DID_OTHER_RSVD3_MASK 0xf8 /* Reserved */
|
||||
#define HIL_IDD_DID_OTHER_RSVD3 0x20
|
||||
#define HIL_IDD_DID_TYPE_KEYPAD 0x00 /* Vectra Keyboard */
|
||||
|
||||
/* IDD record header
|
||||
*/
|
||||
#define HIL_IDD_HEADER_AXSET_MASK 0x03 /* Number of axis in a set */
|
||||
#define HIL_IDD_HEADER_RSC 0x04 /* Supports RSC command */
|
||||
#define HIL_IDD_HEADER_EXD 0x08 /* Supports EXD command */
|
||||
#define HIL_IDD_HEADER_IOD 0x10 /* IOD byte to follow */
|
||||
#define HIL_IDD_HEADER_16BIT 0x20 /* 16 (vs. 8) bit resolution */
|
||||
#define HIL_IDD_HEADER_ABS 0x40 /* Reports Absolute Position */
|
||||
#define HIL_IDD_HEADER_2X_AXIS 0x80 /* Two sets of 1-3 axis */
|
||||
|
||||
/* I/O Descriptor
|
||||
*/
|
||||
#define HIL_IDD_IOD_NBUTTON_MASK 0x07 /* Number of buttons */
|
||||
#define HIL_IDD_IOD_PROXIMITY 0x08 /* Proximity in/out events */
|
||||
#define HIL_IDD_IOD_PROMPT_MASK 0x70 /* Number of prompts/acks */
|
||||
#define HIL_IDD_IOD_PROMPT_SHIFT 4
|
||||
#define HIL_IDD_IOD_PROMPT 0x80 /* Generic prompt/ack */
|
||||
|
||||
#define HIL_IDD_NUM_AXES_PER_SET(header_packet) \
|
||||
((header_packet) & HIL_IDD_HEADER_AXSET_MASK)
|
||||
|
||||
#define HIL_IDD_NUM_AXSETS(header_packet) \
|
||||
(2 - !((header_packet) & HIL_IDD_HEADER_2X_AXIS))
|
||||
|
||||
#define HIL_IDD_LEN(header_packet) \
|
||||
((4 - !(header_packet & HIL_IDD_HEADER_IOD) - \
|
||||
2 * !(HIL_IDD_NUM_AXES_PER_SET(header_packet))) + \
|
||||
2 * HIL_IDD_NUM_AXES_PER_SET(header_packet) * \
|
||||
!!((header_packet) & HIL_IDD_HEADER_ABS))
|
||||
|
||||
/* The following HIL_IDD_* macros assume you have an array of
|
||||
* packets and/or unpacked 8-bit data in the order that they
|
||||
* were received.
|
||||
*/
|
||||
|
||||
#define HIL_IDD_AXIS_COUNTS_PER_M(header_ptr) \
|
||||
(!(HIL_IDD_NUM_AXSETS(*(header_ptr))) ? -1 : \
|
||||
(((*(header_ptr + 1) & HIL_PKT_DATA_MASK) + \
|
||||
((*(header_ptr + 2) & HIL_PKT_DATA_MASK)) << 8) \
|
||||
* ((*(header_ptr) & HIL_IDD_HEADER_16BIT) ? 100 : 1)))
|
||||
|
||||
#define HIL_IDD_AXIS_MAX(header_ptr, __axnum) \
|
||||
((!(*(header_ptr) & HIL_IDD_HEADER_ABS) || \
|
||||
(HIL_IDD_NUM_AXES_PER_SET(*(header_ptr)) <= __axnum)) ? 0 : \
|
||||
((HIL_PKT_DATA_MASK & *((header_ptr) + 3 + 2 * __axnum)) + \
|
||||
((HIL_PKT_DATA_MASK & *((header_ptr) + 4 + 2 * __axnum)) << 8)))
|
||||
|
||||
#define HIL_IDD_IOD(header_ptr) \
|
||||
(*(header_ptr + HIL_IDD_LEN((*header_ptr)) - 1))
|
||||
|
||||
#define HIL_IDD_HAS_GEN_PROMPT(header_ptr) \
|
||||
((*header_ptr & HIL_IDD_HEADER_IOD) && \
|
||||
(HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_PROMPT))
|
||||
|
||||
#define HIL_IDD_HAS_GEN_PROXIMITY(header_ptr) \
|
||||
((*header_ptr & HIL_IDD_HEADER_IOD) && \
|
||||
(HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_PROXIMITY))
|
||||
|
||||
#define HIL_IDD_NUM_BUTTONS(header_ptr) \
|
||||
((*header_ptr & HIL_IDD_HEADER_IOD) ? \
|
||||
(HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_NBUTTON_MASK) : 0)
|
||||
|
||||
#define HIL_IDD_NUM_PROMPTS(header_ptr) \
|
||||
((*header_ptr & HIL_IDD_HEADER_IOD) ? \
|
||||
((HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_NPROMPT_MASK) \
|
||||
>> HIL_IDD_IOD_PROMPT_SHIFT) : 0)
|
||||
|
||||
/* The response to HIL EXD commands -- the "extended describe record" */
|
||||
#define HIL_EXD_HEADER_WRG 0x03 /* Supports type2 WRG */
|
||||
#define HIL_EXD_HEADER_WRG_TYPE1 0x01 /* Supports type1 WRG */
|
||||
#define HIL_EXD_HEADER_WRG_TYPE2 0x02 /* Supports type2 WRG */
|
||||
#define HIL_EXD_HEADER_RRG 0x04 /* Supports RRG command */
|
||||
#define HIL_EXD_HEADER_RNM 0x10 /* Supports RNM command */
|
||||
#define HIL_EXD_HEADER_RST 0x20 /* Supports RST command */
|
||||
#define HIL_EXD_HEADER_LOCALE 0x40 /* Contains locale code */
|
||||
|
||||
#define HIL_EXD_NUM_RRG(header_ptr) \
|
||||
((*header_ptr & HIL_EXD_HEADER_RRG) ? \
|
||||
(*(header_ptr + 1) & HIL_PKT_DATA_MASK) : 0)
|
||||
|
||||
#define HIL_EXD_NUM_WWG(header_ptr) \
|
||||
((*header_ptr & HIL_EXD_HEADER_WRG) ? \
|
||||
(*(header_ptr + 2 - !(*header_ptr & HIL_EXD_HEADER_RRG)) & \
|
||||
HIL_PKT_DATA_MASK) : 0)
|
||||
|
||||
#define HIL_EXD_LEN(header_ptr) \
|
||||
(!!(*header_ptr & HIL_EXD_HEADER_RRG) + \
|
||||
!!(*header_ptr & HIL_EXD_HEADER_WRG) + \
|
||||
!!(*header_ptr & HIL_EXD_HEADER_LOCALE) + \
|
||||
2 * !!(*header_ptr & HIL_EXD_HEADER_WRG_TYPE2) + 1)
|
||||
|
||||
#define HIL_EXD_LOCALE(header_ptr) \
|
||||
(!(*header_ptr & HIL_EXD_HEADER_LOCALE) ? -1 : \
|
||||
(*(header_ptr + HIL_EXD_LEN(header_ptr) - 1) & HIL_PKT_DATA_MASK))
|
||||
|
||||
#define HIL_EXD_WRG_TYPE2_LEN(header_ptr) \
|
||||
(!(*header_ptr & HIL_EXD_HEADER_WRG_TYPE2) ? -1 : \
|
||||
(*(header_ptr + HIL_EXD_LEN(header_ptr) - 2 - \
|
||||
!!(*header_ptr & HIL_EXD_HEADER_LOCALE)) & HIL_PKT_DATA_MASK) + \
|
||||
((*(header_ptr + HIL_EXD_LEN(header_ptr) - 1 - \
|
||||
!!(*header_ptr & HIL_EXD_HEADER_LOCALE)) & HIL_PKT_DATA_MASK) << 8))
|
||||
|
||||
/* Device locale codes. */
|
||||
|
||||
/* Last defined locale code. Everything above this is "Reserved",
|
||||
and note that this same table applies to the Device ID Byte where
|
||||
keyboards may have a nationality code which is only 5 bits. */
|
||||
#define HIL_LOCALE_MAX 0x1f
|
||||
|
||||
/* Map to hopefully useful strings. I was trying to make these look
|
||||
like locale.aliases strings do; maybe that isn't the right table to
|
||||
emulate. In either case, I didn't have much to work on. */
|
||||
#define HIL_LOCALE_MAP \
|
||||
"", /* 0x00 Reserved */ \
|
||||
"", /* 0x01 Reserved */ \
|
||||
"", /* 0x02 Reserved */ \
|
||||
"swiss.french", /* 0x03 Swiss/French */ \
|
||||
"portuguese", /* 0x04 Portuguese */ \
|
||||
"arabic", /* 0x05 Arabic */ \
|
||||
"hebrew", /* 0x06 Hebrew */ \
|
||||
"english.canadian", /* 0x07 Canadian English */ \
|
||||
"turkish", /* 0x08 Turkish */ \
|
||||
"greek", /* 0x09 Greek */ \
|
||||
"thai", /* 0x0a Thai (Thailand) */ \
|
||||
"italian", /* 0x0b Italian */ \
|
||||
"korean", /* 0x0c Hangul (Korea) */ \
|
||||
"dutch", /* 0x0d Dutch */ \
|
||||
"swedish", /* 0x0e Swedish */ \
|
||||
"german", /* 0x0f German */ \
|
||||
"chinese", /* 0x10 Chinese-PRC */ \
|
||||
"chinese", /* 0x11 Chinese-ROC */ \
|
||||
"swiss.french", /* 0x12 Swiss/French II */ \
|
||||
"spanish", /* 0x13 Spanish */ \
|
||||
"swiss.german", /* 0x14 Swiss/German II */ \
|
||||
"flemish", /* 0x15 Belgian (Flemish) */ \
|
||||
"finnish", /* 0x16 Finnish */ \
|
||||
"english.uk", /* 0x17 United Kingdom */ \
|
||||
"french.canadian", /* 0x18 French/Canadian */ \
|
||||
"swiss.german", /* 0x19 Swiss/German */ \
|
||||
"norwegian", /* 0x1a Norwegian */ \
|
||||
"french", /* 0x1b French */ \
|
||||
"danish", /* 0x1c Danish */ \
|
||||
"japanese", /* 0x1d Katakana */ \
|
||||
"spanish", /* 0x1e Latin American/Spanish*/\
|
||||
"english.us" /* 0x1f United States */ \
|
||||
|
||||
|
||||
/* HIL keycodes */
|
||||
#define HIL_KEYCODES_SET1_TBLSIZE 128
|
||||
#define HIL_KEYCODES_SET1 \
|
||||
KEY_5, KEY_RESERVED, KEY_RIGHTALT, KEY_LEFTALT, \
|
||||
KEY_RIGHTSHIFT, KEY_LEFTSHIFT, KEY_LEFTCTRL, KEY_SYSRQ, \
|
||||
KEY_KP4, KEY_KP8, KEY_KP5, KEY_KP9, \
|
||||
KEY_KP6, KEY_KP7, KEY_KPCOMMA, KEY_KPENTER, \
|
||||
KEY_KP1, KEY_KPSLASH, KEY_KP2, KEY_KPPLUS, \
|
||||
KEY_KP3, KEY_KPASTERISK, KEY_KP0, KEY_KPMINUS, \
|
||||
KEY_B, KEY_V, KEY_C, KEY_X, \
|
||||
KEY_Z, KEY_RESERVED, KEY_RESERVED, KEY_ESC, \
|
||||
KEY_6, KEY_F10, KEY_3, KEY_F11, \
|
||||
KEY_KPDOT, KEY_F9, KEY_TAB /*KP*/, KEY_F12, \
|
||||
KEY_H, KEY_G, KEY_F, KEY_D, \
|
||||
KEY_S, KEY_A, KEY_RESERVED, KEY_CAPSLOCK, \
|
||||
KEY_U, KEY_Y, KEY_T, KEY_R, \
|
||||
KEY_E, KEY_W, KEY_Q, KEY_TAB, \
|
||||
KEY_7, KEY_6, KEY_5, KEY_4, \
|
||||
KEY_3, KEY_2, KEY_1, KEY_GRAVE, \
|
||||
KEY_F13, KEY_F14, KEY_F15, KEY_F16, \
|
||||
KEY_F17, KEY_F18, KEY_F19, KEY_F20, \
|
||||
KEY_MENU, KEY_F4, KEY_F3, KEY_F2, \
|
||||
KEY_F1, KEY_VOLUMEUP, KEY_STOP, KEY_SENDFILE, \
|
||||
KEY_SYSRQ, KEY_F5, KEY_F6, KEY_F7, \
|
||||
KEY_F8, KEY_VOLUMEDOWN, KEY_DEL_EOL, KEY_DEL_EOS, \
|
||||
KEY_8, KEY_9, KEY_0, KEY_MINUS, \
|
||||
KEY_EQUAL, KEY_BACKSPACE, KEY_INS_LINE, KEY_DEL_LINE, \
|
||||
KEY_I, KEY_O, KEY_P, KEY_LEFTBRACE, \
|
||||
KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_INSERT, KEY_DELETE, \
|
||||
KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, \
|
||||
KEY_APOSTROPHE, KEY_ENTER, KEY_HOME, KEY_PAGEUP, \
|
||||
KEY_M, KEY_COMMA, KEY_DOT, KEY_SLASH, \
|
||||
KEY_BACKSLASH, KEY_SELECT, KEY_102ND, KEY_PAGEDOWN, \
|
||||
KEY_N, KEY_SPACE, KEY_NEXT, KEY_RESERVED, \
|
||||
KEY_LEFT, KEY_DOWN, KEY_UP, KEY_RIGHT
|
||||
|
||||
|
||||
#define HIL_KEYCODES_SET3_TBLSIZE 128
|
||||
#define HIL_KEYCODES_SET3 \
|
||||
KEY_RESERVED, KEY_ESC, KEY_1, KEY_2, \
|
||||
KEY_3, KEY_4, KEY_5, KEY_6, \
|
||||
KEY_7, KEY_8, KEY_9, KEY_0, \
|
||||
KEY_MINUS, KEY_EQUAL, KEY_BACKSPACE, KEY_TAB, \
|
||||
KEY_Q, KEY_W, KEY_E, KEY_R, \
|
||||
KEY_T, KEY_Y, KEY_U, KEY_I, \
|
||||
KEY_O, KEY_P, KEY_LEFTBRACE, KEY_RIGHTBRACE, \
|
||||
KEY_ENTER, KEY_LEFTCTRL, KEY_A, KEY_S, \
|
||||
KEY_D, KEY_F, KEY_G, KEY_H, \
|
||||
KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, \
|
||||
KEY_APOSTROPHE,KEY_GRAVE, KEY_LEFTSHIFT, KEY_BACKSLASH, \
|
||||
KEY_Z, KEY_X, KEY_C, KEY_V, \
|
||||
KEY_B, KEY_N, KEY_M, KEY_COMMA, \
|
||||
KEY_DOT, KEY_SLASH, KEY_RIGHTSHIFT, KEY_KPASTERISK, \
|
||||
KEY_LEFTALT, KEY_SPACE, KEY_CAPSLOCK, KEY_F1, \
|
||||
KEY_F2, KEY_F3, KEY_F4, KEY_F5, \
|
||||
KEY_F6, KEY_F7, KEY_F8, KEY_F9, \
|
||||
KEY_F10, KEY_NUMLOCK, KEY_SCROLLLOCK, KEY_KP7, \
|
||||
KEY_KP8, KEY_KP9, KEY_KPMINUS, KEY_KP4, \
|
||||
KEY_KP5, KEY_KP6, KEY_KPPLUS, KEY_KP1, \
|
||||
KEY_KP2, KEY_KP3, KEY_KP0, KEY_KPDOT, \
|
||||
KEY_SYSRQ, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \
|
||||
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \
|
||||
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \
|
||||
KEY_UP, KEY_LEFT, KEY_DOWN, KEY_RIGHT, \
|
||||
KEY_HOME, KEY_PAGEUP, KEY_END, KEY_PAGEDOWN, \
|
||||
KEY_INSERT, KEY_DELETE, KEY_102ND, KEY_RESERVED, \
|
||||
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \
|
||||
KEY_F1, KEY_F2, KEY_F3, KEY_F4, \
|
||||
KEY_F5, KEY_F6, KEY_F7, KEY_F8, \
|
||||
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \
|
||||
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED
|
||||
|
||||
|
||||
/* Response to POL command, the "poll record header" */
|
||||
|
||||
#define HIL_POL_NUM_AXES_MASK 0x03 /* Number of axis reported */
|
||||
#define HIL_POL_CTS 0x04 /* Device ready to receive data */
|
||||
#define HIL_POL_STATUS_PENDING 0x08 /* Device has status to report */
|
||||
#define HIL_POL_CHARTYPE_MASK 0x70 /* Type of character data to follow */
|
||||
#define HIL_POL_CHARTYPE_NONE 0x00 /* No character data to follow */
|
||||
#define HIL_POL_CHARTYPE_RSVD1 0x10 /* Reserved Set 1 */
|
||||
#define HIL_POL_CHARTYPE_ASCII 0x20 /* U.S. ASCII */
|
||||
#define HIL_POL_CHARTYPE_BINARY 0x30 /* Binary data */
|
||||
#define HIL_POL_CHARTYPE_SET1 0x40 /* Keycode Set 1 */
|
||||
#define HIL_POL_CHARTYPE_RSVD2 0x50 /* Reserved Set 2 */
|
||||
#define HIL_POL_CHARTYPE_SET2 0x60 /* Keycode Set 2 */
|
||||
#define HIL_POL_CHARTYPE_SET3 0x70 /* Keycode Set 3 */
|
||||
#define HIL_POL_AXIS_ALT 0x80 /* Data is from axis set 2 */
|
||||
|
||||
|
||||
#endif /* _HIL_H_ */
|
168
include/linux/hil_mlc.h
Normal file
168
include/linux/hil_mlc.h
Normal file
|
@ -0,0 +1,168 @@
|
|||
/*
|
||||
* HP Human Interface Loop Master Link Controller driver.
|
||||
*
|
||||
* Copyright (c) 2001 Brian S. Julin
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL").
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
*
|
||||
* References:
|
||||
* HP-HIL Technical Reference Manual. Hewlett Packard Product No. 45918A
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/hil.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <asm/semaphore.h>
|
||||
#include <linux/serio.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
typedef struct hil_mlc hil_mlc;
|
||||
|
||||
/* The HIL has a complicated state engine.
|
||||
* We define the structure of nodes in the state engine here.
|
||||
*/
|
||||
enum hilse_act {
|
||||
/* HILSE_OUT prepares to receive input if the next node
|
||||
* is an IN or EXPECT, and then sends the given packet.
|
||||
*/
|
||||
HILSE_OUT = 0,
|
||||
|
||||
/* HILSE_CTS checks if the loop is busy. */
|
||||
HILSE_CTS,
|
||||
|
||||
/* HILSE_OUT_LAST sends the given command packet to
|
||||
* the last configured/running device on the loop.
|
||||
*/
|
||||
HILSE_OUT_LAST,
|
||||
|
||||
/* HILSE_OUT_DISC sends the given command packet to
|
||||
* the next device past the last configured/running one.
|
||||
*/
|
||||
HILSE_OUT_DISC,
|
||||
|
||||
/* HILSE_FUNC runs a callback function with given arguments.
|
||||
* a positive return value causes the "ugly" branch to be taken.
|
||||
*/
|
||||
HILSE_FUNC,
|
||||
|
||||
/* HILSE_IN simply expects any non-errored packet to arrive
|
||||
* within arg usecs.
|
||||
*/
|
||||
HILSE_IN = 0x100,
|
||||
|
||||
/* HILSE_EXPECT expects a particular packet to arrive
|
||||
* within arg usecs, any other packet is considered an error.
|
||||
*/
|
||||
HILSE_EXPECT,
|
||||
|
||||
/* HILSE_EXPECT_LAST as above but dev field should be last
|
||||
* discovered/operational device.
|
||||
*/
|
||||
HILSE_EXPECT_LAST,
|
||||
|
||||
/* HILSE_EXPECT_LAST as above but dev field should be first
|
||||
* undiscovered/inoperational device.
|
||||
*/
|
||||
HILSE_EXPECT_DISC
|
||||
};
|
||||
|
||||
typedef int (hilse_func) (hil_mlc *mlc, int arg);
|
||||
struct hilse_node {
|
||||
enum hilse_act act; /* How to process this node */
|
||||
union {
|
||||
hilse_func *func; /* Function to call if HILSE_FUNC */
|
||||
hil_packet packet; /* Packet to send or to compare */
|
||||
} object;
|
||||
int arg; /* Timeout in usec or parm for func */
|
||||
int good; /* Node to jump to on success */
|
||||
int bad; /* Node to jump to on error */
|
||||
int ugly; /* Node to jump to on timeout */
|
||||
};
|
||||
|
||||
/* Methods for back-end drivers, e.g. hp_sdc_mlc */
|
||||
typedef int (hil_mlc_cts) (hil_mlc *mlc);
|
||||
typedef void (hil_mlc_out) (hil_mlc *mlc);
|
||||
typedef int (hil_mlc_in) (hil_mlc *mlc, suseconds_t timeout);
|
||||
|
||||
struct hil_mlc_devinfo {
|
||||
uint8_t idd[16]; /* Device ID Byte and Describe Record */
|
||||
uint8_t rsc[16]; /* Security Code Header and Record */
|
||||
uint8_t exd[16]; /* Extended Describe Record */
|
||||
uint8_t rnm[16]; /* Device name as returned by RNM command */
|
||||
};
|
||||
|
||||
struct hil_mlc_serio_map {
|
||||
hil_mlc *mlc;
|
||||
int di_revmap;
|
||||
int didx;
|
||||
};
|
||||
|
||||
/* How many (possibly old/detached) devices the we try to keep track of */
|
||||
#define HIL_MLC_DEVMEM 16
|
||||
|
||||
struct hil_mlc {
|
||||
struct list_head list; /* hil_mlc is organized as linked list */
|
||||
|
||||
rwlock_t lock;
|
||||
|
||||
void *priv; /* Data specific to a particular type of MLC */
|
||||
|
||||
int seidx; /* Current node in state engine */
|
||||
int istarted, ostarted;
|
||||
|
||||
hil_mlc_cts *cts;
|
||||
struct semaphore csem; /* Raised when loop idle */
|
||||
|
||||
hil_mlc_out *out;
|
||||
struct semaphore osem; /* Raised when outpacket dispatched */
|
||||
hil_packet opacket;
|
||||
|
||||
hil_mlc_in *in;
|
||||
struct semaphore isem; /* Raised when a packet arrives */
|
||||
hil_packet ipacket[16];
|
||||
hil_packet imatch;
|
||||
int icount;
|
||||
struct timeval instart;
|
||||
suseconds_t intimeout;
|
||||
|
||||
int ddi; /* Last operational device id */
|
||||
int lcv; /* LCV to throttle loops */
|
||||
struct timeval lcv_tv; /* Time loop was started */
|
||||
|
||||
int di_map[7]; /* Maps below items to live devs */
|
||||
struct hil_mlc_devinfo di[HIL_MLC_DEVMEM];
|
||||
struct serio *serio[HIL_MLC_DEVMEM];
|
||||
struct hil_mlc_serio_map serio_map[HIL_MLC_DEVMEM];
|
||||
hil_packet serio_opacket[HIL_MLC_DEVMEM];
|
||||
int serio_oidx[HIL_MLC_DEVMEM];
|
||||
struct hil_mlc_devinfo di_scratch; /* Temporary area */
|
||||
|
||||
int opercnt;
|
||||
|
||||
struct tasklet_struct *tasklet;
|
||||
};
|
||||
|
||||
int hil_mlc_register(hil_mlc *mlc);
|
||||
int hil_mlc_unregister(hil_mlc *mlc);
|
300
include/linux/hp_sdc.h
Normal file
300
include/linux/hp_sdc.h
Normal file
|
@ -0,0 +1,300 @@
|
|||
/*
|
||||
* HP i8042 System Device Controller -- header
|
||||
*
|
||||
* Copyright (c) 2001 Brian S. Julin
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL").
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
*
|
||||
* References:
|
||||
*
|
||||
* HP-HIL Technical Reference Manual. Hewlett Packard Product No. 45918A
|
||||
*
|
||||
* System Device Controller Microprocessor Firmware Theory of Operation
|
||||
* for Part Number 1820-4784 Revision B. Dwg No. A-1820-4784-2
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_HP_SDC_H
|
||||
#define _LINUX_HP_SDC_H
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/timer.h>
|
||||
#if defined(__hppa__)
|
||||
#include <asm/hardware.h>
|
||||
#endif
|
||||
|
||||
|
||||
/* No 4X status reads take longer than this (in usec).
|
||||
*/
|
||||
#define HP_SDC_MAX_REG_DELAY 20000
|
||||
|
||||
typedef void (hp_sdc_irqhook) (int irq, void *dev_id,
|
||||
uint8_t status, uint8_t data);
|
||||
|
||||
int hp_sdc_request_timer_irq(hp_sdc_irqhook *callback);
|
||||
int hp_sdc_request_hil_irq(hp_sdc_irqhook *callback);
|
||||
int hp_sdc_request_cooked_irq(hp_sdc_irqhook *callback);
|
||||
int hp_sdc_release_timer_irq(hp_sdc_irqhook *callback);
|
||||
int hp_sdc_release_hil_irq(hp_sdc_irqhook *callback);
|
||||
int hp_sdc_release_cooked_irq(hp_sdc_irqhook *callback);
|
||||
|
||||
typedef struct {
|
||||
int actidx; /* Start of act. Acts are atomic WRT I/O to SDC */
|
||||
int idx; /* Index within the act */
|
||||
int endidx; /* transaction is over and done if idx == endidx */
|
||||
uint8_t *seq; /* commands/data for the transaction */
|
||||
union {
|
||||
hp_sdc_irqhook *irqhook; /* Callback, isr or tasklet context */
|
||||
struct semaphore *semaphore; /* Semaphore to sleep on. */
|
||||
} act;
|
||||
} hp_sdc_transaction;
|
||||
int hp_sdc_enqueue_transaction(hp_sdc_transaction *this);
|
||||
int hp_sdc_dequeue_transaction(hp_sdc_transaction *this);
|
||||
|
||||
/* The HP_SDC_ACT* values are peculiar to this driver.
|
||||
* Nuance: never HP_SDC_ACT_DATAIN | HP_SDC_ACT_DEALLOC, use another
|
||||
* act to perform the dealloc.
|
||||
*/
|
||||
#define HP_SDC_ACT_PRECMD 0x01 /* Send a command first */
|
||||
#define HP_SDC_ACT_DATAREG 0x02 /* Set data registers */
|
||||
#define HP_SDC_ACT_DATAOUT 0x04 /* Send data bytes */
|
||||
#define HP_SDC_ACT_POSTCMD 0x08 /* Send command after */
|
||||
#define HP_SDC_ACT_DATAIN 0x10 /* Collect data after */
|
||||
#define HP_SDC_ACT_DURING 0x1f
|
||||
#define HP_SDC_ACT_SEMAPHORE 0x20 /* Raise semaphore after */
|
||||
#define HP_SDC_ACT_CALLBACK 0x40 /* Pass data to IRQ handler */
|
||||
#define HP_SDC_ACT_DEALLOC 0x80 /* Destroy transaction after */
|
||||
#define HP_SDC_ACT_AFTER 0xe0
|
||||
#define HP_SDC_ACT_DEAD 0x60 /* Act timed out. */
|
||||
|
||||
/* Rest of the flags are straightforward representation of the SDC interface */
|
||||
#define HP_SDC_STATUS_IBF 0x02 /* Input buffer full */
|
||||
|
||||
#define HP_SDC_STATUS_IRQMASK 0xf0 /* Bits containing "level 1" irq */
|
||||
#define HP_SDC_STATUS_PERIODIC 0x10 /* Periodic 10ms timer */
|
||||
#define HP_SDC_STATUS_USERTIMER 0x20 /* "Special purpose" timer */
|
||||
#define HP_SDC_STATUS_TIMER 0x30 /* Both PERIODIC and USERTIMER */
|
||||
#define HP_SDC_STATUS_REG 0x40 /* Data from an i8042 register */
|
||||
#define HP_SDC_STATUS_HILCMD 0x50 /* Command from HIL MLC */
|
||||
#define HP_SDC_STATUS_HILDATA 0x60 /* Data from HIL MLC */
|
||||
#define HP_SDC_STATUS_PUP 0x70 /* Sucessful power-up self test */
|
||||
#define HP_SDC_STATUS_KCOOKED 0x80 /* Key from cooked kbd */
|
||||
#define HP_SDC_STATUS_KRPG 0xc0 /* Key from Repeat Gen */
|
||||
#define HP_SDC_STATUS_KMOD_SUP 0x10 /* Shift key is up */
|
||||
#define HP_SDC_STATUS_KMOD_CUP 0x20 /* Control key is up */
|
||||
|
||||
#define HP_SDC_NMISTATUS_FHS 0x40 /* NMI is a fast handshake irq */
|
||||
|
||||
/* Internal i8042 registers (there are more, but they are not too useful). */
|
||||
|
||||
#define HP_SDC_USE 0x02 /* Resource usage (including OB bit) */
|
||||
#define HP_SDC_IM 0x04 /* Interrupt mask */
|
||||
#define HP_SDC_CFG 0x11 /* Configuration register */
|
||||
#define HP_SDC_KBLANGUAGE 0x12 /* Keyboard language */
|
||||
|
||||
#define HP_SDC_D0 0x70 /* General purpose data buffer 0 */
|
||||
#define HP_SDC_D1 0x71 /* General purpose data buffer 1 */
|
||||
#define HP_SDC_D2 0x72 /* General purpose data buffer 2 */
|
||||
#define HP_SDC_D3 0x73 /* General purpose data buffer 3 */
|
||||
#define HP_SDC_VT1 0x74 /* Timer for voice 1 */
|
||||
#define HP_SDC_VT2 0x75 /* Timer for voice 2 */
|
||||
#define HP_SDC_VT3 0x76 /* Timer for voice 3 */
|
||||
#define HP_SDC_VT4 0x77 /* Timer for voice 4 */
|
||||
#define HP_SDC_KBN 0x78 /* Which HIL devs are Nimitz */
|
||||
#define HP_SDC_KBC 0x79 /* Which HIL devs are cooked kbds */
|
||||
#define HP_SDC_LPS 0x7a /* i8042's view of HIL status */
|
||||
#define HP_SDC_LPC 0x7b /* i8042's view of HIL "control" */
|
||||
#define HP_SDC_RSV 0x7c /* Reserved "for testing" */
|
||||
#define HP_SDC_LPR 0x7d /* i8042 count of HIL reconfigs */
|
||||
#define HP_SDC_XTD 0x7e /* "Extended Configuration" register */
|
||||
#define HP_SDC_STR 0x7f /* i8042 self-test result */
|
||||
|
||||
/* Bitfields for above registers */
|
||||
#define HP_SDC_USE_LOOP 0x04 /* Command is currently on the loop. */
|
||||
|
||||
#define HP_SDC_IM_MASK 0x1f /* these bits not part of cmd/status */
|
||||
#define HP_SDC_IM_FH 0x10 /* Mask the fast handshake irq */
|
||||
#define HP_SDC_IM_PT 0x08 /* Mask the periodic timer irq */
|
||||
#define HP_SDC_IM_TIMERS 0x04 /* Mask the MT/DT/CT irq */
|
||||
#define HP_SDC_IM_RESET 0x02 /* Mask the reset key irq */
|
||||
#define HP_SDC_IM_HIL 0x01 /* Mask the HIL MLC irq */
|
||||
|
||||
#define HP_SDC_CFG_ROLLOVER 0x08 /* WTF is "N-key rollover"? */
|
||||
#define HP_SDC_CFG_KBD 0x10 /* There is a keyboard */
|
||||
#define HP_SDC_CFG_NEW 0x20 /* Supports/uses HIL MLC */
|
||||
#define HP_SDC_CFG_KBD_OLD 0x03 /* keyboard code for non-HIL */
|
||||
#define HP_SDC_CFG_KBD_NEW 0x07 /* keyboard code from HIL autoconfig */
|
||||
#define HP_SDC_CFG_REV 0x40 /* Code revision bit */
|
||||
#define HP_SDC_CFG_IDPROM 0x80 /* IDPROM present in kbd (not HIL) */
|
||||
|
||||
#define HP_SDC_LPS_NDEV 0x07 /* # devices autoconfigured on HIL */
|
||||
#define HP_SDC_LPS_ACSUCC 0x08 /* loop autoconfigured successfully */
|
||||
#define HP_SDC_LPS_ACFAIL 0x80 /* last loop autoconfigure failed */
|
||||
|
||||
#define HP_SDC_LPC_APE_IPF 0x01 /* HIL MLC APE/IPF (autopoll) set */
|
||||
#define HP_SDC_LPC_ARCONERR 0x02 /* i8042 autoreconfigs loop on err */
|
||||
#define HP_SDC_LPC_ARCQUIET 0x03 /* i8042 doesn't report autoreconfigs*/
|
||||
#define HP_SDC_LPC_COOK 0x10 /* i8042 cooks devices in _KBN */
|
||||
#define HP_SDC_LPC_RC 0x80 /* causes autoreconfig */
|
||||
|
||||
#define HP_SDC_XTD_REV 0x07 /* contains revision code */
|
||||
#define HP_SDC_XTD_REV_STRINGS(val, str) \
|
||||
switch (val) { \
|
||||
case 0x1: str = "1820-3712"; break; \
|
||||
case 0x2: str = "1820-4379"; break; \
|
||||
case 0x3: str = "1820-4784"; break; \
|
||||
default: str = "unknown"; \
|
||||
};
|
||||
#define HP_SDC_XTD_BEEPER 0x08 /* TI SN76494 beeper available */
|
||||
#define HP_SDC_XTD_BBRTC 0x20 /* OKI MSM-58321 BBRTC present */
|
||||
|
||||
#define HP_SDC_CMD_LOAD_RT 0x31 /* Load real time (from 8042) */
|
||||
#define HP_SDC_CMD_LOAD_FHS 0x36 /* Load the fast handshake timer */
|
||||
#define HP_SDC_CMD_LOAD_MT 0x38 /* Load the match timer */
|
||||
#define HP_SDC_CMD_LOAD_DT 0x3B /* Load the delay timer */
|
||||
#define HP_SDC_CMD_LOAD_CT 0x3E /* Load the cycle timer */
|
||||
|
||||
#define HP_SDC_CMD_SET_IM 0x40 /* 010xxxxx == set irq mask */
|
||||
|
||||
/* The documents provided do not explicitly state that all registers betweem
|
||||
* 0x01 and 0x1f inclusive can be read by sending their register index as a
|
||||
* command, but this is implied and appears to be the case.
|
||||
*/
|
||||
#define HP_SDC_CMD_READ_RAM 0x00 /* Load from i8042 RAM (autoinc) */
|
||||
#define HP_SDC_CMD_READ_USE 0x02 /* Undocumented! Load from usage reg */
|
||||
#define HP_SDC_CMD_READ_IM 0x04 /* Load current interrupt mask */
|
||||
#define HP_SDC_CMD_READ_KCC 0x11 /* Load primary kbd config code */
|
||||
#define HP_SDC_CMD_READ_KLC 0x12 /* Load primary kbd language code */
|
||||
#define HP_SDC_CMD_READ_T1 0x13 /* Load timer output buffer byte 1 */
|
||||
#define HP_SDC_CMD_READ_T2 0x14 /* Load timer output buffer byte 1 */
|
||||
#define HP_SDC_CMD_READ_T3 0x15 /* Load timer output buffer byte 1 */
|
||||
#define HP_SDC_CMD_READ_T4 0x16 /* Load timer output buffer byte 1 */
|
||||
#define HP_SDC_CMD_READ_T5 0x17 /* Load timer output buffer byte 1 */
|
||||
#define HP_SDC_CMD_READ_D0 0xf0 /* Load from i8042 RAM location 0x70 */
|
||||
#define HP_SDC_CMD_READ_D1 0xf1 /* Load from i8042 RAM location 0x71 */
|
||||
#define HP_SDC_CMD_READ_D2 0xf2 /* Load from i8042 RAM location 0x72 */
|
||||
#define HP_SDC_CMD_READ_D3 0xf3 /* Load from i8042 RAM location 0x73 */
|
||||
#define HP_SDC_CMD_READ_VT1 0xf4 /* Load from i8042 RAM location 0x74 */
|
||||
#define HP_SDC_CMD_READ_VT2 0xf5 /* Load from i8042 RAM location 0x75 */
|
||||
#define HP_SDC_CMD_READ_VT3 0xf6 /* Load from i8042 RAM location 0x76 */
|
||||
#define HP_SDC_CMD_READ_VT4 0xf7 /* Load from i8042 RAM location 0x77 */
|
||||
#define HP_SDC_CMD_READ_KBN 0xf8 /* Load from i8042 RAM location 0x78 */
|
||||
#define HP_SDC_CMD_READ_KBC 0xf9 /* Load from i8042 RAM location 0x79 */
|
||||
#define HP_SDC_CMD_READ_LPS 0xfa /* Load from i8042 RAM location 0x7a */
|
||||
#define HP_SDC_CMD_READ_LPC 0xfb /* Load from i8042 RAM location 0x7b */
|
||||
#define HP_SDC_CMD_READ_RSV 0xfc /* Load from i8042 RAM location 0x7c */
|
||||
#define HP_SDC_CMD_READ_LPR 0xfd /* Load from i8042 RAM location 0x7d */
|
||||
#define HP_SDC_CMD_READ_XTD 0xfe /* Load from i8042 RAM location 0x7e */
|
||||
#define HP_SDC_CMD_READ_STR 0xff /* Load from i8042 RAM location 0x7f */
|
||||
|
||||
#define HP_SDC_CMD_SET_ARD 0xA0 /* Set emulated autorepeat delay */
|
||||
#define HP_SDC_CMD_SET_ARR 0xA2 /* Set emulated autorepeat rate */
|
||||
#define HP_SDC_CMD_SET_BELL 0xA3 /* Set voice 3 params for "beep" cmd */
|
||||
#define HP_SDC_CMD_SET_RPGR 0xA6 /* Set "RPG" irq rate (doesn't work) */
|
||||
#define HP_SDC_CMD_SET_RTMS 0xAD /* Set the RTC time (milliseconds) */
|
||||
#define HP_SDC_CMD_SET_RTD 0xAF /* Set the RTC time (days) */
|
||||
#define HP_SDC_CMD_SET_FHS 0xB2 /* Set fast handshake timer */
|
||||
#define HP_SDC_CMD_SET_MT 0xB4 /* Set match timer */
|
||||
#define HP_SDC_CMD_SET_DT 0xB7 /* Set delay timer */
|
||||
#define HP_SDC_CMD_SET_CT 0xBA /* Set cycle timer */
|
||||
#define HP_SDC_CMD_SET_RAMP 0xC1 /* Reset READ_RAM autoinc counter */
|
||||
#define HP_SDC_CMD_SET_D0 0xe0 /* Load to i8042 RAM location 0x70 */
|
||||
#define HP_SDC_CMD_SET_D1 0xe1 /* Load to i8042 RAM location 0x71 */
|
||||
#define HP_SDC_CMD_SET_D2 0xe2 /* Load to i8042 RAM location 0x72 */
|
||||
#define HP_SDC_CMD_SET_D3 0xe3 /* Load to i8042 RAM location 0x73 */
|
||||
#define HP_SDC_CMD_SET_VT1 0xe4 /* Load to i8042 RAM location 0x74 */
|
||||
#define HP_SDC_CMD_SET_VT2 0xe5 /* Load to i8042 RAM location 0x75 */
|
||||
#define HP_SDC_CMD_SET_VT3 0xe6 /* Load to i8042 RAM location 0x76 */
|
||||
#define HP_SDC_CMD_SET_VT4 0xe7 /* Load to i8042 RAM location 0x77 */
|
||||
#define HP_SDC_CMD_SET_KBN 0xe8 /* Load to i8042 RAM location 0x78 */
|
||||
#define HP_SDC_CMD_SET_KBC 0xe9 /* Load to i8042 RAM location 0x79 */
|
||||
#define HP_SDC_CMD_SET_LPS 0xea /* Load to i8042 RAM location 0x7a */
|
||||
#define HP_SDC_CMD_SET_LPC 0xeb /* Load to i8042 RAM location 0x7b */
|
||||
#define HP_SDC_CMD_SET_RSV 0xec /* Load to i8042 RAM location 0x7c */
|
||||
#define HP_SDC_CMD_SET_LPR 0xed /* Load to i8042 RAM location 0x7d */
|
||||
#define HP_SDC_CMD_SET_XTD 0xee /* Load to i8042 RAM location 0x7e */
|
||||
#define HP_SDC_CMD_SET_STR 0xef /* Load to i8042 RAM location 0x7f */
|
||||
|
||||
#define HP_SDC_CMD_DO_RTCW 0xc2 /* i8042 RAM 0x70 --> RTC */
|
||||
#define HP_SDC_CMD_DO_RTCR 0xc3 /* RTC[0x70 0:3] --> irq/status/data */
|
||||
#define HP_SDC_CMD_DO_BEEP 0xc4 /* i8042 RAM 0x70-74 --> beeper,VT3 */
|
||||
#define HP_SDC_CMD_DO_HIL 0xc5 /* i8042 RAM 0x70-73 -->
|
||||
HIL MLC R0,R1 i8042 HIL watchdog */
|
||||
|
||||
/* Values used to (de)mangle input/output to/from the HIL MLC */
|
||||
#define HP_SDC_DATA 0x40 /* Data from an 8042 register */
|
||||
#define HP_SDC_HIL_CMD 0x50 /* Data from HIL MLC R1/8042 */
|
||||
#define HP_SDC_HIL_R1MASK 0x0f /* Contents of HIL MLC R1 0:3 */
|
||||
#define HP_SDC_HIL_AUTO 0x10 /* Set if POL results from i8042 */
|
||||
#define HP_SDC_HIL_ISERR 0x80 /* Has meaning as in next 4 values */
|
||||
#define HP_SDC_HIL_RC_DONE 0x80 /* i8042 auto-configured loop */
|
||||
#define HP_SDC_HIL_ERR 0x81 /* HIL MLC R2 had a bit set */
|
||||
#define HP_SDC_HIL_TO 0x82 /* i8042 HIL watchdog expired */
|
||||
#define HP_SDC_HIL_RC 0x84 /* i8042 is auto-configuring loop */
|
||||
#define HP_SDC_HIL_DAT 0x60 /* Data from HIL MLC R0 */
|
||||
|
||||
|
||||
typedef struct {
|
||||
rwlock_t ibf_lock;
|
||||
rwlock_t lock; /* user/tasklet lock */
|
||||
rwlock_t rtq_lock; /* isr/tasklet lock */
|
||||
rwlock_t hook_lock; /* isr/user lock for handler add/del */
|
||||
|
||||
unsigned int irq, nmi; /* Our IRQ lines */
|
||||
unsigned long base_io, status_io, data_io; /* Our IO ports */
|
||||
|
||||
uint8_t im; /* Interrupt mask */
|
||||
int set_im; /* Interrupt mask needs to be set. */
|
||||
|
||||
int ibf; /* Last known status of IBF flag */
|
||||
uint8_t wi; /* current i8042 write index */
|
||||
uint8_t r7[4]; /* current i8042[0x70 - 0x74] values */
|
||||
uint8_t r11, r7e; /* Values from version/revision regs */
|
||||
|
||||
hp_sdc_irqhook *timer, *reg, *hil, *pup, *cooked;
|
||||
|
||||
#define HP_SDC_QUEUE_LEN 16
|
||||
hp_sdc_transaction *tq[HP_SDC_QUEUE_LEN]; /* All pending read/writes */
|
||||
|
||||
int rcurr, rqty; /* Current read transact in process */
|
||||
struct timeval rtv; /* Time when current read started */
|
||||
int wcurr; /* Current write transact in process */
|
||||
|
||||
int dev_err; /* carries status from registration */
|
||||
#if defined(__hppa__)
|
||||
struct parisc_device *dev;
|
||||
#elif defined(__mc68000__)
|
||||
void *dev;
|
||||
#else
|
||||
#error No support for device registration on this arch yet.
|
||||
#endif
|
||||
|
||||
struct timer_list kicker; /* Keeps below task alive */
|
||||
struct tasklet_struct task;
|
||||
|
||||
} hp_i8042_sdc;
|
||||
|
||||
#endif /* _LINUX_HP_SDC_H */
|
|
@ -16,7 +16,6 @@ static inline int is_vm_hugetlb_page(struct vm_area_struct *vma)
|
|||
int hugetlb_sysctl_handler(struct ctl_table *, int, struct file *, void __user *, size_t *, loff_t *);
|
||||
int copy_hugetlb_page_range(struct mm_struct *, struct mm_struct *, struct vm_area_struct *);
|
||||
int follow_hugetlb_page(struct mm_struct *, struct vm_area_struct *, struct page **, struct vm_area_struct **, unsigned long *, int *, int);
|
||||
void zap_hugepage_range(struct vm_area_struct *, unsigned long, unsigned long);
|
||||
void unmap_hugepage_range(struct vm_area_struct *, unsigned long, unsigned long);
|
||||
int hugetlb_prefault(struct address_space *, struct vm_area_struct *);
|
||||
int hugetlb_report_meminfo(char *);
|
||||
|
@ -87,7 +86,6 @@ static inline unsigned long hugetlb_total_pages(void)
|
|||
#define follow_huge_addr(mm, addr, write) ERR_PTR(-EINVAL)
|
||||
#define copy_hugetlb_page_range(src, dst, vma) ({ BUG(); 0; })
|
||||
#define hugetlb_prefault(mapping, vma) ({ BUG(); 0; })
|
||||
#define zap_hugepage_range(vma, start, len) BUG()
|
||||
#define unmap_hugepage_range(vma, start, end) BUG()
|
||||
#define is_hugepage_mem_enough(size) 0
|
||||
#define hugetlb_report_meminfo(buf) 0
|
||||
|
|
|
@ -21,8 +21,6 @@
|
|||
/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even
|
||||
Frodo Looijaard <frodol@dds.nl> */
|
||||
|
||||
/* $Id: i2c-algo-bit.h,v 1.10 2003/01/21 08:08:16 kmalkki Exp $ */
|
||||
|
||||
#ifndef _LINUX_I2C_ALGO_BIT_H
|
||||
#define _LINUX_I2C_ALGO_BIT_H
|
||||
|
||||
|
@ -46,8 +44,6 @@ struct i2c_algo_bit_data {
|
|||
int timeout; /* in jiffies */
|
||||
};
|
||||
|
||||
#define I2C_BIT_ADAP_MAX 16
|
||||
|
||||
int i2c_bit_add_bus(struct i2c_adapter *);
|
||||
int i2c_bit_del_bus(struct i2c_adapter *);
|
||||
|
||||
|
|
|
@ -9,8 +9,6 @@ struct i2c_algo_pca_data {
|
|||
int (*wait_for_interrupt) (struct i2c_algo_pca_data *adap);
|
||||
};
|
||||
|
||||
#define I2C_PCA_ADAP_MAX 16
|
||||
|
||||
int i2c_pca_add_bus(struct i2c_adapter *);
|
||||
int i2c_pca_del_bus(struct i2c_adapter *);
|
||||
|
||||
|
|
|
@ -22,8 +22,6 @@
|
|||
/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even
|
||||
Frodo Looijaard <frodol@dds.nl> */
|
||||
|
||||
/* $Id: i2c-algo-pcf.h,v 1.8 2003/01/21 08:08:16 kmalkki Exp $ */
|
||||
|
||||
#ifndef _LINUX_I2C_ALGO_PCF_H
|
||||
#define _LINUX_I2C_ALGO_PCF_H
|
||||
|
||||
|
@ -41,8 +39,6 @@ struct i2c_algo_pcf_data {
|
|||
int timeout;
|
||||
};
|
||||
|
||||
#define I2C_PCF_ADAP_MAX 16
|
||||
|
||||
int i2c_pcf_add_bus(struct i2c_adapter *);
|
||||
int i2c_pcf_del_bus(struct i2c_adapter *);
|
||||
|
||||
|
|
|
@ -19,8 +19,6 @@
|
|||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/* $Id: i2c-dev.h,v 1.13 2003/01/21 08:08:16 kmalkki Exp $ */
|
||||
|
||||
#ifndef _LINUX_I2C_DEV_H
|
||||
#define _LINUX_I2C_DEV_H
|
||||
|
||||
|
|
|
@ -164,10 +164,7 @@
|
|||
|
||||
/* --- Bit algorithm adapters */
|
||||
#define I2C_HW_B_LP 0x010000 /* Parallel port Philips style */
|
||||
#define I2C_HW_B_LPC 0x010001 /* Parallel port control reg. */
|
||||
#define I2C_HW_B_SER 0x010002 /* Serial line interface */
|
||||
#define I2C_HW_B_ELV 0x010003 /* ELV Card */
|
||||
#define I2C_HW_B_VELLE 0x010004 /* Vellemann K8000 */
|
||||
#define I2C_HW_B_BT848 0x010005 /* BT848 video boards */
|
||||
#define I2C_HW_B_WNV 0x010006 /* Winnov Videums */
|
||||
#define I2C_HW_B_VIA 0x010007 /* Via vt82c586b */
|
||||
|
|
|
@ -23,15 +23,15 @@
|
|||
/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and
|
||||
Frodo Looijaard <frodol@dds.nl> */
|
||||
|
||||
/* $Id: i2c.h,v 1.68 2003/01/21 08:08:16 kmalkki Exp $ */
|
||||
|
||||
#ifndef _LINUX_I2C_H
|
||||
#define _LINUX_I2C_H
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/i2c-id.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/device.h> /* for struct device */
|
||||
#include <linux/sched.h> /* for completion */
|
||||
#include <asm/semaphore.h>
|
||||
|
||||
/* --- For i2c-isa ---------------------------------------------------- */
|
||||
|
@ -94,10 +94,10 @@ extern s32 i2c_smbus_write_byte_data(struct i2c_client * client,
|
|||
extern s32 i2c_smbus_read_word_data(struct i2c_client * client, u8 command);
|
||||
extern s32 i2c_smbus_write_word_data(struct i2c_client * client,
|
||||
u8 command, u16 value);
|
||||
/* Returns the number of bytes transferred */
|
||||
extern s32 i2c_smbus_write_block_data(struct i2c_client * client,
|
||||
u8 command, u8 length,
|
||||
u8 *values);
|
||||
/* Returns the number of read bytes */
|
||||
extern s32 i2c_smbus_read_i2c_block_data(struct i2c_client * client,
|
||||
u8 command, u8 *values);
|
||||
|
||||
|
@ -391,10 +391,6 @@ struct i2c_msg {
|
|||
#define I2C_FUNC_10BIT_ADDR 0x00000002
|
||||
#define I2C_FUNC_PROTOCOL_MANGLING 0x00000004 /* I2C_M_{REV_DIR_ADDR,NOSTART,..} */
|
||||
#define I2C_FUNC_SMBUS_HWPEC_CALC 0x00000008 /* SMBus 2.0 */
|
||||
#define I2C_FUNC_SMBUS_READ_WORD_DATA_PEC 0x00000800 /* SMBus 2.0 */
|
||||
#define I2C_FUNC_SMBUS_WRITE_WORD_DATA_PEC 0x00001000 /* SMBus 2.0 */
|
||||
#define I2C_FUNC_SMBUS_PROC_CALL_PEC 0x00002000 /* SMBus 2.0 */
|
||||
#define I2C_FUNC_SMBUS_BLOCK_PROC_CALL_PEC 0x00004000 /* SMBus 2.0 */
|
||||
#define I2C_FUNC_SMBUS_BLOCK_PROC_CALL 0x00008000 /* SMBus 2.0 */
|
||||
#define I2C_FUNC_SMBUS_QUICK 0x00010000
|
||||
#define I2C_FUNC_SMBUS_READ_BYTE 0x00020000
|
||||
|
@ -410,8 +406,6 @@ struct i2c_msg {
|
|||
#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 0x08000000 /* w/ 1-byte reg. addr. */
|
||||
#define I2C_FUNC_SMBUS_READ_I2C_BLOCK_2 0x10000000 /* I2C-like block xfer */
|
||||
#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK_2 0x20000000 /* w/ 2-byte reg. addr. */
|
||||
#define I2C_FUNC_SMBUS_READ_BLOCK_DATA_PEC 0x40000000 /* SMBus 2.0 */
|
||||
#define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA_PEC 0x80000000 /* SMBus 2.0 */
|
||||
|
||||
#define I2C_FUNC_SMBUS_BYTE (I2C_FUNC_SMBUS_READ_BYTE | \
|
||||
I2C_FUNC_SMBUS_WRITE_BYTE)
|
||||
|
@ -425,17 +419,6 @@ struct i2c_msg {
|
|||
I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)
|
||||
#define I2C_FUNC_SMBUS_I2C_BLOCK_2 (I2C_FUNC_SMBUS_READ_I2C_BLOCK_2 | \
|
||||
I2C_FUNC_SMBUS_WRITE_I2C_BLOCK_2)
|
||||
#define I2C_FUNC_SMBUS_BLOCK_DATA_PEC (I2C_FUNC_SMBUS_READ_BLOCK_DATA_PEC | \
|
||||
I2C_FUNC_SMBUS_WRITE_BLOCK_DATA_PEC)
|
||||
#define I2C_FUNC_SMBUS_WORD_DATA_PEC (I2C_FUNC_SMBUS_READ_WORD_DATA_PEC | \
|
||||
I2C_FUNC_SMBUS_WRITE_WORD_DATA_PEC)
|
||||
|
||||
#define I2C_FUNC_SMBUS_READ_BYTE_PEC I2C_FUNC_SMBUS_READ_BYTE_DATA
|
||||
#define I2C_FUNC_SMBUS_WRITE_BYTE_PEC I2C_FUNC_SMBUS_WRITE_BYTE_DATA
|
||||
#define I2C_FUNC_SMBUS_READ_BYTE_DATA_PEC I2C_FUNC_SMBUS_READ_WORD_DATA
|
||||
#define I2C_FUNC_SMBUS_WRITE_BYTE_DATA_PEC I2C_FUNC_SMBUS_WRITE_WORD_DATA
|
||||
#define I2C_FUNC_SMBUS_BYTE_PEC I2C_FUNC_SMBUS_BYTE_DATA
|
||||
#define I2C_FUNC_SMBUS_BYTE_DATA_PEC I2C_FUNC_SMBUS_WORD_DATA
|
||||
|
||||
#define I2C_FUNC_SMBUS_EMUL (I2C_FUNC_SMBUS_QUICK | \
|
||||
I2C_FUNC_SMBUS_BYTE | \
|
||||
|
@ -443,20 +426,17 @@ struct i2c_msg {
|
|||
I2C_FUNC_SMBUS_WORD_DATA | \
|
||||
I2C_FUNC_SMBUS_PROC_CALL | \
|
||||
I2C_FUNC_SMBUS_WRITE_BLOCK_DATA | \
|
||||
I2C_FUNC_SMBUS_WRITE_BLOCK_DATA_PEC | \
|
||||
I2C_FUNC_SMBUS_I2C_BLOCK)
|
||||
|
||||
/*
|
||||
* Data for SMBus Messages
|
||||
*/
|
||||
#define I2C_SMBUS_BLOCK_MAX 32 /* As specified in SMBus standard */
|
||||
#define I2C_SMBUS_I2C_BLOCK_MAX 32 /* Not specified but we use same structure */
|
||||
union i2c_smbus_data {
|
||||
__u8 byte;
|
||||
__u16 word;
|
||||
__u8 block[I2C_SMBUS_BLOCK_MAX + 3]; /* block[0] is used for length */
|
||||
/* one more for read length in block process call */
|
||||
/* and one more for PEC */
|
||||
__u8 block[I2C_SMBUS_BLOCK_MAX + 2]; /* block[0] is used for length */
|
||||
/* and one more for user-space compatibility */
|
||||
};
|
||||
|
||||
/* smbus_access read or write markers */
|
||||
|
@ -473,10 +453,6 @@ union i2c_smbus_data {
|
|||
#define I2C_SMBUS_BLOCK_DATA 5
|
||||
#define I2C_SMBUS_I2C_BLOCK_DATA 6
|
||||
#define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */
|
||||
#define I2C_SMBUS_BLOCK_DATA_PEC 8 /* SMBus 2.0 */
|
||||
#define I2C_SMBUS_PROC_CALL_PEC 9 /* SMBus 2.0 */
|
||||
#define I2C_SMBUS_BLOCK_PROC_CALL_PEC 10 /* SMBus 2.0 */
|
||||
#define I2C_SMBUS_WORD_DATA_PEC 11 /* SMBus 2.0 */
|
||||
|
||||
|
||||
/* ----- commands for the ioctl like i2c_command call:
|
||||
|
@ -506,11 +482,6 @@ union i2c_smbus_data {
|
|||
|
||||
#define I2C_SMBUS 0x0720 /* SMBus-level access */
|
||||
|
||||
/* ... algo-bit.c recognizes */
|
||||
#define I2C_UDELAY 0x0705 /* set delay in microsecs between each */
|
||||
/* written byte (except address) */
|
||||
#define I2C_MDELAY 0x0706 /* millisec delay between written bytes */
|
||||
|
||||
/* ----- I2C-DEV: char device interface stuff ------------------------- */
|
||||
|
||||
#define I2C_MAJOR 89 /* Device major number */
|
||||
|
|
|
@ -25,10 +25,14 @@
|
|||
/* How many different OSM's are we allowing */
|
||||
#define I2O_MAX_DRIVERS 8
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/semaphore.h> /* Needed for MUTEX init macros */
|
||||
#include <linux/pci.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/workqueue.h> /* work_struct */
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/semaphore.h> /* Needed for MUTEX init macros */
|
||||
|
||||
/* message queue empty */
|
||||
#define I2O_QUEUE_EMPTY 0xffffffff
|
||||
|
@ -66,8 +70,6 @@ struct i2o_device {
|
|||
struct device device;
|
||||
|
||||
struct semaphore lock; /* device lock */
|
||||
|
||||
struct class_device classdev; /* i2o device class */
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -194,7 +196,7 @@ struct i2o_controller {
|
|||
struct resource mem_resource; /* Mem resource allocated to the IOP */
|
||||
|
||||
struct device device;
|
||||
struct class_device classdev; /* I2O controller class */
|
||||
struct class_device *classdev; /* I2O controller class device */
|
||||
struct i2o_device *exec; /* Executive */
|
||||
#if BITS_PER_LONG == 64
|
||||
spinlock_t context_list_lock; /* lock for context_list */
|
||||
|
@ -492,7 +494,7 @@ static inline int i2o_dma_map_sg(struct i2o_controller *c,
|
|||
* Returns 0 on success or -ENOMEM on failure.
|
||||
*/
|
||||
static inline int i2o_dma_alloc(struct device *dev, struct i2o_dma *addr,
|
||||
size_t len, unsigned int gfp_mask)
|
||||
size_t len, gfp_t gfp_mask)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
int dma_64 = 0;
|
||||
|
@ -551,7 +553,7 @@ static inline void i2o_dma_free(struct device *dev, struct i2o_dma *addr)
|
|||
* Returns the 0 on success or negative error code on failure.
|
||||
*/
|
||||
static inline int i2o_dma_realloc(struct device *dev, struct i2o_dma *addr,
|
||||
size_t len, unsigned int gfp_mask)
|
||||
size_t len, gfp_t gfp_mask)
|
||||
{
|
||||
i2o_dma_free(dev, addr);
|
||||
|
||||
|
|
|
@ -7,8 +7,8 @@
|
|||
/* ported to the Alpha architecture 02/20/96 (just used the HZ macro) */
|
||||
|
||||
#define TR_RETRY_INTERVAL (30*HZ) /* 500 on PC = 5 s */
|
||||
#define TR_RST_TIME (HZ/20) /* 5 on PC = 50 ms */
|
||||
#define TR_BUSY_INTERVAL (HZ/5) /* 5 on PC = 200 ms */
|
||||
#define TR_RST_TIME (msecs_to_jiffies(50)) /* 5 on PC = 50 ms */
|
||||
#define TR_BUSY_INTERVAL (msecs_to_jiffies(200)) /* 5 on PC = 200 ms */
|
||||
#define TR_SPIN_INTERVAL (3*HZ) /* 3 seconds before init timeout */
|
||||
|
||||
#define TR_ISA 1
|
||||
|
|
|
@ -218,7 +218,7 @@ typedef enum { ide_unknown, ide_generic, ide_pci,
|
|||
ide_rz1000, ide_trm290,
|
||||
ide_cmd646, ide_cy82c693, ide_4drives,
|
||||
ide_pmac, ide_etrax100, ide_acorn,
|
||||
ide_forced
|
||||
ide_au1xxx, ide_forced
|
||||
} hwif_chipset_t;
|
||||
|
||||
/*
|
||||
|
|
|
@ -71,7 +71,7 @@ struct idr {
|
|||
*/
|
||||
|
||||
void *idr_find(struct idr *idp, int id);
|
||||
int idr_pre_get(struct idr *idp, unsigned gfp_mask);
|
||||
int idr_pre_get(struct idr *idp, gfp_t gfp_mask);
|
||||
int idr_get_new(struct idr *idp, void *ptr, int *id);
|
||||
int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id);
|
||||
void idr_remove(struct idr *idp, int id);
|
||||
|
|
|
@ -84,6 +84,7 @@
|
|||
#define ARPHRD_IEEE802_TR 800 /* Magic type ident for TR */
|
||||
#define ARPHRD_IEEE80211 801 /* IEEE 802.11 */
|
||||
#define ARPHRD_IEEE80211_PRISM 802 /* IEEE 802.11 + Prism2 header */
|
||||
#define ARPHRD_IEEE80211_RADIOTAP 803 /* IEEE 802.11 + radiotap header */
|
||||
|
||||
#define ARPHRD_VOID 0xFFFF /* Void type, nothing is known */
|
||||
#define ARPHRD_NONE 0xFFFE /* zero header length */
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#ifdef __KERNEL__
|
||||
#include <linux/time.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/device.h>
|
||||
#else
|
||||
#include <sys/time.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
@ -644,6 +645,7 @@ struct input_absinfo {
|
|||
#define BUS_ADB 0x17
|
||||
#define BUS_I2C 0x18
|
||||
#define BUS_HOST 0x19
|
||||
#define BUS_GSC 0x1A
|
||||
|
||||
/*
|
||||
* Values describing the status of an effect
|
||||
|
@ -889,11 +891,15 @@ struct input_dev {
|
|||
struct semaphore sem; /* serializes open and close operations */
|
||||
unsigned int users;
|
||||
|
||||
struct device *dev;
|
||||
struct class_device cdev;
|
||||
struct device *dev; /* will be removed soon */
|
||||
|
||||
int dynalloc; /* temporarily */
|
||||
|
||||
struct list_head h_list;
|
||||
struct list_head node;
|
||||
};
|
||||
#define to_input_dev(d) container_of(d, struct input_dev, cdev)
|
||||
|
||||
/*
|
||||
* Structure for hotplug & device<->driver matching.
|
||||
|
@ -984,6 +990,23 @@ static inline void init_input_dev(struct input_dev *dev)
|
|||
INIT_LIST_HEAD(&dev->node);
|
||||
}
|
||||
|
||||
struct input_dev *input_allocate_device(void);
|
||||
|
||||
static inline void input_free_device(struct input_dev *dev)
|
||||
{
|
||||
kfree(dev);
|
||||
}
|
||||
|
||||
static inline struct input_dev *input_get_device(struct input_dev *dev)
|
||||
{
|
||||
return to_input_dev(class_device_get(&dev->cdev));
|
||||
}
|
||||
|
||||
static inline void input_put_device(struct input_dev *dev)
|
||||
{
|
||||
class_device_put(&dev->cdev);
|
||||
}
|
||||
|
||||
void input_register_device(struct input_dev *);
|
||||
void input_unregister_device(struct input_dev *);
|
||||
|
||||
|
@ -1052,7 +1075,7 @@ static inline void input_set_abs_params(struct input_dev *dev, int axis, int min
|
|||
dev->absbit[LONG(axis)] |= BIT(axis);
|
||||
}
|
||||
|
||||
extern struct class *input_class;
|
||||
extern struct class input_class;
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -69,7 +69,7 @@ extern int journal_enable_debug;
|
|||
#define jbd_debug(f, a...) /**/
|
||||
#endif
|
||||
|
||||
extern void * __jbd_kmalloc (const char *where, size_t size, int flags, int retry);
|
||||
extern void * __jbd_kmalloc (const char *where, size_t size, gfp_t flags, int retry);
|
||||
#define jbd_kmalloc(size, flags) \
|
||||
__jbd_kmalloc(__FUNCTION__, (size), (flags), journal_oom_retry)
|
||||
#define jbd_rep_kmalloc(size, flags) \
|
||||
|
@ -890,7 +890,7 @@ extern int journal_forget (handle_t *, struct buffer_head *);
|
|||
extern void journal_sync_buffer (struct buffer_head *);
|
||||
extern int journal_invalidatepage(journal_t *,
|
||||
struct page *, unsigned long);
|
||||
extern int journal_try_to_free_buffers(journal_t *, struct page *, int);
|
||||
extern int journal_try_to_free_buffers(journal_t *, struct page *, gfp_t);
|
||||
extern int journal_stop(handle_t *);
|
||||
extern int journal_flush (journal_t *);
|
||||
extern void journal_lock_updates (journal_t *);
|
||||
|
|
|
@ -307,7 +307,7 @@ struct sysinfo {
|
|||
char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */
|
||||
};
|
||||
|
||||
/* Force a compilation error if condition is false */
|
||||
/* Force a compilation error if condition is true */
|
||||
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
|
|
|
@ -24,7 +24,8 @@ extern spinlock_t key_serial_lock;
|
|||
#define KEY_WRITE 0x04 /* require permission to update / modify */
|
||||
#define KEY_SEARCH 0x08 /* require permission to search (keyring) or find (key) */
|
||||
#define KEY_LINK 0x10 /* require permission to link */
|
||||
#define KEY_ALL 0x1f /* all the above permissions */
|
||||
#define KEY_SETATTR 0x20 /* require permission to change attributes */
|
||||
#define KEY_ALL 0x3f /* all the above permissions */
|
||||
|
||||
/*
|
||||
* the keyring payload contains a list of the keys to which the keyring is
|
||||
|
|
|
@ -40,28 +40,32 @@ struct key;
|
|||
#define KEY_POS_WRITE 0x04000000 /* possessor can update key payload / add link to keyring */
|
||||
#define KEY_POS_SEARCH 0x08000000 /* possessor can find a key in search / search a keyring */
|
||||
#define KEY_POS_LINK 0x10000000 /* possessor can create a link to a key/keyring */
|
||||
#define KEY_POS_ALL 0x1f000000
|
||||
#define KEY_POS_SETATTR 0x20000000 /* possessor can set key attributes */
|
||||
#define KEY_POS_ALL 0x3f000000
|
||||
|
||||
#define KEY_USR_VIEW 0x00010000 /* user permissions... */
|
||||
#define KEY_USR_READ 0x00020000
|
||||
#define KEY_USR_WRITE 0x00040000
|
||||
#define KEY_USR_SEARCH 0x00080000
|
||||
#define KEY_USR_LINK 0x00100000
|
||||
#define KEY_USR_ALL 0x001f0000
|
||||
#define KEY_USR_SETATTR 0x00200000
|
||||
#define KEY_USR_ALL 0x003f0000
|
||||
|
||||
#define KEY_GRP_VIEW 0x00000100 /* group permissions... */
|
||||
#define KEY_GRP_READ 0x00000200
|
||||
#define KEY_GRP_WRITE 0x00000400
|
||||
#define KEY_GRP_SEARCH 0x00000800
|
||||
#define KEY_GRP_LINK 0x00001000
|
||||
#define KEY_GRP_ALL 0x00001f00
|
||||
#define KEY_GRP_SETATTR 0x00002000
|
||||
#define KEY_GRP_ALL 0x00003f00
|
||||
|
||||
#define KEY_OTH_VIEW 0x00000001 /* third party permissions... */
|
||||
#define KEY_OTH_READ 0x00000002
|
||||
#define KEY_OTH_WRITE 0x00000004
|
||||
#define KEY_OTH_SEARCH 0x00000008
|
||||
#define KEY_OTH_LINK 0x00000010
|
||||
#define KEY_OTH_ALL 0x0000001f
|
||||
#define KEY_OTH_SETATTR 0x00000020
|
||||
#define KEY_OTH_ALL 0x0000003f
|
||||
|
||||
struct seq_file;
|
||||
struct user_struct;
|
||||
|
@ -119,6 +123,7 @@ struct key {
|
|||
struct key_type *type; /* type of key */
|
||||
struct rw_semaphore sem; /* change vs change sem */
|
||||
struct key_user *user; /* owner of this key */
|
||||
void *security; /* security data for this key */
|
||||
time_t expiry; /* time at which key expires (or 0) */
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
#ifdef __KERNEL__
|
||||
|
||||
#include <asm/semaphore.h>
|
||||
|
||||
typedef struct kobject *kobj_probe_t(dev_t, int *, void *);
|
||||
struct kobj_map;
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ extern void kobject_unregister(struct kobject *);
|
|||
extern struct kobject * kobject_get(struct kobject *);
|
||||
extern void kobject_put(struct kobject *);
|
||||
|
||||
extern char * kobject_get_path(struct kobject *, int);
|
||||
extern char * kobject_get_path(struct kobject *, gfp_t);
|
||||
|
||||
struct kobj_type {
|
||||
void (*release)(struct kobject *);
|
||||
|
|
|
@ -69,6 +69,18 @@ void kthread_bind(struct task_struct *k, unsigned int cpu);
|
|||
* was never called. */
|
||||
int kthread_stop(struct task_struct *k);
|
||||
|
||||
/**
|
||||
* kthread_stop_sem: stop a thread created by kthread_create().
|
||||
* @k: thread created by kthread_create().
|
||||
* @s: semaphore that @k waits on while idle.
|
||||
*
|
||||
* Does essentially the same thing as kthread_stop() above, but wakes
|
||||
* @k by calling up(@s).
|
||||
*
|
||||
* Returns the result of threadfn(), or -EINTR if wake_up_process()
|
||||
* was never called. */
|
||||
int kthread_stop_sem(struct task_struct *k, struct semaphore *s);
|
||||
|
||||
/**
|
||||
* kthread_should_stop: should this kthread return now?
|
||||
*
|
||||
|
|
|
@ -91,12 +91,13 @@ enum {
|
|||
ATA_SHT_EMULATED = 1,
|
||||
ATA_SHT_CMD_PER_LUN = 1,
|
||||
ATA_SHT_THIS_ID = -1,
|
||||
ATA_SHT_USE_CLUSTERING = 0,
|
||||
ATA_SHT_USE_CLUSTERING = 1,
|
||||
|
||||
/* struct ata_device stuff */
|
||||
ATA_DFLAG_LBA48 = (1 << 0), /* device supports LBA48 */
|
||||
ATA_DFLAG_PIO = (1 << 1), /* device currently in PIO mode */
|
||||
ATA_DFLAG_LOCK_SECTORS = (1 << 2), /* don't adjust max_sectors */
|
||||
ATA_DFLAG_LBA = (1 << 3), /* device supports LBA */
|
||||
|
||||
ATA_DEV_UNKNOWN = 0, /* unknown device */
|
||||
ATA_DEV_ATA = 1, /* ATA device */
|
||||
|
@ -154,17 +155,28 @@ enum {
|
|||
ATA_SHIFT_UDMA = 0,
|
||||
ATA_SHIFT_MWDMA = 8,
|
||||
ATA_SHIFT_PIO = 11,
|
||||
|
||||
/* Masks for port functions */
|
||||
ATA_PORT_PRIMARY = (1 << 0),
|
||||
ATA_PORT_SECONDARY = (1 << 1),
|
||||
};
|
||||
|
||||
enum pio_task_states {
|
||||
PIO_ST_UNKNOWN,
|
||||
PIO_ST_IDLE,
|
||||
PIO_ST_POLL,
|
||||
PIO_ST_TMOUT,
|
||||
PIO_ST,
|
||||
PIO_ST_LAST,
|
||||
PIO_ST_LAST_POLL,
|
||||
PIO_ST_ERR,
|
||||
enum hsm_task_states {
|
||||
HSM_ST_UNKNOWN,
|
||||
HSM_ST_IDLE,
|
||||
HSM_ST_POLL,
|
||||
HSM_ST_TMOUT,
|
||||
HSM_ST,
|
||||
HSM_ST_LAST,
|
||||
HSM_ST_LAST_POLL,
|
||||
HSM_ST_ERR,
|
||||
};
|
||||
|
||||
enum ata_completion_errors {
|
||||
AC_ERR_OTHER = (1 << 0),
|
||||
AC_ERR_DEV = (1 << 1),
|
||||
AC_ERR_ATA_BUS = (1 << 2),
|
||||
AC_ERR_HOST_BUS = (1 << 3),
|
||||
};
|
||||
|
||||
/* forward declarations */
|
||||
|
@ -174,7 +186,7 @@ struct ata_port;
|
|||
struct ata_queued_cmd;
|
||||
|
||||
/* typedefs */
|
||||
typedef int (*ata_qc_cb_t) (struct ata_queued_cmd *qc, u8 drv_stat);
|
||||
typedef int (*ata_qc_cb_t) (struct ata_queued_cmd *qc, unsigned int err_mask);
|
||||
|
||||
struct ata_ioports {
|
||||
unsigned long cmd_addr;
|
||||
|
@ -197,7 +209,7 @@ struct ata_ioports {
|
|||
struct ata_probe_ent {
|
||||
struct list_head node;
|
||||
struct device *dev;
|
||||
struct ata_port_operations *port_ops;
|
||||
const struct ata_port_operations *port_ops;
|
||||
Scsi_Host_Template *sht;
|
||||
struct ata_ioports port[ATA_MAX_PORTS];
|
||||
unsigned int n_ports;
|
||||
|
@ -220,7 +232,7 @@ struct ata_host_set {
|
|||
void __iomem *mmio_base;
|
||||
unsigned int n_ports;
|
||||
void *private_data;
|
||||
struct ata_port_operations *ops;
|
||||
const struct ata_port_operations *ops;
|
||||
struct ata_port * ports[0];
|
||||
};
|
||||
|
||||
|
@ -278,15 +290,18 @@ struct ata_device {
|
|||
u8 xfer_mode;
|
||||
unsigned int xfer_shift; /* ATA_SHIFT_xxx */
|
||||
|
||||
/* cache info about current transfer mode */
|
||||
u8 xfer_protocol; /* taskfile xfer protocol */
|
||||
u8 read_cmd; /* opcode to use on read */
|
||||
u8 write_cmd; /* opcode to use on write */
|
||||
unsigned int multi_count; /* sectors count for
|
||||
READ/WRITE MULTIPLE */
|
||||
|
||||
/* for CHS addressing */
|
||||
u16 cylinders; /* Number of cylinders */
|
||||
u16 heads; /* Number of heads */
|
||||
u16 sectors; /* Number of sectors per track */
|
||||
};
|
||||
|
||||
struct ata_port {
|
||||
struct Scsi_Host *host; /* our co-allocated scsi host */
|
||||
struct ata_port_operations *ops;
|
||||
const struct ata_port_operations *ops;
|
||||
unsigned long flags; /* ATA_FLAG_xxx */
|
||||
unsigned int id; /* unique id req'd by scsi midlyr */
|
||||
unsigned int port_no; /* unique port #; from zero */
|
||||
|
@ -319,7 +334,7 @@ struct ata_port {
|
|||
struct work_struct packet_task;
|
||||
|
||||
struct work_struct pio_task;
|
||||
unsigned int pio_task_state;
|
||||
unsigned int hsm_task_state;
|
||||
unsigned long pio_task_timeout;
|
||||
|
||||
void *private_data;
|
||||
|
@ -333,13 +348,12 @@ struct ata_port_operations {
|
|||
void (*set_piomode) (struct ata_port *, struct ata_device *);
|
||||
void (*set_dmamode) (struct ata_port *, struct ata_device *);
|
||||
|
||||
void (*tf_load) (struct ata_port *ap, struct ata_taskfile *tf);
|
||||
void (*tf_load) (struct ata_port *ap, const struct ata_taskfile *tf);
|
||||
void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf);
|
||||
|
||||
void (*exec_command)(struct ata_port *ap, struct ata_taskfile *tf);
|
||||
void (*exec_command)(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||
u8 (*check_status)(struct ata_port *ap);
|
||||
u8 (*check_altstatus)(struct ata_port *ap);
|
||||
u8 (*check_err)(struct ata_port *ap);
|
||||
void (*dev_select)(struct ata_port *ap, unsigned int device);
|
||||
|
||||
void (*phy_reset) (struct ata_port *ap);
|
||||
|
@ -377,9 +391,22 @@ struct ata_port_info {
|
|||
unsigned long pio_mask;
|
||||
unsigned long mwdma_mask;
|
||||
unsigned long udma_mask;
|
||||
struct ata_port_operations *port_ops;
|
||||
const struct ata_port_operations *port_ops;
|
||||
};
|
||||
|
||||
struct ata_timing {
|
||||
unsigned short mode; /* ATA mode */
|
||||
unsigned short setup; /* t1 */
|
||||
unsigned short act8b; /* t2 for 8-bit I/O */
|
||||
unsigned short rec8b; /* t2i for 8-bit I/O */
|
||||
unsigned short cyc8b; /* t0 for 8-bit I/O */
|
||||
unsigned short active; /* t2 or tD */
|
||||
unsigned short recover; /* t2i or tK */
|
||||
unsigned short cycle; /* t0 */
|
||||
unsigned short udma; /* t2CYCTYP/2 */
|
||||
};
|
||||
|
||||
#define FIT(v,vmin,vmax) max_t(short,min_t(short,v,vmax),vmin)
|
||||
|
||||
extern void ata_port_probe(struct ata_port *);
|
||||
extern void __sata_phy_reset(struct ata_port *ap);
|
||||
|
@ -392,7 +419,7 @@ extern int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_i
|
|||
unsigned int n_ports);
|
||||
extern void ata_pci_remove_one (struct pci_dev *pdev);
|
||||
#endif /* CONFIG_PCI */
|
||||
extern int ata_device_add(struct ata_probe_ent *ent);
|
||||
extern int ata_device_add(const struct ata_probe_ent *ent);
|
||||
extern void ata_host_set_remove(struct ata_host_set *host_set);
|
||||
extern int ata_scsi_detect(Scsi_Host_Template *sht);
|
||||
extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg);
|
||||
|
@ -400,19 +427,20 @@ extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmn
|
|||
extern int ata_scsi_error(struct Scsi_Host *host);
|
||||
extern int ata_scsi_release(struct Scsi_Host *host);
|
||||
extern unsigned int ata_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc);
|
||||
extern int ata_ratelimit(void);
|
||||
|
||||
/*
|
||||
* Default driver ops implementations
|
||||
*/
|
||||
extern void ata_tf_load(struct ata_port *ap, struct ata_taskfile *tf);
|
||||
extern void ata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||
extern void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
|
||||
extern void ata_tf_to_fis(struct ata_taskfile *tf, u8 *fis, u8 pmp);
|
||||
extern void ata_tf_from_fis(u8 *fis, struct ata_taskfile *tf);
|
||||
extern void ata_tf_to_fis(const struct ata_taskfile *tf, u8 *fis, u8 pmp);
|
||||
extern void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf);
|
||||
extern void ata_noop_dev_select (struct ata_port *ap, unsigned int device);
|
||||
extern void ata_std_dev_select (struct ata_port *ap, unsigned int device);
|
||||
extern u8 ata_check_status(struct ata_port *ap);
|
||||
extern u8 ata_altstatus(struct ata_port *ap);
|
||||
extern u8 ata_chk_err(struct ata_port *ap);
|
||||
extern void ata_exec_command(struct ata_port *ap, struct ata_taskfile *tf);
|
||||
extern void ata_exec_command(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||
extern int ata_port_start (struct ata_port *ap);
|
||||
extern void ata_port_stop (struct ata_port *ap);
|
||||
extern void ata_host_stop (struct ata_host_set *host_set);
|
||||
|
@ -423,8 +451,8 @@ extern void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf,
|
|||
unsigned int buflen);
|
||||
extern void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
|
||||
unsigned int n_elem);
|
||||
extern unsigned int ata_dev_classify(struct ata_taskfile *tf);
|
||||
extern void ata_dev_id_string(u16 *id, unsigned char *s,
|
||||
extern unsigned int ata_dev_classify(const struct ata_taskfile *tf);
|
||||
extern void ata_dev_id_string(const u16 *id, unsigned char *s,
|
||||
unsigned int ofs, unsigned int len);
|
||||
extern void ata_dev_config(struct ata_port *ap, unsigned int i);
|
||||
extern void ata_bmdma_setup (struct ata_queued_cmd *qc);
|
||||
|
@ -432,7 +460,7 @@ extern void ata_bmdma_start (struct ata_queued_cmd *qc);
|
|||
extern void ata_bmdma_stop(struct ata_queued_cmd *qc);
|
||||
extern u8 ata_bmdma_status(struct ata_port *ap);
|
||||
extern void ata_bmdma_irq_clear(struct ata_port *ap);
|
||||
extern void ata_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat);
|
||||
extern void ata_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask);
|
||||
extern void ata_eng_timeout(struct ata_port *ap);
|
||||
extern void ata_scsi_simulate(u16 *id, struct scsi_cmnd *cmd,
|
||||
void (*done)(struct scsi_cmnd *));
|
||||
|
@ -441,6 +469,32 @@ extern int ata_std_bios_param(struct scsi_device *sdev,
|
|||
sector_t capacity, int geom[]);
|
||||
extern int ata_scsi_slave_config(struct scsi_device *sdev);
|
||||
|
||||
/*
|
||||
* Timing helpers
|
||||
*/
|
||||
extern int ata_timing_compute(struct ata_device *, unsigned short,
|
||||
struct ata_timing *, int, int);
|
||||
extern void ata_timing_merge(const struct ata_timing *,
|
||||
const struct ata_timing *, struct ata_timing *,
|
||||
unsigned int);
|
||||
|
||||
enum {
|
||||
ATA_TIMING_SETUP = (1 << 0),
|
||||
ATA_TIMING_ACT8B = (1 << 1),
|
||||
ATA_TIMING_REC8B = (1 << 2),
|
||||
ATA_TIMING_CYC8B = (1 << 3),
|
||||
ATA_TIMING_8BIT = ATA_TIMING_ACT8B | ATA_TIMING_REC8B |
|
||||
ATA_TIMING_CYC8B,
|
||||
ATA_TIMING_ACTIVE = (1 << 4),
|
||||
ATA_TIMING_RECOVER = (1 << 5),
|
||||
ATA_TIMING_CYCLE = (1 << 6),
|
||||
ATA_TIMING_UDMA = (1 << 7),
|
||||
ATA_TIMING_ALL = ATA_TIMING_SETUP | ATA_TIMING_ACT8B |
|
||||
ATA_TIMING_REC8B | ATA_TIMING_CYC8B |
|
||||
ATA_TIMING_ACTIVE | ATA_TIMING_RECOVER |
|
||||
ATA_TIMING_CYCLE | ATA_TIMING_UDMA,
|
||||
};
|
||||
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
struct pci_bits {
|
||||
|
@ -452,8 +506,8 @@ struct pci_bits {
|
|||
|
||||
extern void ata_pci_host_stop (struct ata_host_set *host_set);
|
||||
extern struct ata_probe_ent *
|
||||
ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port);
|
||||
extern int pci_test_config_bits(struct pci_dev *pdev, struct pci_bits *bits);
|
||||
ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int portmask);
|
||||
extern int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits);
|
||||
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
|
@ -463,7 +517,7 @@ static inline unsigned int ata_tag_valid(unsigned int tag)
|
|||
return (tag < ATA_MAX_QUEUE) ? 1 : 0;
|
||||
}
|
||||
|
||||
static inline unsigned int ata_dev_present(struct ata_device *dev)
|
||||
static inline unsigned int ata_dev_present(const struct ata_device *dev)
|
||||
{
|
||||
return ((dev->class == ATA_DEV_ATA) ||
|
||||
(dev->class == ATA_DEV_ATAPI));
|
||||
|
@ -662,11 +716,28 @@ static inline unsigned int sata_dev_present(struct ata_port *ap)
|
|||
return ((scr_read(ap, SCR_STATUS) & 0xf) == 0x3) ? 1 : 0;
|
||||
}
|
||||
|
||||
static inline int ata_try_flush_cache(struct ata_device *dev)
|
||||
static inline int ata_try_flush_cache(const struct ata_device *dev)
|
||||
{
|
||||
return ata_id_wcache_enabled(dev->id) ||
|
||||
ata_id_has_flush(dev->id) ||
|
||||
ata_id_has_flush_ext(dev->id);
|
||||
}
|
||||
|
||||
static inline unsigned int ac_err_mask(u8 status)
|
||||
{
|
||||
if (status & ATA_BUSY)
|
||||
return AC_ERR_ATA_BUS;
|
||||
if (status & (ATA_ERR | ATA_DF))
|
||||
return AC_ERR_DEV;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline unsigned int __ac_err_mask(u8 status)
|
||||
{
|
||||
unsigned int mask = ac_err_mask(status);
|
||||
if (mask == 0)
|
||||
return AC_ERR_OTHER;
|
||||
return mask;
|
||||
}
|
||||
|
||||
#endif /* __LINUX_LIBATA_H__ */
|
||||
|
|
|
@ -52,7 +52,7 @@ struct loop_device {
|
|||
unsigned lo_blocksize;
|
||||
void *key_data;
|
||||
|
||||
int old_gfp_mask;
|
||||
gfp_t old_gfp_mask;
|
||||
|
||||
spinlock_t lo_lock;
|
||||
struct bio *lo_bio;
|
||||
|
|
|
@ -22,7 +22,7 @@ struct mb_cache_entry {
|
|||
};
|
||||
|
||||
struct mb_cache_op {
|
||||
int (*free)(struct mb_cache_entry *, int);
|
||||
int (*free)(struct mb_cache_entry *, gfp_t);
|
||||
};
|
||||
|
||||
/* Functions on caches */
|
||||
|
|
94
include/linux/memory.h
Normal file
94
include/linux/memory.h
Normal file
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* include/linux/memory.h - generic memory definition
|
||||
*
|
||||
* This is mainly for topological representation. We define the
|
||||
* basic "struct memory_block" here, which can be embedded in per-arch
|
||||
* definitions or NUMA information.
|
||||
*
|
||||
* Basic handling of the devices is done in drivers/base/memory.c
|
||||
* and system devices are handled in drivers/base/sys.c.
|
||||
*
|
||||
* Memory block are exported via sysfs in the class/memory/devices/
|
||||
* directory.
|
||||
*
|
||||
*/
|
||||
#ifndef _LINUX_MEMORY_H_
|
||||
#define _LINUX_MEMORY_H_
|
||||
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/node.h>
|
||||
#include <linux/compiler.h>
|
||||
|
||||
#include <asm/semaphore.h>
|
||||
|
||||
struct memory_block {
|
||||
unsigned long phys_index;
|
||||
unsigned long state;
|
||||
/*
|
||||
* This serializes all state change requests. It isn't
|
||||
* held during creation because the control files are
|
||||
* created long after the critical areas during
|
||||
* initialization.
|
||||
*/
|
||||
struct semaphore state_sem;
|
||||
int phys_device; /* to which fru does this belong? */
|
||||
void *hw; /* optional pointer to fw/hw data */
|
||||
int (*phys_callback)(struct memory_block *);
|
||||
struct sys_device sysdev;
|
||||
};
|
||||
|
||||
/* These states are exposed to userspace as text strings in sysfs */
|
||||
#define MEM_ONLINE (1<<0) /* exposed to userspace */
|
||||
#define MEM_GOING_OFFLINE (1<<1) /* exposed to userspace */
|
||||
#define MEM_OFFLINE (1<<2) /* exposed to userspace */
|
||||
|
||||
/*
|
||||
* All of these states are currently kernel-internal for notifying
|
||||
* kernel components and architectures.
|
||||
*
|
||||
* For MEM_MAPPING_INVALID, all notifier chains with priority >0
|
||||
* are called before pfn_to_page() becomes invalid. The priority=0
|
||||
* entry is reserved for the function that actually makes
|
||||
* pfn_to_page() stop working. Any notifiers that want to be called
|
||||
* after that should have priority <0.
|
||||
*/
|
||||
#define MEM_MAPPING_INVALID (1<<3)
|
||||
|
||||
#ifndef CONFIG_MEMORY_HOTPLUG
|
||||
static inline int memory_dev_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int register_memory_notifier(struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void unregister_memory_notifier(struct notifier_block *nb)
|
||||
{
|
||||
}
|
||||
#else
|
||||
extern int register_memory(struct memory_block *, struct mem_section *section, struct node *);
|
||||
extern int register_new_memory(struct mem_section *);
|
||||
extern int unregister_memory_section(struct mem_section *);
|
||||
extern int memory_dev_init(void);
|
||||
extern int register_memory_notifier(struct notifier_block *nb);
|
||||
extern void unregister_memory_notifier(struct notifier_block *nb);
|
||||
|
||||
#define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTION<<PAGE_SHIFT)
|
||||
|
||||
extern int invalidate_phys_mapping(unsigned long, unsigned long);
|
||||
struct notifier_block;
|
||||
|
||||
extern int register_memory_notifier(struct notifier_block *nb);
|
||||
extern void unregister_memory_notifier(struct notifier_block *nb);
|
||||
|
||||
extern struct sysdev_class memory_sysdev_class;
|
||||
#endif /* CONFIG_MEMORY_HOTPLUG */
|
||||
|
||||
#define hotplug_memory_notifier(fn, pri) { \
|
||||
static struct notifier_block fn##_mem_nb = \
|
||||
{ .notifier_call = fn, .priority = pri }; \
|
||||
register_memory_notifier(&fn##_mem_nb); \
|
||||
}
|
||||
|
||||
#endif /* _LINUX_MEMORY_H_ */
|
104
include/linux/memory_hotplug.h
Normal file
104
include/linux/memory_hotplug.h
Normal file
|
@ -0,0 +1,104 @@
|
|||
#ifndef __LINUX_MEMORY_HOTPLUG_H
|
||||
#define __LINUX_MEMORY_HOTPLUG_H
|
||||
|
||||
#include <linux/mmzone.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/mmzone.h>
|
||||
#include <linux/notifier.h>
|
||||
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
/*
|
||||
* pgdat resizing functions
|
||||
*/
|
||||
static inline
|
||||
void pgdat_resize_lock(struct pglist_data *pgdat, unsigned long *flags)
|
||||
{
|
||||
spin_lock_irqsave(&pgdat->node_size_lock, *flags);
|
||||
}
|
||||
static inline
|
||||
void pgdat_resize_unlock(struct pglist_data *pgdat, unsigned long *flags)
|
||||
{
|
||||
spin_unlock_irqrestore(&pgdat->node_size_lock, *flags);
|
||||
}
|
||||
static inline
|
||||
void pgdat_resize_init(struct pglist_data *pgdat)
|
||||
{
|
||||
spin_lock_init(&pgdat->node_size_lock);
|
||||
}
|
||||
/*
|
||||
* Zone resizing functions
|
||||
*/
|
||||
static inline unsigned zone_span_seqbegin(struct zone *zone)
|
||||
{
|
||||
return read_seqbegin(&zone->span_seqlock);
|
||||
}
|
||||
static inline int zone_span_seqretry(struct zone *zone, unsigned iv)
|
||||
{
|
||||
return read_seqretry(&zone->span_seqlock, iv);
|
||||
}
|
||||
static inline void zone_span_writelock(struct zone *zone)
|
||||
{
|
||||
write_seqlock(&zone->span_seqlock);
|
||||
}
|
||||
static inline void zone_span_writeunlock(struct zone *zone)
|
||||
{
|
||||
write_sequnlock(&zone->span_seqlock);
|
||||
}
|
||||
static inline void zone_seqlock_init(struct zone *zone)
|
||||
{
|
||||
seqlock_init(&zone->span_seqlock);
|
||||
}
|
||||
extern int zone_grow_free_lists(struct zone *zone, unsigned long new_nr_pages);
|
||||
extern int zone_grow_waitqueues(struct zone *zone, unsigned long nr_pages);
|
||||
extern int add_one_highpage(struct page *page, int pfn, int bad_ppro);
|
||||
/* need some defines for these for archs that don't support it */
|
||||
extern void online_page(struct page *page);
|
||||
/* VM interface that may be used by firmware interface */
|
||||
extern int add_memory(u64 start, u64 size);
|
||||
extern int remove_memory(u64 start, u64 size);
|
||||
extern int online_pages(unsigned long, unsigned long);
|
||||
|
||||
/* reasonably generic interface to expand the physical pages in a zone */
|
||||
extern int __add_pages(struct zone *zone, unsigned long start_pfn,
|
||||
unsigned long nr_pages);
|
||||
#else /* ! CONFIG_MEMORY_HOTPLUG */
|
||||
/*
|
||||
* Stub functions for when hotplug is off
|
||||
*/
|
||||
static inline void pgdat_resize_lock(struct pglist_data *p, unsigned long *f) {}
|
||||
static inline void pgdat_resize_unlock(struct pglist_data *p, unsigned long *f) {}
|
||||
static inline void pgdat_resize_init(struct pglist_data *pgdat) {}
|
||||
|
||||
static inline unsigned zone_span_seqbegin(struct zone *zone)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int zone_span_seqretry(struct zone *zone, unsigned iv)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void zone_span_writelock(struct zone *zone) {}
|
||||
static inline void zone_span_writeunlock(struct zone *zone) {}
|
||||
static inline void zone_seqlock_init(struct zone *zone) {}
|
||||
|
||||
static inline int mhp_notimplemented(const char *func)
|
||||
{
|
||||
printk(KERN_WARNING "%s() called, with CONFIG_MEMORY_HOTPLUG disabled\n", func);
|
||||
dump_stack();
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int __add_pages(struct zone *zone, unsigned long start_pfn,
|
||||
unsigned long nr_pages)
|
||||
{
|
||||
return mhp_notimplemented(__FUNCTION__);
|
||||
}
|
||||
#endif /* ! CONFIG_MEMORY_HOTPLUG */
|
||||
static inline int __remove_pages(struct zone *zone, unsigned long start_pfn,
|
||||
unsigned long nr_pages)
|
||||
{
|
||||
printk(KERN_WARNING "%s() called, not yet supported\n", __FUNCTION__);
|
||||
dump_stack();
|
||||
return -ENOSYS;
|
||||
}
|
||||
#endif /* __LINUX_MEMORY_HOTPLUG_H */
|
|
@ -27,10 +27,10 @@
|
|||
|
||||
#include <linux/config.h>
|
||||
#include <linux/mmzone.h>
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/rbtree.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/nodemask.h>
|
||||
|
||||
struct vm_area_struct;
|
||||
|
||||
|
@ -47,8 +47,7 @@ struct vm_area_struct;
|
|||
* Locking policy for interlave:
|
||||
* In process context there is no locking because only the process accesses
|
||||
* its own state. All vma manipulation is somewhat protected by a down_read on
|
||||
* mmap_sem. For allocating in the interleave policy the page_table_lock
|
||||
* must be also aquired to protect il_next.
|
||||
* mmap_sem.
|
||||
*
|
||||
* Freeing policy:
|
||||
* When policy is MPOL_BIND v.zonelist is kmalloc'ed and must be kfree'd.
|
||||
|
@ -63,7 +62,7 @@ struct mempolicy {
|
|||
union {
|
||||
struct zonelist *zonelist; /* bind */
|
||||
short preferred_node; /* preferred */
|
||||
DECLARE_BITMAP(nodes, MAX_NUMNODES); /* interleave */
|
||||
nodemask_t nodes; /* interleave */
|
||||
/* undefined for default */
|
||||
} v;
|
||||
};
|
||||
|
@ -155,6 +154,7 @@ struct mempolicy *get_vma_policy(struct task_struct *task,
|
|||
|
||||
extern void numa_default_policy(void);
|
||||
extern void numa_policy_init(void);
|
||||
extern void numa_policy_rebind(const nodemask_t *old, const nodemask_t *new);
|
||||
extern struct mempolicy default_policy;
|
||||
|
||||
#else
|
||||
|
@ -227,6 +227,11 @@ static inline void numa_default_policy(void)
|
|||
{
|
||||
}
|
||||
|
||||
static inline void numa_policy_rebind(const nodemask_t *old,
|
||||
const nodemask_t *new)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NUMA */
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
|
|
@ -158,6 +158,7 @@ extern int mii_link_ok (struct mii_if_info *mii);
|
|||
extern int mii_nway_restart (struct mii_if_info *mii);
|
||||
extern int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd);
|
||||
extern int mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd);
|
||||
extern int mii_check_gmii_support(struct mii_if_info *mii);
|
||||
extern void mii_check_link (struct mii_if_info *mii);
|
||||
extern unsigned int mii_check_media (struct mii_if_info *mii,
|
||||
unsigned int ok_to_print,
|
||||
|
|
|
@ -157,7 +157,7 @@ extern unsigned int kobjsize(const void *objp);
|
|||
|
||||
#define VM_DONTCOPY 0x00020000 /* Do not copy this vma on fork */
|
||||
#define VM_DONTEXPAND 0x00040000 /* Cannot expand with mremap() */
|
||||
#define VM_RESERVED 0x00080000 /* Don't unmap it from swap_out */
|
||||
#define VM_RESERVED 0x00080000 /* Pages managed in a special way */
|
||||
#define VM_ACCOUNT 0x00100000 /* Is a VM accounted object */
|
||||
#define VM_HUGETLB 0x00400000 /* Huge TLB Page VM */
|
||||
#define VM_NONLINEAR 0x00800000 /* Is non-linear (remap_file_pages) */
|
||||
|
@ -226,13 +226,18 @@ struct page {
|
|||
* to show when page is mapped
|
||||
* & limit reverse map searches.
|
||||
*/
|
||||
unsigned long private; /* Mapping-private opaque data:
|
||||
union {
|
||||
unsigned long private; /* Mapping-private opaque data:
|
||||
* usually used for buffer_heads
|
||||
* if PagePrivate set; used for
|
||||
* swp_entry_t if PageSwapCache
|
||||
* When page is free, this indicates
|
||||
* order in the buddy system.
|
||||
*/
|
||||
#if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS
|
||||
spinlock_t ptl;
|
||||
#endif
|
||||
} u;
|
||||
struct address_space *mapping; /* If low bit clear, points to
|
||||
* inode address_space, or NULL.
|
||||
* If page mapped as anonymous
|
||||
|
@ -260,6 +265,9 @@ struct page {
|
|||
#endif /* WANT_PAGE_VIRTUAL */
|
||||
};
|
||||
|
||||
#define page_private(page) ((page)->u.private)
|
||||
#define set_page_private(page, v) ((page)->u.private = (v))
|
||||
|
||||
/*
|
||||
* FIXME: take this include out, include page-flags.h in
|
||||
* files which need it (119 of them)
|
||||
|
@ -311,17 +319,17 @@ extern void FASTCALL(__page_cache_release(struct page *));
|
|||
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
|
||||
static inline int page_count(struct page *p)
|
||||
static inline int page_count(struct page *page)
|
||||
{
|
||||
if (PageCompound(p))
|
||||
p = (struct page *)p->private;
|
||||
return atomic_read(&(p)->_count) + 1;
|
||||
if (PageCompound(page))
|
||||
page = (struct page *)page_private(page);
|
||||
return atomic_read(&page->_count) + 1;
|
||||
}
|
||||
|
||||
static inline void get_page(struct page *page)
|
||||
{
|
||||
if (unlikely(PageCompound(page)))
|
||||
page = (struct page *)page->private;
|
||||
page = (struct page *)page_private(page);
|
||||
atomic_inc(&page->_count);
|
||||
}
|
||||
|
||||
|
@ -338,7 +346,7 @@ static inline void get_page(struct page *page)
|
|||
|
||||
static inline void put_page(struct page *page)
|
||||
{
|
||||
if (!PageReserved(page) && put_page_testzero(page))
|
||||
if (put_page_testzero(page))
|
||||
__page_cache_release(page);
|
||||
}
|
||||
|
||||
|
@ -587,7 +595,7 @@ static inline int PageAnon(struct page *page)
|
|||
static inline pgoff_t page_index(struct page *page)
|
||||
{
|
||||
if (unlikely(PageSwapCache(page)))
|
||||
return page->private;
|
||||
return page_private(page);
|
||||
return page->index;
|
||||
}
|
||||
|
||||
|
@ -682,7 +690,7 @@ struct zap_details {
|
|||
|
||||
unsigned long zap_page_range(struct vm_area_struct *vma, unsigned long address,
|
||||
unsigned long size, struct zap_details *);
|
||||
unsigned long unmap_vmas(struct mmu_gather **tlb, struct mm_struct *mm,
|
||||
unsigned long unmap_vmas(struct mmu_gather **tlb,
|
||||
struct vm_area_struct *start_vma, unsigned long start_addr,
|
||||
unsigned long end_addr, unsigned long *nr_accounted,
|
||||
struct zap_details *);
|
||||
|
@ -704,10 +712,6 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping,
|
|||
}
|
||||
|
||||
extern int vmtruncate(struct inode * inode, loff_t offset);
|
||||
extern pud_t *FASTCALL(__pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address));
|
||||
extern pmd_t *FASTCALL(__pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address));
|
||||
extern pte_t *FASTCALL(pte_alloc_kernel(struct mm_struct *mm, pmd_t *pmd, unsigned long address));
|
||||
extern pte_t *FASTCALL(pte_alloc_map(struct mm_struct *mm, pmd_t *pmd, unsigned long address));
|
||||
extern int install_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, struct page *page, pgprot_t prot);
|
||||
extern int install_file_pte(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned long pgoff, pgprot_t prot);
|
||||
extern int __handle_mm_fault(struct mm_struct *mm,struct vm_area_struct *vma, unsigned long address, int write_access);
|
||||
|
@ -723,6 +727,7 @@ void install_arg_page(struct vm_area_struct *, struct page *, unsigned long);
|
|||
|
||||
int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start,
|
||||
int len, int write, int force, struct page **pages, struct vm_area_struct **vmas);
|
||||
void print_bad_pte(struct vm_area_struct *, pte_t, unsigned long);
|
||||
|
||||
int __set_page_dirty_buffers(struct page *page);
|
||||
int __set_page_dirty_nobuffers(struct page *page);
|
||||
|
@ -747,7 +752,7 @@ extern unsigned long do_mremap(unsigned long addr,
|
|||
* The callback will be passed nr_to_scan == 0 when the VM is querying the
|
||||
* cache size, so a fastpath for that case is appropriate.
|
||||
*/
|
||||
typedef int (*shrinker_t)(int nr_to_scan, unsigned int gfp_mask);
|
||||
typedef int (*shrinker_t)(int nr_to_scan, gfp_t gfp_mask);
|
||||
|
||||
/*
|
||||
* Add an aging callback. The int is the number of 'seeks' it takes
|
||||
|
@ -759,38 +764,83 @@ struct shrinker;
|
|||
extern struct shrinker *set_shrinker(int, shrinker_t);
|
||||
extern void remove_shrinker(struct shrinker *shrinker);
|
||||
|
||||
/*
|
||||
* On a two-level or three-level page table, this ends up being trivial. Thus
|
||||
* the inlining and the symmetry break with pte_alloc_map() that does all
|
||||
* of this out-of-line.
|
||||
*/
|
||||
int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address);
|
||||
int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address);
|
||||
int __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address);
|
||||
int __pte_alloc_kernel(pmd_t *pmd, unsigned long address);
|
||||
|
||||
/*
|
||||
* The following ifdef needed to get the 4level-fixup.h header to work.
|
||||
* Remove it when 4level-fixup.h has been removed.
|
||||
*/
|
||||
#ifdef CONFIG_MMU
|
||||
#ifndef __ARCH_HAS_4LEVEL_HACK
|
||||
#if defined(CONFIG_MMU) && !defined(__ARCH_HAS_4LEVEL_HACK)
|
||||
static inline pud_t *pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
|
||||
{
|
||||
if (pgd_none(*pgd))
|
||||
return __pud_alloc(mm, pgd, address);
|
||||
return pud_offset(pgd, address);
|
||||
return (unlikely(pgd_none(*pgd)) && __pud_alloc(mm, pgd, address))?
|
||||
NULL: pud_offset(pgd, address);
|
||||
}
|
||||
|
||||
static inline pmd_t *pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
|
||||
{
|
||||
if (pud_none(*pud))
|
||||
return __pmd_alloc(mm, pud, address);
|
||||
return pmd_offset(pud, address);
|
||||
return (unlikely(pud_none(*pud)) && __pmd_alloc(mm, pud, address))?
|
||||
NULL: pmd_offset(pud, address);
|
||||
}
|
||||
#endif
|
||||
#endif /* CONFIG_MMU */
|
||||
#endif /* CONFIG_MMU && !__ARCH_HAS_4LEVEL_HACK */
|
||||
|
||||
#if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS
|
||||
/*
|
||||
* We tuck a spinlock to guard each pagetable page into its struct page,
|
||||
* at page->private, with BUILD_BUG_ON to make sure that this will not
|
||||
* overflow into the next struct page (as it might with DEBUG_SPINLOCK).
|
||||
* When freeing, reset page->mapping so free_pages_check won't complain.
|
||||
*/
|
||||
#define __pte_lockptr(page) &((page)->u.ptl)
|
||||
#define pte_lock_init(_page) do { \
|
||||
spin_lock_init(__pte_lockptr(_page)); \
|
||||
} while (0)
|
||||
#define pte_lock_deinit(page) ((page)->mapping = NULL)
|
||||
#define pte_lockptr(mm, pmd) ({(void)(mm); __pte_lockptr(pmd_page(*(pmd)));})
|
||||
#else
|
||||
/*
|
||||
* We use mm->page_table_lock to guard all pagetable pages of the mm.
|
||||
*/
|
||||
#define pte_lock_init(page) do {} while (0)
|
||||
#define pte_lock_deinit(page) do {} while (0)
|
||||
#define pte_lockptr(mm, pmd) ({(void)(pmd); &(mm)->page_table_lock;})
|
||||
#endif /* NR_CPUS < CONFIG_SPLIT_PTLOCK_CPUS */
|
||||
|
||||
#define pte_offset_map_lock(mm, pmd, address, ptlp) \
|
||||
({ \
|
||||
spinlock_t *__ptl = pte_lockptr(mm, pmd); \
|
||||
pte_t *__pte = pte_offset_map(pmd, address); \
|
||||
*(ptlp) = __ptl; \
|
||||
spin_lock(__ptl); \
|
||||
__pte; \
|
||||
})
|
||||
|
||||
#define pte_unmap_unlock(pte, ptl) do { \
|
||||
spin_unlock(ptl); \
|
||||
pte_unmap(pte); \
|
||||
} while (0)
|
||||
|
||||
#define pte_alloc_map(mm, pmd, address) \
|
||||
((unlikely(!pmd_present(*(pmd))) && __pte_alloc(mm, pmd, address))? \
|
||||
NULL: pte_offset_map(pmd, address))
|
||||
|
||||
#define pte_alloc_map_lock(mm, pmd, address, ptlp) \
|
||||
((unlikely(!pmd_present(*(pmd))) && __pte_alloc(mm, pmd, address))? \
|
||||
NULL: pte_offset_map_lock(mm, pmd, address, ptlp))
|
||||
|
||||
#define pte_alloc_kernel(pmd, address) \
|
||||
((unlikely(!pmd_present(*(pmd))) && __pte_alloc_kernel(pmd, address))? \
|
||||
NULL: pte_offset_kernel(pmd, address))
|
||||
|
||||
extern void free_area_init(unsigned long * zones_size);
|
||||
extern void free_area_init_node(int nid, pg_data_t *pgdat,
|
||||
unsigned long * zones_size, unsigned long zone_start_pfn,
|
||||
unsigned long *zholes_size);
|
||||
extern void memmap_init_zone(unsigned long, int, unsigned long, unsigned long);
|
||||
extern void setup_per_zone_pages_min(void);
|
||||
extern void mem_init(void);
|
||||
extern void show_mem(void);
|
||||
extern void si_meminfo(struct sysinfo * val);
|
||||
|
@ -834,6 +884,7 @@ extern int split_vma(struct mm_struct *,
|
|||
extern int insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
|
||||
extern void __vma_link_rb(struct mm_struct *, struct vm_area_struct *,
|
||||
struct rb_node **, struct rb_node *);
|
||||
extern void unlink_file_vma(struct vm_area_struct *);
|
||||
extern struct vm_area_struct *copy_vma(struct vm_area_struct **,
|
||||
unsigned long addr, unsigned long len, pgoff_t pgoff);
|
||||
extern void exit_mmap(struct mm_struct *);
|
||||
|
@ -894,7 +945,8 @@ void handle_ra_miss(struct address_space *mapping,
|
|||
unsigned long max_sane_readahead(unsigned long nr);
|
||||
|
||||
/* Do stack extension */
|
||||
extern int expand_stack(struct vm_area_struct * vma, unsigned long address);
|
||||
extern int expand_stack(struct vm_area_struct *vma, unsigned long address);
|
||||
extern int expand_upwards(struct vm_area_struct *vma, unsigned long address);
|
||||
|
||||
/* Look up the first VMA which satisfies addr < vm_end, NULL if none. */
|
||||
extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr);
|
||||
|
@ -917,40 +969,28 @@ static inline unsigned long vma_pages(struct vm_area_struct *vma)
|
|||
return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
|
||||
}
|
||||
|
||||
extern struct vm_area_struct *find_extend_vma(struct mm_struct *mm, unsigned long addr);
|
||||
struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr);
|
||||
struct page *vmalloc_to_page(void *addr);
|
||||
unsigned long vmalloc_to_pfn(void *addr);
|
||||
int remap_pfn_range(struct vm_area_struct *, unsigned long addr,
|
||||
unsigned long pfn, unsigned long size, pgprot_t);
|
||||
|
||||
extern struct page * vmalloc_to_page(void *addr);
|
||||
extern unsigned long vmalloc_to_pfn(void *addr);
|
||||
extern struct page * follow_page(struct mm_struct *mm, unsigned long address,
|
||||
int write);
|
||||
extern int check_user_page_readable(struct mm_struct *mm, unsigned long address);
|
||||
int remap_pfn_range(struct vm_area_struct *, unsigned long,
|
||||
unsigned long, unsigned long, pgprot_t);
|
||||
struct page *follow_page(struct mm_struct *, unsigned long address,
|
||||
unsigned int foll_flags);
|
||||
#define FOLL_WRITE 0x01 /* check pte is writable */
|
||||
#define FOLL_TOUCH 0x02 /* mark page accessed */
|
||||
#define FOLL_GET 0x04 /* do get_page on page */
|
||||
#define FOLL_ANON 0x08 /* give ZERO_PAGE if no pgtable */
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
void __vm_stat_account(struct mm_struct *, unsigned long, struct file *, long);
|
||||
void vm_stat_account(struct mm_struct *, unsigned long, struct file *, long);
|
||||
#else
|
||||
static inline void __vm_stat_account(struct mm_struct *mm,
|
||||
static inline void vm_stat_account(struct mm_struct *mm,
|
||||
unsigned long flags, struct file *file, long pages)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
static inline void vm_stat_account(struct vm_area_struct *vma)
|
||||
{
|
||||
__vm_stat_account(vma->vm_mm, vma->vm_flags, vma->vm_file,
|
||||
vma_pages(vma));
|
||||
}
|
||||
|
||||
static inline void vm_stat_unaccount(struct vm_area_struct *vma)
|
||||
{
|
||||
__vm_stat_account(vma->vm_mm, vma->vm_flags, vma->vm_file,
|
||||
-vma_pages(vma));
|
||||
}
|
||||
|
||||
/* update per process rss and vm hiwater data */
|
||||
extern void update_mem_hiwater(struct task_struct *tsk);
|
||||
|
||||
#ifndef CONFIG_DEBUG_PAGEALLOC
|
||||
static inline void
|
||||
kernel_map_pages(struct page *page, int numpages, int enable)
|
||||
|
|
|
@ -50,7 +50,7 @@ struct mmc_command {
|
|||
#define MMC_ERR_INVALID 5
|
||||
|
||||
struct mmc_data *data; /* data segment associated with cmd */
|
||||
struct mmc_request *mrq; /* assoicated request */
|
||||
struct mmc_request *mrq; /* associated request */
|
||||
};
|
||||
|
||||
struct mmc_data {
|
||||
|
@ -68,7 +68,7 @@ struct mmc_data {
|
|||
unsigned int bytes_xfered;
|
||||
|
||||
struct mmc_command *stop; /* stop command */
|
||||
struct mmc_request *mrq; /* assoicated request */
|
||||
struct mmc_request *mrq; /* associated request */
|
||||
|
||||
unsigned int sg_len; /* size of scatter list */
|
||||
struct scatterlist *sg; /* I/O scatter list */
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/threads.h>
|
||||
#include <linux/numa.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/seqlock.h>
|
||||
#include <asm/atomic.h>
|
||||
|
||||
/* Free memory management - zoned buddy allocator. */
|
||||
|
@ -137,6 +138,10 @@ struct zone {
|
|||
* free areas of different sizes
|
||||
*/
|
||||
spinlock_t lock;
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
/* see spanned/present_pages for more description */
|
||||
seqlock_t span_seqlock;
|
||||
#endif
|
||||
struct free_area free_area[MAX_ORDER];
|
||||
|
||||
|
||||
|
@ -220,6 +225,16 @@ struct zone {
|
|||
/* zone_start_pfn == zone_start_paddr >> PAGE_SHIFT */
|
||||
unsigned long zone_start_pfn;
|
||||
|
||||
/*
|
||||
* zone_start_pfn, spanned_pages and present_pages are all
|
||||
* protected by span_seqlock. It is a seqlock because it has
|
||||
* to be read outside of zone->lock, and it is done in the main
|
||||
* allocator path. But, it is written quite infrequently.
|
||||
*
|
||||
* The lock is declared along with zone->lock because it is
|
||||
* frequently read in proximity to zone->lock. It's good to
|
||||
* give them a chance of being in the same cacheline.
|
||||
*/
|
||||
unsigned long spanned_pages; /* total size, including holes */
|
||||
unsigned long present_pages; /* amount of memory (excluding holes) */
|
||||
|
||||
|
@ -273,6 +288,16 @@ typedef struct pglist_data {
|
|||
struct page *node_mem_map;
|
||||
#endif
|
||||
struct bootmem_data *bdata;
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
/*
|
||||
* Must be held any time you expect node_start_pfn, node_present_pages
|
||||
* or node_spanned_pages stay constant. Holding this will also
|
||||
* guarantee that any pfn_valid() stays that way.
|
||||
*
|
||||
* Nests above zone->lock and zone->size_seqlock.
|
||||
*/
|
||||
spinlock_t node_size_lock;
|
||||
#endif
|
||||
unsigned long node_start_pfn;
|
||||
unsigned long node_present_pages; /* total number of physical pages */
|
||||
unsigned long node_spanned_pages; /* total size of physical page
|
||||
|
@ -293,6 +318,8 @@ typedef struct pglist_data {
|
|||
#endif
|
||||
#define nid_page_nr(nid, pagenr) pgdat_page_nr(NODE_DATA(nid),(pagenr))
|
||||
|
||||
#include <linux/memory_hotplug.h>
|
||||
|
||||
extern struct pglist_data *pgdat_list;
|
||||
|
||||
void __get_zone_counts(unsigned long *active, unsigned long *inactive,
|
||||
|
@ -302,7 +329,7 @@ void get_zone_counts(unsigned long *active, unsigned long *inactive,
|
|||
void build_all_zonelists(void);
|
||||
void wakeup_kswapd(struct zone *zone, int order);
|
||||
int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
|
||||
int alloc_type, int can_try_harder, int gfp_high);
|
||||
int alloc_type, int can_try_harder, gfp_t gfp_high);
|
||||
|
||||
#ifdef CONFIG_HAVE_MEMORY_PRESENT
|
||||
void memory_present(int nid, unsigned long start, unsigned long end);
|
||||
|
@ -509,6 +536,7 @@ static inline struct mem_section *__nr_to_section(unsigned long nr)
|
|||
return NULL;
|
||||
return &mem_section[SECTION_NR_TO_ROOT(nr)][nr & SECTION_ROOT_MASK];
|
||||
}
|
||||
extern int __section_nr(struct mem_section* ms);
|
||||
|
||||
/*
|
||||
* We use the lower bits of the mem_map pointer to store
|
||||
|
|
|
@ -244,4 +244,9 @@ struct pcmcia_device_id {
|
|||
#define PCMCIA_DEV_ID_MATCH_FAKE_CIS 0x0200
|
||||
#define PCMCIA_DEV_ID_MATCH_ANONYMOUS 0x0400
|
||||
|
||||
/* I2C */
|
||||
struct i2c_device_id {
|
||||
__u16 id;
|
||||
};
|
||||
|
||||
#endif /* LINUX_MOD_DEVICETABLE_H */
|
||||
|
|
|
@ -554,7 +554,9 @@ static inline void MODULE_PARM_(void) { }
|
|||
#ifdef MODULE
|
||||
/* DEPRECATED: Do not use. */
|
||||
#define MODULE_PARM(var,type) \
|
||||
struct obsolete_modparm __parm_##var __attribute__((section("__obsparm"))) = \
|
||||
extern struct obsolete_modparm __parm_##var \
|
||||
__attribute__((section("__obsparm"))); \
|
||||
struct obsolete_modparm __parm_##var = \
|
||||
{ __stringify(var), type, &MODULE_PARM_ }; \
|
||||
__MODULE_PARM_TYPE(var, type);
|
||||
#else
|
||||
|
|
|
@ -282,6 +282,17 @@ static inline u8 fat_attr(struct inode *inode)
|
|||
MSDOS_I(inode)->i_attrs;
|
||||
}
|
||||
|
||||
static inline unsigned char fat_checksum(const __u8 *name)
|
||||
{
|
||||
unsigned char s = name[0];
|
||||
s = (s<<7) + (s>>1) + name[1]; s = (s<<7) + (s>>1) + name[2];
|
||||
s = (s<<7) + (s>>1) + name[3]; s = (s<<7) + (s>>1) + name[4];
|
||||
s = (s<<7) + (s>>1) + name[5]; s = (s<<7) + (s>>1) + name[6];
|
||||
s = (s<<7) + (s>>1) + name[7]; s = (s<<7) + (s>>1) + name[8];
|
||||
s = (s<<7) + (s>>1) + name[9]; s = (s<<7) + (s>>1) + name[10];
|
||||
return s;
|
||||
}
|
||||
|
||||
static inline sector_t fat_clus_to_blknr(struct msdos_sb_info *sbi, int clus)
|
||||
{
|
||||
return ((sector_t)clus - FAT_START_ENT) * sbi->sec_per_clus
|
||||
|
|
|
@ -8,7 +8,10 @@
|
|||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include <linux/mtd/compatmac.h>
|
||||
|
||||
#include <asm/unaligned.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/io.h>
|
||||
|
|
|
@ -8,6 +8,7 @@ struct vfsmount;
|
|||
struct open_intent {
|
||||
int flags;
|
||||
int create_mode;
|
||||
struct file *file;
|
||||
};
|
||||
|
||||
enum { MAX_NESTED_LINKS = 5 };
|
||||
|
@ -65,6 +66,13 @@ extern int FASTCALL(link_path_walk(const char *, struct nameidata *));
|
|||
extern void path_release(struct nameidata *);
|
||||
extern void path_release_on_umount(struct nameidata *);
|
||||
|
||||
extern int __user_path_lookup_open(const char __user *, unsigned lookup_flags, struct nameidata *nd, int open_flags);
|
||||
extern int path_lookup_open(const char *, unsigned lookup_flags, struct nameidata *, int open_flags);
|
||||
extern struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry *dentry,
|
||||
int (*open)(struct inode *, struct file *));
|
||||
extern struct file *nameidata_to_filp(struct nameidata *nd, int flags);
|
||||
extern void release_open_intent(struct nameidata *);
|
||||
|
||||
extern struct dentry * lookup_one_len(const char *, struct dentry *, int);
|
||||
extern struct dentry * lookup_hash(struct qstr *, struct dentry *);
|
||||
|
||||
|
|
|
@ -308,6 +308,7 @@ struct net_device
|
|||
#define NETIF_F_VLAN_CHALLENGED 1024 /* Device cannot handle VLAN packets */
|
||||
#define NETIF_F_TSO 2048 /* Can offload TCP/IP segmentation */
|
||||
#define NETIF_F_LLTX 4096 /* LockLess TX */
|
||||
#define NETIF_F_UFO 8192 /* Can offload UDP Large Send*/
|
||||
|
||||
struct net_device *next_sched;
|
||||
|
||||
|
@ -873,11 +874,9 @@ static inline void netif_rx_complete(struct net_device *dev)
|
|||
|
||||
static inline void netif_poll_disable(struct net_device *dev)
|
||||
{
|
||||
while (test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state)) {
|
||||
while (test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state))
|
||||
/* No hurry. */
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
schedule_timeout(1);
|
||||
}
|
||||
schedule_timeout_interruptible(1);
|
||||
}
|
||||
|
||||
static inline void netif_poll_enable(struct net_device *dev)
|
||||
|
|
|
@ -41,6 +41,10 @@
|
|||
#define NFS_MAX_FILE_IO_BUFFER_SIZE 32768
|
||||
#define NFS_DEF_FILE_IO_BUFFER_SIZE 4096
|
||||
|
||||
/* Default timeout values */
|
||||
#define NFS_MAX_UDP_TIMEOUT (60*HZ)
|
||||
#define NFS_MAX_TCP_TIMEOUT (600*HZ)
|
||||
|
||||
/*
|
||||
* superblock magic number for NFS
|
||||
*/
|
||||
|
@ -137,6 +141,7 @@ struct nfs_inode {
|
|||
unsigned long attrtimeo_timestamp;
|
||||
__u64 change_attr; /* v4 only */
|
||||
|
||||
unsigned long last_updated;
|
||||
/* "Generation counter" for the attribute cache. This is
|
||||
* bumped whenever we update the metadata on the
|
||||
* server.
|
||||
|
@ -236,13 +241,17 @@ static inline int nfs_caches_unstable(struct inode *inode)
|
|||
return atomic_read(&NFS_I(inode)->data_updates) != 0;
|
||||
}
|
||||
|
||||
static inline void nfs_mark_for_revalidate(struct inode *inode)
|
||||
{
|
||||
spin_lock(&inode->i_lock);
|
||||
NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS;
|
||||
spin_unlock(&inode->i_lock);
|
||||
}
|
||||
|
||||
static inline void NFS_CACHEINV(struct inode *inode)
|
||||
{
|
||||
if (!nfs_caches_unstable(inode)) {
|
||||
spin_lock(&inode->i_lock);
|
||||
NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS;
|
||||
spin_unlock(&inode->i_lock);
|
||||
}
|
||||
if (!nfs_caches_unstable(inode))
|
||||
nfs_mark_for_revalidate(inode);
|
||||
}
|
||||
|
||||
static inline int nfs_server_capable(struct inode *inode, int cap)
|
||||
|
@ -276,7 +285,7 @@ static inline long nfs_save_change_attribute(struct inode *inode)
|
|||
static inline int nfs_verify_change_attribute(struct inode *inode, unsigned long chattr)
|
||||
{
|
||||
return !nfs_caches_unstable(inode)
|
||||
&& chattr == NFS_I(inode)->cache_change_attribute;
|
||||
&& time_after_eq(chattr, NFS_I(inode)->cache_change_attribute);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -286,6 +295,7 @@ extern void nfs_zap_caches(struct inode *);
|
|||
extern struct inode *nfs_fhget(struct super_block *, struct nfs_fh *,
|
||||
struct nfs_fattr *);
|
||||
extern int nfs_refresh_inode(struct inode *, struct nfs_fattr *);
|
||||
extern int nfs_post_op_update_inode(struct inode *inode, struct nfs_fattr *fattr);
|
||||
extern int nfs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
|
||||
extern int nfs_permission(struct inode *, int, struct nameidata *);
|
||||
extern int nfs_access_get_cached(struct inode *, struct rpc_cred *, struct nfs_access_entry *);
|
||||
|
@ -312,6 +322,12 @@ extern void nfs_file_clear_open_context(struct file *filp);
|
|||
/* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */
|
||||
extern u32 root_nfs_parse_addr(char *name); /*__init*/
|
||||
|
||||
static inline void nfs_fattr_init(struct nfs_fattr *fattr)
|
||||
{
|
||||
fattr->valid = 0;
|
||||
fattr->time_start = jiffies;
|
||||
}
|
||||
|
||||
/*
|
||||
* linux/fs/nfs/file.c
|
||||
*/
|
||||
|
|
|
@ -41,7 +41,7 @@ struct nfs_fattr {
|
|||
__u32 bitmap[2]; /* NFSv4 returned attribute bitmap */
|
||||
__u64 change_attr; /* NFSv4 change attribute */
|
||||
__u64 pre_change_attr;/* pre-op NFSv4 change attribute */
|
||||
unsigned long timestamp;
|
||||
unsigned long time_start;
|
||||
};
|
||||
|
||||
#define NFS_ATTR_WCC 0x0001 /* pre-op WCC data */
|
||||
|
@ -96,12 +96,13 @@ struct nfs4_change_info {
|
|||
u64 after;
|
||||
};
|
||||
|
||||
struct nfs_seqid;
|
||||
/*
|
||||
* Arguments to the open call.
|
||||
*/
|
||||
struct nfs_openargs {
|
||||
const struct nfs_fh * fh;
|
||||
__u32 seqid;
|
||||
struct nfs_seqid * seqid;
|
||||
int open_flags;
|
||||
__u64 clientid;
|
||||
__u32 id;
|
||||
|
@ -123,6 +124,7 @@ struct nfs_openres {
|
|||
struct nfs4_change_info cinfo;
|
||||
__u32 rflags;
|
||||
struct nfs_fattr * f_attr;
|
||||
struct nfs_fattr * dir_attr;
|
||||
const struct nfs_server *server;
|
||||
int delegation_type;
|
||||
nfs4_stateid delegation;
|
||||
|
@ -136,7 +138,7 @@ struct nfs_openres {
|
|||
struct nfs_open_confirmargs {
|
||||
const struct nfs_fh * fh;
|
||||
nfs4_stateid stateid;
|
||||
__u32 seqid;
|
||||
struct nfs_seqid * seqid;
|
||||
};
|
||||
|
||||
struct nfs_open_confirmres {
|
||||
|
@ -148,13 +150,16 @@ struct nfs_open_confirmres {
|
|||
*/
|
||||
struct nfs_closeargs {
|
||||
struct nfs_fh * fh;
|
||||
nfs4_stateid stateid;
|
||||
__u32 seqid;
|
||||
nfs4_stateid * stateid;
|
||||
struct nfs_seqid * seqid;
|
||||
int open_flags;
|
||||
const u32 * bitmask;
|
||||
};
|
||||
|
||||
struct nfs_closeres {
|
||||
nfs4_stateid stateid;
|
||||
struct nfs_fattr * fattr;
|
||||
const struct nfs_server *server;
|
||||
};
|
||||
/*
|
||||
* * Arguments to the lock,lockt, and locku call.
|
||||
|
@ -164,30 +169,19 @@ struct nfs_lowner {
|
|||
u32 id;
|
||||
};
|
||||
|
||||
struct nfs_open_to_lock {
|
||||
__u32 open_seqid;
|
||||
nfs4_stateid open_stateid;
|
||||
__u32 lock_seqid;
|
||||
struct nfs_lowner lock_owner;
|
||||
};
|
||||
|
||||
struct nfs_exist_lock {
|
||||
nfs4_stateid stateid;
|
||||
__u32 seqid;
|
||||
};
|
||||
|
||||
struct nfs_lock_opargs {
|
||||
struct nfs_seqid * lock_seqid;
|
||||
nfs4_stateid * lock_stateid;
|
||||
struct nfs_seqid * open_seqid;
|
||||
nfs4_stateid * open_stateid;
|
||||
struct nfs_lowner lock_owner;
|
||||
__u32 reclaim;
|
||||
__u32 new_lock_owner;
|
||||
union {
|
||||
struct nfs_open_to_lock *open_lock;
|
||||
struct nfs_exist_lock *exist_lock;
|
||||
} u;
|
||||
};
|
||||
|
||||
struct nfs_locku_opargs {
|
||||
__u32 seqid;
|
||||
nfs4_stateid stateid;
|
||||
struct nfs_seqid * seqid;
|
||||
nfs4_stateid * stateid;
|
||||
};
|
||||
|
||||
struct nfs_lockargs {
|
||||
|
@ -262,6 +256,7 @@ struct nfs_writeargs {
|
|||
enum nfs3_stable_how stable;
|
||||
unsigned int pgbase;
|
||||
struct page ** pages;
|
||||
const u32 * bitmask;
|
||||
};
|
||||
|
||||
struct nfs_writeverf {
|
||||
|
@ -273,6 +268,7 @@ struct nfs_writeres {
|
|||
struct nfs_fattr * fattr;
|
||||
struct nfs_writeverf * verf;
|
||||
__u32 count;
|
||||
const struct nfs_server *server;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -550,6 +546,7 @@ struct nfs4_create_res {
|
|||
struct nfs_fh * fh;
|
||||
struct nfs_fattr * fattr;
|
||||
struct nfs4_change_info dir_cinfo;
|
||||
struct nfs_fattr * dir_fattr;
|
||||
};
|
||||
|
||||
struct nfs4_fsinfo_arg {
|
||||
|
@ -571,8 +568,17 @@ struct nfs4_link_arg {
|
|||
const struct nfs_fh * fh;
|
||||
const struct nfs_fh * dir_fh;
|
||||
const struct qstr * name;
|
||||
const u32 * bitmask;
|
||||
};
|
||||
|
||||
struct nfs4_link_res {
|
||||
const struct nfs_server * server;
|
||||
struct nfs_fattr * fattr;
|
||||
struct nfs4_change_info cinfo;
|
||||
struct nfs_fattr * dir_attr;
|
||||
};
|
||||
|
||||
|
||||
struct nfs4_lookup_arg {
|
||||
const struct nfs_fh * dir_fh;
|
||||
const struct qstr * name;
|
||||
|
@ -619,6 +625,13 @@ struct nfs4_readlink {
|
|||
struct nfs4_remove_arg {
|
||||
const struct nfs_fh * fh;
|
||||
const struct qstr * name;
|
||||
const u32 * bitmask;
|
||||
};
|
||||
|
||||
struct nfs4_remove_res {
|
||||
const struct nfs_server * server;
|
||||
struct nfs4_change_info cinfo;
|
||||
struct nfs_fattr * dir_attr;
|
||||
};
|
||||
|
||||
struct nfs4_rename_arg {
|
||||
|
@ -626,11 +639,15 @@ struct nfs4_rename_arg {
|
|||
const struct nfs_fh * new_dir;
|
||||
const struct qstr * old_name;
|
||||
const struct qstr * new_name;
|
||||
const u32 * bitmask;
|
||||
};
|
||||
|
||||
struct nfs4_rename_res {
|
||||
const struct nfs_server * server;
|
||||
struct nfs4_change_info old_cinfo;
|
||||
struct nfs_fattr * old_fattr;
|
||||
struct nfs4_change_info new_cinfo;
|
||||
struct nfs_fattr * new_fattr;
|
||||
};
|
||||
|
||||
struct nfs4_setclientid {
|
||||
|
@ -722,7 +739,7 @@ struct nfs_rpc_ops {
|
|||
int (*write) (struct nfs_write_data *);
|
||||
int (*commit) (struct nfs_write_data *);
|
||||
int (*create) (struct inode *, struct dentry *,
|
||||
struct iattr *, int);
|
||||
struct iattr *, int, struct nameidata *);
|
||||
int (*remove) (struct inode *, struct qstr *);
|
||||
int (*unlink_setup) (struct rpc_message *,
|
||||
struct dentry *, struct qstr *);
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
* see bitmap_scnprintf() and bitmap_parse() in lib/bitmap.c.
|
||||
* For details of nodelist_scnprintf() and nodelist_parse(), see
|
||||
* bitmap_scnlistprintf() and bitmap_parselist(), also in bitmap.c.
|
||||
* For details of node_remap(), see bitmap_bitremap in lib/bitmap.c.
|
||||
* For details of nodes_remap(), see bitmap_remap in lib/bitmap.c.
|
||||
*
|
||||
* The available nodemask operations are:
|
||||
*
|
||||
|
@ -52,6 +54,8 @@
|
|||
* int nodemask_parse(ubuf, ulen, mask) Parse ascii string as nodemask
|
||||
* int nodelist_scnprintf(buf, len, mask) Format nodemask as list for printing
|
||||
* int nodelist_parse(buf, map) Parse ascii string as nodelist
|
||||
* int node_remap(oldbit, old, new) newbit = map(old, new)(oldbit)
|
||||
* int nodes_remap(dst, src, old, new) *dst = map(old, new)(dst)
|
||||
*
|
||||
* for_each_node_mask(node, mask) for-loop node over mask
|
||||
*
|
||||
|
@ -307,6 +311,22 @@ static inline int __nodelist_parse(const char *buf, nodemask_t *dstp, int nbits)
|
|||
return bitmap_parselist(buf, dstp->bits, nbits);
|
||||
}
|
||||
|
||||
#define node_remap(oldbit, old, new) \
|
||||
__node_remap((oldbit), &(old), &(new), MAX_NUMNODES)
|
||||
static inline int __node_remap(int oldbit,
|
||||
const nodemask_t *oldp, const nodemask_t *newp, int nbits)
|
||||
{
|
||||
return bitmap_bitremap(oldbit, oldp->bits, newp->bits, nbits);
|
||||
}
|
||||
|
||||
#define nodes_remap(dst, src, old, new) \
|
||||
__nodes_remap(&(dst), &(src), &(old), &(new), MAX_NUMNODES)
|
||||
static inline void __nodes_remap(nodemask_t *dstp, const nodemask_t *srcp,
|
||||
const nodemask_t *oldp, const nodemask_t *newp, int nbits)
|
||||
{
|
||||
bitmap_remap(dstp->bits, srcp->bits, oldp->bits, newp->bits, nbits);
|
||||
}
|
||||
|
||||
#if MAX_NUMNODES > 1
|
||||
#define for_each_node_mask(node, mask) \
|
||||
for ((node) = first_node(mask); \
|
||||
|
|
|
@ -21,16 +21,17 @@
|
|||
|
||||
static inline gfp_t mapping_gfp_mask(struct address_space * mapping)
|
||||
{
|
||||
return mapping->flags & __GFP_BITS_MASK;
|
||||
return (__force gfp_t)mapping->flags & __GFP_BITS_MASK;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is non-atomic. Only to be used before the mapping is activated.
|
||||
* Probably needs a barrier...
|
||||
*/
|
||||
static inline void mapping_set_gfp_mask(struct address_space *m, int mask)
|
||||
static inline void mapping_set_gfp_mask(struct address_space *m, gfp_t mask)
|
||||
{
|
||||
m->flags = (m->flags & ~__GFP_BITS_MASK) | mask;
|
||||
m->flags = (m->flags & ~(__force unsigned long)__GFP_BITS_MASK) |
|
||||
(__force unsigned long)mask;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -69,7 +70,7 @@ extern struct page * find_lock_page(struct address_space *mapping,
|
|||
extern struct page * find_trylock_page(struct address_space *mapping,
|
||||
unsigned long index);
|
||||
extern struct page * find_or_create_page(struct address_space *mapping,
|
||||
unsigned long index, unsigned int gfp_mask);
|
||||
unsigned long index, gfp_t gfp_mask);
|
||||
unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
|
||||
unsigned int nr_pages, struct page **pages);
|
||||
unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index,
|
||||
|
@ -92,9 +93,9 @@ extern int read_cache_pages(struct address_space *mapping,
|
|||
struct list_head *pages, filler_t *filler, void *data);
|
||||
|
||||
int add_to_page_cache(struct page *page, struct address_space *mapping,
|
||||
unsigned long index, int gfp_mask);
|
||||
unsigned long index, gfp_t gfp_mask);
|
||||
int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
|
||||
unsigned long index, int gfp_mask);
|
||||
unsigned long index, gfp_t gfp_mask);
|
||||
extern void remove_from_page_cache(struct page *page);
|
||||
extern void __remove_from_page_cache(struct page *page);
|
||||
|
||||
|
|
|
@ -132,6 +132,7 @@ struct pci_dev {
|
|||
unsigned int is_enabled:1; /* pci_enable_device has been called */
|
||||
unsigned int is_busmaster:1; /* device is busmaster */
|
||||
unsigned int no_msi:1; /* device may not use msi */
|
||||
unsigned int block_ucfg_access:1; /* userspace config space access is blocked */
|
||||
|
||||
u32 saved_config_space[16]; /* config space saved at suspend time */
|
||||
struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */
|
||||
|
@ -490,6 +491,9 @@ extern void pci_disable_msix(struct pci_dev *dev);
|
|||
extern void msi_remove_pci_irq_vectors(struct pci_dev *dev);
|
||||
#endif
|
||||
|
||||
extern void pci_block_user_cfg_access(struct pci_dev *dev);
|
||||
extern void pci_unblock_user_cfg_access(struct pci_dev *dev);
|
||||
|
||||
/*
|
||||
* PCI domain support. Sometimes called PCI segment (eg by ACPI),
|
||||
* a PCI domain is defined to be a set of PCI busses which share
|
||||
|
@ -560,6 +564,9 @@ static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state, int en
|
|||
|
||||
#define pci_dma_burst_advice(pdev, strat, strategy_parameter) do { } while (0)
|
||||
|
||||
static inline void pci_block_user_cfg_access(struct pci_dev *dev) { }
|
||||
static inline void pci_unblock_user_cfg_access(struct pci_dev *dev) { }
|
||||
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
/* Include architecture-dependent settings and functions */
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -170,6 +170,7 @@ typedef int __bitwise suspend_disk_method_t;
|
|||
|
||||
struct pm_ops {
|
||||
suspend_disk_method_t pm_disk_mode;
|
||||
int (*valid)(suspend_state_t state);
|
||||
int (*prepare)(suspend_state_t state);
|
||||
int (*enter)(suspend_state_t state);
|
||||
int (*finish)(suspend_state_t state);
|
||||
|
@ -219,10 +220,11 @@ typedef struct pm_message {
|
|||
|
||||
struct dev_pm_info {
|
||||
pm_message_t power_state;
|
||||
unsigned can_wakeup:1;
|
||||
#ifdef CONFIG_PM
|
||||
unsigned should_wakeup:1;
|
||||
pm_message_t prev_state;
|
||||
void * saved_state;
|
||||
atomic_t pm_users;
|
||||
struct device * pm_parent;
|
||||
struct list_head entry;
|
||||
#endif
|
||||
|
@ -236,13 +238,48 @@ extern void device_resume(void);
|
|||
|
||||
#ifdef CONFIG_PM
|
||||
extern int device_suspend(pm_message_t state);
|
||||
#else
|
||||
|
||||
#define device_set_wakeup_enable(dev,val) \
|
||||
((dev)->power.should_wakeup = !!(val))
|
||||
#define device_may_wakeup(dev) \
|
||||
(device_can_wakeup(dev) && (dev)->power.should_wakeup)
|
||||
|
||||
extern int dpm_runtime_suspend(struct device *, pm_message_t);
|
||||
extern void dpm_runtime_resume(struct device *);
|
||||
|
||||
#else /* !CONFIG_PM */
|
||||
|
||||
static inline int device_suspend(pm_message_t state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define device_set_wakeup_enable(dev,val) do{}while(0)
|
||||
#define device_may_wakeup(dev) (0)
|
||||
|
||||
static inline int dpm_runtime_suspend(struct device * dev, pm_message_t state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void dpm_runtime_resume(struct device * dev)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* changes to device_may_wakeup take effect on the next pm state change.
|
||||
* by default, devices should wakeup if they can.
|
||||
*/
|
||||
#define device_can_wakeup(dev) \
|
||||
((dev)->power.can_wakeup)
|
||||
#define device_init_wakeup(dev,val) \
|
||||
do { \
|
||||
device_can_wakeup(dev) = !!(val); \
|
||||
device_set_wakeup_enable(dev,val); \
|
||||
} while(0)
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _LINUX_PM_H */
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
|
||||
struct radix_tree_root {
|
||||
unsigned int height;
|
||||
unsigned int gfp_mask;
|
||||
gfp_t gfp_mask;
|
||||
struct radix_tree_node *rnode;
|
||||
};
|
||||
|
||||
|
|
|
@ -275,6 +275,7 @@ static inline int rcu_pending(int cpu)
|
|||
extern void rcu_init(void);
|
||||
extern void rcu_check_callbacks(int cpu, int user);
|
||||
extern void rcu_restart_cpu(int cpu);
|
||||
extern long rcu_batches_completed(void);
|
||||
|
||||
/* Exported interfaces */
|
||||
extern void FASTCALL(call_rcu(struct rcu_head *head,
|
||||
|
|
|
@ -1972,7 +1972,7 @@ extern struct address_space_operations reiserfs_address_space_operations;
|
|||
|
||||
/* fix_nodes.c */
|
||||
#ifdef CONFIG_REISERFS_CHECK
|
||||
void *reiserfs_kmalloc(size_t size, int flags, struct super_block *s);
|
||||
void *reiserfs_kmalloc(size_t size, gfp_t flags, struct super_block *s);
|
||||
void reiserfs_kfree(const void *vp, size_t size, struct super_block *s);
|
||||
#else
|
||||
static inline void *reiserfs_kmalloc(size_t size, int flags,
|
||||
|
|
|
@ -95,8 +95,8 @@ int try_to_unmap(struct page *);
|
|||
/*
|
||||
* Called from mm/filemap_xip.c to unmap empty zero page
|
||||
*/
|
||||
pte_t *page_check_address(struct page *, struct mm_struct *, unsigned long);
|
||||
|
||||
pte_t *page_check_address(struct page *, struct mm_struct *,
|
||||
unsigned long, spinlock_t **);
|
||||
|
||||
/*
|
||||
* Used by swapoff to help locate where page is expected in vma.
|
||||
|
|
|
@ -61,5 +61,10 @@ extern void FASTCALL(__up_read(struct rw_semaphore *sem));
|
|||
extern void FASTCALL(__up_write(struct rw_semaphore *sem));
|
||||
extern void FASTCALL(__downgrade_write(struct rw_semaphore *sem));
|
||||
|
||||
static inline int rwsem_is_locked(struct rw_semaphore *sem)
|
||||
{
|
||||
return (sem->activity != 0);
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _LINUX_RWSEM_SPINLOCK_H */
|
||||
|
|
|
@ -1,14 +1,23 @@
|
|||
#ifndef _LINUX_SCATTERLIST_H
|
||||
#define _LINUX_SCATTERLIST_H
|
||||
|
||||
static inline void sg_init_one(struct scatterlist *sg,
|
||||
u8 *buf, unsigned int buflen)
|
||||
{
|
||||
memset(sg, 0, sizeof(*sg));
|
||||
#include <asm/scatterlist.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
static inline void sg_set_buf(struct scatterlist *sg, void *buf,
|
||||
unsigned int buflen)
|
||||
{
|
||||
sg->page = virt_to_page(buf);
|
||||
sg->offset = offset_in_page(buf);
|
||||
sg->length = buflen;
|
||||
}
|
||||
|
||||
static inline void sg_init_one(struct scatterlist *sg, void *buf,
|
||||
unsigned int buflen)
|
||||
{
|
||||
memset(sg, 0, sizeof(*sg));
|
||||
sg_set_buf(sg, buf, buflen);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_SCATTERLIST_H */
|
||||
|
|
|
@ -249,6 +249,36 @@ arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr,
|
|||
extern void arch_unmap_area(struct mm_struct *, unsigned long);
|
||||
extern void arch_unmap_area_topdown(struct mm_struct *, unsigned long);
|
||||
|
||||
#if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS
|
||||
/*
|
||||
* The mm counters are not protected by its page_table_lock,
|
||||
* so must be incremented atomically.
|
||||
*/
|
||||
#ifdef ATOMIC64_INIT
|
||||
#define set_mm_counter(mm, member, value) atomic64_set(&(mm)->_##member, value)
|
||||
#define get_mm_counter(mm, member) ((unsigned long)atomic64_read(&(mm)->_##member))
|
||||
#define add_mm_counter(mm, member, value) atomic64_add(value, &(mm)->_##member)
|
||||
#define inc_mm_counter(mm, member) atomic64_inc(&(mm)->_##member)
|
||||
#define dec_mm_counter(mm, member) atomic64_dec(&(mm)->_##member)
|
||||
typedef atomic64_t mm_counter_t;
|
||||
#else /* !ATOMIC64_INIT */
|
||||
/*
|
||||
* The counters wrap back to 0 at 2^32 * PAGE_SIZE,
|
||||
* that is, at 16TB if using 4kB page size.
|
||||
*/
|
||||
#define set_mm_counter(mm, member, value) atomic_set(&(mm)->_##member, value)
|
||||
#define get_mm_counter(mm, member) ((unsigned long)atomic_read(&(mm)->_##member))
|
||||
#define add_mm_counter(mm, member, value) atomic_add(value, &(mm)->_##member)
|
||||
#define inc_mm_counter(mm, member) atomic_inc(&(mm)->_##member)
|
||||
#define dec_mm_counter(mm, member) atomic_dec(&(mm)->_##member)
|
||||
typedef atomic_t mm_counter_t;
|
||||
#endif /* !ATOMIC64_INIT */
|
||||
|
||||
#else /* NR_CPUS < CONFIG_SPLIT_PTLOCK_CPUS */
|
||||
/*
|
||||
* The mm counters are protected by its page_table_lock,
|
||||
* so can be incremented directly.
|
||||
*/
|
||||
#define set_mm_counter(mm, member, value) (mm)->_##member = (value)
|
||||
#define get_mm_counter(mm, member) ((mm)->_##member)
|
||||
#define add_mm_counter(mm, member, value) (mm)->_##member += (value)
|
||||
|
@ -256,6 +286,20 @@ extern void arch_unmap_area_topdown(struct mm_struct *, unsigned long);
|
|||
#define dec_mm_counter(mm, member) (mm)->_##member--
|
||||
typedef unsigned long mm_counter_t;
|
||||
|
||||
#endif /* NR_CPUS < CONFIG_SPLIT_PTLOCK_CPUS */
|
||||
|
||||
#define get_mm_rss(mm) \
|
||||
(get_mm_counter(mm, file_rss) + get_mm_counter(mm, anon_rss))
|
||||
#define update_hiwater_rss(mm) do { \
|
||||
unsigned long _rss = get_mm_rss(mm); \
|
||||
if ((mm)->hiwater_rss < _rss) \
|
||||
(mm)->hiwater_rss = _rss; \
|
||||
} while (0)
|
||||
#define update_hiwater_vm(mm) do { \
|
||||
if ((mm)->hiwater_vm < (mm)->total_vm) \
|
||||
(mm)->hiwater_vm = (mm)->total_vm; \
|
||||
} while (0)
|
||||
|
||||
struct mm_struct {
|
||||
struct vm_area_struct * mmap; /* list of VMAs */
|
||||
struct rb_root mm_rb;
|
||||
|
@ -279,15 +323,20 @@ struct mm_struct {
|
|||
* by mmlist_lock
|
||||
*/
|
||||
|
||||
/* Special counters, in some configurations protected by the
|
||||
* page_table_lock, in other configurations by being atomic.
|
||||
*/
|
||||
mm_counter_t _file_rss;
|
||||
mm_counter_t _anon_rss;
|
||||
|
||||
unsigned long hiwater_rss; /* High-watermark of RSS usage */
|
||||
unsigned long hiwater_vm; /* High-water virtual memory usage */
|
||||
|
||||
unsigned long total_vm, locked_vm, shared_vm, exec_vm;
|
||||
unsigned long stack_vm, reserved_vm, def_flags, nr_ptes;
|
||||
unsigned long start_code, end_code, start_data, end_data;
|
||||
unsigned long start_brk, brk, start_stack;
|
||||
unsigned long arg_start, arg_end, env_start, env_end;
|
||||
unsigned long total_vm, locked_vm, shared_vm;
|
||||
unsigned long exec_vm, stack_vm, reserved_vm, def_flags, nr_ptes;
|
||||
|
||||
/* Special counters protected by the page_table_lock */
|
||||
mm_counter_t _rss;
|
||||
mm_counter_t _anon_rss;
|
||||
|
||||
unsigned long saved_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv */
|
||||
|
||||
|
@ -308,11 +357,7 @@ struct mm_struct {
|
|||
/* aio bits */
|
||||
rwlock_t ioctx_list_lock;
|
||||
struct kioctx *ioctx_list;
|
||||
|
||||
struct kioctx default_kioctx;
|
||||
|
||||
unsigned long hiwater_rss; /* High-water RSS usage */
|
||||
unsigned long hiwater_vm; /* High-water virtual memory usage */
|
||||
};
|
||||
|
||||
struct sighand_struct {
|
||||
|
@ -895,7 +940,7 @@ extern int set_cpus_allowed(task_t *p, cpumask_t new_mask);
|
|||
#else
|
||||
static inline int set_cpus_allowed(task_t *p, cpumask_t new_mask)
|
||||
{
|
||||
if (!cpus_intersects(new_mask, cpu_online_map))
|
||||
if (!cpu_isset(0, new_mask))
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
@ -1039,6 +1084,11 @@ extern int do_sigaltstack(const stack_t __user *, stack_t __user *, unsigned lon
|
|||
#define SEND_SIG_PRIV ((struct siginfo *) 1)
|
||||
#define SEND_SIG_FORCED ((struct siginfo *) 2)
|
||||
|
||||
static inline int is_si_special(const struct siginfo *info)
|
||||
{
|
||||
return info <= SEND_SIG_FORCED;
|
||||
}
|
||||
|
||||
/* True if we are on the alternate signal stack. */
|
||||
|
||||
static inline int on_sig_stack(unsigned long sp)
|
||||
|
@ -1166,7 +1216,7 @@ extern void unhash_process(struct task_struct *p);
|
|||
/*
|
||||
* Protects ->fs, ->files, ->mm, ->ptrace, ->group_info, ->comm, keyring
|
||||
* subscriptions and synchronises with wait4(). Also used in procfs. Also
|
||||
* pins the final release of task.io_context.
|
||||
* pins the final release of task.io_context. Also protects ->cpuset.
|
||||
*
|
||||
* Nests both inside and outside of read_lock(&tasklist_lock).
|
||||
* It must not be nested with write_lock_irq(&tasklist_lock),
|
||||
|
|
|
@ -52,12 +52,8 @@ typedef struct sdlahw
|
|||
|
||||
extern int sdla_setup (sdlahw_t* hw, void* sfm, unsigned len);
|
||||
extern int sdla_down (sdlahw_t* hw);
|
||||
extern int sdla_inten (sdlahw_t* hw);
|
||||
extern int sdla_intde (sdlahw_t* hw);
|
||||
extern int sdla_intack (sdlahw_t* hw);
|
||||
extern void S514_intack (sdlahw_t* hw, u32 int_status);
|
||||
extern void read_S514_int_stat (sdlahw_t* hw, u32* int_status);
|
||||
extern int sdla_intr (sdlahw_t* hw);
|
||||
extern int sdla_mapmem (sdlahw_t* hw, unsigned long addr);
|
||||
extern int sdla_peek (sdlahw_t* hw, unsigned long addr, void* buf,
|
||||
unsigned len);
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/shm.h>
|
||||
#include <linux/msg.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/key.h>
|
||||
|
||||
struct ctl_table;
|
||||
|
||||
|
@ -385,6 +386,9 @@ struct swap_info_struct;
|
|||
* NULL to request the size of the buffer required. @size indicates
|
||||
* the size of @buffer in bytes. Note that @name is the remainder
|
||||
* of the attribute name after the security. prefix has been removed.
|
||||
* @err is the return value from the preceding fs getxattr call,
|
||||
* and can be used by the security module to determine whether it
|
||||
* should try and canonicalize the attribute value.
|
||||
* Return number of bytes used/required on success.
|
||||
* @inode_setsecurity:
|
||||
* Set the security label associated with @name for @inode from the
|
||||
|
@ -785,6 +789,27 @@ struct swap_info_struct;
|
|||
* @sk_free_security:
|
||||
* Deallocate security structure.
|
||||
*
|
||||
* Security hooks affecting all Key Management operations
|
||||
*
|
||||
* @key_alloc:
|
||||
* Permit allocation of a key and assign security data. Note that key does
|
||||
* not have a serial number assigned at this point.
|
||||
* @key points to the key.
|
||||
* Return 0 if permission is granted, -ve error otherwise.
|
||||
* @key_free:
|
||||
* Notification of destruction; free security data.
|
||||
* @key points to the key.
|
||||
* No return value.
|
||||
* @key_permission:
|
||||
* See whether a specific operational right is granted to a process on a
|
||||
* key.
|
||||
* @key_ref refers to the key (key pointer + possession attribute bit).
|
||||
* @context points to the process to provide the context against which to
|
||||
* evaluate the security data on the key.
|
||||
* @perm describes the combination of permissions required of this key.
|
||||
* Return 1 if permission granted, 0 if permission denied and -ve it the
|
||||
* normal permissions model should be effected.
|
||||
*
|
||||
* Security hooks affecting all System V IPC operations.
|
||||
*
|
||||
* @ipc_permission:
|
||||
|
@ -1091,7 +1116,7 @@ struct security_operations {
|
|||
int (*inode_getxattr) (struct dentry *dentry, char *name);
|
||||
int (*inode_listxattr) (struct dentry *dentry);
|
||||
int (*inode_removexattr) (struct dentry *dentry, char *name);
|
||||
int (*inode_getsecurity)(struct inode *inode, const char *name, void *buffer, size_t size);
|
||||
int (*inode_getsecurity)(struct inode *inode, const char *name, void *buffer, size_t size, int err);
|
||||
int (*inode_setsecurity)(struct inode *inode, const char *name, const void *value, size_t size, int flags);
|
||||
int (*inode_listsecurity)(struct inode *inode, char *buffer, size_t buffer_size);
|
||||
|
||||
|
@ -1210,9 +1235,20 @@ struct security_operations {
|
|||
int (*socket_shutdown) (struct socket * sock, int how);
|
||||
int (*socket_sock_rcv_skb) (struct sock * sk, struct sk_buff * skb);
|
||||
int (*socket_getpeersec) (struct socket *sock, char __user *optval, int __user *optlen, unsigned len);
|
||||
int (*sk_alloc_security) (struct sock *sk, int family, int priority);
|
||||
int (*sk_alloc_security) (struct sock *sk, int family, gfp_t priority);
|
||||
void (*sk_free_security) (struct sock *sk);
|
||||
#endif /* CONFIG_SECURITY_NETWORK */
|
||||
|
||||
/* key management security hooks */
|
||||
#ifdef CONFIG_KEYS
|
||||
int (*key_alloc)(struct key *key);
|
||||
void (*key_free)(struct key *key);
|
||||
int (*key_permission)(key_ref_t key_ref,
|
||||
struct task_struct *context,
|
||||
key_perm_t perm);
|
||||
|
||||
#endif /* CONFIG_KEYS */
|
||||
|
||||
};
|
||||
|
||||
/* global variables */
|
||||
|
@ -1580,11 +1616,11 @@ static inline int security_inode_removexattr (struct dentry *dentry, char *name)
|
|||
return security_ops->inode_removexattr (dentry, name);
|
||||
}
|
||||
|
||||
static inline int security_inode_getsecurity(struct inode *inode, const char *name, void *buffer, size_t size)
|
||||
static inline int security_inode_getsecurity(struct inode *inode, const char *name, void *buffer, size_t size, int err)
|
||||
{
|
||||
if (unlikely (IS_PRIVATE (inode)))
|
||||
return 0;
|
||||
return security_ops->inode_getsecurity(inode, name, buffer, size);
|
||||
return security_ops->inode_getsecurity(inode, name, buffer, size, err);
|
||||
}
|
||||
|
||||
static inline int security_inode_setsecurity(struct inode *inode, const char *name, const void *value, size_t size, int flags)
|
||||
|
@ -2222,7 +2258,7 @@ static inline int security_inode_removexattr (struct dentry *dentry, char *name)
|
|||
return cap_inode_removexattr(dentry, name);
|
||||
}
|
||||
|
||||
static inline int security_inode_getsecurity(struct inode *inode, const char *name, void *buffer, size_t size)
|
||||
static inline int security_inode_getsecurity(struct inode *inode, const char *name, void *buffer, size_t size, int err)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
@ -2761,5 +2797,45 @@ static inline void security_sk_free(struct sock *sk)
|
|||
}
|
||||
#endif /* CONFIG_SECURITY_NETWORK */
|
||||
|
||||
#ifdef CONFIG_KEYS
|
||||
#ifdef CONFIG_SECURITY
|
||||
static inline int security_key_alloc(struct key *key)
|
||||
{
|
||||
return security_ops->key_alloc(key);
|
||||
}
|
||||
|
||||
static inline void security_key_free(struct key *key)
|
||||
{
|
||||
security_ops->key_free(key);
|
||||
}
|
||||
|
||||
static inline int security_key_permission(key_ref_t key_ref,
|
||||
struct task_struct *context,
|
||||
key_perm_t perm)
|
||||
{
|
||||
return security_ops->key_permission(key_ref, context, perm);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline int security_key_alloc(struct key *key)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void security_key_free(struct key *key)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int security_key_permission(key_ref_t key_ref,
|
||||
struct task_struct *context,
|
||||
key_perm_t perm)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* CONFIG_KEYS */
|
||||
|
||||
#endif /* ! __LINUX_SECURITY_H */
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#define _LINUX_SERIAL_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/types.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
/*
|
||||
|
|
|
@ -39,7 +39,8 @@
|
|||
#define PORT_RSA 13
|
||||
#define PORT_NS16550A 14
|
||||
#define PORT_XSCALE 15
|
||||
#define PORT_MAX_8250 15 /* max port ID */
|
||||
#define PORT_IP3106 16
|
||||
#define PORT_MAX_8250 16 /* max port ID */
|
||||
|
||||
/*
|
||||
* ARM specific type numbers. These are not currently guaranteed
|
||||
|
|
81
include/linux/serial_ip3106.h
Normal file
81
include/linux/serial_ip3106.h
Normal file
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
* Embedded Alley Solutions, source@embeddedalley.com.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_SERIAL_IP3106_H
|
||||
#define _LINUX_SERIAL_IP3106_H
|
||||
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/device.h>
|
||||
|
||||
#define IP3106_NR_PORTS 2
|
||||
|
||||
struct ip3106_port {
|
||||
struct uart_port port;
|
||||
struct timer_list timer;
|
||||
unsigned int old_status;
|
||||
};
|
||||
|
||||
/* register offsets */
|
||||
#define IP3106_LCR 0
|
||||
#define IP3106_MCR 0x004
|
||||
#define IP3106_BAUD 0x008
|
||||
#define IP3106_CFG 0x00c
|
||||
#define IP3106_FIFO 0x028
|
||||
#define IP3106_ISTAT 0xfe0
|
||||
#define IP3106_IEN 0xfe4
|
||||
#define IP3106_ICLR 0xfe8
|
||||
#define IP3106_ISET 0xfec
|
||||
#define IP3106_PD 0xff4
|
||||
#define IP3106_MID 0xffc
|
||||
|
||||
#define IP3106_UART_LCR_TXBREAK (1<<30)
|
||||
#define IP3106_UART_LCR_PAREVN 0x10000000
|
||||
#define IP3106_UART_LCR_PAREN 0x08000000
|
||||
#define IP3106_UART_LCR_2STOPB 0x04000000
|
||||
#define IP3106_UART_LCR_8BIT 0x01000000
|
||||
#define IP3106_UART_LCR_TX_RST 0x00040000
|
||||
#define IP3106_UART_LCR_RX_RST 0x00020000
|
||||
#define IP3106_UART_LCR_RX_NEXT 0x00010000
|
||||
|
||||
#define IP3106_UART_MCR_SCR 0xFF000000
|
||||
#define IP3106_UART_MCR_DCD 0x00800000
|
||||
#define IP3106_UART_MCR_CTS 0x00100000
|
||||
#define IP3106_UART_MCR_LOOP 0x00000010
|
||||
#define IP3106_UART_MCR_RTS 0x00000002
|
||||
#define IP3106_UART_MCR_DTR 0x00000001
|
||||
|
||||
#define IP3106_UART_INT_TX 0x00000080
|
||||
#define IP3106_UART_INT_EMPTY 0x00000040
|
||||
#define IP3106_UART_INT_RCVTO 0x00000020
|
||||
#define IP3106_UART_INT_RX 0x00000010
|
||||
#define IP3106_UART_INT_RXOVRN 0x00000008
|
||||
#define IP3106_UART_INT_FRERR 0x00000004
|
||||
#define IP3106_UART_INT_BREAK 0x00000002
|
||||
#define IP3106_UART_INT_PARITY 0x00000001
|
||||
#define IP3106_UART_INT_ALLRX 0x0000003F
|
||||
#define IP3106_UART_INT_ALLTX 0x000000C0
|
||||
|
||||
#define IP3106_UART_FIFO_TXFIFO 0x001F0000
|
||||
#define IP3106_UART_FIFO_TXFIFO_STA (0x1f<<16)
|
||||
#define IP3106_UART_FIFO_RXBRK 0x00008000
|
||||
#define IP3106_UART_FIFO_RXFE 0x00004000
|
||||
#define IP3106_UART_FIFO_RXPAR 0x00002000
|
||||
#define IP3106_UART_FIFO_RXFIFO 0x00001F00
|
||||
#define IP3106_UART_FIFO_RBRTHR 0x000000FF
|
||||
|
||||
#endif
|
|
@ -25,7 +25,6 @@
|
|||
|
||||
struct sigqueue {
|
||||
struct list_head list;
|
||||
spinlock_t *lock;
|
||||
int flags;
|
||||
siginfo_t info;
|
||||
struct user_struct *user;
|
||||
|
|
|
@ -137,6 +137,8 @@ struct skb_shared_info {
|
|||
unsigned int nr_frags;
|
||||
unsigned short tso_size;
|
||||
unsigned short tso_segs;
|
||||
unsigned short ufo_size;
|
||||
unsigned int ip6_frag_id;
|
||||
struct sk_buff *frag_list;
|
||||
skb_frag_t frags[MAX_SKB_FRAGS];
|
||||
};
|
||||
|
@ -171,7 +173,6 @@ enum {
|
|||
* struct sk_buff - socket buffer
|
||||
* @next: Next buffer in list
|
||||
* @prev: Previous buffer in list
|
||||
* @list: List we are on
|
||||
* @sk: Socket we are owned by
|
||||
* @tstamp: Time we arrived
|
||||
* @dev: Device we arrived on/are leaving by
|
||||
|
@ -190,6 +191,7 @@ enum {
|
|||
* @cloned: Head may be cloned (check refcnt to be sure)
|
||||
* @nohdr: Payload reference only, must not modify header
|
||||
* @pkt_type: Packet class
|
||||
* @fclone: skbuff clone status
|
||||
* @ip_summed: Driver fed us an IP checksum
|
||||
* @priority: Packet queueing priority
|
||||
* @users: User count - see {datagram,tcp}.c
|
||||
|
@ -202,6 +204,7 @@ enum {
|
|||
* @destructor: Destruct function
|
||||
* @nfmark: Can be used for communication between hooks
|
||||
* @nfct: Associated connection, if any
|
||||
* @ipvs_property: skbuff is owned by ipvs
|
||||
* @nfctinfo: Relationship of this skb to the connection
|
||||
* @nf_bridge: Saved data about a bridged frame - see br_netfilter.c
|
||||
* @tc_index: Traffic control index
|
||||
|
@ -340,6 +343,11 @@ extern void skb_over_panic(struct sk_buff *skb, int len,
|
|||
extern void skb_under_panic(struct sk_buff *skb, int len,
|
||||
void *here);
|
||||
|
||||
extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
|
||||
int getfrag(void *from, char *to, int offset,
|
||||
int len,int odd, struct sk_buff *skb),
|
||||
void *from, int length);
|
||||
|
||||
struct skb_seq_state
|
||||
{
|
||||
__u32 lower_offset;
|
||||
|
|
|
@ -121,7 +121,7 @@ extern unsigned int ksize(const void *);
|
|||
extern void *kmem_cache_alloc_node(kmem_cache_t *, gfp_t flags, int node);
|
||||
extern void *kmalloc_node(size_t size, gfp_t flags, int node);
|
||||
#else
|
||||
static inline void *kmem_cache_alloc_node(kmem_cache_t *cachep, int flags, int node)
|
||||
static inline void *kmem_cache_alloc_node(kmem_cache_t *cachep, gfp_t flags, int node)
|
||||
{
|
||||
return kmem_cache_alloc(cachep, flags);
|
||||
}
|
||||
|
|
|
@ -171,23 +171,42 @@ extern int __lockfunc generic__raw_read_trylock(raw_rwlock_t *lock);
|
|||
#define write_lock_irq(lock) _write_lock_irq(lock)
|
||||
#define write_lock_bh(lock) _write_lock_bh(lock)
|
||||
|
||||
#define spin_unlock(lock) _spin_unlock(lock)
|
||||
#define write_unlock(lock) _write_unlock(lock)
|
||||
#define read_unlock(lock) _read_unlock(lock)
|
||||
/*
|
||||
* We inline the unlock functions in the nondebug case:
|
||||
*/
|
||||
#if defined(CONFIG_DEBUG_SPINLOCK) || defined(CONFIG_PREEMPT) || !defined(CONFIG_SMP)
|
||||
# define spin_unlock(lock) _spin_unlock(lock)
|
||||
# define read_unlock(lock) _read_unlock(lock)
|
||||
# define write_unlock(lock) _write_unlock(lock)
|
||||
#else
|
||||
# define spin_unlock(lock) __raw_spin_unlock(&(lock)->raw_lock)
|
||||
# define read_unlock(lock) __raw_read_unlock(&(lock)->raw_lock)
|
||||
# define write_unlock(lock) __raw_write_unlock(&(lock)->raw_lock)
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_DEBUG_SPINLOCK) || defined(CONFIG_PREEMPT) || !defined(CONFIG_SMP)
|
||||
# define spin_unlock_irq(lock) _spin_unlock_irq(lock)
|
||||
# define read_unlock_irq(lock) _read_unlock_irq(lock)
|
||||
# define write_unlock_irq(lock) _write_unlock_irq(lock)
|
||||
#else
|
||||
# define spin_unlock_irq(lock) \
|
||||
do { __raw_spin_unlock(&(lock)->raw_lock); local_irq_enable(); } while (0)
|
||||
# define read_unlock_irq(lock) \
|
||||
do { __raw_read_unlock(&(lock)->raw_lock); local_irq_enable(); } while (0)
|
||||
# define write_unlock_irq(lock) \
|
||||
do { __raw_write_unlock(&(lock)->raw_lock); local_irq_enable(); } while (0)
|
||||
#endif
|
||||
|
||||
#define spin_unlock_irqrestore(lock, flags) \
|
||||
_spin_unlock_irqrestore(lock, flags)
|
||||
#define spin_unlock_irq(lock) _spin_unlock_irq(lock)
|
||||
#define spin_unlock_bh(lock) _spin_unlock_bh(lock)
|
||||
|
||||
#define read_unlock_irqrestore(lock, flags) \
|
||||
_read_unlock_irqrestore(lock, flags)
|
||||
#define read_unlock_irq(lock) _read_unlock_irq(lock)
|
||||
#define read_unlock_bh(lock) _read_unlock_bh(lock)
|
||||
|
||||
#define write_unlock_irqrestore(lock, flags) \
|
||||
_write_unlock_irqrestore(lock, flags)
|
||||
#define write_unlock_irq(lock) _write_unlock_irq(lock)
|
||||
#define write_unlock_bh(lock) _write_unlock_bh(lock)
|
||||
|
||||
#define spin_trylock_bh(lock) __cond_lock(_spin_trylock_bh(lock))
|
||||
|
|
|
@ -66,7 +66,12 @@ struct rpc_cred_cache {
|
|||
|
||||
struct rpc_auth {
|
||||
unsigned int au_cslack; /* call cred size estimate */
|
||||
unsigned int au_rslack; /* reply verf size guess */
|
||||
/* guess at number of u32's auth adds before
|
||||
* reply data; normally the verifier size: */
|
||||
unsigned int au_rslack;
|
||||
/* for gss, used to calculate au_rslack: */
|
||||
unsigned int au_verfsize;
|
||||
|
||||
unsigned int au_flags; /* various flags */
|
||||
struct rpc_authops * au_ops; /* operations */
|
||||
rpc_authflavor_t au_flavor; /* pseudoflavor (note may
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#define RPCDBG_AUTH 0x0010
|
||||
#define RPCDBG_PMAP 0x0020
|
||||
#define RPCDBG_SCHED 0x0040
|
||||
#define RPCDBG_TRANS 0x0080
|
||||
#define RPCDBG_SVCSOCK 0x0100
|
||||
#define RPCDBG_SVCDSP 0x0200
|
||||
#define RPCDBG_MISC 0x0400
|
||||
|
@ -94,6 +95,8 @@ enum {
|
|||
CTL_NLMDEBUG,
|
||||
CTL_SLOTTABLE_UDP,
|
||||
CTL_SLOTTABLE_TCP,
|
||||
CTL_MIN_RESVPORT,
|
||||
CTL_MAX_RESVPORT,
|
||||
};
|
||||
|
||||
#endif /* _LINUX_SUNRPC_DEBUG_H_ */
|
||||
|
|
|
@ -40,14 +40,21 @@ int gss_import_sec_context(
|
|||
struct gss_ctx **ctx_id);
|
||||
u32 gss_get_mic(
|
||||
struct gss_ctx *ctx_id,
|
||||
u32 qop,
|
||||
struct xdr_buf *message,
|
||||
struct xdr_netobj *mic_token);
|
||||
u32 gss_verify_mic(
|
||||
struct gss_ctx *ctx_id,
|
||||
struct xdr_buf *message,
|
||||
struct xdr_netobj *mic_token,
|
||||
u32 *qstate);
|
||||
struct xdr_netobj *mic_token);
|
||||
u32 gss_wrap(
|
||||
struct gss_ctx *ctx_id,
|
||||
int offset,
|
||||
struct xdr_buf *outbuf,
|
||||
struct page **inpages);
|
||||
u32 gss_unwrap(
|
||||
struct gss_ctx *ctx_id,
|
||||
int offset,
|
||||
struct xdr_buf *inbuf);
|
||||
u32 gss_delete_sec_context(
|
||||
struct gss_ctx **ctx_id);
|
||||
|
||||
|
@ -56,7 +63,6 @@ char *gss_service_to_auth_domain_name(struct gss_api_mech *, u32 service);
|
|||
|
||||
struct pf_desc {
|
||||
u32 pseudoflavor;
|
||||
u32 qop;
|
||||
u32 service;
|
||||
char *name;
|
||||
char *auth_domain_name;
|
||||
|
@ -85,14 +91,21 @@ struct gss_api_ops {
|
|||
struct gss_ctx *ctx_id);
|
||||
u32 (*gss_get_mic)(
|
||||
struct gss_ctx *ctx_id,
|
||||
u32 qop,
|
||||
struct xdr_buf *message,
|
||||
struct xdr_netobj *mic_token);
|
||||
u32 (*gss_verify_mic)(
|
||||
struct gss_ctx *ctx_id,
|
||||
struct xdr_buf *message,
|
||||
struct xdr_netobj *mic_token,
|
||||
u32 *qstate);
|
||||
struct xdr_netobj *mic_token);
|
||||
u32 (*gss_wrap)(
|
||||
struct gss_ctx *ctx_id,
|
||||
int offset,
|
||||
struct xdr_buf *outbuf,
|
||||
struct page **inpages);
|
||||
u32 (*gss_unwrap)(
|
||||
struct gss_ctx *ctx_id,
|
||||
int offset,
|
||||
struct xdr_buf *buf);
|
||||
void (*gss_delete_sec_context)(
|
||||
void *internal_ctx_id);
|
||||
};
|
||||
|
|
|
@ -65,16 +65,6 @@ typedef unsigned int OM_uint32;
|
|||
#define GSS_C_MECH_CODE 2
|
||||
|
||||
|
||||
/*
|
||||
* Define the default Quality of Protection for per-message services. Note
|
||||
* that an implementation that offers multiple levels of QOP may either reserve
|
||||
* a value (for example zero, as assumed here) to mean "default protection", or
|
||||
* alternatively may simply equate GSS_C_QOP_DEFAULT to a specific explicit
|
||||
* QOP value. However a value of 0 should always be interpreted by a GSSAPI
|
||||
* implementation as a request for the default protection level.
|
||||
*/
|
||||
#define GSS_C_QOP_DEFAULT 0
|
||||
|
||||
/*
|
||||
* Expiration time of 2^32-1 seconds means infinite lifetime for a
|
||||
* credential or security context
|
||||
|
|
|
@ -116,18 +116,22 @@ enum seal_alg {
|
|||
|
||||
s32
|
||||
make_checksum(s32 cksumtype, char *header, int hdrlen, struct xdr_buf *body,
|
||||
struct xdr_netobj *cksum);
|
||||
int body_offset, struct xdr_netobj *cksum);
|
||||
|
||||
u32 gss_get_mic_kerberos(struct gss_ctx *, struct xdr_buf *,
|
||||
struct xdr_netobj *);
|
||||
|
||||
u32 gss_verify_mic_kerberos(struct gss_ctx *, struct xdr_buf *,
|
||||
struct xdr_netobj *);
|
||||
|
||||
u32
|
||||
krb5_make_token(struct krb5_ctx *context_handle, int qop_req,
|
||||
struct xdr_buf *input_message_buffer,
|
||||
struct xdr_netobj *output_message_buffer, int toktype);
|
||||
gss_wrap_kerberos(struct gss_ctx *ctx_id, int offset,
|
||||
struct xdr_buf *outbuf, struct page **pages);
|
||||
|
||||
u32
|
||||
krb5_read_token(struct krb5_ctx *context_handle,
|
||||
struct xdr_netobj *input_token_buffer,
|
||||
struct xdr_buf *message_buffer,
|
||||
int *qop_state, int toktype);
|
||||
gss_unwrap_kerberos(struct gss_ctx *ctx_id, int offset,
|
||||
struct xdr_buf *buf);
|
||||
|
||||
|
||||
u32
|
||||
krb5_encrypt(struct crypto_tfm * key,
|
||||
|
@ -137,6 +141,13 @@ u32
|
|||
krb5_decrypt(struct crypto_tfm * key,
|
||||
void *iv, void *in, void *out, int length);
|
||||
|
||||
int
|
||||
gss_encrypt_xdr_buf(struct crypto_tfm *tfm, struct xdr_buf *outbuf, int offset,
|
||||
struct page **pages);
|
||||
|
||||
int
|
||||
gss_decrypt_xdr_buf(struct crypto_tfm *tfm, struct xdr_buf *inbuf, int offset);
|
||||
|
||||
s32
|
||||
krb5_make_seq_num(struct crypto_tfm * key,
|
||||
int direction,
|
||||
|
|
|
@ -41,9 +41,9 @@ struct spkm3_ctx {
|
|||
#define SPKM_WRAP_TOK 5
|
||||
#define SPKM_DEL_TOK 6
|
||||
|
||||
u32 spkm3_make_token(struct spkm3_ctx *ctx, int qop_req, struct xdr_buf * text, struct xdr_netobj * token, int toktype);
|
||||
u32 spkm3_make_token(struct spkm3_ctx *ctx, struct xdr_buf * text, struct xdr_netobj * token, int toktype);
|
||||
|
||||
u32 spkm3_read_token(struct spkm3_ctx *ctx, struct xdr_netobj *read_token, struct xdr_buf *message_buffer, int *qop_state, int toktype);
|
||||
u32 spkm3_read_token(struct spkm3_ctx *ctx, struct xdr_netobj *read_token, struct xdr_buf *message_buffer, int toktype);
|
||||
|
||||
#define CKSUMTYPE_RSA_MD5 0x0007
|
||||
|
||||
|
|
|
@ -76,5 +76,30 @@ enum rpc_auth_stat {
|
|||
|
||||
#define RPC_MAXNETNAMELEN 256
|
||||
|
||||
/*
|
||||
* From RFC 1831:
|
||||
*
|
||||
* "A record is composed of one or more record fragments. A record
|
||||
* fragment is a four-byte header followed by 0 to (2**31) - 1 bytes of
|
||||
* fragment data. The bytes encode an unsigned binary number; as with
|
||||
* XDR integers, the byte order is from highest to lowest. The number
|
||||
* encodes two values -- a boolean which indicates whether the fragment
|
||||
* is the last fragment of the record (bit value 1 implies the fragment
|
||||
* is the last fragment) and a 31-bit unsigned binary value which is the
|
||||
* length in bytes of the fragment's data. The boolean value is the
|
||||
* highest-order bit of the header; the length is the 31 low-order bits.
|
||||
* (Note that this record specification is NOT in XDR standard form!)"
|
||||
*
|
||||
* The Linux RPC client always sends its requests in a single record
|
||||
* fragment, limiting the maximum payload size for stream transports to
|
||||
* 2GB.
|
||||
*/
|
||||
|
||||
typedef u32 rpc_fraghdr;
|
||||
|
||||
#define RPC_LAST_STREAM_FRAGMENT (1U << 31)
|
||||
#define RPC_FRAGMENT_SIZE_MASK (~RPC_LAST_STREAM_FRAGMENT)
|
||||
#define RPC_MAX_FRAGMENT_SIZE ((1U << 31) - 1)
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _LINUX_SUNRPC_MSGPROT_H_ */
|
||||
|
|
|
@ -161,14 +161,10 @@ typedef struct {
|
|||
|
||||
typedef size_t (*skb_read_actor_t)(skb_reader_t *desc, void *to, size_t len);
|
||||
|
||||
extern int csum_partial_copy_to_xdr(struct xdr_buf *, struct sk_buff *);
|
||||
extern ssize_t xdr_partial_copy_from_skb(struct xdr_buf *, unsigned int,
|
||||
skb_reader_t *, skb_read_actor_t);
|
||||
|
||||
struct socket;
|
||||
struct sockaddr;
|
||||
extern int xdr_sendpages(struct socket *, struct sockaddr *, int,
|
||||
struct xdr_buf *, unsigned int, int);
|
||||
|
||||
extern int xdr_encode_word(struct xdr_buf *, int, u32);
|
||||
extern int xdr_decode_word(struct xdr_buf *, int, u32 *);
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/include/linux/sunrpc/clnt_xprt.h
|
||||
* linux/include/linux/sunrpc/xprt.h
|
||||
*
|
||||
* Declarations for the RPC transport interface.
|
||||
*
|
||||
|
@ -15,20 +15,6 @@
|
|||
#include <linux/sunrpc/sched.h>
|
||||
#include <linux/sunrpc/xdr.h>
|
||||
|
||||
/*
|
||||
* The transport code maintains an estimate on the maximum number of out-
|
||||
* standing RPC requests, using a smoothed version of the congestion
|
||||
* avoidance implemented in 44BSD. This is basically the Van Jacobson
|
||||
* congestion algorithm: If a retransmit occurs, the congestion window is
|
||||
* halved; otherwise, it is incremented by 1/cwnd when
|
||||
*
|
||||
* - a reply is received and
|
||||
* - a full number of requests are outstanding and
|
||||
* - the congestion window hasn't been updated recently.
|
||||
*
|
||||
* Upper procedures may check whether a request would block waiting for
|
||||
* a free RPC slot by using the RPC_CONGESTED() macro.
|
||||
*/
|
||||
extern unsigned int xprt_udp_slot_table_entries;
|
||||
extern unsigned int xprt_tcp_slot_table_entries;
|
||||
|
||||
|
@ -36,35 +22,24 @@ extern unsigned int xprt_tcp_slot_table_entries;
|
|||
#define RPC_DEF_SLOT_TABLE (16U)
|
||||
#define RPC_MAX_SLOT_TABLE (128U)
|
||||
|
||||
#define RPC_CWNDSHIFT (8U)
|
||||
#define RPC_CWNDSCALE (1U << RPC_CWNDSHIFT)
|
||||
#define RPC_INITCWND RPC_CWNDSCALE
|
||||
#define RPC_MAXCWND(xprt) ((xprt)->max_reqs << RPC_CWNDSHIFT)
|
||||
#define RPCXPRT_CONGESTED(xprt) ((xprt)->cong >= (xprt)->cwnd)
|
||||
|
||||
/* Default timeout values */
|
||||
#define RPC_MAX_UDP_TIMEOUT (60*HZ)
|
||||
#define RPC_MAX_TCP_TIMEOUT (600*HZ)
|
||||
|
||||
/*
|
||||
* Wait duration for an RPC TCP connection to be established. Solaris
|
||||
* NFS over TCP uses 60 seconds, for example, which is in line with how
|
||||
* long a server takes to reboot.
|
||||
*/
|
||||
#define RPC_CONNECT_TIMEOUT (60*HZ)
|
||||
|
||||
/*
|
||||
* Delay an arbitrary number of seconds before attempting to reconnect
|
||||
* after an error.
|
||||
*/
|
||||
#define RPC_REESTABLISH_TIMEOUT (15*HZ)
|
||||
|
||||
/* RPC call and reply header size as number of 32bit words (verifier
|
||||
* RPC call and reply header size as number of 32bit words (verifier
|
||||
* size computed separately)
|
||||
*/
|
||||
#define RPC_CALLHDRSIZE 6
|
||||
#define RPC_REPHDRSIZE 4
|
||||
|
||||
/*
|
||||
* Parameters for choosing a free port
|
||||
*/
|
||||
extern unsigned int xprt_min_resvport;
|
||||
extern unsigned int xprt_max_resvport;
|
||||
|
||||
#define RPC_MIN_RESVPORT (1U)
|
||||
#define RPC_MAX_RESVPORT (65535U)
|
||||
#define RPC_DEF_MIN_RESVPORT (650U)
|
||||
#define RPC_DEF_MAX_RESVPORT (1023U)
|
||||
|
||||
/*
|
||||
* This describes a timeout strategy
|
||||
*/
|
||||
|
@ -76,6 +51,9 @@ struct rpc_timeout {
|
|||
unsigned char to_exponential;
|
||||
};
|
||||
|
||||
struct rpc_task;
|
||||
struct rpc_xprt;
|
||||
|
||||
/*
|
||||
* This describes a complete RPC request
|
||||
*/
|
||||
|
@ -95,7 +73,10 @@ struct rpc_rqst {
|
|||
int rq_cong; /* has incremented xprt->cong */
|
||||
int rq_received; /* receive completed */
|
||||
u32 rq_seqno; /* gss seq no. used on req. */
|
||||
|
||||
int rq_enc_pages_num;
|
||||
struct page **rq_enc_pages; /* scratch pages for use by
|
||||
gss privacy code */
|
||||
void (*rq_release_snd_buf)(struct rpc_rqst *); /* release rq_enc_pages */
|
||||
struct list_head rq_list;
|
||||
|
||||
struct xdr_buf rq_private_buf; /* The receive buffer
|
||||
|
@ -121,12 +102,21 @@ struct rpc_rqst {
|
|||
#define rq_svec rq_snd_buf.head
|
||||
#define rq_slen rq_snd_buf.len
|
||||
|
||||
#define XPRT_LAST_FRAG (1 << 0)
|
||||
#define XPRT_COPY_RECM (1 << 1)
|
||||
#define XPRT_COPY_XID (1 << 2)
|
||||
#define XPRT_COPY_DATA (1 << 3)
|
||||
struct rpc_xprt_ops {
|
||||
void (*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize);
|
||||
int (*reserve_xprt)(struct rpc_task *task);
|
||||
void (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
|
||||
void (*connect)(struct rpc_task *task);
|
||||
int (*send_request)(struct rpc_task *task);
|
||||
void (*set_retrans_timeout)(struct rpc_task *task);
|
||||
void (*timer)(struct rpc_task *task);
|
||||
void (*release_request)(struct rpc_task *task);
|
||||
void (*close)(struct rpc_xprt *xprt);
|
||||
void (*destroy)(struct rpc_xprt *xprt);
|
||||
};
|
||||
|
||||
struct rpc_xprt {
|
||||
struct rpc_xprt_ops * ops; /* transport methods */
|
||||
struct socket * sock; /* BSD socket layer */
|
||||
struct sock * inet; /* INET layer */
|
||||
|
||||
|
@ -137,11 +127,13 @@ struct rpc_xprt {
|
|||
unsigned long cong; /* current congestion */
|
||||
unsigned long cwnd; /* congestion window */
|
||||
|
||||
unsigned int rcvsize, /* socket receive buffer size */
|
||||
sndsize; /* socket send buffer size */
|
||||
size_t rcvsize, /* transport rcv buffer size */
|
||||
sndsize; /* transport send buffer size */
|
||||
|
||||
size_t max_payload; /* largest RPC payload size,
|
||||
in bytes */
|
||||
unsigned int tsh_size; /* size of transport specific
|
||||
header */
|
||||
|
||||
struct rpc_wait_queue sending; /* requests waiting to send */
|
||||
struct rpc_wait_queue resend; /* requests waiting to resend */
|
||||
|
@ -150,11 +142,9 @@ struct rpc_xprt {
|
|||
struct list_head free; /* free slots */
|
||||
struct rpc_rqst * slot; /* slot table storage */
|
||||
unsigned int max_reqs; /* total slots */
|
||||
unsigned long sockstate; /* Socket state */
|
||||
unsigned long state; /* transport state */
|
||||
unsigned char shutdown : 1, /* being shut down */
|
||||
nocong : 1, /* no congestion control */
|
||||
resvport : 1, /* use a reserved port */
|
||||
stream : 1; /* TCP */
|
||||
resvport : 1; /* use a reserved port */
|
||||
|
||||
/*
|
||||
* XID
|
||||
|
@ -171,22 +161,27 @@ struct rpc_xprt {
|
|||
unsigned long tcp_copied, /* copied to request */
|
||||
tcp_flags;
|
||||
/*
|
||||
* Connection of sockets
|
||||
* Connection of transports
|
||||
*/
|
||||
struct work_struct sock_connect;
|
||||
unsigned long connect_timeout,
|
||||
bind_timeout,
|
||||
reestablish_timeout;
|
||||
struct work_struct connect_worker;
|
||||
unsigned short port;
|
||||
|
||||
/*
|
||||
* Disconnection of idle sockets
|
||||
* Disconnection of idle transports
|
||||
*/
|
||||
struct work_struct task_cleanup;
|
||||
struct timer_list timer;
|
||||
unsigned long last_used;
|
||||
unsigned long last_used,
|
||||
idle_timeout;
|
||||
|
||||
/*
|
||||
* Send stuff
|
||||
*/
|
||||
spinlock_t sock_lock; /* lock socket info */
|
||||
spinlock_t xprt_lock; /* lock xprt info */
|
||||
spinlock_t transport_lock; /* lock transport info */
|
||||
spinlock_t reserve_lock; /* lock slot table */
|
||||
struct rpc_task * snd_task; /* Task blocked in send */
|
||||
|
||||
struct list_head recv;
|
||||
|
@ -195,37 +190,111 @@ struct rpc_xprt {
|
|||
void (*old_data_ready)(struct sock *, int);
|
||||
void (*old_state_change)(struct sock *);
|
||||
void (*old_write_space)(struct sock *);
|
||||
|
||||
wait_queue_head_t cong_wait;
|
||||
};
|
||||
|
||||
#define XPRT_LAST_FRAG (1 << 0)
|
||||
#define XPRT_COPY_RECM (1 << 1)
|
||||
#define XPRT_COPY_XID (1 << 2)
|
||||
#define XPRT_COPY_DATA (1 << 3)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
struct rpc_xprt * xprt_create_proto(int proto, struct sockaddr_in *addr,
|
||||
struct rpc_timeout *toparms);
|
||||
int xprt_destroy(struct rpc_xprt *);
|
||||
void xprt_set_timeout(struct rpc_timeout *, unsigned int,
|
||||
unsigned long);
|
||||
/*
|
||||
* Transport operations used by ULPs
|
||||
*/
|
||||
struct rpc_xprt * xprt_create_proto(int proto, struct sockaddr_in *addr, struct rpc_timeout *to);
|
||||
void xprt_set_timeout(struct rpc_timeout *to, unsigned int retr, unsigned long incr);
|
||||
|
||||
void xprt_reserve(struct rpc_task *);
|
||||
int xprt_prepare_transmit(struct rpc_task *);
|
||||
void xprt_transmit(struct rpc_task *);
|
||||
void xprt_receive(struct rpc_task *);
|
||||
/*
|
||||
* Generic internal transport functions
|
||||
*/
|
||||
void xprt_connect(struct rpc_task *task);
|
||||
void xprt_reserve(struct rpc_task *task);
|
||||
int xprt_reserve_xprt(struct rpc_task *task);
|
||||
int xprt_reserve_xprt_cong(struct rpc_task *task);
|
||||
int xprt_prepare_transmit(struct rpc_task *task);
|
||||
void xprt_transmit(struct rpc_task *task);
|
||||
void xprt_abort_transmit(struct rpc_task *task);
|
||||
int xprt_adjust_timeout(struct rpc_rqst *req);
|
||||
void xprt_release(struct rpc_task *);
|
||||
void xprt_connect(struct rpc_task *);
|
||||
void xprt_sock_setbufsize(struct rpc_xprt *);
|
||||
void xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
|
||||
void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
|
||||
void xprt_release(struct rpc_task *task);
|
||||
int xprt_destroy(struct rpc_xprt *xprt);
|
||||
|
||||
#define XPRT_LOCKED 0
|
||||
#define XPRT_CONNECT 1
|
||||
#define XPRT_CONNECTING 2
|
||||
static inline u32 *xprt_skip_transport_header(struct rpc_xprt *xprt, u32 *p)
|
||||
{
|
||||
return p + xprt->tsh_size;
|
||||
}
|
||||
|
||||
#define xprt_connected(xp) (test_bit(XPRT_CONNECT, &(xp)->sockstate))
|
||||
#define xprt_set_connected(xp) (set_bit(XPRT_CONNECT, &(xp)->sockstate))
|
||||
#define xprt_test_and_set_connected(xp) (test_and_set_bit(XPRT_CONNECT, &(xp)->sockstate))
|
||||
#define xprt_test_and_clear_connected(xp) \
|
||||
(test_and_clear_bit(XPRT_CONNECT, &(xp)->sockstate))
|
||||
#define xprt_clear_connected(xp) (clear_bit(XPRT_CONNECT, &(xp)->sockstate))
|
||||
/*
|
||||
* Transport switch helper functions
|
||||
*/
|
||||
void xprt_set_retrans_timeout_def(struct rpc_task *task);
|
||||
void xprt_set_retrans_timeout_rtt(struct rpc_task *task);
|
||||
void xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status);
|
||||
void xprt_wait_for_buffer_space(struct rpc_task *task);
|
||||
void xprt_write_space(struct rpc_xprt *xprt);
|
||||
void xprt_update_rtt(struct rpc_task *task);
|
||||
void xprt_adjust_cwnd(struct rpc_task *task, int result);
|
||||
struct rpc_rqst * xprt_lookup_rqst(struct rpc_xprt *xprt, u32 xid);
|
||||
void xprt_complete_rqst(struct rpc_task *task, int copied);
|
||||
void xprt_release_rqst_cong(struct rpc_task *task);
|
||||
void xprt_disconnect(struct rpc_xprt *xprt);
|
||||
|
||||
/*
|
||||
* Socket transport setup operations
|
||||
*/
|
||||
int xs_setup_udp(struct rpc_xprt *xprt, struct rpc_timeout *to);
|
||||
int xs_setup_tcp(struct rpc_xprt *xprt, struct rpc_timeout *to);
|
||||
|
||||
/*
|
||||
* Reserved bit positions in xprt->state
|
||||
*/
|
||||
#define XPRT_LOCKED (0)
|
||||
#define XPRT_CONNECTED (1)
|
||||
#define XPRT_CONNECTING (2)
|
||||
|
||||
static inline void xprt_set_connected(struct rpc_xprt *xprt)
|
||||
{
|
||||
set_bit(XPRT_CONNECTED, &xprt->state);
|
||||
}
|
||||
|
||||
static inline void xprt_clear_connected(struct rpc_xprt *xprt)
|
||||
{
|
||||
clear_bit(XPRT_CONNECTED, &xprt->state);
|
||||
}
|
||||
|
||||
static inline int xprt_connected(struct rpc_xprt *xprt)
|
||||
{
|
||||
return test_bit(XPRT_CONNECTED, &xprt->state);
|
||||
}
|
||||
|
||||
static inline int xprt_test_and_set_connected(struct rpc_xprt *xprt)
|
||||
{
|
||||
return test_and_set_bit(XPRT_CONNECTED, &xprt->state);
|
||||
}
|
||||
|
||||
static inline int xprt_test_and_clear_connected(struct rpc_xprt *xprt)
|
||||
{
|
||||
return test_and_clear_bit(XPRT_CONNECTED, &xprt->state);
|
||||
}
|
||||
|
||||
static inline void xprt_clear_connecting(struct rpc_xprt *xprt)
|
||||
{
|
||||
smp_mb__before_clear_bit();
|
||||
clear_bit(XPRT_CONNECTING, &xprt->state);
|
||||
smp_mb__after_clear_bit();
|
||||
}
|
||||
|
||||
static inline int xprt_connecting(struct rpc_xprt *xprt)
|
||||
{
|
||||
return test_bit(XPRT_CONNECTING, &xprt->state);
|
||||
}
|
||||
|
||||
static inline int xprt_test_and_set_connecting(struct rpc_xprt *xprt)
|
||||
{
|
||||
return test_and_set_bit(XPRT_CONNECTING, &xprt->state);
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__*/
|
||||
|
||||
|
|
|
@ -71,7 +71,12 @@ void restore_processor_state(void);
|
|||
struct saved_context;
|
||||
void __save_processor_state(struct saved_context *ctxt);
|
||||
void __restore_processor_state(struct saved_context *ctxt);
|
||||
extern unsigned long get_usable_page(unsigned gfp_mask);
|
||||
extern void free_eaten_memory(void);
|
||||
unsigned long get_safe_page(gfp_t gfp_mask);
|
||||
|
||||
/*
|
||||
* XXX: We try to keep some more pages free so that I/O operations succeed
|
||||
* without paging. Might this be more?
|
||||
*/
|
||||
#define PAGES_FOR_IO 512
|
||||
|
||||
#endif /* _LINUX_SWSUSP_H */
|
||||
|
|
|
@ -171,8 +171,8 @@ extern int rotate_reclaimable_page(struct page *page);
|
|||
extern void swap_setup(void);
|
||||
|
||||
/* linux/mm/vmscan.c */
|
||||
extern int try_to_free_pages(struct zone **, unsigned int);
|
||||
extern int zone_reclaim(struct zone *, unsigned int, unsigned int);
|
||||
extern int try_to_free_pages(struct zone **, gfp_t);
|
||||
extern int zone_reclaim(struct zone *, gfp_t, unsigned int);
|
||||
extern int shrink_all_memory(int);
|
||||
extern int vm_swappiness;
|
||||
|
||||
|
|
|
@ -491,6 +491,7 @@ asmlinkage long sys_nfsservctl(int cmd,
|
|||
asmlinkage long sys_syslog(int type, char __user *buf, int len);
|
||||
asmlinkage long sys_uselib(const char __user *library);
|
||||
asmlinkage long sys_ni_syscall(void);
|
||||
asmlinkage long sys_ptrace(long request, long pid, long addr, long data);
|
||||
|
||||
asmlinkage long sys_add_key(const char __user *_type,
|
||||
const char __user *_description,
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
struct ts_config;
|
||||
|
||||
|
@ -40,7 +41,7 @@ struct ts_state
|
|||
struct ts_ops
|
||||
{
|
||||
const char *name;
|
||||
struct ts_config * (*init)(const void *, unsigned int, int);
|
||||
struct ts_config * (*init)(const void *, unsigned int, gfp_t);
|
||||
unsigned int (*find)(struct ts_config *,
|
||||
struct ts_state *);
|
||||
void (*destroy)(struct ts_config *);
|
||||
|
@ -148,7 +149,7 @@ static inline unsigned int textsearch_get_pattern_len(struct ts_config *conf)
|
|||
extern int textsearch_register(struct ts_ops *);
|
||||
extern int textsearch_unregister(struct ts_ops *);
|
||||
extern struct ts_config *textsearch_prepare(const char *, const void *,
|
||||
unsigned int, int, int);
|
||||
unsigned int, gfp_t, int);
|
||||
extern void textsearch_destroy(struct ts_config *conf);
|
||||
extern unsigned int textsearch_find_continuous(struct ts_config *,
|
||||
struct ts_state *,
|
||||
|
|
|
@ -12,16 +12,12 @@ struct timer_list {
|
|||
struct list_head entry;
|
||||
unsigned long expires;
|
||||
|
||||
unsigned long magic;
|
||||
|
||||
void (*function)(unsigned long);
|
||||
unsigned long data;
|
||||
|
||||
struct timer_base_s *base;
|
||||
};
|
||||
|
||||
#define TIMER_MAGIC 0x4b87ad6e
|
||||
|
||||
extern struct timer_base_s __init_timer_base;
|
||||
|
||||
#define TIMER_INITIALIZER(_function, _expires, _data) { \
|
||||
|
@ -29,7 +25,6 @@ extern struct timer_base_s __init_timer_base;
|
|||
.expires = (_expires), \
|
||||
.data = (_data), \
|
||||
.base = &__init_timer_base, \
|
||||
.magic = TIMER_MAGIC, \
|
||||
}
|
||||
|
||||
#define DEFINE_TIMER(_name, _function, _expires, _data) \
|
||||
|
@ -38,6 +33,15 @@ extern struct timer_base_s __init_timer_base;
|
|||
|
||||
void fastcall init_timer(struct timer_list * timer);
|
||||
|
||||
static inline void setup_timer(struct timer_list * timer,
|
||||
void (*function)(unsigned long),
|
||||
unsigned long data)
|
||||
{
|
||||
timer->function = function;
|
||||
timer->data = data;
|
||||
init_timer(timer);
|
||||
}
|
||||
|
||||
/***
|
||||
* timer_pending - is a timer pending?
|
||||
* @timer: the timer in question
|
||||
|
@ -74,8 +78,9 @@ extern unsigned long next_timer_interrupt(void);
|
|||
* Timers with an ->expired field in the past will be executed in the next
|
||||
* timer tick.
|
||||
*/
|
||||
static inline void add_timer(struct timer_list * timer)
|
||||
static inline void add_timer(struct timer_list *timer)
|
||||
{
|
||||
BUG_ON(timer_pending(timer));
|
||||
__mod_timer(timer, timer->expires);
|
||||
}
|
||||
|
||||
|
|
|
@ -282,6 +282,13 @@ static inline int ntp_synced(void)
|
|||
return !(time_status & STA_UNSYNC);
|
||||
}
|
||||
|
||||
/* Required to safely shift negative values */
|
||||
#define shift_right(x, s) ({ \
|
||||
__typeof__(x) __x = (x); \
|
||||
__typeof__(s) __s = (s); \
|
||||
__x < 0 ? -(-__x >> __s) : __x >> __s; \
|
||||
})
|
||||
|
||||
|
||||
#ifdef CONFIG_TIME_INTERPOLATION
|
||||
|
||||
|
|
|
@ -151,7 +151,12 @@ typedef unsigned long sector_t;
|
|||
*/
|
||||
|
||||
#ifdef __CHECKER__
|
||||
#define __bitwise __attribute__((bitwise))
|
||||
#define __bitwise__ __attribute__((bitwise))
|
||||
#else
|
||||
#define __bitwise__
|
||||
#endif
|
||||
#ifdef __CHECK_ENDIAN__
|
||||
#define __bitwise __bitwise__
|
||||
#else
|
||||
#define __bitwise
|
||||
#endif
|
||||
|
@ -166,7 +171,7 @@ typedef __u64 __bitwise __be64;
|
|||
#endif
|
||||
|
||||
#ifdef __KERNEL__
|
||||
typedef unsigned __nocast gfp_t;
|
||||
typedef unsigned __bitwise__ gfp_t;
|
||||
#endif
|
||||
|
||||
struct ustat {
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue