From b3ff022cb8f46a65e686336e0ad7eb35aa49a035 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Thu, 13 Jul 2006 16:05:26 -0700 Subject: [PATCH] --- yaml --- r: 32683 b: refs/heads/master c: d8573e20d5d6974305599dde42b5dd7583310ccf h: refs/heads/master i: 32681: 0aeeeb5dd5a254b7f6388573697e1a8fbd4e8d8d 32679: df66419e57a8e0ff5e659fa6f129165bec505c87 v: v3 --- [refs] | 2 +- trunk/Documentation/DMA-mapping.txt | 8 +- .../accounting/delay-accounting.txt | 110 --- trunk/Documentation/accounting/getdelays.c | 396 ---------- trunk/Documentation/accounting/taskstats.txt | 181 ----- trunk/Documentation/kernel-parameters.txt | 2 - trunk/Documentation/memory-barriers.txt | 5 +- trunk/Documentation/ramdisk.txt | 12 +- trunk/MAINTAINERS | 16 - trunk/arch/i386/kernel/crash.c | 2 +- trunk/arch/i386/kernel/setup.c | 5 +- trunk/arch/i386/kernel/traps.c | 40 +- trunk/arch/i386/lib/usercopy.c | 2 + trunk/arch/sparc64/kernel/head.S | 13 +- trunk/arch/sparc64/kernel/time.c | 2 - trunk/arch/um/Makefile-x86_64 | 1 - trunk/arch/um/include/longjmp.h | 4 +- trunk/arch/um/include/os.h | 68 +- trunk/arch/um/kernel/vmlinux.lds.S | 2 + trunk/arch/um/os-Linux/process.c | 8 +- trunk/arch/um/os-Linux/skas/process.c | 16 +- trunk/arch/um/os-Linux/uaccess.c | 3 +- trunk/block/ioctl.c | 4 +- trunk/drivers/block/Kconfig | 10 - trunk/drivers/block/cpqarray.c | 2 + trunk/drivers/block/rd.c | 2 +- trunk/drivers/char/nsc_gpio.c | 6 +- trunk/drivers/char/pc8736x_gpio.c | 15 +- trunk/drivers/char/scx200_gpio.c | 72 +- trunk/drivers/char/tpm/tpm.c | 1 - trunk/drivers/char/tpm/tpm_tis.c | 77 +- trunk/drivers/infiniband/core/cm.c | 21 +- trunk/drivers/infiniband/core/cma.c | 22 +- trunk/drivers/infiniband/core/fmr_pool.c | 8 +- trunk/drivers/infiniband/core/sa_query.c | 10 +- trunk/drivers/infiniband/hw/mthca/mthca_av.c | 5 +- trunk/drivers/infiniband/hw/mthca/mthca_qp.c | 13 +- .../drivers/infiniband/ulp/iser/iser_verbs.c | 2 +- trunk/drivers/infiniband/ulp/srp/ib_srp.c | 3 +- trunk/drivers/leds/leds-net48xx.c | 7 +- trunk/drivers/rtc/Kconfig | 10 - trunk/drivers/rtc/Makefile | 1 - trunk/drivers/rtc/rtc-isl1208.c | 591 --------------- trunk/drivers/video/Kconfig | 20 - trunk/drivers/video/Makefile | 1 - trunk/drivers/video/mbx/Makefile | 4 - trunk/drivers/video/mbx/mbxdebugfs.c | 188 ----- trunk/drivers/video/mbx/mbxfb.c | 683 ------------------ trunk/drivers/video/mbx/reg_bits.h | 418 ----------- trunk/drivers/video/mbx/regs.h | 195 ----- trunk/fs/char_dev.c | 22 - trunk/fs/namei.c | 8 +- trunk/fs/proc/array.c | 6 +- trunk/fs/proc/base.c | 3 +- trunk/fs/reiserfs/procfs.c | 25 +- trunk/include/asm-alpha/barrier.h | 3 + trunk/include/asm-arm/system.h | 1 + trunk/include/asm-arm26/system.h | 1 + trunk/include/asm-cris/system.h | 1 + trunk/include/asm-frv/system.h | 1 + trunk/include/asm-generic/Kbuild.asm | 5 +- trunk/include/asm-h8300/system.h | 1 + trunk/include/asm-i386/system.h | 2 + trunk/include/asm-ia64/system.h | 3 +- trunk/include/asm-m32r/system.h | 1 + trunk/include/asm-m68k/system.h | 1 + trunk/include/asm-m68knommu/system.h | 1 + trunk/include/asm-mips/system.h | 3 + trunk/include/asm-parisc/system.h | 2 + trunk/include/asm-powerpc/system.h | 1 + trunk/include/asm-ppc/system.h | 1 + trunk/include/asm-s390/system.h | 1 + trunk/include/asm-sh/system.h | 1 + trunk/include/asm-sh64/system.h | 1 + trunk/include/asm-sparc/system.h | 1 + trunk/include/asm-sparc64/system.h | 2 + trunk/include/asm-v850/system.h | 1 + trunk/include/asm-x86_64/system.h | 1 + trunk/include/asm-xtensa/system.h | 1 + trunk/include/linux/delayacct.h | 119 --- trunk/include/linux/i2c-id.h | 1 - trunk/include/linux/if_vlan.h | 5 +- trunk/include/linux/kthread.h | 1 + trunk/include/linux/list.h | 11 - trunk/include/linux/module.h | 10 +- trunk/include/linux/namei.h | 2 +- trunk/include/linux/nsc_gpio.h | 2 + trunk/include/linux/sched.h | 56 +- trunk/include/linux/taskstats.h | 137 ---- trunk/include/linux/taskstats_kern.h | 89 --- trunk/include/linux/time.h | 12 - trunk/include/linux/vmalloc.h | 1 - trunk/include/net/genetlink.h | 20 - trunk/include/rdma/ib_addr.h | 10 +- trunk/include/rdma/ib_fmr_pool.h | 2 +- trunk/include/video/mbxfb.h | 28 - trunk/init/Kconfig | 24 - trunk/init/main.c | 4 - trunk/kernel/Makefile | 2 - trunk/kernel/acct.c | 4 +- trunk/kernel/delayacct.c | 178 ----- trunk/kernel/exit.c | 10 - trunk/kernel/fork.c | 6 - trunk/kernel/kallsyms.c | 4 +- trunk/kernel/kthread.c | 24 +- trunk/kernel/module.c | 11 +- trunk/kernel/rtmutex-tester.c | 1 - trunk/kernel/sched.c | 84 +-- trunk/kernel/softirq.c | 2 + trunk/kernel/taskstats.c | 568 --------------- trunk/kernel/timer.c | 20 +- trunk/lib/Kconfig.debug | 10 +- trunk/lib/idr.c | 16 +- trunk/mm/memory.c | 6 +- trunk/mm/nommu.c | 2 - trunk/mm/vmalloc.c | 7 +- trunk/net/core/skbuff.c | 91 +-- trunk/net/ipv4/ip_input.c | 3 - trunk/net/sched/sch_htb.c | 4 +- trunk/security/selinux/hooks.c | 14 +- 120 files changed, 381 insertions(+), 4610 deletions(-) delete mode 100644 trunk/Documentation/accounting/delay-accounting.txt delete mode 100644 trunk/Documentation/accounting/getdelays.c delete mode 100644 trunk/Documentation/accounting/taskstats.txt delete mode 100644 trunk/drivers/rtc/rtc-isl1208.c delete mode 100644 trunk/drivers/video/mbx/Makefile delete mode 100644 trunk/drivers/video/mbx/mbxdebugfs.c delete mode 100644 trunk/drivers/video/mbx/mbxfb.c delete mode 100644 trunk/drivers/video/mbx/reg_bits.h delete mode 100644 trunk/drivers/video/mbx/regs.h delete mode 100644 trunk/include/linux/delayacct.h delete mode 100644 trunk/include/linux/taskstats.h delete mode 100644 trunk/include/linux/taskstats_kern.h delete mode 100644 trunk/include/video/mbxfb.h delete mode 100644 trunk/kernel/delayacct.c delete mode 100644 trunk/kernel/taskstats.c diff --git a/[refs] b/[refs] index ac790f0b7c85..0b2b3cd75e05 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 76aba64a6608fcaa02c715e93c572192f3621195 +refs/heads/master: d8573e20d5d6974305599dde42b5dd7583310ccf diff --git a/trunk/Documentation/DMA-mapping.txt b/trunk/Documentation/DMA-mapping.txt index 63392c9132b4..7c717699032c 100644 --- a/trunk/Documentation/DMA-mapping.txt +++ b/trunk/Documentation/DMA-mapping.txt @@ -698,12 +698,12 @@ these interfaces. Remember that, as defined, consistent mappings are always going to be SAC addressable. The first thing your driver needs to do is query the PCI platform -layer if it is capable of handling your devices DAC addressing -capabilities: +layer with your devices DAC addressing capabilities: - int pci_dac_dma_supported(struct pci_dev *hwdev, u64 mask); + int pci_dac_set_dma_mask(struct pci_dev *pdev, u64 mask); -You may not use the following interfaces if this routine fails. +This routine behaves identically to pci_set_dma_mask. You may not +use the following interfaces if this routine fails. Next, DMA addresses using this API are kept track of using the dma64_addr_t type. It is guaranteed to be big enough to hold any diff --git a/trunk/Documentation/accounting/delay-accounting.txt b/trunk/Documentation/accounting/delay-accounting.txt deleted file mode 100644 index be215e58423b..000000000000 --- a/trunk/Documentation/accounting/delay-accounting.txt +++ /dev/null @@ -1,110 +0,0 @@ -Delay accounting ----------------- - -Tasks encounter delays in execution when they wait -for some kernel resource to become available e.g. a -runnable task may wait for a free CPU to run on. - -The per-task delay accounting functionality measures -the delays experienced by a task while - -a) waiting for a CPU (while being runnable) -b) completion of synchronous block I/O initiated by the task -c) swapping in pages - -and makes these statistics available to userspace through -the taskstats interface. - -Such delays provide feedback for setting a task's cpu priority, -io priority and rss limit values appropriately. Long delays for -important tasks could be a trigger for raising its corresponding priority. - -The functionality, through its use of the taskstats interface, also provides -delay statistics aggregated for all tasks (or threads) belonging to a -thread group (corresponding to a traditional Unix process). This is a commonly -needed aggregation that is more efficiently done by the kernel. - -Userspace utilities, particularly resource management applications, can also -aggregate delay statistics into arbitrary groups. To enable this, delay -statistics of a task are available both during its lifetime as well as on its -exit, ensuring continuous and complete monitoring can be done. - - -Interface ---------- - -Delay accounting uses the taskstats interface which is described -in detail in a separate document in this directory. Taskstats returns a -generic data structure to userspace corresponding to per-pid and per-tgid -statistics. The delay accounting functionality populates specific fields of -this structure. See - include/linux/taskstats.h -for a description of the fields pertaining to delay accounting. -It will generally be in the form of counters returning the cumulative -delay seen for cpu, sync block I/O, swapin etc. - -Taking the difference of two successive readings of a given -counter (say cpu_delay_total) for a task will give the delay -experienced by the task waiting for the corresponding resource -in that interval. - -When a task exits, records containing the per-task statistics -are sent to userspace without requiring a command. If it is the last exiting -task of a thread group, the per-tgid statistics are also sent. More details -are given in the taskstats interface description. - -The getdelays.c userspace utility in this directory allows simple commands to -be run and the corresponding delay statistics to be displayed. It also serves -as an example of using the taskstats interface. - -Usage ------ - -Compile the kernel with - CONFIG_TASK_DELAY_ACCT=y - CONFIG_TASKSTATS=y - -Enable the accounting at boot time by adding -the following to the kernel boot options - delayacct - -and after the system has booted up, use a utility -similar to getdelays.c to access the delays -seen by a given task or a task group (tgid). -The utility also allows a given command to be -executed and the corresponding delays to be -seen. - -General format of the getdelays command - -getdelays [-t tgid] [-p pid] [-c cmd...] - - -Get delays, since system boot, for pid 10 -# ./getdelays -p 10 -(output similar to next case) - -Get sum of delays, since system boot, for all pids with tgid 5 -# ./getdelays -t 5 - - -CPU count real total virtual total delay total - 7876 92005750 100000000 24001500 -IO count delay total - 0 0 -MEM count delay total - 0 0 - -Get delays seen in executing a given simple command -# ./getdelays -c ls / - -bin data1 data3 data5 dev home media opt root srv sys usr -boot data2 data4 data6 etc lib mnt proc sbin subdomain tmp var - - -CPU count real total virtual total delay total - 6 4000250 4000000 0 -IO count delay total - 0 0 -MEM count delay total - 0 0 diff --git a/trunk/Documentation/accounting/getdelays.c b/trunk/Documentation/accounting/getdelays.c deleted file mode 100644 index 795ca3911cc5..000000000000 --- a/trunk/Documentation/accounting/getdelays.c +++ /dev/null @@ -1,396 +0,0 @@ -/* getdelays.c - * - * Utility to get per-pid and per-tgid delay accounting statistics - * Also illustrates usage of the taskstats interface - * - * Copyright (C) Shailabh Nagar, IBM Corp. 2005 - * Copyright (C) Balbir Singh, IBM Corp. 2006 - * Copyright (c) Jay Lan, SGI. 2006 - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -/* - * Generic macros for dealing with netlink sockets. Might be duplicated - * elsewhere. It is recommended that commercial grade applications use - * libnl or libnetlink and use the interfaces provided by the library - */ -#define GENLMSG_DATA(glh) ((void *)(NLMSG_DATA(glh) + GENL_HDRLEN)) -#define GENLMSG_PAYLOAD(glh) (NLMSG_PAYLOAD(glh, 0) - GENL_HDRLEN) -#define NLA_DATA(na) ((void *)((char*)(na) + NLA_HDRLEN)) -#define NLA_PAYLOAD(len) (len - NLA_HDRLEN) - -#define err(code, fmt, arg...) do { printf(fmt, ##arg); exit(code); } while (0) -int done = 0; -int rcvbufsz=0; - - char name[100]; -int dbg=0, print_delays=0; -__u64 stime, utime; -#define PRINTF(fmt, arg...) { \ - if (dbg) { \ - printf(fmt, ##arg); \ - } \ - } - -/* Maximum size of response requested or message sent */ -#define MAX_MSG_SIZE 256 -/* Maximum number of cpus expected to be specified in a cpumask */ -#define MAX_CPUS 32 -/* Maximum length of pathname to log file */ -#define MAX_FILENAME 256 - -struct msgtemplate { - struct nlmsghdr n; - struct genlmsghdr g; - char buf[MAX_MSG_SIZE]; -}; - -char cpumask[100+6*MAX_CPUS]; - -/* - * Create a raw netlink socket and bind - */ -static int create_nl_socket(int protocol) -{ - int fd; - struct sockaddr_nl local; - - fd = socket(AF_NETLINK, SOCK_RAW, protocol); - if (fd < 0) - return -1; - - if (rcvbufsz) - if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, - &rcvbufsz, sizeof(rcvbufsz)) < 0) { - printf("Unable to set socket rcv buf size to %d\n", - rcvbufsz); - return -1; - } - - memset(&local, 0, sizeof(local)); - local.nl_family = AF_NETLINK; - - if (bind(fd, (struct sockaddr *) &local, sizeof(local)) < 0) - goto error; - - return fd; -error: - close(fd); - return -1; -} - - -int send_cmd(int sd, __u16 nlmsg_type, __u32 nlmsg_pid, - __u8 genl_cmd, __u16 nla_type, - void *nla_data, int nla_len) -{ - struct nlattr *na; - struct sockaddr_nl nladdr; - int r, buflen; - char *buf; - - struct msgtemplate msg; - - msg.n.nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN); - msg.n.nlmsg_type = nlmsg_type; - msg.n.nlmsg_flags = NLM_F_REQUEST; - msg.n.nlmsg_seq = 0; - msg.n.nlmsg_pid = nlmsg_pid; - msg.g.cmd = genl_cmd; - msg.g.version = 0x1; - na = (struct nlattr *) GENLMSG_DATA(&msg); - na->nla_type = nla_type; - na->nla_len = nla_len + 1 + NLA_HDRLEN; - memcpy(NLA_DATA(na), nla_data, nla_len); - msg.n.nlmsg_len += NLMSG_ALIGN(na->nla_len); - - buf = (char *) &msg; - buflen = msg.n.nlmsg_len ; - memset(&nladdr, 0, sizeof(nladdr)); - nladdr.nl_family = AF_NETLINK; - while ((r = sendto(sd, buf, buflen, 0, (struct sockaddr *) &nladdr, - sizeof(nladdr))) < buflen) { - if (r > 0) { - buf += r; - buflen -= r; - } else if (errno != EAGAIN) - return -1; - } - return 0; -} - - -/* - * Probe the controller in genetlink to find the family id - * for the TASKSTATS family - */ -int get_family_id(int sd) -{ - struct { - struct nlmsghdr n; - struct genlmsghdr g; - char buf[256]; - } ans; - - int id, rc; - struct nlattr *na; - int rep_len; - - strcpy(name, TASKSTATS_GENL_NAME); - rc = send_cmd(sd, GENL_ID_CTRL, getpid(), CTRL_CMD_GETFAMILY, - CTRL_ATTR_FAMILY_NAME, (void *)name, - strlen(TASKSTATS_GENL_NAME)+1); - - rep_len = recv(sd, &ans, sizeof(ans), 0); - if (ans.n.nlmsg_type == NLMSG_ERROR || - (rep_len < 0) || !NLMSG_OK((&ans.n), rep_len)) - return 0; - - na = (struct nlattr *) GENLMSG_DATA(&ans); - na = (struct nlattr *) ((char *) na + NLA_ALIGN(na->nla_len)); - if (na->nla_type == CTRL_ATTR_FAMILY_ID) { - id = *(__u16 *) NLA_DATA(na); - } - return id; -} - -void print_delayacct(struct taskstats *t) -{ - printf("\n\nCPU %15s%15s%15s%15s\n" - " %15llu%15llu%15llu%15llu\n" - "IO %15s%15s\n" - " %15llu%15llu\n" - "MEM %15s%15s\n" - " %15llu%15llu\n\n", - "count", "real total", "virtual total", "delay total", - t->cpu_count, t->cpu_run_real_total, t->cpu_run_virtual_total, - t->cpu_delay_total, - "count", "delay total", - t->blkio_count, t->blkio_delay_total, - "count", "delay total", t->swapin_count, t->swapin_delay_total); -} - -int main(int argc, char *argv[]) -{ - int c, rc, rep_len, aggr_len, len2, cmd_type; - __u16 id; - __u32 mypid; - - struct nlattr *na; - int nl_sd = -1; - int len = 0; - pid_t tid = 0; - pid_t rtid = 0; - - int fd = 0; - int count = 0; - int write_file = 0; - int maskset = 0; - char logfile[128]; - int loop = 0; - - struct msgtemplate msg; - - while (1) { - c = getopt(argc, argv, "dw:r:m:t:p:v:l"); - if (c < 0) - break; - - switch (c) { - case 'd': - printf("print delayacct stats ON\n"); - print_delays = 1; - break; - case 'w': - strncpy(logfile, optarg, MAX_FILENAME); - printf("write to file %s\n", logfile); - write_file = 1; - break; - case 'r': - rcvbufsz = atoi(optarg); - printf("receive buf size %d\n", rcvbufsz); - if (rcvbufsz < 0) - err(1, "Invalid rcv buf size\n"); - break; - case 'm': - strncpy(cpumask, optarg, sizeof(cpumask)); - maskset = 1; - printf("cpumask %s maskset %d\n", cpumask, maskset); - break; - case 't': - tid = atoi(optarg); - if (!tid) - err(1, "Invalid tgid\n"); - cmd_type = TASKSTATS_CMD_ATTR_TGID; - print_delays = 1; - break; - case 'p': - tid = atoi(optarg); - if (!tid) - err(1, "Invalid pid\n"); - cmd_type = TASKSTATS_CMD_ATTR_PID; - print_delays = 1; - break; - case 'v': - printf("debug on\n"); - dbg = 1; - break; - case 'l': - printf("listen forever\n"); - loop = 1; - break; - default: - printf("Unknown option %d\n", c); - exit(-1); - } - } - - if (write_file) { - fd = open(logfile, O_WRONLY | O_CREAT | O_TRUNC, - S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - if (fd == -1) { - perror("Cannot open output file\n"); - exit(1); - } - } - - if ((nl_sd = create_nl_socket(NETLINK_GENERIC)) < 0) - err(1, "error creating Netlink socket\n"); - - - mypid = getpid(); - id = get_family_id(nl_sd); - if (!id) { - printf("Error getting family id, errno %d", errno); - goto err; - } - PRINTF("family id %d\n", id); - - if (maskset) { - rc = send_cmd(nl_sd, id, mypid, TASKSTATS_CMD_GET, - TASKSTATS_CMD_ATTR_REGISTER_CPUMASK, - &cpumask, sizeof(cpumask)); - PRINTF("Sent register cpumask, retval %d\n", rc); - if (rc < 0) { - printf("error sending register cpumask\n"); - goto err; - } - } - - if (tid) { - rc = send_cmd(nl_sd, id, mypid, TASKSTATS_CMD_GET, - cmd_type, &tid, sizeof(__u32)); - PRINTF("Sent pid/tgid, retval %d\n", rc); - if (rc < 0) { - printf("error sending tid/tgid cmd\n"); - goto done; - } - } - - do { - int i; - - rep_len = recv(nl_sd, &msg, sizeof(msg), 0); - PRINTF("received %d bytes\n", rep_len); - - if (rep_len < 0) { - printf("nonfatal reply error: errno %d\n", errno); - continue; - } - if (msg.n.nlmsg_type == NLMSG_ERROR || - !NLMSG_OK((&msg.n), rep_len)) { - printf("fatal reply error, errno %d\n", errno); - goto done; - } - - PRINTF("nlmsghdr size=%d, nlmsg_len=%d, rep_len=%d\n", - sizeof(struct nlmsghdr), msg.n.nlmsg_len, rep_len); - - - rep_len = GENLMSG_PAYLOAD(&msg.n); - - na = (struct nlattr *) GENLMSG_DATA(&msg); - len = 0; - i = 0; - while (len < rep_len) { - len += NLA_ALIGN(na->nla_len); - switch (na->nla_type) { - case TASKSTATS_TYPE_AGGR_TGID: - /* Fall through */ - case TASKSTATS_TYPE_AGGR_PID: - aggr_len = NLA_PAYLOAD(na->nla_len); - len2 = 0; - /* For nested attributes, na follows */ - na = (struct nlattr *) NLA_DATA(na); - done = 0; - while (len2 < aggr_len) { - switch (na->nla_type) { - case TASKSTATS_TYPE_PID: - rtid = *(int *) NLA_DATA(na); - if (print_delays) - printf("PID\t%d\n", rtid); - break; - case TASKSTATS_TYPE_TGID: - rtid = *(int *) NLA_DATA(na); - if (print_delays) - printf("TGID\t%d\n", rtid); - break; - case TASKSTATS_TYPE_STATS: - count++; - if (print_delays) - print_delayacct((struct taskstats *) NLA_DATA(na)); - if (fd) { - if (write(fd, NLA_DATA(na), na->nla_len) < 0) { - err(1,"write error\n"); - } - } - if (!loop) - goto done; - break; - default: - printf("Unknown nested nla_type %d\n", na->nla_type); - break; - } - len2 += NLA_ALIGN(na->nla_len); - na = (struct nlattr *) ((char *) na + len2); - } - break; - - default: - printf("Unknown nla_type %d\n", na->nla_type); - break; - } - na = (struct nlattr *) (GENLMSG_DATA(&msg) + len); - } - } while (loop); -done: - if (maskset) { - rc = send_cmd(nl_sd, id, mypid, TASKSTATS_CMD_GET, - TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK, - &cpumask, sizeof(cpumask)); - printf("Sent deregister mask, retval %d\n", rc); - if (rc < 0) - err(rc, "error sending deregister cpumask\n"); - } -err: - close(nl_sd); - if (fd) - close(fd); - return 0; -} diff --git a/trunk/Documentation/accounting/taskstats.txt b/trunk/Documentation/accounting/taskstats.txt deleted file mode 100644 index 92ebf29e9041..000000000000 --- a/trunk/Documentation/accounting/taskstats.txt +++ /dev/null @@ -1,181 +0,0 @@ -Per-task statistics interface ------------------------------ - - -Taskstats is a netlink-based interface for sending per-task and -per-process statistics from the kernel to userspace. - -Taskstats was designed for the following benefits: - -- efficiently provide statistics during lifetime of a task and on its exit -- unified interface for multiple accounting subsystems -- extensibility for use by future accounting patches - -Terminology ------------ - -"pid", "tid" and "task" are used interchangeably and refer to the standard -Linux task defined by struct task_struct. per-pid stats are the same as -per-task stats. - -"tgid", "process" and "thread group" are used interchangeably and refer to the -tasks that share an mm_struct i.e. the traditional Unix process. Despite the -use of tgid, there is no special treatment for the task that is thread group -leader - a process is deemed alive as long as it has any task belonging to it. - -Usage ------ - -To get statistics during a task's lifetime, userspace opens a unicast netlink -socket (NETLINK_GENERIC family) and sends commands specifying a pid or a tgid. -The response contains statistics for a task (if pid is specified) or the sum of -statistics for all tasks of the process (if tgid is specified). - -To obtain statistics for tasks which are exiting, the userspace listener -sends a register command and specifies a cpumask. Whenever a task exits on -one of the cpus in the cpumask, its per-pid statistics are sent to the -registered listener. Using cpumasks allows the data received by one listener -to be limited and assists in flow control over the netlink interface and is -explained in more detail below. - -If the exiting task is the last thread exiting its thread group, -an additional record containing the per-tgid stats is also sent to userspace. -The latter contains the sum of per-pid stats for all threads in the thread -group, both past and present. - -getdelays.c is a simple utility demonstrating usage of the taskstats interface -for reporting delay accounting statistics. Users can register cpumasks, -send commands and process responses, listen for per-tid/tgid exit data, -write the data received to a file and do basic flow control by increasing -receive buffer sizes. - -Interface ---------- - -The user-kernel interface is encapsulated in include/linux/taskstats.h - -To avoid this documentation becoming obsolete as the interface evolves, only -an outline of the current version is given. taskstats.h always overrides the -description here. - -struct taskstats is the common accounting structure for both per-pid and -per-tgid data. It is versioned and can be extended by each accounting subsystem -that is added to the kernel. The fields and their semantics are defined in the -taskstats.h file. - -The data exchanged between user and kernel space is a netlink message belonging -to the NETLINK_GENERIC family and using the netlink attributes interface. -The messages are in the format - - +----------+- - -+-------------+-------------------+ - | nlmsghdr | Pad | genlmsghdr | taskstats payload | - +----------+- - -+-------------+-------------------+ - - -The taskstats payload is one of the following three kinds: - -1. Commands: Sent from user to kernel. Commands to get data on -a pid/tgid consist of one attribute, of type TASKSTATS_CMD_ATTR_PID/TGID, -containing a u32 pid or tgid in the attribute payload. The pid/tgid denotes -the task/process for which userspace wants statistics. - -Commands to register/deregister interest in exit data from a set of cpus -consist of one attribute, of type -TASKSTATS_CMD_ATTR_REGISTER/DEREGISTER_CPUMASK and contain a cpumask in the -attribute payload. The cpumask is specified as an ascii string of -comma-separated cpu ranges e.g. to listen to exit data from cpus 1,2,3,5,7,8 -the cpumask would be "1-3,5,7-8". If userspace forgets to deregister interest -in cpus before closing the listening socket, the kernel cleans up its interest -set over time. However, for the sake of efficiency, an explicit deregistration -is advisable. - -2. Response for a command: sent from the kernel in response to a userspace -command. The payload is a series of three attributes of type: - -a) TASKSTATS_TYPE_AGGR_PID/TGID : attribute containing no payload but indicates -a pid/tgid will be followed by some stats. - -b) TASKSTATS_TYPE_PID/TGID: attribute whose payload is the pid/tgid whose stats -is being returned. - -c) TASKSTATS_TYPE_STATS: attribute with a struct taskstsats as payload. The -same structure is used for both per-pid and per-tgid stats. - -3. New message sent by kernel whenever a task exits. The payload consists of a - series of attributes of the following type: - -a) TASKSTATS_TYPE_AGGR_PID: indicates next two attributes will be pid+stats -b) TASKSTATS_TYPE_PID: contains exiting task's pid -c) TASKSTATS_TYPE_STATS: contains the exiting task's per-pid stats -d) TASKSTATS_TYPE_AGGR_TGID: indicates next two attributes will be tgid+stats -e) TASKSTATS_TYPE_TGID: contains tgid of process to which task belongs -f) TASKSTATS_TYPE_STATS: contains the per-tgid stats for exiting task's process - - -per-tgid stats --------------- - -Taskstats provides per-process stats, in addition to per-task stats, since -resource management is often done at a process granularity and aggregating task -stats in userspace alone is inefficient and potentially inaccurate (due to lack -of atomicity). - -However, maintaining per-process, in addition to per-task stats, within the -kernel has space and time overheads. To address this, the taskstats code -accumalates each exiting task's statistics into a process-wide data structure. -When the last task of a process exits, the process level data accumalated also -gets sent to userspace (along with the per-task data). - -When a user queries to get per-tgid data, the sum of all other live threads in -the group is added up and added to the accumalated total for previously exited -threads of the same thread group. - -Extending taskstats -------------------- - -There are two ways to extend the taskstats interface to export more -per-task/process stats as patches to collect them get added to the kernel -in future: - -1. Adding more fields to the end of the existing struct taskstats. Backward - compatibility is ensured by the version number within the - structure. Userspace will use only the fields of the struct that correspond - to the version its using. - -2. Defining separate statistic structs and using the netlink attributes - interface to return them. Since userspace processes each netlink attribute - independently, it can always ignore attributes whose type it does not - understand (because it is using an older version of the interface). - - -Choosing between 1. and 2. is a matter of trading off flexibility and -overhead. If only a few fields need to be added, then 1. is the preferable -path since the kernel and userspace don't need to incur the overhead of -processing new netlink attributes. But if the new fields expand the existing -struct too much, requiring disparate userspace accounting utilities to -unnecessarily receive large structures whose fields are of no interest, then -extending the attributes structure would be worthwhile. - -Flow control for taskstats --------------------------- - -When the rate of task exits becomes large, a listener may not be able to keep -up with the kernel's rate of sending per-tid/tgid exit data leading to data -loss. This possibility gets compounded when the taskstats structure gets -extended and the number of cpus grows large. - -To avoid losing statistics, userspace should do one or more of the following: - -- increase the receive buffer sizes for the netlink sockets opened by -listeners to receive exit data. - -- create more listeners and reduce the number of cpus being listened to by -each listener. In the extreme case, there could be one listener for each cpu. -Users may also consider setting the cpu affinity of the listener to the subset -of cpus to which it listens, especially if they are listening to just one cpu. - -Despite these measures, if the userspace receives ENOBUFS error messages -indicated overflow of receive buffers, it should take measures to handle the -loss of data. - ----- diff --git a/trunk/Documentation/kernel-parameters.txt b/trunk/Documentation/kernel-parameters.txt index e11f7728ec6f..149f62ba14a5 100644 --- a/trunk/Documentation/kernel-parameters.txt +++ b/trunk/Documentation/kernel-parameters.txt @@ -448,8 +448,6 @@ running once the system is up. Format: [,] See also Documentation/networking/decnet.txt. - delayacct [KNL] Enable per-task delay accounting - dhash_entries= [KNL] Set number of hash buckets for dentry cache. diff --git a/trunk/Documentation/memory-barriers.txt b/trunk/Documentation/memory-barriers.txt index 46b9b389df35..28d1bc3edb1c 100644 --- a/trunk/Documentation/memory-barriers.txt +++ b/trunk/Documentation/memory-barriers.txt @@ -1015,9 +1015,10 @@ CPU from reordering them. There are some more advanced barrier functions: (*) set_mb(var, value) + (*) set_wmb(var, value) - This assigns the value to the variable and then inserts at least a write - barrier after it, depending on the function. It isn't guaranteed to + These assign the value to the variable and then insert at least a write + barrier after it, depending on the function. They aren't guaranteed to insert anything more than a compiler barrier in a UP compilation. diff --git a/trunk/Documentation/ramdisk.txt b/trunk/Documentation/ramdisk.txt index 52f75b7d51c2..7c25584e082c 100644 --- a/trunk/Documentation/ramdisk.txt +++ b/trunk/Documentation/ramdisk.txt @@ -6,7 +6,7 @@ Contents: 1) Overview 2) Kernel Command Line Parameters 3) Using "rdev -r" - 4) An Example of Creating a Compressed RAM Disk + 4) An Example of Creating a Compressed RAM Disk 1) Overview @@ -34,7 +34,7 @@ make it clearer. The original "ramdisk=" has been kept around for compatibility reasons, but it may be removed in the future. The new RAM disk also has the ability to load compressed RAM disk images, -allowing one to squeeze more programs onto an average installation or +allowing one to squeeze more programs onto an average installation or rescue floppy disk. @@ -51,7 +51,7 @@ default is 4096 (4 MB) (8192 (8 MB) on S390). =================== This parameter tells the RAM disk driver how many bytes to use per block. The -default is 1024 (BLOCK_SIZE). +default is 512. 3) Using "rdev -r" @@ -70,7 +70,7 @@ These numbers are no magical secrets, as seen below: ./arch/i386/kernel/setup.c:#define RAMDISK_PROMPT_FLAG 0x8000 ./arch/i386/kernel/setup.c:#define RAMDISK_LOAD_FLAG 0x4000 -Consider a typical two floppy disk setup, where you will have the +Consider a typical two floppy disk setup, where you will have the kernel on disk one, and have already put a RAM disk image onto disk #2. Hence you want to set bits 0 to 13 as 0, meaning that your RAM disk @@ -97,12 +97,12 @@ Since the default start = 0 and the default prompt = 1, you could use: append = "load_ramdisk=1" -4) An Example of Creating a Compressed RAM Disk +4) An Example of Creating a Compressed RAM Disk ---------------------------------------------- To create a RAM disk image, you will need a spare block device to construct it on. This can be the RAM disk device itself, or an -unused disk partition (such as an unmounted swap partition). For this +unused disk partition (such as an unmounted swap partition). For this example, we will use the RAM disk device, "/dev/ram0". Note: This technique should not be done on a machine with less than 8 MB diff --git a/trunk/MAINTAINERS b/trunk/MAINTAINERS index e99028ca2f7c..a3462c3414cd 100644 --- a/trunk/MAINTAINERS +++ b/trunk/MAINTAINERS @@ -771,7 +771,6 @@ M: aliakc@web.de P: Jamie Lenehan M: lenehan@twibble.org W: http://twibble.org/dist/dc395x/ -L: dc395x@twibble.org L: http://lists.twibble.org/mailman/listinfo/dc395x/ S: Maintained @@ -1502,7 +1501,6 @@ P: Yi Zhu M: yi.zhu@intel.com P: James Ketrenos M: jketreno@linux.intel.com -L: ipw2100-devel@lists.sourceforge.net L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel W: http://ipw2100.sourceforge.net S: Supported @@ -1512,7 +1510,6 @@ P: Yi Zhu M: yi.zhu@intel.com P: James Ketrenos M: jketreno@linux.intel.com -L: ipw2100-devel@lists.sourceforge.net L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel W: http://ipw2200.sourceforge.net S: Supported @@ -2229,7 +2226,6 @@ S: Maintained PCMCIA SUBSYSTEM P: Linux PCMCIA Team -L: linux-pcmcia@lists.infradead.org L: http://lists.infradead.org/mailman/listinfo/linux-pcmcia T: git kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git S: Maintained @@ -2240,12 +2236,6 @@ M: tsbogend@alpha.franken.de L: netdev@vger.kernel.org S: Maintained -PER-TASK DELAY ACCOUNTING -P: Shailabh Nagar -M: nagar@watson.ibm.com -L: linux-kernel@vger.kernel.org -S: Maintained - PERSONALITY HANDLING P: Christoph Hellwig M: hch@infradead.org @@ -2773,12 +2763,6 @@ P: Deepak Saxena M: dsaxena@plexity.net S: Maintained -TASKSTATS STATISTICS INTERFACE -P: Shailabh Nagar -M: nagar@watson.ibm.com -L: linux-kernel@vger.kernel.org -S: Maintained - TI PARALLEL LINK CABLE DRIVER P: Romain Lievin M: roms@lpg.ticalc.org diff --git a/trunk/arch/i386/kernel/crash.c b/trunk/arch/i386/kernel/crash.c index 5b96f038367f..48f0f62f781c 100644 --- a/trunk/arch/i386/kernel/crash.c +++ b/trunk/arch/i386/kernel/crash.c @@ -90,7 +90,7 @@ static void crash_save_self(struct pt_regs *regs) crash_save_this_cpu(regs, cpu); } -#if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC) +#ifdef CONFIG_SMP static atomic_t waiting_for_crash_ipi; static int crash_nmi_callback(struct pt_regs *regs, int cpu) diff --git a/trunk/arch/i386/kernel/setup.c b/trunk/arch/i386/kernel/setup.c index f1682206d304..7864395c1441 100644 --- a/trunk/arch/i386/kernel/setup.c +++ b/trunk/arch/i386/kernel/setup.c @@ -1327,10 +1327,7 @@ legacy_init_iomem_resources(struct resource *code_resource, struct resource *dat res->start = e820.map[i].addr; res->end = res->start + e820.map[i].size - 1; res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; - if (request_resource(&iomem_resource, res)) { - kfree(res); - continue; - } + request_resource(&iomem_resource, res); if (e820.map[i].type == E820_RAM) { /* * We don't know which RAM region contains kernel data, diff --git a/trunk/arch/i386/kernel/traps.c b/trunk/arch/i386/kernel/traps.c index 313ac1f7dc5a..5cfd4f42eeba 100644 --- a/trunk/arch/i386/kernel/traps.c +++ b/trunk/arch/i386/kernel/traps.c @@ -324,35 +324,35 @@ void show_registers(struct pt_regs *regs) static void handle_BUG(struct pt_regs *regs) { - unsigned long eip = regs->eip; unsigned short ud2; + unsigned short line; + char *file; + char c; + unsigned long eip; + + eip = regs->eip; if (eip < PAGE_OFFSET) - return; + goto no_bug; if (__get_user(ud2, (unsigned short __user *)eip)) - return; + goto no_bug; if (ud2 != 0x0b0f) - return; + goto no_bug; + if (__get_user(line, (unsigned short __user *)(eip + 2))) + goto bug; + if (__get_user(file, (char * __user *)(eip + 4)) || + (unsigned long)file < PAGE_OFFSET || __get_user(c, file)) + file = ""; printk(KERN_EMERG "------------[ cut here ]------------\n"); + printk(KERN_EMERG "kernel BUG at %s:%d!\n", file, line); -#ifdef CONFIG_DEBUG_BUGVERBOSE - do { - unsigned short line; - char *file; - char c; - - if (__get_user(line, (unsigned short __user *)(eip + 2))) - break; - if (__get_user(file, (char * __user *)(eip + 4)) || - (unsigned long)file < PAGE_OFFSET || __get_user(c, file)) - file = ""; +no_bug: + return; - printk(KERN_EMERG "kernel BUG at %s:%d!\n", file, line); - return; - } while (0); -#endif - printk(KERN_EMERG "Kernel BUG at [verbose debug info unavailable]\n"); + /* Here we know it was a BUG but file-n-line is unavailable */ +bug: + printk(KERN_EMERG "Kernel BUG\n"); } /* This is gone through when something in the kernel diff --git a/trunk/arch/i386/lib/usercopy.c b/trunk/arch/i386/lib/usercopy.c index efc7e7d5f4d0..4b75212ab6dd 100644 --- a/trunk/arch/i386/lib/usercopy.c +++ b/trunk/arch/i386/lib/usercopy.c @@ -843,6 +843,7 @@ unsigned long __copy_from_user_ll_nocache_nozero(void *to, const void __user *fr unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) { + might_sleep(); BUG_ON((long) n < 0); if (access_ok(VERIFY_WRITE, to, n)) n = __copy_to_user(to, from, n); @@ -869,6 +870,7 @@ EXPORT_SYMBOL(copy_to_user); unsigned long copy_from_user(void *to, const void __user *from, unsigned long n) { + might_sleep(); BUG_ON((long) n < 0); if (access_ok(VERIFY_READ, from, n)) n = __copy_from_user(to, from, n); diff --git a/trunk/arch/sparc64/kernel/head.S b/trunk/arch/sparc64/kernel/head.S index 75684b56767e..c8e9dc9d68a9 100644 --- a/trunk/arch/sparc64/kernel/head.S +++ b/trunk/arch/sparc64/kernel/head.S @@ -551,9 +551,10 @@ setup_trap_table: save %sp, -192, %sp /* Force interrupts to be disabled. */ - rdpr %pstate, %o1 - andn %o1, PSTATE_IE, %o1 + rdpr %pstate, %l0 + andn %l0, PSTATE_IE, %o1 wrpr %o1, 0x0, %pstate + rdpr %pil, %l1 wrpr %g0, 15, %pil /* Make the firmware call to jump over to the Linux trap table. */ @@ -622,11 +623,9 @@ setup_trap_table: call init_irqwork_curcpu nop - /* Now we can turn interrupts back on. */ - rdpr %pstate, %o1 - or %o1, PSTATE_IE, %o1 - wrpr %o1, 0, %pstate - wrpr %g0, 0x0, %pil + /* Now we can restore interrupt state. */ + wrpr %l0, 0, %pstate + wrpr %l1, 0x0, %pil ret restore diff --git a/trunk/arch/sparc64/kernel/time.c b/trunk/arch/sparc64/kernel/time.c index b43de647ba73..094d3e35be18 100644 --- a/trunk/arch/sparc64/kernel/time.c +++ b/trunk/arch/sparc64/kernel/time.c @@ -928,8 +928,6 @@ static void sparc64_start_timers(void) __asm__ __volatile__("wrpr %0, 0x0, %%pstate" : /* no outputs */ : "r" (pstate)); - - local_irq_enable(); } struct freq_table { diff --git a/trunk/arch/um/Makefile-x86_64 b/trunk/arch/um/Makefile-x86_64 index 9558a7cf34d5..dffd1184c956 100644 --- a/trunk/arch/um/Makefile-x86_64 +++ b/trunk/arch/um/Makefile-x86_64 @@ -11,7 +11,6 @@ USER_CFLAGS += -fno-builtin -m64 CHECKFLAGS += -m64 AFLAGS += -m64 LDFLAGS += -m elf_x86_64 -CPPFLAGS += -m64 ELF_ARCH := i386:x86-64 ELF_FORMAT := elf64-x86-64 diff --git a/trunk/arch/um/include/longjmp.h b/trunk/arch/um/include/longjmp.h index 1b5c0131a12e..8e7053013f7b 100644 --- a/trunk/arch/um/include/longjmp.h +++ b/trunk/arch/um/include/longjmp.h @@ -8,8 +8,8 @@ longjmp(*buf, val); \ } while(0) -#define UML_SETJMP(buf) ({ \ - int n, enable; \ +#define UML_SETJMP(buf, enable) ({ \ + int n; \ enable = get_signals(); \ n = setjmp(*buf); \ if(n != 0) \ diff --git a/trunk/arch/um/include/os.h b/trunk/arch/um/include/os.h index 5316e8a4a4fd..b6c52496e15a 100644 --- a/trunk/arch/um/include/os.h +++ b/trunk/arch/um/include/os.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) * Licensed under the GPL */ @@ -15,9 +15,9 @@ #include "irq_user.h" #include "sysdep/tls.h" -#define OS_TYPE_FILE 1 -#define OS_TYPE_DIR 2 -#define OS_TYPE_SYMLINK 3 +#define OS_TYPE_FILE 1 +#define OS_TYPE_DIR 2 +#define OS_TYPE_SYMLINK 3 #define OS_TYPE_CHARDEV 4 #define OS_TYPE_BLOCKDEV 5 #define OS_TYPE_FIFO 6 @@ -61,68 +61,68 @@ struct openflags { }; #define OPENFLAGS() ((struct openflags) { .r = 0, .w = 0, .s = 0, .c = 0, \ - .t = 0, .a = 0, .e = 0, .cl = 0 }) + .t = 0, .a = 0, .e = 0, .cl = 0 }) static inline struct openflags of_read(struct openflags flags) { - flags.r = 1; - return flags; + flags.r = 1; + return(flags); } static inline struct openflags of_write(struct openflags flags) { - flags.w = 1; - return flags; + flags.w = 1; + return(flags); } static inline struct openflags of_rdwr(struct openflags flags) { - return of_read(of_write(flags)); + return(of_read(of_write(flags))); } static inline struct openflags of_set_rw(struct openflags flags, int r, int w) { flags.r = r; flags.w = w; - return flags; + return(flags); } static inline struct openflags of_sync(struct openflags flags) -{ - flags.s = 1; - return flags; +{ + flags.s = 1; + return(flags); } static inline struct openflags of_create(struct openflags flags) -{ - flags.c = 1; - return flags; +{ + flags.c = 1; + return(flags); } - + static inline struct openflags of_trunc(struct openflags flags) -{ - flags.t = 1; - return flags; +{ + flags.t = 1; + return(flags); } - + static inline struct openflags of_append(struct openflags flags) -{ - flags.a = 1; - return flags; +{ + flags.a = 1; + return(flags); } - + static inline struct openflags of_excl(struct openflags flags) -{ - flags.e = 1; - return flags; +{ + flags.e = 1; + return(flags); } static inline struct openflags of_cloexec(struct openflags flags) -{ - flags.cl = 1; - return flags; +{ + flags.cl = 1; + return(flags); } - + /* file.c */ extern int os_stat_file(const char *file_name, struct uml_stat *buf); extern int os_stat_fd(const int fd, struct uml_stat *buf); @@ -204,7 +204,7 @@ extern int run_kernel_thread(int (*fn)(void *), void *arg, void **jmp_ptr); extern int os_map_memory(void *virt, int fd, unsigned long long off, unsigned long len, int r, int w, int x); -extern int os_protect_memory(void *addr, unsigned long len, +extern int os_protect_memory(void *addr, unsigned long len, int r, int w, int x); extern int os_unmap_memory(void *addr, int len); extern int os_drop_memory(void *addr, int length); diff --git a/trunk/arch/um/kernel/vmlinux.lds.S b/trunk/arch/um/kernel/vmlinux.lds.S index f8aeb448aab6..72acdce205e0 100644 --- a/trunk/arch/um/kernel/vmlinux.lds.S +++ b/trunk/arch/um/kernel/vmlinux.lds.S @@ -1,3 +1,5 @@ +/* in case the preprocessor is a 32bit one */ +#undef i386 #ifdef CONFIG_LD_SCRIPT_STATIC #include "uml.lds.S" #else diff --git a/trunk/arch/um/os-Linux/process.c b/trunk/arch/um/os-Linux/process.c index b98d3ca2cd1b..b1cda818f5b5 100644 --- a/trunk/arch/um/os-Linux/process.c +++ b/trunk/arch/um/os-Linux/process.c @@ -273,12 +273,12 @@ void init_new_thread_signals(void) int run_kernel_thread(int (*fn)(void *), void *arg, void **jmp_ptr) { jmp_buf buf; - int n; + int n, enable; *jmp_ptr = &buf; - n = UML_SETJMP(&buf); + n = UML_SETJMP(&buf, enable); if(n != 0) - return n; + return(n); (*fn)(arg); - return 0; + return(0); } diff --git a/trunk/arch/um/os-Linux/skas/process.c b/trunk/arch/um/os-Linux/skas/process.c index 7baf90fda58b..bf35572d9cfa 100644 --- a/trunk/arch/um/os-Linux/skas/process.c +++ b/trunk/arch/um/os-Linux/skas/process.c @@ -435,6 +435,7 @@ void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr, { unsigned long flags; jmp_buf switch_buf, fork_buf; + int enable; *switch_buf_ptr = &switch_buf; *fork_buf_ptr = &fork_buf; @@ -449,7 +450,7 @@ void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr, */ flags = get_signals(); block_signals(); - if(UML_SETJMP(&fork_buf) == 0) + if(UML_SETJMP(&fork_buf, enable) == 0) new_thread_proc(stack, handler); remove_sigstack(); @@ -466,19 +467,21 @@ void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr, void thread_wait(void *sw, void *fb) { jmp_buf buf, **switch_buf = sw, *fork_buf; + int enable; *switch_buf = &buf; fork_buf = fb; - if(UML_SETJMP(&buf) == 0) + if(UML_SETJMP(&buf, enable) == 0) siglongjmp(*fork_buf, INIT_JMP_REMOVE_SIGSTACK); } void switch_threads(void *me, void *next) { jmp_buf my_buf, **me_ptr = me, *next_buf = next; + int enable; *me_ptr = &my_buf; - if(UML_SETJMP(&my_buf) == 0) + if(UML_SETJMP(&my_buf, enable) == 0) UML_LONGJMP(next_buf, 1); } @@ -492,14 +495,14 @@ static jmp_buf *cb_back; int start_idle_thread(void *stack, void *switch_buf_ptr, void **fork_buf_ptr) { jmp_buf **switch_buf = switch_buf_ptr; - int n; + int n, enable; set_handler(SIGWINCH, (__sighandler_t) sig_handler, SA_ONSTACK | SA_RESTART, SIGUSR1, SIGIO, SIGALRM, SIGVTALRM, -1); *fork_buf_ptr = &initial_jmpbuf; - n = UML_SETJMP(&initial_jmpbuf); + n = UML_SETJMP(&initial_jmpbuf, enable); switch(n){ case INIT_JMP_NEW_THREAD: new_thread_proc((void *) stack, new_thread_handler); @@ -526,13 +529,14 @@ int start_idle_thread(void *stack, void *switch_buf_ptr, void **fork_buf_ptr) void initial_thread_cb_skas(void (*proc)(void *), void *arg) { jmp_buf here; + int enable; cb_proc = proc; cb_arg = arg; cb_back = &here; block_signals(); - if(UML_SETJMP(&here) == 0) + if(UML_SETJMP(&here, enable) == 0) UML_LONGJMP(&initial_jmpbuf, INIT_JMP_CALLBACK); unblock_signals(); diff --git a/trunk/arch/um/os-Linux/uaccess.c b/trunk/arch/um/os-Linux/uaccess.c index 865f6a6a2590..e523719330b2 100644 --- a/trunk/arch/um/os-Linux/uaccess.c +++ b/trunk/arch/um/os-Linux/uaccess.c @@ -14,10 +14,11 @@ unsigned long __do_user_copy(void *to, const void *from, int n, int n), int *faulted_out) { unsigned long *faddrp = (unsigned long *) fault_addr, ret; + int enable; jmp_buf jbuf; *fault_catcher = &jbuf; - if(UML_SETJMP(&jbuf) == 0){ + if(UML_SETJMP(&jbuf, enable) == 0){ (*op)(to, from, n); ret = 0; *faulted_out = 0; diff --git a/trunk/block/ioctl.c b/trunk/block/ioctl.c index 309760b7e37f..9cfa2e1ecb24 100644 --- a/trunk/block/ioctl.c +++ b/trunk/block/ioctl.c @@ -72,7 +72,7 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user bdevp = bdget_disk(disk, part); if (!bdevp) return -ENOMEM; - mutex_lock_nested(&bdevp->bd_mutex, BD_MUTEX_PARTITION); + mutex_lock(&bdevp->bd_mutex); if (bdevp->bd_openers) { mutex_unlock(&bdevp->bd_mutex); bdput(bdevp); @@ -82,7 +82,7 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user fsync_bdev(bdevp); invalidate_bdev(bdevp, 0); - mutex_lock_nested(&bdev->bd_mutex, BD_MUTEX_WHOLE); + mutex_lock(&bdev->bd_mutex); delete_partition(disk, part); mutex_unlock(&bdev->bd_mutex); mutex_unlock(&bdevp->bd_mutex); diff --git a/trunk/drivers/block/Kconfig b/trunk/drivers/block/Kconfig index b5382cedf0c0..93d94749310b 100644 --- a/trunk/drivers/block/Kconfig +++ b/trunk/drivers/block/Kconfig @@ -400,16 +400,6 @@ config BLK_DEV_RAM_SIZE what are you doing. If you are using IBM S/390, then set this to 8192. -config BLK_DEV_RAM_BLOCKSIZE - int "Default RAM disk block size (bytes)" - depends on BLK_DEV_RAM - default "1024" - help - The default value is 1024 kilobytes. PAGE_SIZE is a much more - efficient choice however. The default is kept to ensure initrd - setups function - apparently needed by the rd_load_image routine - that supposes the filesystem in the image uses a 1024 blocksize. - config BLK_DEV_INITRD bool "Initial RAM filesystem and RAM disk (initramfs/initrd) support" depends on BROKEN || !FRV diff --git a/trunk/drivers/block/cpqarray.c b/trunk/drivers/block/cpqarray.c index 78082edc14b4..757f42dd8e86 100644 --- a/trunk/drivers/block/cpqarray.c +++ b/trunk/drivers/block/cpqarray.c @@ -1739,6 +1739,8 @@ static void getgeometry(int ctlr) (log_index < id_ctlr_buf->nr_drvs) && (log_unit < NWD); log_unit++) { + struct gendisk *disk = ida_gendisk[ctlr][log_unit]; + size = sizeof(sense_log_drv_stat_t); /* diff --git a/trunk/drivers/block/rd.c b/trunk/drivers/block/rd.c index a3f64bfe6b58..3cf246abb5ec 100644 --- a/trunk/drivers/block/rd.c +++ b/trunk/drivers/block/rd.c @@ -84,7 +84,7 @@ int rd_size = CONFIG_BLK_DEV_RAM_SIZE; /* Size of the RAM disks */ * behaviour. The default is still BLOCK_SIZE (needed by rd_load_image that * supposes the filesystem in the image uses a BLOCK_SIZE blocksize). */ -static int rd_blocksize = CONFIG_BLK_DEV_RAM_BLOCKSIZE; +static int rd_blocksize = BLOCK_SIZE; /* blocksize of the RAM disks */ /* * Copyright (C) 2000 Linus Torvalds. diff --git a/trunk/drivers/char/nsc_gpio.c b/trunk/drivers/char/nsc_gpio.c index 7719bd75810b..5b91e4e25641 100644 --- a/trunk/drivers/char/nsc_gpio.c +++ b/trunk/drivers/char/nsc_gpio.c @@ -68,11 +68,13 @@ ssize_t nsc_gpio_write(struct file *file, const char __user *data, amp->gpio_config(m, ~1, 0); break; case 'T': - dev_dbg(dev, "GPIO%d output is push pull\n", m); + dev_dbg(dev, "GPIO%d output is push pull\n", + m); amp->gpio_config(m, ~2, 2); break; case 't': - dev_dbg(dev, "GPIO%d output is open drain\n", m); + dev_dbg(dev, "GPIO%d output is open drain\n", + m); amp->gpio_config(m, ~2, 0); break; case 'P': diff --git a/trunk/drivers/char/pc8736x_gpio.c b/trunk/drivers/char/pc8736x_gpio.c index 645eb81cb5a9..11bd78c80628 100644 --- a/trunk/drivers/char/pc8736x_gpio.c +++ b/trunk/drivers/char/pc8736x_gpio.c @@ -212,21 +212,22 @@ static void pc8736x_gpio_change(unsigned index) pc8736x_gpio_set(index, !pc8736x_gpio_current(index)); } -static struct nsc_gpio_ops pc8736x_gpio_ops = { +static struct nsc_gpio_ops pc8736x_access = { .owner = THIS_MODULE, .gpio_config = pc8736x_gpio_configure, .gpio_dump = nsc_gpio_dump, .gpio_get = pc8736x_gpio_get, .gpio_set = pc8736x_gpio_set, + .gpio_set_high = pc8736x_gpio_set_high, + .gpio_set_low = pc8736x_gpio_set_low, .gpio_change = pc8736x_gpio_change, .gpio_current = pc8736x_gpio_current }; -EXPORT_SYMBOL(pc8736x_gpio_ops); static int pc8736x_gpio_open(struct inode *inode, struct file *file) { unsigned m = iminor(inode); - file->private_data = &pc8736x_gpio_ops; + file->private_data = &pc8736x_access; dev_dbg(&pdev->dev, "open %d\n", m); @@ -235,7 +236,7 @@ static int pc8736x_gpio_open(struct inode *inode, struct file *file) return nonseekable_open(inode, file); } -static const struct file_operations pc8736x_gpio_fileops = { +static const struct file_operations pc8736x_gpio_fops = { .owner = THIS_MODULE, .open = pc8736x_gpio_open, .write = nsc_gpio_write, @@ -277,7 +278,7 @@ static int __init pc8736x_gpio_init(void) dev_err(&pdev->dev, "no device found\n"); goto undo_platform_dev_add; } - pc8736x_gpio_ops.dev = &pdev->dev; + pc8736x_access.dev = &pdev->dev; /* Verify that chip and it's GPIO unit are both enabled. My BIOS does this, so I take minimum action here @@ -327,7 +328,7 @@ static int __init pc8736x_gpio_init(void) pc8736x_init_shadow(); /* ignore minor errs, and succeed */ - cdev_init(&pc8736x_gpio_cdev, &pc8736x_gpio_fileops); + cdev_init(&pc8736x_gpio_cdev, &pc8736x_gpio_fops); cdev_add(&pc8736x_gpio_cdev, devid, PC8736X_GPIO_CT); return 0; @@ -354,5 +355,7 @@ static void __exit pc8736x_gpio_cleanup(void) platform_device_put(pdev); } +EXPORT_SYMBOL(pc8736x_access); + module_init(pc8736x_gpio_init); module_exit(pc8736x_gpio_cleanup); diff --git a/trunk/drivers/char/scx200_gpio.c b/trunk/drivers/char/scx200_gpio.c index b956c7babd18..425c58719db6 100644 --- a/trunk/drivers/char/scx200_gpio.c +++ b/trunk/drivers/char/scx200_gpio.c @@ -5,6 +5,7 @@ Copyright (c) 2001,2002 Christer Weinigel */ +#include #include #include #include @@ -21,37 +22,37 @@ #include #include -#define DRVNAME "scx200_gpio" +#define NAME "scx200_gpio" +#define DEVNAME NAME static struct platform_device *pdev; MODULE_AUTHOR("Christer Weinigel "); -MODULE_DESCRIPTION("NatSemi/AMD SCx200 GPIO Pin Driver"); +MODULE_DESCRIPTION("NatSemi SCx200 GPIO Pin Driver"); MODULE_LICENSE("GPL"); static int major = 0; /* default to dynamic major */ module_param(major, int, 0); MODULE_PARM_DESC(major, "Major device number"); -#define MAX_PINS 32 /* 64 later, when known ok */ - -struct nsc_gpio_ops scx200_gpio_ops = { +struct nsc_gpio_ops scx200_access = { .owner = THIS_MODULE, .gpio_config = scx200_gpio_configure, .gpio_dump = nsc_gpio_dump, .gpio_get = scx200_gpio_get, .gpio_set = scx200_gpio_set, + .gpio_set_high = scx200_gpio_set_high, + .gpio_set_low = scx200_gpio_set_low, .gpio_change = scx200_gpio_change, .gpio_current = scx200_gpio_current }; -EXPORT_SYMBOL(scx200_gpio_ops); static int scx200_gpio_open(struct inode *inode, struct file *file) { unsigned m = iminor(inode); - file->private_data = &scx200_gpio_ops; + file->private_data = &scx200_access; - if (m >= MAX_PINS) + if (m > 63) return -EINVAL; return nonseekable_open(inode, file); } @@ -61,7 +62,8 @@ static int scx200_gpio_release(struct inode *inode, struct file *file) return 0; } -static const struct file_operations scx200_gpio_fileops = { + +static const struct file_operations scx200_gpio_fops = { .owner = THIS_MODULE, .write = nsc_gpio_write, .read = nsc_gpio_read, @@ -69,20 +71,21 @@ static const struct file_operations scx200_gpio_fileops = { .release = scx200_gpio_release, }; -struct cdev scx200_gpio_cdev; /* use 1 cdev for all pins */ +struct cdev *scx200_devices; +static int num_pins = 32; static int __init scx200_gpio_init(void) { - int rc; - dev_t devid; + int rc, i; + dev_t dev = MKDEV(major, 0); if (!scx200_gpio_present()) { - printk(KERN_ERR DRVNAME ": no SCx200 gpio present\n"); + printk(KERN_ERR NAME ": no SCx200 gpio present\n"); return -ENODEV; } /* support dev_dbg() with pdev->dev */ - pdev = platform_device_alloc(DRVNAME, 0); + pdev = platform_device_alloc(DEVNAME, 0); if (!pdev) return -ENOMEM; @@ -91,25 +94,37 @@ static int __init scx200_gpio_init(void) goto undo_malloc; /* nsc_gpio uses dev_dbg(), so needs this */ - scx200_gpio_ops.dev = &pdev->dev; - - if (major) { - devid = MKDEV(major, 0); - rc = register_chrdev_region(devid, MAX_PINS, "scx200_gpio"); - } else { - rc = alloc_chrdev_region(&devid, 0, MAX_PINS, "scx200_gpio"); - major = MAJOR(devid); + scx200_access.dev = &pdev->dev; + + if (major) + rc = register_chrdev_region(dev, num_pins, "scx200_gpio"); + else { + rc = alloc_chrdev_region(&dev, 0, num_pins, "scx200_gpio"); + major = MAJOR(dev); } if (rc < 0) { dev_err(&pdev->dev, "SCx200 chrdev_region err: %d\n", rc); goto undo_platform_device_add; } - - cdev_init(&scx200_gpio_cdev, &scx200_gpio_fileops); - cdev_add(&scx200_gpio_cdev, devid, MAX_PINS); + scx200_devices = kzalloc(num_pins * sizeof(struct cdev), GFP_KERNEL); + if (!scx200_devices) { + rc = -ENOMEM; + goto undo_chrdev_region; + } + for (i = 0; i < num_pins; i++) { + struct cdev *cdev = &scx200_devices[i]; + cdev_init(cdev, &scx200_gpio_fops); + cdev->owner = THIS_MODULE; + rc = cdev_add(cdev, MKDEV(major, i), 1); + /* tolerate 'minor' errors */ + if (rc) + dev_err(&pdev->dev, "Error %d on minor %d", rc, i); + } return 0; /* succeed */ +undo_chrdev_region: + unregister_chrdev_region(dev, num_pins); undo_platform_device_add: platform_device_del(pdev); undo_malloc: @@ -120,11 +135,10 @@ static int __init scx200_gpio_init(void) static void __exit scx200_gpio_cleanup(void) { - cdev_del(&scx200_gpio_cdev); - /* cdev_put(&scx200_gpio_cdev); */ - - unregister_chrdev_region(MKDEV(major, 0), MAX_PINS); + kfree(scx200_devices); + unregister_chrdev_region(MKDEV(major, 0), num_pins); platform_device_unregister(pdev); + /* kfree(pdev); */ } module_init(scx200_gpio_init); diff --git a/trunk/drivers/char/tpm/tpm.c b/trunk/drivers/char/tpm/tpm.c index a082a2e34252..6889e7db3aff 100644 --- a/trunk/drivers/char/tpm/tpm.c +++ b/trunk/drivers/char/tpm/tpm.c @@ -1141,7 +1141,6 @@ struct tpm_chip *tpm_register_hardware(struct device *dev, const struct tpm_vend put_device(dev); clear_bit(chip->dev_num, dev_mask); kfree(chip); - kfree(devname); return NULL; } diff --git a/trunk/drivers/char/tpm/tpm_tis.c b/trunk/drivers/char/tpm/tpm_tis.c index ee7ac6f43c65..3232b1932597 100644 --- a/trunk/drivers/char/tpm/tpm_tis.c +++ b/trunk/drivers/char/tpm/tpm_tis.c @@ -424,7 +424,6 @@ static irqreturn_t tis_int_handler(int irq, void *dev_id, struct pt_regs *regs) iowrite32(interrupt, chip->vendor.iobase + TPM_INT_STATUS(chip->vendor.locality)); - ioread32(chip->vendor.iobase + TPM_INT_STATUS(chip->vendor.locality)); return IRQ_HANDLED; } @@ -432,19 +431,23 @@ static int interrupts = 1; module_param(interrupts, bool, 0444); MODULE_PARM_DESC(interrupts, "Enable interrupts"); -static int tpm_tis_init(struct device *dev, resource_size_t start, - resource_size_t len) +static int __devinit tpm_tis_pnp_init(struct pnp_dev *pnp_dev, + const struct pnp_device_id *pnp_id) { u32 vendor, intfcaps, intmask; int rc, i; + unsigned long start, len; struct tpm_chip *chip; + start = pnp_mem_start(pnp_dev, 0); + len = pnp_mem_len(pnp_dev, 0); + if (!start) start = TIS_MEM_BASE; if (!len) len = TIS_MEM_LEN; - if (!(chip = tpm_register_hardware(dev, &tpm_tis))) + if (!(chip = tpm_register_hardware(&pnp_dev->dev, &tpm_tis))) return -ENODEV; chip->vendor.iobase = ioremap(start, len); @@ -461,7 +464,7 @@ static int tpm_tis_init(struct device *dev, resource_size_t start, chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT); chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT); - dev_info(dev, + dev_info(&pnp_dev->dev, "1.2 TPM (device-id 0x%X, rev-id %d)\n", vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0))); @@ -469,26 +472,26 @@ static int tpm_tis_init(struct device *dev, resource_size_t start, intfcaps = ioread32(chip->vendor.iobase + TPM_INTF_CAPS(chip->vendor.locality)); - dev_dbg(dev, "TPM interface capabilities (0x%x):\n", + dev_dbg(&pnp_dev->dev, "TPM interface capabilities (0x%x):\n", intfcaps); if (intfcaps & TPM_INTF_BURST_COUNT_STATIC) - dev_dbg(dev, "\tBurst Count Static\n"); + dev_dbg(&pnp_dev->dev, "\tBurst Count Static\n"); if (intfcaps & TPM_INTF_CMD_READY_INT) - dev_dbg(dev, "\tCommand Ready Int Support\n"); + dev_dbg(&pnp_dev->dev, "\tCommand Ready Int Support\n"); if (intfcaps & TPM_INTF_INT_EDGE_FALLING) - dev_dbg(dev, "\tInterrupt Edge Falling\n"); + dev_dbg(&pnp_dev->dev, "\tInterrupt Edge Falling\n"); if (intfcaps & TPM_INTF_INT_EDGE_RISING) - dev_dbg(dev, "\tInterrupt Edge Rising\n"); + dev_dbg(&pnp_dev->dev, "\tInterrupt Edge Rising\n"); if (intfcaps & TPM_INTF_INT_LEVEL_LOW) - dev_dbg(dev, "\tInterrupt Level Low\n"); + dev_dbg(&pnp_dev->dev, "\tInterrupt Level Low\n"); if (intfcaps & TPM_INTF_INT_LEVEL_HIGH) - dev_dbg(dev, "\tInterrupt Level High\n"); + dev_dbg(&pnp_dev->dev, "\tInterrupt Level High\n"); if (intfcaps & TPM_INTF_LOCALITY_CHANGE_INT) - dev_dbg(dev, "\tLocality Change Int Support\n"); + dev_dbg(&pnp_dev->dev, "\tLocality Change Int Support\n"); if (intfcaps & TPM_INTF_STS_VALID_INT) - dev_dbg(dev, "\tSts Valid Int Support\n"); + dev_dbg(&pnp_dev->dev, "\tSts Valid Int Support\n"); if (intfcaps & TPM_INTF_DATA_AVAIL_INT) - dev_dbg(dev, "\tData Avail Int Support\n"); + dev_dbg(&pnp_dev->dev, "\tData Avail Int Support\n"); if (request_locality(chip, 0) != 0) { rc = -ENODEV; @@ -591,16 +594,6 @@ static int tpm_tis_init(struct device *dev, resource_size_t start, return rc; } -static int __devinit tpm_tis_pnp_init(struct pnp_dev *pnp_dev, - const struct pnp_device_id *pnp_id) -{ - resource_size_t start, len; - start = pnp_mem_start(pnp_dev, 0); - len = pnp_mem_len(pnp_dev, 0); - - return tpm_tis_init(&pnp_dev->dev, start, len); -} - static int tpm_tis_pnp_suspend(struct pnp_dev *dev, pm_message_t msg) { return tpm_pm_suspend(&dev->dev, msg); @@ -635,36 +628,8 @@ module_param_string(hid, tpm_pnp_tbl[TIS_HID_USR_IDX].id, sizeof(tpm_pnp_tbl[TIS_HID_USR_IDX].id), 0444); MODULE_PARM_DESC(hid, "Set additional specific HID for this driver to probe"); -static struct device_driver tis_drv = { - .name = "tpm_tis", - .bus = &platform_bus_type, - .owner = THIS_MODULE, - .suspend = tpm_pm_suspend, - .resume = tpm_pm_resume, -}; - -static struct platform_device *pdev; - -static int force; -module_param(force, bool, 0444); -MODULE_PARM_DESC(force, "Force device probe rather than using ACPI entry"); static int __init init_tis(void) { - int rc; - - if (force) { - rc = driver_register(&tis_drv); - if (rc < 0) - return rc; - if (IS_ERR(pdev=platform_device_register_simple("tpm_tis", -1, NULL, 0))) - return PTR_ERR(pdev); - if((rc=tpm_tis_init(&pdev->dev, 0, 0)) != 0) { - platform_device_unregister(pdev); - driver_unregister(&tis_drv); - } - return rc; - } - return pnp_register_driver(&tis_pnp_driver); } @@ -689,11 +654,7 @@ static void __exit cleanup_tis(void) tpm_remove_hardware(chip->dev); } spin_unlock(&tis_lock); - if (force) { - platform_device_unregister(pdev); - driver_unregister(&tis_drv); - } else - pnp_unregister_driver(&tis_pnp_driver); + pnp_unregister_driver(&tis_pnp_driver); } module_init(init_tis); diff --git a/trunk/drivers/infiniband/core/cm.c b/trunk/drivers/infiniband/core/cm.c index f85c97f7500a..3f6705f3083a 100644 --- a/trunk/drivers/infiniband/core/cm.c +++ b/trunk/drivers/infiniband/core/cm.c @@ -701,7 +701,7 @@ static void cm_reset_to_idle(struct cm_id_private *cm_id_priv) } } -static void cm_destroy_id(struct ib_cm_id *cm_id, int err) +void ib_destroy_cm_id(struct ib_cm_id *cm_id) { struct cm_id_private *cm_id_priv; struct cm_work *work; @@ -735,22 +735,12 @@ static void cm_destroy_id(struct ib_cm_id *cm_id, int err) sizeof cm_id_priv->av.port->cm_dev->ca_guid, NULL, 0); break; - case IB_CM_REQ_RCVD: - if (err == -ENOMEM) { - /* Do not reject to allow future retries. */ - cm_reset_to_idle(cm_id_priv); - spin_unlock_irqrestore(&cm_id_priv->lock, flags); - } else { - spin_unlock_irqrestore(&cm_id_priv->lock, flags); - ib_send_cm_rej(cm_id, IB_CM_REJ_CONSUMER_DEFINED, - NULL, 0, NULL, 0); - } - break; case IB_CM_MRA_REQ_RCVD: case IB_CM_REP_SENT: case IB_CM_MRA_REP_RCVD: ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg); /* Fall through */ + case IB_CM_REQ_RCVD: case IB_CM_MRA_REQ_SENT: case IB_CM_REP_RCVD: case IB_CM_MRA_REP_SENT: @@ -785,11 +775,6 @@ static void cm_destroy_id(struct ib_cm_id *cm_id, int err) kfree(cm_id_priv->private_data); kfree(cm_id_priv); } - -void ib_destroy_cm_id(struct ib_cm_id *cm_id) -{ - cm_destroy_id(cm_id, 0); -} EXPORT_SYMBOL(ib_destroy_cm_id); int ib_cm_listen(struct ib_cm_id *cm_id, __be64 service_id, __be64 service_mask, @@ -1178,7 +1163,7 @@ static void cm_process_work(struct cm_id_private *cm_id_priv, } cm_deref_id(cm_id_priv); if (ret) - cm_destroy_id(&cm_id_priv->id, ret); + ib_destroy_cm_id(&cm_id_priv->id); } static void cm_format_mra(struct cm_mra_msg *mra_msg, diff --git a/trunk/drivers/infiniband/core/cma.c b/trunk/drivers/infiniband/core/cma.c index d6f99d5720fc..863f64befc7c 100644 --- a/trunk/drivers/infiniband/core/cma.c +++ b/trunk/drivers/infiniband/core/cma.c @@ -262,14 +262,14 @@ static void cma_detach_from_dev(struct rdma_id_private *id_priv) static int cma_acquire_ib_dev(struct rdma_id_private *id_priv) { struct cma_device *cma_dev; - union ib_gid gid; + union ib_gid *gid; int ret = -ENODEV; - ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid), + gid = ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr); mutex_lock(&lock); list_for_each_entry(cma_dev, &dev_list, list) { - ret = ib_find_cached_gid(cma_dev->device, &gid, + ret = ib_find_cached_gid(cma_dev->device, gid, &id_priv->id.port_num, NULL); if (!ret) { cma_attach_to_dev(id_priv, cma_dev); @@ -812,7 +812,6 @@ static int cma_ib_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) cma_modify_qp_err(&id_priv->id); status = ib_event->param.rej_rcvd.reason; event = RDMA_CM_EVENT_REJECTED; - private_data_len = IB_CM_REJ_PRIVATE_DATA_SIZE; break; default: printk(KERN_ERR "RDMA CMA: unexpected IB CM event: %d", @@ -1135,8 +1134,8 @@ static int cma_query_ib_route(struct rdma_id_private *id_priv, int timeout_ms, struct ib_sa_path_rec path_rec; memset(&path_rec, 0, sizeof path_rec); - ib_addr_get_sgid(addr, &path_rec.sgid); - ib_addr_get_dgid(addr, &path_rec.dgid); + path_rec.sgid = *ib_addr_get_sgid(addr); + path_rec.dgid = *ib_addr_get_dgid(addr); path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(addr)); path_rec.numb_path = 1; @@ -1264,7 +1263,7 @@ static int cma_bind_loopback(struct rdma_id_private *id_priv) { struct cma_device *cma_dev; struct ib_port_attr port_attr; - union ib_gid gid; + union ib_gid *gid; u16 pkey; int ret; u8 p; @@ -1285,7 +1284,8 @@ static int cma_bind_loopback(struct rdma_id_private *id_priv) } port_found: - ret = ib_get_cached_gid(cma_dev->device, p, 0, &gid); + gid = ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr); + ret = ib_get_cached_gid(cma_dev->device, p, 0, gid); if (ret) goto out; @@ -1293,7 +1293,6 @@ static int cma_bind_loopback(struct rdma_id_private *id_priv) if (ret) goto out; - ib_addr_set_sgid(&id_priv->id.route.addr.dev_addr, &gid); ib_addr_set_pkey(&id_priv->id.route.addr.dev_addr, pkey); id_priv->id.port_num = p; cma_attach_to_dev(id_priv, cma_dev); @@ -1340,7 +1339,6 @@ static int cma_resolve_loopback(struct rdma_id_private *id_priv) { struct cma_work *work; struct sockaddr_in *src_in, *dst_in; - union ib_gid gid; int ret; work = kzalloc(sizeof *work, GFP_KERNEL); @@ -1353,8 +1351,8 @@ static int cma_resolve_loopback(struct rdma_id_private *id_priv) goto err; } - ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid); - ib_addr_set_dgid(&id_priv->id.route.addr.dev_addr, &gid); + ib_addr_set_dgid(&id_priv->id.route.addr.dev_addr, + ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr)); if (cma_zero_addr(&id_priv->id.route.addr.src_addr)) { src_in = (struct sockaddr_in *)&id_priv->id.route.addr.src_addr; diff --git a/trunk/drivers/infiniband/core/fmr_pool.c b/trunk/drivers/infiniband/core/fmr_pool.c index 86a3b2d401db..615fe9cc6c56 100644 --- a/trunk/drivers/infiniband/core/fmr_pool.c +++ b/trunk/drivers/infiniband/core/fmr_pool.c @@ -426,7 +426,7 @@ EXPORT_SYMBOL(ib_flush_fmr_pool); struct ib_pool_fmr *ib_fmr_pool_map_phys(struct ib_fmr_pool *pool_handle, u64 *page_list, int list_len, - u64 io_virtual_address) + u64 *io_virtual_address) { struct ib_fmr_pool *pool = pool_handle; struct ib_pool_fmr *fmr; @@ -440,7 +440,7 @@ struct ib_pool_fmr *ib_fmr_pool_map_phys(struct ib_fmr_pool *pool_handle, fmr = ib_fmr_cache_lookup(pool, page_list, list_len, - io_virtual_address); + *io_virtual_address); if (fmr) { /* found in cache */ ++fmr->ref_count; @@ -464,7 +464,7 @@ struct ib_pool_fmr *ib_fmr_pool_map_phys(struct ib_fmr_pool *pool_handle, spin_unlock_irqrestore(&pool->pool_lock, flags); result = ib_map_phys_fmr(fmr->fmr, page_list, list_len, - io_virtual_address); + *io_virtual_address); if (result) { spin_lock_irqsave(&pool->pool_lock, flags); @@ -481,7 +481,7 @@ struct ib_pool_fmr *ib_fmr_pool_map_phys(struct ib_fmr_pool *pool_handle, fmr->ref_count = 1; if (pool->cache_bucket) { - fmr->io_virtual_address = io_virtual_address; + fmr->io_virtual_address = *io_virtual_address; fmr->page_list_len = list_len; memcpy(fmr->page_list, page_list, list_len * sizeof(*page_list)); diff --git a/trunk/drivers/infiniband/core/sa_query.c b/trunk/drivers/infiniband/core/sa_query.c index aeda484ffd82..e911c99ff843 100644 --- a/trunk/drivers/infiniband/core/sa_query.c +++ b/trunk/drivers/infiniband/core/sa_query.c @@ -488,13 +488,13 @@ static void init_mad(struct ib_sa_mad *mad, struct ib_mad_agent *agent) spin_unlock_irqrestore(&tid_lock, flags); } -static int send_mad(struct ib_sa_query *query, int timeout_ms, gfp_t gfp_mask) +static int send_mad(struct ib_sa_query *query, int timeout_ms) { unsigned long flags; int ret, id; retry: - if (!idr_pre_get(&query_idr, gfp_mask)) + if (!idr_pre_get(&query_idr, GFP_ATOMIC)) return -ENOMEM; spin_lock_irqsave(&idr_lock, flags); ret = idr_get_new(&query_idr, query, &id); @@ -630,7 +630,7 @@ int ib_sa_path_rec_get(struct ib_device *device, u8 port_num, *sa_query = &query->sa_query; - ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); + ret = send_mad(&query->sa_query, timeout_ms); if (ret < 0) goto err2; @@ -752,7 +752,7 @@ int ib_sa_service_rec_query(struct ib_device *device, u8 port_num, u8 method, *sa_query = &query->sa_query; - ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); + ret = send_mad(&query->sa_query, timeout_ms); if (ret < 0) goto err2; @@ -844,7 +844,7 @@ int ib_sa_mcmember_rec_query(struct ib_device *device, u8 port_num, *sa_query = &query->sa_query; - ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); + ret = send_mad(&query->sa_query, timeout_ms); if (ret < 0) goto err2; diff --git a/trunk/drivers/infiniband/hw/mthca/mthca_av.c b/trunk/drivers/infiniband/hw/mthca/mthca_av.c index e215041b2db9..b12aa03be251 100644 --- a/trunk/drivers/infiniband/hw/mthca/mthca_av.c +++ b/trunk/drivers/infiniband/hw/mthca/mthca_av.c @@ -303,10 +303,9 @@ int mthca_ah_query(struct ib_ah *ibah, struct ib_ah_attr *attr) memset(attr, 0, sizeof *attr); attr->dlid = be16_to_cpu(ah->av->dlid); attr->sl = be32_to_cpu(ah->av->sl_tclass_flowlabel) >> 28; - attr->port_num = be32_to_cpu(ah->av->port_pd) >> 24; - attr->static_rate = mthca_rate_to_ib(dev, ah->av->msg_sr & 0x7, - attr->port_num); + attr->static_rate = ah->av->msg_sr & 0x7; attr->src_path_bits = ah->av->g_slid & 0x7F; + attr->port_num = be32_to_cpu(ah->av->port_pd) >> 24; attr->ah_flags = mthca_ah_grh_present(ah) ? IB_AH_GRH : 0; if (attr->ah_flags) { diff --git a/trunk/drivers/infiniband/hw/mthca/mthca_qp.c b/trunk/drivers/infiniband/hw/mthca/mthca_qp.c index cd8b6721ac9c..490fc783bb0c 100644 --- a/trunk/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/trunk/drivers/infiniband/hw/mthca/mthca_qp.c @@ -222,8 +222,9 @@ static void *get_send_wqe(struct mthca_qp *qp, int n) (PAGE_SIZE - 1)); } -static void mthca_wq_reset(struct mthca_wq *wq) +static void mthca_wq_init(struct mthca_wq *wq) { + /* mthca_alloc_qp_common() initializes the locks */ wq->next_ind = 0; wq->last_comp = wq->max - 1; wq->head = 0; @@ -844,10 +845,10 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask) mthca_cq_clean(dev, to_mcq(qp->ibqp.recv_cq), qp->qpn, qp->ibqp.srq ? to_msrq(qp->ibqp.srq) : NULL); - mthca_wq_reset(&qp->sq); + mthca_wq_init(&qp->sq); qp->sq.last = get_send_wqe(qp, qp->sq.max - 1); - mthca_wq_reset(&qp->rq); + mthca_wq_init(&qp->rq); qp->rq.last = get_recv_wqe(qp, qp->rq.max - 1); if (mthca_is_memfree(dev)) { @@ -1111,9 +1112,9 @@ static int mthca_alloc_qp_common(struct mthca_dev *dev, qp->atomic_rd_en = 0; qp->resp_depth = 0; qp->sq_policy = send_policy; - mthca_wq_reset(&qp->sq); - mthca_wq_reset(&qp->rq); - + mthca_wq_init(&qp->sq); + mthca_wq_init(&qp->rq); + /* these are initialized separately so lockdep can tell them apart */ spin_lock_init(&qp->sq.lock); spin_lock_init(&qp->rq.lock); diff --git a/trunk/drivers/infiniband/ulp/iser/iser_verbs.c b/trunk/drivers/infiniband/ulp/iser/iser_verbs.c index 72febf1f8ff8..ff117bbf81b4 100644 --- a/trunk/drivers/infiniband/ulp/iser/iser_verbs.c +++ b/trunk/drivers/infiniband/ulp/iser/iser_verbs.c @@ -594,7 +594,7 @@ int iser_reg_page_vec(struct iser_conn *ib_conn, mem = ib_fmr_pool_map_phys(ib_conn->fmr_pool, page_list, page_vec->length, - io_addr); + &io_addr); if (IS_ERR(mem)) { status = (int)PTR_ERR(mem); diff --git a/trunk/drivers/infiniband/ulp/srp/ib_srp.c b/trunk/drivers/infiniband/ulp/srp/ib_srp.c index 8f472e7113b4..4e22afef7206 100644 --- a/trunk/drivers/infiniband/ulp/srp/ib_srp.c +++ b/trunk/drivers/infiniband/ulp/srp/ib_srp.c @@ -615,10 +615,9 @@ static int srp_map_fmr(struct srp_device *dev, struct scatterlist *scat, (sg_dma_address(&scat[i]) & dev->fmr_page_mask) + j; req->fmr = ib_fmr_pool_map_phys(dev->fmr_pool, - dma_pages, page_cnt, io_addr); + dma_pages, page_cnt, &io_addr); if (IS_ERR(req->fmr)) { ret = PTR_ERR(req->fmr); - req->fmr = NULL; goto out; } diff --git a/trunk/drivers/leds/leds-net48xx.c b/trunk/drivers/leds/leds-net48xx.c index 713c4a8aa77d..35ee52f9b79e 100644 --- a/trunk/drivers/leds/leds-net48xx.c +++ b/trunk/drivers/leds/leds-net48xx.c @@ -18,7 +18,6 @@ #include #include -#define DRVNAME "net48xx-led" #define NET48XX_ERROR_LED_GPIO 20 static struct platform_device *pdev; @@ -67,13 +66,13 @@ static int net48xx_led_remove(struct platform_device *pdev) } static struct platform_driver net48xx_led_driver = { + .driver.owner = THIS_MODULE, .probe = net48xx_led_probe, .remove = net48xx_led_remove, .suspend = net48xx_led_suspend, .resume = net48xx_led_resume, .driver = { - .name = DRVNAME, - .owner = THIS_MODULE, + .name = "net48xx-led", }, }; @@ -90,7 +89,7 @@ static int __init net48xx_led_init(void) if (ret < 0) goto out; - pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); + pdev = platform_device_register_simple("net48xx-led", -1, NULL, 0); if (IS_ERR(pdev)) { ret = PTR_ERR(pdev); platform_driver_unregister(&net48xx_led_driver); diff --git a/trunk/drivers/rtc/Kconfig b/trunk/drivers/rtc/Kconfig index 7ff1d88094b6..f5b9f187a930 100644 --- a/trunk/drivers/rtc/Kconfig +++ b/trunk/drivers/rtc/Kconfig @@ -121,16 +121,6 @@ config RTC_DRV_DS1553 This driver can also be built as a module. If so, the module will be called rtc-ds1553. -config RTC_DRV_ISL1208 - tristate "Intersil 1208" - depends on RTC_CLASS && I2C - help - If you say yes here you get support for the - Intersil 1208 RTC chip. - - This driver can also be built as a module. If so, the module - will be called rtc-isl1208. - config RTC_DRV_DS1672 tristate "Dallas/Maxim DS1672" depends on RTC_CLASS && I2C diff --git a/trunk/drivers/rtc/Makefile b/trunk/drivers/rtc/Makefile index bbcfb09d81d9..54220714ff49 100644 --- a/trunk/drivers/rtc/Makefile +++ b/trunk/drivers/rtc/Makefile @@ -12,7 +12,6 @@ obj-$(CONFIG_RTC_INTF_PROC) += rtc-proc.o obj-$(CONFIG_RTC_INTF_DEV) += rtc-dev.o obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o -obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o obj-$(CONFIG_RTC_DRV_TEST) += rtc-test.o obj-$(CONFIG_RTC_DRV_DS1307) += rtc-ds1307.o obj-$(CONFIG_RTC_DRV_DS1672) += rtc-ds1672.o diff --git a/trunk/drivers/rtc/rtc-isl1208.c b/trunk/drivers/rtc/rtc-isl1208.c deleted file mode 100644 index f324d0a635d4..000000000000 --- a/trunk/drivers/rtc/rtc-isl1208.c +++ /dev/null @@ -1,591 +0,0 @@ -/* - * Intersil ISL1208 rtc class driver - * - * Copyright 2005,2006 Hebert Valerio Riedel - * - * 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. - * - */ - -#include -#include -#include -#include - -#define DRV_NAME "isl1208" -#define DRV_VERSION "0.2" - -/* Register map */ -/* rtc section */ -#define ISL1208_REG_SC 0x00 -#define ISL1208_REG_MN 0x01 -#define ISL1208_REG_HR 0x02 -#define ISL1208_REG_HR_MIL (1<<7) /* 24h/12h mode */ -#define ISL1208_REG_HR_PM (1<<5) /* PM/AM bit in 12h mode */ -#define ISL1208_REG_DT 0x03 -#define ISL1208_REG_MO 0x04 -#define ISL1208_REG_YR 0x05 -#define ISL1208_REG_DW 0x06 -#define ISL1208_RTC_SECTION_LEN 7 - -/* control/status section */ -#define ISL1208_REG_SR 0x07 -#define ISL1208_REG_SR_ARST (1<<7) /* auto reset */ -#define ISL1208_REG_SR_XTOSCB (1<<6) /* crystal oscillator */ -#define ISL1208_REG_SR_WRTC (1<<4) /* write rtc */ -#define ISL1208_REG_SR_ALM (1<<2) /* alarm */ -#define ISL1208_REG_SR_BAT (1<<1) /* battery */ -#define ISL1208_REG_SR_RTCF (1<<0) /* rtc fail */ -#define ISL1208_REG_INT 0x08 -#define ISL1208_REG_09 0x09 /* reserved */ -#define ISL1208_REG_ATR 0x0a -#define ISL1208_REG_DTR 0x0b - -/* alarm section */ -#define ISL1208_REG_SCA 0x0c -#define ISL1208_REG_MNA 0x0d -#define ISL1208_REG_HRA 0x0e -#define ISL1208_REG_DTA 0x0f -#define ISL1208_REG_MOA 0x10 -#define ISL1208_REG_DWA 0x11 -#define ISL1208_ALARM_SECTION_LEN 6 - -/* user section */ -#define ISL1208_REG_USR1 0x12 -#define ISL1208_REG_USR2 0x13 -#define ISL1208_USR_SECTION_LEN 2 - -/* i2c configuration */ -#define ISL1208_I2C_ADDR 0xde - -static unsigned short normal_i2c[] = { - ISL1208_I2C_ADDR>>1, I2C_CLIENT_END -}; -I2C_CLIENT_INSMOD; /* defines addr_data */ - -static int isl1208_attach_adapter(struct i2c_adapter *adapter); -static int isl1208_detach_client(struct i2c_client *client); - -static struct i2c_driver isl1208_driver = { - .driver = { - .name = DRV_NAME, - }, - .id = I2C_DRIVERID_ISL1208, - .attach_adapter = &isl1208_attach_adapter, - .detach_client = &isl1208_detach_client, -}; - -/* block read */ -static int -isl1208_i2c_read_regs(struct i2c_client *client, u8 reg, u8 buf[], - unsigned len) -{ - u8 reg_addr[1] = { reg }; - struct i2c_msg msgs[2] = { - { client->addr, client->flags, sizeof(reg_addr), reg_addr }, - { client->addr, client->flags | I2C_M_RD, len, buf } - }; - int ret; - - BUG_ON(len == 0); - BUG_ON(reg > ISL1208_REG_USR2); - BUG_ON(reg + len > ISL1208_REG_USR2 + 1); - - ret = i2c_transfer(client->adapter, msgs, 2); - if (ret > 0) - ret = 0; - return ret; -} - -/* block write */ -static int -isl1208_i2c_set_regs(struct i2c_client *client, u8 reg, u8 const buf[], - unsigned len) -{ - u8 i2c_buf[ISL1208_REG_USR2 + 2]; - struct i2c_msg msgs[1] = { - { client->addr, client->flags, len + 1, i2c_buf } - }; - int ret; - - BUG_ON(len == 0); - BUG_ON(reg > ISL1208_REG_USR2); - BUG_ON(reg + len > ISL1208_REG_USR2 + 1); - - i2c_buf[0] = reg; - memcpy(&i2c_buf[1], &buf[0], len); - - ret = i2c_transfer(client->adapter, msgs, 1); - if (ret > 0) - ret = 0; - return ret; -} - -/* simple check to see wether we have a isl1208 */ -static int isl1208_i2c_validate_client(struct i2c_client *client) -{ - u8 regs[ISL1208_RTC_SECTION_LEN] = { 0, }; - u8 zero_mask[ISL1208_RTC_SECTION_LEN] = { - 0x80, 0x80, 0x40, 0xc0, 0xe0, 0x00, 0xf8 - }; - int i; - int ret; - - ret = isl1208_i2c_read_regs(client, 0, regs, ISL1208_RTC_SECTION_LEN); - if (ret < 0) - return ret; - - for (i = 0; i < ISL1208_RTC_SECTION_LEN; ++i) { - if (regs[i] & zero_mask[i]) /* check if bits are cleared */ - return -ENODEV; - } - - return 0; -} - -static int isl1208_i2c_get_sr(struct i2c_client *client) -{ - return i2c_smbus_read_byte_data(client, ISL1208_REG_SR) == -1 ? -EIO:0; -} - -static int isl1208_i2c_get_atr(struct i2c_client *client) -{ - int atr = i2c_smbus_read_byte_data(client, ISL1208_REG_ATR); - - if (atr < 0) - return -EIO; - - /* The 6bit value in the ATR register controls the load - * capacitance C_load * in steps of 0.25pF - * - * bit (1<<5) of the ATR register is inverted - * - * C_load(ATR=0x20) = 4.50pF - * C_load(ATR=0x00) = 12.50pF - * C_load(ATR=0x1f) = 20.25pF - * - */ - - atr &= 0x3f; /* mask out lsb */ - atr ^= 1<<5; /* invert 6th bit */ - atr += 2*9; /* add offset of 4.5pF; unit[atr] = 0.25pF */ - - return atr; -} - -static int isl1208_i2c_get_dtr(struct i2c_client *client) -{ - int dtr = i2c_smbus_read_byte_data(client, ISL1208_REG_DTR); - - if (dtr < 0) - return -EIO; - - /* dtr encodes adjustments of {-60,-40,-20,0,20,40,60} ppm */ - dtr = ((dtr & 0x3) * 20) * (dtr & (1<<2) ? -1 : 1); - - return dtr; -} - -static int isl1208_i2c_get_usr(struct i2c_client *client) -{ - u8 buf[ISL1208_USR_SECTION_LEN] = { 0, }; - int ret; - - ret = isl1208_i2c_read_regs (client, ISL1208_REG_USR1, buf, - ISL1208_USR_SECTION_LEN); - if (ret < 0) - return ret; - - return (buf[1] << 8) | buf[0]; -} - -static int isl1208_i2c_set_usr(struct i2c_client *client, u16 usr) -{ - u8 buf[ISL1208_USR_SECTION_LEN]; - - buf[0] = usr & 0xff; - buf[1] = (usr >> 8) & 0xff; - - return isl1208_i2c_set_regs (client, ISL1208_REG_USR1, buf, - ISL1208_USR_SECTION_LEN); -} - -static int isl1208_rtc_proc(struct device *dev, struct seq_file *seq) -{ - struct i2c_client *const client = to_i2c_client(dev); - int sr, dtr, atr, usr; - - sr = isl1208_i2c_get_sr(client); - if (sr < 0) { - dev_err(&client->dev, "%s: reading SR failed\n", __func__); - return sr; - } - - seq_printf(seq, "status_reg\t:%s%s%s%s%s%s (0x%.2x)\n", - (sr & ISL1208_REG_SR_RTCF) ? " RTCF" : "", - (sr & ISL1208_REG_SR_BAT) ? " BAT" : "", - (sr & ISL1208_REG_SR_ALM) ? " ALM" : "", - (sr & ISL1208_REG_SR_WRTC) ? " WRTC" : "", - (sr & ISL1208_REG_SR_XTOSCB) ? " XTOSCB" : "", - (sr & ISL1208_REG_SR_ARST) ? " ARST" : "", - sr); - - seq_printf(seq, "batt_status\t: %s\n", - (sr & ISL1208_REG_SR_RTCF) ? "bad" : "okay"); - - dtr = isl1208_i2c_get_dtr(client); - if (dtr >= 0 -1) - seq_printf(seq, "digital_trim\t: %d ppm\n", dtr); - - atr = isl1208_i2c_get_atr(client); - if (atr >= 0) - seq_printf(seq, "analog_trim\t: %d.%.2d pF\n", - atr>>2, (atr&0x3)*25); - - usr = isl1208_i2c_get_usr(client); - if (usr >= 0) - seq_printf(seq, "user_data\t: 0x%.4x\n", usr); - - return 0; -} - - -static int isl1208_i2c_read_time(struct i2c_client *client, - struct rtc_time *tm) -{ - int sr; - u8 regs[ISL1208_RTC_SECTION_LEN] = { 0, }; - - sr = isl1208_i2c_get_sr(client); - if (sr < 0) { - dev_err(&client->dev, "%s: reading SR failed\n", __func__); - return -EIO; - } - - sr = isl1208_i2c_read_regs(client, 0, regs, ISL1208_RTC_SECTION_LEN); - if (sr < 0) { - dev_err(&client->dev, "%s: reading RTC section failed\n", - __func__); - return sr; - } - - tm->tm_sec = BCD2BIN(regs[ISL1208_REG_SC]); - tm->tm_min = BCD2BIN(regs[ISL1208_REG_MN]); - { /* HR field has a more complex interpretation */ - const u8 _hr = regs[ISL1208_REG_HR]; - if (_hr & ISL1208_REG_HR_MIL) /* 24h format */ - tm->tm_hour = BCD2BIN(_hr & 0x3f); - else { // 12h format - tm->tm_hour = BCD2BIN(_hr & 0x1f); - if (_hr & ISL1208_REG_HR_PM) /* PM flag set */ - tm->tm_hour += 12; - } - } - - tm->tm_mday = BCD2BIN(regs[ISL1208_REG_DT]); - tm->tm_mon = BCD2BIN(regs[ISL1208_REG_MO]) - 1; /* rtc starts at 1 */ - tm->tm_year = BCD2BIN(regs[ISL1208_REG_YR]) + 100; - tm->tm_wday = BCD2BIN(regs[ISL1208_REG_DW]); - - return 0; -} - -static int isl1208_i2c_read_alarm(struct i2c_client *client, - struct rtc_wkalrm *alarm) -{ - struct rtc_time *const tm = &alarm->time; - u8 regs[ISL1208_ALARM_SECTION_LEN] = { 0, }; - int sr; - - sr = isl1208_i2c_get_sr(client); - if (sr < 0) { - dev_err(&client->dev, "%s: reading SR failed\n", __func__); - return sr; - } - - sr = isl1208_i2c_read_regs(client, ISL1208_REG_SCA, regs, - ISL1208_ALARM_SECTION_LEN); - if (sr < 0) { - dev_err(&client->dev, "%s: reading alarm section failed\n", - __func__); - return sr; - } - - /* MSB of each alarm register is an enable bit */ - tm->tm_sec = BCD2BIN(regs[ISL1208_REG_SCA-ISL1208_REG_SCA] & 0x7f); - tm->tm_min = BCD2BIN(regs[ISL1208_REG_MNA-ISL1208_REG_SCA] & 0x7f); - tm->tm_hour = BCD2BIN(regs[ISL1208_REG_HRA-ISL1208_REG_SCA] & 0x3f); - tm->tm_mday = BCD2BIN(regs[ISL1208_REG_DTA-ISL1208_REG_SCA] & 0x3f); - tm->tm_mon = BCD2BIN(regs[ISL1208_REG_MOA-ISL1208_REG_SCA] & 0x1f)-1; - tm->tm_wday = BCD2BIN(regs[ISL1208_REG_DWA-ISL1208_REG_SCA] & 0x03); - - return 0; -} - -static int isl1208_rtc_read_time(struct device *dev, struct rtc_time *tm) -{ - return isl1208_i2c_read_time(to_i2c_client(dev), tm); -} - -static int isl1208_i2c_set_time(struct i2c_client *client, - struct rtc_time const *tm) -{ - int sr; - u8 regs[ISL1208_RTC_SECTION_LEN] = { 0, }; - - regs[ISL1208_REG_SC] = BIN2BCD(tm->tm_sec); - regs[ISL1208_REG_MN] = BIN2BCD(tm->tm_min); - regs[ISL1208_REG_HR] = BIN2BCD(tm->tm_hour) | ISL1208_REG_HR_MIL; - - regs[ISL1208_REG_DT] = BIN2BCD(tm->tm_mday); - regs[ISL1208_REG_MO] = BIN2BCD(tm->tm_mon + 1); - regs[ISL1208_REG_YR] = BIN2BCD(tm->tm_year - 100); - - regs[ISL1208_REG_DW] = BIN2BCD(tm->tm_wday & 7); - - sr = isl1208_i2c_get_sr(client); - if (sr < 0) { - dev_err(&client->dev, "%s: reading SR failed\n", __func__); - return sr; - } - - /* set WRTC */ - sr = i2c_smbus_write_byte_data (client, ISL1208_REG_SR, - sr | ISL1208_REG_SR_WRTC); - if (sr < 0) { - dev_err(&client->dev, "%s: writing SR failed\n", __func__); - return sr; - } - - /* write RTC registers */ - sr = isl1208_i2c_set_regs(client, 0, regs, ISL1208_RTC_SECTION_LEN); - if (sr < 0) { - dev_err(&client->dev, "%s: writing RTC section failed\n", - __func__); - return sr; - } - - /* clear WRTC again */ - sr = i2c_smbus_write_byte_data (client, ISL1208_REG_SR, - sr & ~ISL1208_REG_SR_WRTC); - if (sr < 0) { - dev_err(&client->dev, "%s: writing SR failed\n", __func__); - return sr; - } - - return 0; -} - - -static int isl1208_rtc_set_time(struct device *dev, struct rtc_time *tm) -{ - return isl1208_i2c_set_time(to_i2c_client(dev), tm); -} - -static int isl1208_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) -{ - return isl1208_i2c_read_alarm(to_i2c_client(dev), alarm); -} - -static struct rtc_class_ops isl1208_rtc_ops = { - .proc = isl1208_rtc_proc, - .read_time = isl1208_rtc_read_time, - .set_time = isl1208_rtc_set_time, - .read_alarm = isl1208_rtc_read_alarm, - //.set_alarm = isl1208_rtc_set_alarm, -}; - -/* sysfs interface */ - -static ssize_t isl1208_sysfs_show_atrim(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int atr; - - atr = isl1208_i2c_get_atr(to_i2c_client(dev)); - if (atr < 0) - return atr; - - return sprintf(buf, "%d.%.2d pF\n", atr>>2, (atr&0x3)*25); -} -static DEVICE_ATTR(atrim, S_IRUGO, isl1208_sysfs_show_atrim, NULL); - -static ssize_t isl1208_sysfs_show_dtrim(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int dtr; - - dtr = isl1208_i2c_get_dtr(to_i2c_client(dev)); - if (dtr < 0) - return dtr; - - return sprintf(buf, "%d ppm\n", dtr); -} -static DEVICE_ATTR(dtrim, S_IRUGO, isl1208_sysfs_show_dtrim, NULL); - -static ssize_t isl1208_sysfs_show_usr(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int usr; - - usr = isl1208_i2c_get_usr(to_i2c_client(dev)); - if (usr < 0) - return usr; - - return sprintf(buf, "0x%.4x\n", usr); -} - -static ssize_t isl1208_sysfs_store_usr(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - int usr = -1; - - if (buf[0] == '0' && (buf[1] == 'x' || buf[1] == 'X')) { - if (sscanf(buf, "%x", &usr) != 1) - return -EINVAL; - } else { - if (sscanf(buf, "%d", &usr) != 1) - return -EINVAL; - } - - if (usr < 0 || usr > 0xffff) - return -EINVAL; - - return isl1208_i2c_set_usr(to_i2c_client(dev), usr) ? -EIO : count; -} -static DEVICE_ATTR(usr, S_IRUGO | S_IWUSR, isl1208_sysfs_show_usr, - isl1208_sysfs_store_usr); - -static int -isl1208_probe(struct i2c_adapter *adapter, int addr, int kind) -{ - int rc = 0; - struct i2c_client *new_client = NULL; - struct rtc_device *rtc = NULL; - - if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) { - rc = -ENODEV; - goto failout; - } - - new_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); - if (new_client == NULL) { - rc = -ENOMEM; - goto failout; - } - - new_client->addr = addr; - new_client->adapter = adapter; - new_client->driver = &isl1208_driver; - new_client->flags = 0; - strcpy(new_client->name, DRV_NAME); - - if (kind < 0) { - rc = isl1208_i2c_validate_client(new_client); - if (rc < 0) - goto failout; - } - - rc = i2c_attach_client(new_client); - if (rc < 0) - goto failout; - - dev_info(&new_client->dev, - "chip found, driver version " DRV_VERSION "\n"); - - rtc = rtc_device_register(isl1208_driver.driver.name, - &new_client->dev, - &isl1208_rtc_ops, THIS_MODULE); - - if (IS_ERR(rtc)) { - rc = PTR_ERR(rtc); - goto failout_detach; - } - - i2c_set_clientdata(new_client, rtc); - - rc = isl1208_i2c_get_sr(new_client); - if (rc < 0) { - dev_err(&new_client->dev, "reading status failed\n"); - goto failout_unregister; - } - - if (rc & ISL1208_REG_SR_RTCF) - dev_warn(&new_client->dev, "rtc power failure detected, " - "please set clock.\n"); - - rc = device_create_file(&new_client->dev, &dev_attr_atrim); - if (rc < 0) - goto failout_unregister; - rc = device_create_file(&new_client->dev, &dev_attr_dtrim); - if (rc < 0) - goto failout_atrim; - rc = device_create_file(&new_client->dev, &dev_attr_usr); - if (rc < 0) - goto failout_dtrim; - - return 0; - - failout_dtrim: - device_remove_file(&new_client->dev, &dev_attr_dtrim); - failout_atrim: - device_remove_file(&new_client->dev, &dev_attr_atrim); - failout_unregister: - rtc_device_unregister(rtc); - failout_detach: - i2c_detach_client(new_client); - failout: - kfree(new_client); - return rc; -} - -static int -isl1208_attach_adapter (struct i2c_adapter *adapter) -{ - return i2c_probe(adapter, &addr_data, isl1208_probe); -} - -static int -isl1208_detach_client(struct i2c_client *client) -{ - int rc; - struct rtc_device *const rtc = i2c_get_clientdata(client); - - if (rtc) - rtc_device_unregister(rtc); /* do we need to kfree? */ - - rc = i2c_detach_client(client); - if (rc) - return rc; - - kfree(client); - - return 0; -} - -/* module management */ - -static int __init isl1208_init(void) -{ - return i2c_add_driver(&isl1208_driver); -} - -static void __exit isl1208_exit(void) -{ - i2c_del_driver(&isl1208_driver); -} - -MODULE_AUTHOR("Herbert Valerio Riedel "); -MODULE_DESCRIPTION("Intersil ISL1208 RTC driver"); -MODULE_LICENSE("GPL"); -MODULE_VERSION(DRV_VERSION); - -module_init(isl1208_init); -module_exit(isl1208_exit); diff --git a/trunk/drivers/video/Kconfig b/trunk/drivers/video/Kconfig index 6533b0f39231..3badb48d662b 100644 --- a/trunk/drivers/video/Kconfig +++ b/trunk/drivers/video/Kconfig @@ -1518,26 +1518,6 @@ config FB_PXA_PARAMETERS describes the available parameters. -config FB_MBX - tristate "2700G LCD framebuffer support" - depends on FB && ARCH_PXA - select FB_CFB_FILLRECT - select FB_CFB_COPYAREA - select FB_CFB_IMAGEBLIT - ---help--- - Framebuffer driver for the Intel 2700G (Marathon) Graphics - Accelerator - -config FB_MBX_DEBUG - bool "Enable debugging info via debugfs" - depends on FB_MBX && DEBUG_FS - default n - ---help--- - Enable this if you want debugging information using the debug - filesystem (debugfs) - - If unsure, say N. - config FB_W100 tristate "W100 frame buffer support" depends on FB && PXA_SHARPSL diff --git a/trunk/drivers/video/Makefile b/trunk/drivers/video/Makefile index 95563c9c6b9c..6283d015f8f5 100644 --- a/trunk/drivers/video/Makefile +++ b/trunk/drivers/video/Makefile @@ -38,7 +38,6 @@ obj-$(CONFIG_FB_SIS) += sis/ obj-$(CONFIG_FB_KYRO) += kyro/ obj-$(CONFIG_FB_SAVAGE) += savage/ obj-$(CONFIG_FB_GEODE) += geode/ -obj-$(CONFIG_FB_MBX) += mbx/ obj-$(CONFIG_FB_I810) += vgastate.o obj-$(CONFIG_FB_NEOMAGIC) += neofb.o vgastate.o obj-$(CONFIG_FB_VIRGE) += virgefb.o diff --git a/trunk/drivers/video/mbx/Makefile b/trunk/drivers/video/mbx/Makefile deleted file mode 100644 index 16c1165cf9c7..000000000000 --- a/trunk/drivers/video/mbx/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -# Makefile for the 2700G controller driver. - -obj-$(CONFIG_FB_MBX) += mbxfb.o -obj-$(CONFIG_FB_MBX_DEBUG) += mbxfbdebugfs.o diff --git a/trunk/drivers/video/mbx/mbxdebugfs.c b/trunk/drivers/video/mbx/mbxdebugfs.c deleted file mode 100644 index 84aab3ad024e..000000000000 --- a/trunk/drivers/video/mbx/mbxdebugfs.c +++ /dev/null @@ -1,188 +0,0 @@ -#include - -#define BIG_BUFFER_SIZE (1024) - -static char big_buffer[BIG_BUFFER_SIZE]; - -struct mbxfb_debugfs_data { - struct dentry *dir; - struct dentry *sysconf; - struct dentry *clock; - struct dentry *display; - struct dentry *gsctl; -}; - -static int open_file_generic(struct inode *inode, struct file *file) -{ - file->private_data = inode->u.generic_ip; - return 0; -} - -static ssize_t write_file_dummy(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) -{ - return count; -} - -static ssize_t sysconf_read_file(struct file *file, char __user *userbuf, - size_t count, loff_t *ppos) -{ - char * s = big_buffer; - - s += sprintf(s, "SYSCFG = %08lx\n", SYSCFG); - s += sprintf(s, "PFBASE = %08lx\n", PFBASE); - s += sprintf(s, "PFCEIL = %08lx\n", PFCEIL); - s += sprintf(s, "POLLFLAG = %08lx\n", POLLFLAG); - s += sprintf(s, "SYSRST = %08lx\n", SYSRST); - - return simple_read_from_buffer(userbuf, count, ppos, - big_buffer, s-big_buffer); -} - - -static ssize_t gsctl_read_file(struct file *file, char __user *userbuf, - size_t count, loff_t *ppos) -{ - char * s = big_buffer; - - s += sprintf(s, "GSCTRL = %08lx\n", GSCTRL); - s += sprintf(s, "VSCTRL = %08lx\n", VSCTRL); - s += sprintf(s, "GBBASE = %08lx\n", GBBASE); - s += sprintf(s, "VBBASE = %08lx\n", VBBASE); - s += sprintf(s, "GDRCTRL = %08lx\n", GDRCTRL); - s += sprintf(s, "VCMSK = %08lx\n", VCMSK); - s += sprintf(s, "GSCADR = %08lx\n", GSCADR); - s += sprintf(s, "VSCADR = %08lx\n", VSCADR); - s += sprintf(s, "VUBASE = %08lx\n", VUBASE); - s += sprintf(s, "VVBASE = %08lx\n", VVBASE); - s += sprintf(s, "GSADR = %08lx\n", GSADR); - s += sprintf(s, "VSADR = %08lx\n", VSADR); - s += sprintf(s, "HCCTRL = %08lx\n", HCCTRL); - s += sprintf(s, "HCSIZE = %08lx\n", HCSIZE); - s += sprintf(s, "HCPOS = %08lx\n", HCPOS); - s += sprintf(s, "HCBADR = %08lx\n", HCBADR); - s += sprintf(s, "HCCKMSK = %08lx\n", HCCKMSK); - s += sprintf(s, "GPLUT = %08lx\n", GPLUT); - - return simple_read_from_buffer(userbuf, count, ppos, - big_buffer, s-big_buffer); -} - -static ssize_t display_read_file(struct file *file, char __user *userbuf, - size_t count, loff_t *ppos) -{ - char * s = big_buffer; - - s += sprintf(s, "DSCTRL = %08lx\n", DSCTRL); - s += sprintf(s, "DHT01 = %08lx\n", DHT01); - s += sprintf(s, "DHT02 = %08lx\n", DHT02); - s += sprintf(s, "DHT03 = %08lx\n", DHT03); - s += sprintf(s, "DVT01 = %08lx\n", DVT01); - s += sprintf(s, "DVT02 = %08lx\n", DVT02); - s += sprintf(s, "DVT03 = %08lx\n", DVT03); - s += sprintf(s, "DBCOL = %08lx\n", DBCOL); - s += sprintf(s, "BGCOLOR = %08lx\n", BGCOLOR); - s += sprintf(s, "DINTRS = %08lx\n", DINTRS); - s += sprintf(s, "DINTRE = %08lx\n", DINTRE); - s += sprintf(s, "DINTRCNT = %08lx\n", DINTRCNT); - s += sprintf(s, "DSIG = %08lx\n", DSIG); - s += sprintf(s, "DMCTRL = %08lx\n", DMCTRL); - s += sprintf(s, "CLIPCTRL = %08lx\n", CLIPCTRL); - s += sprintf(s, "SPOCTRL = %08lx\n", SPOCTRL); - s += sprintf(s, "SVCTRL = %08lx\n", SVCTRL); - s += sprintf(s, "DLSTS = %08lx\n", DLSTS); - s += sprintf(s, "DLLCTRL = %08lx\n", DLLCTRL); - s += sprintf(s, "DVLNUM = %08lx\n", DVLNUM); - s += sprintf(s, "DUCTRL = %08lx\n", DUCTRL); - s += sprintf(s, "DVECTRL = %08lx\n", DVECTRL); - s += sprintf(s, "DHDET = %08lx\n", DHDET); - s += sprintf(s, "DVDET = %08lx\n", DVDET); - s += sprintf(s, "DODMSK = %08lx\n", DODMSK); - s += sprintf(s, "CSC01 = %08lx\n", CSC01); - s += sprintf(s, "CSC02 = %08lx\n", CSC02); - s += sprintf(s, "CSC03 = %08lx\n", CSC03); - s += sprintf(s, "CSC04 = %08lx\n", CSC04); - s += sprintf(s, "CSC05 = %08lx\n", CSC05); - - return simple_read_from_buffer(userbuf, count, ppos, - big_buffer, s-big_buffer); -} - -static ssize_t clock_read_file(struct file *file, char __user *userbuf, - size_t count, loff_t *ppos) -{ - char * s = big_buffer; - - s += sprintf(s, "SYSCLKSRC = %08lx\n", SYSCLKSRC); - s += sprintf(s, "PIXCLKSRC = %08lx\n", PIXCLKSRC); - s += sprintf(s, "CLKSLEEP = %08lx\n", CLKSLEEP); - s += sprintf(s, "COREPLL = %08lx\n", COREPLL); - s += sprintf(s, "DISPPLL = %08lx\n", DISPPLL); - s += sprintf(s, "PLLSTAT = %08lx\n", PLLSTAT); - s += sprintf(s, "VOVRCLK = %08lx\n", VOVRCLK); - s += sprintf(s, "PIXCLK = %08lx\n", PIXCLK); - s += sprintf(s, "MEMCLK = %08lx\n", MEMCLK); - s += sprintf(s, "M24CLK = %08lx\n", M24CLK); - s += sprintf(s, "MBXCLK = %08lx\n", MBXCLK); - s += sprintf(s, "SDCLK = %08lx\n", SDCLK); - s += sprintf(s, "PIXCLKDIV = %08lx\n", PIXCLKDIV); - - return simple_read_from_buffer(userbuf, count, ppos, - big_buffer, s-big_buffer); -} - -static struct file_operations sysconf_fops = { - .read = sysconf_read_file, - .write = write_file_dummy, - .open = open_file_generic, -}; - -static struct file_operations clock_fops = { - .read = clock_read_file, - .write = write_file_dummy, - .open = open_file_generic, -}; - -static struct file_operations display_fops = { - .read = display_read_file, - .write = write_file_dummy, - .open = open_file_generic, -}; - -static struct file_operations gsctl_fops = { - .read = gsctl_read_file, - .write = write_file_dummy, - .open = open_file_generic, -}; - - -static void __devinit mbxfb_debugfs_init(struct fb_info *fbi) -{ - struct mbxfb_info *mfbi = fbi->par; - struct mbxfb_debugfs_data *dbg; - - dbg = kzalloc(sizeof(struct mbxfb_debugfs_data), GFP_KERNEL); - mfbi->debugfs_data = dbg; - - dbg->dir = debugfs_create_dir("mbxfb", NULL); - dbg->sysconf = debugfs_create_file("sysconf", 0444, dbg->dir, - fbi, &sysconf_fops); - dbg->clock = debugfs_create_file("clock", 0444, dbg->dir, - fbi, &clock_fops); - dbg->display = debugfs_create_file("display", 0444, dbg->dir, - fbi, &display_fops); - dbg->gsctl = debugfs_create_file("gsctl", 0444, dbg->dir, - fbi, &gsctl_fops); -} - -static void __devexit mbxfb_debugfs_remove(struct fb_info *fbi) -{ - struct mbxfb_info *mfbi = fbi->par; - struct mbxfb_debugfs_data *dbg = mfbi->debugfs_data; - - debugfs_remove(dbg->gsctl); - debugfs_remove(dbg->display); - debugfs_remove(dbg->clock); - debugfs_remove(dbg->sysconf); - debugfs_remove(dbg->dir); -} diff --git a/trunk/drivers/video/mbx/mbxfb.c b/trunk/drivers/video/mbx/mbxfb.c deleted file mode 100644 index 6849ab75d403..000000000000 --- a/trunk/drivers/video/mbx/mbxfb.c +++ /dev/null @@ -1,683 +0,0 @@ -/* - * linux/drivers/video/mbx/mbxfb.c - * - * Copyright (C) 2006 Compulab, Ltd. - * Mike Rapoport - * - * Based on pxafb.c - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file COPYING in the main directory of this archive for - * more details. - * - * Intel 2700G (Marathon) Graphics Accelerator Frame Buffer Driver - * - */ - -#include -#include -#include -#include -#include - -#include - -#include