Merge branch 'linux-2.6' into next
This commit is contained in:
Коммит
c280266a32
|
@ -24,7 +24,7 @@ real bad - it changes the behaviour of all unaligned instructions in user
|
|||
space, and might cause programs to fail unexpectedly.
|
||||
|
||||
To change the alignment trap behavior, simply echo a number into
|
||||
/proc/sys/debug/alignment. The number is made up from various bits:
|
||||
/proc/cpu/alignment. The number is made up from various bits:
|
||||
|
||||
bit behavior when set
|
||||
--- -----------------
|
||||
|
|
|
@ -114,11 +114,11 @@ modules.
|
|||
Then you must load the gadget serial driver. To load it as an
|
||||
ACM device (recommended for interoperability), do this:
|
||||
|
||||
modprobe g_serial use_acm=1
|
||||
modprobe g_serial
|
||||
|
||||
To load it as a vendor specific bulk in/out device, do this:
|
||||
|
||||
modprobe g_serial
|
||||
modprobe g_serial use_acm=0
|
||||
|
||||
This will also automatically load the underlying gadget peripheral
|
||||
controller driver. This must be done each time you reboot the gadget
|
||||
|
|
|
@ -49,8 +49,10 @@ it and 002/048 sometime later.
|
|||
|
||||
These files can be read as binary data. The binary data consists
|
||||
of first the device descriptor, then the descriptors for each
|
||||
configuration of the device. That information is also shown in
|
||||
text form by the /proc/bus/usb/devices file, described later.
|
||||
configuration of the device. Multi-byte fields in the device and
|
||||
configuration descriptors, but not other descriptors, are converted
|
||||
to host endianness by the kernel. This information is also shown
|
||||
in text form by the /proc/bus/usb/devices file, described later.
|
||||
|
||||
These files may also be used to write user-level drivers for the USB
|
||||
devices. You would open the /proc/bus/usb/BBB/DDD file read/write,
|
||||
|
|
|
@ -34,11 +34,12 @@ if usbmon is built into the kernel.
|
|||
Verify that bus sockets are present.
|
||||
|
||||
# ls /sys/kernel/debug/usbmon
|
||||
0s 0t 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u
|
||||
0s 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u
|
||||
#
|
||||
|
||||
Now you can choose to either use the sockets numbered '0' (to capture packets on
|
||||
all buses), and skip to step #3, or find the bus used by your device with step #2.
|
||||
Now you can choose to either use the socket '0u' (to capture packets on all
|
||||
buses), and skip to step #3, or find the bus used by your device with step #2.
|
||||
This allows to filter away annoying devices that talk continuously.
|
||||
|
||||
2. Find which bus connects to the desired device
|
||||
|
||||
|
@ -99,8 +100,9 @@ on the event type, but there is a set of words, common for all types.
|
|||
|
||||
Here is the list of words, from left to right:
|
||||
|
||||
- URB Tag. This is used to identify URBs is normally a kernel mode address
|
||||
of the URB structure in hexadecimal.
|
||||
- URB Tag. This is used to identify URBs, and is normally an in-kernel address
|
||||
of the URB structure in hexadecimal, but can be a sequence number or any
|
||||
other unique string, within reason.
|
||||
|
||||
- Timestamp in microseconds, a decimal number. The timestamp's resolution
|
||||
depends on available clock, and so it can be much worse than a microsecond
|
||||
|
|
|
@ -1527,10 +1527,10 @@ W: http://ebtables.sourceforge.net/
|
|||
S: Maintained
|
||||
|
||||
ECRYPT FILE SYSTEM
|
||||
P: Mike Halcrow, Phillip Hellewell
|
||||
M: mhalcrow@us.ibm.com, phillip@hellewell.homeip.net
|
||||
L: ecryptfs-devel@lists.sourceforge.net
|
||||
W: http://ecryptfs.sourceforge.net/
|
||||
P: Tyler Hicks, Dustin Kirkland
|
||||
M: tyhicks@linux.vnet.ibm.com, kirkland@canonical.com
|
||||
L: ecryptfs-devel@lists.launchpad.net
|
||||
W: https://launchpad.net/ecryptfs
|
||||
S: Supported
|
||||
|
||||
EDAC-CORE
|
||||
|
|
|
@ -630,7 +630,7 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq)
|
|||
return -ENOMEM;
|
||||
|
||||
sachip->clk = clk_get(me, "SA1111_CLK");
|
||||
if (!sachip->clk) {
|
||||
if (IS_ERR(sachip->clk)) {
|
||||
ret = PTR_ERR(sachip->clk);
|
||||
goto err_free;
|
||||
}
|
||||
|
|
|
@ -115,6 +115,8 @@ EXPORT_SYMBOL(__strnlen_user);
|
|||
EXPORT_SYMBOL(__strncpy_from_user);
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
EXPORT_SYMBOL(copy_page);
|
||||
|
||||
EXPORT_SYMBOL(__copy_from_user);
|
||||
EXPORT_SYMBOL(__copy_to_user);
|
||||
EXPORT_SYMBOL(__clear_user);
|
||||
|
@ -181,8 +183,6 @@ EXPORT_SYMBOL(_find_first_bit_be);
|
|||
EXPORT_SYMBOL(_find_next_bit_be);
|
||||
#endif
|
||||
|
||||
EXPORT_SYMBOL(copy_page);
|
||||
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
EXPORT_SYMBOL(mcount);
|
||||
#endif
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/personality.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
|
|
|
@ -12,9 +12,8 @@ extern void clear_reset_status(unsigned int mask);
|
|||
|
||||
/**
|
||||
* init_gpio_reset() - register GPIO as reset generator
|
||||
*
|
||||
* @gpio - gpio nr
|
||||
* @output - set gpio as out/low instead of input during normal work
|
||||
* @gpio: gpio nr
|
||||
* @output: set gpio as out/low instead of input during normal work
|
||||
*/
|
||||
extern int init_gpio_reset(int gpio, int output);
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
|
|
@ -4,6 +4,7 @@ menu "HP Simulator drivers"
|
|||
|
||||
config HP_SIMETH
|
||||
bool "Simulated Ethernet "
|
||||
depends on NET
|
||||
|
||||
config HP_SIMSERIAL
|
||||
bool "Simulated serial driver support"
|
||||
|
|
|
@ -486,13 +486,13 @@ _GLOBAL(_tlbil_va)
|
|||
tlbsx 0,r3
|
||||
mfspr r4,SPRN_MAS1 /* check valid */
|
||||
andis. r3,r4,MAS1_VALID@h
|
||||
beqlr
|
||||
beq 1f
|
||||
rlwinm r4,r4,0,1,31
|
||||
mtspr SPRN_MAS1,r4
|
||||
tlbwe
|
||||
msync
|
||||
isync
|
||||
wrtee r10
|
||||
1: wrtee r10
|
||||
blr
|
||||
#endif /* CONFIG_FSL_BOOKE */
|
||||
|
||||
|
|
|
@ -556,6 +556,7 @@ unsigned long rh_alloc_fixed(rh_info_t * info, unsigned long start, int size, co
|
|||
be = blk->start + blk->size;
|
||||
if (s >= bs && e <= be)
|
||||
break;
|
||||
blk = NULL;
|
||||
}
|
||||
|
||||
if (blk == NULL)
|
||||
|
|
|
@ -55,6 +55,8 @@ config GENERIC_HARDIRQS
|
|||
|
||||
config GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
def_bool y
|
||||
depends on SUPERH32 && (!SH_DREAMCAST && !SH_SH4202_MICRODEV && \
|
||||
!SH_7751_SYSTEMH && !HD64461)
|
||||
|
||||
config GENERIC_IRQ_PROBE
|
||||
def_bool y
|
||||
|
|
|
@ -824,32 +824,36 @@ static int __init toshiba_acpi_init(void)
|
|||
toshiba_acpi_exit();
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
/* Register input device for kill switch */
|
||||
toshiba_acpi.poll_dev = input_allocate_polled_device();
|
||||
if (!toshiba_acpi.poll_dev) {
|
||||
printk(MY_ERR "unable to allocate kill-switch input device\n");
|
||||
toshiba_acpi_exit();
|
||||
return -ENOMEM;
|
||||
}
|
||||
toshiba_acpi.poll_dev->private = &toshiba_acpi;
|
||||
toshiba_acpi.poll_dev->poll = bt_poll_rfkill;
|
||||
toshiba_acpi.poll_dev->poll_interval = 1000; /* msecs */
|
||||
/* Register input device for kill switch */
|
||||
toshiba_acpi.poll_dev = input_allocate_polled_device();
|
||||
if (!toshiba_acpi.poll_dev) {
|
||||
printk(MY_ERR
|
||||
"unable to allocate kill-switch input device\n");
|
||||
toshiba_acpi_exit();
|
||||
return -ENOMEM;
|
||||
}
|
||||
toshiba_acpi.poll_dev->private = &toshiba_acpi;
|
||||
toshiba_acpi.poll_dev->poll = bt_poll_rfkill;
|
||||
toshiba_acpi.poll_dev->poll_interval = 1000; /* msecs */
|
||||
|
||||
toshiba_acpi.poll_dev->input->name = toshiba_acpi.rfk_name;
|
||||
toshiba_acpi.poll_dev->input->id.bustype = BUS_HOST;
|
||||
toshiba_acpi.poll_dev->input->id.vendor = 0x0930; /* Toshiba USB ID */
|
||||
set_bit(EV_SW, toshiba_acpi.poll_dev->input->evbit);
|
||||
set_bit(SW_RFKILL_ALL, toshiba_acpi.poll_dev->input->swbit);
|
||||
input_report_switch(toshiba_acpi.poll_dev->input, SW_RFKILL_ALL, TRUE);
|
||||
input_sync(toshiba_acpi.poll_dev->input);
|
||||
toshiba_acpi.poll_dev->input->name = toshiba_acpi.rfk_name;
|
||||
toshiba_acpi.poll_dev->input->id.bustype = BUS_HOST;
|
||||
/* Toshiba USB ID */
|
||||
toshiba_acpi.poll_dev->input->id.vendor = 0x0930;
|
||||
set_bit(EV_SW, toshiba_acpi.poll_dev->input->evbit);
|
||||
set_bit(SW_RFKILL_ALL, toshiba_acpi.poll_dev->input->swbit);
|
||||
input_report_switch(toshiba_acpi.poll_dev->input,
|
||||
SW_RFKILL_ALL, TRUE);
|
||||
input_sync(toshiba_acpi.poll_dev->input);
|
||||
|
||||
ret = input_register_polled_device(toshiba_acpi.poll_dev);
|
||||
if (ret) {
|
||||
printk(MY_ERR "unable to register kill-switch input device\n");
|
||||
toshiba_acpi_exit();
|
||||
return ret;
|
||||
ret = input_register_polled_device(toshiba_acpi.poll_dev);
|
||||
if (ret) {
|
||||
printk(MY_ERR
|
||||
"unable to register kill-switch input device\n");
|
||||
toshiba_acpi_exit();
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -4050,17 +4050,70 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|||
{ "ST3160023AS", "3.42", ATA_HORKAGE_NONCQ },
|
||||
|
||||
/* Seagate NCQ + FLUSH CACHE firmware bug */
|
||||
{ "ST31500341AS", "9JU138", ATA_HORKAGE_NONCQ |
|
||||
{ "ST31500341AS", "SD15", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST31000333AS", "9FZ136", ATA_HORKAGE_NONCQ |
|
||||
{ "ST31500341AS", "SD16", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3640623AS", "9FZ164", ATA_HORKAGE_NONCQ |
|
||||
{ "ST31500341AS", "SD17", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3640323AS", "9FZ134", ATA_HORKAGE_NONCQ |
|
||||
{ "ST31500341AS", "SD18", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3320813AS", "9FZ182", ATA_HORKAGE_NONCQ |
|
||||
{ "ST31500341AS", "SD19", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3320613AS", "9FZ162", ATA_HORKAGE_NONCQ |
|
||||
|
||||
{ "ST31000333AS", "SD15", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST31000333AS", "SD16", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST31000333AS", "SD17", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST31000333AS", "SD18", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST31000333AS", "SD19", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
|
||||
{ "ST3640623AS", "SD15", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3640623AS", "SD16", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3640623AS", "SD17", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3640623AS", "SD18", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3640623AS", "SD19", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
|
||||
{ "ST3640323AS", "SD15", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3640323AS", "SD16", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3640323AS", "SD17", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3640323AS", "SD18", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3640323AS", "SD19", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
|
||||
{ "ST3320813AS", "SD15", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3320813AS", "SD16", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3320813AS", "SD17", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3320813AS", "SD18", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3320813AS", "SD19", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
|
||||
{ "ST3320613AS", "SD15", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3320613AS", "SD16", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3320613AS", "SD17", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3320613AS", "SD18", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3320613AS", "SD19", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
|
||||
/* Blacklist entries taken from Silicon Image 3124/3132
|
||||
|
|
|
@ -183,7 +183,9 @@ static unsigned long hpt366_filter(struct ata_device *adev, unsigned long mask)
|
|||
mask &= ~(0xF8 << ATA_SHIFT_UDMA);
|
||||
if (hpt_dma_blacklisted(adev, "UDMA4", bad_ata66_4))
|
||||
mask &= ~(0xF0 << ATA_SHIFT_UDMA);
|
||||
}
|
||||
} else if (adev->class == ATA_DEV_ATAPI)
|
||||
mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
|
||||
|
||||
return ata_bmdma_mode_filter(adev, mask);
|
||||
}
|
||||
|
||||
|
@ -211,11 +213,15 @@ static u32 hpt36x_find_mode(struct ata_port *ap, int speed)
|
|||
|
||||
static int hpt36x_cable_detect(struct ata_port *ap)
|
||||
{
|
||||
u8 ata66;
|
||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||
u8 ata66;
|
||||
|
||||
/*
|
||||
* Each channel of pata_hpt366 occupies separate PCI function
|
||||
* as the primary channel and bit1 indicates the cable type.
|
||||
*/
|
||||
pci_read_config_byte(pdev, 0x5A, &ata66);
|
||||
if (ata66 & (1 << ap->port_no))
|
||||
if (ata66 & 2)
|
||||
return ATA_CBL_PATA40;
|
||||
return ATA_CBL_PATA80;
|
||||
}
|
||||
|
|
|
@ -21,9 +21,6 @@
|
|||
* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* Xilinx products are not intended for use in life support appliances,
|
||||
* devices, or systems. Use in such applications is expressly prohibited.
|
||||
*
|
||||
* (c) Copyright 2003-2008 Xilinx Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
|
|
|
@ -21,9 +21,6 @@
|
|||
* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* Xilinx products are not intended for use in life support appliances,
|
||||
* devices, or systems. Use in such applications is expressly prohibited.
|
||||
*
|
||||
* (c) Copyright 2003-2008 Xilinx Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
|
|
|
@ -21,9 +21,6 @@
|
|||
* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* Xilinx products are not intended for use in life support appliances,
|
||||
* devices, or systems. Use in such applications is expressly prohibited.
|
||||
*
|
||||
* (c) Copyright 2007-2008 Xilinx Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
|
|
|
@ -21,9 +21,6 @@
|
|||
* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* Xilinx products are not intended for use in life support appliances,
|
||||
* devices, or systems. Use in such applications is expressly prohibited.
|
||||
*
|
||||
* (c) Copyright 2007-2008 Xilinx Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
|
|
|
@ -21,9 +21,6 @@
|
|||
* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* Xilinx products are not intended for use in life support appliances,
|
||||
* devices, or systems. Use in such applications is expressly prohibited.
|
||||
*
|
||||
* (c) Copyright 2002 Xilinx Inc., Systems Engineering Group
|
||||
* (c) Copyright 2004 Xilinx Inc., Systems Engineering Group
|
||||
* (c) Copyright 2007-2008 Xilinx Inc.
|
||||
|
|
|
@ -21,9 +21,6 @@
|
|||
* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* Xilinx products are not intended for use in life support appliances,
|
||||
* devices, or systems. Use in such applications is expressly prohibited.
|
||||
*
|
||||
* (c) Copyright 2003-2007 Xilinx Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
|
|
|
@ -365,6 +365,7 @@ static int cpm_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
|||
pmsg = &msgs[tptr];
|
||||
if (pmsg->flags & I2C_M_RD)
|
||||
ret = wait_event_interruptible_timeout(cpm->i2c_wait,
|
||||
(in_be16(&tbdf[tptr].cbd_sc) & BD_SC_NAK) ||
|
||||
!(in_be16(&rbdf[rptr].cbd_sc) & BD_SC_EMPTY),
|
||||
1 * HZ);
|
||||
else
|
||||
|
|
|
@ -56,6 +56,7 @@ enum s3c24xx_i2c_state {
|
|||
struct s3c24xx_i2c {
|
||||
spinlock_t lock;
|
||||
wait_queue_head_t wait;
|
||||
unsigned int suspended:1;
|
||||
|
||||
struct i2c_msg *msg;
|
||||
unsigned int msg_num;
|
||||
|
@ -507,7 +508,7 @@ static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c, struct i2c_msg *msgs, int
|
|||
unsigned long timeout;
|
||||
int ret;
|
||||
|
||||
if (!(readl(i2c->regs + S3C2410_IICCON) & S3C2410_IICCON_IRQEN))
|
||||
if (i2c->suspended)
|
||||
return -EIO;
|
||||
|
||||
ret = s3c24xx_i2c_set_master(i2c);
|
||||
|
@ -986,17 +987,26 @@ static int s3c24xx_i2c_remove(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int s3c24xx_i2c_suspend_late(struct platform_device *dev,
|
||||
pm_message_t msg)
|
||||
{
|
||||
struct s3c24xx_i2c *i2c = platform_get_drvdata(dev);
|
||||
i2c->suspended = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int s3c24xx_i2c_resume(struct platform_device *dev)
|
||||
{
|
||||
struct s3c24xx_i2c *i2c = platform_get_drvdata(dev);
|
||||
|
||||
if (i2c != NULL)
|
||||
s3c24xx_i2c_init(i2c);
|
||||
i2c->suspended = 0;
|
||||
s3c24xx_i2c_init(i2c);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
#define s3c24xx_i2c_suspend_late NULL
|
||||
#define s3c24xx_i2c_resume NULL
|
||||
#endif
|
||||
|
||||
|
@ -1005,6 +1015,7 @@ static int s3c24xx_i2c_resume(struct platform_device *dev)
|
|||
static struct platform_driver s3c2410_i2c_driver = {
|
||||
.probe = s3c24xx_i2c_probe,
|
||||
.remove = s3c24xx_i2c_remove,
|
||||
.suspend_late = s3c24xx_i2c_suspend_late,
|
||||
.resume = s3c24xx_i2c_resume,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -1015,6 +1026,7 @@ static struct platform_driver s3c2410_i2c_driver = {
|
|||
static struct platform_driver s3c2440_i2c_driver = {
|
||||
.probe = s3c24xx_i2c_probe,
|
||||
.remove = s3c24xx_i2c_remove,
|
||||
.suspend_late = s3c24xx_i2c_suspend_late,
|
||||
.resume = s3c24xx_i2c_resume,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
|
|
|
@ -115,8 +115,14 @@ static int nodemgr_bus_read(struct csr1212_csr *csr, u64 addr, u16 length,
|
|||
return error;
|
||||
}
|
||||
|
||||
#define OUI_FREECOM_TECHNOLOGIES_GMBH 0x0001db
|
||||
|
||||
static int nodemgr_get_max_rom(quadlet_t *bus_info_data, void *__ci)
|
||||
{
|
||||
/* Freecom FireWire Hard Drive firmware bug */
|
||||
if (be32_to_cpu(bus_info_data[3]) >> 8 == OUI_FREECOM_TECHNOLOGIES_GMBH)
|
||||
return 0;
|
||||
|
||||
return (be32_to_cpu(bus_info_data[2]) >> 8) & 0x3;
|
||||
}
|
||||
|
||||
|
|
|
@ -1893,12 +1893,17 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
|
|||
ctrl |= E1000_CTRL_PHY_RST;
|
||||
}
|
||||
ret_val = e1000_acquire_swflag_ich8lan(hw);
|
||||
/* Whether or not the swflag was acquired, we need to reset the part */
|
||||
hw_dbg(hw, "Issuing a global reset to ich8lan");
|
||||
ew32(CTRL, (ctrl | E1000_CTRL_RST));
|
||||
msleep(20);
|
||||
|
||||
/* release the swflag because it is not reset by hardware reset */
|
||||
e1000_release_swflag_ich8lan(hw);
|
||||
if (!ret_val) {
|
||||
/* release the swflag because it is not reset by
|
||||
* hardware reset
|
||||
*/
|
||||
e1000_release_swflag_ich8lan(hw);
|
||||
}
|
||||
|
||||
ret_val = e1000e_get_auto_rd_done(hw);
|
||||
if (ret_val) {
|
||||
|
|
|
@ -1142,6 +1142,70 @@ static int gem_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
static void gem_pcs_reset(struct gem *gp)
|
||||
{
|
||||
int limit;
|
||||
u32 val;
|
||||
|
||||
/* Reset PCS unit. */
|
||||
val = readl(gp->regs + PCS_MIICTRL);
|
||||
val |= PCS_MIICTRL_RST;
|
||||
writel(val, gp->regs + PCS_MIICTRL);
|
||||
|
||||
limit = 32;
|
||||
while (readl(gp->regs + PCS_MIICTRL) & PCS_MIICTRL_RST) {
|
||||
udelay(100);
|
||||
if (limit-- <= 0)
|
||||
break;
|
||||
}
|
||||
if (limit <= 0)
|
||||
printk(KERN_WARNING "%s: PCS reset bit would not clear.\n",
|
||||
gp->dev->name);
|
||||
}
|
||||
|
||||
static void gem_pcs_reinit_adv(struct gem *gp)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
/* Make sure PCS is disabled while changing advertisement
|
||||
* configuration.
|
||||
*/
|
||||
val = readl(gp->regs + PCS_CFG);
|
||||
val &= ~(PCS_CFG_ENABLE | PCS_CFG_TO);
|
||||
writel(val, gp->regs + PCS_CFG);
|
||||
|
||||
/* Advertise all capabilities except assymetric
|
||||
* pause.
|
||||
*/
|
||||
val = readl(gp->regs + PCS_MIIADV);
|
||||
val |= (PCS_MIIADV_FD | PCS_MIIADV_HD |
|
||||
PCS_MIIADV_SP | PCS_MIIADV_AP);
|
||||
writel(val, gp->regs + PCS_MIIADV);
|
||||
|
||||
/* Enable and restart auto-negotiation, disable wrapback/loopback,
|
||||
* and re-enable PCS.
|
||||
*/
|
||||
val = readl(gp->regs + PCS_MIICTRL);
|
||||
val |= (PCS_MIICTRL_RAN | PCS_MIICTRL_ANE);
|
||||
val &= ~PCS_MIICTRL_WB;
|
||||
writel(val, gp->regs + PCS_MIICTRL);
|
||||
|
||||
val = readl(gp->regs + PCS_CFG);
|
||||
val |= PCS_CFG_ENABLE;
|
||||
writel(val, gp->regs + PCS_CFG);
|
||||
|
||||
/* Make sure serialink loopback is off. The meaning
|
||||
* of this bit is logically inverted based upon whether
|
||||
* you are in Serialink or SERDES mode.
|
||||
*/
|
||||
val = readl(gp->regs + PCS_SCTRL);
|
||||
if (gp->phy_type == phy_serialink)
|
||||
val &= ~PCS_SCTRL_LOOP;
|
||||
else
|
||||
val |= PCS_SCTRL_LOOP;
|
||||
writel(val, gp->regs + PCS_SCTRL);
|
||||
}
|
||||
|
||||
#define STOP_TRIES 32
|
||||
|
||||
/* Must be invoked under gp->lock and gp->tx_lock. */
|
||||
|
@ -1168,6 +1232,9 @@ static void gem_reset(struct gem *gp)
|
|||
|
||||
if (limit <= 0)
|
||||
printk(KERN_ERR "%s: SW reset is ghetto.\n", gp->dev->name);
|
||||
|
||||
if (gp->phy_type == phy_serialink || gp->phy_type == phy_serdes)
|
||||
gem_pcs_reinit_adv(gp);
|
||||
}
|
||||
|
||||
/* Must be invoked under gp->lock and gp->tx_lock. */
|
||||
|
@ -1324,7 +1391,7 @@ static int gem_set_link_modes(struct gem *gp)
|
|||
gp->phy_type == phy_serdes) {
|
||||
u32 pcs_lpa = readl(gp->regs + PCS_MIILP);
|
||||
|
||||
if (pcs_lpa & PCS_MIIADV_FD)
|
||||
if ((pcs_lpa & PCS_MIIADV_FD) || gp->phy_type == phy_serdes)
|
||||
full_duplex = 1;
|
||||
speed = SPEED_1000;
|
||||
}
|
||||
|
@ -1488,6 +1555,9 @@ static void gem_link_timer(unsigned long data)
|
|||
val = readl(gp->regs + PCS_MIISTAT);
|
||||
|
||||
if ((val & PCS_MIISTAT_LS) != 0) {
|
||||
if (gp->lstate == link_up)
|
||||
goto restart;
|
||||
|
||||
gp->lstate = link_up;
|
||||
netif_carrier_on(gp->dev);
|
||||
(void)gem_set_link_modes(gp);
|
||||
|
@ -1708,61 +1778,8 @@ static void gem_init_phy(struct gem *gp)
|
|||
if (gp->phy_mii.def && gp->phy_mii.def->ops->init)
|
||||
gp->phy_mii.def->ops->init(&gp->phy_mii);
|
||||
} else {
|
||||
u32 val;
|
||||
int limit;
|
||||
|
||||
/* Reset PCS unit. */
|
||||
val = readl(gp->regs + PCS_MIICTRL);
|
||||
val |= PCS_MIICTRL_RST;
|
||||
writel(val, gp->regs + PCS_MIICTRL);
|
||||
|
||||
limit = 32;
|
||||
while (readl(gp->regs + PCS_MIICTRL) & PCS_MIICTRL_RST) {
|
||||
udelay(100);
|
||||
if (limit-- <= 0)
|
||||
break;
|
||||
}
|
||||
if (limit <= 0)
|
||||
printk(KERN_WARNING "%s: PCS reset bit would not clear.\n",
|
||||
gp->dev->name);
|
||||
|
||||
/* Make sure PCS is disabled while changing advertisement
|
||||
* configuration.
|
||||
*/
|
||||
val = readl(gp->regs + PCS_CFG);
|
||||
val &= ~(PCS_CFG_ENABLE | PCS_CFG_TO);
|
||||
writel(val, gp->regs + PCS_CFG);
|
||||
|
||||
/* Advertise all capabilities except assymetric
|
||||
* pause.
|
||||
*/
|
||||
val = readl(gp->regs + PCS_MIIADV);
|
||||
val |= (PCS_MIIADV_FD | PCS_MIIADV_HD |
|
||||
PCS_MIIADV_SP | PCS_MIIADV_AP);
|
||||
writel(val, gp->regs + PCS_MIIADV);
|
||||
|
||||
/* Enable and restart auto-negotiation, disable wrapback/loopback,
|
||||
* and re-enable PCS.
|
||||
*/
|
||||
val = readl(gp->regs + PCS_MIICTRL);
|
||||
val |= (PCS_MIICTRL_RAN | PCS_MIICTRL_ANE);
|
||||
val &= ~PCS_MIICTRL_WB;
|
||||
writel(val, gp->regs + PCS_MIICTRL);
|
||||
|
||||
val = readl(gp->regs + PCS_CFG);
|
||||
val |= PCS_CFG_ENABLE;
|
||||
writel(val, gp->regs + PCS_CFG);
|
||||
|
||||
/* Make sure serialink loopback is off. The meaning
|
||||
* of this bit is logically inverted based upon whether
|
||||
* you are in Serialink or SERDES mode.
|
||||
*/
|
||||
val = readl(gp->regs + PCS_SCTRL);
|
||||
if (gp->phy_type == phy_serialink)
|
||||
val &= ~PCS_SCTRL_LOOP;
|
||||
else
|
||||
val |= PCS_SCTRL_LOOP;
|
||||
writel(val, gp->regs + PCS_SCTRL);
|
||||
gem_pcs_reset(gp);
|
||||
gem_pcs_reinit_adv(gp);
|
||||
}
|
||||
|
||||
/* Default aneg parameters */
|
||||
|
@ -2680,6 +2697,21 @@ static int gem_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
|||
cmd->speed = 0;
|
||||
cmd->duplex = cmd->port = cmd->phy_address =
|
||||
cmd->transceiver = cmd->autoneg = 0;
|
||||
|
||||
/* serdes means usually a Fibre connector, with most fixed */
|
||||
if (gp->phy_type == phy_serdes) {
|
||||
cmd->port = PORT_FIBRE;
|
||||
cmd->supported = (SUPPORTED_1000baseT_Half |
|
||||
SUPPORTED_1000baseT_Full |
|
||||
SUPPORTED_FIBRE | SUPPORTED_Autoneg |
|
||||
SUPPORTED_Pause | SUPPORTED_Asym_Pause);
|
||||
cmd->advertising = cmd->supported;
|
||||
cmd->transceiver = XCVR_INTERNAL;
|
||||
if (gp->lstate == link_up)
|
||||
cmd->speed = SPEED_1000;
|
||||
cmd->duplex = DUPLEX_FULL;
|
||||
cmd->autoneg = 1;
|
||||
}
|
||||
}
|
||||
cmd->maxtxpkt = cmd->maxrxpkt = 0;
|
||||
|
||||
|
|
|
@ -334,6 +334,6 @@ static void __exit bfin_cf_exit(void)
|
|||
module_init(bfin_cf_init);
|
||||
module_exit(bfin_cf_exit);
|
||||
|
||||
MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>")
|
||||
MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
|
||||
MODULE_DESCRIPTION("BFIN CF/PCMCIA Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -827,7 +827,7 @@ static int __init maple_bus_init(void)
|
|||
|
||||
maple_queue_cache =
|
||||
kmem_cache_create("maple_queue_cache", 0x400, 0,
|
||||
SLAB_POISON|SLAB_HWCACHE_ALIGN, NULL);
|
||||
SLAB_HWCACHE_ALIGN, NULL);
|
||||
|
||||
if (!maple_queue_cache)
|
||||
goto cleanup_bothirqs;
|
||||
|
|
|
@ -22,6 +22,8 @@ menuconfig STAGING
|
|||
If in doubt, say N here.
|
||||
|
||||
|
||||
if STAGING
|
||||
|
||||
config STAGING_EXCLUDE_BUILD
|
||||
bool "Exclude Staging drivers from being built" if STAGING
|
||||
default y
|
||||
|
@ -62,3 +64,4 @@ source "drivers/staging/at76_usb/Kconfig"
|
|||
source "drivers/staging/poch/Kconfig"
|
||||
|
||||
endif # !STAGING_EXCLUDE_BUILD
|
||||
endif # STAGING
|
||||
|
|
|
@ -51,6 +51,7 @@ static struct usb_device_id usbtmc_devices[] = {
|
|||
{ USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, 3, 0), },
|
||||
{ 0, } /* terminating entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, usbtmc_devices);
|
||||
|
||||
/*
|
||||
* This structure is the capabilities for the device
|
||||
|
|
|
@ -279,7 +279,9 @@ static int usb_unbind_interface(struct device *dev)
|
|||
* altsetting means creating new endpoint device entries).
|
||||
* When either of these happens, defer the Set-Interface.
|
||||
*/
|
||||
if (!error && intf->dev.power.status == DPM_ON)
|
||||
if (intf->cur_altsetting->desc.bAlternateSetting == 0)
|
||||
; /* Already in altsetting 0 so skip Set-Interface */
|
||||
else if (!error && intf->dev.power.status == DPM_ON)
|
||||
usb_set_interface(udev, intf->altsetting[0].
|
||||
desc.bInterfaceNumber, 0);
|
||||
else
|
||||
|
|
|
@ -651,6 +651,8 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f)
|
|||
fs_in_desc.bEndpointAddress;
|
||||
hs_out_desc.bEndpointAddress =
|
||||
fs_out_desc.bEndpointAddress;
|
||||
hs_notify_desc.bEndpointAddress =
|
||||
fs_notify_desc.bEndpointAddress;
|
||||
|
||||
/* copy descriptors, and track endpoint copies */
|
||||
f->hs_descriptors = usb_copy_descriptors(eth_hs_function);
|
||||
|
@ -662,6 +664,8 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f)
|
|||
f->hs_descriptors, &hs_in_desc);
|
||||
rndis->hs.out = usb_find_endpoint(eth_hs_function,
|
||||
f->hs_descriptors, &hs_out_desc);
|
||||
rndis->hs.notify = usb_find_endpoint(eth_hs_function,
|
||||
f->hs_descriptors, &hs_notify_desc);
|
||||
}
|
||||
|
||||
rndis->port.open = rndis_open;
|
||||
|
|
|
@ -143,6 +143,7 @@ static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = {
|
|||
static struct usb_device_id id_table_combined [] = {
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) },
|
||||
|
@ -166,6 +167,7 @@ static struct usb_device_id id_table_combined [] = {
|
|||
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) },
|
||||
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
|
||||
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) },
|
||||
|
|
|
@ -40,6 +40,9 @@
|
|||
/* AlphaMicro Components AMC-232USB01 device */
|
||||
#define FTDI_AMC232_PID 0xFF00 /* Product Id */
|
||||
|
||||
/* www.candapter.com Ewert Energy Systems CANdapter device */
|
||||
#define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */
|
||||
|
||||
/* SCS HF Radio Modems PID's (http://www.scs-ptc.com) */
|
||||
/* the VID is the standard ftdi vid (FTDI_VID) */
|
||||
#define FTDI_SCS_DEVICE_0_PID 0xD010 /* SCS PTC-IIusb */
|
||||
|
@ -75,6 +78,9 @@
|
|||
/* OpenDCC (www.opendcc.de) product id */
|
||||
#define FTDI_OPENDCC_PID 0xBFD8
|
||||
|
||||
/* Sprog II (Andrew Crosland's SprogII DCC interface) */
|
||||
#define FTDI_SPROG_II 0xF0C8
|
||||
|
||||
/* www.crystalfontz.com devices - thanx for providing free devices for evaluation ! */
|
||||
/* they use the ftdi chipset for the USB interface and the vendor id is the same */
|
||||
#define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */
|
||||
|
|
|
@ -91,6 +91,8 @@ static struct usb_device_id id_table [] = {
|
|||
{ USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
|
||||
{ USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
|
||||
{ USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
|
||||
{ USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
|
||||
{ USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
|
|
|
@ -110,3 +110,11 @@
|
|||
/* Y.C. Cable U.S.A., Inc - USB to RS-232 */
|
||||
#define YCCABLE_VENDOR_ID 0x05ad
|
||||
#define YCCABLE_PRODUCT_ID 0x0fba
|
||||
|
||||
/* "Superial" USB - Serial */
|
||||
#define SUPERIAL_VENDOR_ID 0x5372
|
||||
#define SUPERIAL_PRODUCT_ID 0x2303
|
||||
|
||||
/* Hewlett-Packard LD220-HP POS Pole Display */
|
||||
#define HP_VENDOR_ID 0x03f0
|
||||
#define HP_LD220_PRODUCT_ID 0x3524
|
||||
|
|
|
@ -16,56 +16,6 @@
|
|||
* For questions or problems with this driver, contact Texas Instruments
|
||||
* technical support, or Al Borchers <alborchers@steinerpoint.com>, or
|
||||
* Peter Berger <pberger@brimson.com>.
|
||||
*
|
||||
* This driver needs this hotplug script in /etc/hotplug/usb/ti_usb_3410_5052
|
||||
* or in /etc/hotplug.d/usb/ti_usb_3410_5052.hotplug to set the device
|
||||
* configuration.
|
||||
*
|
||||
* #!/bin/bash
|
||||
*
|
||||
* BOOT_CONFIG=1
|
||||
* ACTIVE_CONFIG=2
|
||||
*
|
||||
* if [[ "$ACTION" != "add" ]]
|
||||
* then
|
||||
* exit
|
||||
* fi
|
||||
*
|
||||
* CONFIG_PATH=/sys${DEVPATH%/?*}/bConfigurationValue
|
||||
*
|
||||
* if [[ 0`cat $CONFIG_PATH` -ne $BOOT_CONFIG ]]
|
||||
* then
|
||||
* exit
|
||||
* fi
|
||||
*
|
||||
* PRODUCT=${PRODUCT%/?*} # delete version
|
||||
* VENDOR_ID=`printf "%d" 0x${PRODUCT%/?*}`
|
||||
* PRODUCT_ID=`printf "%d" 0x${PRODUCT#*?/}`
|
||||
*
|
||||
* PARAM_PATH=/sys/module/ti_usb_3410_5052/parameters
|
||||
*
|
||||
* function scan() {
|
||||
* s=$1
|
||||
* shift
|
||||
* for i
|
||||
* do
|
||||
* if [[ $s -eq $i ]]
|
||||
* then
|
||||
* return 0
|
||||
* fi
|
||||
* done
|
||||
* return 1
|
||||
* }
|
||||
*
|
||||
* IFS=$IFS,
|
||||
*
|
||||
* if (scan $VENDOR_ID 1105 `cat $PARAM_PATH/vendor_3410` &&
|
||||
* scan $PRODUCT_ID 13328 `cat $PARAM_PATH/product_3410`) ||
|
||||
* (scan $VENDOR_ID 1105 `cat $PARAM_PATH/vendor_5052` &&
|
||||
* scan $PRODUCT_ID 20562 20818 20570 20575 `cat $PARAM_PATH/product_5052`)
|
||||
* then
|
||||
* echo $ACTIVE_CONFIG > $CONFIG_PATH
|
||||
* fi
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -457,9 +407,10 @@ static int ti_startup(struct usb_serial *serial)
|
|||
goto free_tdev;
|
||||
}
|
||||
|
||||
/* the second configuration must be set (in sysfs by hotplug script) */
|
||||
/* the second configuration must be set */
|
||||
if (dev->actconfig->desc.bConfigurationValue == TI_BOOT_CONFIG) {
|
||||
status = -ENODEV;
|
||||
status = usb_driver_set_configuration(dev, TI_ACTIVE_CONFIG);
|
||||
status = status ? status : -ENODEV;
|
||||
goto free_tdev;
|
||||
}
|
||||
|
||||
|
|
|
@ -167,8 +167,22 @@ UNUSUAL_DEV( 0x0421, 0x005d, 0x0001, 0x0600,
|
|||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY ),
|
||||
|
||||
/* Reported by Ozan Sener <themgzzy@gmail.com> */
|
||||
UNUSUAL_DEV( 0x0421, 0x0060, 0x0551, 0x0551,
|
||||
"Nokia",
|
||||
"3500c",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY ),
|
||||
|
||||
/* Reported by CSECSY Laszlo <boobaa@frugalware.org> */
|
||||
UNUSUAL_DEV( 0x0421, 0x0063, 0x0001, 0x0601,
|
||||
"Nokia",
|
||||
"Nokia 3109c",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY ),
|
||||
|
||||
/* Patch for Nokia 5310 capacity */
|
||||
UNUSUAL_DEV( 0x0421, 0x006a, 0x0000, 0x0591,
|
||||
UNUSUAL_DEV( 0x0421, 0x006a, 0x0000, 0x0701,
|
||||
"Nokia",
|
||||
"5310",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
|
|
|
@ -3983,7 +3983,8 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr,
|
|||
|
||||
node->flags = le16_to_cpu(pSMBr->DFSFlags);
|
||||
if (is_unicode) {
|
||||
__le16 *tmp = kmalloc(strlen(searchName)*2, GFP_KERNEL);
|
||||
__le16 *tmp = kmalloc(strlen(searchName)*2 + 2,
|
||||
GFP_KERNEL);
|
||||
cifsConvertToUCS((__le16 *) tmp, searchName,
|
||||
PATH_MAX, nls_codepage, remap);
|
||||
node->path_consumed = hostlen_fromUCS(tmp,
|
||||
|
|
|
@ -86,7 +86,8 @@
|
|||
#define OCFS2_CLEAR_INCOMPAT_FEATURE(sb,mask) \
|
||||
OCFS2_SB(sb)->s_feature_incompat &= ~(mask)
|
||||
|
||||
#define OCFS2_FEATURE_COMPAT_SUPP OCFS2_FEATURE_COMPAT_BACKUP_SB
|
||||
#define OCFS2_FEATURE_COMPAT_SUPP (OCFS2_FEATURE_COMPAT_BACKUP_SB \
|
||||
| OCFS2_FEATURE_COMPAT_JBD2_SB)
|
||||
#define OCFS2_FEATURE_INCOMPAT_SUPP (OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT \
|
||||
| OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC \
|
||||
| OCFS2_FEATURE_INCOMPAT_INLINE_DATA \
|
||||
|
@ -152,6 +153,11 @@
|
|||
*/
|
||||
#define OCFS2_FEATURE_COMPAT_BACKUP_SB 0x0001
|
||||
|
||||
/*
|
||||
* The filesystem will correctly handle journal feature bits.
|
||||
*/
|
||||
#define OCFS2_FEATURE_COMPAT_JBD2_SB 0x0002
|
||||
|
||||
/*
|
||||
* Unwritten extents support.
|
||||
*/
|
||||
|
|
|
@ -2645,9 +2645,9 @@ static int ocfs2_xattr_update_xattr_search(struct inode *inode,
|
|||
return ret;
|
||||
}
|
||||
|
||||
i = xs->here - old_xh->xh_entries;
|
||||
xs->here = &xs->header->xh_entries[i];
|
||||
}
|
||||
i = xs->here - old_xh->xh_entries;
|
||||
xs->here = &xs->header->xh_entries[i];
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -319,6 +319,7 @@ enum
|
|||
{
|
||||
NAPI_STATE_SCHED, /* Poll is scheduled */
|
||||
NAPI_STATE_DISABLE, /* Disable pending */
|
||||
NAPI_STATE_NPSVC, /* Netpoll - don't dequeue from poll_list */
|
||||
};
|
||||
|
||||
extern void __napi_schedule(struct napi_struct *n);
|
||||
|
@ -1497,6 +1498,12 @@ static inline void netif_rx_complete(struct net_device *dev,
|
|||
{
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* don't let napi dequeue from the cpu poll list
|
||||
* just in case its running on a different cpu
|
||||
*/
|
||||
if (unlikely(test_bit(NAPI_STATE_NPSVC, &napi->state)))
|
||||
return;
|
||||
local_irq_save(flags);
|
||||
__netif_rx_complete(dev, napi);
|
||||
local_irq_restore(flags);
|
||||
|
|
|
@ -146,6 +146,8 @@ static inline void smp_send_reschedule(int cpu) { }
|
|||
})
|
||||
#define smp_call_function_mask(mask, func, info, wait) \
|
||||
(up_smp_call_function(func, info))
|
||||
#define smp_call_function_many(mask, func, info, wait) \
|
||||
(up_smp_call_function(func, info))
|
||||
static inline void init_call_single_data(void)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -158,8 +158,12 @@ struct usb_ctrlrequest {
|
|||
* (rarely) accepted by SET_DESCRIPTOR.
|
||||
*
|
||||
* Note that all multi-byte values here are encoded in little endian
|
||||
* byte order "on the wire". But when exposed through Linux-USB APIs,
|
||||
* they've been converted to cpu byte order.
|
||||
* byte order "on the wire". Within the kernel and when exposed
|
||||
* through the Linux-USB APIs, they are not converted to cpu byte
|
||||
* order; it is the responsibility of the client code to do this.
|
||||
* The single exception is when device and configuration descriptors (but
|
||||
* not other descriptors) are read from usbfs (i.e. /proc/bus/usb/BBB/DDD);
|
||||
* in this case the fields are converted to host endianness by the kernel.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
|
@ -702,7 +702,7 @@ static int rebind_subsystems(struct cgroupfs_root *root,
|
|||
* any child cgroups exist. This is theoretically supportable
|
||||
* but involves complex error handling, so it's being left until
|
||||
* later */
|
||||
if (!list_empty(&cgrp->children))
|
||||
if (root->number_of_cgroups > 1)
|
||||
return -EBUSY;
|
||||
|
||||
/* Process each subsystem */
|
||||
|
|
|
@ -135,7 +135,7 @@ int unregister_dynamic_debug_module(char *mod_name)
|
|||
nr_entries--;
|
||||
out:
|
||||
up(&debug_list_mutex);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(unregister_dynamic_debug_module);
|
||||
|
||||
|
@ -289,7 +289,7 @@ static ssize_t pr_debug_write(struct file *file, const char __user *buf,
|
|||
dynamic_enabled = DYNAMIC_ENABLED_SOME;
|
||||
err = 0;
|
||||
printk(KERN_DEBUG
|
||||
"debugging enabled for module %s",
|
||||
"debugging enabled for module %s\n",
|
||||
elem->name);
|
||||
} else if (!value && (elem->enable == 1)) {
|
||||
elem->enable = 0;
|
||||
|
@ -309,7 +309,7 @@ static ssize_t pr_debug_write(struct file *file, const char __user *buf,
|
|||
err = 0;
|
||||
printk(KERN_DEBUG
|
||||
"debugging disabled for module "
|
||||
"%s", elem->name);
|
||||
"%s\n", elem->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -998,7 +998,7 @@ static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages,
|
|||
unsigned long addr = (unsigned long)(*pages);
|
||||
struct vm_area_struct *vma;
|
||||
struct page *page;
|
||||
int err;
|
||||
int err = -EFAULT;
|
||||
|
||||
vma = find_vma(mm, addr);
|
||||
if (!vma)
|
||||
|
|
|
@ -535,7 +535,7 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size,
|
|||
struct kmem_cache *c;
|
||||
|
||||
c = slob_alloc(sizeof(struct kmem_cache),
|
||||
flags, ARCH_KMALLOC_MINALIGN, -1);
|
||||
GFP_KERNEL, ARCH_KMALLOC_MINALIGN, -1);
|
||||
|
||||
if (c) {
|
||||
c->name = name;
|
||||
|
|
|
@ -133,9 +133,11 @@ static int poll_one_napi(struct netpoll_info *npinfo,
|
|||
|
||||
npinfo->rx_flags |= NETPOLL_RX_DROP;
|
||||
atomic_inc(&trapped);
|
||||
set_bit(NAPI_STATE_NPSVC, &napi->state);
|
||||
|
||||
work = napi->poll(napi, budget);
|
||||
|
||||
clear_bit(NAPI_STATE_NPSVC, &napi->state);
|
||||
atomic_dec(&trapped);
|
||||
npinfo->rx_flags &= ~NETPOLL_RX_DROP;
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ static struct
|
|||
static struct xt_table nat_table = {
|
||||
.name = "nat",
|
||||
.valid_hooks = NAT_VALID_HOOKS,
|
||||
.lock = __RW_LOCK_UNLOCKED(__nat_table.lock),
|
||||
.lock = __RW_LOCK_UNLOCKED(nat_table.lock),
|
||||
.me = THIS_MODULE,
|
||||
.af = AF_INET,
|
||||
};
|
||||
|
|
|
@ -40,18 +40,14 @@
|
|||
|
||||
#include "tcp_vegas.h"
|
||||
|
||||
/* Default values of the Vegas variables, in fixed-point representation
|
||||
* with V_PARAM_SHIFT bits to the right of the binary point.
|
||||
*/
|
||||
#define V_PARAM_SHIFT 1
|
||||
static int alpha = 2<<V_PARAM_SHIFT;
|
||||
static int beta = 4<<V_PARAM_SHIFT;
|
||||
static int gamma = 1<<V_PARAM_SHIFT;
|
||||
static int alpha = 2;
|
||||
static int beta = 4;
|
||||
static int gamma = 1;
|
||||
|
||||
module_param(alpha, int, 0644);
|
||||
MODULE_PARM_DESC(alpha, "lower bound of packets in network (scale by 2)");
|
||||
MODULE_PARM_DESC(alpha, "lower bound of packets in network");
|
||||
module_param(beta, int, 0644);
|
||||
MODULE_PARM_DESC(beta, "upper bound of packets in network (scale by 2)");
|
||||
MODULE_PARM_DESC(beta, "upper bound of packets in network");
|
||||
module_param(gamma, int, 0644);
|
||||
MODULE_PARM_DESC(gamma, "limit on increase (scale by 2)");
|
||||
|
||||
|
@ -172,49 +168,13 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
|
|||
return;
|
||||
}
|
||||
|
||||
/* The key players are v_beg_snd_una and v_beg_snd_nxt.
|
||||
*
|
||||
* These are so named because they represent the approximate values
|
||||
* of snd_una and snd_nxt at the beginning of the current RTT. More
|
||||
* precisely, they represent the amount of data sent during the RTT.
|
||||
* At the end of the RTT, when we receive an ACK for v_beg_snd_nxt,
|
||||
* we will calculate that (v_beg_snd_nxt - v_beg_snd_una) outstanding
|
||||
* bytes of data have been ACKed during the course of the RTT, giving
|
||||
* an "actual" rate of:
|
||||
*
|
||||
* (v_beg_snd_nxt - v_beg_snd_una) / (rtt duration)
|
||||
*
|
||||
* Unfortunately, v_beg_snd_una is not exactly equal to snd_una,
|
||||
* because delayed ACKs can cover more than one segment, so they
|
||||
* don't line up nicely with the boundaries of RTTs.
|
||||
*
|
||||
* Another unfortunate fact of life is that delayed ACKs delay the
|
||||
* advance of the left edge of our send window, so that the number
|
||||
* of bytes we send in an RTT is often less than our cwnd will allow.
|
||||
* So we keep track of our cwnd separately, in v_beg_snd_cwnd.
|
||||
*/
|
||||
|
||||
if (after(ack, vegas->beg_snd_nxt)) {
|
||||
/* Do the Vegas once-per-RTT cwnd adjustment. */
|
||||
u32 old_wnd, old_snd_cwnd;
|
||||
|
||||
|
||||
/* Here old_wnd is essentially the window of data that was
|
||||
* sent during the previous RTT, and has all
|
||||
* been acknowledged in the course of the RTT that ended
|
||||
* with the ACK we just received. Likewise, old_snd_cwnd
|
||||
* is the cwnd during the previous RTT.
|
||||
*/
|
||||
old_wnd = (vegas->beg_snd_nxt - vegas->beg_snd_una) /
|
||||
tp->mss_cache;
|
||||
old_snd_cwnd = vegas->beg_snd_cwnd;
|
||||
|
||||
/* Save the extent of the current window so we can use this
|
||||
* at the end of the next RTT.
|
||||
*/
|
||||
vegas->beg_snd_una = vegas->beg_snd_nxt;
|
||||
vegas->beg_snd_nxt = tp->snd_nxt;
|
||||
vegas->beg_snd_cwnd = tp->snd_cwnd;
|
||||
|
||||
/* We do the Vegas calculations only if we got enough RTT
|
||||
* samples that we can be reasonably sure that we got
|
||||
|
@ -252,22 +212,14 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
|
|||
*
|
||||
* This is:
|
||||
* (actual rate in segments) * baseRTT
|
||||
* We keep it as a fixed point number with
|
||||
* V_PARAM_SHIFT bits to the right of the binary point.
|
||||
*/
|
||||
target_cwnd = ((u64)old_wnd * vegas->baseRTT);
|
||||
target_cwnd <<= V_PARAM_SHIFT;
|
||||
do_div(target_cwnd, rtt);
|
||||
target_cwnd = tp->snd_cwnd * vegas->baseRTT / rtt;
|
||||
|
||||
/* Calculate the difference between the window we had,
|
||||
* and the window we would like to have. This quantity
|
||||
* is the "Diff" from the Arizona Vegas papers.
|
||||
*
|
||||
* Again, this is a fixed point number with
|
||||
* V_PARAM_SHIFT bits to the right of the binary
|
||||
* point.
|
||||
*/
|
||||
diff = (old_wnd << V_PARAM_SHIFT) - target_cwnd;
|
||||
diff = tp->snd_cwnd * (rtt-vegas->baseRTT) / vegas->baseRTT;
|
||||
|
||||
if (diff > gamma && tp->snd_ssthresh > 2 ) {
|
||||
/* Going too fast. Time to slow down
|
||||
|
@ -282,16 +234,13 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
|
|||
* truncation robs us of full link
|
||||
* utilization.
|
||||
*/
|
||||
tp->snd_cwnd = min(tp->snd_cwnd,
|
||||
((u32)target_cwnd >>
|
||||
V_PARAM_SHIFT)+1);
|
||||
tp->snd_cwnd = min(tp->snd_cwnd, (u32)target_cwnd+1);
|
||||
|
||||
} else if (tp->snd_cwnd <= tp->snd_ssthresh) {
|
||||
/* Slow start. */
|
||||
tcp_slow_start(tp);
|
||||
} else {
|
||||
/* Congestion avoidance. */
|
||||
u32 next_snd_cwnd;
|
||||
|
||||
/* Figure out where we would like cwnd
|
||||
* to be.
|
||||
|
@ -300,26 +249,17 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
|
|||
/* The old window was too fast, so
|
||||
* we slow down.
|
||||
*/
|
||||
next_snd_cwnd = old_snd_cwnd - 1;
|
||||
tp->snd_cwnd--;
|
||||
} else if (diff < alpha) {
|
||||
/* We don't have enough extra packets
|
||||
* in the network, so speed up.
|
||||
*/
|
||||
next_snd_cwnd = old_snd_cwnd + 1;
|
||||
tp->snd_cwnd++;
|
||||
} else {
|
||||
/* Sending just as fast as we
|
||||
* should be.
|
||||
*/
|
||||
next_snd_cwnd = old_snd_cwnd;
|
||||
}
|
||||
|
||||
/* Adjust cwnd upward or downward, toward the
|
||||
* desired value.
|
||||
*/
|
||||
if (next_snd_cwnd > tp->snd_cwnd)
|
||||
tp->snd_cwnd++;
|
||||
else if (next_snd_cwnd < tp->snd_cwnd)
|
||||
tp->snd_cwnd--;
|
||||
}
|
||||
|
||||
if (tp->snd_cwnd < 2)
|
||||
|
|
|
@ -912,8 +912,13 @@ static void ndisc_recv_na(struct sk_buff *skb)
|
|||
is invalid, but ndisc specs say nothing
|
||||
about it. It could be misconfiguration, or
|
||||
an smart proxy agent tries to help us :-)
|
||||
|
||||
We should not print the error if NA has been
|
||||
received from loopback - it is just our own
|
||||
unsolicited advertisement.
|
||||
*/
|
||||
ND_PRINTK1(KERN_WARNING
|
||||
if (skb->pkt_type != PACKET_LOOPBACK)
|
||||
ND_PRINTK1(KERN_WARNING
|
||||
"ICMPv6 NA: someone advertises our address on %s!\n",
|
||||
ifp->idev->dev->name);
|
||||
in6_ifa_put(ifp);
|
||||
|
|
|
@ -562,7 +562,6 @@ static int netlbl_unlhsh_remove_addr4(struct net *net,
|
|||
const struct in_addr *mask,
|
||||
struct netlbl_audit *audit_info)
|
||||
{
|
||||
int ret_val = 0;
|
||||
struct netlbl_af4list *list_entry;
|
||||
struct netlbl_unlhsh_addr4 *entry;
|
||||
struct audit_buffer *audit_buf;
|
||||
|
@ -577,7 +576,7 @@ static int netlbl_unlhsh_remove_addr4(struct net *net,
|
|||
if (list_entry != NULL)
|
||||
entry = netlbl_unlhsh_addr4_entry(list_entry);
|
||||
else
|
||||
ret_val = -ENOENT;
|
||||
entry = NULL;
|
||||
|
||||
audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_STCDEL,
|
||||
audit_info);
|
||||
|
@ -588,19 +587,21 @@ static int netlbl_unlhsh_remove_addr4(struct net *net,
|
|||
addr->s_addr, mask->s_addr);
|
||||
if (dev != NULL)
|
||||
dev_put(dev);
|
||||
if (entry && security_secid_to_secctx(entry->secid,
|
||||
&secctx,
|
||||
&secctx_len) == 0) {
|
||||
if (entry != NULL &&
|
||||
security_secid_to_secctx(entry->secid,
|
||||
&secctx, &secctx_len) == 0) {
|
||||
audit_log_format(audit_buf, " sec_obj=%s", secctx);
|
||||
security_release_secctx(secctx, secctx_len);
|
||||
}
|
||||
audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0);
|
||||
audit_log_format(audit_buf, " res=%u", entry != NULL ? 1 : 0);
|
||||
audit_log_end(audit_buf);
|
||||
}
|
||||
|
||||
if (ret_val == 0)
|
||||
call_rcu(&entry->rcu, netlbl_unlhsh_free_addr4);
|
||||
return ret_val;
|
||||
if (entry == NULL)
|
||||
return -ENOENT;
|
||||
|
||||
call_rcu(&entry->rcu, netlbl_unlhsh_free_addr4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
|
@ -624,7 +625,6 @@ static int netlbl_unlhsh_remove_addr6(struct net *net,
|
|||
const struct in6_addr *mask,
|
||||
struct netlbl_audit *audit_info)
|
||||
{
|
||||
int ret_val = 0;
|
||||
struct netlbl_af6list *list_entry;
|
||||
struct netlbl_unlhsh_addr6 *entry;
|
||||
struct audit_buffer *audit_buf;
|
||||
|
@ -638,7 +638,7 @@ static int netlbl_unlhsh_remove_addr6(struct net *net,
|
|||
if (list_entry != NULL)
|
||||
entry = netlbl_unlhsh_addr6_entry(list_entry);
|
||||
else
|
||||
ret_val = -ENOENT;
|
||||
entry = NULL;
|
||||
|
||||
audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_STCDEL,
|
||||
audit_info);
|
||||
|
@ -649,19 +649,21 @@ static int netlbl_unlhsh_remove_addr6(struct net *net,
|
|||
addr, mask);
|
||||
if (dev != NULL)
|
||||
dev_put(dev);
|
||||
if (entry && security_secid_to_secctx(entry->secid,
|
||||
&secctx,
|
||||
&secctx_len) == 0) {
|
||||
if (entry != NULL &&
|
||||
security_secid_to_secctx(entry->secid,
|
||||
&secctx, &secctx_len) == 0) {
|
||||
audit_log_format(audit_buf, " sec_obj=%s", secctx);
|
||||
security_release_secctx(secctx, secctx_len);
|
||||
}
|
||||
audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0);
|
||||
audit_log_format(audit_buf, " res=%u", entry != NULL ? 1 : 0);
|
||||
audit_log_end(audit_buf);
|
||||
}
|
||||
|
||||
if (ret_val == 0)
|
||||
call_rcu(&entry->rcu, netlbl_unlhsh_free_addr6);
|
||||
return ret_val;
|
||||
if (entry == NULL)
|
||||
return -ENOENT;
|
||||
|
||||
call_rcu(&entry->rcu, netlbl_unlhsh_free_addr6);
|
||||
return 0;
|
||||
}
|
||||
#endif /* IPv6 */
|
||||
|
||||
|
|
|
@ -155,12 +155,13 @@ static void gprs_data_ready(struct sock *sk, int len)
|
|||
static void gprs_write_space(struct sock *sk)
|
||||
{
|
||||
struct gprs_dev *dev = sk->sk_user_data;
|
||||
struct net_device *net = dev->net;
|
||||
unsigned credits = pep_writeable(sk);
|
||||
|
||||
spin_lock_bh(&dev->tx_lock);
|
||||
dev->tx_max = credits;
|
||||
if (credits > skb_queue_len(&dev->tx_queue))
|
||||
netif_wake_queue(dev->net);
|
||||
if (credits > skb_queue_len(&dev->tx_queue) && netif_running(net))
|
||||
netif_wake_queue(net);
|
||||
spin_unlock_bh(&dev->tx_lock);
|
||||
}
|
||||
|
||||
|
@ -168,6 +169,23 @@ static void gprs_write_space(struct sock *sk)
|
|||
* Network device callbacks
|
||||
*/
|
||||
|
||||
static int gprs_open(struct net_device *dev)
|
||||
{
|
||||
struct gprs_dev *gp = netdev_priv(dev);
|
||||
|
||||
gprs_write_space(gp->sk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gprs_close(struct net_device *dev)
|
||||
{
|
||||
struct gprs_dev *gp = netdev_priv(dev);
|
||||
|
||||
netif_stop_queue(dev);
|
||||
flush_work(&gp->tx_work);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gprs_xmit(struct sk_buff *skb, struct net_device *net)
|
||||
{
|
||||
struct gprs_dev *dev = netdev_priv(net);
|
||||
|
@ -254,6 +272,8 @@ static void gprs_setup(struct net_device *net)
|
|||
net->tx_queue_len = 10;
|
||||
|
||||
net->destructor = free_netdev;
|
||||
net->open = gprs_open;
|
||||
net->stop = gprs_close;
|
||||
net->hard_start_xmit = gprs_xmit; /* mandatory */
|
||||
net->change_mtu = gprs_set_mtu;
|
||||
net->get_stats = gprs_get_stats;
|
||||
|
@ -318,7 +338,6 @@ int gprs_attach(struct sock *sk)
|
|||
dev->sk = sk;
|
||||
|
||||
printk(KERN_DEBUG"%s: attached\n", net->name);
|
||||
gprs_write_space(sk); /* kick off TX */
|
||||
return net->ifindex;
|
||||
|
||||
out_rel:
|
||||
|
@ -341,7 +360,5 @@ void gprs_detach(struct sock *sk)
|
|||
|
||||
printk(KERN_DEBUG"%s: detached\n", net->name);
|
||||
unregister_netdev(net);
|
||||
flush_scheduled_work();
|
||||
sock_put(sk);
|
||||
skb_queue_purge(&dev->tx_queue);
|
||||
}
|
||||
|
|
|
@ -46,9 +46,6 @@
|
|||
layering other disciplines. It does not need to do bandwidth
|
||||
control either since that can be handled by using token
|
||||
bucket or other rate control.
|
||||
|
||||
The simulator is limited by the Linux timer resolution
|
||||
and will create packet bursts on the HZ boundary (1ms).
|
||||
*/
|
||||
|
||||
struct netem_sched_data {
|
||||
|
|
Загрузка…
Ссылка в новой задаче