From: Greg Kroah-Hartman Date: Thu, 15 May 2008 19:04:37 +0000 (-0700) Subject: more .25 patches added X-Git-Tag: v2.6.25.5~10 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=465ce438d31e4fd1f97fc291f5a6610c4941b2a1;p=thirdparty%2Fkernel%2Fstable-queue.git more .25 patches added --- diff --git a/queue-2.6.25/ext3-4-fix-uninitialized-bs-in-ext3-4_xattr_set_handle.patch b/queue-2.6.25/ext3-4-fix-uninitialized-bs-in-ext3-4_xattr_set_handle.patch new file mode 100644 index 00000000000..f234977e696 --- /dev/null +++ b/queue-2.6.25/ext3-4-fix-uninitialized-bs-in-ext3-4_xattr_set_handle.patch @@ -0,0 +1,61 @@ +From stable-bounces@linux.kernel.org Wed May 14 19:45:26 2008 +From: Tiger Yang +Date: Thu, 15 May 2008 02:45:18 GMT +Subject: ext3/4: fix uninitialized bs in ext3/4_xattr_set_handle() +To: jejb@kernel.org, stable@kernel.org +Message-ID: <200805150245.m4F2jI8E020348@hera.kernel.org> + +From: Tiger Yang + +commit 7e01c8e5420b6c7f9d85d34c15d8c7a15c9fc720 upstream + +This fix the uninitialized bs when we try to replace a xattr entry in +ibody with the new value which require more than free space. + +This situation only happens we format ext3/4 with inode size more than 128 and +we have put xattr entries both in ibody and block. The consequences about +this bug is we will lost the xattr block which pointed by i_file_acl with all +xattr entires in it. We will alloc a new xattr block and put that large value +entry in it. The old xattr block will become orphan block. + +Signed-off-by: Tiger Yang +Cc: +Cc: Andreas Gruenbacher +Acked-by: Andreas Dilger +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + fs/ext3/xattr.c | 5 +++++ + fs/ext4/xattr.c | 5 +++++ + 2 files changed, 10 insertions(+) + +--- a/fs/ext3/xattr.c ++++ b/fs/ext3/xattr.c +@@ -1000,6 +1000,11 @@ ext3_xattr_set_handle(handle_t *handle, + i.value = NULL; + error = ext3_xattr_block_set(handle, inode, &i, &bs); + } else if (error == -ENOSPC) { ++ if (EXT3_I(inode)->i_file_acl && !bs.s.base) { ++ error = ext3_xattr_block_find(inode, &i, &bs); ++ if (error) ++ goto cleanup; ++ } + error = ext3_xattr_block_set(handle, inode, &i, &bs); + if (error) + goto cleanup; +--- a/fs/ext4/xattr.c ++++ b/fs/ext4/xattr.c +@@ -1011,6 +1011,11 @@ ext4_xattr_set_handle(handle_t *handle, + i.value = NULL; + error = ext4_xattr_block_set(handle, inode, &i, &bs); + } else if (error == -ENOSPC) { ++ if (EXT4_I(inode)->i_file_acl && !bs.s.base) { ++ error = ext4_xattr_block_find(inode, &i, &bs); ++ if (error) ++ goto cleanup; ++ } + error = ext4_xattr_block_set(handle, inode, &i, &bs); + if (error) + goto cleanup; diff --git a/queue-2.6.25/libata-force-hardreset-if-link-is-in-powersave-mode.patch b/queue-2.6.25/libata-force-hardreset-if-link-is-in-powersave-mode.patch new file mode 100644 index 00000000000..6a975638820 --- /dev/null +++ b/queue-2.6.25/libata-force-hardreset-if-link-is-in-powersave-mode.patch @@ -0,0 +1,51 @@ +From stable-bounces@linux.kernel.org Thu May 15 06:15:27 2008 +From: Tejun Heo +Date: Thu, 15 May 2008 22:14:57 +0900 +Subject: libata: force hardreset if link is in powersave mode +To: Jeff Garzik , IDE/ATA development list , stable@kernel.org +Cc: matthieu.castet@parrot.com +Message-ID: <482C3751.8030206@gmail.com> + +From: Tejun Heo + +Inhibiting link PM mode doesn't bring the link back online if it's +already in powersave mode. If SRST is used in these cases, libata EH +thinks that the link is offline and fails detection. Force hardreset +if link is in powersave mode. + +Signed-off-by: Tejun Heo +Cc: Jeff Garzik +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/ata/libata-core.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +--- a/drivers/ata/libata-core.c ++++ b/drivers/ata/libata-core.c +@@ -3947,6 +3947,7 @@ int ata_std_prereset(struct ata_link *li + struct ata_port *ap = link->ap; + struct ata_eh_context *ehc = &link->eh_context; + const unsigned long *timing = sata_ehc_deb_timing(ehc); ++ u32 sstatus; + int rc; + + /* handle link resume */ +@@ -3960,6 +3961,17 @@ int ata_std_prereset(struct ata_link *li + if (ap->flags & ATA_FLAG_PMP) + ehc->i.action |= ATA_EH_HARDRESET; + ++ /* if link powersave is on, force hardreset */ ++ if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0) { ++ u8 ipm = sstatus >> 8; ++ ++ if (ipm == 2 || ipm == 6) { ++ ata_link_printk(link, KERN_INFO, "link in powersave " ++ "mode (ipm=%d), forcing hardreset\n", ipm); ++ ehc->i.action |= ATA_EH_HARDRESET; ++ } ++ } ++ + /* if we're about to do hardreset, nothing more to do */ + if (ehc->i.action & ATA_EH_HARDRESET) + return 0; diff --git a/queue-2.6.25/memory_hotplug-always-initialize-pageblock-bitmap.patch b/queue-2.6.25/memory_hotplug-always-initialize-pageblock-bitmap.patch new file mode 100644 index 00000000000..22abc666aac --- /dev/null +++ b/queue-2.6.25/memory_hotplug-always-initialize-pageblock-bitmap.patch @@ -0,0 +1,190 @@ +From stable-bounces@linux.kernel.org Wed May 14 19:45:26 2008 +From: Heiko Carstens +Date: Thu, 15 May 2008 02:45:16 GMT +Subject: memory_hotplug: always initialize pageblock bitmap +To: jejb@kernel.org, stable@kernel.org +Message-ID: <200805150245.m4F2jGvS020301@hera.kernel.org> + +From: Heiko Carstens + +commit 76cdd58e558669366adfaded436fda01b30cce3e upstream + +Trying to online a new memory section that was added via memory hotplug +sometimes results in crashes when the new pages are added via __free_page. + Reason for that is that the pageblock bitmap isn't initialized and hence +contains random stuff. That means that get_pageblock_migratetype() +returns also random stuff and therefore + + list_add(&page->lru, + &zone->free_area[order].free_list[migratetype]); + +in __free_one_page() tries to do a list_add to something that isn't even +necessarily a list. + +This happens since 86051ca5eaf5e560113ec7673462804c54284456 ("mm: fix +usemap initialization") which makes sure that the pageblock bitmap gets +only initialized for pages present in a zone. Unfortunately for hot-added +memory the zones "grow" after the memmap and the pageblock memmap have +been initialized. Which means that the new pages have an unitialized +bitmap. To solve this the calls to grow_zone_span() and grow_pgdat_span() +are moved to __add_zone() just before the initialization happens. + +The patch also moves the two functions since __add_zone() is the only +caller and I didn't want to add a forward declaration. + +Signed-off-by: Heiko Carstens +Cc: Andy Whitcroft +Cc: Dave Hansen +Cc: Gerald Schaefer +Cc: KAMEZAWA Hiroyuki +Cc: Yasunori Goto +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + mm/memory_hotplug.c | 78 ++++++++++++++++++++++++++-------------------------- + mm/page_alloc.c | 3 -- + 2 files changed, 40 insertions(+), 41 deletions(-) + +--- a/mm/memory_hotplug.c ++++ b/mm/memory_hotplug.c +@@ -58,23 +58,59 @@ static void release_memory_resource(stru + return; + } + +- + #ifdef CONFIG_MEMORY_HOTPLUG_SPARSE ++static void grow_zone_span(struct zone *zone, unsigned long start_pfn, ++ unsigned long end_pfn) ++{ ++ unsigned long old_zone_end_pfn; ++ ++ zone_span_writelock(zone); ++ ++ old_zone_end_pfn = zone->zone_start_pfn + zone->spanned_pages; ++ if (start_pfn < zone->zone_start_pfn) ++ zone->zone_start_pfn = start_pfn; ++ ++ zone->spanned_pages = max(old_zone_end_pfn, end_pfn) - ++ zone->zone_start_pfn; ++ ++ zone_span_writeunlock(zone); ++} ++ ++static void grow_pgdat_span(struct pglist_data *pgdat, unsigned long start_pfn, ++ unsigned long end_pfn) ++{ ++ unsigned long old_pgdat_end_pfn = ++ pgdat->node_start_pfn + pgdat->node_spanned_pages; ++ ++ if (start_pfn < pgdat->node_start_pfn) ++ pgdat->node_start_pfn = start_pfn; ++ ++ pgdat->node_spanned_pages = max(old_pgdat_end_pfn, end_pfn) - ++ pgdat->node_start_pfn; ++} ++ + static int __add_zone(struct zone *zone, unsigned long phys_start_pfn) + { + struct pglist_data *pgdat = zone->zone_pgdat; + int nr_pages = PAGES_PER_SECTION; + int nid = pgdat->node_id; + int zone_type; ++ unsigned long flags; + + zone_type = zone - pgdat->node_zones; + if (!zone->wait_table) { +- int ret = 0; ++ int ret; ++ + ret = init_currently_empty_zone(zone, phys_start_pfn, + nr_pages, MEMMAP_HOTPLUG); +- if (ret < 0) ++ if (ret) + return ret; + } ++ pgdat_resize_lock(zone->zone_pgdat, &flags); ++ grow_zone_span(zone, phys_start_pfn, phys_start_pfn + nr_pages); ++ grow_pgdat_span(zone->zone_pgdat, phys_start_pfn, ++ phys_start_pfn + nr_pages); ++ pgdat_resize_unlock(zone->zone_pgdat, &flags); + memmap_init_zone(nr_pages, nid, zone_type, + phys_start_pfn, MEMMAP_HOTPLUG); + return 0; +@@ -134,36 +170,6 @@ int __add_pages(struct zone *zone, unsig + } + EXPORT_SYMBOL_GPL(__add_pages); + +-static void grow_zone_span(struct zone *zone, +- unsigned long start_pfn, unsigned long end_pfn) +-{ +- unsigned long old_zone_end_pfn; +- +- zone_span_writelock(zone); +- +- old_zone_end_pfn = zone->zone_start_pfn + zone->spanned_pages; +- if (start_pfn < zone->zone_start_pfn) +- zone->zone_start_pfn = start_pfn; +- +- zone->spanned_pages = max(old_zone_end_pfn, end_pfn) - +- zone->zone_start_pfn; +- +- zone_span_writeunlock(zone); +-} +- +-static void grow_pgdat_span(struct pglist_data *pgdat, +- unsigned long start_pfn, unsigned long end_pfn) +-{ +- unsigned long old_pgdat_end_pfn = +- pgdat->node_start_pfn + pgdat->node_spanned_pages; +- +- if (start_pfn < pgdat->node_start_pfn) +- pgdat->node_start_pfn = start_pfn; +- +- pgdat->node_spanned_pages = max(old_pgdat_end_pfn, end_pfn) - +- pgdat->node_start_pfn; +-} +- + static int online_pages_range(unsigned long start_pfn, unsigned long nr_pages, + void *arg) + { +@@ -183,7 +189,6 @@ static int online_pages_range(unsigned l + + int online_pages(unsigned long pfn, unsigned long nr_pages) + { +- unsigned long flags; + unsigned long onlined_pages = 0; + struct zone *zone; + int need_zonelists_rebuild = 0; +@@ -211,11 +216,6 @@ int online_pages(unsigned long pfn, unsi + * memory_block->state_sem. + */ + zone = page_zone(pfn_to_page(pfn)); +- pgdat_resize_lock(zone->zone_pgdat, &flags); +- grow_zone_span(zone, pfn, pfn + nr_pages); +- grow_pgdat_span(zone->zone_pgdat, pfn, pfn + nr_pages); +- pgdat_resize_unlock(zone->zone_pgdat, &flags); +- + /* + * If this zone is not populated, then it is not in zonelist. + * This means the page allocator ignores this zone. +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -2837,8 +2837,6 @@ __meminit int init_currently_empty_zone( + + zone->zone_start_pfn = zone_start_pfn; + +- memmap_init(size, pgdat->node_id, zone_idx(zone), zone_start_pfn); +- + zone_init_free_lists(zone); + + return 0; +@@ -3408,6 +3406,7 @@ static void __paginginit free_area_init_ + ret = init_currently_empty_zone(zone, zone_start_pfn, + size, MEMMAP_EARLY); + BUG_ON(ret); ++ memmap_init(size, nid, j, zone_start_pfn); + zone_start_pfn += size; + } + } diff --git a/queue-2.6.25/powerpc-bolt-in-slb-entry-for-kernel-stack-on-secondary-cpus.patch b/queue-2.6.25/powerpc-bolt-in-slb-entry-for-kernel-stack-on-secondary-cpus.patch new file mode 100644 index 00000000000..7f497b8c5de --- /dev/null +++ b/queue-2.6.25/powerpc-bolt-in-slb-entry-for-kernel-stack-on-secondary-cpus.patch @@ -0,0 +1,108 @@ +From stable-bounces@linux.kernel.org Tue May 13 17:09:52 2008 +From: Paul Mackerras +Date: Wed, 14 May 2008 09:31:07 +1000 +Subject: POWERPC Bolt in SLB entry for kernel stack on secondary cpus +To: stable@kernel.org +Message-ID: <18474.9403.224795.825124@cargo.ozlabs.ibm.com> + +From: Paul Mackerras + +This is upstream as commit 3b5750644b2ffa2a76fdfe7b4e00e4af2ecf3539. + +This fixes a regression reported by Kamalesh Bulabel where a POWER4 +machine would crash because of an SLB miss at a point where the SLB +miss exception was unrecoverable. This regression is tracked at: + +http://bugzilla.kernel.org/show_bug.cgi?id=10082 + +SLB misses at such points shouldn't happen because the kernel stack is +the only memory accessed other than things in the first segment of the +linear mapping (which is mapped at all times by entry 0 of the SLB). +The context switch code ensures that SLB entry 2 covers the kernel +stack, if it is not already covered by entry 0. None of entries 0 +to 2 are ever replaced by the SLB miss handler. + +Where this went wrong is that the context switch code assumes it +doesn't have to write to SLB entry 2 if the new kernel stack is in the +same segment as the old kernel stack, since entry 2 should already be +correct. However, when we start up a secondary cpu, it calls +slb_initialize, which doesn't set up entry 2. This is correct for +the boot cpu, where we will be using a stack in the kernel BSS at this +point (i.e. init_thread_union), but not necessarily for secondary +cpus, whose initial stack can be allocated anywhere. This doesn't +cause any immediate problem since the SLB miss handler will just +create an SLB entry somewhere else to cover the initial stack. + +In fact it's possible for the cpu to go quite a long time without SLB +entry 2 being valid. Eventually, though, the entry created by the SLB +miss handler will get overwritten by some other entry, and if the next +access to the stack is at an unrecoverable point, we get the crash. + +This fixes the problem by making slb_initialize create a suitable +entry for the kernel stack, if we are on a secondary cpu and the stack +isn't covered by SLB entry 0. This requires initializing the +get_paca()->kstack field earlier, so I do that in smp_create_idle +where the current field is initialized. This also abstracts a bit of +the computation that mk_esid_data in slb.c does so that it can be used +in slb_initialize. + +Signed-off-by: Paul Mackerras +Signed-off-by: Greg Kroah-Hartman + +--- + arch/powerpc/kernel/smp.c | 2 ++ + arch/powerpc/mm/slb.c | 21 +++++++++++++-------- + 2 files changed, 15 insertions(+), 8 deletions(-) + +--- a/arch/powerpc/kernel/smp.c ++++ b/arch/powerpc/kernel/smp.c +@@ -386,6 +386,8 @@ static void __init smp_create_idle(unsig + panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p)); + #ifdef CONFIG_PPC64 + paca[cpu].__current = p; ++ paca[cpu].kstack = (unsigned long) task_thread_info(p) ++ + THREAD_SIZE - STACK_FRAME_OVERHEAD; + #endif + current_set[cpu] = task_thread_info(p); + task_thread_info(p)->cpu = cpu; +--- a/arch/powerpc/mm/slb.c ++++ b/arch/powerpc/mm/slb.c +@@ -44,13 +44,13 @@ static void slb_allocate(unsigned long e + slb_allocate_realmode(ea); + } + ++#define slb_esid_mask(ssize) \ ++ (((ssize) == MMU_SEGSIZE_256M)? ESID_MASK: ESID_MASK_1T) ++ + static inline unsigned long mk_esid_data(unsigned long ea, int ssize, + unsigned long slot) + { +- unsigned long mask; +- +- mask = (ssize == MMU_SEGSIZE_256M)? ESID_MASK: ESID_MASK_1T; +- return (ea & mask) | SLB_ESID_V | slot; ++ return (ea & slb_esid_mask(ssize)) | SLB_ESID_V | slot; + } + + #define slb_vsid_shift(ssize) \ +@@ -301,11 +301,16 @@ void slb_initialize(void) + + create_shadowed_slbe(VMALLOC_START, mmu_kernel_ssize, vflags, 1); + ++ /* For the boot cpu, we're running on the stack in init_thread_union, ++ * which is in the first segment of the linear mapping, and also ++ * get_paca()->kstack hasn't been initialized yet. ++ * For secondary cpus, we need to bolt the kernel stack entry now. ++ */ + slb_shadow_clear(2); ++ if (raw_smp_processor_id() != boot_cpuid && ++ (get_paca()->kstack & slb_esid_mask(mmu_kernel_ssize)) > PAGE_OFFSET) ++ create_shadowed_slbe(get_paca()->kstack, ++ mmu_kernel_ssize, lflags, 2); + +- /* We don't bolt the stack for the time being - we're in boot, +- * so the stack is in the bolted segment. By the time it goes +- * elsewhere, we'll call _switch() which will bolt in the new +- * one. */ + asm volatile("isync":::"memory"); + } diff --git a/queue-2.6.25/series b/queue-2.6.25/series index 628d57a6b31..923d262d13c 100644 --- a/queue-2.6.25/series +++ b/queue-2.6.25/series @@ -1 +1,11 @@ block-do_mounts-accept-root-non-existant-partition.patch +powerpc-bolt-in-slb-entry-for-kernel-stack-on-secondary-cpus.patch +usb-remove-picdem-fs-usb-demo-device-from-ldusb.patch +usb-unusual_devs-add-support-for-gi-0401-sd-card-interface.patch +usb-option-add-new-dell-5520-hsdpa-variant.patch +usb-add-zoom-telephonics-model-3095f-v.92-usb-mini-external-modem-to-cdc-acm.patch +usb-do-not-handle-device-1410-5010-in-option-driver.patch +usb-add-telstra-nextg-cdma-id-to-option-driver.patch +ext3-4-fix-uninitialized-bs-in-ext3-4_xattr_set_handle.patch +libata-force-hardreset-if-link-is-in-powersave-mode.patch +memory_hotplug-always-initialize-pageblock-bitmap.patch diff --git a/queue-2.6.25/usb-add-telstra-nextg-cdma-id-to-option-driver.patch b/queue-2.6.25/usb-add-telstra-nextg-cdma-id-to-option-driver.patch new file mode 100644 index 00000000000..f1e72d6c0c1 --- /dev/null +++ b/queue-2.6.25/usb-add-telstra-nextg-cdma-id-to-option-driver.patch @@ -0,0 +1,30 @@ +From stable-bounces@linux.kernel.org Wed May 14 12:21:45 2008 +From: Greg Kroah-Hartman +Date: Wed, 14 May 2008 19:21:22 GMT +Subject: USB: add Telstra NextG CDMA id to option driver +To: jejb@kernel.org, stable@kernel.org +Message-ID: <200805141921.m4EJLMTw020032@hera.kernel.org> + +From: Greg Kroah-Hartman + +commit 23cacd65f65956426bbca25964a68c174db83a31 upstream + +As reported by Magnus Boman + +Cc: Magnus Boman +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/option.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -299,6 +299,7 @@ static struct usb_device_id option_ids[] + { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ + { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ ++ { USB_DEVICE(0x19d2, 0x0001) }, /* Telstra NextG CDMA */ + { } /* Terminating entry */ + }; + MODULE_DEVICE_TABLE(usb, option_ids); diff --git a/queue-2.6.25/usb-add-zoom-telephonics-model-3095f-v.92-usb-mini-external-modem-to-cdc-acm.patch b/queue-2.6.25/usb-add-zoom-telephonics-model-3095f-v.92-usb-mini-external-modem-to-cdc-acm.patch new file mode 100644 index 00000000000..910a9ab0721 --- /dev/null +++ b/queue-2.6.25/usb-add-zoom-telephonics-model-3095f-v.92-usb-mini-external-modem-to-cdc-acm.patch @@ -0,0 +1,39 @@ +From stable-bounces@linux.kernel.org Wed May 14 12:21:34 2008 +From: Iain McFarlane +Date: Wed, 14 May 2008 19:21:19 GMT +Subject: USB: add Zoom Telephonics Model 3095F V.92 USB Mini External modem to cdc-acm +To: jejb@kernel.org, stable@kernel.org +Message-ID: <200805141921.m4EJLJ6Q019979@hera.kernel.org> + +From: Iain McFarlane + +commit 6149ed5e3a6207595bd7362af7724d64f44af216 upstream + +The patch below is a necessary workaround to support the Zoom Telephonics Model 3095F V.92 USB Mini External modem, which fails to initialise properly during normal probing thus: + +May 3 22:53:00 imcfarla kernel: drivers/usb/class/cdc-acm.c: Zero length descriptor references +May 3 22:53:00 imcfarla kernel: cdc_acm: probe of 5-2:1.0 failed with error -22 + +Adding the patch below causes the probing section to be skipped, and the modem +then initialises correctly. + +Signed-off-by: Iain McFarlane +Acked-by: Oliver Neukum +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/class/cdc-acm.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/usb/class/cdc-acm.c ++++ b/drivers/usb/class/cdc-acm.c +@@ -1242,6 +1242,9 @@ static struct usb_device_id acm_ids[] = + { USB_DEVICE(0x22b8, 0x7000), /* Motorola Q Phone */ + .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ + }, ++ { USB_DEVICE(0x0803, 0x3095), /* Zoom Telephonics Model 3095F USB MODEM */ ++ .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ ++ }, + + /* control interfaces with various AT-command sets */ + { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, diff --git a/queue-2.6.25/usb-do-not-handle-device-1410-5010-in-option-driver.patch b/queue-2.6.25/usb-do-not-handle-device-1410-5010-in-option-driver.patch new file mode 100644 index 00000000000..c2d3e7c639a --- /dev/null +++ b/queue-2.6.25/usb-do-not-handle-device-1410-5010-in-option-driver.patch @@ -0,0 +1,54 @@ +From stable-bounces@linux.kernel.org Wed May 14 12:21:34 2008 +From: Eugeniy Meshcheryakov +Date: Wed, 14 May 2008 19:21:09 GMT +Subject: USB: do not handle device 1410:5010 in 'option' driver +To: jejb@kernel.org, stable@kernel.org +Message-ID: <200805141921.m4EJL94s019907@hera.kernel.org> + +From: Eugeniy Meshcheryakov + +commit cdafc37a7b727b75ced65e31e47dafbd8b70f97f upstream + +This device is not a serial port, but a virtual CD-ROM device. For +example with my Novatel MC950D: + +lsusb -v -d 1410:5010 | grep InterfaceClass + bInterfaceClass 8 Mass Storage + +After some time (ca. 5min) or if virtual CD is ejected, device id +changes to 1410:4400: + +% lsusb -v -d 1410:4400 | grep InterfaceClass + bInterfaceClass 255 Vendor Specific Class + bInterfaceClass 255 Vendor Specific Class + +Variable name says that 0x5010 is a Novatel U727, but searching in +internet shows, that this device also provides virtual CD that should be +ejected before use. Product id for serial port in this case is 0x4100. + +Signed-off-by: Eugeniy Meshcheryakov +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/option.c | 3 --- + 1 file changed, 3 deletions(-) + +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -154,8 +154,6 @@ static int option_send_setup(struct usb + #define NOVATELWIRELESS_PRODUCT_MC727 0x4100 + #define NOVATELWIRELESS_PRODUCT_MC950D 0x4400 + +-#define NOVATELWIRELESS_PRODUCT_U727 0x5010 +- + /* FUTURE NOVATEL PRODUCTS */ + #define NOVATELWIRELESS_PRODUCT_EVDO_1 0x6000 + #define NOVATELWIRELESS_PRODUCT_HSPA_1 0x7000 +@@ -269,7 +267,6 @@ static struct usb_device_id option_ids[] + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */ + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */ + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */ +- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U727) }, /* Novatel U727 */ + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_1) }, /* Novatel EVDO product */ + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_1) }, /* Novatel HSPA product */ + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_1) }, /* Novatel Embedded product */ diff --git a/queue-2.6.25/usb-option-add-new-dell-5520-hsdpa-variant.patch b/queue-2.6.25/usb-option-add-new-dell-5520-hsdpa-variant.patch new file mode 100644 index 00000000000..b01795378a5 --- /dev/null +++ b/queue-2.6.25/usb-option-add-new-dell-5520-hsdpa-variant.patch @@ -0,0 +1,30 @@ +From stable-bounces@linux.kernel.org Wed May 14 12:21:22 2008 +From: Dan Williams +Date: Wed, 14 May 2008 19:20:56 GMT +Subject: USB: option: add new Dell 5520 HSDPA variant +To: jejb@kernel.org, stable@kernel.org +Message-ID: <200805141920.m4EJKuWq019765@hera.kernel.org> + +From: Dan Williams + +commit 96cb15cf977356d9d3117dd88f3fe187d6024f4b upstream + +New variant of the 5520 found by Luke Sheldrick. + +Signed-off-by: Dan Williams +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/option.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -293,6 +293,7 @@ static struct usb_device_id option_ids[] + { USB_DEVICE(DELL_VENDOR_ID, 0x8133) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */ + { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */ + { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */ ++ { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */ + { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, + { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, + { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, diff --git a/queue-2.6.25/usb-remove-picdem-fs-usb-demo-device-from-ldusb.patch b/queue-2.6.25/usb-remove-picdem-fs-usb-demo-device-from-ldusb.patch new file mode 100644 index 00000000000..c6f22cd324c --- /dev/null +++ b/queue-2.6.25/usb-remove-picdem-fs-usb-demo-device-from-ldusb.patch @@ -0,0 +1,50 @@ +From stable-bounces@linux.kernel.org Wed May 14 12:21:11 2008 +From: Xiaofan Chen +Date: Wed, 14 May 2008 19:20:51 GMT +Subject: USB: remove PICDEM FS USB demo (04d8:000c) device from ldusb +To: jejb@kernel.org, stable@kernel.org +Message-ID: <200805141920.m4EJKpaj019728@hera.kernel.org> + +From: Xiaofan Chen + +commit 5fc89390f74ac42165db477793fb30f6a200e79c upstream +Date: Tue, 13 May 2008 21:52:00 +0800 +Subject: USB: remove PICDEM FS USB demo (04d8:000c) device from ldusb + +Microchip has changed the PICDEM FS USB demo device (0x04d8:000c) +to use bulk transfer and not interrupt transfer. So I've updated the libusb +based program here (Post #31). + http://forum.microchip.com/tm.aspx?m=106426&mpage=2 + +So I believe that the in-kernel ldusb driver will no longer work with the +demo firmware. It should be removed. + + +Signed-off-by: Xiaofan Chen +Cc: Michael Hund +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/misc/ldusb.c | 4 ---- + 1 file changed, 4 deletions(-) + +--- a/drivers/usb/misc/ldusb.c ++++ b/drivers/usb/misc/ldusb.c +@@ -63,9 +63,6 @@ + #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 + #define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006 + +-#define USB_VENDOR_ID_MICROCHIP 0x04d8 +-#define USB_DEVICE_ID_PICDEM 0x000c +- + #ifdef CONFIG_USB_DYNAMIC_MINORS + #define USB_LD_MINOR_BASE 0 + #else +@@ -92,7 +89,6 @@ static struct usb_device_id ld_usb_table + { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) }, + { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) }, + { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) }, +- { USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICDEM) }, + { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LCSPEC) }, + { } /* Terminating entry */ + }; diff --git a/queue-2.6.25/usb-unusual_devs-add-support-for-gi-0401-sd-card-interface.patch b/queue-2.6.25/usb-unusual_devs-add-support-for-gi-0401-sd-card-interface.patch new file mode 100644 index 00000000000..0e69750f7f3 --- /dev/null +++ b/queue-2.6.25/usb-unusual_devs-add-support-for-gi-0401-sd-card-interface.patch @@ -0,0 +1,93 @@ +From stable-bounces@linux.kernel.org Wed May 14 12:21:22 2008 +From: Filip Aben +Date: Wed, 14 May 2008 19:21:03 GMT +Subject: USB: unusual_devs: Add support for GI 0401 SD-Card interface +To: jejb@kernel.org, stable@kernel.org +Message-ID: <200805141921.m4EJL3XG019868@hera.kernel.org> + +From: Filip Aben + +commit e7c6f80fd733218aa1e79efa5d9ece9f76966160 upstream + +Enables the SD-Card interface on the GI 0401 HSUPA card from Option. + +The unusual_devs.h entry is necessary because the device descriptor is +vendor-specific. That prevents usb-storage from binding to it as an +interface driver. + +This revised patch adds a small comment explaining why and reduces the +rev range. + +T: Bus=02 Lev=01 Prnt=01 Port=06 Cnt=01 Dev#= 3 Spd=480 MxCh= 0 +D: Ver= 2.00 Cls=ff(vend.) Sub=ff Prot=ff MxPS=64 #Cfgs= 1 +P: Vendor=0af0 ProdID=7401 Rev= 0.00 +S: Manufacturer=Option N.V. +S: Product=Globetrotter HSUPA Modem +C:* #Ifs=10 Cfg#= 1 Atr=80 MxPwr=500mA +I:* If#= 0 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +I: If#= 0 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms +I:* If#= 1 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +I: If#= 1 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms +I:* If#= 2 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +I: If#= 2 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +E: Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms +I:* If#= 3 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +I: If#= 3 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +E: Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms +I:* If#= 4 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +I: If#= 4 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +E: Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms +I:* If#= 5 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +I: If#= 5 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +E: Ad=86(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=06(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms +I:* If#= 6 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +I: If#= 6 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +E: Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=07(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms +I:* If#= 7 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +I: If#= 7 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +E: Ad=88(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=08(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms +I:* If#= 8 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +E: Ad=89(I) Atr=03(Int.) MxPS= 64 Ivl=2ms +E: Ad=8a(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=09(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms +I:* If#= 9 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage +E: Ad=0a(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=8b(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms + +Signed-off-by: Filip Aben +Signed-off-by: Phil Dibowitz +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/storage/unusual_devs.h | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/usb/storage/unusual_devs.h ++++ b/drivers/usb/storage/unusual_devs.h +@@ -1285,6 +1285,16 @@ UNUSUAL_DEV( 0x0ace, 0x20ff, 0x0101, 0x0 + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_IGNORE_DEVICE ), + ++/* Reported by F. Aben ++ * This device (wrongly) has a vendor-specific device descriptor. ++ * The entry is needed so usb-storage can bind to it's mass-storage ++ * interface as an interface driver */ ++UNUSUAL_DEV( 0x0af0, 0x7401, 0x0000, 0x0000, ++ "Option", ++ "GI 0401 SD-Card", ++ US_SC_DEVICE, US_PR_DEVICE, NULL, ++ 0 ), ++ + #ifdef CONFIG_USB_STORAGE_ISD200 + UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110, + "ATI",