Merge branch 'linux-3.0.y' of https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable into odroid-3.0.y
This commit is contained in:
commit
67cb42eae1
50 changed files with 358 additions and 137 deletions
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 0
|
||||
SUBLEVEL = 80
|
||||
SUBLEVEL = 82
|
||||
EXTRAVERSION =
|
||||
NAME = Sneaky Weasel
|
||||
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ static void __init qnap_ts219_init(void)
|
|||
static int __init ts219_pci_init(void)
|
||||
{
|
||||
if (machine_is_ts219())
|
||||
kirkwood_pcie_init(KW_PCIE0);
|
||||
kirkwood_pcie_init(KW_PCIE1 | KW_PCIE0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -343,7 +343,7 @@ static struct resource orion_ge10_shared_resources[] = {
|
|||
|
||||
static struct platform_device orion_ge10_shared = {
|
||||
.name = MV643XX_ETH_SHARED_NAME,
|
||||
.id = 1,
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &orion_ge10_shared_data,
|
||||
},
|
||||
|
|
@ -358,8 +358,8 @@ static struct resource orion_ge10_resources[] = {
|
|||
|
||||
static struct platform_device orion_ge10 = {
|
||||
.name = MV643XX_ETH_NAME,
|
||||
.id = 1,
|
||||
.num_resources = 2,
|
||||
.id = 2,
|
||||
.num_resources = 1,
|
||||
.resource = orion_ge10_resources,
|
||||
.dev = {
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
|
|
@ -397,7 +397,7 @@ static struct resource orion_ge11_shared_resources[] = {
|
|||
|
||||
static struct platform_device orion_ge11_shared = {
|
||||
.name = MV643XX_ETH_SHARED_NAME,
|
||||
.id = 1,
|
||||
.id = 3,
|
||||
.dev = {
|
||||
.platform_data = &orion_ge11_shared_data,
|
||||
},
|
||||
|
|
@ -412,8 +412,8 @@ static struct resource orion_ge11_resources[] = {
|
|||
|
||||
static struct platform_device orion_ge11 = {
|
||||
.name = MV643XX_ETH_NAME,
|
||||
.id = 1,
|
||||
.num_resources = 2,
|
||||
.id = 3,
|
||||
.num_resources = 1,
|
||||
.resource = orion_ge11_resources,
|
||||
.dev = {
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
|
|||
break;
|
||||
case R_AVR32_GOT18SW:
|
||||
if ((relocation & 0xfffe0003) != 0
|
||||
&& (relocation & 0xfffc0003) != 0xffff0000)
|
||||
&& (relocation & 0xfffc0000) != 0xfffc0000)
|
||||
return reloc_overflow(module, "R_AVR32_GOT18SW",
|
||||
relocation);
|
||||
relocation >>= 2;
|
||||
|
|
|
|||
|
|
@ -69,6 +69,8 @@ extern unsigned long end_iomem;
|
|||
#define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
|
||||
#define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC)
|
||||
|
||||
#define io_remap_pfn_range remap_pfn_range
|
||||
|
||||
/*
|
||||
* The i386 can't do page protection for execute, and considers that the same
|
||||
* are read.
|
||||
|
|
|
|||
|
|
@ -448,6 +448,22 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13 - 2000 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_ignore_initial_backlight,
|
||||
.ident = "HP Pavilion g6 Notebook PC",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion g6 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_ignore_initial_backlight,
|
||||
.ident = "HP Pavilion m4",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1599,6 +1599,12 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
|
|||
qc->tf = *tf;
|
||||
if (cdb)
|
||||
memcpy(qc->cdb, cdb, ATAPI_CDB_LEN);
|
||||
|
||||
/* some SATA bridges need us to indicate data xfer direction */
|
||||
if (tf->protocol == ATAPI_PROT_DMA && (dev->flags & ATA_DFLAG_DMADIR) &&
|
||||
dma_dir == DMA_FROM_DEVICE)
|
||||
qc->tf.feature |= ATAPI_DMADIR;
|
||||
|
||||
qc->flags |= ATA_QCFLAG_RESULT_TF;
|
||||
qc->dma_dir = dma_dir;
|
||||
if (dma_dir != DMA_NONE) {
|
||||
|
|
|
|||
|
|
@ -117,13 +117,13 @@ static struct page *brd_insert_page(struct brd_device *brd, sector_t sector)
|
|||
|
||||
spin_lock(&brd->brd_lock);
|
||||
idx = sector >> PAGE_SECTORS_SHIFT;
|
||||
page->index = idx;
|
||||
if (radix_tree_insert(&brd->brd_pages, idx, page)) {
|
||||
__free_page(page);
|
||||
page = radix_tree_lookup(&brd->brd_pages, idx);
|
||||
BUG_ON(!page);
|
||||
BUG_ON(page->index != idx);
|
||||
} else
|
||||
page->index = idx;
|
||||
}
|
||||
spin_unlock(&brd->brd_lock);
|
||||
|
||||
radix_tree_preload_end();
|
||||
|
|
|
|||
|
|
@ -976,7 +976,7 @@ EXPORT_SYMBOL(drm_vblank_off);
|
|||
*/
|
||||
void drm_vblank_pre_modeset(struct drm_device *dev, int crtc)
|
||||
{
|
||||
/* vblank is not initialized (IRQ not installed ?) */
|
||||
/* vblank is not initialized (IRQ not installed ?), or has been freed */
|
||||
if (!dev->num_crtcs)
|
||||
return;
|
||||
/*
|
||||
|
|
@ -998,6 +998,10 @@ void drm_vblank_post_modeset(struct drm_device *dev, int crtc)
|
|||
{
|
||||
unsigned long irqflags;
|
||||
|
||||
/* vblank is not initialized (IRQ not installed ?), or has been freed */
|
||||
if (!dev->num_crtcs)
|
||||
return;
|
||||
|
||||
if (dev->vblank_inmodeset[crtc]) {
|
||||
spin_lock_irqsave(&dev->vbl_lock, irqflags);
|
||||
dev->vblank_disable_allowed = 1;
|
||||
|
|
|
|||
|
|
@ -1609,7 +1609,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)
|
|||
* Assume that the preferred modes are
|
||||
* arranged in priority order.
|
||||
*/
|
||||
intel_ddc_get_modes(connector, intel_sdvo->i2c);
|
||||
intel_ddc_get_modes(connector, &intel_sdvo->ddc);
|
||||
if (list_empty(&connector->probed_modes) == false)
|
||||
goto end;
|
||||
|
||||
|
|
|
|||
|
|
@ -352,18 +352,17 @@ bool radeon_card_posted(struct radeon_device *rdev)
|
|||
uint32_t reg;
|
||||
|
||||
/* first check CRTCs */
|
||||
if (ASIC_IS_DCE41(rdev)) {
|
||||
if (ASIC_IS_DCE4(rdev)) {
|
||||
reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) |
|
||||
RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
|
||||
if (reg & EVERGREEN_CRTC_MASTER_EN)
|
||||
return true;
|
||||
} else if (ASIC_IS_DCE4(rdev)) {
|
||||
reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) |
|
||||
RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) |
|
||||
RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) |
|
||||
RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET) |
|
||||
RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET) |
|
||||
RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
|
||||
if (rdev->num_crtc >= 4) {
|
||||
reg |= RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) |
|
||||
RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET);
|
||||
}
|
||||
if (rdev->num_crtc >= 6) {
|
||||
reg |= RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET) |
|
||||
RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
|
||||
}
|
||||
if (reg & EVERGREEN_CRTC_MASTER_EN)
|
||||
return true;
|
||||
} else if (ASIC_IS_AVIVO(rdev)) {
|
||||
|
|
|
|||
|
|
@ -311,26 +311,68 @@ static int adm1021_detect(struct i2c_client *client,
|
|||
man_id = i2c_smbus_read_byte_data(client, ADM1021_REG_MAN_ID);
|
||||
dev_id = i2c_smbus_read_byte_data(client, ADM1021_REG_DEV_ID);
|
||||
|
||||
if (man_id < 0 || dev_id < 0)
|
||||
return -ENODEV;
|
||||
|
||||
if (man_id == 0x4d && dev_id == 0x01)
|
||||
type_name = "max1617a";
|
||||
else if (man_id == 0x41) {
|
||||
if ((dev_id & 0xF0) == 0x30)
|
||||
type_name = "adm1023";
|
||||
else
|
||||
else if ((dev_id & 0xF0) == 0x00)
|
||||
type_name = "adm1021";
|
||||
else
|
||||
return -ENODEV;
|
||||
} else if (man_id == 0x49)
|
||||
type_name = "thmc10";
|
||||
else if (man_id == 0x23)
|
||||
type_name = "gl523sm";
|
||||
else if (man_id == 0x54)
|
||||
type_name = "mc1066";
|
||||
/* LM84 Mfr ID in a different place, and it has more unused bits */
|
||||
else if (conv_rate == 0x00
|
||||
&& (config & 0x7F) == 0x00
|
||||
&& (status & 0xAB) == 0x00)
|
||||
type_name = "lm84";
|
||||
else
|
||||
type_name = "max1617";
|
||||
else {
|
||||
int lte, rte, lhi, rhi, llo, rlo;
|
||||
|
||||
/* extra checks for LM84 and MAX1617 to avoid misdetections */
|
||||
|
||||
llo = i2c_smbus_read_byte_data(client, ADM1021_REG_THYST_R(0));
|
||||
rlo = i2c_smbus_read_byte_data(client, ADM1021_REG_THYST_R(1));
|
||||
|
||||
/* fail if any of the additional register reads failed */
|
||||
if (llo < 0 || rlo < 0)
|
||||
return -ENODEV;
|
||||
|
||||
lte = i2c_smbus_read_byte_data(client, ADM1021_REG_TEMP(0));
|
||||
rte = i2c_smbus_read_byte_data(client, ADM1021_REG_TEMP(1));
|
||||
lhi = i2c_smbus_read_byte_data(client, ADM1021_REG_TOS_R(0));
|
||||
rhi = i2c_smbus_read_byte_data(client, ADM1021_REG_TOS_R(1));
|
||||
|
||||
/*
|
||||
* Fail for negative temperatures and negative high limits.
|
||||
* This check also catches read errors on the tested registers.
|
||||
*/
|
||||
if ((s8)lte < 0 || (s8)rte < 0 || (s8)lhi < 0 || (s8)rhi < 0)
|
||||
return -ENODEV;
|
||||
|
||||
/* fail if all registers hold the same value */
|
||||
if (lte == rte && lte == lhi && lte == rhi && lte == llo
|
||||
&& lte == rlo)
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* LM84 Mfr ID is in a different place,
|
||||
* and it has more unused bits.
|
||||
*/
|
||||
if (conv_rate == 0x00
|
||||
&& (config & 0x7F) == 0x00
|
||||
&& (status & 0xAB) == 0x00) {
|
||||
type_name = "lm84";
|
||||
} else {
|
||||
/* fail if low limits are larger than high limits */
|
||||
if ((s8)llo > lhi || (s8)rlo > rhi)
|
||||
return -ENODEV;
|
||||
type_name = "max1617";
|
||||
}
|
||||
}
|
||||
|
||||
pr_debug("adm1021: Detected chip %s at adapter %d, address 0x%02x.\n",
|
||||
type_name, i2c_adapter_id(adapter), client->addr);
|
||||
|
|
|
|||
|
|
@ -8656,6 +8656,13 @@ static int __must_check __init get_thinkpad_model_data(
|
|||
tp->model_str = kstrdup(s, GFP_KERNEL);
|
||||
if (!tp->model_str)
|
||||
return -ENOMEM;
|
||||
} else {
|
||||
s = dmi_get_system_info(DMI_BIOS_VENDOR);
|
||||
if (s && !(strnicmp(s, "Lenovo", 6))) {
|
||||
tp->model_str = kstrdup(s, GFP_KERNEL);
|
||||
if (!tp->model_str)
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
s = dmi_get_system_info(DMI_PRODUCT_NAME);
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ static int hostap_disable_hostapd(PSDevice pDevice, int rtnl_locked)
|
|||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%s: Netdevice %s unregistered\n",
|
||||
pDevice->dev->name, pDevice->apdev->name);
|
||||
}
|
||||
kfree(pDevice->apdev);
|
||||
free_netdev(pDevice->apdev);
|
||||
pDevice->apdev = NULL;
|
||||
pDevice->bEnable8021x = FALSE;
|
||||
pDevice->bEnableHostWEP = FALSE;
|
||||
|
|
|
|||
|
|
@ -1531,6 +1531,14 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
|
|||
tty->real_raw = 0;
|
||||
}
|
||||
n_tty_set_room(tty);
|
||||
/*
|
||||
* Fix tty hang when I_IXON(tty) is cleared, but the tty
|
||||
* been stopped by STOP_CHAR(tty) before it.
|
||||
*/
|
||||
if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow_stopped) {
|
||||
start_tty(tty);
|
||||
}
|
||||
|
||||
/* The termios change make the tty ready for I/O */
|
||||
wake_up_interruptible(&tty->write_wait);
|
||||
wake_up_interruptible(&tty->read_wait);
|
||||
|
|
|
|||
|
|
@ -686,7 +686,8 @@ static int cxacru_cm_get_array(struct cxacru_data *instance, enum cxacru_cm_requ
|
|||
{
|
||||
int ret, len;
|
||||
__le32 *buf;
|
||||
int offb, offd;
|
||||
int offb;
|
||||
unsigned int offd;
|
||||
const int stride = CMD_PACKET_SIZE / (4 * 2) - 1;
|
||||
int buflen = ((size - 1) / stride + 1 + size * 2) * 4;
|
||||
|
||||
|
|
|
|||
|
|
@ -110,6 +110,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
/* Edirol SD-20 */
|
||||
{ USB_DEVICE(0x0582, 0x0027), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* Alcor Micro Corp. Hub */
|
||||
{ USB_DEVICE(0x058f, 0x9254), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* appletouch */
|
||||
{ USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
|
|
|
|||
|
|
@ -236,7 +236,7 @@ static inline unsigned char tt_start_uframe(struct ehci_hcd *ehci, __hc32 mask)
|
|||
}
|
||||
|
||||
static const unsigned char
|
||||
max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 125, 25 };
|
||||
max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 30, 0 };
|
||||
|
||||
/* carryover low/fullspeed bandwidth that crosses uframe boundries */
|
||||
static inline void carryover_tt_bandwidth(unsigned short tt_usecs[8])
|
||||
|
|
|
|||
|
|
@ -221,7 +221,8 @@ static int uhci_hub_status_data(struct usb_hcd *hcd, char *buf)
|
|||
/* auto-stop if nothing connected for 1 second */
|
||||
if (any_ports_active(uhci))
|
||||
uhci->rh_state = UHCI_RH_RUNNING;
|
||||
else if (time_after_eq(jiffies, uhci->auto_stop_time))
|
||||
else if (time_after_eq(jiffies, uhci->auto_stop_time) &&
|
||||
!uhci->wait_for_hp)
|
||||
suspend_rh(uhci, UHCI_RH_AUTO_STOPPED);
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ static int debug;
|
|||
#define DRIVER_NAME "ark3116"
|
||||
|
||||
/* usb timeout of 1 second */
|
||||
#define ARK_TIMEOUT (1*HZ)
|
||||
#define ARK_TIMEOUT 1000
|
||||
|
||||
static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(0x6547, 0x0232) },
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@ static const struct usb_device_id id_table_earthmate[] = {
|
|||
static const struct usb_device_id id_table_cyphidcomrs232[] = {
|
||||
{ USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },
|
||||
{ USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) },
|
||||
{ USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
|
|
@ -109,6 +110,7 @@ static const struct usb_device_id id_table_combined[] = {
|
|||
{ USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) },
|
||||
{ USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },
|
||||
{ USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) },
|
||||
{ USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) },
|
||||
{ USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
|
@ -268,6 +270,12 @@ static struct usb_serial_driver cypress_ca42v2_device = {
|
|||
* Cypress serial helper functions
|
||||
*****************************************************************************/
|
||||
|
||||
/* FRWD Dongle hidcom needs to skip reset and speed checks */
|
||||
static inline bool is_frwd(struct usb_device *dev)
|
||||
{
|
||||
return ((le16_to_cpu(dev->descriptor.idVendor) == VENDOR_ID_FRWD) &&
|
||||
(le16_to_cpu(dev->descriptor.idProduct) == PRODUCT_ID_CYPHIDCOM_FRWD));
|
||||
}
|
||||
|
||||
static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate)
|
||||
{
|
||||
|
|
@ -277,6 +285,10 @@ static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate)
|
|||
if (unstable_bauds)
|
||||
return new_rate;
|
||||
|
||||
/* FRWD Dongle uses 115200 bps */
|
||||
if (is_frwd(port->serial->dev))
|
||||
return new_rate;
|
||||
|
||||
/*
|
||||
* The general purpose firmware for the Cypress M8 allows for
|
||||
* a maximum speed of 57600bps (I have no idea whether DeLorme
|
||||
|
|
@ -490,7 +502,11 @@ static int generic_startup(struct usb_serial *serial)
|
|||
}
|
||||
init_waitqueue_head(&priv->delta_msr_wait);
|
||||
|
||||
usb_reset_configuration(serial->dev);
|
||||
/* Skip reset for FRWD device. It is a workaound:
|
||||
device hangs if it receives SET_CONFIGURE in Configured
|
||||
state. */
|
||||
if (!is_frwd(serial->dev))
|
||||
usb_reset_configuration(serial->dev);
|
||||
|
||||
priv->cmd_ctrl = 0;
|
||||
priv->line_control = 0;
|
||||
|
|
|
|||
|
|
@ -24,6 +24,10 @@
|
|||
#define VENDOR_ID_CYPRESS 0x04b4
|
||||
#define PRODUCT_ID_CYPHIDCOM 0x5500
|
||||
|
||||
/* FRWD Dongle - a GPS sports watch */
|
||||
#define VENDOR_ID_FRWD 0x6737
|
||||
#define PRODUCT_ID_CYPHIDCOM_FRWD 0x0001
|
||||
|
||||
/* Powercom UPS, chip CY7C63723 */
|
||||
#define VENDOR_ID_POWERCOM 0x0d9f
|
||||
#define PRODUCT_ID_UPS 0x0002
|
||||
|
|
|
|||
|
|
@ -197,6 +197,8 @@ static struct usb_device_id id_table_combined [] = {
|
|||
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_BOOST_PID) },
|
||||
{ USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) },
|
||||
{ USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_CC_PID) },
|
||||
{ USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_AGP_PID) },
|
||||
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
|
||||
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
|
||||
|
|
@ -2139,6 +2141,9 @@ static void ftdi_set_termios(struct tty_struct *tty,
|
|||
|
||||
cflag = termios->c_cflag;
|
||||
|
||||
if (!old_termios)
|
||||
goto no_skip;
|
||||
|
||||
if (old_termios->c_cflag == termios->c_cflag
|
||||
&& old_termios->c_ispeed == termios->c_ispeed
|
||||
&& old_termios->c_ospeed == termios->c_ospeed)
|
||||
|
|
@ -2152,6 +2157,7 @@ static void ftdi_set_termios(struct tty_struct *tty,
|
|||
(termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)))
|
||||
goto no_data_parity_stop_changes;
|
||||
|
||||
no_skip:
|
||||
/* Set number of data bits, parity, stop bits */
|
||||
|
||||
urb_value = 0;
|
||||
|
|
|
|||
|
|
@ -772,6 +772,8 @@
|
|||
*/
|
||||
#define NEWPORT_VID 0x104D
|
||||
#define NEWPORT_AGILIS_PID 0x3000
|
||||
#define NEWPORT_CONEX_CC_PID 0x3002
|
||||
#define NEWPORT_CONEX_AGP_PID 0x3006
|
||||
|
||||
/* Interbiometrics USB I/O Board */
|
||||
/* Developed for Interbiometrics by Rudolf Gugler */
|
||||
|
|
|
|||
|
|
@ -558,6 +558,9 @@ static void chase_port(struct edgeport_port *port, unsigned long timeout,
|
|||
wait_queue_t wait;
|
||||
unsigned long flags;
|
||||
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
if (!timeout)
|
||||
timeout = (HZ * EDGE_CLOSING_WAIT)/100;
|
||||
|
||||
|
|
|
|||
|
|
@ -327,7 +327,7 @@ static int bulk_immediate(struct usb_serial_port *port, u8 *buf, u8 count)
|
|||
usb_bulk_msg(serial->dev,
|
||||
usb_sndbulkpipe(serial->dev,
|
||||
port->bulk_out_endpointAddress), buf,
|
||||
count, &actual, HZ * 1);
|
||||
count, &actual, 1000);
|
||||
|
||||
if (status != IUU_OPERATION_OK)
|
||||
dbg("%s - error = %2x", __func__, status);
|
||||
|
|
@ -350,7 +350,7 @@ static int read_immediate(struct usb_serial_port *port, u8 *buf, u8 count)
|
|||
usb_bulk_msg(serial->dev,
|
||||
usb_rcvbulkpipe(serial->dev,
|
||||
port->bulk_in_endpointAddress), buf,
|
||||
count, &actual, HZ * 1);
|
||||
count, &actual, 1000);
|
||||
|
||||
if (status != IUU_OPERATION_OK)
|
||||
dbg("%s - error = %2x", __func__, status);
|
||||
|
|
|
|||
|
|
@ -1833,7 +1833,7 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,
|
|||
d_details = s_priv->device_details;
|
||||
device_port = port->number - port->serial->minor;
|
||||
|
||||
outcont_urb = d_details->outcont_endpoints[port->number];
|
||||
outcont_urb = d_details->outcont_endpoints[device_port];
|
||||
this_urb = p_priv->outcont_urb;
|
||||
|
||||
dbg("%s - endpoint %d", __func__, usb_pipeendpoint(this_urb->pipe));
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@
|
|||
#define DRIVER_DESC "Moschip USB Serial Driver"
|
||||
|
||||
/* default urb timeout */
|
||||
#define MOS_WDR_TIMEOUT (HZ * 5)
|
||||
#define MOS_WDR_TIMEOUT 5000
|
||||
|
||||
#define MOS_MAX_PORT 0x02
|
||||
#define MOS_WRITE 0x0E
|
||||
|
|
@ -234,11 +234,22 @@ static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum,
|
|||
__u8 requesttype = (__u8)0xc0;
|
||||
__u16 index = get_reg_index(reg);
|
||||
__u16 value = get_reg_value(reg, serial_portnum);
|
||||
int status = usb_control_msg(usbdev, pipe, request, requesttype, value,
|
||||
index, data, 1, MOS_WDR_TIMEOUT);
|
||||
if (status < 0)
|
||||
u8 *buf;
|
||||
int status;
|
||||
|
||||
buf = kmalloc(1, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
status = usb_control_msg(usbdev, pipe, request, requesttype, value,
|
||||
index, buf, 1, MOS_WDR_TIMEOUT);
|
||||
if (status == 1)
|
||||
*data = *buf;
|
||||
else if (status < 0)
|
||||
dev_err(&usbdev->dev,
|
||||
"mos7720: usb_control_msg() failed: %d", status);
|
||||
kfree(buf);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1700,7 +1711,7 @@ static void change_port_settings(struct tty_struct *tty,
|
|||
mos7720_port->shadowMCR |= (UART_MCR_XONANY);
|
||||
/* To set hardware flow control to the specified *
|
||||
* serial port, in SP1/2_CONTROL_REG */
|
||||
if (port->number)
|
||||
if (port_number)
|
||||
write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x01);
|
||||
else
|
||||
write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x02);
|
||||
|
|
@ -2113,7 +2124,7 @@ static int mos7720_startup(struct usb_serial *serial)
|
|||
|
||||
/* setting configuration feature to one */
|
||||
usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
|
||||
(__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5*HZ);
|
||||
(__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5000);
|
||||
|
||||
/* start the interrupt urb */
|
||||
ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL);
|
||||
|
|
@ -2158,7 +2169,7 @@ static void mos7720_release(struct usb_serial *serial)
|
|||
/* wait for synchronous usb calls to return */
|
||||
if (mos_parport->msg_pending)
|
||||
wait_for_completion_timeout(&mos_parport->syncmsg_compl,
|
||||
MOS_WDR_TIMEOUT);
|
||||
msecs_to_jiffies(MOS_WDR_TIMEOUT));
|
||||
|
||||
parport_remove_port(mos_parport->pp);
|
||||
usb_set_serial_data(serial, NULL);
|
||||
|
|
|
|||
|
|
@ -196,6 +196,7 @@ static void option_instat_callback(struct urb *urb);
|
|||
|
||||
#define DELL_PRODUCT_5800_MINICARD_VZW 0x8195 /* Novatel E362 */
|
||||
#define DELL_PRODUCT_5800_V2_MINICARD_VZW 0x8196 /* Novatel E362 */
|
||||
#define DELL_PRODUCT_5804_MINICARD_ATT 0x819b /* Novatel E371 */
|
||||
|
||||
#define KYOCERA_VENDOR_ID 0x0c88
|
||||
#define KYOCERA_PRODUCT_KPC650 0x17da
|
||||
|
|
@ -341,8 +342,8 @@ static void option_instat_callback(struct urb *urb);
|
|||
#define CINTERION_PRODUCT_EU3_E 0x0051
|
||||
#define CINTERION_PRODUCT_EU3_P 0x0052
|
||||
#define CINTERION_PRODUCT_PH8 0x0053
|
||||
#define CINTERION_PRODUCT_AH6 0x0055
|
||||
#define CINTERION_PRODUCT_PLS8 0x0060
|
||||
#define CINTERION_PRODUCT_AHXX 0x0055
|
||||
#define CINTERION_PRODUCT_PLXX 0x0060
|
||||
|
||||
/* Olivetti products */
|
||||
#define OLIVETTI_VENDOR_ID 0x0b3c
|
||||
|
|
@ -592,6 +593,8 @@ static const struct usb_device_id option_ids[] = {
|
|||
.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x14ac, 0xff, 0xff, 0xff), /* Huawei E1820 */
|
||||
.driver_info = (kernel_ulong_t) &net_intf1_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0xff, 0xff) },
|
||||
|
|
@ -771,6 +774,7 @@ static const struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5800_MINICARD_VZW, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5800_V2_MINICARD_VZW, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5804_MINICARD_ATT, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */
|
||||
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
|
||||
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
|
||||
|
|
@ -966,6 +970,8 @@ static const struct usb_device_id option_ids[] = {
|
|||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0330, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0395, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0412, 0xff, 0xff, 0xff), /* Telewell TW-LTE 4G */
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0414, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0417, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff),
|
||||
|
|
@ -1264,8 +1270,9 @@ static const struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AH6) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLS8) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLXX),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) },
|
||||
{ USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDM) },
|
||||
|
|
|
|||
|
|
@ -600,6 +600,7 @@ static int treo_attach(struct usb_serial *serial)
|
|||
dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress;\
|
||||
dest->bulk_in_buffer = src->bulk_in_buffer; \
|
||||
dest->interrupt_in_urb = src->interrupt_in_urb; \
|
||||
dest->interrupt_in_urb->context = dest; \
|
||||
dest->interrupt_in_endpointAddress = \
|
||||
src->interrupt_in_endpointAddress;\
|
||||
dest->interrupt_in_buffer = src->interrupt_in_buffer; \
|
||||
|
|
|
|||
|
|
@ -1209,7 +1209,7 @@ static void firm_setup_port(struct tty_struct *tty)
|
|||
struct whiteheat_port_settings port_settings;
|
||||
unsigned int cflag = tty->termios->c_cflag;
|
||||
|
||||
port_settings.port = port->number + 1;
|
||||
port_settings.port = port->number - port->serial->minor + 1;
|
||||
|
||||
/* get the byte size */
|
||||
switch (cflag & CSIZE) {
|
||||
|
|
|
|||
|
|
@ -1153,7 +1153,7 @@ static void __xen_evtchn_do_upcall(void)
|
|||
{
|
||||
int start_word_idx, start_bit_idx;
|
||||
int word_idx, bit_idx;
|
||||
int i;
|
||||
int i, irq;
|
||||
int cpu = get_cpu();
|
||||
struct shared_info *s = HYPERVISOR_shared_info;
|
||||
struct vcpu_info *vcpu_info = __this_cpu_read(xen_vcpu);
|
||||
|
|
@ -1161,6 +1161,8 @@ static void __xen_evtchn_do_upcall(void)
|
|||
|
||||
do {
|
||||
unsigned long pending_words;
|
||||
unsigned long pending_bits;
|
||||
struct irq_desc *desc;
|
||||
|
||||
vcpu_info->evtchn_upcall_pending = 0;
|
||||
|
||||
|
|
@ -1171,6 +1173,17 @@ static void __xen_evtchn_do_upcall(void)
|
|||
/* Clear master flag /before/ clearing selector flag. */
|
||||
wmb();
|
||||
#endif
|
||||
if ((irq = per_cpu(virq_to_irq, cpu)[VIRQ_TIMER]) != -1) {
|
||||
int evtchn = evtchn_from_irq(irq);
|
||||
word_idx = evtchn / BITS_PER_LONG;
|
||||
pending_bits = evtchn % BITS_PER_LONG;
|
||||
if (active_evtchns(cpu, s, word_idx) & (1ULL << pending_bits)) {
|
||||
desc = irq_to_desc(irq);
|
||||
if (desc)
|
||||
generic_handle_irq_desc(irq, desc);
|
||||
}
|
||||
}
|
||||
|
||||
pending_words = xchg(&vcpu_info->evtchn_pending_sel, 0);
|
||||
|
||||
start_word_idx = __this_cpu_read(current_word_idx);
|
||||
|
|
@ -1179,7 +1192,6 @@ static void __xen_evtchn_do_upcall(void)
|
|||
word_idx = start_word_idx;
|
||||
|
||||
for (i = 0; pending_words != 0; i++) {
|
||||
unsigned long pending_bits;
|
||||
unsigned long words;
|
||||
|
||||
words = MASK_LSBS(pending_words, word_idx);
|
||||
|
|
@ -1208,8 +1220,7 @@ static void __xen_evtchn_do_upcall(void)
|
|||
|
||||
do {
|
||||
unsigned long bits;
|
||||
int port, irq;
|
||||
struct irq_desc *desc;
|
||||
int port;
|
||||
|
||||
bits = MASK_LSBS(pending_bits, bit_idx);
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/vfs.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/inet.h>
|
||||
#include "cifsglob.h"
|
||||
#include "cifsproto.h"
|
||||
#include "cifsfs.h"
|
||||
|
|
@ -149,7 +150,8 @@ char *cifs_compose_mount_options(const char *sb_mountdata,
|
|||
* assuming that we have 'unc=' and 'ip=' in
|
||||
* the original sb_mountdata
|
||||
*/
|
||||
md_len = strlen(sb_mountdata) + rc + strlen(ref->node_name) + 12;
|
||||
md_len = strlen(sb_mountdata) + rc + strlen(ref->node_name) + 12 +
|
||||
INET6_ADDRSTRLEN;
|
||||
mountdata = kzalloc(md_len+1, GFP_KERNEL);
|
||||
if (mountdata == NULL) {
|
||||
rc = -ENOMEM;
|
||||
|
|
|
|||
|
|
@ -173,7 +173,8 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
|
|||
|
||||
if (fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL)
|
||||
inode->i_flags |= S_AUTOMOUNT;
|
||||
cifs_set_ops(inode);
|
||||
if (inode->i_state & I_NEW)
|
||||
cifs_set_ops(inode);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -1236,6 +1236,19 @@ static int fat_read_root(struct inode *inode)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static unsigned long calc_fat_clusters(struct super_block *sb)
|
||||
{
|
||||
struct msdos_sb_info *sbi = MSDOS_SB(sb);
|
||||
|
||||
/* Divide first to avoid overflow */
|
||||
if (sbi->fat_bits != 12) {
|
||||
unsigned long ent_per_sec = sb->s_blocksize * 8 / sbi->fat_bits;
|
||||
return ent_per_sec * sbi->fat_length;
|
||||
}
|
||||
|
||||
return sbi->fat_length * sb->s_blocksize * 8 / sbi->fat_bits;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read the super block of an MS-DOS FS.
|
||||
*/
|
||||
|
|
@ -1442,7 +1455,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
|
|||
sbi->fat_bits = (total_clusters > MAX_FAT12) ? 16 : 12;
|
||||
|
||||
/* check that FAT table does not overflow */
|
||||
fat_clusters = sbi->fat_length * sb->s_blocksize * 8 / sbi->fat_bits;
|
||||
fat_clusters = calc_fat_clusters(sb);
|
||||
total_clusters = min(total_clusters, fat_clusters - FAT_START_ENT);
|
||||
if (total_clusters > MAX_FAT(sb)) {
|
||||
if (!silent)
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ int jfs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
|||
{
|
||||
int wait = wbc->sync_mode == WB_SYNC_ALL;
|
||||
|
||||
if (test_cflag(COMMIT_Nolink, inode))
|
||||
if (inode->i_nlink == 0)
|
||||
return 0;
|
||||
/*
|
||||
* If COMMIT_DIRTY is not set, the inode isn't really dirty.
|
||||
|
|
|
|||
|
|
@ -1057,7 +1057,8 @@ static int lmLogSync(struct jfs_log * log, int hard_sync)
|
|||
*/
|
||||
void jfs_syncpt(struct jfs_log *log, int hard_sync)
|
||||
{ LOG_LOCK(log);
|
||||
lmLogSync(log, hard_sync);
|
||||
if (!test_bit(log_QUIESCE, &log->flag))
|
||||
lmLogSync(log, hard_sync);
|
||||
LOG_UNLOCK(log);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -195,13 +195,32 @@ static int nilfs_writepage(struct page *page, struct writeback_control *wbc)
|
|||
|
||||
static int nilfs_set_page_dirty(struct page *page)
|
||||
{
|
||||
int ret = __set_page_dirty_buffers(page);
|
||||
int ret = __set_page_dirty_nobuffers(page);
|
||||
|
||||
if (ret) {
|
||||
if (page_has_buffers(page)) {
|
||||
struct inode *inode = page->mapping->host;
|
||||
unsigned nr_dirty = 1 << (PAGE_SHIFT - inode->i_blkbits);
|
||||
unsigned nr_dirty = 0;
|
||||
struct buffer_head *bh, *head;
|
||||
|
||||
nilfs_set_file_dirty(inode, nr_dirty);
|
||||
/*
|
||||
* This page is locked by callers, and no other thread
|
||||
* concurrently marks its buffers dirty since they are
|
||||
* only dirtied through routines in fs/buffer.c in
|
||||
* which call sites of mark_buffer_dirty are protected
|
||||
* by page lock.
|
||||
*/
|
||||
bh = head = page_buffers(page);
|
||||
do {
|
||||
/* Do not mark hole blocks dirty */
|
||||
if (buffer_dirty(bh) || !buffer_mapped(bh))
|
||||
continue;
|
||||
|
||||
set_buffer_dirty(bh);
|
||||
nr_dirty++;
|
||||
} while (bh = bh->b_this_page, bh != head);
|
||||
|
||||
if (nr_dirty)
|
||||
nilfs_set_file_dirty(inode, nr_dirty);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -791,7 +791,7 @@ int ocfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
|||
&hole_size, &rec, &is_last);
|
||||
if (ret) {
|
||||
mlog_errno(ret);
|
||||
goto out;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (rec.e_blkno == 0ULL) {
|
||||
|
|
|
|||
|
|
@ -233,6 +233,8 @@ do { \
|
|||
if (!ret) \
|
||||
break; \
|
||||
} \
|
||||
if (!ret && (condition)) \
|
||||
ret = 1; \
|
||||
finish_wait(&wq, &__wait); \
|
||||
} while (0)
|
||||
|
||||
|
|
@ -249,8 +251,9 @@ do { \
|
|||
* wake_up() has to be called after changing any variable that could
|
||||
* change the result of the wait condition.
|
||||
*
|
||||
* The function returns 0 if the @timeout elapsed, and the remaining
|
||||
* jiffies if the condition evaluated to true before the timeout elapsed.
|
||||
* The function returns 0 if the @timeout elapsed, or the remaining
|
||||
* jiffies (at least 1) if the @condition evaluated to %true before
|
||||
* the @timeout elapsed.
|
||||
*/
|
||||
#define wait_event_timeout(wq, condition, timeout) \
|
||||
({ \
|
||||
|
|
@ -318,6 +321,8 @@ do { \
|
|||
ret = -ERESTARTSYS; \
|
||||
break; \
|
||||
} \
|
||||
if (!ret && (condition)) \
|
||||
ret = 1; \
|
||||
finish_wait(&wq, &__wait); \
|
||||
} while (0)
|
||||
|
||||
|
|
@ -334,9 +339,10 @@ do { \
|
|||
* wake_up() has to be called after changing any variable that could
|
||||
* change the result of the wait condition.
|
||||
*
|
||||
* The function returns 0 if the @timeout elapsed, -ERESTARTSYS if it
|
||||
* was interrupted by a signal, and the remaining jiffies otherwise
|
||||
* if the condition evaluated to true before the timeout elapsed.
|
||||
* Returns:
|
||||
* 0 if the @timeout elapsed, -%ERESTARTSYS if it was interrupted by
|
||||
* a signal, or the remaining jiffies (at least 1) if the @condition
|
||||
* evaluated to %true before the @timeout elapsed.
|
||||
*/
|
||||
#define wait_event_interruptible_timeout(wq, condition, timeout) \
|
||||
({ \
|
||||
|
|
|
|||
|
|
@ -933,6 +933,19 @@ static __init void ftrace_profile_debugfs(struct dentry *d_tracer)
|
|||
|
||||
static struct pid * const ftrace_swapper_pid = &init_struct_pid;
|
||||
|
||||
static loff_t
|
||||
ftrace_filter_lseek(struct file *file, loff_t offset, int whence)
|
||||
{
|
||||
loff_t ret;
|
||||
|
||||
if (file->f_mode & FMODE_READ)
|
||||
ret = seq_lseek(file, offset, whence);
|
||||
else
|
||||
file->f_pos = ret = 1;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
|
||||
#ifndef CONFIG_FTRACE_MCOUNT_RECORD
|
||||
|
|
@ -2299,19 +2312,6 @@ ftrace_notrace_open(struct inode *inode, struct file *file)
|
|||
inode, file);
|
||||
}
|
||||
|
||||
static loff_t
|
||||
ftrace_regex_lseek(struct file *file, loff_t offset, int origin)
|
||||
{
|
||||
loff_t ret;
|
||||
|
||||
if (file->f_mode & FMODE_READ)
|
||||
ret = seq_lseek(file, offset, origin);
|
||||
else
|
||||
file->f_pos = ret = 1;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ftrace_match(char *str, char *regex, int len, int type)
|
||||
{
|
||||
int matched = 0;
|
||||
|
|
@ -3118,7 +3118,7 @@ static const struct file_operations ftrace_filter_fops = {
|
|||
.open = ftrace_filter_open,
|
||||
.read = seq_read,
|
||||
.write = ftrace_filter_write,
|
||||
.llseek = ftrace_regex_lseek,
|
||||
.llseek = ftrace_filter_lseek,
|
||||
.release = ftrace_regex_release,
|
||||
};
|
||||
|
||||
|
|
@ -3126,7 +3126,7 @@ static const struct file_operations ftrace_notrace_fops = {
|
|||
.open = ftrace_notrace_open,
|
||||
.read = seq_read,
|
||||
.write = ftrace_notrace_write,
|
||||
.llseek = ftrace_regex_lseek,
|
||||
.llseek = ftrace_filter_lseek,
|
||||
.release = ftrace_regex_release,
|
||||
};
|
||||
|
||||
|
|
@ -3335,8 +3335,8 @@ static const struct file_operations ftrace_graph_fops = {
|
|||
.open = ftrace_graph_open,
|
||||
.read = seq_read,
|
||||
.write = ftrace_graph_write,
|
||||
.llseek = ftrace_filter_lseek,
|
||||
.release = ftrace_graph_release,
|
||||
.llseek = seq_lseek,
|
||||
};
|
||||
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
||||
|
||||
|
|
@ -3822,7 +3822,7 @@ static const struct file_operations ftrace_pid_fops = {
|
|||
.open = ftrace_pid_open,
|
||||
.write = ftrace_pid_write,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.llseek = ftrace_filter_lseek,
|
||||
.release = ftrace_pid_release,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -193,10 +193,10 @@ static void klist_release(struct kref *kref)
|
|||
if (waiter->node != n)
|
||||
continue;
|
||||
|
||||
list_del(&waiter->list);
|
||||
waiter->woken = 1;
|
||||
mb();
|
||||
wake_up_process(waiter->process);
|
||||
list_del(&waiter->list);
|
||||
}
|
||||
spin_unlock(&klist_remove_lock);
|
||||
knode_set_klist(n, NULL);
|
||||
|
|
|
|||
|
|
@ -1893,7 +1893,12 @@ static void collapse_huge_page(struct mm_struct *mm,
|
|||
pte_unmap(pte);
|
||||
spin_lock(&mm->page_table_lock);
|
||||
BUG_ON(!pmd_none(*pmd));
|
||||
set_pmd_at(mm, address, pmd, _pmd);
|
||||
/*
|
||||
* We can only use set_pmd_at when establishing
|
||||
* hugepmds and never for establishing regular pmds that
|
||||
* points to regular pagetables. Use pmd_populate for that
|
||||
*/
|
||||
pmd_populate(mm, pmd, pmd_pgtable(_pmd));
|
||||
spin_unlock(&mm->page_table_lock);
|
||||
anon_vma_unlock(vma->anon_vma);
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ static int remove_migration_pte(struct page *new, struct vm_area_struct *vma,
|
|||
if (PageHuge(new))
|
||||
pte = pte_mkhuge(pte);
|
||||
#endif
|
||||
flush_cache_page(vma, addr, pte_pfn(pte));
|
||||
flush_dcache_page(new);
|
||||
set_pte_at(mm, addr, ptep, pte);
|
||||
|
||||
if (PageHuge(new)) {
|
||||
|
|
|
|||
|
|
@ -37,51 +37,48 @@ static struct srcu_struct srcu;
|
|||
void __mmu_notifier_release(struct mm_struct *mm)
|
||||
{
|
||||
struct mmu_notifier *mn;
|
||||
struct hlist_node *node;
|
||||
int id;
|
||||
|
||||
/*
|
||||
* srcu_read_lock() here will block synchronize_srcu() in
|
||||
* mmu_notifier_unregister() until all registered
|
||||
* ->release() callouts this function makes have
|
||||
* returned.
|
||||
* SRCU here will block mmu_notifier_unregister until
|
||||
* ->release returns.
|
||||
*/
|
||||
id = srcu_read_lock(&srcu);
|
||||
hlist_for_each_entry_rcu(mn, node, &mm->mmu_notifier_mm->list, hlist)
|
||||
/*
|
||||
* If ->release runs before mmu_notifier_unregister it must be
|
||||
* handled, as it's the only way for the driver to flush all
|
||||
* existing sptes and stop the driver from establishing any more
|
||||
* sptes before all the pages in the mm are freed.
|
||||
*/
|
||||
if (mn->ops->release)
|
||||
mn->ops->release(mn, mm);
|
||||
srcu_read_unlock(&srcu, id);
|
||||
|
||||
spin_lock(&mm->mmu_notifier_mm->lock);
|
||||
while (unlikely(!hlist_empty(&mm->mmu_notifier_mm->list))) {
|
||||
mn = hlist_entry(mm->mmu_notifier_mm->list.first,
|
||||
struct mmu_notifier,
|
||||
hlist);
|
||||
|
||||
/*
|
||||
* Unlink. This will prevent mmu_notifier_unregister()
|
||||
* from also making the ->release() callout.
|
||||
* We arrived before mmu_notifier_unregister so
|
||||
* mmu_notifier_unregister will do nothing other than to wait
|
||||
* for ->release to finish and for mmu_notifier_unregister to
|
||||
* return.
|
||||
*/
|
||||
hlist_del_init_rcu(&mn->hlist);
|
||||
spin_unlock(&mm->mmu_notifier_mm->lock);
|
||||
|
||||
/*
|
||||
* Clear sptes. (see 'release' description in mmu_notifier.h)
|
||||
*/
|
||||
if (mn->ops->release)
|
||||
mn->ops->release(mn, mm);
|
||||
|
||||
spin_lock(&mm->mmu_notifier_mm->lock);
|
||||
}
|
||||
spin_unlock(&mm->mmu_notifier_mm->lock);
|
||||
|
||||
/*
|
||||
* All callouts to ->release() which we have done are complete.
|
||||
* Allow synchronize_srcu() in mmu_notifier_unregister() to complete
|
||||
*/
|
||||
srcu_read_unlock(&srcu, id);
|
||||
|
||||
/*
|
||||
* mmu_notifier_unregister() may have unlinked a notifier and may
|
||||
* still be calling out to it. Additionally, other notifiers
|
||||
* may have been active via vmtruncate() et. al. Block here
|
||||
* to ensure that all notifier callouts for this mm have been
|
||||
* completed and the sptes are really cleaned up before returning
|
||||
* to exit_mmap().
|
||||
* synchronize_srcu here prevents mmu_notifier_release from returning to
|
||||
* exit_mmap (which would proceed with freeing all pages in the mm)
|
||||
* until the ->release method returns, if it was invoked by
|
||||
* mmu_notifier_unregister.
|
||||
*
|
||||
* The mmu_notifier_mm can't go away from under us because one mm_count
|
||||
* is held by exit_mmap.
|
||||
*/
|
||||
synchronize_srcu(&srcu);
|
||||
}
|
||||
|
|
@ -302,31 +299,34 @@ void mmu_notifier_unregister(struct mmu_notifier *mn, struct mm_struct *mm)
|
|||
{
|
||||
BUG_ON(atomic_read(&mm->mm_count) <= 0);
|
||||
|
||||
spin_lock(&mm->mmu_notifier_mm->lock);
|
||||
if (!hlist_unhashed(&mn->hlist)) {
|
||||
/*
|
||||
* SRCU here will force exit_mmap to wait for ->release to
|
||||
* finish before freeing the pages.
|
||||
*/
|
||||
int id;
|
||||
|
||||
/*
|
||||
* Ensure we synchronize up with __mmu_notifier_release().
|
||||
*/
|
||||
id = srcu_read_lock(&srcu);
|
||||
|
||||
hlist_del_rcu(&mn->hlist);
|
||||
spin_unlock(&mm->mmu_notifier_mm->lock);
|
||||
|
||||
/*
|
||||
* exit_mmap will block in mmu_notifier_release to guarantee
|
||||
* that ->release is called before freeing the pages.
|
||||
*/
|
||||
if (mn->ops->release)
|
||||
mn->ops->release(mn, mm);
|
||||
|
||||
/*
|
||||
* Allow __mmu_notifier_release() to complete.
|
||||
*/
|
||||
srcu_read_unlock(&srcu, id);
|
||||
} else
|
||||
|
||||
spin_lock(&mm->mmu_notifier_mm->lock);
|
||||
/*
|
||||
* Can not use list_del_rcu() since __mmu_notifier_release
|
||||
* can delete it before we hold the lock.
|
||||
*/
|
||||
hlist_del_init_rcu(&mn->hlist);
|
||||
spin_unlock(&mm->mmu_notifier_mm->lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* Wait for any running method to finish, including ->release() if it
|
||||
* was run by __mmu_notifier_release() instead of us.
|
||||
* Wait for any running method to finish, of course including
|
||||
* ->release if it was run by mmu_notifier_relase instead of us.
|
||||
*/
|
||||
synchronize_srcu(&srcu);
|
||||
|
||||
|
|
|
|||
|
|
@ -1242,6 +1242,15 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local)
|
|||
|
||||
ASSERT_RTNL();
|
||||
|
||||
/*
|
||||
* Close all AP_VLAN interfaces first, as otherwise they
|
||||
* might be closed while the AP interface they belong to
|
||||
* is closed, causing unregister_netdevice_many() to crash.
|
||||
*/
|
||||
list_for_each_entry(sdata, &local->interfaces, list)
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
dev_close(sdata->dev);
|
||||
|
||||
mutex_lock(&local->iflist_mtx);
|
||||
list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {
|
||||
list_del(&sdata->list);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef __USBAUDIO_CARD_H
|
||||
#define __USBAUDIO_CARD_H
|
||||
|
||||
#define MAX_NR_RATES 1024
|
||||
#define MAX_PACKS 20
|
||||
#define MAX_PACKS_HS (MAX_PACKS * 8) /* in high speed mode */
|
||||
#define MAX_URBS 8
|
||||
|
|
|
|||
|
|
@ -226,7 +226,7 @@ static int parse_uac2_sample_rate_range(struct audioformat *fp, int nr_triplets,
|
|||
int min = combine_quad(&data[2 + 12 * i]);
|
||||
int max = combine_quad(&data[6 + 12 * i]);
|
||||
int res = combine_quad(&data[10 + 12 * i]);
|
||||
int rate;
|
||||
unsigned int rate;
|
||||
|
||||
if ((max < 0) || (min < 0) || (res < 0) || (max < min))
|
||||
continue;
|
||||
|
|
@ -253,6 +253,10 @@ static int parse_uac2_sample_rate_range(struct audioformat *fp, int nr_triplets,
|
|||
fp->rates |= snd_pcm_rate_to_rate_bit(rate);
|
||||
|
||||
nr_rates++;
|
||||
if (nr_rates >= MAX_NR_RATES) {
|
||||
snd_printk(KERN_ERR "invalid uac2 rates\n");
|
||||
break;
|
||||
}
|
||||
|
||||
/* avoid endless loop */
|
||||
if (res == 0)
|
||||
|
|
|
|||
|
|
@ -146,7 +146,13 @@
|
|||
.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
|
||||
},
|
||||
{
|
||||
USB_DEVICE(0x046d, 0x0990),
|
||||
.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|
||||
USB_DEVICE_ID_MATCH_INT_CLASS |
|
||||
USB_DEVICE_ID_MATCH_INT_SUBCLASS,
|
||||
.idVendor = 0x046d,
|
||||
.idProduct = 0x0990,
|
||||
.bInterfaceClass = USB_CLASS_AUDIO,
|
||||
.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
|
||||
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
||||
.vendor_name = "Logitech, Inc.",
|
||||
.product_name = "QuickCam Pro 9000",
|
||||
|
|
|
|||
|
|
@ -131,10 +131,14 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip,
|
|||
unsigned *rate_table = NULL;
|
||||
|
||||
fp = kmemdup(quirk->data, sizeof(*fp), GFP_KERNEL);
|
||||
if (! fp) {
|
||||
if (!fp) {
|
||||
snd_printk(KERN_ERR "cannot memdup\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (fp->nr_rates > MAX_NR_RATES) {
|
||||
kfree(fp);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (fp->nr_rates > 0) {
|
||||
rate_table = kmalloc(sizeof(int) * fp->nr_rates, GFP_KERNEL);
|
||||
if (!rate_table) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue