mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
Merge commit 'v3.0.30' into android-3.0
This commit is contained in:
commit
5c15664a86
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 0
|
||||
SUBLEVEL = 28
|
||||
SUBLEVEL = 30
|
||||
EXTRAVERSION =
|
||||
NAME = Sneaky Weasel
|
||||
|
||||
|
|
|
|||
|
|
@ -371,6 +371,18 @@ __v7_setup:
|
|||
ldr r6, =NMRR @ NMRR
|
||||
mcr p15, 0, r5, c10, c2, 0 @ write PRRR
|
||||
mcr p15, 0, r6, c10, c2, 1 @ write NMRR
|
||||
#endif
|
||||
#ifndef CONFIG_ARM_THUMBEE
|
||||
mrc p15, 0, r0, c0, c1, 0 @ read ID_PFR0 for ThumbEE
|
||||
and r0, r0, #(0xf << 12) @ ThumbEE enabled field
|
||||
teq r0, #(1 << 12) @ check if ThumbEE is present
|
||||
bne 1f
|
||||
mov r5, #0
|
||||
mcr p14, 6, r5, c1, c0, 0 @ Initialize TEEHBR to 0
|
||||
mrc p14, 6, r0, c0, c0, 0 @ load TEECR
|
||||
orr r0, r0, #1 @ set the 1st bit in order to
|
||||
mcr p14, 6, r0, c0, c0, 0 @ stop userspace TEEHBR access
|
||||
1:
|
||||
#endif
|
||||
adr r5, v7_crval
|
||||
ldmia r5, {r5, r6}
|
||||
|
|
|
|||
|
|
@ -107,15 +107,16 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
|
|||
return -EFAULT;
|
||||
|
||||
{
|
||||
register unsigned long r8 __asm ("r8") = 0;
|
||||
register unsigned long r8 __asm ("r8");
|
||||
unsigned long prev;
|
||||
__asm__ __volatile__(
|
||||
" mf;; \n"
|
||||
" mov ar.ccv=%3;; \n"
|
||||
"[1:] cmpxchg4.acq %0=[%1],%2,ar.ccv \n"
|
||||
" mov %0=r0 \n"
|
||||
" mov ar.ccv=%4;; \n"
|
||||
"[1:] cmpxchg4.acq %1=[%2],%3,ar.ccv \n"
|
||||
" .xdata4 \"__ex_table\", 1b-., 2f-. \n"
|
||||
"[2:]"
|
||||
: "=r" (prev)
|
||||
: "=r" (r8), "=r" (prev)
|
||||
: "r" (uaddr), "r" (newval),
|
||||
"rO" ((long) (unsigned) oldval)
|
||||
: "memory");
|
||||
|
|
|
|||
|
|
@ -89,7 +89,6 @@ config S390
|
|||
select HAVE_GET_USER_PAGES_FAST
|
||||
select HAVE_ARCH_MUTEX_CPU_RELAX
|
||||
select HAVE_ARCH_JUMP_LABEL if !MARCH_G5
|
||||
select HAVE_RCU_TABLE_FREE if SMP
|
||||
select ARCH_INLINE_SPIN_TRYLOCK
|
||||
select ARCH_INLINE_SPIN_TRYLOCK_BH
|
||||
select ARCH_INLINE_SPIN_LOCK
|
||||
|
|
|
|||
|
|
@ -22,10 +22,7 @@ void crst_table_free(struct mm_struct *, unsigned long *);
|
|||
|
||||
unsigned long *page_table_alloc(struct mm_struct *);
|
||||
void page_table_free(struct mm_struct *, unsigned long *);
|
||||
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
|
||||
void page_table_free_rcu(struct mmu_gather *, unsigned long *);
|
||||
void __tlb_remove_table(void *_table);
|
||||
#endif
|
||||
|
||||
static inline void clear_table(unsigned long *s, unsigned long val, size_t n)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -30,14 +30,10 @@
|
|||
|
||||
struct mmu_gather {
|
||||
struct mm_struct *mm;
|
||||
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
|
||||
struct mmu_table_batch *batch;
|
||||
#endif
|
||||
unsigned int fullmm;
|
||||
unsigned int need_flush;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
|
||||
struct mmu_table_batch {
|
||||
struct rcu_head rcu;
|
||||
unsigned int nr;
|
||||
|
|
@ -49,7 +45,6 @@ struct mmu_table_batch {
|
|||
|
||||
extern void tlb_table_flush(struct mmu_gather *tlb);
|
||||
extern void tlb_remove_table(struct mmu_gather *tlb, void *table);
|
||||
#endif
|
||||
|
||||
static inline void tlb_gather_mmu(struct mmu_gather *tlb,
|
||||
struct mm_struct *mm,
|
||||
|
|
@ -57,29 +52,20 @@ static inline void tlb_gather_mmu(struct mmu_gather *tlb,
|
|||
{
|
||||
tlb->mm = mm;
|
||||
tlb->fullmm = full_mm_flush;
|
||||
tlb->need_flush = 0;
|
||||
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
|
||||
tlb->batch = NULL;
|
||||
#endif
|
||||
if (tlb->fullmm)
|
||||
__tlb_flush_mm(mm);
|
||||
}
|
||||
|
||||
static inline void tlb_flush_mmu(struct mmu_gather *tlb)
|
||||
{
|
||||
if (!tlb->need_flush)
|
||||
return;
|
||||
tlb->need_flush = 0;
|
||||
__tlb_flush_mm(tlb->mm);
|
||||
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
|
||||
tlb_table_flush(tlb);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void tlb_finish_mmu(struct mmu_gather *tlb,
|
||||
unsigned long start, unsigned long end)
|
||||
{
|
||||
tlb_flush_mmu(tlb);
|
||||
tlb_table_flush(tlb);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -105,10 +91,8 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
|||
static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
|
||||
unsigned long address)
|
||||
{
|
||||
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
|
||||
if (!tlb->fullmm)
|
||||
return page_table_free_rcu(tlb, (unsigned long *) pte);
|
||||
#endif
|
||||
page_table_free(tlb->mm, (unsigned long *) pte);
|
||||
}
|
||||
|
||||
|
|
@ -125,10 +109,8 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
|
|||
#ifdef __s390x__
|
||||
if (tlb->mm->context.asce_limit <= (1UL << 31))
|
||||
return;
|
||||
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
|
||||
if (!tlb->fullmm)
|
||||
return tlb_remove_table(tlb, pmd);
|
||||
#endif
|
||||
crst_table_free(tlb->mm, (unsigned long *) pmd);
|
||||
#endif
|
||||
}
|
||||
|
|
@ -146,10 +128,8 @@ static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
|
|||
#ifdef __s390x__
|
||||
if (tlb->mm->context.asce_limit <= (1UL << 42))
|
||||
return;
|
||||
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
|
||||
if (!tlb->fullmm)
|
||||
return tlb_remove_table(tlb, pud);
|
||||
#endif
|
||||
crst_table_free(tlb->mm, (unsigned long *) pud);
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -243,8 +243,6 @@ void page_table_free(struct mm_struct *mm, unsigned long *table)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
|
||||
|
||||
static void __page_table_free_rcu(void *table, unsigned bit)
|
||||
{
|
||||
struct page *page;
|
||||
|
|
@ -301,7 +299,66 @@ void __tlb_remove_table(void *_table)
|
|||
free_pages((unsigned long) table, ALLOC_ORDER);
|
||||
}
|
||||
|
||||
#endif
|
||||
static void tlb_remove_table_smp_sync(void *arg)
|
||||
{
|
||||
/* Simply deliver the interrupt */
|
||||
}
|
||||
|
||||
static void tlb_remove_table_one(void *table)
|
||||
{
|
||||
/*
|
||||
* This isn't an RCU grace period and hence the page-tables cannot be
|
||||
* assumed to be actually RCU-freed.
|
||||
*
|
||||
* It is however sufficient for software page-table walkers that rely
|
||||
* on IRQ disabling. See the comment near struct mmu_table_batch.
|
||||
*/
|
||||
smp_call_function(tlb_remove_table_smp_sync, NULL, 1);
|
||||
__tlb_remove_table(table);
|
||||
}
|
||||
|
||||
static void tlb_remove_table_rcu(struct rcu_head *head)
|
||||
{
|
||||
struct mmu_table_batch *batch;
|
||||
int i;
|
||||
|
||||
batch = container_of(head, struct mmu_table_batch, rcu);
|
||||
|
||||
for (i = 0; i < batch->nr; i++)
|
||||
__tlb_remove_table(batch->tables[i]);
|
||||
|
||||
free_page((unsigned long)batch);
|
||||
}
|
||||
|
||||
void tlb_table_flush(struct mmu_gather *tlb)
|
||||
{
|
||||
struct mmu_table_batch **batch = &tlb->batch;
|
||||
|
||||
if (*batch) {
|
||||
__tlb_flush_mm(tlb->mm);
|
||||
call_rcu_sched(&(*batch)->rcu, tlb_remove_table_rcu);
|
||||
*batch = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void tlb_remove_table(struct mmu_gather *tlb, void *table)
|
||||
{
|
||||
struct mmu_table_batch **batch = &tlb->batch;
|
||||
|
||||
if (*batch == NULL) {
|
||||
*batch = (struct mmu_table_batch *)
|
||||
__get_free_page(GFP_NOWAIT | __GFP_NOWARN);
|
||||
if (*batch == NULL) {
|
||||
__tlb_flush_mm(tlb->mm);
|
||||
tlb_remove_table_one(table);
|
||||
return;
|
||||
}
|
||||
(*batch)->nr = 0;
|
||||
}
|
||||
(*batch)->tables[(*batch)->nr++] = table;
|
||||
if ((*batch)->nr == MAX_TABLE_BATCH)
|
||||
tlb_table_flush(tlb);
|
||||
}
|
||||
|
||||
/*
|
||||
* switch on pgstes for its userspace process (for kvm)
|
||||
|
|
|
|||
|
|
@ -1269,4 +1269,4 @@ static int __init ds_init(void)
|
|||
return vio_register_driver(&ds_driver);
|
||||
}
|
||||
|
||||
subsys_initcall(ds_init);
|
||||
fs_initcall(ds_init);
|
||||
|
|
|
|||
|
|
@ -20,11 +20,6 @@
|
|||
|
||||
.text
|
||||
.align 32
|
||||
__handle_softirq:
|
||||
call do_softirq
|
||||
nop
|
||||
ba,a,pt %xcc, __handle_softirq_continue
|
||||
nop
|
||||
__handle_preemption:
|
||||
call schedule
|
||||
wrpr %g0, RTRAP_PSTATE, %pstate
|
||||
|
|
@ -89,9 +84,7 @@ rtrap:
|
|||
cmp %l1, 0
|
||||
|
||||
/* mm/ultra.S:xcall_report_regs KNOWS about this load. */
|
||||
bne,pn %icc, __handle_softirq
|
||||
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
|
||||
__handle_softirq_continue:
|
||||
rtrap_xcall:
|
||||
sethi %hi(0xf << 20), %l4
|
||||
and %l1, %l4, %l4
|
||||
|
|
|
|||
|
|
@ -174,7 +174,7 @@ sha512_update(struct shash_desc *desc, const u8 *data, unsigned int len)
|
|||
index = sctx->count[0] & 0x7f;
|
||||
|
||||
/* Update number of bytes */
|
||||
if (!(sctx->count[0] += len))
|
||||
if ((sctx->count[0] += len) < len)
|
||||
sctx->count[1]++;
|
||||
|
||||
part_len = 128 - index;
|
||||
|
|
|
|||
|
|
@ -358,6 +358,7 @@ typedef enum {
|
|||
*/
|
||||
struct acpi_object_extra {
|
||||
ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *method_REG; /* _REG method for this region (if any) */
|
||||
struct acpi_namespace_node *scope_node;
|
||||
void *region_context; /* Region-specific data */
|
||||
u8 *aml_start;
|
||||
u32 aml_length;
|
||||
|
|
|
|||
|
|
@ -384,7 +384,7 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc)
|
|||
|
||||
/* Execute the argument AML */
|
||||
|
||||
status = acpi_ds_execute_arguments(node, node->parent,
|
||||
status = acpi_ds_execute_arguments(node, extra_desc->extra.scope_node,
|
||||
extra_desc->extra.aml_length,
|
||||
extra_desc->extra.aml_start);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
|
|
|||
|
|
@ -330,6 +330,12 @@ acpi_ex_create_region(u8 * aml_start,
|
|||
region_obj2 = obj_desc->common.next_object;
|
||||
region_obj2->extra.aml_start = aml_start;
|
||||
region_obj2->extra.aml_length = aml_length;
|
||||
if (walk_state->scope_info) {
|
||||
region_obj2->extra.scope_node =
|
||||
walk_state->scope_info->scope.node;
|
||||
} else {
|
||||
region_obj2->extra.scope_node = node;
|
||||
}
|
||||
|
||||
/* Init the region from the operands */
|
||||
|
||||
|
|
|
|||
|
|
@ -866,6 +866,7 @@ cciss_scsi_detect(ctlr_info_t *h)
|
|||
sh->can_queue = cciss_tape_cmds;
|
||||
sh->sg_tablesize = h->maxsgentries;
|
||||
sh->max_cmd_len = MAX_COMMAND_SIZE;
|
||||
sh->max_sectors = h->cciss_max_sectors;
|
||||
|
||||
((struct cciss_scsi_adapter_data_t *)
|
||||
h->scsi_ctlr)->scsi_host = sh;
|
||||
|
|
@ -1410,7 +1411,7 @@ static void cciss_scatter_gather(ctlr_info_t *h, CommandList_struct *c,
|
|||
/* track how many SG entries we are using */
|
||||
if (request_nsgs > h->maxSG)
|
||||
h->maxSG = request_nsgs;
|
||||
c->Header.SGTotal = (__u8) request_nsgs + chained;
|
||||
c->Header.SGTotal = (u16) request_nsgs + chained;
|
||||
if (request_nsgs > h->max_cmd_sgentries)
|
||||
c->Header.SGList = h->max_cmd_sgentries;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -71,6 +71,9 @@ static struct usb_device_id ath3k_table[] = {
|
|||
|
||||
/* Atheros AR3012 with sflash firmware*/
|
||||
{ USB_DEVICE(0x0CF3, 0x3004) },
|
||||
{ USB_DEVICE(0x0CF3, 0x311D) },
|
||||
{ USB_DEVICE(0x13d3, 0x3375) },
|
||||
{ USB_DEVICE(0x04CA, 0x3005) },
|
||||
|
||||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xE02C) },
|
||||
|
|
@ -87,6 +90,9 @@ static struct usb_device_id ath3k_blist_tbl[] = {
|
|||
|
||||
/* Atheros AR3012 with sflash firmware*/
|
||||
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
|
|
|||
|
|
@ -123,6 +123,9 @@ static struct usb_device_id blacklist_table[] = {
|
|||
|
||||
/* Atheros 3012 with sflash firmware */
|
||||
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
|
||||
|
|
|
|||
|
|
@ -237,7 +237,6 @@ static void hci_uart_destruct(struct hci_dev *hdev)
|
|||
return;
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
kfree(hdev->driver_data);
|
||||
}
|
||||
|
||||
/* ------ LDISC part ------ */
|
||||
|
|
@ -310,12 +309,13 @@ static void hci_uart_tty_close(struct tty_struct *tty)
|
|||
hci_uart_close(hdev);
|
||||
|
||||
if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) {
|
||||
hu->proto->close(hu);
|
||||
if (hdev) {
|
||||
hci_unregister_dev(hdev);
|
||||
hci_free_dev(hdev);
|
||||
}
|
||||
hu->proto->close(hu);
|
||||
}
|
||||
kfree(hu);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -200,18 +200,17 @@ config PL330_DMA
|
|||
platform_data for a dma-pl330 device.
|
||||
|
||||
config PCH_DMA
|
||||
tristate "Intel EG20T PCH / OKI Semi IOH(ML7213/ML7223) DMA support"
|
||||
tristate "Intel EG20T PCH / OKI Semi IOH(ML7213/ML7223/ML7831) DMA support"
|
||||
depends on PCI && X86
|
||||
select DMA_ENGINE
|
||||
help
|
||||
Enable support for Intel EG20T PCH DMA engine.
|
||||
|
||||
This driver also can be used for OKI SEMICONDUCTOR IOH(Input/
|
||||
Output Hub), ML7213 and ML7223.
|
||||
ML7213 IOH is for IVI(In-Vehicle Infotainment) use and ML7223 IOH is
|
||||
for MP(Media Phone) use.
|
||||
ML7213/ML7223 is companion chip for Intel Atom E6xx series.
|
||||
ML7213/ML7223 is completely compatible for Intel EG20T PCH.
|
||||
Output Hub), ML7213, ML7223 and ML7831.
|
||||
ML7213 IOH is for IVI(In-Vehicle Infotainment) use, ML7223 IOH is
|
||||
for MP(Media Phone) use and ML7831 IOH is for general purpose use.
|
||||
ML7213/ML7223/ML7831 is companion chip for Intel Atom E6xx series.
|
||||
ML7213/ML7223/ML7831 is completely compatible for Intel EG20T PCH.
|
||||
|
||||
config IMX_SDMA
|
||||
tristate "i.MX SDMA support"
|
||||
|
|
|
|||
|
|
@ -45,7 +45,8 @@
|
|||
#define DMA_STATUS_MASK_BITS 0x3
|
||||
#define DMA_STATUS_SHIFT_BITS 16
|
||||
#define DMA_STATUS_IRQ(x) (0x1 << (x))
|
||||
#define DMA_STATUS_ERR(x) (0x1 << ((x) + 8))
|
||||
#define DMA_STATUS0_ERR(x) (0x1 << ((x) + 8))
|
||||
#define DMA_STATUS2_ERR(x) (0x1 << (x))
|
||||
|
||||
#define DMA_DESC_WIDTH_SHIFT_BITS 12
|
||||
#define DMA_DESC_WIDTH_1_BYTE (0x3 << DMA_DESC_WIDTH_SHIFT_BITS)
|
||||
|
|
@ -59,7 +60,10 @@
|
|||
#define DMA_DESC_FOLLOW_WITHOUT_IRQ 0x2
|
||||
#define DMA_DESC_FOLLOW_WITH_IRQ 0x3
|
||||
|
||||
#define MAX_CHAN_NR 8
|
||||
#define MAX_CHAN_NR 12
|
||||
|
||||
#define DMA_MASK_CTL0_MODE 0x33333333
|
||||
#define DMA_MASK_CTL2_MODE 0x00003333
|
||||
|
||||
static unsigned int init_nr_desc_per_channel = 64;
|
||||
module_param(init_nr_desc_per_channel, uint, 0644);
|
||||
|
|
@ -133,6 +137,7 @@ struct pch_dma {
|
|||
#define PCH_DMA_CTL3 0x0C
|
||||
#define PCH_DMA_STS0 0x10
|
||||
#define PCH_DMA_STS1 0x14
|
||||
#define PCH_DMA_STS2 0x18
|
||||
|
||||
#define dma_readl(pd, name) \
|
||||
readl((pd)->membase + PCH_DMA_##name)
|
||||
|
|
@ -183,13 +188,19 @@ static void pdc_enable_irq(struct dma_chan *chan, int enable)
|
|||
{
|
||||
struct pch_dma *pd = to_pd(chan->device);
|
||||
u32 val;
|
||||
int pos;
|
||||
|
||||
if (chan->chan_id < 8)
|
||||
pos = chan->chan_id;
|
||||
else
|
||||
pos = chan->chan_id + 8;
|
||||
|
||||
val = dma_readl(pd, CTL2);
|
||||
|
||||
if (enable)
|
||||
val |= 0x1 << chan->chan_id;
|
||||
val |= 0x1 << pos;
|
||||
else
|
||||
val &= ~(0x1 << chan->chan_id);
|
||||
val &= ~(0x1 << pos);
|
||||
|
||||
dma_writel(pd, CTL2, val);
|
||||
|
||||
|
|
@ -202,10 +213,17 @@ static void pdc_set_dir(struct dma_chan *chan)
|
|||
struct pch_dma_chan *pd_chan = to_pd_chan(chan);
|
||||
struct pch_dma *pd = to_pd(chan->device);
|
||||
u32 val;
|
||||
u32 mask_mode;
|
||||
u32 mask_ctl;
|
||||
|
||||
if (chan->chan_id < 8) {
|
||||
val = dma_readl(pd, CTL0);
|
||||
|
||||
mask_mode = DMA_CTL0_MODE_MASK_BITS <<
|
||||
(DMA_CTL0_BITS_PER_CH * chan->chan_id);
|
||||
mask_ctl = DMA_MASK_CTL0_MODE & ~(DMA_CTL0_MODE_MASK_BITS <<
|
||||
(DMA_CTL0_BITS_PER_CH * chan->chan_id));
|
||||
val &= mask_mode;
|
||||
if (pd_chan->dir == DMA_TO_DEVICE)
|
||||
val |= 0x1 << (DMA_CTL0_BITS_PER_CH * chan->chan_id +
|
||||
DMA_CTL0_DIR_SHIFT_BITS);
|
||||
|
|
@ -213,18 +231,24 @@ static void pdc_set_dir(struct dma_chan *chan)
|
|||
val &= ~(0x1 << (DMA_CTL0_BITS_PER_CH * chan->chan_id +
|
||||
DMA_CTL0_DIR_SHIFT_BITS));
|
||||
|
||||
val |= mask_ctl;
|
||||
dma_writel(pd, CTL0, val);
|
||||
} else {
|
||||
int ch = chan->chan_id - 8; /* ch8-->0 ch9-->1 ... ch11->3 */
|
||||
val = dma_readl(pd, CTL3);
|
||||
|
||||
mask_mode = DMA_CTL0_MODE_MASK_BITS <<
|
||||
(DMA_CTL0_BITS_PER_CH * ch);
|
||||
mask_ctl = DMA_MASK_CTL2_MODE & ~(DMA_CTL0_MODE_MASK_BITS <<
|
||||
(DMA_CTL0_BITS_PER_CH * ch));
|
||||
val &= mask_mode;
|
||||
if (pd_chan->dir == DMA_TO_DEVICE)
|
||||
val |= 0x1 << (DMA_CTL0_BITS_PER_CH * ch +
|
||||
DMA_CTL0_DIR_SHIFT_BITS);
|
||||
else
|
||||
val &= ~(0x1 << (DMA_CTL0_BITS_PER_CH * ch +
|
||||
DMA_CTL0_DIR_SHIFT_BITS));
|
||||
|
||||
val |= mask_ctl;
|
||||
dma_writel(pd, CTL3, val);
|
||||
}
|
||||
|
||||
|
|
@ -236,33 +260,37 @@ static void pdc_set_mode(struct dma_chan *chan, u32 mode)
|
|||
{
|
||||
struct pch_dma *pd = to_pd(chan->device);
|
||||
u32 val;
|
||||
u32 mask_ctl;
|
||||
u32 mask_dir;
|
||||
|
||||
if (chan->chan_id < 8) {
|
||||
mask_ctl = DMA_MASK_CTL0_MODE & ~(DMA_CTL0_MODE_MASK_BITS <<
|
||||
(DMA_CTL0_BITS_PER_CH * chan->chan_id));
|
||||
mask_dir = 1 << (DMA_CTL0_BITS_PER_CH * chan->chan_id +\
|
||||
DMA_CTL0_DIR_SHIFT_BITS);
|
||||
val = dma_readl(pd, CTL0);
|
||||
|
||||
val &= ~(DMA_CTL0_MODE_MASK_BITS <<
|
||||
(DMA_CTL0_BITS_PER_CH * chan->chan_id));
|
||||
val &= mask_dir;
|
||||
val |= mode << (DMA_CTL0_BITS_PER_CH * chan->chan_id);
|
||||
|
||||
val |= mask_ctl;
|
||||
dma_writel(pd, CTL0, val);
|
||||
} else {
|
||||
int ch = chan->chan_id - 8; /* ch8-->0 ch9-->1 ... ch11->3 */
|
||||
|
||||
mask_ctl = DMA_MASK_CTL2_MODE & ~(DMA_CTL0_MODE_MASK_BITS <<
|
||||
(DMA_CTL0_BITS_PER_CH * ch));
|
||||
mask_dir = 1 << (DMA_CTL0_BITS_PER_CH * ch +\
|
||||
DMA_CTL0_DIR_SHIFT_BITS);
|
||||
val = dma_readl(pd, CTL3);
|
||||
|
||||
val &= ~(DMA_CTL0_MODE_MASK_BITS <<
|
||||
(DMA_CTL0_BITS_PER_CH * ch));
|
||||
val &= mask_dir;
|
||||
val |= mode << (DMA_CTL0_BITS_PER_CH * ch);
|
||||
|
||||
val |= mask_ctl;
|
||||
dma_writel(pd, CTL3, val);
|
||||
|
||||
}
|
||||
|
||||
dev_dbg(chan2dev(chan), "pdc_set_mode: chan %d -> %x\n",
|
||||
chan->chan_id, val);
|
||||
}
|
||||
|
||||
static u32 pdc_get_status(struct pch_dma_chan *pd_chan)
|
||||
static u32 pdc_get_status0(struct pch_dma_chan *pd_chan)
|
||||
{
|
||||
struct pch_dma *pd = to_pd(pd_chan->chan.device);
|
||||
u32 val;
|
||||
|
|
@ -272,9 +300,27 @@ static u32 pdc_get_status(struct pch_dma_chan *pd_chan)
|
|||
DMA_STATUS_BITS_PER_CH * pd_chan->chan.chan_id));
|
||||
}
|
||||
|
||||
static u32 pdc_get_status2(struct pch_dma_chan *pd_chan)
|
||||
{
|
||||
struct pch_dma *pd = to_pd(pd_chan->chan.device);
|
||||
u32 val;
|
||||
|
||||
val = dma_readl(pd, STS2);
|
||||
return DMA_STATUS_MASK_BITS & (val >> (DMA_STATUS_SHIFT_BITS +
|
||||
DMA_STATUS_BITS_PER_CH * (pd_chan->chan.chan_id - 8)));
|
||||
}
|
||||
|
||||
static bool pdc_is_idle(struct pch_dma_chan *pd_chan)
|
||||
{
|
||||
if (pdc_get_status(pd_chan) == DMA_STATUS_IDLE)
|
||||
u32 sts;
|
||||
|
||||
if (pd_chan->chan.chan_id < 8)
|
||||
sts = pdc_get_status0(pd_chan);
|
||||
else
|
||||
sts = pdc_get_status2(pd_chan);
|
||||
|
||||
|
||||
if (sts == DMA_STATUS_IDLE)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
|
|
@ -495,11 +541,11 @@ static int pd_alloc_chan_resources(struct dma_chan *chan)
|
|||
list_add_tail(&desc->desc_node, &tmp_list);
|
||||
}
|
||||
|
||||
spin_lock_bh(&pd_chan->lock);
|
||||
spin_lock_irq(&pd_chan->lock);
|
||||
list_splice(&tmp_list, &pd_chan->free_list);
|
||||
pd_chan->descs_allocated = i;
|
||||
pd_chan->completed_cookie = chan->cookie = 1;
|
||||
spin_unlock_bh(&pd_chan->lock);
|
||||
spin_unlock_irq(&pd_chan->lock);
|
||||
|
||||
pdc_enable_irq(chan, 1);
|
||||
|
||||
|
|
@ -517,10 +563,10 @@ static void pd_free_chan_resources(struct dma_chan *chan)
|
|||
BUG_ON(!list_empty(&pd_chan->active_list));
|
||||
BUG_ON(!list_empty(&pd_chan->queue));
|
||||
|
||||
spin_lock_bh(&pd_chan->lock);
|
||||
spin_lock_irq(&pd_chan->lock);
|
||||
list_splice_init(&pd_chan->free_list, &tmp_list);
|
||||
pd_chan->descs_allocated = 0;
|
||||
spin_unlock_bh(&pd_chan->lock);
|
||||
spin_unlock_irq(&pd_chan->lock);
|
||||
|
||||
list_for_each_entry_safe(desc, _d, &tmp_list, desc_node)
|
||||
pci_pool_free(pd->pool, desc, desc->txd.phys);
|
||||
|
|
@ -536,10 +582,10 @@ static enum dma_status pd_tx_status(struct dma_chan *chan, dma_cookie_t cookie,
|
|||
dma_cookie_t last_completed;
|
||||
int ret;
|
||||
|
||||
spin_lock_bh(&pd_chan->lock);
|
||||
spin_lock_irq(&pd_chan->lock);
|
||||
last_completed = pd_chan->completed_cookie;
|
||||
last_used = chan->cookie;
|
||||
spin_unlock_bh(&pd_chan->lock);
|
||||
spin_unlock_irq(&pd_chan->lock);
|
||||
|
||||
ret = dma_async_is_complete(cookie, last_completed, last_used);
|
||||
|
||||
|
|
@ -654,7 +700,7 @@ static int pd_device_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
|
|||
if (cmd != DMA_TERMINATE_ALL)
|
||||
return -ENXIO;
|
||||
|
||||
spin_lock_bh(&pd_chan->lock);
|
||||
spin_lock_irq(&pd_chan->lock);
|
||||
|
||||
pdc_set_mode(&pd_chan->chan, DMA_CTL0_DISABLE);
|
||||
|
||||
|
|
@ -664,7 +710,7 @@ static int pd_device_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
|
|||
list_for_each_entry_safe(desc, _d, &list, desc_node)
|
||||
pdc_chain_complete(pd_chan, desc);
|
||||
|
||||
spin_unlock_bh(&pd_chan->lock);
|
||||
spin_unlock_irq(&pd_chan->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -693,30 +739,45 @@ static irqreturn_t pd_irq(int irq, void *devid)
|
|||
struct pch_dma *pd = (struct pch_dma *)devid;
|
||||
struct pch_dma_chan *pd_chan;
|
||||
u32 sts0;
|
||||
u32 sts2;
|
||||
int i;
|
||||
int ret = IRQ_NONE;
|
||||
int ret0 = IRQ_NONE;
|
||||
int ret2 = IRQ_NONE;
|
||||
|
||||
sts0 = dma_readl(pd, STS0);
|
||||
sts2 = dma_readl(pd, STS2);
|
||||
|
||||
dev_dbg(pd->dma.dev, "pd_irq sts0: %x\n", sts0);
|
||||
|
||||
for (i = 0; i < pd->dma.chancnt; i++) {
|
||||
pd_chan = &pd->channels[i];
|
||||
|
||||
if (sts0 & DMA_STATUS_IRQ(i)) {
|
||||
if (sts0 & DMA_STATUS_ERR(i))
|
||||
set_bit(0, &pd_chan->err_status);
|
||||
if (i < 8) {
|
||||
if (sts0 & DMA_STATUS_IRQ(i)) {
|
||||
if (sts0 & DMA_STATUS0_ERR(i))
|
||||
set_bit(0, &pd_chan->err_status);
|
||||
|
||||
tasklet_schedule(&pd_chan->tasklet);
|
||||
ret = IRQ_HANDLED;
|
||||
tasklet_schedule(&pd_chan->tasklet);
|
||||
ret0 = IRQ_HANDLED;
|
||||
}
|
||||
} else {
|
||||
if (sts2 & DMA_STATUS_IRQ(i - 8)) {
|
||||
if (sts2 & DMA_STATUS2_ERR(i))
|
||||
set_bit(0, &pd_chan->err_status);
|
||||
|
||||
tasklet_schedule(&pd_chan->tasklet);
|
||||
ret2 = IRQ_HANDLED;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* clear interrupt bits in status register */
|
||||
dma_writel(pd, STS0, sts0);
|
||||
if (ret0)
|
||||
dma_writel(pd, STS0, sts0);
|
||||
if (ret2)
|
||||
dma_writel(pd, STS2, sts2);
|
||||
|
||||
return ret;
|
||||
return ret0 | ret2;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
|
@ -960,6 +1021,8 @@ static void __devexit pch_dma_remove(struct pci_dev *pdev)
|
|||
#define PCI_DEVICE_ID_ML7223_DMA2_4CH 0x800E
|
||||
#define PCI_DEVICE_ID_ML7223_DMA3_4CH 0x8017
|
||||
#define PCI_DEVICE_ID_ML7223_DMA4_4CH 0x803B
|
||||
#define PCI_DEVICE_ID_ML7831_DMA1_8CH 0x8810
|
||||
#define PCI_DEVICE_ID_ML7831_DMA2_4CH 0x8815
|
||||
|
||||
DEFINE_PCI_DEVICE_TABLE(pch_dma_id_table) = {
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_EG20T_PCH_DMA_8CH), 8 },
|
||||
|
|
@ -972,6 +1035,8 @@ DEFINE_PCI_DEVICE_TABLE(pch_dma_id_table) = {
|
|||
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7223_DMA2_4CH), 4}, /* Video SPI */
|
||||
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7223_DMA3_4CH), 4}, /* Security */
|
||||
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7223_DMA4_4CH), 4}, /* FPGA */
|
||||
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7831_DMA1_8CH), 8}, /* UART */
|
||||
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7831_DMA2_4CH), 4}, /* SPI */
|
||||
{ 0, },
|
||||
};
|
||||
|
||||
|
|
@ -999,7 +1064,7 @@ static void __exit pch_dma_exit(void)
|
|||
module_init(pch_dma_init);
|
||||
module_exit(pch_dma_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Intel EG20T PCH / OKI SEMICONDUCTOR ML7213 IOH "
|
||||
"DMA controller driver");
|
||||
MODULE_DESCRIPTION("Intel EG20T PCH / OKI SEMICON ML7213/ML7223/ML7831 IOH"
|
||||
"DMA controller driver");
|
||||
MODULE_AUTHOR("Yong Wang <yong.y.wang@intel.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
|||
|
|
@ -863,7 +863,7 @@ int intel_init_ring_buffer(struct drm_device *dev,
|
|||
* of the buffer.
|
||||
*/
|
||||
ring->effective_size = ring->size;
|
||||
if (IS_I830(ring->dev))
|
||||
if (IS_I830(ring->dev) || IS_845G(ring->dev))
|
||||
ring->effective_size -= 128;
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -990,7 +990,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
|
|||
|
||||
encoder = obj_to_encoder(obj);
|
||||
|
||||
if (encoder->encoder_type != DRM_MODE_ENCODER_DAC ||
|
||||
if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
|
||||
encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
|
||||
continue;
|
||||
|
||||
|
|
@ -1020,6 +1020,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
|
|||
* cases the DVI port is actually a virtual KVM port connected to the service
|
||||
* processor.
|
||||
*/
|
||||
out:
|
||||
if ((!rdev->is_atom_bios) &&
|
||||
(ret == connector_status_disconnected) &&
|
||||
rdev->mode_info.bios_hardcoded_edid_size) {
|
||||
|
|
@ -1027,7 +1028,6 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
|
|||
ret = connector_status_connected;
|
||||
}
|
||||
|
||||
out:
|
||||
/* updated in get modes as well since we need to know if it's analog or digital */
|
||||
radeon_connector_update_scratch_regs(connector, ret);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -898,6 +898,10 @@ struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev,
|
|||
struct radeon_i2c_chan *i2c;
|
||||
int ret;
|
||||
|
||||
/* don't add the mm_i2c bus unless hw_i2c is enabled */
|
||||
if (rec->mm_i2c && (radeon_hw_i2c == 0))
|
||||
return NULL;
|
||||
|
||||
i2c = kzalloc(sizeof(struct radeon_i2c_chan), GFP_KERNEL);
|
||||
if (i2c == NULL)
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -143,6 +143,12 @@ static bool radeon_msi_ok(struct radeon_device *rdev)
|
|||
(rdev->pdev->subsystem_device == 0x01fd))
|
||||
return true;
|
||||
|
||||
/* RV515 seems to have MSI issues where it loses
|
||||
* MSI rearms occasionally. This leads to lockups and freezes.
|
||||
* disable it by default.
|
||||
*/
|
||||
if (rdev->family == CHIP_RV515)
|
||||
return false;
|
||||
if (rdev->flags & RADEON_IS_IGP) {
|
||||
/* APUs work fine with MSIs */
|
||||
if (rdev->family >= CHIP_PALM)
|
||||
|
|
|
|||
|
|
@ -1897,7 +1897,9 @@ int bitmap_load(mddev_t *mddev)
|
|||
* re-add of a missing device */
|
||||
start = mddev->recovery_cp;
|
||||
|
||||
mutex_lock(&mddev->bitmap_info.mutex);
|
||||
err = bitmap_init_from_disk(bitmap, start);
|
||||
mutex_unlock(&mddev->bitmap_info.mutex);
|
||||
}
|
||||
if (err)
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -1058,6 +1058,7 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
|
|||
goto exit_unregister_led;
|
||||
}
|
||||
|
||||
data->dev->driver_type = RC_DRIVER_IR_RAW;
|
||||
data->dev->driver_name = WBCIR_NAME;
|
||||
data->dev->input_name = WBCIR_NAME;
|
||||
data->dev->input_phys = "wbcir/cir0";
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@
|
|||
#define PCH_PHUB_INTPIN_REG_WPERMIT_REG3 0x002C
|
||||
#define PCH_PHUB_INT_REDUCE_CONTROL_REG_BASE 0x0040
|
||||
#define CLKCFG_REG_OFFSET 0x500
|
||||
#define FUNCSEL_REG_OFFSET 0x508
|
||||
|
||||
#define PCH_PHUB_OROM_SIZE 15360
|
||||
|
||||
|
|
@ -111,11 +112,13 @@
|
|||
* @intpin_reg_wpermit_reg3: INTPIN_REG_WPERMIT register 3 val
|
||||
* @int_reduce_control_reg: INT_REDUCE_CONTROL registers val
|
||||
* @clkcfg_reg: CLK CFG register val
|
||||
* @funcsel_reg: Function select register value
|
||||
* @pch_phub_base_address: Register base address
|
||||
* @pch_phub_extrom_base_address: external rom base address
|
||||
* @pch_mac_start_address: MAC address area start address
|
||||
* @pch_opt_rom_start_address: Option ROM start address
|
||||
* @ioh_type: Save IOH type
|
||||
* @pdev: pointer to pci device struct
|
||||
*/
|
||||
struct pch_phub_reg {
|
||||
u32 phub_id_reg;
|
||||
|
|
@ -131,11 +134,13 @@ struct pch_phub_reg {
|
|||
u32 intpin_reg_wpermit_reg3;
|
||||
u32 int_reduce_control_reg[MAX_NUM_INT_REDUCE_CONTROL_REG];
|
||||
u32 clkcfg_reg;
|
||||
u32 funcsel_reg;
|
||||
void __iomem *pch_phub_base_address;
|
||||
void __iomem *pch_phub_extrom_base_address;
|
||||
u32 pch_mac_start_address;
|
||||
u32 pch_opt_rom_start_address;
|
||||
int ioh_type;
|
||||
struct pci_dev *pdev;
|
||||
};
|
||||
|
||||
/* SROM SPEC for MAC address assignment offset */
|
||||
|
|
@ -214,6 +219,8 @@ static void pch_phub_save_reg_conf(struct pci_dev *pdev)
|
|||
__func__, i, chip->int_reduce_control_reg[i]);
|
||||
}
|
||||
chip->clkcfg_reg = ioread32(p + CLKCFG_REG_OFFSET);
|
||||
if ((chip->ioh_type == 2) || (chip->ioh_type == 4))
|
||||
chip->funcsel_reg = ioread32(p + FUNCSEL_REG_OFFSET);
|
||||
}
|
||||
|
||||
/* pch_phub_restore_reg_conf - restore register configuration */
|
||||
|
|
@ -274,6 +281,8 @@ static void pch_phub_restore_reg_conf(struct pci_dev *pdev)
|
|||
}
|
||||
|
||||
iowrite32(chip->clkcfg_reg, p + CLKCFG_REG_OFFSET);
|
||||
if ((chip->ioh_type == 2) || (chip->ioh_type == 4))
|
||||
iowrite32(chip->funcsel_reg, p + FUNCSEL_REG_OFFSET);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -494,6 +503,7 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,
|
|||
unsigned int orom_size;
|
||||
int ret;
|
||||
int err;
|
||||
ssize_t rom_size;
|
||||
|
||||
struct pch_phub_reg *chip =
|
||||
dev_get_drvdata(container_of(kobj, struct device, kobj));
|
||||
|
|
@ -505,6 +515,10 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,
|
|||
}
|
||||
|
||||
/* Get Rom signature */
|
||||
chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
|
||||
if (!chip->pch_phub_extrom_base_address)
|
||||
goto exrom_map_err;
|
||||
|
||||
pch_phub_read_serial_rom(chip, chip->pch_opt_rom_start_address,
|
||||
(unsigned char *)&rom_signature);
|
||||
rom_signature &= 0xff;
|
||||
|
|
@ -535,10 +549,13 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,
|
|||
goto return_err;
|
||||
}
|
||||
return_ok:
|
||||
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
||||
mutex_unlock(&pch_phub_mutex);
|
||||
return addr_offset;
|
||||
|
||||
return_err:
|
||||
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
||||
exrom_map_err:
|
||||
mutex_unlock(&pch_phub_mutex);
|
||||
return_err_nomutex:
|
||||
return err;
|
||||
|
|
@ -551,6 +568,7 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,
|
|||
int err;
|
||||
unsigned int addr_offset;
|
||||
int ret;
|
||||
ssize_t rom_size;
|
||||
struct pch_phub_reg *chip =
|
||||
dev_get_drvdata(container_of(kobj, struct device, kobj));
|
||||
|
||||
|
|
@ -567,6 +585,12 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,
|
|||
goto return_ok;
|
||||
}
|
||||
|
||||
chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
|
||||
if (!chip->pch_phub_extrom_base_address) {
|
||||
err = -ENOMEM;
|
||||
goto exrom_map_err;
|
||||
}
|
||||
|
||||
for (addr_offset = 0; addr_offset < count; addr_offset++) {
|
||||
if (PCH_PHUB_OROM_SIZE < off + addr_offset)
|
||||
goto return_ok;
|
||||
|
|
@ -581,10 +605,14 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,
|
|||
}
|
||||
|
||||
return_ok:
|
||||
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
||||
mutex_unlock(&pch_phub_mutex);
|
||||
return addr_offset;
|
||||
|
||||
return_err:
|
||||
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
||||
|
||||
exrom_map_err:
|
||||
mutex_unlock(&pch_phub_mutex);
|
||||
return err;
|
||||
}
|
||||
|
|
@ -594,8 +622,14 @@ static ssize_t show_pch_mac(struct device *dev, struct device_attribute *attr,
|
|||
{
|
||||
u8 mac[8];
|
||||
struct pch_phub_reg *chip = dev_get_drvdata(dev);
|
||||
ssize_t rom_size;
|
||||
|
||||
chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
|
||||
if (!chip->pch_phub_extrom_base_address)
|
||||
return -ENOMEM;
|
||||
|
||||
pch_phub_read_gbe_mac_addr(chip, mac);
|
||||
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
||||
|
||||
return sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||
|
|
@ -605,6 +639,7 @@ static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr,
|
|||
const char *buf, size_t count)
|
||||
{
|
||||
u8 mac[6];
|
||||
ssize_t rom_size;
|
||||
struct pch_phub_reg *chip = dev_get_drvdata(dev);
|
||||
|
||||
if (count != 18)
|
||||
|
|
@ -614,7 +649,12 @@ static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr,
|
|||
(u32 *)&mac[0], (u32 *)&mac[1], (u32 *)&mac[2], (u32 *)&mac[3],
|
||||
(u32 *)&mac[4], (u32 *)&mac[5]);
|
||||
|
||||
chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
|
||||
if (!chip->pch_phub_extrom_base_address)
|
||||
return -ENOMEM;
|
||||
|
||||
pch_phub_write_gbe_mac_addr(chip, mac);
|
||||
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
|
@ -637,7 +677,6 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
|
|||
int retval;
|
||||
|
||||
int ret;
|
||||
ssize_t rom_size;
|
||||
struct pch_phub_reg *chip;
|
||||
|
||||
chip = kzalloc(sizeof(struct pch_phub_reg), GFP_KERNEL);
|
||||
|
|
@ -674,19 +713,7 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
|
|||
"in pch_phub_base_address variable is %p\n", __func__,
|
||||
chip->pch_phub_base_address);
|
||||
|
||||
if (id->driver_data != 3) {
|
||||
chip->pch_phub_extrom_base_address =\
|
||||
pci_map_rom(pdev, &rom_size);
|
||||
if (chip->pch_phub_extrom_base_address == 0) {
|
||||
dev_err(&pdev->dev, "%s: pci_map_rom FAILED", __func__);
|
||||
ret = -ENOMEM;
|
||||
goto err_pci_map;
|
||||
}
|
||||
dev_dbg(&pdev->dev, "%s : "
|
||||
"pci_map_rom SUCCESS and value in "
|
||||
"pch_phub_extrom_base_address variable is %p\n",
|
||||
__func__, chip->pch_phub_extrom_base_address);
|
||||
}
|
||||
chip->pdev = pdev; /* Save pci device struct */
|
||||
|
||||
if (id->driver_data == 1) { /* EG20T PCH */
|
||||
retval = sysfs_create_file(&pdev->dev.kobj,
|
||||
|
|
@ -735,6 +762,8 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
|
|||
* Device8(GbE)
|
||||
*/
|
||||
iowrite32(0x000a0000, chip->pch_phub_base_address + 0x14);
|
||||
/* set the interrupt delay value */
|
||||
iowrite32(0x25, chip->pch_phub_base_address + 0x140);
|
||||
chip->pch_opt_rom_start_address =\
|
||||
PCH_PHUB_ROM_START_ADDR_ML7223;
|
||||
chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223;
|
||||
|
|
@ -752,8 +781,6 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
|
|||
* Device6(SATA 2):f
|
||||
*/
|
||||
iowrite32(0x0000ffa0, chip->pch_phub_base_address + 0x14);
|
||||
/* set the interrupt delay value */
|
||||
iowrite32(0x25, chip->pch_phub_base_address + 0x140);
|
||||
chip->pch_opt_rom_start_address =\
|
||||
PCH_PHUB_ROM_START_ADDR_ML7223;
|
||||
chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223;
|
||||
|
|
@ -783,8 +810,6 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
|
|||
sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pch_mac.attr);
|
||||
|
||||
err_sysfs_create:
|
||||
pci_unmap_rom(pdev, chip->pch_phub_extrom_base_address);
|
||||
err_pci_map:
|
||||
pci_iounmap(pdev, chip->pch_phub_base_address);
|
||||
err_pci_iomap:
|
||||
pci_release_regions(pdev);
|
||||
|
|
@ -802,7 +827,6 @@ static void __devexit pch_phub_remove(struct pci_dev *pdev)
|
|||
|
||||
sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pch_mac.attr);
|
||||
sysfs_remove_bin_file(&pdev->dev.kobj, &pch_bin_attr);
|
||||
pci_unmap_rom(pdev, chip->pch_phub_extrom_base_address);
|
||||
pci_iounmap(pdev, chip->pch_phub_base_address);
|
||||
pci_release_regions(pdev);
|
||||
pci_disable_device(pdev);
|
||||
|
|
|
|||
|
|
@ -992,6 +992,11 @@ static inline void cp_start_hw (struct cp_private *cp)
|
|||
cpw8(Cmd, RxOn | TxOn);
|
||||
}
|
||||
|
||||
static void cp_enable_irq(struct cp_private *cp)
|
||||
{
|
||||
cpw16_f(IntrMask, cp_intr_mask);
|
||||
}
|
||||
|
||||
static void cp_init_hw (struct cp_private *cp)
|
||||
{
|
||||
struct net_device *dev = cp->dev;
|
||||
|
|
@ -1031,8 +1036,6 @@ static void cp_init_hw (struct cp_private *cp)
|
|||
|
||||
cpw16(MultiIntr, 0);
|
||||
|
||||
cpw16_f(IntrMask, cp_intr_mask);
|
||||
|
||||
cpw8_f(Cfg9346, Cfg9346_Lock);
|
||||
}
|
||||
|
||||
|
|
@ -1164,6 +1167,8 @@ static int cp_open (struct net_device *dev)
|
|||
if (rc)
|
||||
goto err_out_hw;
|
||||
|
||||
cp_enable_irq(cp);
|
||||
|
||||
netif_carrier_off(dev);
|
||||
mii_check_media(&cp->mii_if, netif_msg_link(cp), true);
|
||||
netif_start_queue(dev);
|
||||
|
|
@ -2052,6 +2057,7 @@ static int cp_resume (struct pci_dev *pdev)
|
|||
/* FIXME: sh*t may happen if the Rx ring buffer is depleted */
|
||||
cp_init_rings_index (cp);
|
||||
cp_init_hw (cp);
|
||||
cp_enable_irq(cp);
|
||||
netif_start_queue (dev);
|
||||
|
||||
spin_lock_irqsave (&cp->lock, flags);
|
||||
|
|
|
|||
|
|
@ -2476,7 +2476,7 @@ static irqreturn_t atl1_intr(int irq, void *data)
|
|||
"pcie phy link down %x\n", status);
|
||||
if (netif_running(adapter->netdev)) { /* reset MAC */
|
||||
iowrite32(0, adapter->hw.hw_addr + REG_IMR);
|
||||
schedule_work(&adapter->pcie_dma_to_rst_task);
|
||||
schedule_work(&adapter->reset_dev_task);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
}
|
||||
|
|
@ -2488,7 +2488,7 @@ static irqreturn_t atl1_intr(int irq, void *data)
|
|||
"pcie DMA r/w error (status = 0x%x)\n",
|
||||
status);
|
||||
iowrite32(0, adapter->hw.hw_addr + REG_IMR);
|
||||
schedule_work(&adapter->pcie_dma_to_rst_task);
|
||||
schedule_work(&adapter->reset_dev_task);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
@ -2633,10 +2633,10 @@ static void atl1_down(struct atl1_adapter *adapter)
|
|||
atl1_clean_rx_ring(adapter);
|
||||
}
|
||||
|
||||
static void atl1_tx_timeout_task(struct work_struct *work)
|
||||
static void atl1_reset_dev_task(struct work_struct *work)
|
||||
{
|
||||
struct atl1_adapter *adapter =
|
||||
container_of(work, struct atl1_adapter, tx_timeout_task);
|
||||
container_of(work, struct atl1_adapter, reset_dev_task);
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
|
||||
netif_device_detach(netdev);
|
||||
|
|
@ -3034,12 +3034,10 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
|
|||
(unsigned long)adapter);
|
||||
adapter->phy_timer_pending = false;
|
||||
|
||||
INIT_WORK(&adapter->tx_timeout_task, atl1_tx_timeout_task);
|
||||
INIT_WORK(&adapter->reset_dev_task, atl1_reset_dev_task);
|
||||
|
||||
INIT_WORK(&adapter->link_chg_task, atlx_link_chg_task);
|
||||
|
||||
INIT_WORK(&adapter->pcie_dma_to_rst_task, atl1_tx_timeout_task);
|
||||
|
||||
err = register_netdev(netdev);
|
||||
if (err)
|
||||
goto err_common;
|
||||
|
|
|
|||
|
|
@ -759,9 +759,8 @@ struct atl1_adapter {
|
|||
u16 link_speed;
|
||||
u16 link_duplex;
|
||||
spinlock_t lock;
|
||||
struct work_struct tx_timeout_task;
|
||||
struct work_struct reset_dev_task;
|
||||
struct work_struct link_chg_task;
|
||||
struct work_struct pcie_dma_to_rst_task;
|
||||
|
||||
struct timer_list phy_config_timer;
|
||||
bool phy_timer_pending;
|
||||
|
|
|
|||
|
|
@ -193,7 +193,7 @@ static void atlx_tx_timeout(struct net_device *netdev)
|
|||
{
|
||||
struct atlx_adapter *adapter = netdev_priv(netdev);
|
||||
/* Do the reset outside of interrupt context */
|
||||
schedule_work(&adapter->tx_timeout_task);
|
||||
schedule_work(&adapter->reset_dev_task);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -3076,7 +3076,11 @@ static void bond_ab_arp_commit(struct bonding *bond, int delta_in_ticks)
|
|||
trans_start + delta_in_ticks)) ||
|
||||
bond->curr_active_slave != slave) {
|
||||
slave->link = BOND_LINK_UP;
|
||||
bond->current_arp_slave = NULL;
|
||||
if (bond->current_arp_slave) {
|
||||
bond_set_slave_inactive_flags(
|
||||
bond->current_arp_slave);
|
||||
bond->current_arp_slave = NULL;
|
||||
}
|
||||
|
||||
pr_info("%s: link status definitely up for interface %s.\n",
|
||||
bond->dev->name, slave->dev->name);
|
||||
|
|
|
|||
|
|
@ -181,6 +181,11 @@ static inline int wait_for_user_access(struct davinci_mdio_data *data)
|
|||
__davinci_mdio_reset(data);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
reg = __raw_readl(®s->user[0].access);
|
||||
if ((reg & USERACCESS_GO) == 0)
|
||||
return 0;
|
||||
|
||||
dev_err(data->dev, "timed out waiting for user access\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -106,14 +106,14 @@ static int dummy_dev_init(struct net_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void dummy_dev_free(struct net_device *dev)
|
||||
static void dummy_dev_uninit(struct net_device *dev)
|
||||
{
|
||||
free_percpu(dev->dstats);
|
||||
free_netdev(dev);
|
||||
}
|
||||
|
||||
static const struct net_device_ops dummy_netdev_ops = {
|
||||
.ndo_init = dummy_dev_init,
|
||||
.ndo_uninit = dummy_dev_uninit,
|
||||
.ndo_start_xmit = dummy_xmit,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_multicast_list = set_multicast_list,
|
||||
|
|
@ -127,7 +127,7 @@ static void dummy_setup(struct net_device *dev)
|
|||
|
||||
/* Initialize the device structure. */
|
||||
dev->netdev_ops = &dummy_netdev_ops;
|
||||
dev->destructor = dummy_dev_free;
|
||||
dev->destructor = free_netdev;
|
||||
|
||||
/* Fill in device structure with ethernet-generic values. */
|
||||
dev->tx_queue_len = 0;
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
#define DRV_NAME "ks8851_mll"
|
||||
|
||||
static u8 KS_DEFAULT_MAC_ADDRESS[] = { 0x00, 0x10, 0xA1, 0x86, 0x95, 0x11 };
|
||||
#define MAX_RECV_FRAMES 32
|
||||
#define MAX_RECV_FRAMES 255
|
||||
#define MAX_BUF_SIZE 2048
|
||||
#define TX_BUF_SIZE 2000
|
||||
#define RX_BUF_SIZE 2000
|
||||
|
|
|
|||
|
|
@ -5679,7 +5679,7 @@ static int netdev_set_mac_address(struct net_device *dev, void *addr)
|
|||
memcpy(hw->override_addr, mac->sa_data, MAC_ADDR_LEN);
|
||||
}
|
||||
|
||||
memcpy(dev->dev_addr, mac->sa_data, MAX_ADDR_LEN);
|
||||
memcpy(dev->dev_addr, mac->sa_data, ETH_ALEN);
|
||||
|
||||
interrupt = hw_block_intr(hw);
|
||||
|
||||
|
|
|
|||
|
|
@ -968,7 +968,6 @@ ppp_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
proto = npindex_to_proto[npi];
|
||||
put_unaligned_be16(proto, pp);
|
||||
|
||||
netif_stop_queue(dev);
|
||||
skb_queue_tail(&ppp->file.xq, skb);
|
||||
ppp_xmit_process(ppp);
|
||||
return NETDEV_TX_OK;
|
||||
|
|
@ -1063,6 +1062,8 @@ ppp_xmit_process(struct ppp *ppp)
|
|||
code that we can accept some more. */
|
||||
if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq))
|
||||
netif_wake_queue(ppp->dev);
|
||||
else
|
||||
netif_stop_queue(ppp->dev);
|
||||
}
|
||||
ppp_xmit_unlock(ppp);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1083,10 +1083,8 @@ smsc911x_rx_counterrors(struct net_device *dev, unsigned int rxstat)
|
|||
|
||||
/* Quickly dumps bad packets */
|
||||
static void
|
||||
smsc911x_rx_fastforward(struct smsc911x_data *pdata, unsigned int pktbytes)
|
||||
smsc911x_rx_fastforward(struct smsc911x_data *pdata, unsigned int pktwords)
|
||||
{
|
||||
unsigned int pktwords = (pktbytes + NET_IP_ALIGN + 3) >> 2;
|
||||
|
||||
if (likely(pktwords >= 4)) {
|
||||
unsigned int timeout = 500;
|
||||
unsigned int val;
|
||||
|
|
@ -1150,7 +1148,7 @@ static int smsc911x_poll(struct napi_struct *napi, int budget)
|
|||
continue;
|
||||
}
|
||||
|
||||
skb = netdev_alloc_skb(dev, pktlength + NET_IP_ALIGN);
|
||||
skb = netdev_alloc_skb(dev, pktwords << 2);
|
||||
if (unlikely(!skb)) {
|
||||
SMSC_WARN(pdata, rx_err,
|
||||
"Unable to allocate skb for rx packet");
|
||||
|
|
@ -1160,14 +1158,12 @@ static int smsc911x_poll(struct napi_struct *napi, int budget)
|
|||
break;
|
||||
}
|
||||
|
||||
skb->data = skb->head;
|
||||
skb_reset_tail_pointer(skb);
|
||||
pdata->ops->rx_readfifo(pdata,
|
||||
(unsigned int *)skb->data, pktwords);
|
||||
|
||||
/* Align IP on 16B boundary */
|
||||
skb_reserve(skb, NET_IP_ALIGN);
|
||||
skb_put(skb, pktlength - 4);
|
||||
pdata->ops->rx_readfifo(pdata,
|
||||
(unsigned int *)skb->head, pktwords);
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
skb_checksum_none_assert(skb);
|
||||
netif_receive_skb(skb);
|
||||
|
|
@ -1390,7 +1386,7 @@ static int smsc911x_open(struct net_device *dev)
|
|||
smsc911x_reg_write(pdata, FIFO_INT, temp);
|
||||
|
||||
/* set RX Data offset to 2 bytes for alignment */
|
||||
smsc911x_reg_write(pdata, RX_CFG, (2 << 8));
|
||||
smsc911x_reg_write(pdata, RX_CFG, (NET_IP_ALIGN << 8));
|
||||
|
||||
/* enable NAPI polling before enabling RX interrupts */
|
||||
napi_enable(&pdata->napi);
|
||||
|
|
|
|||
|
|
@ -1049,6 +1049,7 @@ static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf)
|
|||
dev->net->ethtool_ops = &smsc75xx_ethtool_ops;
|
||||
dev->net->flags |= IFF_MULTICAST;
|
||||
dev->net->hard_header_len += SMSC75XX_TX_OVERHEAD;
|
||||
dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -606,7 +606,8 @@ static void i2400m_get_drvinfo(struct net_device *net_dev,
|
|||
struct i2400m *i2400m = net_dev_to_i2400m(net_dev);
|
||||
|
||||
strncpy(info->driver, KBUILD_MODNAME, sizeof(info->driver) - 1);
|
||||
strncpy(info->fw_version, i2400m->fw_name, sizeof(info->fw_version) - 1);
|
||||
strncpy(info->fw_version,
|
||||
i2400m->fw_name ? : "", sizeof(info->fw_version) - 1);
|
||||
if (net_dev->dev.parent)
|
||||
strncpy(info->bus_info, dev_name(net_dev->dev.parent),
|
||||
sizeof(info->bus_info) - 1);
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@
|
|||
|
||||
/* Common calibration code */
|
||||
|
||||
#define ATH9K_NF_TOO_HIGH -60
|
||||
|
||||
static int16_t ath9k_hw_get_nf_hist_mid(int16_t *nfCalBuffer)
|
||||
{
|
||||
|
|
@ -335,10 +334,10 @@ static void ath9k_hw_nf_sanitize(struct ath_hw *ah, s16 *nf)
|
|||
"NF calibrated [%s] [chain %d] is %d\n",
|
||||
(i >= 3 ? "ext" : "ctl"), i % 3, nf[i]);
|
||||
|
||||
if (nf[i] > ATH9K_NF_TOO_HIGH) {
|
||||
if (nf[i] > limit->max) {
|
||||
ath_dbg(common, ATH_DBG_CALIBRATE,
|
||||
"NF[%d] (%d) > MAX (%d), correcting to MAX\n",
|
||||
i, nf[i], ATH9K_NF_TOO_HIGH);
|
||||
i, nf[i], limit->max);
|
||||
nf[i] = limit->max;
|
||||
} else if (nf[i] < limit->min) {
|
||||
ath_dbg(common, ATH_DBG_CALIBRATE,
|
||||
|
|
|
|||
|
|
@ -819,11 +819,14 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
|||
{ USB_DEVICE(0x050d, 0x8053) },
|
||||
{ USB_DEVICE(0x050d, 0x805c) },
|
||||
{ USB_DEVICE(0x050d, 0x815c) },
|
||||
{ USB_DEVICE(0x050d, 0x825a) },
|
||||
{ USB_DEVICE(0x050d, 0x825b) },
|
||||
{ USB_DEVICE(0x050d, 0x935a) },
|
||||
{ USB_DEVICE(0x050d, 0x935b) },
|
||||
/* Buffalo */
|
||||
{ USB_DEVICE(0x0411, 0x00e8) },
|
||||
{ USB_DEVICE(0x0411, 0x0158) },
|
||||
{ USB_DEVICE(0x0411, 0x015d) },
|
||||
{ USB_DEVICE(0x0411, 0x016f) },
|
||||
{ USB_DEVICE(0x0411, 0x01a2) },
|
||||
/* Corega */
|
||||
|
|
@ -838,6 +841,8 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
|||
{ USB_DEVICE(0x07d1, 0x3c0e) },
|
||||
{ USB_DEVICE(0x07d1, 0x3c0f) },
|
||||
{ USB_DEVICE(0x07d1, 0x3c11) },
|
||||
{ USB_DEVICE(0x07d1, 0x3c13) },
|
||||
{ USB_DEVICE(0x07d1, 0x3c15) },
|
||||
{ USB_DEVICE(0x07d1, 0x3c16) },
|
||||
{ USB_DEVICE(0x2001, 0x3c1b) },
|
||||
/* Draytek */
|
||||
|
|
@ -846,6 +851,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
|||
{ USB_DEVICE(0x7392, 0x7711) },
|
||||
{ USB_DEVICE(0x7392, 0x7717) },
|
||||
{ USB_DEVICE(0x7392, 0x7718) },
|
||||
{ USB_DEVICE(0x7392, 0x7722) },
|
||||
/* Encore */
|
||||
{ USB_DEVICE(0x203d, 0x1480) },
|
||||
{ USB_DEVICE(0x203d, 0x14a9) },
|
||||
|
|
@ -880,6 +886,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
|||
{ USB_DEVICE(0x1737, 0x0070) },
|
||||
{ USB_DEVICE(0x1737, 0x0071) },
|
||||
{ USB_DEVICE(0x1737, 0x0077) },
|
||||
{ USB_DEVICE(0x1737, 0x0078) },
|
||||
/* Logitec */
|
||||
{ USB_DEVICE(0x0789, 0x0162) },
|
||||
{ USB_DEVICE(0x0789, 0x0163) },
|
||||
|
|
@ -903,9 +910,13 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
|||
{ USB_DEVICE(0x0db0, 0x871b) },
|
||||
{ USB_DEVICE(0x0db0, 0x871c) },
|
||||
{ USB_DEVICE(0x0db0, 0x899a) },
|
||||
/* Ovislink */
|
||||
{ USB_DEVICE(0x1b75, 0x3071) },
|
||||
{ USB_DEVICE(0x1b75, 0x3072) },
|
||||
/* Para */
|
||||
{ USB_DEVICE(0x20b8, 0x8888) },
|
||||
/* Pegatron */
|
||||
{ USB_DEVICE(0x1d4d, 0x0002) },
|
||||
{ USB_DEVICE(0x1d4d, 0x000c) },
|
||||
{ USB_DEVICE(0x1d4d, 0x000e) },
|
||||
{ USB_DEVICE(0x1d4d, 0x0011) },
|
||||
|
|
@ -943,6 +954,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
|||
{ USB_DEVICE(0x0df6, 0x0048) },
|
||||
{ USB_DEVICE(0x0df6, 0x0051) },
|
||||
{ USB_DEVICE(0x0df6, 0x005f) },
|
||||
{ USB_DEVICE(0x0df6, 0x0060) },
|
||||
/* SMC */
|
||||
{ USB_DEVICE(0x083a, 0x6618) },
|
||||
{ USB_DEVICE(0x083a, 0x7511) },
|
||||
|
|
@ -957,7 +969,9 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
|||
/* Sparklan */
|
||||
{ USB_DEVICE(0x15a9, 0x0006) },
|
||||
/* Sweex */
|
||||
{ USB_DEVICE(0x177f, 0x0153) },
|
||||
{ USB_DEVICE(0x177f, 0x0302) },
|
||||
{ USB_DEVICE(0x177f, 0x0313) },
|
||||
/* U-Media */
|
||||
{ USB_DEVICE(0x157e, 0x300e) },
|
||||
{ USB_DEVICE(0x157e, 0x3013) },
|
||||
|
|
@ -975,6 +989,8 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
|||
{ USB_DEVICE(0x0586, 0x341e) },
|
||||
{ USB_DEVICE(0x0586, 0x343e) },
|
||||
#ifdef CONFIG_RT2800USB_RT33XX
|
||||
/* Belkin */
|
||||
{ USB_DEVICE(0x050d, 0x945b) },
|
||||
/* Ralink */
|
||||
{ USB_DEVICE(0x148f, 0x3370) },
|
||||
{ USB_DEVICE(0x148f, 0x8070) },
|
||||
|
|
@ -999,6 +1015,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
|||
{ USB_DEVICE(0x148f, 0x3572) },
|
||||
/* Sitecom */
|
||||
{ USB_DEVICE(0x0df6, 0x0041) },
|
||||
{ USB_DEVICE(0x0df6, 0x0062) },
|
||||
/* Toshiba */
|
||||
{ USB_DEVICE(0x0930, 0x0a07) },
|
||||
/* Zinwell */
|
||||
|
|
@ -1038,27 +1055,24 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
|||
{ USB_DEVICE(0x13d3, 0x3322) },
|
||||
/* Belkin */
|
||||
{ USB_DEVICE(0x050d, 0x1003) },
|
||||
{ USB_DEVICE(0x050d, 0x825a) },
|
||||
/* Buffalo */
|
||||
{ USB_DEVICE(0x0411, 0x012e) },
|
||||
{ USB_DEVICE(0x0411, 0x0148) },
|
||||
{ USB_DEVICE(0x0411, 0x0150) },
|
||||
{ USB_DEVICE(0x0411, 0x015d) },
|
||||
/* Corega */
|
||||
{ USB_DEVICE(0x07aa, 0x0041) },
|
||||
{ USB_DEVICE(0x07aa, 0x0042) },
|
||||
{ USB_DEVICE(0x18c5, 0x0008) },
|
||||
/* D-Link */
|
||||
{ USB_DEVICE(0x07d1, 0x3c0b) },
|
||||
{ USB_DEVICE(0x07d1, 0x3c13) },
|
||||
{ USB_DEVICE(0x07d1, 0x3c15) },
|
||||
{ USB_DEVICE(0x07d1, 0x3c17) },
|
||||
{ USB_DEVICE(0x2001, 0x3c17) },
|
||||
/* Edimax */
|
||||
{ USB_DEVICE(0x7392, 0x4085) },
|
||||
{ USB_DEVICE(0x7392, 0x7722) },
|
||||
/* Encore */
|
||||
{ USB_DEVICE(0x203d, 0x14a1) },
|
||||
/* Fujitsu Stylistic 550 */
|
||||
{ USB_DEVICE(0x1690, 0x0761) },
|
||||
/* Gemtek */
|
||||
{ USB_DEVICE(0x15a9, 0x0010) },
|
||||
/* Gigabyte */
|
||||
|
|
@ -1070,19 +1084,13 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
|||
/* LevelOne */
|
||||
{ USB_DEVICE(0x1740, 0x0605) },
|
||||
{ USB_DEVICE(0x1740, 0x0615) },
|
||||
/* Linksys */
|
||||
{ USB_DEVICE(0x1737, 0x0078) },
|
||||
/* Logitec */
|
||||
{ USB_DEVICE(0x0789, 0x0168) },
|
||||
{ USB_DEVICE(0x0789, 0x0169) },
|
||||
/* Motorola */
|
||||
{ USB_DEVICE(0x100d, 0x9032) },
|
||||
/* Ovislink */
|
||||
{ USB_DEVICE(0x1b75, 0x3071) },
|
||||
{ USB_DEVICE(0x1b75, 0x3072) },
|
||||
/* Pegatron */
|
||||
{ USB_DEVICE(0x05a6, 0x0101) },
|
||||
{ USB_DEVICE(0x1d4d, 0x0002) },
|
||||
{ USB_DEVICE(0x1d4d, 0x0010) },
|
||||
/* Planex */
|
||||
{ USB_DEVICE(0x2019, 0x5201) },
|
||||
|
|
@ -1096,16 +1104,11 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
|||
{ USB_DEVICE(0x0df6, 0x004a) },
|
||||
{ USB_DEVICE(0x0df6, 0x004d) },
|
||||
{ USB_DEVICE(0x0df6, 0x0053) },
|
||||
{ USB_DEVICE(0x0df6, 0x0060) },
|
||||
{ USB_DEVICE(0x0df6, 0x0062) },
|
||||
/* SMC */
|
||||
{ USB_DEVICE(0x083a, 0xa512) },
|
||||
{ USB_DEVICE(0x083a, 0xc522) },
|
||||
{ USB_DEVICE(0x083a, 0xd522) },
|
||||
{ USB_DEVICE(0x083a, 0xf511) },
|
||||
/* Sweex */
|
||||
{ USB_DEVICE(0x177f, 0x0153) },
|
||||
{ USB_DEVICE(0x177f, 0x0313) },
|
||||
/* Zyxel */
|
||||
{ USB_DEVICE(0x0586, 0x341a) },
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -954,8 +954,13 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
|
|||
memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
|
||||
ring = &rtlpci->tx_ring[BEACON_QUEUE];
|
||||
pskb = __skb_dequeue(&ring->queue);
|
||||
if (pskb)
|
||||
if (pskb) {
|
||||
struct rtl_tx_desc *entry = &ring->desc[ring->idx];
|
||||
pci_unmap_single(rtlpci->pdev, rtlpriv->cfg->ops->get_desc(
|
||||
(u8 *) entry, true, HW_DESC_TXBUFF_ADDR),
|
||||
pskb->len, PCI_DMA_TODEVICE);
|
||||
kfree_skb(pskb);
|
||||
}
|
||||
|
||||
/*NB: the beacon data buffer must be 32-bit aligned. */
|
||||
pskb = ieee80211_beacon_get(hw, mac->vif);
|
||||
|
|
|
|||
|
|
@ -2822,6 +2822,40 @@ static void __devinit fixup_ti816x_class(struct pci_dev* dev)
|
|||
}
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_TI, 0xb800, fixup_ti816x_class);
|
||||
|
||||
/*
|
||||
* Some BIOS implementations leave the Intel GPU interrupts enabled,
|
||||
* even though no one is handling them (f.e. i915 driver is never loaded).
|
||||
* Additionally the interrupt destination is not set up properly
|
||||
* and the interrupt ends up -somewhere-.
|
||||
*
|
||||
* These spurious interrupts are "sticky" and the kernel disables
|
||||
* the (shared) interrupt line after 100.000+ generated interrupts.
|
||||
*
|
||||
* Fix it by disabling the still enabled interrupts.
|
||||
* This resolves crashes often seen on monitor unplug.
|
||||
*/
|
||||
#define I915_DEIER_REG 0x4400c
|
||||
static void __devinit disable_igfx_irq(struct pci_dev *dev)
|
||||
{
|
||||
void __iomem *regs = pci_iomap(dev, 0, 0);
|
||||
if (regs == NULL) {
|
||||
dev_warn(&dev->dev, "igfx quirk: Can't iomap PCI device\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check if any interrupt line is still enabled */
|
||||
if (readl(regs + I915_DEIER_REG) != 0) {
|
||||
dev_warn(&dev->dev, "BIOS left Intel GPU interrupts enabled; "
|
||||
"disabling\n");
|
||||
|
||||
writel(0, regs + I915_DEIER_REG);
|
||||
}
|
||||
|
||||
pci_iounmap(dev, regs);
|
||||
}
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0102, disable_igfx_irq);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);
|
||||
|
||||
static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f,
|
||||
struct pci_fixup *end)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -339,8 +339,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
|
|||
dev_dbg(&adev->dev, "revision = 0x%01x\n", ldata->hw_revision);
|
||||
|
||||
/* Enable the clockwatch on ST Variants */
|
||||
if ((ldata->hw_designer == AMBA_VENDOR_ST) &&
|
||||
(ldata->hw_revision > 1))
|
||||
if (ldata->hw_designer == AMBA_VENDOR_ST)
|
||||
writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN,
|
||||
ldata->base + RTC_CR);
|
||||
|
||||
|
|
|
|||
|
|
@ -318,7 +318,7 @@ struct spi_device *spi_alloc_device(struct spi_master *master)
|
|||
}
|
||||
|
||||
spi->master = master;
|
||||
spi->dev.parent = dev;
|
||||
spi->dev.parent = &master->dev;
|
||||
spi->dev.bus = &spi_bus_type;
|
||||
spi->dev.release = spidev_release;
|
||||
device_initialize(&spi->dev);
|
||||
|
|
|
|||
|
|
@ -520,7 +520,9 @@ static int hmc5843_detect(struct i2c_client *client,
|
|||
/* Called when we have found a new HMC5843. */
|
||||
static void hmc5843_init_client(struct i2c_client *client)
|
||||
{
|
||||
struct hmc5843_data *data = i2c_get_clientdata(client);
|
||||
struct iio_dev *indio_dev = i2c_get_clientdata(client);
|
||||
struct hmc5843_data *data = iio_priv(indio_dev);
|
||||
|
||||
hmc5843_set_meas_conf(client, data->meas_conf);
|
||||
hmc5843_set_rate(client, data->rate);
|
||||
hmc5843_configure(client, data->operating_mode);
|
||||
|
|
|
|||
|
|
@ -1113,8 +1113,10 @@ static int set_serial_info(struct async_struct * info,
|
|||
(new_serial.close_delay != state->close_delay) ||
|
||||
(new_serial.xmit_fifo_size != state->xmit_fifo_size) ||
|
||||
((new_serial.flags & ~ASYNC_USR_MASK) !=
|
||||
(state->flags & ~ASYNC_USR_MASK)))
|
||||
(state->flags & ~ASYNC_USR_MASK))) {
|
||||
tty_unlock();
|
||||
return -EPERM;
|
||||
}
|
||||
state->flags = ((state->flags & ~ASYNC_USR_MASK) |
|
||||
(new_serial.flags & ASYNC_USR_MASK));
|
||||
info->flags = ((info->flags & ~ASYNC_USR_MASK) |
|
||||
|
|
|
|||
|
|
@ -1459,51 +1459,61 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
|
|||
.vendor = PCI_VENDOR_ID_INTEL,
|
||||
.device = 0x8811,
|
||||
.init = pci_eg20t_init,
|
||||
.setup = pci_default_setup,
|
||||
},
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_INTEL,
|
||||
.device = 0x8812,
|
||||
.init = pci_eg20t_init,
|
||||
.setup = pci_default_setup,
|
||||
},
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_INTEL,
|
||||
.device = 0x8813,
|
||||
.init = pci_eg20t_init,
|
||||
.setup = pci_default_setup,
|
||||
},
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_INTEL,
|
||||
.device = 0x8814,
|
||||
.init = pci_eg20t_init,
|
||||
.setup = pci_default_setup,
|
||||
},
|
||||
{
|
||||
.vendor = 0x10DB,
|
||||
.device = 0x8027,
|
||||
.init = pci_eg20t_init,
|
||||
.setup = pci_default_setup,
|
||||
},
|
||||
{
|
||||
.vendor = 0x10DB,
|
||||
.device = 0x8028,
|
||||
.init = pci_eg20t_init,
|
||||
.setup = pci_default_setup,
|
||||
},
|
||||
{
|
||||
.vendor = 0x10DB,
|
||||
.device = 0x8029,
|
||||
.init = pci_eg20t_init,
|
||||
.setup = pci_default_setup,
|
||||
},
|
||||
{
|
||||
.vendor = 0x10DB,
|
||||
.device = 0x800C,
|
||||
.init = pci_eg20t_init,
|
||||
.setup = pci_default_setup,
|
||||
},
|
||||
{
|
||||
.vendor = 0x10DB,
|
||||
.device = 0x800D,
|
||||
.init = pci_eg20t_init,
|
||||
.setup = pci_default_setup,
|
||||
},
|
||||
{
|
||||
.vendor = 0x10DB,
|
||||
.device = 0x800D,
|
||||
.init = pci_eg20t_init,
|
||||
.setup = pci_default_setup,
|
||||
},
|
||||
/*
|
||||
* Cronyx Omega PCI (PLX-chip based)
|
||||
|
|
|
|||
|
|
@ -555,7 +555,7 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
|
|||
res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (res_mem)
|
||||
port->mapbase = res_mem->start;
|
||||
else if (platp->mapbase)
|
||||
else if (platp)
|
||||
port->mapbase = platp->mapbase;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
|
@ -563,7 +563,7 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
|
|||
res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
if (res_irq)
|
||||
port->irq = res_irq->start;
|
||||
else if (platp->irq)
|
||||
else if (platp)
|
||||
port->irq = platp->irq;
|
||||
|
||||
/* Check platform data first so we can override device node data */
|
||||
|
|
|
|||
|
|
@ -1376,6 +1376,10 @@ static int pl011_startup(struct uart_port *port)
|
|||
|
||||
uap->port.uartclk = clk_get_rate(uap->clk);
|
||||
|
||||
/* Clear pending error and receive interrupts */
|
||||
writew(UART011_OEIS | UART011_BEIS | UART011_PEIS | UART011_FEIS |
|
||||
UART011_RTIS | UART011_RXIS, uap->port.membase + UART011_ICR);
|
||||
|
||||
/*
|
||||
* Allocate the IRQ
|
||||
*/
|
||||
|
|
@ -1410,10 +1414,6 @@ static int pl011_startup(struct uart_port *port)
|
|||
cr = UART01x_CR_UARTEN | UART011_CR_RXE | UART011_CR_TXE;
|
||||
writew(cr, uap->port.membase + UART011_CR);
|
||||
|
||||
/* Clear pending error interrupts */
|
||||
writew(UART011_OEIS | UART011_BEIS | UART011_PEIS | UART011_FEIS,
|
||||
uap->port.membase + UART011_ICR);
|
||||
|
||||
/*
|
||||
* initialise the old status of the modem signals
|
||||
*/
|
||||
|
|
@ -1428,6 +1428,9 @@ static int pl011_startup(struct uart_port *port)
|
|||
* as well.
|
||||
*/
|
||||
spin_lock_irq(&uap->port.lock);
|
||||
/* Clear out any spuriously appearing RX interrupts */
|
||||
writew(UART011_RTIS | UART011_RXIS,
|
||||
uap->port.membase + UART011_ICR);
|
||||
uap->im = UART011_RTIM;
|
||||
if (!pl011_dma_rx_running(uap))
|
||||
uap->im |= UART011_RXIM;
|
||||
|
|
@ -1920,6 +1923,10 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
|
|||
uap->port.line = i;
|
||||
pl011_dma_probe(uap);
|
||||
|
||||
/* Ensure interrupts from this UART are masked and cleared */
|
||||
writew(0, uap->port.membase + UART011_IMSC);
|
||||
writew(0xffff, uap->port.membase + UART011_ICR);
|
||||
|
||||
snprintf(uap->type, sizeof(uap->type), "PL011 rev%u", amba_rev(dev));
|
||||
|
||||
amba_ports[i] = uap;
|
||||
|
|
|
|||
|
|
@ -154,10 +154,9 @@ static irqreturn_t clps711xuart_int_tx(int irq, void *dev_id)
|
|||
port->x_char = 0;
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
|
||||
clps711xuart_stop_tx(port);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
if (uart_circ_empty(xmit) || uart_tx_stopped(port))
|
||||
goto disable_tx_irq;
|
||||
|
||||
count = port->fifosize >> 1;
|
||||
do {
|
||||
|
|
@ -171,8 +170,11 @@ static irqreturn_t clps711xuart_int_tx(int irq, void *dev_id)
|
|||
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
|
||||
uart_write_wakeup(port);
|
||||
|
||||
if (uart_circ_empty(xmit))
|
||||
clps711xuart_stop_tx(port);
|
||||
if (uart_circ_empty(xmit)) {
|
||||
disable_tx_irq:
|
||||
disable_irq_nosync(TX_IRQ(port));
|
||||
tx_enabled(port) = 0;
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -602,7 +602,8 @@ static void pch_request_dma(struct uart_port *port)
|
|||
dma_cap_zero(mask);
|
||||
dma_cap_set(DMA_SLAVE, mask);
|
||||
|
||||
dma_dev = pci_get_bus_and_slot(2, PCI_DEVFN(0xa, 0)); /* Get DMA's dev
|
||||
dma_dev = pci_get_bus_and_slot(priv->pdev->bus->number,
|
||||
PCI_DEVFN(0xa, 0)); /* Get DMA's dev
|
||||
information */
|
||||
/* Set Tx DMA */
|
||||
param = &priv->param_tx;
|
||||
|
|
@ -1353,9 +1354,11 @@ static int pch_uart_verify_port(struct uart_port *port,
|
|||
__func__);
|
||||
return -EOPNOTSUPP;
|
||||
#endif
|
||||
priv->use_dma = 1;
|
||||
priv->use_dma_flag = 1;
|
||||
dev_info(priv->port.dev, "PCH UART : Use DMA Mode\n");
|
||||
if (!priv->use_dma)
|
||||
pch_request_dma(port);
|
||||
priv->use_dma = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -1644,7 +1644,6 @@ void usb_disconnect(struct usb_device **pdev)
|
|||
{
|
||||
struct usb_device *udev = *pdev;
|
||||
int i;
|
||||
struct usb_hcd *hcd = bus_to_hcd(udev->bus);
|
||||
|
||||
if (!udev) {
|
||||
pr_debug ("%s nodev\n", __func__);
|
||||
|
|
@ -1672,9 +1671,7 @@ void usb_disconnect(struct usb_device **pdev)
|
|||
* so that the hardware is now fully quiesced.
|
||||
*/
|
||||
dev_dbg (&udev->dev, "unregistering device\n");
|
||||
mutex_lock(hcd->bandwidth_mutex);
|
||||
usb_disable_device(udev, 0);
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
usb_hcd_synchronize_unlinks(udev);
|
||||
|
||||
usb_remove_ep_devs(&udev->ep0);
|
||||
|
|
|
|||
|
|
@ -308,7 +308,8 @@ static void sg_complete(struct urb *urb)
|
|||
retval = usb_unlink_urb(io->urbs [i]);
|
||||
if (retval != -EINPROGRESS &&
|
||||
retval != -ENODEV &&
|
||||
retval != -EBUSY)
|
||||
retval != -EBUSY &&
|
||||
retval != -EIDRM)
|
||||
dev_err(&io->dev->dev,
|
||||
"%s, unlink --> %d\n",
|
||||
__func__, retval);
|
||||
|
|
@ -317,7 +318,6 @@ static void sg_complete(struct urb *urb)
|
|||
}
|
||||
spin_lock(&io->lock);
|
||||
}
|
||||
urb->dev = NULL;
|
||||
|
||||
/* on the last completion, signal usb_sg_wait() */
|
||||
io->bytes += urb->actual_length;
|
||||
|
|
@ -524,7 +524,6 @@ void usb_sg_wait(struct usb_sg_request *io)
|
|||
case -ENXIO: /* hc didn't queue this one */
|
||||
case -EAGAIN:
|
||||
case -ENOMEM:
|
||||
io->urbs[i]->dev = NULL;
|
||||
retval = 0;
|
||||
yield();
|
||||
break;
|
||||
|
|
@ -542,7 +541,6 @@ void usb_sg_wait(struct usb_sg_request *io)
|
|||
|
||||
/* fail any uncompleted urbs */
|
||||
default:
|
||||
io->urbs[i]->dev = NULL;
|
||||
io->urbs[i]->status = retval;
|
||||
dev_dbg(&io->dev->dev, "%s, submit --> %d\n",
|
||||
__func__, retval);
|
||||
|
|
@ -593,7 +591,10 @@ void usb_sg_cancel(struct usb_sg_request *io)
|
|||
if (!io->urbs [i]->dev)
|
||||
continue;
|
||||
retval = usb_unlink_urb(io->urbs [i]);
|
||||
if (retval != -EINPROGRESS && retval != -EBUSY)
|
||||
if (retval != -EINPROGRESS
|
||||
&& retval != -ENODEV
|
||||
&& retval != -EBUSY
|
||||
&& retval != -EIDRM)
|
||||
dev_warn(&io->dev->dev, "%s, unlink --> %d\n",
|
||||
__func__, retval);
|
||||
}
|
||||
|
|
@ -1135,8 +1136,6 @@ void usb_disable_interface(struct usb_device *dev, struct usb_interface *intf,
|
|||
* Deallocates hcd/hardware state for the endpoints (nuking all or most
|
||||
* pending urbs) and usbcore state for the interfaces, so that usbcore
|
||||
* must usb_set_configuration() before any interfaces could be used.
|
||||
*
|
||||
* Must be called with hcd->bandwidth_mutex held.
|
||||
*/
|
||||
void usb_disable_device(struct usb_device *dev, int skip_ep0)
|
||||
{
|
||||
|
|
@ -1189,7 +1188,9 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0)
|
|||
usb_disable_endpoint(dev, i + USB_DIR_IN, false);
|
||||
}
|
||||
/* Remove endpoints from the host controller internal state */
|
||||
mutex_lock(hcd->bandwidth_mutex);
|
||||
usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
/* Second pass: remove endpoint pointers */
|
||||
}
|
||||
for (i = skip_ep0; i < 16; ++i) {
|
||||
|
|
@ -1749,7 +1750,6 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
|
|||
/* if it's already configured, clear out old state first.
|
||||
* getting rid of old interfaces means unbinding their drivers.
|
||||
*/
|
||||
mutex_lock(hcd->bandwidth_mutex);
|
||||
if (dev->state != USB_STATE_ADDRESS)
|
||||
usb_disable_device(dev, 1); /* Skip ep0 */
|
||||
|
||||
|
|
@ -1762,6 +1762,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
|
|||
* host controller will not allow submissions to dropped endpoints. If
|
||||
* this call fails, the device state is unchanged.
|
||||
*/
|
||||
mutex_lock(hcd->bandwidth_mutex);
|
||||
ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL);
|
||||
if (ret < 0) {
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
|
|
|
|||
|
|
@ -544,7 +544,7 @@ config USB_LANGWELL
|
|||
select USB_GADGET_SELECTED
|
||||
|
||||
config USB_GADGET_EG20T
|
||||
boolean "Intel EG20T PCH/OKI SEMICONDUCTOR ML7213 IOH UDC"
|
||||
tristate "Intel EG20T PCH/OKI SEMICONDUCTOR IOH(ML7213/ML7831) UDC"
|
||||
depends on PCI
|
||||
select USB_GADGET_DUALSPEED
|
||||
help
|
||||
|
|
@ -562,8 +562,9 @@ config USB_GADGET_EG20T
|
|||
|
||||
This driver also can be used for OKI SEMICONDUCTOR's ML7213 which is
|
||||
for IVI(In-Vehicle Infotainment) use.
|
||||
ML7213 is companion chip for Intel Atom E6xx series.
|
||||
ML7213 is completely compatible for Intel EG20T PCH.
|
||||
ML7831 is for general purpose use.
|
||||
ML7213/ML7831 is companion chip for Intel Atom E6xx series.
|
||||
ML7213/ML7831 is completely compatible for Intel EG20T PCH.
|
||||
|
||||
config USB_EG20T
|
||||
tristate
|
||||
|
|
|
|||
|
|
@ -720,7 +720,7 @@ static long ffs_ep0_ioctl(struct file *file, unsigned code, unsigned long value)
|
|||
if (code == FUNCTIONFS_INTERFACE_REVMAP) {
|
||||
struct ffs_function *func = ffs->func;
|
||||
ret = func ? ffs_func_revmap_intf(func, value) : -ENODEV;
|
||||
} else if (gadget->ops->ioctl) {
|
||||
} else if (gadget && gadget->ops->ioctl) {
|
||||
ret = gadget->ops->ioctl(gadget, code, value);
|
||||
} else {
|
||||
ret = -ENOTTY;
|
||||
|
|
|
|||
|
|
@ -320,6 +320,7 @@ struct pch_udc_ep {
|
|||
* @registered: driver regsitered with system
|
||||
* @suspended: driver in suspended state
|
||||
* @connected: gadget driver associated
|
||||
* @vbus_session: required vbus_session state
|
||||
* @set_cfg_not_acked: pending acknowledgement 4 setup
|
||||
* @waiting_zlp_ack: pending acknowledgement 4 ZLP
|
||||
* @data_requests: DMA pool for data requests
|
||||
|
|
@ -346,6 +347,7 @@ struct pch_udc_dev {
|
|||
registered:1,
|
||||
suspended:1,
|
||||
connected:1,
|
||||
vbus_session:1,
|
||||
set_cfg_not_acked:1,
|
||||
waiting_zlp_ack:1;
|
||||
struct pci_pool *data_requests;
|
||||
|
|
@ -363,6 +365,7 @@ struct pch_udc_dev {
|
|||
#define PCI_DEVICE_ID_INTEL_EG20T_UDC 0x8808
|
||||
#define PCI_VENDOR_ID_ROHM 0x10DB
|
||||
#define PCI_DEVICE_ID_ML7213_IOH_UDC 0x801D
|
||||
#define PCI_DEVICE_ID_ML7831_IOH_UDC 0x8808
|
||||
|
||||
static const char ep0_string[] = "ep0in";
|
||||
static DEFINE_SPINLOCK(udc_stall_spinlock); /* stall spin lock */
|
||||
|
|
@ -561,6 +564,29 @@ static void pch_udc_clear_disconnect(struct pch_udc_dev *dev)
|
|||
pch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);
|
||||
}
|
||||
|
||||
/**
|
||||
* pch_udc_reconnect() - This API initializes usb device controller,
|
||||
* and clear the disconnect status.
|
||||
* @dev: Reference to pch_udc_regs structure
|
||||
*/
|
||||
static void pch_udc_init(struct pch_udc_dev *dev);
|
||||
static void pch_udc_reconnect(struct pch_udc_dev *dev)
|
||||
{
|
||||
pch_udc_init(dev);
|
||||
|
||||
/* enable device interrupts */
|
||||
/* pch_udc_enable_interrupts() */
|
||||
pch_udc_bit_clr(dev, UDC_DEVIRQMSK_ADDR,
|
||||
UDC_DEVINT_UR | UDC_DEVINT_ENUM);
|
||||
|
||||
/* Clear the disconnect */
|
||||
pch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);
|
||||
pch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_SD);
|
||||
mdelay(1);
|
||||
/* Resume USB signalling */
|
||||
pch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);
|
||||
}
|
||||
|
||||
/**
|
||||
* pch_udc_vbus_session() - set or clearr the disconnect status.
|
||||
* @dev: Reference to pch_udc_regs structure
|
||||
|
|
@ -571,10 +597,18 @@ static void pch_udc_clear_disconnect(struct pch_udc_dev *dev)
|
|||
static inline void pch_udc_vbus_session(struct pch_udc_dev *dev,
|
||||
int is_active)
|
||||
{
|
||||
if (is_active)
|
||||
pch_udc_clear_disconnect(dev);
|
||||
else
|
||||
if (is_active) {
|
||||
pch_udc_reconnect(dev);
|
||||
dev->vbus_session = 1;
|
||||
} else {
|
||||
if (dev->driver && dev->driver->disconnect) {
|
||||
spin_unlock(&dev->lock);
|
||||
dev->driver->disconnect(&dev->gadget);
|
||||
spin_lock(&dev->lock);
|
||||
}
|
||||
pch_udc_set_disconnect(dev);
|
||||
dev->vbus_session = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1134,7 +1168,17 @@ static int pch_udc_pcd_pullup(struct usb_gadget *gadget, int is_on)
|
|||
if (!gadget)
|
||||
return -EINVAL;
|
||||
dev = container_of(gadget, struct pch_udc_dev, gadget);
|
||||
pch_udc_vbus_session(dev, is_on);
|
||||
if (is_on) {
|
||||
pch_udc_reconnect(dev);
|
||||
} else {
|
||||
if (dev->driver && dev->driver->disconnect) {
|
||||
spin_unlock(&dev->lock);
|
||||
dev->driver->disconnect(&dev->gadget);
|
||||
spin_lock(&dev->lock);
|
||||
}
|
||||
pch_udc_set_disconnect(dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -2338,8 +2382,11 @@ static void pch_udc_svc_ur_interrupt(struct pch_udc_dev *dev)
|
|||
/* Complete request queue */
|
||||
empty_req_queue(ep);
|
||||
}
|
||||
if (dev->driver && dev->driver->disconnect)
|
||||
if (dev->driver && dev->driver->disconnect) {
|
||||
spin_unlock(&dev->lock);
|
||||
dev->driver->disconnect(&dev->gadget);
|
||||
spin_lock(&dev->lock);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -2374,6 +2421,11 @@ static void pch_udc_svc_enum_interrupt(struct pch_udc_dev *dev)
|
|||
pch_udc_set_dma(dev, DMA_DIR_TX);
|
||||
pch_udc_set_dma(dev, DMA_DIR_RX);
|
||||
pch_udc_ep_set_rrdy(&(dev->ep[UDC_EP0OUT_IDX]));
|
||||
|
||||
/* enable device interrupts */
|
||||
pch_udc_enable_interrupts(dev, UDC_DEVINT_UR | UDC_DEVINT_US |
|
||||
UDC_DEVINT_ES | UDC_DEVINT_ENUM |
|
||||
UDC_DEVINT_SI | UDC_DEVINT_SC);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -2475,8 +2527,24 @@ static void pch_udc_dev_isr(struct pch_udc_dev *dev, u32 dev_intr)
|
|||
if (dev_intr & UDC_DEVINT_SC)
|
||||
pch_udc_svc_cfg_interrupt(dev);
|
||||
/* USB Suspend interrupt */
|
||||
if (dev_intr & UDC_DEVINT_US)
|
||||
if (dev_intr & UDC_DEVINT_US) {
|
||||
if (dev->driver
|
||||
&& dev->driver->suspend) {
|
||||
spin_unlock(&dev->lock);
|
||||
dev->driver->suspend(&dev->gadget);
|
||||
spin_lock(&dev->lock);
|
||||
}
|
||||
|
||||
if (dev->vbus_session == 0) {
|
||||
if (dev->driver && dev->driver->disconnect) {
|
||||
spin_unlock(&dev->lock);
|
||||
dev->driver->disconnect(&dev->gadget);
|
||||
spin_lock(&dev->lock);
|
||||
}
|
||||
pch_udc_reconnect(dev);
|
||||
}
|
||||
dev_dbg(&dev->pdev->dev, "USB_SUSPEND\n");
|
||||
}
|
||||
/* Clear the SOF interrupt, if enabled */
|
||||
if (dev_intr & UDC_DEVINT_SOF)
|
||||
dev_dbg(&dev->pdev->dev, "SOF\n");
|
||||
|
|
@ -2502,6 +2570,14 @@ static irqreturn_t pch_udc_isr(int irq, void *pdev)
|
|||
dev_intr = pch_udc_read_device_interrupts(dev);
|
||||
ep_intr = pch_udc_read_ep_interrupts(dev);
|
||||
|
||||
/* For a hot plug, this find that the controller is hung up. */
|
||||
if (dev_intr == ep_intr)
|
||||
if (dev_intr == pch_udc_readl(dev, UDC_DEVCFG_ADDR)) {
|
||||
dev_dbg(&dev->pdev->dev, "UDC: Hung up\n");
|
||||
/* The controller is reset */
|
||||
pch_udc_writel(dev, UDC_SRST, UDC_SRST_ADDR);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
if (dev_intr)
|
||||
/* Clear device interrupts */
|
||||
pch_udc_write_device_interrupts(dev, dev_intr);
|
||||
|
|
@ -2915,8 +2991,10 @@ static int pch_udc_probe(struct pci_dev *pdev,
|
|||
}
|
||||
pch_udc = dev;
|
||||
/* initialize the hardware */
|
||||
if (pch_udc_pcd_init(dev))
|
||||
if (pch_udc_pcd_init(dev)) {
|
||||
retval = -ENODEV;
|
||||
goto finished;
|
||||
}
|
||||
if (request_irq(pdev->irq, pch_udc_isr, IRQF_SHARED, KBUILD_MODNAME,
|
||||
dev)) {
|
||||
dev_err(&pdev->dev, "%s: request_irq(%d) fail\n", __func__,
|
||||
|
|
@ -2971,6 +3049,11 @@ static DEFINE_PCI_DEVICE_TABLE(pch_udc_pcidev_id) = {
|
|||
.class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe,
|
||||
.class_mask = 0xffffffff,
|
||||
},
|
||||
{
|
||||
PCI_DEVICE(PCI_VENDOR_ID_ROHM, PCI_DEVICE_ID_ML7831_IOH_UDC),
|
||||
.class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe,
|
||||
.class_mask = 0xffffffff,
|
||||
},
|
||||
{ 0 },
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -808,8 +808,13 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
|
|||
goto dead;
|
||||
}
|
||||
|
||||
/*
|
||||
* We don't use STS_FLR, but some controllers don't like it to
|
||||
* remain on, so mask it out along with the other status bits.
|
||||
*/
|
||||
masked_status = status & (INTR_MASK | STS_FLR);
|
||||
|
||||
/* Shared IRQ? */
|
||||
masked_status = status & INTR_MASK;
|
||||
if (!masked_status || unlikely(hcd->state == HC_STATE_HALT)) {
|
||||
spin_unlock(&ehci->lock);
|
||||
return IRQ_NONE;
|
||||
|
|
|
|||
|
|
@ -824,9 +824,13 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev)
|
|||
}
|
||||
}
|
||||
|
||||
/* Disable any BIOS SMIs */
|
||||
writel(XHCI_LEGACY_DISABLE_SMI,
|
||||
base + ext_cap_offset + XHCI_LEGACY_CONTROL_OFFSET);
|
||||
val = readl(base + ext_cap_offset + XHCI_LEGACY_CONTROL_OFFSET);
|
||||
/* Mask off (turn off) any enabled SMIs */
|
||||
val &= XHCI_LEGACY_DISABLE_SMI;
|
||||
/* Mask all SMI events bits, RW1C */
|
||||
val |= XHCI_LEGACY_SMI_EVENTS;
|
||||
/* Disable any BIOS SMIs and clear all SMI events*/
|
||||
writel(val, base + ext_cap_offset + XHCI_LEGACY_CONTROL_OFFSET);
|
||||
|
||||
if (usb_is_intel_switchable_xhci(pdev))
|
||||
usb_enable_xhci_ports(pdev);
|
||||
|
|
|
|||
|
|
@ -62,8 +62,9 @@
|
|||
/* USB Legacy Support Control and Status Register - section 7.1.2 */
|
||||
/* Add this offset, plus the value of xECP in HCCPARAMS to the base address */
|
||||
#define XHCI_LEGACY_CONTROL_OFFSET (0x04)
|
||||
/* bits 1:2, 5:12, and 17:19 need to be preserved; bits 21:28 should be zero */
|
||||
#define XHCI_LEGACY_DISABLE_SMI ((0x3 << 1) + (0xff << 5) + (0x7 << 17))
|
||||
/* bits 1:3, 5:12, and 17:19 need to be preserved; bits 21:28 should be zero */
|
||||
#define XHCI_LEGACY_DISABLE_SMI ((0x7 << 1) + (0xff << 5) + (0x7 << 17))
|
||||
#define XHCI_LEGACY_SMI_EVENTS (0x7 << 29)
|
||||
|
||||
/* command register values to disable interrupts and halt the HC */
|
||||
/* start/stop HC execution - do not write unless HC is halted*/
|
||||
|
|
|
|||
|
|
@ -1509,11 +1509,6 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
|
|||
int i;
|
||||
|
||||
/* Free the Event Ring Segment Table and the actual Event Ring */
|
||||
if (xhci->ir_set) {
|
||||
xhci_writel(xhci, 0, &xhci->ir_set->erst_size);
|
||||
xhci_write_64(xhci, 0, &xhci->ir_set->erst_base);
|
||||
xhci_write_64(xhci, 0, &xhci->ir_set->erst_dequeue);
|
||||
}
|
||||
size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries);
|
||||
if (xhci->erst.entries)
|
||||
pci_free_consistent(pdev, size,
|
||||
|
|
@ -1525,7 +1520,6 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
|
|||
xhci->event_ring = NULL;
|
||||
xhci_dbg(xhci, "Freed event ring\n");
|
||||
|
||||
xhci_write_64(xhci, 0, &xhci->op_regs->cmd_ring);
|
||||
if (xhci->cmd_ring)
|
||||
xhci_ring_free(xhci, xhci->cmd_ring);
|
||||
xhci->cmd_ring = NULL;
|
||||
|
|
@ -1554,7 +1548,6 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
|
|||
xhci->medium_streams_pool = NULL;
|
||||
xhci_dbg(xhci, "Freed medium stream array pool\n");
|
||||
|
||||
xhci_write_64(xhci, 0, &xhci->op_regs->dcbaa_ptr);
|
||||
if (xhci->dcbaa)
|
||||
pci_free_consistent(pdev, sizeof(*xhci->dcbaa),
|
||||
xhci->dcbaa, xhci->dcbaa->dma);
|
||||
|
|
@ -2123,6 +2116,8 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
|||
|
||||
fail:
|
||||
xhci_warn(xhci, "Couldn't initialize memory\n");
|
||||
xhci_halt(xhci);
|
||||
xhci_reset(xhci);
|
||||
xhci_mem_cleanup(xhci);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -145,6 +145,8 @@ static int xhci_pci_setup(struct usb_hcd *hcd)
|
|||
xhci->quirks |= XHCI_RESET_ON_RESUME;
|
||||
xhci_dbg(xhci, "QUIRK: Resetting on resume\n");
|
||||
}
|
||||
if (pdev->vendor == PCI_VENDOR_ID_VIA)
|
||||
xhci->quirks |= XHCI_RESET_ON_RESUME;
|
||||
|
||||
/* Make sure the HC is halted. */
|
||||
retval = xhci_halt(xhci);
|
||||
|
|
|
|||
|
|
@ -2352,7 +2352,7 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd)
|
|||
u32 irq_pending;
|
||||
/* Acknowledge the PCI interrupt */
|
||||
irq_pending = xhci_readl(xhci, &xhci->ir_set->irq_pending);
|
||||
irq_pending |= 0x3;
|
||||
irq_pending |= IMAN_IP;
|
||||
xhci_writel(xhci, irq_pending, &xhci->ir_set->irq_pending);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -610,11 +610,11 @@ static void xhci_save_registers(struct xhci_hcd *xhci)
|
|||
xhci->s3.dev_nt = xhci_readl(xhci, &xhci->op_regs->dev_notification);
|
||||
xhci->s3.dcbaa_ptr = xhci_read_64(xhci, &xhci->op_regs->dcbaa_ptr);
|
||||
xhci->s3.config_reg = xhci_readl(xhci, &xhci->op_regs->config_reg);
|
||||
xhci->s3.irq_pending = xhci_readl(xhci, &xhci->ir_set->irq_pending);
|
||||
xhci->s3.irq_control = xhci_readl(xhci, &xhci->ir_set->irq_control);
|
||||
xhci->s3.erst_size = xhci_readl(xhci, &xhci->ir_set->erst_size);
|
||||
xhci->s3.erst_base = xhci_read_64(xhci, &xhci->ir_set->erst_base);
|
||||
xhci->s3.erst_dequeue = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue);
|
||||
xhci->s3.irq_pending = xhci_readl(xhci, &xhci->ir_set->irq_pending);
|
||||
xhci->s3.irq_control = xhci_readl(xhci, &xhci->ir_set->irq_control);
|
||||
}
|
||||
|
||||
static void xhci_restore_registers(struct xhci_hcd *xhci)
|
||||
|
|
@ -623,10 +623,11 @@ static void xhci_restore_registers(struct xhci_hcd *xhci)
|
|||
xhci_writel(xhci, xhci->s3.dev_nt, &xhci->op_regs->dev_notification);
|
||||
xhci_write_64(xhci, xhci->s3.dcbaa_ptr, &xhci->op_regs->dcbaa_ptr);
|
||||
xhci_writel(xhci, xhci->s3.config_reg, &xhci->op_regs->config_reg);
|
||||
xhci_writel(xhci, xhci->s3.irq_pending, &xhci->ir_set->irq_pending);
|
||||
xhci_writel(xhci, xhci->s3.irq_control, &xhci->ir_set->irq_control);
|
||||
xhci_writel(xhci, xhci->s3.erst_size, &xhci->ir_set->erst_size);
|
||||
xhci_write_64(xhci, xhci->s3.erst_base, &xhci->ir_set->erst_base);
|
||||
xhci_write_64(xhci, xhci->s3.erst_dequeue, &xhci->ir_set->erst_dequeue);
|
||||
xhci_writel(xhci, xhci->s3.irq_pending, &xhci->ir_set->irq_pending);
|
||||
xhci_writel(xhci, xhci->s3.irq_control, &xhci->ir_set->irq_control);
|
||||
}
|
||||
|
||||
static void xhci_set_cmd_ring_deq(struct xhci_hcd *xhci)
|
||||
|
|
|
|||
|
|
@ -205,6 +205,10 @@ struct xhci_op_regs {
|
|||
#define CMD_PM_INDEX (1 << 11)
|
||||
/* bits 12:31 are reserved (and should be preserved on writes). */
|
||||
|
||||
/* IMAN - Interrupt Management Register */
|
||||
#define IMAN_IP (1 << 1)
|
||||
#define IMAN_IE (1 << 0)
|
||||
|
||||
/* USBSTS - USB status - status bitmasks */
|
||||
/* HC not running - set to 1 when run/stop bit is cleared. */
|
||||
#define STS_HALT XHCI_STS_HALT
|
||||
|
|
|
|||
|
|
@ -99,9 +99,7 @@ static void yurex_delete(struct kref *kref)
|
|||
usb_put_dev(dev->udev);
|
||||
if (dev->cntl_urb) {
|
||||
usb_kill_urb(dev->cntl_urb);
|
||||
if (dev->cntl_req)
|
||||
usb_free_coherent(dev->udev, YUREX_BUF_SIZE,
|
||||
dev->cntl_req, dev->cntl_urb->setup_dma);
|
||||
kfree(dev->cntl_req);
|
||||
if (dev->cntl_buffer)
|
||||
usb_free_coherent(dev->udev, YUREX_BUF_SIZE,
|
||||
dev->cntl_buffer, dev->cntl_urb->transfer_dma);
|
||||
|
|
@ -234,9 +232,7 @@ static int yurex_probe(struct usb_interface *interface, const struct usb_device_
|
|||
}
|
||||
|
||||
/* allocate buffer for control req */
|
||||
dev->cntl_req = usb_alloc_coherent(dev->udev, YUREX_BUF_SIZE,
|
||||
GFP_KERNEL,
|
||||
&dev->cntl_urb->setup_dma);
|
||||
dev->cntl_req = kmalloc(YUREX_BUF_SIZE, GFP_KERNEL);
|
||||
if (!dev->cntl_req) {
|
||||
err("Could not allocate cntl_req");
|
||||
goto error;
|
||||
|
|
@ -286,7 +282,7 @@ static int yurex_probe(struct usb_interface *interface, const struct usb_device_
|
|||
usb_rcvintpipe(dev->udev, dev->int_in_endpointAddr),
|
||||
dev->int_buffer, YUREX_BUF_SIZE, yurex_interrupt,
|
||||
dev, 1);
|
||||
dev->cntl_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
dev->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
if (usb_submit_urb(dev->urb, GFP_KERNEL)) {
|
||||
retval = -EIO;
|
||||
err("Could not submitting URB");
|
||||
|
|
|
|||
|
|
@ -295,7 +295,8 @@ static int musb_otg_notifications(struct notifier_block *nb,
|
|||
|
||||
static int omap2430_musb_init(struct musb *musb)
|
||||
{
|
||||
u32 l, status = 0;
|
||||
u32 l;
|
||||
int status = 0;
|
||||
struct device *dev = musb->controller;
|
||||
struct musb_hdrc_platform_data *plat = dev->platform_data;
|
||||
struct omap_musb_board_data *data = plat->board_data;
|
||||
|
|
@ -312,7 +313,7 @@ static int omap2430_musb_init(struct musb *musb)
|
|||
|
||||
status = pm_runtime_get_sync(dev);
|
||||
if (status < 0) {
|
||||
dev_err(dev, "pm_runtime_get_sync FAILED");
|
||||
dev_err(dev, "pm_runtime_get_sync FAILED %d\n", status);
|
||||
goto err1;
|
||||
}
|
||||
|
||||
|
|
@ -464,14 +465,14 @@ static int __init omap2430_probe(struct platform_device *pdev)
|
|||
goto err2;
|
||||
}
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
||||
ret = platform_device_add(musb);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register musb device\n");
|
||||
goto err2;
|
||||
}
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
|
||||
err2:
|
||||
|
|
|
|||
|
|
@ -285,7 +285,8 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request,
|
|||
/* Issue the request, attempting to read 'size' bytes */
|
||||
result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
|
||||
request, REQTYPE_DEVICE_TO_HOST, 0x0000,
|
||||
port_priv->bInterfaceNumber, buf, size, 300);
|
||||
port_priv->bInterfaceNumber, buf, size,
|
||||
USB_CTRL_GET_TIMEOUT);
|
||||
|
||||
/* Convert data into an array of integers */
|
||||
for (i = 0; i < length; i++)
|
||||
|
|
@ -335,12 +336,14 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request,
|
|||
result = usb_control_msg(serial->dev,
|
||||
usb_sndctrlpipe(serial->dev, 0),
|
||||
request, REQTYPE_HOST_TO_DEVICE, 0x0000,
|
||||
port_priv->bInterfaceNumber, buf, size, 300);
|
||||
port_priv->bInterfaceNumber, buf, size,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
} else {
|
||||
result = usb_control_msg(serial->dev,
|
||||
usb_sndctrlpipe(serial->dev, 0),
|
||||
request, REQTYPE_HOST_TO_DEVICE, data[0],
|
||||
port_priv->bInterfaceNumber, NULL, 0, 300);
|
||||
port_priv->bInterfaceNumber, NULL, 0,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
}
|
||||
|
||||
kfree(buf);
|
||||
|
|
|
|||
|
|
@ -708,6 +708,7 @@ static const struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) },
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED) },
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED) },
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED) },
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED3) },
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED4) },
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED5) },
|
||||
|
|
|
|||
|
|
@ -424,7 +424,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
|
|||
control = priv->line_control;
|
||||
if ((cflag & CBAUD) == B0)
|
||||
priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
|
||||
else
|
||||
else if ((old_termios->c_cflag & CBAUD) == B0)
|
||||
priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
|
||||
if (control != priv->line_control) {
|
||||
control = priv->line_control;
|
||||
|
|
|
|||
|
|
@ -221,7 +221,7 @@ static const struct sierra_iface_info typeB_interface_list = {
|
|||
};
|
||||
|
||||
/* 'blacklist' of interfaces not served by this driver */
|
||||
static const u8 direct_ip_non_serial_ifaces[] = { 7, 8, 9, 10, 11 };
|
||||
static const u8 direct_ip_non_serial_ifaces[] = { 7, 8, 9, 10, 11, 19, 20 };
|
||||
static const struct sierra_iface_info direct_ip_interface_blacklist = {
|
||||
.infolen = ARRAY_SIZE(direct_ip_non_serial_ifaces),
|
||||
.ifaceinfo = direct_ip_non_serial_ifaces,
|
||||
|
|
@ -298,6 +298,9 @@ static const struct usb_device_id id_table[] = {
|
|||
/* Sierra Wireless HSPA Non-Composite Device */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x6892, 0xFF, 0xFF, 0xFF)},
|
||||
{ USB_DEVICE(0x1199, 0x6893) }, /* Sierra Wireless Device */
|
||||
{ USB_DEVICE(0x1199, 0x68A2), /* Sierra Wireless MC77xx in QMI mode */
|
||||
.driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
|
||||
},
|
||||
{ USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless Direct IP modems */
|
||||
.driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1059,6 +1059,12 @@ int usb_serial_probe(struct usb_interface *interface,
|
|||
serial->attached = 1;
|
||||
}
|
||||
|
||||
/* Avoid race with tty_open and serial_install by setting the
|
||||
* disconnected flag and not clearing it until all ports have been
|
||||
* registered.
|
||||
*/
|
||||
serial->disconnected = 1;
|
||||
|
||||
if (get_free_serial(serial, num_ports, &minor) == NULL) {
|
||||
dev_err(&interface->dev, "No more free serial devices\n");
|
||||
goto probe_error;
|
||||
|
|
@ -1083,6 +1089,8 @@ int usb_serial_probe(struct usb_interface *interface,
|
|||
}
|
||||
}
|
||||
|
||||
serial->disconnected = 0;
|
||||
|
||||
usb_serial_console_init(debug, minor);
|
||||
|
||||
exit:
|
||||
|
|
|
|||
|
|
@ -645,7 +645,8 @@ void hwarc_neep_cb(struct urb *urb)
|
|||
dev_err(dev, "NEEP: URB error %d\n", urb->status);
|
||||
}
|
||||
result = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (result < 0) {
|
||||
if (result < 0 && result != -ENODEV && result != -EPERM) {
|
||||
/* ignoring unrecoverable errors */
|
||||
dev_err(dev, "NEEP: Can't resubmit URB (%d) resetting device\n",
|
||||
result);
|
||||
goto error;
|
||||
|
|
|
|||
|
|
@ -106,6 +106,7 @@ struct uwb_rc_neh {
|
|||
u8 evt_type;
|
||||
__le16 evt;
|
||||
u8 context;
|
||||
u8 completed;
|
||||
uwb_rc_cmd_cb_f cb;
|
||||
void *arg;
|
||||
|
||||
|
|
@ -408,6 +409,7 @@ static void uwb_rc_neh_grok_event(struct uwb_rc *rc, struct uwb_rceb *rceb, size
|
|||
struct device *dev = &rc->uwb_dev.dev;
|
||||
struct uwb_rc_neh *neh;
|
||||
struct uwb_rceb *notif;
|
||||
unsigned long flags;
|
||||
|
||||
if (rceb->bEventContext == 0) {
|
||||
notif = kmalloc(size, GFP_ATOMIC);
|
||||
|
|
@ -421,7 +423,11 @@ static void uwb_rc_neh_grok_event(struct uwb_rc *rc, struct uwb_rceb *rceb, size
|
|||
} else {
|
||||
neh = uwb_rc_neh_lookup(rc, rceb);
|
||||
if (neh) {
|
||||
del_timer_sync(&neh->timer);
|
||||
spin_lock_irqsave(&rc->neh_lock, flags);
|
||||
/* to guard against a timeout */
|
||||
neh->completed = 1;
|
||||
del_timer(&neh->timer);
|
||||
spin_unlock_irqrestore(&rc->neh_lock, flags);
|
||||
uwb_rc_neh_cb(neh, rceb, size);
|
||||
} else
|
||||
dev_warn(dev, "event 0x%02x/%04x/%02x (%zu bytes): nobody cared\n",
|
||||
|
|
@ -567,6 +573,10 @@ static void uwb_rc_neh_timer(unsigned long arg)
|
|||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&rc->neh_lock, flags);
|
||||
if (neh->completed) {
|
||||
spin_unlock_irqrestore(&rc->neh_lock, flags);
|
||||
return;
|
||||
}
|
||||
if (neh->context)
|
||||
__uwb_rc_neh_rm(rc, neh);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -815,8 +815,15 @@ static int __devinit uvesafb_vbe_init(struct fb_info *info)
|
|||
par->pmi_setpal = pmi_setpal;
|
||||
par->ypan = ypan;
|
||||
|
||||
if (par->pmi_setpal || par->ypan)
|
||||
uvesafb_vbe_getpmi(task, par);
|
||||
if (par->pmi_setpal || par->ypan) {
|
||||
if (__supported_pte_mask & _PAGE_NX) {
|
||||
par->pmi_setpal = par->ypan = 0;
|
||||
printk(KERN_WARNING "uvesafb: NX protection is actively."
|
||||
"We have better not to use the PMI.\n");
|
||||
} else {
|
||||
uvesafb_vbe_getpmi(task, par);
|
||||
}
|
||||
}
|
||||
#else
|
||||
/* The protected mode interface is not available on non-x86. */
|
||||
par->pmi_setpal = par->ypan = 0;
|
||||
|
|
|
|||
|
|
@ -664,7 +664,7 @@ static int gntdev_mmap(struct file *flip, struct vm_area_struct *vma)
|
|||
vma->vm_flags |= VM_RESERVED|VM_DONTEXPAND;
|
||||
|
||||
if (use_ptemod)
|
||||
vma->vm_flags |= VM_DONTCOPY|VM_PFNMAP;
|
||||
vma->vm_flags |= VM_DONTCOPY;
|
||||
|
||||
vma->vm_private_data = map;
|
||||
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ static int read_backend_details(struct xenbus_device *xendev)
|
|||
return xenbus_read_otherend_details(xendev, "backend-id", "backend");
|
||||
}
|
||||
|
||||
static int is_device_connecting(struct device *dev, void *data)
|
||||
static int is_device_connecting(struct device *dev, void *data, bool ignore_nonessential)
|
||||
{
|
||||
struct xenbus_device *xendev = to_xenbus_device(dev);
|
||||
struct device_driver *drv = data;
|
||||
|
|
@ -149,16 +149,41 @@ static int is_device_connecting(struct device *dev, void *data)
|
|||
if (drv && (dev->driver != drv))
|
||||
return 0;
|
||||
|
||||
if (ignore_nonessential) {
|
||||
/* With older QEMU, for PVonHVM guests the guest config files
|
||||
* could contain: vfb = [ 'vnc=1, vnclisten=0.0.0.0']
|
||||
* which is nonsensical as there is no PV FB (there can be
|
||||
* a PVKB) running as HVM guest. */
|
||||
|
||||
if ((strncmp(xendev->nodename, "device/vkbd", 11) == 0))
|
||||
return 0;
|
||||
|
||||
if ((strncmp(xendev->nodename, "device/vfb", 10) == 0))
|
||||
return 0;
|
||||
}
|
||||
xendrv = to_xenbus_driver(dev->driver);
|
||||
return (xendev->state < XenbusStateConnected ||
|
||||
(xendev->state == XenbusStateConnected &&
|
||||
xendrv->is_ready && !xendrv->is_ready(xendev)));
|
||||
}
|
||||
static int essential_device_connecting(struct device *dev, void *data)
|
||||
{
|
||||
return is_device_connecting(dev, data, true /* ignore PV[KBB+FB] */);
|
||||
}
|
||||
static int non_essential_device_connecting(struct device *dev, void *data)
|
||||
{
|
||||
return is_device_connecting(dev, data, false);
|
||||
}
|
||||
|
||||
static int exists_connecting_device(struct device_driver *drv)
|
||||
static int exists_essential_connecting_device(struct device_driver *drv)
|
||||
{
|
||||
return bus_for_each_dev(&xenbus_frontend.bus, NULL, drv,
|
||||
is_device_connecting);
|
||||
essential_device_connecting);
|
||||
}
|
||||
static int exists_non_essential_connecting_device(struct device_driver *drv)
|
||||
{
|
||||
return bus_for_each_dev(&xenbus_frontend.bus, NULL, drv,
|
||||
non_essential_device_connecting);
|
||||
}
|
||||
|
||||
static int print_device_status(struct device *dev, void *data)
|
||||
|
|
@ -189,6 +214,23 @@ static int print_device_status(struct device *dev, void *data)
|
|||
/* We only wait for device setup after most initcalls have run. */
|
||||
static int ready_to_wait_for_devices;
|
||||
|
||||
static bool wait_loop(unsigned long start, unsigned int max_delay,
|
||||
unsigned int *seconds_waited)
|
||||
{
|
||||
if (time_after(jiffies, start + (*seconds_waited+5)*HZ)) {
|
||||
if (!*seconds_waited)
|
||||
printk(KERN_WARNING "XENBUS: Waiting for "
|
||||
"devices to initialise: ");
|
||||
*seconds_waited += 5;
|
||||
printk("%us...", max_delay - *seconds_waited);
|
||||
if (*seconds_waited == max_delay)
|
||||
return true;
|
||||
}
|
||||
|
||||
schedule_timeout_interruptible(HZ/10);
|
||||
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
* On a 5-minute timeout, wait for all devices currently configured. We need
|
||||
* to do this to guarantee that the filesystems and / or network devices
|
||||
|
|
@ -212,19 +254,14 @@ static void wait_for_devices(struct xenbus_driver *xendrv)
|
|||
if (!ready_to_wait_for_devices || !xen_domain())
|
||||
return;
|
||||
|
||||
while (exists_connecting_device(drv)) {
|
||||
if (time_after(jiffies, start + (seconds_waited+5)*HZ)) {
|
||||
if (!seconds_waited)
|
||||
printk(KERN_WARNING "XENBUS: Waiting for "
|
||||
"devices to initialise: ");
|
||||
seconds_waited += 5;
|
||||
printk("%us...", 300 - seconds_waited);
|
||||
if (seconds_waited == 300)
|
||||
break;
|
||||
}
|
||||
while (exists_non_essential_connecting_device(drv))
|
||||
if (wait_loop(start, 30, &seconds_waited))
|
||||
break;
|
||||
|
||||
schedule_timeout_interruptible(HZ/10);
|
||||
}
|
||||
/* Skips PVKB and PVFB check.*/
|
||||
while (exists_essential_connecting_device(drv))
|
||||
if (wait_loop(start, 270, &seconds_waited))
|
||||
break;
|
||||
|
||||
if (seconds_waited)
|
||||
printk("\n");
|
||||
|
|
|
|||
|
|
@ -1972,7 +1972,7 @@ BTRFS_SETGET_STACK_FUNCS(root_last_snapshot, struct btrfs_root_item,
|
|||
|
||||
static inline bool btrfs_root_readonly(struct btrfs_root *root)
|
||||
{
|
||||
return root->root_item.flags & BTRFS_ROOT_SUBVOL_RDONLY;
|
||||
return (root->root_item.flags & cpu_to_le64(BTRFS_ROOT_SUBVOL_RDONLY)) != 0;
|
||||
}
|
||||
|
||||
/* struct btrfs_super_block */
|
||||
|
|
|
|||
|
|
@ -988,6 +988,10 @@ static int path_count[PATH_ARR_SIZE];
|
|||
|
||||
static int path_count_inc(int nests)
|
||||
{
|
||||
/* Allow an arbitrary number of depth 1 paths */
|
||||
if (nests == 0)
|
||||
return 0;
|
||||
|
||||
if (++path_count[nests] > path_limits[nests])
|
||||
return -1;
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -2846,7 +2846,7 @@ static int ext4_split_extent_at(handle_t *handle,
|
|||
if (err)
|
||||
goto fix_extent_len;
|
||||
/* update the extent length and mark as initialized */
|
||||
ex->ee_len = cpu_to_le32(ee_len);
|
||||
ex->ee_len = cpu_to_le16(ee_len);
|
||||
ext4_ext_try_to_merge(inode, path, ex);
|
||||
err = ext4_ext_dirty(handle, inode, path + depth);
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -683,7 +683,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
|
|||
if (commit_transaction->t_need_data_flush &&
|
||||
(journal->j_fs_dev != journal->j_dev) &&
|
||||
(journal->j_flags & JBD2_BARRIER))
|
||||
blkdev_issue_flush(journal->j_fs_dev, GFP_KERNEL, NULL);
|
||||
blkdev_issue_flush(journal->j_fs_dev, GFP_NOFS, NULL);
|
||||
|
||||
/* Done it all: now write the commit record asynchronously. */
|
||||
if (JBD2_HAS_INCOMPAT_FEATURE(journal,
|
||||
|
|
@ -819,7 +819,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
|
|||
if (JBD2_HAS_INCOMPAT_FEATURE(journal,
|
||||
JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT) &&
|
||||
journal->j_flags & JBD2_BARRIER) {
|
||||
blkdev_issue_flush(journal->j_dev, GFP_KERNEL, NULL);
|
||||
blkdev_issue_flush(journal->j_dev, GFP_NOFS, NULL);
|
||||
}
|
||||
|
||||
if (err)
|
||||
|
|
|
|||
|
|
@ -241,7 +241,7 @@ static int decode_nlm4_stat(struct xdr_stream *xdr, __be32 *stat)
|
|||
p = xdr_inline_decode(xdr, 4);
|
||||
if (unlikely(p == NULL))
|
||||
goto out_overflow;
|
||||
if (unlikely(*p > nlm4_failed))
|
||||
if (unlikely(ntohl(*p) > ntohl(nlm4_failed)))
|
||||
goto out_bad_xdr;
|
||||
*stat = *p;
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -236,7 +236,7 @@ static int decode_nlm_stat(struct xdr_stream *xdr,
|
|||
p = xdr_inline_decode(xdr, 4);
|
||||
if (unlikely(p == NULL))
|
||||
goto out_overflow;
|
||||
if (unlikely(*p > nlm_lck_denied_grace_period))
|
||||
if (unlikely(ntohl(*p) > ntohl(nlm_lck_denied_grace_period)))
|
||||
goto out_enum;
|
||||
*stat = *p;
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -803,13 +803,13 @@ encode_entry_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name,
|
|||
return p;
|
||||
}
|
||||
|
||||
static int
|
||||
static __be32
|
||||
compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp,
|
||||
const char *name, int namlen)
|
||||
{
|
||||
struct svc_export *exp;
|
||||
struct dentry *dparent, *dchild;
|
||||
int rv = 0;
|
||||
__be32 rv = nfserr_noent;
|
||||
|
||||
dparent = cd->fh.fh_dentry;
|
||||
exp = cd->fh.fh_export;
|
||||
|
|
@ -817,26 +817,20 @@ compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp,
|
|||
if (isdotent(name, namlen)) {
|
||||
if (namlen == 2) {
|
||||
dchild = dget_parent(dparent);
|
||||
if (dchild == dparent) {
|
||||
/* filesystem root - cannot return filehandle for ".." */
|
||||
dput(dchild);
|
||||
return -ENOENT;
|
||||
}
|
||||
/* filesystem root - cannot return filehandle for ".." */
|
||||
if (dchild == dparent)
|
||||
goto out;
|
||||
} else
|
||||
dchild = dget(dparent);
|
||||
} else
|
||||
dchild = lookup_one_len(name, dparent, namlen);
|
||||
if (IS_ERR(dchild))
|
||||
return -ENOENT;
|
||||
rv = -ENOENT;
|
||||
return rv;
|
||||
if (d_mountpoint(dchild))
|
||||
goto out;
|
||||
rv = fh_compose(fhp, exp, dchild, &cd->fh);
|
||||
if (rv)
|
||||
goto out;
|
||||
if (!dchild->d_inode)
|
||||
goto out;
|
||||
rv = 0;
|
||||
rv = fh_compose(fhp, exp, dchild, &cd->fh);
|
||||
out:
|
||||
dput(dchild);
|
||||
return rv;
|
||||
|
|
@ -845,7 +839,7 @@ compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp,
|
|||
static __be32 *encode_entryplus_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name, int namlen)
|
||||
{
|
||||
struct svc_fh fh;
|
||||
int err;
|
||||
__be32 err;
|
||||
|
||||
fh_init(&fh, NFS3_FHSIZE);
|
||||
err = compose_entry_fh(cd, &fh, name, namlen);
|
||||
|
|
|
|||
|
|
@ -1134,7 +1134,7 @@ static int ocfs2_adjust_rightmost_branch(handle_t *handle,
|
|||
}
|
||||
|
||||
el = path_leaf_el(path);
|
||||
rec = &el->l_recs[le32_to_cpu(el->l_next_free_rec) - 1];
|
||||
rec = &el->l_recs[le16_to_cpu(el->l_next_free_rec) - 1];
|
||||
|
||||
ocfs2_adjust_rightmost_records(handle, et, path, rec);
|
||||
|
||||
|
|
|
|||
|
|
@ -1036,14 +1036,14 @@ static int ocfs2_get_refcount_cpos_end(struct ocfs2_caching_info *ci,
|
|||
|
||||
tmp_el = left_path->p_node[subtree_root].el;
|
||||
blkno = left_path->p_node[subtree_root+1].bh->b_blocknr;
|
||||
for (i = 0; i < le32_to_cpu(tmp_el->l_next_free_rec); i++) {
|
||||
for (i = 0; i < le16_to_cpu(tmp_el->l_next_free_rec); i++) {
|
||||
if (le64_to_cpu(tmp_el->l_recs[i].e_blkno) == blkno) {
|
||||
*cpos_end = le32_to_cpu(tmp_el->l_recs[i+1].e_cpos);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BUG_ON(i == le32_to_cpu(tmp_el->l_next_free_rec));
|
||||
BUG_ON(i == le16_to_cpu(tmp_el->l_next_free_rec));
|
||||
|
||||
out:
|
||||
ocfs2_free_path(left_path);
|
||||
|
|
@ -1468,7 +1468,7 @@ static int ocfs2_divide_leaf_refcount_block(struct buffer_head *ref_leaf_bh,
|
|||
|
||||
trace_ocfs2_divide_leaf_refcount_block(
|
||||
(unsigned long long)ref_leaf_bh->b_blocknr,
|
||||
le32_to_cpu(rl->rl_count), le32_to_cpu(rl->rl_used));
|
||||
le16_to_cpu(rl->rl_count), le16_to_cpu(rl->rl_used));
|
||||
|
||||
/*
|
||||
* XXX: Improvement later.
|
||||
|
|
@ -2411,7 +2411,7 @@ static int ocfs2_calc_refcount_meta_credits(struct super_block *sb,
|
|||
rb = (struct ocfs2_refcount_block *)
|
||||
prev_bh->b_data;
|
||||
|
||||
if (le64_to_cpu(rb->rf_records.rl_used) +
|
||||
if (le16_to_cpu(rb->rf_records.rl_used) +
|
||||
recs_add >
|
||||
le16_to_cpu(rb->rf_records.rl_count))
|
||||
ref_blocks++;
|
||||
|
|
@ -2476,7 +2476,7 @@ static int ocfs2_calc_refcount_meta_credits(struct super_block *sb,
|
|||
if (prev_bh) {
|
||||
rb = (struct ocfs2_refcount_block *)prev_bh->b_data;
|
||||
|
||||
if (le64_to_cpu(rb->rf_records.rl_used) + recs_add >
|
||||
if (le16_to_cpu(rb->rf_records.rl_used) + recs_add >
|
||||
le16_to_cpu(rb->rf_records.rl_count))
|
||||
ref_blocks++;
|
||||
|
||||
|
|
@ -3629,7 +3629,7 @@ int ocfs2_refcounted_xattr_delete_need(struct inode *inode,
|
|||
* one will split a refcount rec, so totally we need
|
||||
* clusters * 2 new refcount rec.
|
||||
*/
|
||||
if (le64_to_cpu(rb->rf_records.rl_used) + clusters * 2 >
|
||||
if (le16_to_cpu(rb->rf_records.rl_used) + clusters * 2 >
|
||||
le16_to_cpu(rb->rf_records.rl_count))
|
||||
ref_blocks++;
|
||||
|
||||
|
|
|
|||
|
|
@ -600,7 +600,7 @@ static void ocfs2_bg_alloc_cleanup(handle_t *handle,
|
|||
ret = ocfs2_free_clusters(handle, cluster_ac->ac_inode,
|
||||
cluster_ac->ac_bh,
|
||||
le64_to_cpu(rec->e_blkno),
|
||||
le32_to_cpu(rec->e_leaf_clusters));
|
||||
le16_to_cpu(rec->e_leaf_clusters));
|
||||
if (ret)
|
||||
mlog_errno(ret);
|
||||
/* Try all the clusters to free */
|
||||
|
|
@ -1628,7 +1628,7 @@ static int ocfs2_bg_discontig_fix_by_rec(struct ocfs2_suballoc_result *res,
|
|||
{
|
||||
unsigned int bpc = le16_to_cpu(cl->cl_bpc);
|
||||
unsigned int bitoff = le32_to_cpu(rec->e_cpos) * bpc;
|
||||
unsigned int bitcount = le32_to_cpu(rec->e_leaf_clusters) * bpc;
|
||||
unsigned int bitcount = le16_to_cpu(rec->e_leaf_clusters) * bpc;
|
||||
|
||||
if (res->sr_bit_offset < bitoff)
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/uio.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/socket.h>
|
||||
|
||||
/*
|
||||
* Attempt to steal a page from a pipe buffer. This should perhaps go into
|
||||
|
|
@ -691,7 +692,9 @@ static int pipe_to_sendpage(struct pipe_inode_info *pipe,
|
|||
if (!likely(file->f_op && file->f_op->sendpage))
|
||||
return -EINVAL;
|
||||
|
||||
more = (sd->flags & SPLICE_F_MORE) || sd->len < sd->total_len;
|
||||
more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0;
|
||||
if (sd->len < sd->total_len)
|
||||
more |= MSG_SENDPAGE_NOTLAST;
|
||||
return file->f_op->sendpage(file, buf->page, buf->offset,
|
||||
sd->len, &pos, more);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -261,7 +261,7 @@ struct ucred {
|
|||
#define MSG_NOSIGNAL 0x4000 /* Do not generate SIGPIPE */
|
||||
#define MSG_MORE 0x8000 /* Sender will send more */
|
||||
#define MSG_WAITFORONE 0x10000 /* recvmmsg(): block until 1+ packets avail */
|
||||
|
||||
#define MSG_SENDPAGE_NOTLAST 0x20000 /* sendpage() internal : not the last page */
|
||||
#define MSG_EOF MSG_FIN
|
||||
|
||||
#define MSG_CMSG_CLOEXEC 0x40000000 /* Set close_on_exit for file
|
||||
|
|
|
|||
|
|
@ -84,6 +84,7 @@ enum {
|
|||
HCI_SERVICE_CACHE,
|
||||
HCI_LINK_KEYS,
|
||||
HCI_DEBUG_KEYS,
|
||||
HCI_UNREGISTER,
|
||||
|
||||
HCI_RESET,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@
|
|||
#include <linux/magic.h>
|
||||
#include <linux/pid.h>
|
||||
#include <linux/nsproxy.h>
|
||||
#include <linux/ptrace.h>
|
||||
|
||||
#include <asm/futex.h>
|
||||
|
||||
|
|
@ -2443,40 +2444,29 @@ SYSCALL_DEFINE3(get_robust_list, int, pid,
|
|||
{
|
||||
struct robust_list_head __user *head;
|
||||
unsigned long ret;
|
||||
const struct cred *cred = current_cred(), *pcred;
|
||||
struct task_struct *p;
|
||||
|
||||
if (!futex_cmpxchg_enabled)
|
||||
return -ENOSYS;
|
||||
|
||||
if (!pid)
|
||||
head = current->robust_list;
|
||||
else {
|
||||
struct task_struct *p;
|
||||
rcu_read_lock();
|
||||
|
||||
ret = -ESRCH;
|
||||
rcu_read_lock();
|
||||
ret = -ESRCH;
|
||||
if (!pid)
|
||||
p = current;
|
||||
else {
|
||||
p = find_task_by_vpid(pid);
|
||||
if (!p)
|
||||
goto err_unlock;
|
||||
ret = -EPERM;
|
||||
pcred = __task_cred(p);
|
||||
/* If victim is in different user_ns, then uids are not
|
||||
comparable, so we must have CAP_SYS_PTRACE */
|
||||
if (cred->user->user_ns != pcred->user->user_ns) {
|
||||
if (!ns_capable(pcred->user->user_ns, CAP_SYS_PTRACE))
|
||||
goto err_unlock;
|
||||
goto ok;
|
||||
}
|
||||
/* If victim is in same user_ns, then uids are comparable */
|
||||
if (cred->euid != pcred->euid &&
|
||||
cred->euid != pcred->uid &&
|
||||
!ns_capable(pcred->user->user_ns, CAP_SYS_PTRACE))
|
||||
goto err_unlock;
|
||||
ok:
|
||||
head = p->robust_list;
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
ret = -EPERM;
|
||||
if (!ptrace_may_access(p, PTRACE_MODE_READ))
|
||||
goto err_unlock;
|
||||
|
||||
head = p->robust_list;
|
||||
rcu_read_unlock();
|
||||
|
||||
if (put_user(sizeof(*head), len_ptr))
|
||||
return -EFAULT;
|
||||
return put_user(head, head_ptr);
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/compat.h>
|
||||
#include <linux/nsproxy.h>
|
||||
#include <linux/futex.h>
|
||||
#include <linux/ptrace.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
|
|
@ -136,40 +137,29 @@ compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
|
|||
{
|
||||
struct compat_robust_list_head __user *head;
|
||||
unsigned long ret;
|
||||
const struct cred *cred = current_cred(), *pcred;
|
||||
struct task_struct *p;
|
||||
|
||||
if (!futex_cmpxchg_enabled)
|
||||
return -ENOSYS;
|
||||
|
||||
if (!pid)
|
||||
head = current->compat_robust_list;
|
||||
else {
|
||||
struct task_struct *p;
|
||||
rcu_read_lock();
|
||||
|
||||
ret = -ESRCH;
|
||||
rcu_read_lock();
|
||||
ret = -ESRCH;
|
||||
if (!pid)
|
||||
p = current;
|
||||
else {
|
||||
p = find_task_by_vpid(pid);
|
||||
if (!p)
|
||||
goto err_unlock;
|
||||
ret = -EPERM;
|
||||
pcred = __task_cred(p);
|
||||
/* If victim is in different user_ns, then uids are not
|
||||
comparable, so we must have CAP_SYS_PTRACE */
|
||||
if (cred->user->user_ns != pcred->user->user_ns) {
|
||||
if (!ns_capable(pcred->user->user_ns, CAP_SYS_PTRACE))
|
||||
goto err_unlock;
|
||||
goto ok;
|
||||
}
|
||||
/* If victim is in same user_ns, then uids are comparable */
|
||||
if (cred->euid != pcred->euid &&
|
||||
cred->euid != pcred->uid &&
|
||||
!ns_capable(pcred->user->user_ns, CAP_SYS_PTRACE))
|
||||
goto err_unlock;
|
||||
ok:
|
||||
head = p->compat_robust_list;
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
ret = -EPERM;
|
||||
if (!ptrace_may_access(p, PTRACE_MODE_READ))
|
||||
goto err_unlock;
|
||||
|
||||
head = p->compat_robust_list;
|
||||
rcu_read_unlock();
|
||||
|
||||
if (put_user(sizeof(*head), len_ptr))
|
||||
return -EFAULT;
|
||||
return put_user(ptr_to_compat(head), head_ptr);
|
||||
|
|
|
|||
|
|
@ -484,9 +484,9 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
|
|||
hrtimer_get_expires(&ts->sched_timer), 0))
|
||||
break;
|
||||
}
|
||||
/* Update jiffies and reread time */
|
||||
tick_do_update_jiffies64(now);
|
||||
/* Reread time and update jiffies */
|
||||
now = ktime_get();
|
||||
tick_do_update_jiffies64(now);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2679,6 +2679,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
|
|||
* so no worry about deadlock.
|
||||
*/
|
||||
page = pte_page(entry);
|
||||
get_page(page);
|
||||
if (page != pagecache_page)
|
||||
lock_page(page);
|
||||
|
||||
|
|
@ -2710,6 +2711,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
|
|||
}
|
||||
if (page != pagecache_page)
|
||||
unlock_page(page);
|
||||
put_page(page);
|
||||
|
||||
out_mutex:
|
||||
mutex_unlock(&hugetlb_instantiation_mutex);
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
*/
|
||||
static const struct address_space_operations swap_aops = {
|
||||
.writepage = swap_writepage,
|
||||
.set_page_dirty = __set_page_dirty_nobuffers,
|
||||
.set_page_dirty = __set_page_dirty_no_writeback,
|
||||
.migratepage = migrate_page,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -2006,16 +2006,17 @@ static void __exit ax25_exit(void)
|
|||
proc_net_remove(&init_net, "ax25_route");
|
||||
proc_net_remove(&init_net, "ax25");
|
||||
proc_net_remove(&init_net, "ax25_calls");
|
||||
ax25_rt_free();
|
||||
ax25_uid_free();
|
||||
ax25_dev_free();
|
||||
|
||||
ax25_unregister_sysctl();
|
||||
unregister_netdevice_notifier(&ax25_dev_notifier);
|
||||
ax25_unregister_sysctl();
|
||||
|
||||
dev_remove_pack(&ax25_packet_type);
|
||||
|
||||
sock_unregister(PF_AX25);
|
||||
proto_unregister(&ax25_proto);
|
||||
|
||||
ax25_rt_free();
|
||||
ax25_uid_free();
|
||||
ax25_dev_free();
|
||||
}
|
||||
module_exit(ax25_exit);
|
||||
|
|
|
|||
|
|
@ -510,6 +510,11 @@ int hci_dev_open(__u16 dev)
|
|||
|
||||
hci_req_lock(hdev);
|
||||
|
||||
if (test_bit(HCI_UNREGISTER, &hdev->flags)) {
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) {
|
||||
ret = -ERFKILL;
|
||||
goto done;
|
||||
|
|
@ -1563,6 +1568,8 @@ int hci_unregister_dev(struct hci_dev *hdev)
|
|||
|
||||
BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
|
||||
|
||||
set_bit(HCI_UNREGISTER, &hdev->flags);
|
||||
|
||||
write_lock_bh(&hci_dev_list_lock);
|
||||
list_del(&hdev->list);
|
||||
write_unlock_bh(&hci_dev_list_lock);
|
||||
|
|
|
|||
|
|
@ -241,7 +241,6 @@ static void br_multicast_group_expired(unsigned long data)
|
|||
hlist_del_rcu(&mp->hlist[mdb->ver]);
|
||||
mdb->size--;
|
||||
|
||||
del_timer(&mp->query_timer);
|
||||
call_rcu_bh(&mp->rcu, br_multicast_free_group);
|
||||
|
||||
out:
|
||||
|
|
@ -271,7 +270,6 @@ static void br_multicast_del_pg(struct net_bridge *br,
|
|||
rcu_assign_pointer(*pp, p->next);
|
||||
hlist_del_init(&p->mglist);
|
||||
del_timer(&p->timer);
|
||||
del_timer(&p->query_timer);
|
||||
call_rcu_bh(&p->rcu, br_multicast_free_pg);
|
||||
|
||||
if (!mp->ports && !mp->mglist &&
|
||||
|
|
@ -507,74 +505,6 @@ static struct sk_buff *br_multicast_alloc_query(struct net_bridge *br,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void br_multicast_send_group_query(struct net_bridge_mdb_entry *mp)
|
||||
{
|
||||
struct net_bridge *br = mp->br;
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = br_multicast_alloc_query(br, &mp->addr);
|
||||
if (!skb)
|
||||
goto timer;
|
||||
|
||||
netif_rx(skb);
|
||||
|
||||
timer:
|
||||
if (++mp->queries_sent < br->multicast_last_member_count)
|
||||
mod_timer(&mp->query_timer,
|
||||
jiffies + br->multicast_last_member_interval);
|
||||
}
|
||||
|
||||
static void br_multicast_group_query_expired(unsigned long data)
|
||||
{
|
||||
struct net_bridge_mdb_entry *mp = (void *)data;
|
||||
struct net_bridge *br = mp->br;
|
||||
|
||||
spin_lock(&br->multicast_lock);
|
||||
if (!netif_running(br->dev) || !mp->mglist ||
|
||||
mp->queries_sent >= br->multicast_last_member_count)
|
||||
goto out;
|
||||
|
||||
br_multicast_send_group_query(mp);
|
||||
|
||||
out:
|
||||
spin_unlock(&br->multicast_lock);
|
||||
}
|
||||
|
||||
static void br_multicast_send_port_group_query(struct net_bridge_port_group *pg)
|
||||
{
|
||||
struct net_bridge_port *port = pg->port;
|
||||
struct net_bridge *br = port->br;
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = br_multicast_alloc_query(br, &pg->addr);
|
||||
if (!skb)
|
||||
goto timer;
|
||||
|
||||
br_deliver(port, skb);
|
||||
|
||||
timer:
|
||||
if (++pg->queries_sent < br->multicast_last_member_count)
|
||||
mod_timer(&pg->query_timer,
|
||||
jiffies + br->multicast_last_member_interval);
|
||||
}
|
||||
|
||||
static void br_multicast_port_group_query_expired(unsigned long data)
|
||||
{
|
||||
struct net_bridge_port_group *pg = (void *)data;
|
||||
struct net_bridge_port *port = pg->port;
|
||||
struct net_bridge *br = port->br;
|
||||
|
||||
spin_lock(&br->multicast_lock);
|
||||
if (!netif_running(br->dev) || hlist_unhashed(&pg->mglist) ||
|
||||
pg->queries_sent >= br->multicast_last_member_count)
|
||||
goto out;
|
||||
|
||||
br_multicast_send_port_group_query(pg);
|
||||
|
||||
out:
|
||||
spin_unlock(&br->multicast_lock);
|
||||
}
|
||||
|
||||
static struct net_bridge_mdb_entry *br_multicast_get_group(
|
||||
struct net_bridge *br, struct net_bridge_port *port,
|
||||
struct br_ip *group, int hash)
|
||||
|
|
@ -690,8 +620,6 @@ static struct net_bridge_mdb_entry *br_multicast_new_group(
|
|||
mp->addr = *group;
|
||||
setup_timer(&mp->timer, br_multicast_group_expired,
|
||||
(unsigned long)mp);
|
||||
setup_timer(&mp->query_timer, br_multicast_group_query_expired,
|
||||
(unsigned long)mp);
|
||||
|
||||
hlist_add_head_rcu(&mp->hlist[mdb->ver], &mdb->mhash[hash]);
|
||||
mdb->size++;
|
||||
|
|
@ -746,8 +674,6 @@ static int br_multicast_add_group(struct net_bridge *br,
|
|||
hlist_add_head(&p->mglist, &port->mglist);
|
||||
setup_timer(&p->timer, br_multicast_port_group_expired,
|
||||
(unsigned long)p);
|
||||
setup_timer(&p->query_timer, br_multicast_port_group_query_expired,
|
||||
(unsigned long)p);
|
||||
|
||||
rcu_assign_pointer(*pp, p);
|
||||
|
||||
|
|
@ -1291,9 +1217,6 @@ static void br_multicast_leave_group(struct net_bridge *br,
|
|||
time_after(mp->timer.expires, time) :
|
||||
try_to_del_timer_sync(&mp->timer) >= 0)) {
|
||||
mod_timer(&mp->timer, time);
|
||||
|
||||
mp->queries_sent = 0;
|
||||
mod_timer(&mp->query_timer, now);
|
||||
}
|
||||
|
||||
goto out;
|
||||
|
|
@ -1310,9 +1233,6 @@ static void br_multicast_leave_group(struct net_bridge *br,
|
|||
time_after(p->timer.expires, time) :
|
||||
try_to_del_timer_sync(&p->timer) >= 0)) {
|
||||
mod_timer(&p->timer, time);
|
||||
|
||||
p->queries_sent = 0;
|
||||
mod_timer(&p->query_timer, now);
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
@ -1678,7 +1598,6 @@ void br_multicast_stop(struct net_bridge *br)
|
|||
hlist_for_each_entry_safe(mp, p, n, &mdb->mhash[i],
|
||||
hlist[ver]) {
|
||||
del_timer(&mp->timer);
|
||||
del_timer(&mp->query_timer);
|
||||
call_rcu_bh(&mp->rcu, br_multicast_free_group);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -77,9 +77,7 @@ struct net_bridge_port_group {
|
|||
struct hlist_node mglist;
|
||||
struct rcu_head rcu;
|
||||
struct timer_list timer;
|
||||
struct timer_list query_timer;
|
||||
struct br_ip addr;
|
||||
u32 queries_sent;
|
||||
};
|
||||
|
||||
struct net_bridge_mdb_entry
|
||||
|
|
@ -89,10 +87,8 @@ struct net_bridge_mdb_entry
|
|||
struct net_bridge_port_group __rcu *ports;
|
||||
struct rcu_head rcu;
|
||||
struct timer_list timer;
|
||||
struct timer_list query_timer;
|
||||
struct br_ip addr;
|
||||
bool mglist;
|
||||
u32 queries_sent;
|
||||
};
|
||||
|
||||
struct net_bridge_mdb_htable
|
||||
|
|
|
|||
|
|
@ -82,21 +82,29 @@ static int net_assign_generic(struct net *net, int id, void *data)
|
|||
|
||||
static int ops_init(const struct pernet_operations *ops, struct net *net)
|
||||
{
|
||||
int err;
|
||||
int err = -ENOMEM;
|
||||
void *data = NULL;
|
||||
|
||||
if (ops->id && ops->size) {
|
||||
void *data = kzalloc(ops->size, GFP_KERNEL);
|
||||
data = kzalloc(ops->size, GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
goto out;
|
||||
|
||||
err = net_assign_generic(net, *ops->id, data);
|
||||
if (err) {
|
||||
kfree(data);
|
||||
return err;
|
||||
}
|
||||
if (err)
|
||||
goto cleanup;
|
||||
}
|
||||
err = 0;
|
||||
if (ops->init)
|
||||
return ops->init(net);
|
||||
return 0;
|
||||
err = ops->init(net);
|
||||
if (!err)
|
||||
return 0;
|
||||
|
||||
cleanup:
|
||||
kfree(data);
|
||||
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void ops_free(const struct pernet_operations *ops, struct net *net)
|
||||
|
|
@ -446,12 +454,7 @@ static void __unregister_pernet_operations(struct pernet_operations *ops)
|
|||
static int __register_pernet_operations(struct list_head *list,
|
||||
struct pernet_operations *ops)
|
||||
{
|
||||
int err = 0;
|
||||
err = ops_init(ops, &init_net);
|
||||
if (err)
|
||||
ops_free(ops, &init_net);
|
||||
return err;
|
||||
|
||||
return ops_init(ops, &init_net);
|
||||
}
|
||||
|
||||
static void __unregister_pernet_operations(struct pernet_operations *ops)
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user