mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 14:41:39 +00:00
Merge branch 'console-fixes' into drm-next
(not the fbcon maintainer pull 2) fix bug in vgacon on bootup and fbcon losing fonts on startup. * console-fixes: (50 commits) fbcon: don't lose the console font across generic->chip driver switch vgacon/vt: clear buffer attributes when we load a 512 character font (v2)
This commit is contained in:
commit
62cd2fa82a
@ -1489,7 +1489,7 @@ AVR32 ARCHITECTURE
|
||||
M: Haavard Skinnemoen <hskinnemoen@gmail.com>
|
||||
M: Hans-Christian Egtvedt <egtvedt@samfundet.no>
|
||||
W: http://www.atmel.com/products/AVR32/
|
||||
W: http://avr32linux.org/
|
||||
W: http://mirror.egtvedt.no/avr32linux.org/
|
||||
W: http://avrfreaks.net/
|
||||
S: Maintained
|
||||
F: arch/avr32/
|
||||
|
@ -336,4 +336,14 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
|
||||
#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
|
||||
#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
|
||||
|
||||
/* drivers/base/dma-mapping.c */
|
||||
extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
|
||||
void *cpu_addr, dma_addr_t dma_addr, size_t size);
|
||||
extern int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt,
|
||||
void *cpu_addr, dma_addr_t dma_addr,
|
||||
size_t size);
|
||||
|
||||
#define dma_mmap_coherent(d, v, c, h, s) dma_common_mmap(d, v, c, h, s)
|
||||
#define dma_get_sgtable(d, t, v, h, s) dma_common_get_sgtable(d, t, v, h, s)
|
||||
|
||||
#endif /* __ASM_AVR32_DMA_MAPPING_H */
|
||||
|
@ -154,4 +154,14 @@ dma_cache_sync(struct device *dev, void *vaddr, size_t size,
|
||||
_dma_sync((dma_addr_t)vaddr, size, dir);
|
||||
}
|
||||
|
||||
/* drivers/base/dma-mapping.c */
|
||||
extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
|
||||
void *cpu_addr, dma_addr_t dma_addr, size_t size);
|
||||
extern int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt,
|
||||
void *cpu_addr, dma_addr_t dma_addr,
|
||||
size_t size);
|
||||
|
||||
#define dma_mmap_coherent(d, v, c, h, s) dma_common_mmap(d, v, c, h, s)
|
||||
#define dma_get_sgtable(d, t, v, h, s) dma_common_get_sgtable(d, t, v, h, s)
|
||||
|
||||
#endif /* _BLACKFIN_DMA_MAPPING_H */
|
||||
|
@ -89,4 +89,19 @@ extern void dma_free_coherent(struct device *, size_t, void *, dma_addr_t);
|
||||
#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent((d), (s), (h), (f))
|
||||
#define dma_free_noncoherent(d, s, v, h) dma_free_coherent((d), (s), (v), (h))
|
||||
|
||||
/* Not supported for now */
|
||||
static inline int dma_mmap_coherent(struct device *dev,
|
||||
struct vm_area_struct *vma, void *cpu_addr,
|
||||
dma_addr_t dma_addr, size_t size)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt,
|
||||
void *cpu_addr, dma_addr_t dma_addr,
|
||||
size_t size)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#endif /* _ASM_C6X_DMA_MAPPING_H */
|
||||
|
@ -158,5 +158,15 @@ dma_cache_sync(struct device *dev, void *vaddr, size_t size,
|
||||
{
|
||||
}
|
||||
|
||||
/* drivers/base/dma-mapping.c */
|
||||
extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
|
||||
void *cpu_addr, dma_addr_t dma_addr, size_t size);
|
||||
extern int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt,
|
||||
void *cpu_addr, dma_addr_t dma_addr,
|
||||
size_t size);
|
||||
|
||||
#define dma_mmap_coherent(d, v, c, h, s) dma_common_mmap(d, v, c, h, s)
|
||||
#define dma_get_sgtable(d, t, v, h, s) dma_common_get_sgtable(d, t, v, h, s)
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -132,4 +132,19 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
|
||||
flush_write_buffers();
|
||||
}
|
||||
|
||||
/* Not supported for now */
|
||||
static inline int dma_mmap_coherent(struct device *dev,
|
||||
struct vm_area_struct *vma, void *cpu_addr,
|
||||
dma_addr_t dma_addr, size_t size)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt,
|
||||
void *cpu_addr, dma_addr_t dma_addr,
|
||||
size_t size)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#endif /* _ASM_DMA_MAPPING_H */
|
||||
|
@ -115,4 +115,14 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t handle)
|
||||
#include <asm-generic/dma-mapping-broken.h>
|
||||
#endif
|
||||
|
||||
/* drivers/base/dma-mapping.c */
|
||||
extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
|
||||
void *cpu_addr, dma_addr_t dma_addr, size_t size);
|
||||
extern int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt,
|
||||
void *cpu_addr, dma_addr_t dma_addr,
|
||||
size_t size);
|
||||
|
||||
#define dma_mmap_coherent(d, v, c, h, s) dma_common_mmap(d, v, c, h, s)
|
||||
#define dma_get_sgtable(d, t, v, h, s) dma_common_get_sgtable(d, t, v, h, s)
|
||||
|
||||
#endif /* _M68K_DMA_MAPPING_H */
|
||||
|
@ -168,4 +168,19 @@ void dma_cache_sync(void *vaddr, size_t size,
|
||||
mn10300_dcache_flush_inv();
|
||||
}
|
||||
|
||||
/* Not supported for now */
|
||||
static inline int dma_mmap_coherent(struct device *dev,
|
||||
struct vm_area_struct *vma, void *cpu_addr,
|
||||
dma_addr_t dma_addr, size_t size)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt,
|
||||
void *cpu_addr, dma_addr_t dma_addr,
|
||||
size_t size)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -238,4 +238,19 @@ void * sba_get_iommu(struct parisc_device *dev);
|
||||
/* At the moment, we panic on error for IOMMU resource exaustion */
|
||||
#define dma_mapping_error(dev, x) 0
|
||||
|
||||
/* This API cannot be supported on PA-RISC */
|
||||
static inline int dma_mmap_coherent(struct device *dev,
|
||||
struct vm_area_struct *vma, void *cpu_addr,
|
||||
dma_addr_t dma_addr, size_t size)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt,
|
||||
void *cpu_addr, dma_addr_t dma_addr,
|
||||
size_t size)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -170,4 +170,19 @@ dma_cache_sync(struct device *dev, void *vaddr, size_t size,
|
||||
consistent_sync(vaddr, size, direction);
|
||||
}
|
||||
|
||||
/* Not supported for now */
|
||||
static inline int dma_mmap_coherent(struct device *dev,
|
||||
struct vm_area_struct *vma, void *cpu_addr,
|
||||
dma_addr_t dma_addr, size_t size)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt,
|
||||
void *cpu_addr, dma_addr_t dma_addr,
|
||||
size_t size)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#endif /* _XTENSA_DMA_MAPPING_H */
|
||||
|
@ -374,6 +374,7 @@ static int usb_keene_probe(struct usb_interface *intf,
|
||||
radio->vdev.ioctl_ops = &usb_keene_ioctl_ops;
|
||||
radio->vdev.lock = &radio->lock;
|
||||
radio->vdev.release = video_device_release_empty;
|
||||
radio->vdev.vfl_dir = VFL_DIR_TX;
|
||||
|
||||
radio->usbdev = interface_to_usbdev(intf);
|
||||
radio->intf = intf;
|
||||
|
@ -250,6 +250,7 @@ static struct video_device radio_si4713_vdev_template = {
|
||||
.name = "radio-si4713",
|
||||
.release = video_device_release,
|
||||
.ioctl_ops = &radio_si4713_ioctl_ops,
|
||||
.vfl_dir = VFL_DIR_TX,
|
||||
};
|
||||
|
||||
/* Platform driver interface */
|
||||
|
@ -1971,6 +1971,7 @@ static struct video_device wl1273_viddev_template = {
|
||||
.ioctl_ops = &wl1273_ioctl_ops,
|
||||
.name = WL1273_FM_DRIVER_NAME,
|
||||
.release = wl1273_vdev_release,
|
||||
.vfl_dir = VFL_DIR_TX,
|
||||
};
|
||||
|
||||
static int wl1273_fm_radio_remove(struct platform_device *pdev)
|
||||
|
@ -518,6 +518,16 @@ static struct video_device fm_viddev_template = {
|
||||
.ioctl_ops = &fm_drv_ioctl_ops,
|
||||
.name = FM_DRV_NAME,
|
||||
.release = video_device_release,
|
||||
/*
|
||||
* To ensure both the tuner and modulator ioctls are accessible we
|
||||
* set the vfl_dir to M2M to indicate this.
|
||||
*
|
||||
* It is not really a mem2mem device of course, but it can both receive
|
||||
* and transmit using the same radio device. It's the only radio driver
|
||||
* that does this and it should really be split in two radio devices,
|
||||
* but that would affect applications using this driver.
|
||||
*/
|
||||
.vfl_dir = VFL_DIR_M2M,
|
||||
};
|
||||
|
||||
int fm_v4l2_init_video_device(struct fmdev *fmdev, int radio_nr)
|
||||
|
@ -506,6 +506,7 @@ isl1208_rtc_interrupt(int irq, void *data)
|
||||
{
|
||||
unsigned long timeout = jiffies + msecs_to_jiffies(1000);
|
||||
struct i2c_client *client = data;
|
||||
struct rtc_device *rtc = i2c_get_clientdata(client);
|
||||
int handled = 0, sr, err;
|
||||
|
||||
/*
|
||||
@ -528,6 +529,8 @@ isl1208_rtc_interrupt(int irq, void *data)
|
||||
if (sr & ISL1208_REG_SR_ALM) {
|
||||
dev_dbg(&client->dev, "alarm!\n");
|
||||
|
||||
rtc_update_irq(rtc, 1, RTC_IRQF | RTC_AF);
|
||||
|
||||
/* Clear the alarm */
|
||||
sr &= ~ISL1208_REG_SR_ALM;
|
||||
sr = i2c_smbus_write_byte_data(client, ISL1208_REG_SR, sr);
|
||||
|
@ -44,6 +44,7 @@
|
||||
#define RTC_YMR 0x34 /* Year match register */
|
||||
#define RTC_YLR 0x38 /* Year data load register */
|
||||
|
||||
#define RTC_CR_EN (1 << 0) /* counter enable bit */
|
||||
#define RTC_CR_CWEN (1 << 26) /* Clockwatch enable bit */
|
||||
|
||||
#define RTC_TCR_EN (1 << 1) /* Periodic timer enable bit */
|
||||
@ -320,7 +321,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
|
||||
struct pl031_local *ldata;
|
||||
struct pl031_vendor_data *vendor = id->data;
|
||||
struct rtc_class_ops *ops = &vendor->ops;
|
||||
unsigned long time;
|
||||
unsigned long time, data;
|
||||
|
||||
ret = amba_request_regions(adev, NULL);
|
||||
if (ret)
|
||||
@ -345,10 +346,11 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
|
||||
dev_dbg(&adev->dev, "designer ID = 0x%02x\n", amba_manf(adev));
|
||||
dev_dbg(&adev->dev, "revision = 0x%01x\n", amba_rev(adev));
|
||||
|
||||
data = readl(ldata->base + RTC_CR);
|
||||
/* Enable the clockwatch on ST Variants */
|
||||
if (vendor->clockwatch)
|
||||
writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN,
|
||||
ldata->base + RTC_CR);
|
||||
data |= RTC_CR_CWEN;
|
||||
writel(data | RTC_CR_EN, ldata->base + RTC_CR);
|
||||
|
||||
/*
|
||||
* On ST PL031 variants, the RTC reset value does not provide correct
|
||||
|
@ -137,7 +137,7 @@ static int vt8500_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
writel((bin2bcd(tm->tm_year - 100) << DATE_YEAR_S)
|
||||
writel((bin2bcd(tm->tm_year % 100) << DATE_YEAR_S)
|
||||
| (bin2bcd(tm->tm_mon + 1) << DATE_MONTH_S)
|
||||
| (bin2bcd(tm->tm_mday))
|
||||
| ((tm->tm_year >= 200) << DATE_CENTURY_S),
|
||||
|
@ -638,7 +638,7 @@ static inline void save_screen(struct vc_data *vc)
|
||||
* Redrawing of screen
|
||||
*/
|
||||
|
||||
static void clear_buffer_attributes(struct vc_data *vc)
|
||||
void clear_buffer_attributes(struct vc_data *vc)
|
||||
{
|
||||
unsigned short *p = (unsigned short *)vc->vc_origin;
|
||||
int count = vc->vc_screenbuf_size / 2;
|
||||
|
@ -39,6 +39,7 @@
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb/hcd.h>
|
||||
@ -1025,6 +1026,49 @@ static int register_root_hub(struct usb_hcd *hcd)
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* usb_hcd_start_port_resume - a root-hub port is sending a resume signal
|
||||
* @bus: the bus which the root hub belongs to
|
||||
* @portnum: the port which is being resumed
|
||||
*
|
||||
* HCDs should call this function when they know that a resume signal is
|
||||
* being sent to a root-hub port. The root hub will be prevented from
|
||||
* going into autosuspend until usb_hcd_end_port_resume() is called.
|
||||
*
|
||||
* The bus's private lock must be held by the caller.
|
||||
*/
|
||||
void usb_hcd_start_port_resume(struct usb_bus *bus, int portnum)
|
||||
{
|
||||
unsigned bit = 1 << portnum;
|
||||
|
||||
if (!(bus->resuming_ports & bit)) {
|
||||
bus->resuming_ports |= bit;
|
||||
pm_runtime_get_noresume(&bus->root_hub->dev);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usb_hcd_start_port_resume);
|
||||
|
||||
/*
|
||||
* usb_hcd_end_port_resume - a root-hub port has stopped sending a resume signal
|
||||
* @bus: the bus which the root hub belongs to
|
||||
* @portnum: the port which is being resumed
|
||||
*
|
||||
* HCDs should call this function when they know that a resume signal has
|
||||
* stopped being sent to a root-hub port. The root hub will be allowed to
|
||||
* autosuspend again.
|
||||
*
|
||||
* The bus's private lock must be held by the caller.
|
||||
*/
|
||||
void usb_hcd_end_port_resume(struct usb_bus *bus, int portnum)
|
||||
{
|
||||
unsigned bit = 1 << portnum;
|
||||
|
||||
if (bus->resuming_ports & bit) {
|
||||
bus->resuming_ports &= ~bit;
|
||||
pm_runtime_put_noidle(&bus->root_hub->dev);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usb_hcd_end_port_resume);
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
|
@ -2838,6 +2838,23 @@ void usb_enable_ltm(struct usb_device *udev)
|
||||
EXPORT_SYMBOL_GPL(usb_enable_ltm);
|
||||
|
||||
#ifdef CONFIG_USB_SUSPEND
|
||||
/*
|
||||
* usb_disable_function_remotewakeup - disable usb3.0
|
||||
* device's function remote wakeup
|
||||
* @udev: target device
|
||||
*
|
||||
* Assume there's only one function on the USB 3.0
|
||||
* device and disable remote wake for the first
|
||||
* interface. FIXME if the interface association
|
||||
* descriptor shows there's more than one function.
|
||||
*/
|
||||
static int usb_disable_function_remotewakeup(struct usb_device *udev)
|
||||
{
|
||||
return usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
|
||||
USB_REQ_CLEAR_FEATURE, USB_RECIP_INTERFACE,
|
||||
USB_INTRF_FUNC_SUSPEND, 0, NULL, 0,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
}
|
||||
|
||||
/*
|
||||
* usb_port_suspend - suspend a usb device's upstream port
|
||||
@ -2955,12 +2972,19 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
|
||||
dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n",
|
||||
port1, status);
|
||||
/* paranoia: "should not happen" */
|
||||
if (udev->do_remote_wakeup)
|
||||
(void) usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
|
||||
USB_REQ_CLEAR_FEATURE, USB_RECIP_DEVICE,
|
||||
USB_DEVICE_REMOTE_WAKEUP, 0,
|
||||
NULL, 0,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
if (udev->do_remote_wakeup) {
|
||||
if (!hub_is_superspeed(hub->hdev)) {
|
||||
(void) usb_control_msg(udev,
|
||||
usb_sndctrlpipe(udev, 0),
|
||||
USB_REQ_CLEAR_FEATURE,
|
||||
USB_RECIP_DEVICE,
|
||||
USB_DEVICE_REMOTE_WAKEUP, 0,
|
||||
NULL, 0,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
} else
|
||||
(void) usb_disable_function_remotewakeup(udev);
|
||||
|
||||
}
|
||||
|
||||
/* Try to enable USB2 hardware LPM again */
|
||||
if (udev->usb2_hw_lpm_capable == 1)
|
||||
@ -3052,20 +3076,30 @@ static int finish_port_resume(struct usb_device *udev)
|
||||
* udev->reset_resume
|
||||
*/
|
||||
} else if (udev->actconfig && !udev->reset_resume) {
|
||||
le16_to_cpus(&devstatus);
|
||||
if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) {
|
||||
status = usb_control_msg(udev,
|
||||
usb_sndctrlpipe(udev, 0),
|
||||
USB_REQ_CLEAR_FEATURE,
|
||||
if (!hub_is_superspeed(udev->parent)) {
|
||||
le16_to_cpus(&devstatus);
|
||||
if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP))
|
||||
status = usb_control_msg(udev,
|
||||
usb_sndctrlpipe(udev, 0),
|
||||
USB_REQ_CLEAR_FEATURE,
|
||||
USB_RECIP_DEVICE,
|
||||
USB_DEVICE_REMOTE_WAKEUP, 0,
|
||||
NULL, 0,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
if (status)
|
||||
dev_dbg(&udev->dev,
|
||||
"disable remote wakeup, status %d\n",
|
||||
status);
|
||||
USB_DEVICE_REMOTE_WAKEUP, 0,
|
||||
NULL, 0,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
} else {
|
||||
status = usb_get_status(udev, USB_RECIP_INTERFACE, 0,
|
||||
&devstatus);
|
||||
le16_to_cpus(&devstatus);
|
||||
if (!status && devstatus & (USB_INTRF_STAT_FUNC_RW_CAP
|
||||
| USB_INTRF_STAT_FUNC_RW))
|
||||
status =
|
||||
usb_disable_function_remotewakeup(udev);
|
||||
}
|
||||
|
||||
if (status)
|
||||
dev_dbg(&udev->dev,
|
||||
"disable remote wakeup, status %d\n",
|
||||
status);
|
||||
status = 0;
|
||||
}
|
||||
return status;
|
||||
|
@ -797,6 +797,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
|
||||
ehci->reset_done[i] = jiffies + msecs_to_jiffies(25);
|
||||
set_bit(i, &ehci->resuming_ports);
|
||||
ehci_dbg (ehci, "port %d remote wakeup\n", i + 1);
|
||||
usb_hcd_start_port_resume(&hcd->self, i);
|
||||
mod_timer(&hcd->rh_timer, ehci->reset_done[i]);
|
||||
}
|
||||
}
|
||||
|
@ -649,7 +649,11 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf)
|
||||
status = STS_PCD;
|
||||
}
|
||||
}
|
||||
/* FIXME autosuspend idle root hubs */
|
||||
|
||||
/* If a resume is in progress, make sure it can finish */
|
||||
if (ehci->resuming_ports)
|
||||
mod_timer(&hcd->rh_timer, jiffies + msecs_to_jiffies(25));
|
||||
|
||||
spin_unlock_irqrestore (&ehci->lock, flags);
|
||||
return status ? retval : 0;
|
||||
}
|
||||
@ -851,6 +855,7 @@ static int ehci_hub_control (
|
||||
/* resume signaling for 20 msec */
|
||||
ehci->reset_done[wIndex] = jiffies
|
||||
+ msecs_to_jiffies(20);
|
||||
usb_hcd_start_port_resume(&hcd->self, wIndex);
|
||||
/* check the port again */
|
||||
mod_timer(&ehci_to_hcd(ehci)->rh_timer,
|
||||
ehci->reset_done[wIndex]);
|
||||
@ -862,6 +867,7 @@ static int ehci_hub_control (
|
||||
clear_bit(wIndex, &ehci->suspended_ports);
|
||||
set_bit(wIndex, &ehci->port_c_suspend);
|
||||
ehci->reset_done[wIndex] = 0;
|
||||
usb_hcd_end_port_resume(&hcd->self, wIndex);
|
||||
|
||||
/* stop resume signaling */
|
||||
temp = ehci_readl(ehci, status_reg);
|
||||
@ -950,6 +956,7 @@ static int ehci_hub_control (
|
||||
ehci->reset_done[wIndex] = 0;
|
||||
if (temp & PORT_PE)
|
||||
set_bit(wIndex, &ehci->port_c_suspend);
|
||||
usb_hcd_end_port_resume(&hcd->self, wIndex);
|
||||
}
|
||||
|
||||
if (temp & PORT_OC)
|
||||
|
@ -1197,17 +1197,26 @@ static void start_iaa_cycle(struct ehci_hcd *ehci, bool nested)
|
||||
if (ehci->async_iaa || ehci->async_unlinking)
|
||||
return;
|
||||
|
||||
/* Do all the waiting QHs at once */
|
||||
ehci->async_iaa = ehci->async_unlink;
|
||||
ehci->async_unlink = NULL;
|
||||
|
||||
/* If the controller isn't running, we don't have to wait for it */
|
||||
if (unlikely(ehci->rh_state < EHCI_RH_RUNNING)) {
|
||||
|
||||
/* Do all the waiting QHs */
|
||||
ehci->async_iaa = ehci->async_unlink;
|
||||
ehci->async_unlink = NULL;
|
||||
|
||||
if (!nested) /* Avoid recursion */
|
||||
end_unlink_async(ehci);
|
||||
|
||||
/* Otherwise start a new IAA cycle */
|
||||
} else if (likely(ehci->rh_state == EHCI_RH_RUNNING)) {
|
||||
struct ehci_qh *qh;
|
||||
|
||||
/* Do only the first waiting QH (nVidia bug?) */
|
||||
qh = ehci->async_unlink;
|
||||
ehci->async_iaa = qh;
|
||||
ehci->async_unlink = qh->unlink_next;
|
||||
qh->unlink_next = NULL;
|
||||
|
||||
/* Make sure the unlinks are all visible to the hardware */
|
||||
wmb();
|
||||
|
||||
@ -1255,34 +1264,35 @@ static void end_unlink_async(struct ehci_hcd *ehci)
|
||||
}
|
||||
}
|
||||
|
||||
static void start_unlink_async(struct ehci_hcd *ehci, struct ehci_qh *qh);
|
||||
|
||||
static void unlink_empty_async(struct ehci_hcd *ehci)
|
||||
{
|
||||
struct ehci_qh *qh, *next;
|
||||
bool stopped = (ehci->rh_state < EHCI_RH_RUNNING);
|
||||
struct ehci_qh *qh;
|
||||
struct ehci_qh *qh_to_unlink = NULL;
|
||||
bool check_unlinks_later = false;
|
||||
int count = 0;
|
||||
|
||||
/* Unlink all the async QHs that have been empty for a timer cycle */
|
||||
next = ehci->async->qh_next.qh;
|
||||
while (next) {
|
||||
qh = next;
|
||||
next = qh->qh_next.qh;
|
||||
|
||||
/* Find the last async QH which has been empty for a timer cycle */
|
||||
for (qh = ehci->async->qh_next.qh; qh; qh = qh->qh_next.qh) {
|
||||
if (list_empty(&qh->qtd_list) &&
|
||||
qh->qh_state == QH_STATE_LINKED) {
|
||||
if (!stopped && qh->unlink_cycle ==
|
||||
ehci->async_unlink_cycle)
|
||||
++count;
|
||||
if (qh->unlink_cycle == ehci->async_unlink_cycle)
|
||||
check_unlinks_later = true;
|
||||
else
|
||||
single_unlink_async(ehci, qh);
|
||||
qh_to_unlink = qh;
|
||||
}
|
||||
}
|
||||
|
||||
/* Start a new IAA cycle if any QHs are waiting for it */
|
||||
if (ehci->async_unlink)
|
||||
start_iaa_cycle(ehci, false);
|
||||
/* If nothing else is being unlinked, unlink the last empty QH */
|
||||
if (!ehci->async_iaa && !ehci->async_unlink && qh_to_unlink) {
|
||||
start_unlink_async(ehci, qh_to_unlink);
|
||||
--count;
|
||||
}
|
||||
|
||||
/* QHs that haven't been empty for long enough will be handled later */
|
||||
if (check_unlinks_later) {
|
||||
/* Other QHs will be handled later */
|
||||
if (count > 0) {
|
||||
ehci_enable_event(ehci, EHCI_HRTIMER_ASYNC_UNLINKS, true);
|
||||
++ehci->async_unlink_cycle;
|
||||
}
|
||||
|
@ -213,7 +213,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, 30, 0 };
|
||||
max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 125, 25 };
|
||||
|
||||
/* carryover low/fullspeed bandwidth that crosses uframe boundries */
|
||||
static inline void carryover_tt_bandwidth(unsigned short tt_usecs[8])
|
||||
@ -2212,11 +2212,11 @@ static void scan_isoc(struct ehci_hcd *ehci)
|
||||
}
|
||||
ehci->now_frame = now_frame;
|
||||
|
||||
frame = ehci->last_iso_frame;
|
||||
for (;;) {
|
||||
union ehci_shadow q, *q_p;
|
||||
__hc32 type, *hw_p;
|
||||
|
||||
frame = ehci->last_iso_frame;
|
||||
restart:
|
||||
/* scan each element in frame's queue for completions */
|
||||
q_p = &ehci->pshadow [frame];
|
||||
@ -2321,6 +2321,9 @@ restart:
|
||||
/* Stop when we have reached the current frame */
|
||||
if (frame == now_frame)
|
||||
break;
|
||||
ehci->last_iso_frame = (frame + 1) & fmask;
|
||||
|
||||
/* The last frame may still have active siTDs */
|
||||
ehci->last_iso_frame = frame;
|
||||
frame = (frame + 1) & fmask;
|
||||
}
|
||||
}
|
||||
|
@ -113,14 +113,15 @@ static void ehci_poll_ASS(struct ehci_hcd *ehci)
|
||||
|
||||
if (want != actual) {
|
||||
|
||||
/* Poll again later, but give up after about 20 ms */
|
||||
if (ehci->ASS_poll_count++ < 20) {
|
||||
ehci_enable_event(ehci, EHCI_HRTIMER_POLL_ASS, true);
|
||||
return;
|
||||
}
|
||||
ehci_dbg(ehci, "Waited too long for the async schedule status (%x/%x), giving up\n",
|
||||
want, actual);
|
||||
/* Poll again later */
|
||||
ehci_enable_event(ehci, EHCI_HRTIMER_POLL_ASS, true);
|
||||
++ehci->ASS_poll_count;
|
||||
return;
|
||||
}
|
||||
|
||||
if (ehci->ASS_poll_count > 20)
|
||||
ehci_dbg(ehci, "ASS poll count reached %d\n",
|
||||
ehci->ASS_poll_count);
|
||||
ehci->ASS_poll_count = 0;
|
||||
|
||||
/* The status is up-to-date; restart or stop the schedule as needed */
|
||||
@ -159,14 +160,14 @@ static void ehci_poll_PSS(struct ehci_hcd *ehci)
|
||||
|
||||
if (want != actual) {
|
||||
|
||||
/* Poll again later, but give up after about 20 ms */
|
||||
if (ehci->PSS_poll_count++ < 20) {
|
||||
ehci_enable_event(ehci, EHCI_HRTIMER_POLL_PSS, true);
|
||||
return;
|
||||
}
|
||||
ehci_dbg(ehci, "Waited too long for the periodic schedule status (%x/%x), giving up\n",
|
||||
want, actual);
|
||||
/* Poll again later */
|
||||
ehci_enable_event(ehci, EHCI_HRTIMER_POLL_PSS, true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ehci->PSS_poll_count > 20)
|
||||
ehci_dbg(ehci, "PSS poll count reached %d\n",
|
||||
ehci->PSS_poll_count);
|
||||
ehci->PSS_poll_count = 0;
|
||||
|
||||
/* The status is up-to-date; restart or stop the schedule as needed */
|
||||
|
@ -780,6 +780,7 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev)
|
||||
"defaulting to EHCI.\n");
|
||||
dev_warn(&xhci_pdev->dev,
|
||||
"USB 3.0 devices will work at USB 2.0 speeds.\n");
|
||||
usb_disable_xhci_ports(xhci_pdev);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -116,6 +116,7 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port,
|
||||
}
|
||||
}
|
||||
clear_bit(port, &uhci->resuming_ports);
|
||||
usb_hcd_end_port_resume(&uhci_to_hcd(uhci)->self, port);
|
||||
}
|
||||
|
||||
/* Wait for the UHCI controller in HP's iLO2 server management chip.
|
||||
@ -167,6 +168,8 @@ static void uhci_check_ports(struct uhci_hcd *uhci)
|
||||
set_bit(port, &uhci->resuming_ports);
|
||||
uhci->ports_timeout = jiffies +
|
||||
msecs_to_jiffies(25);
|
||||
usb_hcd_start_port_resume(
|
||||
&uhci_to_hcd(uhci)->self, port);
|
||||
|
||||
/* Make sure we see the port again
|
||||
* after the resuming period is over. */
|
||||
|
@ -1698,7 +1698,7 @@ static void handle_port_status(struct xhci_hcd *xhci,
|
||||
faked_port_index + 1);
|
||||
if (slot_id && xhci->devs[slot_id])
|
||||
xhci_ring_device(xhci, slot_id);
|
||||
if (bus_state->port_remote_wakeup && (1 << faked_port_index)) {
|
||||
if (bus_state->port_remote_wakeup & (1 << faked_port_index)) {
|
||||
bus_state->port_remote_wakeup &=
|
||||
~(1 << faked_port_index);
|
||||
xhci_test_and_clear_bit(xhci, port_array,
|
||||
@ -2589,6 +2589,8 @@ cleanup:
|
||||
(trb_comp_code != COMP_STALL &&
|
||||
trb_comp_code != COMP_BABBLE))
|
||||
xhci_urb_free_priv(xhci, urb_priv);
|
||||
else
|
||||
kfree(urb_priv);
|
||||
|
||||
usb_hcd_unlink_urb_from_ep(bus_to_hcd(urb->dev->bus), urb);
|
||||
if ((urb->actual_length != urb->transfer_buffer_length &&
|
||||
@ -3108,7 +3110,7 @@ static u32 xhci_v1_0_td_remainder(int running_total, int trb_buff_len,
|
||||
* running_total.
|
||||
*/
|
||||
packets_transferred = (running_total + trb_buff_len) /
|
||||
usb_endpoint_maxp(&urb->ep->desc);
|
||||
GET_MAX_PACKET(usb_endpoint_maxp(&urb->ep->desc));
|
||||
|
||||
if ((total_packet_count - packets_transferred) > 31)
|
||||
return 31 << 17;
|
||||
@ -3642,7 +3644,8 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
|
||||
td_len = urb->iso_frame_desc[i].length;
|
||||
td_remain_len = td_len;
|
||||
total_packet_count = DIV_ROUND_UP(td_len,
|
||||
usb_endpoint_maxp(&urb->ep->desc));
|
||||
GET_MAX_PACKET(
|
||||
usb_endpoint_maxp(&urb->ep->desc)));
|
||||
/* A zero-length transfer still involves at least one packet. */
|
||||
if (total_packet_count == 0)
|
||||
total_packet_count++;
|
||||
@ -3664,9 +3667,11 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
|
||||
td = urb_priv->td[i];
|
||||
for (j = 0; j < trbs_per_td; j++) {
|
||||
u32 remainder = 0;
|
||||
field = TRB_TBC(burst_count) | TRB_TLBPC(residue);
|
||||
field = 0;
|
||||
|
||||
if (first_trb) {
|
||||
field = TRB_TBC(burst_count) |
|
||||
TRB_TLBPC(residue);
|
||||
/* Queue the isoc TRB */
|
||||
field |= TRB_TYPE(TRB_ISOC);
|
||||
/* Assume URB_ISO_ASAP is set */
|
||||
|
@ -60,6 +60,7 @@ static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */
|
||||
{ USB_DEVICE(0x0FCF, 0x1004) }, /* Dynastream ANT2USB */
|
||||
{ USB_DEVICE(0x0FCF, 0x1006) }, /* Dynastream ANT development board */
|
||||
{ USB_DEVICE(0x0FDE, 0xCA05) }, /* OWL Wireless Electricity Monitor CM-160 */
|
||||
{ USB_DEVICE(0x10A6, 0xAA26) }, /* Knock-off DCU-11 cable */
|
||||
{ USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */
|
||||
{ USB_DEVICE(0x10B5, 0xAC70) }, /* Nokia CA-42 USB */
|
||||
|
@ -584,6 +584,7 @@ static struct usb_device_id id_table_combined [] = {
|
||||
/*
|
||||
* ELV devices:
|
||||
*/
|
||||
{ USB_DEVICE(FTDI_ELV_VID, FTDI_ELV_WS300_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_ELV_USR_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_ELV_MSM1_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_ELV_KL100_PID) },
|
||||
@ -670,6 +671,7 @@ static struct usb_device_id id_table_combined [] = {
|
||||
{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
|
||||
{ USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) },
|
||||
|
@ -147,6 +147,11 @@
|
||||
#define XSENS_CONVERTER_6_PID 0xD38E
|
||||
#define XSENS_CONVERTER_7_PID 0xD38F
|
||||
|
||||
/**
|
||||
* Zolix (www.zolix.com.cb) product ids
|
||||
*/
|
||||
#define FTDI_OMNI1509 0xD491 /* Omni1509 embedded USB-serial */
|
||||
|
||||
/*
|
||||
* NDI (www.ndigital.com) product ids
|
||||
*/
|
||||
@ -204,7 +209,7 @@
|
||||
|
||||
/*
|
||||
* ELV USB devices submitted by Christian Abt of ELV (www.elv.de).
|
||||
* All of these devices use FTDI's vendor ID (0x0403).
|
||||
* Almost all of these devices use FTDI's vendor ID (0x0403).
|
||||
* Further IDs taken from ELV Windows .inf file.
|
||||
*
|
||||
* The previously included PID for the UO 100 module was incorrect.
|
||||
@ -212,6 +217,8 @@
|
||||
*
|
||||
* Armin Laeuger originally sent the PID for the UM 100 module.
|
||||
*/
|
||||
#define FTDI_ELV_VID 0x1B1F /* ELV AG */
|
||||
#define FTDI_ELV_WS300_PID 0xC006 /* eQ3 WS 300 PC II */
|
||||
#define FTDI_ELV_USR_PID 0xE000 /* ELV Universal-Sound-Recorder */
|
||||
#define FTDI_ELV_MSM1_PID 0xE001 /* ELV Mini-Sound-Modul */
|
||||
#define FTDI_ELV_KL100_PID 0xE002 /* ELV Kfz-Leistungsmesser KL 100 */
|
||||
|
@ -242,6 +242,7 @@ static void option_instat_callback(struct urb *urb);
|
||||
#define TELIT_PRODUCT_CC864_DUAL 0x1005
|
||||
#define TELIT_PRODUCT_CC864_SINGLE 0x1006
|
||||
#define TELIT_PRODUCT_DE910_DUAL 0x1010
|
||||
#define TELIT_PRODUCT_LE920 0x1200
|
||||
|
||||
/* ZTE PRODUCTS */
|
||||
#define ZTE_VENDOR_ID 0x19d2
|
||||
@ -453,6 +454,10 @@ static void option_instat_callback(struct urb *urb);
|
||||
#define TPLINK_VENDOR_ID 0x2357
|
||||
#define TPLINK_PRODUCT_MA180 0x0201
|
||||
|
||||
/* Changhong products */
|
||||
#define CHANGHONG_VENDOR_ID 0x2077
|
||||
#define CHANGHONG_PRODUCT_CH690 0x7001
|
||||
|
||||
/* some devices interfaces need special handling due to a number of reasons */
|
||||
enum option_blacklist_reason {
|
||||
OPTION_BLACKLIST_NONE = 0,
|
||||
@ -534,6 +539,11 @@ static const struct option_blacklist_info zte_1255_blacklist = {
|
||||
.reserved = BIT(3) | BIT(4),
|
||||
};
|
||||
|
||||
static const struct option_blacklist_info telit_le920_blacklist = {
|
||||
.sendsetup = BIT(0),
|
||||
.reserved = BIT(1) | BIT(5),
|
||||
};
|
||||
|
||||
static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
|
||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
|
||||
@ -784,6 +794,8 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) },
|
||||
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) },
|
||||
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) },
|
||||
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920),
|
||||
.driver_info = (kernel_ulong_t)&telit_le920_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&net_intf1_blacklist },
|
||||
@ -1318,6 +1330,7 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T) },
|
||||
{ USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE(CHANGHONG_VENDOR_ID, CHANGHONG_PRODUCT_CH690) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, option_ids);
|
||||
|
@ -53,6 +53,7 @@ static const struct usb_device_id id_table[] = {
|
||||
{DEVICE_G1K(0x05c6, 0x9221)}, /* Generic Gobi QDL device */
|
||||
{DEVICE_G1K(0x05c6, 0x9231)}, /* Generic Gobi QDL device */
|
||||
{DEVICE_G1K(0x1f45, 0x0001)}, /* Unknown Gobi QDL device */
|
||||
{DEVICE_G1K(0x1bc7, 0x900e)}, /* Telit Gobi QDL device */
|
||||
|
||||
/* Gobi 2000 devices */
|
||||
{USB_DEVICE(0x1410, 0xa010)}, /* Novatel Gobi 2000 QDL device */
|
||||
|
@ -92,8 +92,8 @@ int usb_stor_ucr61s2b_init(struct us_data *us)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This places the HUAWEI E220 devices in multi-port mode */
|
||||
int usb_stor_huawei_e220_init(struct us_data *us)
|
||||
/* This places the HUAWEI usb dongles in multi-port mode */
|
||||
static int usb_stor_huawei_feature_init(struct us_data *us)
|
||||
{
|
||||
int result;
|
||||
|
||||
@ -104,3 +104,75 @@ int usb_stor_huawei_e220_init(struct us_data *us)
|
||||
US_DEBUGP("Huawei mode set result is %d\n", result);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* It will send a scsi switch command called rewind' to huawei dongle.
|
||||
* When the dongle receives this command at the first time,
|
||||
* it will reboot immediately. After rebooted, it will ignore this command.
|
||||
* So it is unnecessary to read its response.
|
||||
*/
|
||||
static int usb_stor_huawei_scsi_init(struct us_data *us)
|
||||
{
|
||||
int result = 0;
|
||||
int act_len = 0;
|
||||
struct bulk_cb_wrap *bcbw = (struct bulk_cb_wrap *) us->iobuf;
|
||||
char rewind_cmd[] = {0x11, 0x06, 0x20, 0x00, 0x00, 0x01, 0x01, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
|
||||
bcbw->Signature = cpu_to_le32(US_BULK_CB_SIGN);
|
||||
bcbw->Tag = 0;
|
||||
bcbw->DataTransferLength = 0;
|
||||
bcbw->Flags = bcbw->Lun = 0;
|
||||
bcbw->Length = sizeof(rewind_cmd);
|
||||
memset(bcbw->CDB, 0, sizeof(bcbw->CDB));
|
||||
memcpy(bcbw->CDB, rewind_cmd, sizeof(rewind_cmd));
|
||||
|
||||
result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe, bcbw,
|
||||
US_BULK_CB_WRAP_LEN, &act_len);
|
||||
US_DEBUGP("transfer actual length=%d, result=%d\n", act_len, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* It tries to find the supported Huawei USB dongles.
|
||||
* In Huawei, they assign the following product IDs
|
||||
* for all of their mobile broadband dongles,
|
||||
* including the new dongles in the future.
|
||||
* So if the product ID is not included in this list,
|
||||
* it means it is not Huawei's mobile broadband dongles.
|
||||
*/
|
||||
static int usb_stor_huawei_dongles_pid(struct us_data *us)
|
||||
{
|
||||
struct usb_interface_descriptor *idesc;
|
||||
int idProduct;
|
||||
|
||||
idesc = &us->pusb_intf->cur_altsetting->desc;
|
||||
idProduct = us->pusb_dev->descriptor.idProduct;
|
||||
/* The first port is CDROM,
|
||||
* means the dongle in the single port mode,
|
||||
* and a switch command is required to be sent. */
|
||||
if (idesc && idesc->bInterfaceNumber == 0) {
|
||||
if ((idProduct == 0x1001)
|
||||
|| (idProduct == 0x1003)
|
||||
|| (idProduct == 0x1004)
|
||||
|| (idProduct >= 0x1401 && idProduct <= 0x1500)
|
||||
|| (idProduct >= 0x1505 && idProduct <= 0x1600)
|
||||
|| (idProduct >= 0x1c02 && idProduct <= 0x2202)) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int usb_stor_huawei_init(struct us_data *us)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
if (usb_stor_huawei_dongles_pid(us)) {
|
||||
if (us->pusb_dev->descriptor.idProduct >= 0x1446)
|
||||
result = usb_stor_huawei_scsi_init(us);
|
||||
else
|
||||
result = usb_stor_huawei_feature_init(us);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@ -46,5 +46,5 @@ int usb_stor_euscsi_init(struct us_data *us);
|
||||
* flash reader */
|
||||
int usb_stor_ucr61s2b_init(struct us_data *us);
|
||||
|
||||
/* This places the HUAWEI E220 devices in multi-port mode */
|
||||
int usb_stor_huawei_e220_init(struct us_data *us);
|
||||
/* This places the HUAWEI usb dongles in multi-port mode */
|
||||
int usb_stor_huawei_init(struct us_data *us);
|
||||
|
@ -1527,335 +1527,10 @@ UNUSUAL_DEV( 0x1210, 0x0003, 0x0100, 0x0100,
|
||||
/* Reported by fangxiaozhi <huananhu@huawei.com>
|
||||
* This brings the HUAWEI data card devices into multi-port mode
|
||||
*/
|
||||
UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000,
|
||||
UNUSUAL_VENDOR_INTF(0x12d1, 0x08, 0x06, 0x50,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1003, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1004, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1401, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1402, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1403, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1404, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1405, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1406, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1407, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1408, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1409, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x140A, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x140B, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x140C, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x140D, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x140E, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x140F, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1410, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1411, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1412, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1413, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1414, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1415, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1416, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1417, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1418, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1419, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x141A, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x141B, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x141C, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x141D, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x141E, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x141F, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1420, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1421, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1422, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1423, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1424, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1425, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1426, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1427, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1428, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1429, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x142A, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x142B, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x142C, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x142D, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x142E, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x142F, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1430, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1431, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1432, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1433, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1434, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1435, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1436, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1437, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1438, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1439, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x143A, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x143B, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x143C, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x143D, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x143E, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x143F, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_init,
|
||||
0),
|
||||
|
||||
/* Reported by Vilius Bilinkevicius <vilisas AT xxx DOT lt) */
|
||||
|
@ -120,6 +120,17 @@ MODULE_PARM_DESC(quirks, "supplemental list of device IDs and their quirks");
|
||||
.useTransport = use_transport, \
|
||||
}
|
||||
|
||||
#define UNUSUAL_VENDOR_INTF(idVendor, cl, sc, pr, \
|
||||
vendor_name, product_name, use_protocol, use_transport, \
|
||||
init_function, Flags) \
|
||||
{ \
|
||||
.vendorName = vendor_name, \
|
||||
.productName = product_name, \
|
||||
.useProtocol = use_protocol, \
|
||||
.useTransport = use_transport, \
|
||||
.initFunction = init_function, \
|
||||
}
|
||||
|
||||
static struct us_unusual_dev us_unusual_dev_list[] = {
|
||||
# include "unusual_devs.h"
|
||||
{ } /* Terminating entry */
|
||||
@ -131,6 +142,7 @@ static struct us_unusual_dev for_dynamic_ids =
|
||||
#undef UNUSUAL_DEV
|
||||
#undef COMPLIANT_DEV
|
||||
#undef USUAL_DEV
|
||||
#undef UNUSUAL_VENDOR_INTF
|
||||
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
|
||||
|
@ -41,6 +41,20 @@
|
||||
#define USUAL_DEV(useProto, useTrans) \
|
||||
{ USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans) }
|
||||
|
||||
/* Define the device is matched with Vendor ID and interface descriptors */
|
||||
#define UNUSUAL_VENDOR_INTF(id_vendor, cl, sc, pr, \
|
||||
vendorName, productName, useProtocol, useTransport, \
|
||||
initFunction, flags) \
|
||||
{ \
|
||||
.match_flags = USB_DEVICE_ID_MATCH_INT_INFO \
|
||||
| USB_DEVICE_ID_MATCH_VENDOR, \
|
||||
.idVendor = (id_vendor), \
|
||||
.bInterfaceClass = (cl), \
|
||||
.bInterfaceSubClass = (sc), \
|
||||
.bInterfaceProtocol = (pr), \
|
||||
.driver_info = (flags) \
|
||||
}
|
||||
|
||||
struct usb_device_id usb_storage_usb_ids[] = {
|
||||
# include "unusual_devs.h"
|
||||
{ } /* Terminating entry */
|
||||
@ -50,6 +64,7 @@ MODULE_DEVICE_TABLE(usb, usb_storage_usb_ids);
|
||||
#undef UNUSUAL_DEV
|
||||
#undef COMPLIANT_DEV
|
||||
#undef USUAL_DEV
|
||||
#undef UNUSUAL_VENDOR_INTF
|
||||
|
||||
/*
|
||||
* The table of devices to ignore
|
||||
|
@ -1017,7 +1017,7 @@ static const char *fbcon_startup(void)
|
||||
}
|
||||
|
||||
/* Setup default font */
|
||||
if (!p->fontdata) {
|
||||
if (!p->fontdata && !vc->vc_font.data) {
|
||||
if (!fontname[0] || !(font = find_font(fontname)))
|
||||
font = get_default_font(info->var.xres,
|
||||
info->var.yres,
|
||||
@ -1027,6 +1027,8 @@ static const char *fbcon_startup(void)
|
||||
vc->vc_font.height = font->height;
|
||||
vc->vc_font.data = (void *)(p->fontdata = font->data);
|
||||
vc->vc_font.charcount = 256; /* FIXME Need to support more fonts */
|
||||
} else {
|
||||
p->fontdata = vc->vc_font.data;
|
||||
}
|
||||
|
||||
cols = FBCON_SWAP(ops->rotate, info->var.xres, info->var.yres);
|
||||
@ -1186,9 +1188,9 @@ static void fbcon_init(struct vc_data *vc, int init)
|
||||
ops->p = &fb_display[fg_console];
|
||||
}
|
||||
|
||||
static void fbcon_free_font(struct display *p)
|
||||
static void fbcon_free_font(struct display *p, bool freefont)
|
||||
{
|
||||
if (p->userfont && p->fontdata && (--REFCOUNT(p->fontdata) == 0))
|
||||
if (freefont && p->userfont && p->fontdata && (--REFCOUNT(p->fontdata) == 0))
|
||||
kfree(p->fontdata - FONT_EXTRA_WORDS * sizeof(int));
|
||||
p->fontdata = NULL;
|
||||
p->userfont = 0;
|
||||
@ -1200,8 +1202,8 @@ static void fbcon_deinit(struct vc_data *vc)
|
||||
struct fb_info *info;
|
||||
struct fbcon_ops *ops;
|
||||
int idx;
|
||||
bool free_font = true;
|
||||
|
||||
fbcon_free_font(p);
|
||||
idx = con2fb_map[vc->vc_num];
|
||||
|
||||
if (idx == -1)
|
||||
@ -1212,6 +1214,8 @@ static void fbcon_deinit(struct vc_data *vc)
|
||||
if (!info)
|
||||
goto finished;
|
||||
|
||||
if (info->flags & FBINFO_MISC_FIRMWARE)
|
||||
free_font = false;
|
||||
ops = info->fbcon_par;
|
||||
|
||||
if (!ops)
|
||||
@ -1223,6 +1227,8 @@ static void fbcon_deinit(struct vc_data *vc)
|
||||
ops->flags &= ~FBCON_FLAGS_INIT;
|
||||
finished:
|
||||
|
||||
fbcon_free_font(p, free_font);
|
||||
|
||||
if (!con_is_bound(&fb_con))
|
||||
fbcon_exit();
|
||||
|
||||
|
@ -1064,7 +1064,7 @@ static int vgacon_do_font_op(struct vgastate *state,char *arg,int set,int ch512)
|
||||
unsigned short video_port_status = vga_video_port_reg + 6;
|
||||
int font_select = 0x00, beg, i;
|
||||
char *charmap;
|
||||
|
||||
bool clear_attribs = false;
|
||||
if (vga_video_type != VIDEO_TYPE_EGAM) {
|
||||
charmap = (char *) VGA_MAP_MEM(colourmap, 0);
|
||||
beg = 0x0e;
|
||||
@ -1169,12 +1169,6 @@ static int vgacon_do_font_op(struct vgastate *state,char *arg,int set,int ch512)
|
||||
|
||||
/* if 512 char mode is already enabled don't re-enable it. */
|
||||
if ((set) && (ch512 != vga_512_chars)) {
|
||||
/* attribute controller */
|
||||
for (i = 0; i < MAX_NR_CONSOLES; i++) {
|
||||
struct vc_data *c = vc_cons[i].d;
|
||||
if (c && c->vc_sw == &vga_con)
|
||||
c->vc_hi_font_mask = ch512 ? 0x0800 : 0;
|
||||
}
|
||||
vga_512_chars = ch512;
|
||||
/* 256-char: enable intensity bit
|
||||
512-char: disable intensity bit */
|
||||
@ -1185,8 +1179,22 @@ static int vgacon_do_font_op(struct vgastate *state,char *arg,int set,int ch512)
|
||||
it means, but it works, and it appears necessary */
|
||||
inb_p(video_port_status);
|
||||
vga_wattr(state->vgabase, VGA_AR_ENABLE_DISPLAY, 0);
|
||||
clear_attribs = true;
|
||||
}
|
||||
raw_spin_unlock_irq(&vga_lock);
|
||||
|
||||
if (clear_attribs) {
|
||||
for (i = 0; i < MAX_NR_CONSOLES; i++) {
|
||||
struct vc_data *c = vc_cons[i].d;
|
||||
if (c && c->vc_sw == &vga_con) {
|
||||
/* force hi font mask to 0, so we always clear
|
||||
the bit on either transition */
|
||||
c->vc_hi_font_mask = 0x00;
|
||||
clear_buffer_attributes(c);
|
||||
c->vc_hi_font_mask = ch512 ? 0x0800 : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -503,11 +503,11 @@ static ssize_t device_write(struct file *file, const char __user *buf,
|
||||
#endif
|
||||
return -EINVAL;
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
if (count > sizeof(struct dlm_write_request32) + DLM_RESNAME_MAXLEN)
|
||||
#else
|
||||
/*
|
||||
* can't compare against COMPAT/dlm_write_request32 because
|
||||
* we don't yet know if is64bit is zero
|
||||
*/
|
||||
if (count > sizeof(struct dlm_write_request) + DLM_RESNAME_MAXLEN)
|
||||
#endif
|
||||
return -EINVAL;
|
||||
|
||||
kbuf = kzalloc(count + 1, GFP_NOFS);
|
||||
|
@ -664,8 +664,11 @@ static int nilfs_ioctl_clean_segments(struct inode *inode, struct file *filp,
|
||||
if (ret < 0)
|
||||
printk(KERN_ERR "NILFS: GC failed during preparation: "
|
||||
"cannot read source blocks: err=%d\n", ret);
|
||||
else
|
||||
else {
|
||||
if (nilfs_sb_need_update(nilfs))
|
||||
set_nilfs_discontinued(nilfs);
|
||||
ret = nilfs_clean_segments(inode->i_sb, argv, kbufs);
|
||||
}
|
||||
|
||||
nilfs_remove_all_gcinodes(nilfs);
|
||||
clear_nilfs_gc_running(nilfs);
|
||||
|
@ -429,7 +429,7 @@ extern int memcg_limited_groups_array_size;
|
||||
* the slab_mutex must be held when looping through those caches
|
||||
*/
|
||||
#define for_each_memcg_cache_index(_idx) \
|
||||
for ((_idx) = 0; i < memcg_limited_groups_array_size; (_idx)++)
|
||||
for ((_idx) = 0; (_idx) < memcg_limited_groups_array_size; (_idx)++)
|
||||
|
||||
static inline bool memcg_kmem_enabled(void)
|
||||
{
|
||||
|
@ -151,7 +151,7 @@ struct mmu_notifier_ops {
|
||||
* Therefore notifier chains can only be traversed when either
|
||||
*
|
||||
* 1. mmap_sem is held.
|
||||
* 2. One of the reverse map locks is held (i_mmap_mutex or anon_vma->mutex).
|
||||
* 2. One of the reverse map locks is held (i_mmap_mutex or anon_vma->rwsem).
|
||||
* 3. No other concurrent thread can access the list (release)
|
||||
*/
|
||||
struct mmu_notifier {
|
||||
|
@ -357,6 +357,8 @@ struct usb_bus {
|
||||
int bandwidth_int_reqs; /* number of Interrupt requests */
|
||||
int bandwidth_isoc_reqs; /* number of Isoc. requests */
|
||||
|
||||
unsigned resuming_ports; /* bit array: resuming root-hub ports */
|
||||
|
||||
#if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE)
|
||||
struct mon_bus *mon_bus; /* non-null when associated */
|
||||
int monitored; /* non-zero when monitored */
|
||||
|
@ -430,6 +430,9 @@ extern void usb_hcd_poll_rh_status(struct usb_hcd *hcd);
|
||||
extern void usb_wakeup_notification(struct usb_device *hdev,
|
||||
unsigned int portnum);
|
||||
|
||||
extern void usb_hcd_start_port_resume(struct usb_bus *bus, int portnum);
|
||||
extern void usb_hcd_end_port_resume(struct usb_bus *bus, int portnum);
|
||||
|
||||
/* The D0/D1 toggle bits ... USE WITH CAUTION (they're almost hcd-internal) */
|
||||
#define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> (ep)) & 1)
|
||||
#define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << (ep)))
|
||||
|
@ -47,6 +47,7 @@ int con_set_cmap(unsigned char __user *cmap);
|
||||
int con_get_cmap(unsigned char __user *cmap);
|
||||
void scrollback(struct vc_data *vc, int lines);
|
||||
void scrollfront(struct vc_data *vc, int lines);
|
||||
void clear_buffer_attributes(struct vc_data *vc);
|
||||
void update_region(struct vc_data *vc, unsigned long start, int count);
|
||||
void redraw_screen(struct vc_data *vc, int is_switch);
|
||||
#define update_screen(x) redraw_screen(x, 0)
|
||||
|
@ -152,6 +152,12 @@
|
||||
#define USB_INTRF_FUNC_SUSPEND_LP (1 << (8 + 0))
|
||||
#define USB_INTRF_FUNC_SUSPEND_RW (1 << (8 + 1))
|
||||
|
||||
/*
|
||||
* Interface status, Figure 9-5 USB 3.0 spec
|
||||
*/
|
||||
#define USB_INTRF_STAT_FUNC_RW_CAP 1
|
||||
#define USB_INTRF_STAT_FUNC_RW 2
|
||||
|
||||
#define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */
|
||||
|
||||
/* Bit array elements as returned by the USB_REQ_GET_STATUS request. */
|
||||
|
@ -1257,6 +1257,10 @@ struct page *follow_trans_huge_pmd(struct vm_area_struct *vma,
|
||||
if (flags & FOLL_WRITE && !pmd_write(*pmd))
|
||||
goto out;
|
||||
|
||||
/* Avoid dumping huge zero page */
|
||||
if ((flags & FOLL_DUMP) && is_huge_zero_pmd(*pmd))
|
||||
return ERR_PTR(-EFAULT);
|
||||
|
||||
page = pmd_page(*pmd);
|
||||
VM_BUG_ON(!PageHead(page));
|
||||
if (flags & FOLL_TOUCH) {
|
||||
|
@ -3033,6 +3033,7 @@ unsigned long hugetlb_change_protection(struct vm_area_struct *vma,
|
||||
if (!huge_pte_none(huge_ptep_get(ptep))) {
|
||||
pte = huge_ptep_get_and_clear(mm, address, ptep);
|
||||
pte = pte_mkhuge(pte_modify(pte, newprot));
|
||||
pte = arch_make_huge_pte(pte, vma, NULL, 0);
|
||||
set_huge_pte_at(mm, address, ptep, pte);
|
||||
pages++;
|
||||
}
|
||||
|
@ -160,8 +160,10 @@ static int remove_migration_pte(struct page *new, struct vm_area_struct *vma,
|
||||
if (is_write_migration_entry(entry))
|
||||
pte = pte_mkwrite(pte);
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
if (PageHuge(new))
|
||||
if (PageHuge(new)) {
|
||||
pte = pte_mkhuge(pte);
|
||||
pte = arch_make_huge_pte(pte, vma, new, 0);
|
||||
}
|
||||
#endif
|
||||
flush_cache_page(vma, addr, pte_pfn(pte));
|
||||
set_pte_at(mm, addr, ptep, pte);
|
||||
|
@ -2943,7 +2943,7 @@ static void vm_lock_mapping(struct mm_struct *mm, struct address_space *mapping)
|
||||
* vma in this mm is backed by the same anon_vma or address_space.
|
||||
*
|
||||
* We can take all the locks in random order because the VM code
|
||||
* taking i_mmap_mutex or anon_vma->mutex outside the mmap_sem never
|
||||
* taking i_mmap_mutex or anon_vma->rwsem outside the mmap_sem never
|
||||
* takes more than one of them in a row. Secondly we're protected
|
||||
* against a concurrent mm_take_all_locks() by the mm_all_locks_mutex.
|
||||
*
|
||||
|
@ -19,6 +19,7 @@ bpf-direct-objs := bpf-direct.o
|
||||
|
||||
# Try to match the kernel target.
|
||||
ifndef CONFIG_64BIT
|
||||
ifndef CROSS_COMPILE
|
||||
|
||||
# s390 has -m31 flag to build 31 bit binaries
|
||||
ifndef CONFIG_S390
|
||||
@ -35,6 +36,7 @@ HOSTLOADLIBES_bpf-direct += $(MFLAG)
|
||||
HOSTLOADLIBES_bpf-fancy += $(MFLAG)
|
||||
HOSTLOADLIBES_dropper += $(MFLAG)
|
||||
endif
|
||||
endif
|
||||
|
||||
# Tell kbuild to always build the programs
|
||||
always := $(hostprogs-y)
|
||||
|
@ -230,12 +230,12 @@ our $Inline = qr{inline|__always_inline|noinline};
|
||||
our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]};
|
||||
our $Lval = qr{$Ident(?:$Member)*};
|
||||
|
||||
our $Float_hex = qr{(?i:0x[0-9a-f]+p-?[0-9]+[fl]?)};
|
||||
our $Float_dec = qr{(?i:((?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?))};
|
||||
our $Float_int = qr{(?i:[0-9]+e-?[0-9]+[fl]?)};
|
||||
our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
|
||||
our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
|
||||
our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?};
|
||||
our $Float = qr{$Float_hex|$Float_dec|$Float_int};
|
||||
our $Constant = qr{(?:$Float|(?i:(?:0x[0-9a-f]+|[0-9]+)[ul]*))};
|
||||
our $Assignment = qr{(?:\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=)};
|
||||
our $Constant = qr{$Float|(?i)(?:0x[0-9a-f]+|[0-9]+)[ul]*};
|
||||
our $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
|
||||
our $Compare = qr{<=|>=|==|!=|<|>};
|
||||
our $Operators = qr{
|
||||
<=|>=|==|!=|
|
||||
|
2
tools/vm/.gitignore
vendored
Normal file
2
tools/vm/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
slabinfo
|
||||
page-types
|
Loading…
Reference in New Issue
Block a user