Commit ed6eefe4 authored by Linus Torvalds's avatar Linus Torvalds

v2.4.3.6 -> v2.4.3.7

  - Johannes Erdfelt: USB updates
  - David Howells: more rw-sem stuff
  - David Miller: network callback cleanups and fixes
  - Jan Harkes: make Coda use the proper VFS layer interfaces, so that it can use
  "non-traditional-unix" filesystems without inode numbers for backing store.
parent 24579a88
......@@ -37,7 +37,7 @@ Copyright (C) 1999-2000 Maxim Krasnyansky <max_mk@yahoo.com>
alias char-major-10-200 tun
Run:
modprobe -a
depmod -a
Driver will be automatically loaded when application access /dev/net/tun.
......
......@@ -140,6 +140,11 @@ P: Riccardo Facchetti
M: fizban@tin.it
S: Maintained
AFFS FILE SYSTEM
P: Roman Zippel
M: zippel@linux-m68k.org
S: Maintained
AHA152X SCSI DRIVER
P: Juergen E. Fischer
M: Juergen Fischer <fischer@norbit.de>
......
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 4
EXTRAVERSION =-pre6
EXTRAVERSION =-pre7
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
......
......@@ -80,11 +80,6 @@ EXPORT_SYMBOL_NOVERS(__down_failed);
EXPORT_SYMBOL_NOVERS(__down_failed_interruptible);
EXPORT_SYMBOL_NOVERS(__down_failed_trylock);
EXPORT_SYMBOL_NOVERS(__up_wakeup);
#ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM
EXPORT_SYMBOL_NOVERS(__rwsem_down_write_failed);
EXPORT_SYMBOL_NOVERS(__rwsem_down_read_failed);
EXPORT_SYMBOL_NOVERS(__rwsem_wake);
#endif
/* Networking helper routines. */
EXPORT_SYMBOL(csum_partial_copy_generic);
/* Delay loops */
......
......@@ -9,7 +9,7 @@ L_TARGET = lib.a
obj-y = checksum.o old-checksum.o delay.o \
usercopy.o getuser.o putuser.o \
memcpy.o strstr.o rwsem.o
memcpy.o strstr.o
obj-$(CONFIG_X86_USE_3DNOW) += mmx.o
obj-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
......
/* rwsem.S: R/W semaphores, register saving wrapper function stubs
*
* Written by David Howells (dhowells@redhat.com).
* Derived from arch/i386/kernel/semaphore.c
*/
.text
.align 4
.globl __rwsem_down_read_failed
__rwsem_down_read_failed:
pushl %edx
pushl %ecx
call rwsem_down_read_failed
popl %ecx
popl %edx
ret
.align 4
.globl __rwsem_down_write_failed
__rwsem_down_write_failed:
pushl %edx
pushl %ecx
call rwsem_down_write_failed
popl %ecx
popl %edx
ret
.align 4
.globl __rwsem_wake
__rwsem_wake:
pushl %edx
pushl %ecx
call rwsem_wake
popl %ecx
popl %edx
ret
......@@ -38,7 +38,8 @@
#include <linux/kbd_kern.h>
#if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(__alpha__) || \
defined(__mips__) || defined(CONFIG_SPARC64) || defined(CONFIG_SUPERH)
defined(__mips__) || defined(CONFIG_SPARC64) || defined(CONFIG_SUPERH) || \
defined(CONFIG_PPC) || defined(__mc68000__)
static int x86_sysrq_alt = 0;
#ifdef CONFIG_SPARC64
......@@ -63,8 +64,46 @@ static unsigned short x86_keycodes[256] =
308,310,313,314,315,317,318,319,320,321,322,323,324,325,326,330,
332,340,341,342,343,344,345,346,356,359,365,368,369,370,371,372 };
#ifdef CONFIG_MAC_EMUMOUSEBTN
extern int mac_hid_mouse_emulate_buttons(int, int, int);
#endif /* CONFIG_MAC_EMUMOUSEBTN */
#ifdef CONFIG_MAC_ADBKEYCODES
extern int mac_hid_keyboard_sends_linux_keycodes(void);
#else
#define mac_hid_keyboard_sends_linux_keycodes() 0
#endif /* CONFIG_MAC_ADBKEYCODES */
#if defined(CONFIG_MAC_ADBKEYCODES) || defined(CONFIG_ADB_KEYBOARD)
static unsigned char mac_keycodes[256] = {
0, 53, 18, 19, 20, 21, 23, 22, 26, 28, 25, 29, 27, 24, 51, 48,
12, 13, 14, 15, 17, 16, 32, 34, 31, 35, 33, 30, 36, 54,128, 1,
2, 3, 5, 4, 38, 40, 37, 41, 39, 50, 56, 42, 6, 7, 8, 9,
11, 45, 46, 43, 47, 44,123, 67, 58, 49, 57,122,120, 99,118, 96,
97, 98,100,101,109, 71,107, 89, 91, 92, 78, 86, 87, 88, 69, 83,
84, 85, 82, 65, 42, 0, 10,103,111, 0, 0, 0, 0, 0, 0, 0,
76,125, 75,105,124,110,115, 62,116, 59, 60,119, 61,121,114,117,
0, 0, 0, 0,127, 81, 0,113, 0, 0, 0, 0, 95, 55, 55, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 94, 0, 93, 0, 0, 0, 0, 0, 0,104,102 };
#endif /* CONFIG_MAC_ADBKEYCODES || CONFIG_ADB_KEYBOARD */
static int emulate_raw(unsigned int keycode, int down)
{
#ifdef CONFIG_MAC_EMUMOUSEBTN
if (mac_hid_mouse_emulate_buttons(1, keycode, down))
return 0;
#endif /* CONFIG_MAC_EMUMOUSEBTN */
#if defined(CONFIG_MAC_ADBKEYCODES) || defined(CONFIG_ADB_KEYBOARD)
if (!mac_hid_keyboard_sends_linux_keycodes()) {
if (keycode > 255 || !mac_keycodes[keycode])
return -1;
handle_scancode((mac_keycodes[keycode] & 0x7f), down);
return 0;
}
#endif /* CONFIG_MAC_ADBKEYCODES || CONFIG_ADB_KEYBOARD */
if (keycode > 255 || !x86_keycodes[keycode])
return -1;
......@@ -77,6 +116,7 @@ static int emulate_raw(unsigned int keycode, int down)
if (keycode == KEY_SYSRQ && x86_sysrq_alt) {
handle_scancode(0x54, down);
return 0;
}
......@@ -107,29 +147,7 @@ static int emulate_raw(unsigned int keycode, int down)
return 0;
}
#elif defined(CONFIG_ADB_KEYBOARD)
static unsigned char mac_keycodes[128] =
{ 0, 53, 18, 19, 20, 21, 23, 22, 26, 28, 25, 29, 27, 24, 51, 48,
12, 13, 14, 15, 17, 16, 32, 34, 31, 35, 33, 30, 36, 54,128, 1,
2, 3, 5, 4, 38, 40, 37, 41, 39, 50, 56, 42, 6, 7, 8, 9,
11, 45, 46, 43, 47, 44,123, 67, 58, 49, 57,122,120, 99,118, 96,
97, 98,100,101,109, 71,107, 89, 91, 92, 78, 86, 87, 88, 69, 83,
84, 85, 82, 65, 42, 0, 10,103,111, 0, 0, 0, 0, 0, 0, 0,
76,125, 75,105,124, 0,115, 62,116, 59, 60,119, 61,121,114,117,
0, 0, 0, 0,127, 81, 0,113, 0, 0, 0, 0, 0, 55, 55 };
static int emulate_raw(unsigned int keycode, int down)
{
if (keycode > 127 || !mac_keycodes[keycode])
return -1;
handle_scancode(mac_keycodes[keycode] & 0x7f, down);
return 0;
}
#endif
#endif /* CONFIG_X86 || CONFIG_IA64 || __alpha__ || __mips__ || CONFIG_PPC */
static struct input_handler keybdev_handler;
......
......@@ -227,7 +227,7 @@ fi
tristate 'PPP (point-to-point protocol) support' CONFIG_PPP
if [ ! "$CONFIG_PPP" = "n" ]; then
dep_bool ' PPP multilink support (EXPERIMENTAL)' CONFIG_PPP_MULTILINK $CONFIG_EXPERIMENTAL
bool ' PPP filtering' CONFIG_PPP_FILTER
dep_bool ' PPP filtering' CONFIG_PPP_FILTER $CONFIG_FILTER
dep_tristate ' PPP support for async serial ports' CONFIG_PPP_ASYNC $CONFIG_PPP
dep_tristate ' PPP support for sync tty ports' CONFIG_PPP_SYNC_TTY $CONFIG_PPP
dep_tristate ' PPP Deflate compression' CONFIG_PPP_DEFLATE $CONFIG_PPP
......
......@@ -456,23 +456,22 @@ static int __init dmfe_init_one (struct pci_dev *pdev,
for (i = 0; i < 64; i++)
((u16 *) db->srom)[i] = read_srom_word(pci_iobase, i);
printk(KERN_INFO "%s: Davicom DM%04lx at 0x%lx,",
dev->name,
ent->driver_data >> 16,
pci_iobase);
/* Set Node address */
for (i = 0; i < 6; i++) {
for (i = 0; i < 6; i++)
dev->dev_addr[i] = db->srom[20 + i];
printk("%c%02x", i ? ':' : ' ', dev->dev_addr[i]);
}
printk(", IRQ %d\n", pci_irqline);
i = register_netdev(dev);
if (i)
goto err_out_res;
printk(KERN_INFO "%s: Davicom DM%04lx at 0x%lx,",
dev->name,
ent->driver_data >> 16,
pci_iobase);
for (i = 0; i < 6; i++)
printk("%c%02x", i ? ':' : ' ', dev->dev_addr[i]);
printk(", IRQ %d\n", pci_irqline);
return 0;
err_out_res:
......@@ -726,6 +725,7 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)
struct tx_desc *txptr;
struct dmfe_board_info *db;
u32 ioaddr;
unsigned long flags;
if (!dev) {
DMFE_DBUG(1, "dmfe_interrupt() without device arg", 0);
......@@ -737,7 +737,7 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)
DMFE_DBUG(0, "dmfe_interrupt()", 0);
spin_lock_irq(&db->lock);
spin_lock_irqsave(&db->lock, flags);
/* Disable all interrupt in CR7 to solve the interrupt edge problem */
outl(0, ioaddr + DCR7);
......@@ -754,7 +754,7 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)
netif_stop_queue(dev);
db->wait_reset = 1; /* Need to RESET */
outl(0, ioaddr + DCR7); /* disable all interrupt */
spin_unlock_irq(&db->lock);
spin_unlock_irqrestore(&db->lock, flags);
return;
}
......@@ -808,7 +808,7 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)
db->cr7_data = 0x1a2cd;
outl(db->cr7_data, ioaddr + DCR7);
spin_unlock_irq(&db->lock);
spin_unlock_irqrestore(&db->lock, flags);
}
/*
......@@ -900,19 +900,23 @@ static struct net_device_stats *dmfe_get_stats(struct net_device *dev)
static void dmfe_set_filter_mode(struct net_device *dev)
{
struct dmfe_board_info *db = dev->priv;
unsigned long flags;
DMFE_DBUG(0, "dmfe_set_filter_mode()", 0);
spin_lock_irqsave(&db->lock, flags);
if (dev->flags & IFF_PROMISC) {
DMFE_DBUG(0, "Enable PROM Mode", 0);
db->cr6_data |= CR6_PM | CR6_PBF;
update_cr6(db->cr6_data, db->ioaddr);
spin_unlock_irqrestore(&db->lock, flags);
return;
}
if (dev->flags & IFF_ALLMULTI || dev->mc_count > DMFE_MAX_MULTICAST) {
DMFE_DBUG(0, "Pass all multicast address", dev->mc_count);
db->cr6_data &= ~(CR6_PM | CR6_PBF);
db->cr6_data |= CR6_PAM;
spin_unlock_irqrestore(&db->lock, flags);
return;
}
DMFE_DBUG(0, "Set multicast address", dev->mc_count);
......@@ -920,6 +924,7 @@ static void dmfe_set_filter_mode(struct net_device *dev)
dm9132_id_table(dev, dev->mc_count); /* DM9132 */
else
send_filter_frame(dev, dev->mc_count); /* DM9102/DM9102A */
spin_unlock_irqrestore(&db->lock, flags);
}
/*
......@@ -946,12 +951,16 @@ static void dmfe_timer(unsigned long data)
unsigned char tmp_cr12;
struct net_device *dev = (struct net_device *) data;
struct dmfe_board_info *db = (struct dmfe_board_info *) dev->priv;
unsigned long flags;
DMFE_DBUG(0, "dmfe_timer()", 0);
spin_lock_irqsave(&db->lock, flags);
/* Do reset now */
if (db->in_reset_state)
if (db->in_reset_state) {
spin_unlock_irqrestore(&db->lock, flags);
return;
}
/* Operating Mode Check */
if ((db->dm910x_chk_mode & 0x1) && (db->stats.rx_packets > MAX_CHECK_PACKET)) {
......@@ -983,6 +992,7 @@ static void dmfe_timer(unsigned long data)
dmfe_dynamic_reset(dev);
db->timer.expires = jiffies + DMFE_TIMER_WUT;
add_timer(&db->timer);
spin_unlock_irqrestore(&db->lock, flags);
return;
}
db->rx_error_cnt = 0; /* Clear previos counter */
......@@ -1038,6 +1048,7 @@ static void dmfe_timer(unsigned long data)
/* Timer active again */
db->timer.expires = jiffies + DMFE_TIMER_WUT;
add_timer(&db->timer);
spin_unlock_irqrestore(&db->lock, flags);
}
/*
......@@ -1233,19 +1244,16 @@ static void send_filter_frame(struct net_device *dev, int mc_cnt)
struct dmfe_board_info *db = dev->priv;
struct dev_mc_list *mcptr;
struct tx_desc *txptr;
unsigned long flags;
u16 *addrptr;
u32 *suptr;
int i;
DMFE_DBUG(0, "send_filter_frame()", 0);
spin_lock_irqsave(&db->lock, flags);
txptr = db->tx_insert_ptr;
suptr = (u32 *) txptr->tx_buf_ptr;
if (txptr->tdes0 & 0x80000000) {
spin_unlock_irqrestore(&db->lock, flags);
printk(KERN_WARNING "%s: Too busy to send filter frame\n",
dev->name);
return;
......@@ -1284,7 +1292,6 @@ static void send_filter_frame(struct net_device *dev, int mc_cnt)
update_cr6(db->cr6_data | 0x2000, dev->base_addr);
outl(0x1, dev->base_addr + DCR1); /* Issue Tx polling command */
update_cr6(db->cr6_data, dev->base_addr);
spin_unlock_irqrestore(&db->lock, flags);
}
/*
......
......@@ -21,6 +21,7 @@ static const char *version = "hermes.c: 12 Dec 2000 David Gibson <hermes@gibson.
#include <linux/module.h>
#include <linux/types.h>
#include <linux/threads.h>
#include <linux/smp.h>
#include <asm/io.h>
#include <linux/ptrace.h>
......
This diff is collapsed.
......@@ -710,8 +710,17 @@ static int netwave_ioctl(struct net_device *dev, /* ioctl device */
if(wrq->u.data.pointer != (caddr_t) 0) {
struct iw_range range;
/* Set the length (useless : its constant...) */
/* Set the length (very important for backward compatibility) */
wrq->u.data.length = sizeof(struct iw_range);
/* Set all the info we don't care or don't know about to zero */
memset(&range, 0, sizeof(range));
#if WIRELESS_EXT > 10
/* Set the Wireless Extension versions */
range.we_version_compiled = WIRELESS_EXT;
range.we_version_source = 9; /* Nothing for us in v10 and v11 */
#endif /* WIRELESS_EXT > 10 */
/* Set information in the range struct */
range.throughput = 450 * 1000; /* don't argue on this ! */
......
This diff is collapsed.
......@@ -1332,9 +1332,15 @@ static int ray_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
struct iw_range range;
memset((char *) &range, 0, sizeof(struct iw_range));
/* Set the length (useless : its constant...) */
/* Set the length (very important for backward compatibility) */
wrq->u.data.length = sizeof(struct iw_range);
#if WIRELESS_EXT > 10
/* Set the Wireless Extension versions */
range.we_version_compiled = WIRELESS_EXT;
range.we_version_source = 9;
#endif /* WIRELESS_EXT > 10 */
/* Set information in the range struct */
range.throughput = 1.1 * 1000 * 1000; /* Put the right number here */
range.num_channels = hop_pattern_length[(int)country];
......
......@@ -2239,9 +2239,16 @@ wavelan_ioctl(struct net_device * dev, /* Device on wich the ioctl apply */
{
struct iw_range range;
/* Set the length (useless : its constant...) */
/* Set the length (very important for backward compatibility) */
wrq->u.data.length = sizeof(struct iw_range);
/* Set all the info we don't care or don't know about to zero */
memset(&range, 0, sizeof(range));
/* Set the Wireless Extension versions */
range.we_version_compiled = WIRELESS_EXT;
range.we_version_source = 9; /* Nothing for us in v10 and v11 */
/* Set information in the range struct */
range.throughput = 1.4 * 1000 * 1000; /* don't argue on this ! */
range.min_nwid = 0x0000;
......
......@@ -1988,15 +1988,30 @@ ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound)
switch (CCP_CODE(dp)) {
case CCP_CONFREQ:
/* A ConfReq starts negotiation of compression
* in one direction of transmission,
* and hence brings it down...but which way?
*
* Remember:
* A ConfReq indicates what the sender would like to receive
*/
if(inbound)
/* He is proposing what I should send */
ppp->xstate &= ~SC_COMP_RUN;
else
/* I am proposing to what he should send */
ppp->rstate &= ~SC_DECOMP_RUN;
break;
case CCP_TERMREQ:
case CCP_TERMACK:
/*
* CCP is going down - disable compression.
* CCP is going down, both directions of transmission
*/
if (inbound)
ppp->rstate &= ~SC_DECOMP_RUN;
else
ppp->xstate &= ~SC_COMP_RUN;
ppp->rstate &= ~SC_DECOMP_RUN;
ppp->xstate &= ~SC_COMP_RUN;
break;
case CCP_CONFACK:
......
......@@ -2028,9 +2028,18 @@ static int wavelan_ioctl(struct net_device *dev, /* device on which the ioctl is
if (wrq->u.data.pointer != (caddr_t) 0) {
struct iw_range range;
/* Set the length (useless: it's constant). */
/* Set the length (very important for backward
* compatibility) */
wrq->u.data.length = sizeof(struct iw_range);
/* Set all the info we don't care or don't know
* about to zero */
memset(&range, 0, sizeof(range));
/* Set the Wireless Extension versions */
range.we_version_compiled = WIRELESS_EXT;
range.we_version_source = 9;
/* Set information in the range struct. */
range.throughput = 1.6 * 1000 * 1000; /* don't argue on this ! */
range.min_nwid = 0x0000;
......
......@@ -104,7 +104,7 @@ Scsi_Cmnd *last_cmnd;
const unsigned char scsi_command_size[8] =
{
6, 10, 10, 12,
12, 12, 10, 10
16, 12, 10, 10
};
static unsigned long serial_number;
static Scsi_Cmnd *scsi_bh_queue_head;
......@@ -833,9 +833,6 @@ void scsi_do_req(Scsi_Request * SRpnt, const void *cmnd,
SRpnt->sr_done = done;
SRpnt->sr_timeout_per_command = timeout;
memcpy((void *) SRpnt->sr_cmnd, (const void *) cmnd,
sizeof(SRpnt->sr_cmnd));
if (SRpnt->sr_cmd_len == 0)
SRpnt->sr_cmd_len = COMMAND_SIZE(SRpnt->sr_cmnd[0]);
......
......@@ -2253,7 +2253,7 @@ static int ymfpci_memalloc(ymfpci_t *codec)
/* move this volume setup to mixer */
ymfpci_writel(codec, YDSXGR_NATIVEDACOUTVOL, 0x3fff3fff);
ymfpci_writel(codec, YDSXGR_BUF441OUTVOL, 0x3fff3fff);
ymfpci_writel(codec, YDSXGR_BUF441OUTVOL, 0);
ymfpci_writel(codec, YDSXGR_NATIVEADCINVOL, 0x3fff3fff);
ymfpci_writel(codec, YDSXGR_NATIVEDACINVOL, 0x3fff3fff);
......
......@@ -326,12 +326,6 @@ static void hub_get(struct usb_hub *hub)
static void hub_put(struct usb_hub *hub)
{
if (atomic_dec_and_test(&hub->refcnt)) {
if (hub->urb) {
usb_unlink_urb(hub->urb);
usb_free_urb(hub->urb);
hub->urb = NULL;
}
if (hub->descriptor) {
kfree(hub->descriptor);
hub->descriptor = NULL;
......@@ -346,6 +340,12 @@ static void hub_disconnect(struct usb_device *dev, void *ptr)
struct usb_hub *hub = (struct usb_hub *)ptr;
unsigned long flags;
if (hub->urb) {
usb_unlink_urb(hub->urb);
usb_free_urb(hub->urb);
hub->urb = NULL;
}
spin_lock_irqsave(&hub_event_lock, flags);
/* Delete it and then reset it */
......
This diff is collapsed.
This diff is collapsed.
......@@ -4,36 +4,6 @@
#include <linux/list.h>
#include <linux/usb.h>
/*
* This nested spinlock code is courtesy of Davide Libenzi <dlibenzi@maticad.it>
*/
struct s_nested_lock {
spinlock_t lock;
void *uniq;
short int count;
};
#define nested_init(snl) \
spin_lock_init(&(snl)->lock); \
(snl)->uniq = NULL; \
(snl)->count = 0;
#define nested_lock(snl, flags) \
if ((snl)->uniq == current) { \
(snl)->count++; \
flags = 0; /* No warnings */ \
} else { \
spin_lock_irqsave(&(snl)->lock, flags); \
(snl)->count++; \
(snl)->uniq = current; \
}
#define nested_unlock(snl, flags) \
if (!--(snl)->count) { \
(snl)->uniq = NULL; \
spin_unlock_irqrestore(&(snl)->lock, flags); \
}
/*
* Universal Host Controller Interface data structures and defines
*/
......@@ -97,24 +67,29 @@ struct s_nested_lock {
#define UHCI_MAX_SOF_NUMBER 2047 /* in an SOF packet */
#define CAN_SCHEDULE_FRAMES 1000 /* how far future frames can be scheduled */
struct uhci_framelist {
struct uhci_frame_list {
__u32 frame[UHCI_NUMFRAMES];
} __attribute__((aligned(4096)));
struct uhci_td;
void *frame_cpu[UHCI_NUMFRAMES];
dma_addr_t dma_handle;
};
struct urb_priv;
struct uhci_qh {
/* Hardware fields */
__u32 link; /* Next queue */
__u32 element; /* Queue element pointer */
__u32 link; /* Next queue */
__u32 element; /* Queue element pointer */
/* Software fields */
/* Can't use list_head since we want a specific order */
struct usb_device *dev; /* The owning device */
dma_addr_t dma_handle;
struct uhci_qh *prevqh, *nextqh;
struct usb_device *dev;
struct urb_priv *urbp;
struct list_head remove_list;
struct list_head list; /* P: uhci->frame_list_lock */
struct list_head remove_list; /* P: uhci->remove_list_lock */
} __attribute__((aligned(16)));
/*
......@@ -141,8 +116,6 @@ struct uhci_qh {
#define uhci_status_bits(ctrl_sts) (ctrl_sts & 0xFE0000)
#define uhci_actual_length(ctrl_sts) ((ctrl_sts + 1) & TD_CTRL_ACTLEN_MASK) /* 1-based */
#define uhci_ptr_to_virt(x) bus_to_virt(x & ~UHCI_PTR_BITS)
/*
* for TD <info>: (a.k.a. Token)
*/
......@@ -170,7 +143,8 @@ struct uhci_qh {
* On 64-bit machines we probably want to take advantage of the fact that
* hw doesn't really care about the size of the sw-only area.
*
* Alas, not anymore, we have more than 4 words for software, woops
* Alas, not anymore, we have more than 4 words for software, woops.
* Everything still works tho, surprise! -jerdfelt
*/
struct uhci_td {
/* Hardware fields */
......@@ -180,13 +154,15 @@ struct uhci_td {
__u32 buffer;
/* Software fields */
unsigned int *frameptr; /* Frame list pointer */
struct uhci_td *prevtd, *nexttd; /* Previous and next TD in queue */
dma_addr_t dma_handle;
struct usb_device *dev;
struct urb *urb; /* URB this TD belongs to */
struct urb *urb;
struct list_head list;
struct list_head list; /* P: urb->lock */
int frame;
struct list_head fl_list; /* P: frame_list_lock */
} __attribute__((aligned(16)));
/*
......@@ -289,8 +265,9 @@ static inline int __interval_to_skel(int interval)
}
struct virt_root_hub {
struct usb_device *dev;
int devnum; /* Address of Root Hub endpoint */
void *urb;
struct urb *urb;
void *int_addr;
int send;
int interval;
......@@ -306,6 +283,12 @@ struct virt_root_hub {
* a subset of what the full implementation needs.
*/
struct uhci {
struct pci_dev *dev;
/* procfs */
int num;
struct proc_dir_entry *proc_entry;
/* Grabbed from PCI */
int irq;
unsigned int io_addr;
......@@ -313,32 +296,43 @@ struct uhci {
struct list_head uhci_list;
struct pci_pool *qh_pool;
struct pci_pool *td_pool;
struct usb_bus *bus;
struct uhci_td skeltd[UHCI_NUM_SKELTD]; /* Skeleton TD's */
struct uhci_qh skelqh[UHCI_NUM_SKELQH]; /* Skeleton QH's */
struct uhci_td *skeltd[UHCI_NUM_SKELTD]; /* Skeleton TD's */
struct uhci_qh *skelqh[UHCI_NUM_SKELQH]; /* Skeleton QH's */
spinlock_t framelist_lock;
struct uhci_framelist *fl; /* Frame list */
spinlock_t frame_list_lock;
struct uhci_frame_list *fl; /* Frame list */
int fsbr; /* Full speed bandwidth reclamation */
int is_suspended;
spinlock_t qh_remove_lock;
spinlock_t qh_remove_list_lock;
struct list_head qh_remove_list;
spinlock_t urb_remove_lock;
spinlock_t urb_remove_list_lock;
struct list_head urb_remove_list;
struct s_nested_lock urblist_lock;
spinlock_t urb_list_lock;
struct list_head urb_list;
spinlock_t complete_list_lock;
struct list_head complete_list;
struct virt_root_hub rh; /* private data of the virtual root hub */
};
struct urb_priv {
struct urb *urb;
struct usb_device *dev;
dma_addr_t setup_packet_dma_handle;
dma_addr_t transfer_buffer_dma_handle;
struct uhci_qh *qh; /* QH for this URB */
struct list_head td_list;
int fsbr : 1; /* URB turned on FSBR */
int fsbr_timeout : 1; /* URB timed out on FSBR */
......@@ -347,11 +341,12 @@ struct urb_priv {
/* a control transfer, retrigger */
/* the status phase */
unsigned long inserttime; /* In jiffies */
int status; /* Final status */
struct list_head list;
unsigned long inserttime; /* In jiffies */
struct list_head urb_queue_list; /* URB's linked together */
struct list_head queue_list;
struct list_head complete_list;
};
/* -------------------------------------------------------------------------
......@@ -409,15 +404,5 @@ struct urb_priv {
#define RH_REQ_ERR -1
#define RH_NACK 0x00
/* needed for the debugging code */
struct uhci_td *uhci_link_to_td(unsigned int element);
/* Debugging code */
void uhci_show_td(struct uhci_td *td);
void uhci_show_status(struct uhci *uhci);
void uhci_show_urb_queue(struct urb *urb);
void uhci_show_queue(struct uhci_qh *qh);
void uhci_show_queues(struct uhci *uhci);
#endif
This diff is collapsed.
......@@ -380,6 +380,8 @@ typedef struct ohci {
int irq;
int disabled; /* e.g. got a UE, we're hung */
atomic_t resume_count; /* defending against multiple resumes */
unsigned long flags; /* for HC bugs */
#define OHCI_QUIRK_AMD756 0x01 /* erratum #4 */
struct ohci_regs * regs; /* OHCI controller's memory */
struct list_head ohci_hcd_list; /* list of all ohci_hcd */
......
......@@ -2,7 +2,7 @@
* drivers/usb/usb.c
*
* (C) Copyright Linus Torvalds 1999
* (C) Copyright Johannes Erdfelt 1999
* (C) Copyright Johannes Erdfelt 1999-2001
* (C) Copyright Andreas Gal 1999
* (C) Copyright Gregory P. Smith 1999
* (C) Copyright Deti Fliegl 1999 (new USB architecture)
......@@ -18,8 +18,6 @@
* Think of this as a "USB library" rather than anything else.
* It should be considered a slave, with no callbacks. Callbacks
* are evil.
*
* $Id: usb.c,v 1.53 2000/01/14 16:19:09 acher Exp $
*/
#include <linux/config.h>
......@@ -340,6 +338,17 @@ void usb_release_bandwidth(struct usb_device *dev, struct urb *urb, int isoc)
urb->bandwidth = 0;
}
static void usb_bus_get(struct usb_bus *bus)
{
atomic_inc(&bus->refcnt);
}
static void usb_bus_put(struct usb_bus *bus)
{
if (atomic_dec_and_test(&bus->refcnt))
kfree(bus);
}
/**
* usb_alloc_bus - creates a new USB host controller structure
* @op: pointer to a struct usb_operations that this bus structure should use
......@@ -377,6 +386,8 @@ struct usb_bus *usb_alloc_bus(struct usb_operations *op)
INIT_LIST_HEAD(&bus->bus_list);
INIT_LIST_HEAD(&bus->inodes);
atomic_set(&bus->refcnt, 1);
return bus;
}
......@@ -391,7 +402,7 @@ void usb_free_bus(struct usb_bus *bus)
if (!bus)
return;
kfree(bus);
usb_bus_put(bus);
}
/**
......@@ -411,6 +422,8 @@ void usb_register_bus(struct usb_bus *bus)
} else
warn("too many buses");
usb_bus_get(bus);
/* Add it to the list of buses */
list_add(&bus->bus_list, &usb_bus_list);
......@@ -439,6 +452,8 @@ void usb_deregister_bus(struct usb_bus *bus)
usbdevfs_remove_bus(bus);
clear_bit(bus->busnum, busmap.busmap);
usb_bus_put(bus);
}
/*
......@@ -902,6 +917,8 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus)
memset(dev, 0, sizeof(*dev));
usb_bus_get(bus);
dev->bus = bus;
dev->parent = parent;
atomic_set(&dev->refcnt, 1);
......@@ -918,6 +935,9 @@ void usb_free_dev(struct usb_device *dev)
if (atomic_dec_and_test(&dev->refcnt)) {
dev->bus->op->deallocate(dev);
usb_destroy_configuration(dev);
usb_bus_put(dev->bus);
kfree(dev);
}
}
......
This diff is collapsed.
This diff is collapsed.
......@@ -233,7 +233,7 @@ affs_notify_change(struct dentry *dentry, struct iattr *attr)
goto out;
}
error = inode_setattr(inode, attr);
inode_setattr(inode, attr);
if (!error && (attr->ia_valid & ATTR_MODE))
mode_to_prot(inode);
out:
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment