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> ...@@ -37,7 +37,7 @@ Copyright (C) 1999-2000 Maxim Krasnyansky <max_mk@yahoo.com>
alias char-major-10-200 tun alias char-major-10-200 tun
Run: Run:
modprobe -a depmod -a
Driver will be automatically loaded when application access /dev/net/tun. Driver will be automatically loaded when application access /dev/net/tun.
......
...@@ -140,6 +140,11 @@ P: Riccardo Facchetti ...@@ -140,6 +140,11 @@ P: Riccardo Facchetti
M: fizban@tin.it M: fizban@tin.it
S: Maintained S: Maintained
AFFS FILE SYSTEM
P: Roman Zippel
M: zippel@linux-m68k.org
S: Maintained
AHA152X SCSI DRIVER AHA152X SCSI DRIVER
P: Juergen E. Fischer P: Juergen E. Fischer
M: Juergen Fischer <fischer@norbit.de> M: Juergen Fischer <fischer@norbit.de>
......
VERSION = 2 VERSION = 2
PATCHLEVEL = 4 PATCHLEVEL = 4
SUBLEVEL = 4 SUBLEVEL = 4
EXTRAVERSION =-pre6 EXTRAVERSION =-pre7
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
......
...@@ -80,11 +80,6 @@ EXPORT_SYMBOL_NOVERS(__down_failed); ...@@ -80,11 +80,6 @@ EXPORT_SYMBOL_NOVERS(__down_failed);
EXPORT_SYMBOL_NOVERS(__down_failed_interruptible); EXPORT_SYMBOL_NOVERS(__down_failed_interruptible);
EXPORT_SYMBOL_NOVERS(__down_failed_trylock); EXPORT_SYMBOL_NOVERS(__down_failed_trylock);
EXPORT_SYMBOL_NOVERS(__up_wakeup); 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. */ /* Networking helper routines. */
EXPORT_SYMBOL(csum_partial_copy_generic); EXPORT_SYMBOL(csum_partial_copy_generic);
/* Delay loops */ /* Delay loops */
......
...@@ -9,7 +9,7 @@ L_TARGET = lib.a ...@@ -9,7 +9,7 @@ L_TARGET = lib.a
obj-y = checksum.o old-checksum.o delay.o \ obj-y = checksum.o old-checksum.o delay.o \
usercopy.o getuser.o putuser.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_X86_USE_3DNOW) += mmx.o
obj-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.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 @@ ...@@ -38,7 +38,8 @@
#include <linux/kbd_kern.h> #include <linux/kbd_kern.h>
#if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(__alpha__) || \ #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; static int x86_sysrq_alt = 0;
#ifdef CONFIG_SPARC64 #ifdef CONFIG_SPARC64
...@@ -63,8 +64,46 @@ static unsigned short x86_keycodes[256] = ...@@ -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, 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 }; 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) 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]) if (keycode > 255 || !x86_keycodes[keycode])
return -1; return -1;
...@@ -77,6 +116,7 @@ static int emulate_raw(unsigned int keycode, int down) ...@@ -77,6 +116,7 @@ static int emulate_raw(unsigned int keycode, int down)
if (keycode == KEY_SYSRQ && x86_sysrq_alt) { if (keycode == KEY_SYSRQ && x86_sysrq_alt) {
handle_scancode(0x54, down); handle_scancode(0x54, down);
return 0; return 0;
} }
...@@ -107,29 +147,7 @@ static int emulate_raw(unsigned int keycode, int down) ...@@ -107,29 +147,7 @@ static int emulate_raw(unsigned int keycode, int down)
return 0; return 0;
} }
#elif defined(CONFIG_ADB_KEYBOARD) #endif /* CONFIG_X86 || CONFIG_IA64 || __alpha__ || __mips__ || CONFIG_PPC */
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
static struct input_handler keybdev_handler; static struct input_handler keybdev_handler;
......
...@@ -227,7 +227,7 @@ fi ...@@ -227,7 +227,7 @@ fi
tristate 'PPP (point-to-point protocol) support' CONFIG_PPP tristate 'PPP (point-to-point protocol) support' CONFIG_PPP
if [ ! "$CONFIG_PPP" = "n" ]; then if [ ! "$CONFIG_PPP" = "n" ]; then
dep_bool ' PPP multilink support (EXPERIMENTAL)' CONFIG_PPP_MULTILINK $CONFIG_EXPERIMENTAL 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 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 support for sync tty ports' CONFIG_PPP_SYNC_TTY $CONFIG_PPP
dep_tristate ' PPP Deflate compression' CONFIG_PPP_DEFLATE $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, ...@@ -456,23 +456,22 @@ static int __init dmfe_init_one (struct pci_dev *pdev,
for (i = 0; i < 64; i++) for (i = 0; i < 64; i++)
((u16 *) db->srom)[i] = read_srom_word(pci_iobase, 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 */ /* Set Node address */
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++)
dev->dev_addr[i] = db->srom[20 + 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); i = register_netdev(dev);
if (i) if (i)
goto err_out_res; 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; return 0;
err_out_res: err_out_res:
...@@ -726,6 +725,7 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -726,6 +725,7 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)
struct tx_desc *txptr; struct tx_desc *txptr;
struct dmfe_board_info *db; struct dmfe_board_info *db;
u32 ioaddr; u32 ioaddr;
unsigned long flags;
if (!dev) { if (!dev) {
DMFE_DBUG(1, "dmfe_interrupt() without device arg", 0); 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) ...@@ -737,7 +737,7 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)
DMFE_DBUG(0, "dmfe_interrupt()", 0); 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 */ /* Disable all interrupt in CR7 to solve the interrupt edge problem */
outl(0, ioaddr + DCR7); outl(0, ioaddr + DCR7);
...@@ -754,7 +754,7 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -754,7 +754,7 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)
netif_stop_queue(dev); netif_stop_queue(dev);
db->wait_reset = 1; /* Need to RESET */ db->wait_reset = 1; /* Need to RESET */
outl(0, ioaddr + DCR7); /* disable all interrupt */ outl(0, ioaddr + DCR7); /* disable all interrupt */
spin_unlock_irq(&db->lock); spin_unlock_irqrestore(&db->lock, flags);
return; return;
} }
...@@ -808,7 +808,7 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -808,7 +808,7 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)
db->cr7_data = 0x1a2cd; db->cr7_data = 0x1a2cd;
outl(db->cr7_data, ioaddr + DCR7); 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) ...@@ -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) static void dmfe_set_filter_mode(struct net_device *dev)
{ {
struct dmfe_board_info *db = dev->priv; struct dmfe_board_info *db = dev->priv;
unsigned long flags;
DMFE_DBUG(0, "dmfe_set_filter_mode()", 0); DMFE_DBUG(0, "dmfe_set_filter_mode()", 0);
spin_lock_irqsave(&db->lock, flags);
if (dev->flags & IFF_PROMISC) { if (dev->flags & IFF_PROMISC) {
DMFE_DBUG(0, "Enable PROM Mode", 0); DMFE_DBUG(0, "Enable PROM Mode", 0);
db->cr6_data |= CR6_PM | CR6_PBF; db->cr6_data |= CR6_PM | CR6_PBF;
update_cr6(db->cr6_data, db->ioaddr); update_cr6(db->cr6_data, db->ioaddr);
spin_unlock_irqrestore(&db->lock, flags);
return; return;
} }
if (dev->flags & IFF_ALLMULTI || dev->mc_count > DMFE_MAX_MULTICAST) { if (dev->flags & IFF_ALLMULTI || dev->mc_count > DMFE_MAX_MULTICAST) {
DMFE_DBUG(0, "Pass all multicast address", dev->mc_count); DMFE_DBUG(0, "Pass all multicast address", dev->mc_count);
db->cr6_data &= ~(CR6_PM | CR6_PBF); db->cr6_data &= ~(CR6_PM | CR6_PBF);
db->cr6_data |= CR6_PAM; db->cr6_data |= CR6_PAM;
spin_unlock_irqrestore(&db->lock, flags);
return; return;
} }
DMFE_DBUG(0, "Set multicast address", dev->mc_count); DMFE_DBUG(0, "Set multicast address", dev->mc_count);
...@@ -920,6 +924,7 @@ static void dmfe_set_filter_mode(struct net_device *dev) ...@@ -920,6 +924,7 @@ static void dmfe_set_filter_mode(struct net_device *dev)
dm9132_id_table(dev, dev->mc_count); /* DM9132 */ dm9132_id_table(dev, dev->mc_count); /* DM9132 */
else else
send_filter_frame(dev, dev->mc_count); /* DM9102/DM9102A */ 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) ...@@ -946,12 +951,16 @@ static void dmfe_timer(unsigned long data)
unsigned char tmp_cr12; unsigned char tmp_cr12;
struct net_device *dev = (struct net_device *) data; struct net_device *dev = (struct net_device *) data;
struct dmfe_board_info *db = (struct dmfe_board_info *) dev->priv; struct dmfe_board_info *db = (struct dmfe_board_info *) dev->priv;
unsigned long flags;
DMFE_DBUG(0, "dmfe_timer()", 0); DMFE_DBUG(0, "dmfe_timer()", 0);
spin_lock_irqsave(&db->lock, flags);
/* Do reset now */ /* Do reset now */
if (db->in_reset_state) if (db->in_reset_state) {
spin_unlock_irqrestore(&db->lock, flags);
return; return;
}
/* Operating Mode Check */ /* Operating Mode Check */
if ((db->dm910x_chk_mode & 0x1) && (db->stats.rx_packets > MAX_CHECK_PACKET)) { if ((db->dm910x_chk_mode & 0x1) && (db->stats.rx_packets > MAX_CHECK_PACKET)) {
...@@ -983,6 +992,7 @@ static void dmfe_timer(unsigned long data) ...@@ -983,6 +992,7 @@ static void dmfe_timer(unsigned long data)
dmfe_dynamic_reset(dev); dmfe_dynamic_reset(dev);
db->timer.expires = jiffies + DMFE_TIMER_WUT; db->timer.expires = jiffies + DMFE_TIMER_WUT;
add_timer(&db->timer); add_timer(&db->timer);
spin_unlock_irqrestore(&db->lock, flags);
return; return;
} }
db->rx_error_cnt = 0; /* Clear previos counter */ db->rx_error_cnt = 0; /* Clear previos counter */
...@@ -1038,6 +1048,7 @@ static void dmfe_timer(unsigned long data) ...@@ -1038,6 +1048,7 @@ static void dmfe_timer(unsigned long data)
/* Timer active again */ /* Timer active again */
db->timer.expires = jiffies + DMFE_TIMER_WUT; db->timer.expires = jiffies + DMFE_TIMER_WUT;
add_timer(&db->timer); 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) ...@@ -1233,19 +1244,16 @@ static void send_filter_frame(struct net_device *dev, int mc_cnt)
struct dmfe_board_info *db = dev->priv; struct dmfe_board_info *db = dev->priv;
struct dev_mc_list *mcptr; struct dev_mc_list *mcptr;
struct tx_desc *txptr; struct tx_desc *txptr;
unsigned long flags;
u16 *addrptr; u16 *addrptr;
u32 *suptr; u32 *suptr;
int i; int i;
DMFE_DBUG(0, "send_filter_frame()", 0); DMFE_DBUG(0, "send_filter_frame()", 0);
spin_lock_irqsave(&db->lock, flags);
txptr = db->tx_insert_ptr; txptr = db->tx_insert_ptr;
suptr = (u32 *) txptr->tx_buf_ptr; suptr = (u32 *) txptr->tx_buf_ptr;
if (txptr->tdes0 & 0x80000000) { if (txptr->tdes0 & 0x80000000) {
spin_unlock_irqrestore(&db->lock, flags);
printk(KERN_WARNING "%s: Too busy to send filter frame\n", printk(KERN_WARNING "%s: Too busy to send filter frame\n",
dev->name); dev->name);
return; return;
...@@ -1284,7 +1292,6 @@ static void send_filter_frame(struct net_device *dev, int mc_cnt) ...@@ -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); update_cr6(db->cr6_data | 0x2000, dev->base_addr);
outl(0x1, dev->base_addr + DCR1); /* Issue Tx polling command */ outl(0x1, dev->base_addr + DCR1); /* Issue Tx polling command */
update_cr6(db->cr6_data, dev->base_addr); 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. ...@@ -21,6 +21,7 @@ static const char *version = "hermes.c: 12 Dec 2000 David Gibson <hermes@gibson.
#include <linux/module.h> #include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/threads.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <asm/io.h> #include <asm/io.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
......
This diff is collapsed.
...@@ -710,8 +710,17 @@ static int netwave_ioctl(struct net_device *dev, /* ioctl device */ ...@@ -710,8 +710,17 @@ static int netwave_ioctl(struct net_device *dev, /* ioctl device */
if(wrq->u.data.pointer != (caddr_t) 0) { if(wrq->u.data.pointer != (caddr_t) 0) {
struct iw_range range; 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); 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 */ /* Set information in the range struct */
range.throughput = 450 * 1000; /* don't argue on this ! */ 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) ...@@ -1332,9 +1332,15 @@ static int ray_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
struct iw_range range; struct iw_range range;
memset((char *) &range, 0, sizeof(struct iw_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); 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 */ /* Set information in the range struct */
range.throughput = 1.1 * 1000 * 1000; /* Put the right number here */ range.throughput = 1.1 * 1000 * 1000; /* Put the right number here */
range.num_channels = hop_pattern_length[(int)country]; range.num_channels = hop_pattern_length[(int)country];
......
...@@ -2239,9 +2239,16 @@ wavelan_ioctl(struct net_device * dev, /* Device on wich the ioctl apply */ ...@@ -2239,9 +2239,16 @@ wavelan_ioctl(struct net_device * dev, /* Device on wich the ioctl apply */
{ {
struct iw_range range; 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); 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 */ /* Set information in the range struct */
range.throughput = 1.4 * 1000 * 1000; /* don't argue on this ! */ range.throughput = 1.4 * 1000 * 1000; /* don't argue on this ! */
range.min_nwid = 0x0000; range.min_nwid = 0x0000;
......
...@@ -1988,15 +1988,30 @@ ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound) ...@@ -1988,15 +1988,30 @@ ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound)
switch (CCP_CODE(dp)) { switch (CCP_CODE(dp)) {
case CCP_CONFREQ: 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_TERMREQ:
case CCP_TERMACK: case CCP_TERMACK:
/* /*
* CCP is going down - disable compression. * CCP is going down, both directions of transmission
*/ */
if (inbound) ppp->rstate &= ~SC_DECOMP_RUN;
ppp->rstate &= ~SC_DECOMP_RUN; ppp->xstate &= ~SC_COMP_RUN;
else
ppp->xstate &= ~SC_COMP_RUN;
break; break;
case CCP_CONFACK: case CCP_CONFACK:
......
...@@ -2028,9 +2028,18 @@ static int wavelan_ioctl(struct net_device *dev, /* device on which the ioctl is ...@@ -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) { if (wrq->u.data.pointer != (caddr_t) 0) {
struct iw_range range; 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); 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. */ /* Set information in the range struct. */
range.throughput = 1.6 * 1000 * 1000; /* don't argue on this ! */ range.throughput = 1.6 * 1000 * 1000; /* don't argue on this ! */
range.min_nwid = 0x0000; range.min_nwid = 0x0000;
......
...@@ -104,7 +104,7 @@ Scsi_Cmnd *last_cmnd; ...@@ -104,7 +104,7 @@ Scsi_Cmnd *last_cmnd;
const unsigned char scsi_command_size[8] = const unsigned char scsi_command_size[8] =
{ {
6, 10, 10, 12, 6, 10, 10, 12,
12, 12, 10, 10 16, 12, 10, 10
}; };
static unsigned long serial_number; static unsigned long serial_number;
static Scsi_Cmnd *scsi_bh_queue_head; static Scsi_Cmnd *scsi_bh_queue_head;
...@@ -833,9 +833,6 @@ void scsi_do_req(Scsi_Request * SRpnt, const void *cmnd, ...@@ -833,9 +833,6 @@ void scsi_do_req(Scsi_Request * SRpnt, const void *cmnd,
SRpnt->sr_done = done; SRpnt->sr_done = done;
SRpnt->sr_timeout_per_command = timeout; SRpnt->sr_timeout_per_command = timeout;
memcpy((void *) SRpnt->sr_cmnd, (const void *) cmnd,
sizeof(SRpnt->sr_cmnd));
if (SRpnt->sr_cmd_len == 0) if (SRpnt->sr_cmd_len == 0)
SRpnt->sr_cmd_len = COMMAND_SIZE(SRpnt->sr_cmnd[0]); SRpnt->sr_cmd_len = COMMAND_SIZE(SRpnt->sr_cmnd[0]);
......
...@@ -2253,7 +2253,7 @@ static int ymfpci_memalloc(ymfpci_t *codec) ...@@ -2253,7 +2253,7 @@ static int ymfpci_memalloc(ymfpci_t *codec)
/* move this volume setup to mixer */ /* move this volume setup to mixer */
ymfpci_writel(codec, YDSXGR_NATIVEDACOUTVOL, 0x3fff3fff); 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_NATIVEADCINVOL, 0x3fff3fff);
ymfpci_writel(codec, YDSXGR_NATIVEDACINVOL, 0x3fff3fff); ymfpci_writel(codec, YDSXGR_NATIVEDACINVOL, 0x3fff3fff);
......
...@@ -326,12 +326,6 @@ static void hub_get(struct usb_hub *hub) ...@@ -326,12 +326,6 @@ static void hub_get(struct usb_hub *hub)
static void hub_put(struct usb_hub *hub) static void hub_put(struct usb_hub *hub)
{ {
if (atomic_dec_and_test(&hub->refcnt)) { 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) { if (hub->descriptor) {
kfree(hub->descriptor); kfree(hub->descriptor);
hub->descriptor = NULL; hub->descriptor = NULL;
...@@ -346,6 +340,12 @@ static void hub_disconnect(struct usb_device *dev, void *ptr) ...@@ -346,6 +340,12 @@ static void hub_disconnect(struct usb_device *dev, void *ptr)
struct usb_hub *hub = (struct usb_hub *)ptr; struct usb_hub *hub = (struct usb_hub *)ptr;
unsigned long flags; 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); spin_lock_irqsave(&hub_event_lock, flags);
/* Delete it and then reset it */ /* Delete it and then reset it */
......
This diff is collapsed.
This diff is collapsed.
...@@ -4,36 +4,6 @@ ...@@ -4,36 +4,6 @@
#include <linux/list.h> #include <linux/list.h>
#include <linux/usb.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 * Universal Host Controller Interface data structures and defines
*/ */
...@@ -97,24 +67,29 @@ struct s_nested_lock { ...@@ -97,24 +67,29 @@ struct s_nested_lock {
#define UHCI_MAX_SOF_NUMBER 2047 /* in an SOF packet */ #define UHCI_MAX_SOF_NUMBER 2047 /* in an SOF packet */
#define CAN_SCHEDULE_FRAMES 1000 /* how far future frames can be scheduled */ #define CAN_SCHEDULE_FRAMES 1000 /* how far future frames can be scheduled */
struct uhci_framelist { struct uhci_frame_list {
__u32 frame[UHCI_NUMFRAMES]; __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 { struct uhci_qh {
/* Hardware fields */ /* Hardware fields */
__u32 link; /* Next queue */ __u32 link; /* Next queue */
__u32 element; /* Queue element pointer */ __u32 element; /* Queue element pointer */
/* Software fields */ /* Software fields */
/* Can't use list_head since we want a specific order */ dma_addr_t dma_handle;
struct usb_device *dev; /* The owning device */
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))); } __attribute__((aligned(16)));
/* /*
...@@ -141,8 +116,6 @@ struct uhci_qh { ...@@ -141,8 +116,6 @@ struct uhci_qh {
#define uhci_status_bits(ctrl_sts) (ctrl_sts & 0xFE0000) #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_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) * for TD <info>: (a.k.a. Token)
*/ */
...@@ -170,7 +143,8 @@ struct uhci_qh { ...@@ -170,7 +143,8 @@ struct uhci_qh {
* On 64-bit machines we probably want to take advantage of the fact that * 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. * 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 { struct uhci_td {
/* Hardware fields */ /* Hardware fields */
...@@ -180,13 +154,15 @@ struct uhci_td { ...@@ -180,13 +154,15 @@ struct uhci_td {
__u32 buffer; __u32 buffer;
/* Software fields */ /* Software fields */
unsigned int *frameptr; /* Frame list pointer */ dma_addr_t dma_handle;
struct uhci_td *prevtd, *nexttd; /* Previous and next TD in queue */
struct usb_device *dev; 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))); } __attribute__((aligned(16)));
/* /*
...@@ -289,8 +265,9 @@ static inline int __interval_to_skel(int interval) ...@@ -289,8 +265,9 @@ static inline int __interval_to_skel(int interval)
} }
struct virt_root_hub { struct virt_root_hub {
struct usb_device *dev;
int devnum; /* Address of Root Hub endpoint */ int devnum; /* Address of Root Hub endpoint */
void *urb; struct urb *urb;
void *int_addr; void *int_addr;
int send; int send;
int interval; int interval;
...@@ -306,6 +283,12 @@ struct virt_root_hub { ...@@ -306,6 +283,12 @@ struct virt_root_hub {
* a subset of what the full implementation needs. * a subset of what the full implementation needs.
*/ */
struct uhci { struct uhci {
struct pci_dev *dev;
/* procfs */
int num;
struct proc_dir_entry *proc_entry;
/* Grabbed from PCI */ /* Grabbed from PCI */
int irq; int irq;
unsigned int io_addr; unsigned int io_addr;
...@@ -313,32 +296,43 @@ struct uhci { ...@@ -313,32 +296,43 @@ struct uhci {
struct list_head uhci_list; struct list_head uhci_list;
struct pci_pool *qh_pool;
struct pci_pool *td_pool;
struct usb_bus *bus; struct usb_bus *bus;
struct uhci_td skeltd[UHCI_NUM_SKELTD]; /* Skeleton TD's */ struct uhci_td *skeltd[UHCI_NUM_SKELTD]; /* Skeleton TD's */
struct uhci_qh skelqh[UHCI_NUM_SKELQH]; /* Skeleton QH's */ struct uhci_qh *skelqh[UHCI_NUM_SKELQH]; /* Skeleton QH's */
spinlock_t framelist_lock; spinlock_t frame_list_lock;
struct uhci_framelist *fl; /* Frame list */ struct uhci_frame_list *fl; /* Frame list */
int fsbr; /* Full speed bandwidth reclamation */ int fsbr; /* Full speed bandwidth reclamation */
int is_suspended; int is_suspended;
spinlock_t qh_remove_lock; spinlock_t qh_remove_list_lock;
struct list_head qh_remove_list; struct list_head qh_remove_list;
spinlock_t urb_remove_lock; spinlock_t urb_remove_list_lock;
struct list_head urb_remove_list; struct list_head urb_remove_list;
struct s_nested_lock urblist_lock; spinlock_t urb_list_lock;
struct list_head urb_list; 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 virt_root_hub rh; /* private data of the virtual root hub */
}; };
struct urb_priv { struct urb_priv {
struct urb *urb; 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 uhci_qh *qh; /* QH for this URB */
struct list_head td_list;
int fsbr : 1; /* URB turned on FSBR */ int fsbr : 1; /* URB turned on FSBR */
int fsbr_timeout : 1; /* URB timed out on FSBR */ int fsbr_timeout : 1; /* URB timed out on FSBR */
...@@ -347,11 +341,12 @@ struct urb_priv { ...@@ -347,11 +341,12 @@ struct urb_priv {
/* a control transfer, retrigger */ /* a control transfer, retrigger */
/* the status phase */ /* 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 { ...@@ -409,15 +404,5 @@ struct urb_priv {
#define RH_REQ_ERR -1 #define RH_REQ_ERR -1
#define RH_NACK 0x00 #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 #endif
This diff is collapsed.
...@@ -380,6 +380,8 @@ typedef struct ohci { ...@@ -380,6 +380,8 @@ typedef struct ohci {
int irq; int irq;
int disabled; /* e.g. got a UE, we're hung */ int disabled; /* e.g. got a UE, we're hung */
atomic_t resume_count; /* defending against multiple resumes */ 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 ohci_regs * regs; /* OHCI controller's memory */
struct list_head ohci_hcd_list; /* list of all ohci_hcd */ struct list_head ohci_hcd_list; /* list of all ohci_hcd */
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* drivers/usb/usb.c * drivers/usb/usb.c
* *
* (C) Copyright Linus Torvalds 1999 * (C) Copyright Linus Torvalds 1999
* (C) Copyright Johannes Erdfelt 1999 * (C) Copyright Johannes Erdfelt 1999-2001
* (C) Copyright Andreas Gal 1999 * (C) Copyright Andreas Gal 1999
* (C) Copyright Gregory P. Smith 1999 * (C) Copyright Gregory P. Smith 1999
* (C) Copyright Deti Fliegl 1999 (new USB architecture) * (C) Copyright Deti Fliegl 1999 (new USB architecture)
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
* Think of this as a "USB library" rather than anything else. * Think of this as a "USB library" rather than anything else.
* It should be considered a slave, with no callbacks. Callbacks * It should be considered a slave, with no callbacks. Callbacks
* are evil. * are evil.
*
* $Id: usb.c,v 1.53 2000/01/14 16:19:09 acher Exp $
*/ */
#include <linux/config.h> #include <linux/config.h>
...@@ -340,6 +338,17 @@ void usb_release_bandwidth(struct usb_device *dev, struct urb *urb, int isoc) ...@@ -340,6 +338,17 @@ void usb_release_bandwidth(struct usb_device *dev, struct urb *urb, int isoc)
urb->bandwidth = 0; 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 * usb_alloc_bus - creates a new USB host controller structure
* @op: pointer to a struct usb_operations that this bus structure should use * @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) ...@@ -377,6 +386,8 @@ struct usb_bus *usb_alloc_bus(struct usb_operations *op)
INIT_LIST_HEAD(&bus->bus_list); INIT_LIST_HEAD(&bus->bus_list);
INIT_LIST_HEAD(&bus->inodes); INIT_LIST_HEAD(&bus->inodes);
atomic_set(&bus->refcnt, 1);
return bus; return bus;
} }
...@@ -391,7 +402,7 @@ void usb_free_bus(struct usb_bus *bus) ...@@ -391,7 +402,7 @@ void usb_free_bus(struct usb_bus *bus)
if (!bus) if (!bus)
return; return;
kfree(bus); usb_bus_put(bus);
} }
/** /**
...@@ -411,6 +422,8 @@ void usb_register_bus(struct usb_bus *bus) ...@@ -411,6 +422,8 @@ void usb_register_bus(struct usb_bus *bus)
} else } else
warn("too many buses"); warn("too many buses");
usb_bus_get(bus);
/* Add it to the list of buses */ /* Add it to the list of buses */
list_add(&bus->bus_list, &usb_bus_list); list_add(&bus->bus_list, &usb_bus_list);
...@@ -439,6 +452,8 @@ void usb_deregister_bus(struct usb_bus *bus) ...@@ -439,6 +452,8 @@ void usb_deregister_bus(struct usb_bus *bus)
usbdevfs_remove_bus(bus); usbdevfs_remove_bus(bus);
clear_bit(bus->busnum, busmap.busmap); 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) ...@@ -902,6 +917,8 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus)
memset(dev, 0, sizeof(*dev)); memset(dev, 0, sizeof(*dev));
usb_bus_get(bus);
dev->bus = bus; dev->bus = bus;
dev->parent = parent; dev->parent = parent;
atomic_set(&dev->refcnt, 1); atomic_set(&dev->refcnt, 1);
...@@ -918,6 +935,9 @@ void usb_free_dev(struct usb_device *dev) ...@@ -918,6 +935,9 @@ void usb_free_dev(struct usb_device *dev)
if (atomic_dec_and_test(&dev->refcnt)) { if (atomic_dec_and_test(&dev->refcnt)) {
dev->bus->op->deallocate(dev); dev->bus->op->deallocate(dev);
usb_destroy_configuration(dev); usb_destroy_configuration(dev);
usb_bus_put(dev->bus);
kfree(dev); kfree(dev);
} }
} }
......
This diff is collapsed.
This diff is collapsed.
...@@ -233,7 +233,7 @@ affs_notify_change(struct dentry *dentry, struct iattr *attr) ...@@ -233,7 +233,7 @@ affs_notify_change(struct dentry *dentry, struct iattr *attr)
goto out; goto out;
} }
error = inode_setattr(inode, attr); inode_setattr(inode, attr);
if (!error && (attr->ia_valid & ATTR_MODE)) if (!error && (attr->ia_valid & ATTR_MODE))
mode_to_prot(inode); mode_to_prot(inode);
out: 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