1. 25 Jan, 2008 6 commits
    • Bartlomiej Zolnierkiewicz's avatar
      ide: fix registers loading order for IDE_NSECTOR_REG in execute_drive_cmd() · 6dd87233
      Bartlomiej Zolnierkiewicz authored
      
      
      Move loading of IDE_NSECTOR_REG from ide_cmd() to execute_drive_cmd()
      (load the IDE_NSECTOR_REG just after IDE_FEATURE_REG).
      
      This also allows us to drop 'nsect' argument from ide_cmd() and simplify
      execute_drive_cmd() code for REQ_TYPE_ATA_CMD case a bit.
      
      It shouldn't affect anything (just a usual paranoia to separate changes
      which change the way in which hardware is accessed from code cleanups).
      Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      6dd87233
    • Bartlomiej Zolnierkiewicz's avatar
      ide: fix registers loading order for WIN_SMART in execute_drive_cmd() · 46f26c36
      Bartlomiej Zolnierkiewicz authored
      
      
      Fix registers loading order for REQ_TYPE_ATA_CMD request with WIN_SMART
      command in execute_drive_cmd() (load IDE_FEATURE_REG and IDE_SECTOR_REG
      before loading IDE_LCYL_REG and IDE_HCYL_REG).
      
      It shouldn't affect anything (just a usual paranoia to separate changes
      which change the way in which hardware is accessed from code cleanups).
      Acked-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
      Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      46f26c36
    • Bartlomiej Zolnierkiewicz's avatar
      ide: remove stale ide.h "configuration options" · 4ee06b7e
      Bartlomiej Zolnierkiewicz authored
      
      
      Remove stale ide.h "configuration options":
      
      * INITIAL_MULT_COUNT - always defined to 0
      
      * SUPPORT_SLOW_DATA_PORTS - unused
      
      * OK_TO_RESET_CONTROLLER - always defined to 1
      
      * DISABLE_IRQ_NOSYNC - always defined to 0
      
      Leave SUPPORT_VLB_SYNC (defined to 0 for CRIS and FRV, otherwise to 1)
      for now but disallow overriding it by <asm/ide.h>.
      
      There should be no functionality changes caused by this patch.
      Acked-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
      Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      4ee06b7e
    • Bartlomiej Zolnierkiewicz's avatar
      ide: use do_rw_taskfile() in flagged_taskfile() · 74095a91
      Bartlomiej Zolnierkiewicz authored
      
      
      Based on the earlier work by Tejun Heo.
      
      * Move setting IDE_TFLAG_LBA48 taskfile flag from do_rw_taskfile()
        function to the callers.
      
      * Add IDE_TFLAG_FLAGGED taskfile flag for flagged taskfiles coming
        from ide_taskfile_ioctl().  Check it instead of ->tf_out_flags.all.
      
      * Add IDE_TFLAG_OUT_DATA taskfile flag to indicate the need to load
        IDE data register in ide_tf_load().
      
      * Add IDE_TFLAG_OUT_* taskfile flags to indicate the need to load
        particular IDE taskfile registers in ide_tf_load().
      
      * Update do_rw_taskfile() and ide_tf_load() users to set respective
        IDE_TFLAG_OUT_* taksfile flags.
      
      * Add task_dma_ok() helper.
      
      * Use IDE_TFLAG_FLAGGED taskfile flag to select HIHI mask in ide_tf_load().
      
      * Use do_rw_taskfile() in flagged_taskfile().
      
      * Remove no longer needed 'tf_out_flags' field from ide_task_t.
      
      There should be no functionality changes caused by this patch.
      
      Cc: Tejun Heo <htejun@gmail.com>
      Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      74095a91
    • Bartlomiej Zolnierkiewicz's avatar
      ide: add struct ide_taskfile (take 2) · 650d841d
      Bartlomiej Zolnierkiewicz authored
      
      
      * Don't set write-only ide_task_t.hobRegister[6] and ide_task_t.hobRegister[7]
        in idedisk_set_max_address_ext().
      
      * Add struct ide_taskfile and use it in ide_task_t instead of tfRegister[]
        and hobRegister[].
      
      * Remove no longer needed IDE_CONTROL_OFFSET_HOB define.
      
      * Add #ifndef/#endif __KERNEL__ around definitions of {task,hob}_struct_t.
      
      While at it:
      
      * Use ATA_LBA define for LBA bit (0x40) as suggested by Tejun Heo.
      
      v2:
      * Add missing newlines. (Noticed by Sergei)
      
      * Use ~ATA_LBA instead of 0xBF. (Noticed by Sergei)
      
      * Use unnamed unions for error/feature and status/command.
        (Suggested by Sergei).
      
      There should be no functionality changes caused by this patch.
      Acked-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
      Cc: Tejun Heo <htejun@gmail.com>
      Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      650d841d
    • Aristeu Rozanski's avatar
      ide-io: set REQ_FAILED when drive is dead · b5e1a4e2
      Aristeu Rozanski authored
      
      
      Currently it's possible to ide-cd to set an incorrect blocksize by
      reading garbage if the drive is dead:
      
      ide_cd_probe()
       -> cdrom_read_toc()
           -> cdrom_read_capacity()
               -> cdrom_queue_packet_command()
                   -> ide_do_drive_cmd()
                       -> ide_do_request()
                           -> start_request()
      
      on start_request():
      
              /* bail early if we've exceeded max_failures */
              if (drive->max_failures && (drive->failures > drive->max_failures)) {
                      goto kill_rq;
              }
      (...)
      kill_rq:
              ide_kill_rq(drive, rq);
              return ide_stopped;
      
      ide_kill_rq() and the next calls won't set REQ_FAILED on rq->cmd_flags and thus
      cdrom_queue_packet_command() won't return an error. then:
      
              stat = cdrom_queue_packet_command(drive, &req);
              if (stat == 0) {
                      *capacity = 1 + be32_to_cpu(capbuf.lba);
                      *sectors_per_frame =
                              be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS;
              }
      
      cdrom_read_capacity() ends believing capbuf is valid but in fact it's just
      uninitialized data. back to cdrom_read_toc():
      
              /* Try to get the total cdrom capacity and sector size. */
              stat = cdrom_read_capacity(drive, &toc->capacity, &sectors_per_frame,
                                         sense);
              if (stat)
                      toc->capacity = 0x1fffff;
      
              set_capacity(info->disk, toc->capacity * sectors_per_frame);
              /* Save a private copy of te TOC capacity for error handling */
              drive->probed_capacity = toc->capacity * sectors_per_frame;
      
              blk_queue_hardsect_size(drive->queue,
                                      sectors_per_frame << SECTOR_BITS);
      
      that will set drive->queue->hardsect_size to be the random value.
      hardsect_size is used to calculate inode->i_blkbits. later on, on a read
      path:
      
      void create_empty_buffers(struct page *page,
                              unsigned long blocksize, unsigned long b_state)
      {       
              struct buffer_head *bh, *head, *tail;
      
              head = alloc_page_buffers(page, blocksize, 1);
              bh = head;
              do {    
                      bh->b_state |= b_state;
                      tail = bh;
                      bh = bh->b_this_page;
              } while (bh);
              tail->b_this_page = head;
      
      alloc_page_buffers() will return NULL if blocksize > 4096. blocksize is
      calculed based on inode->i_blkbits. that will trigger a null
      dereference on create_empty_buffers().
      Signed-off-by: default avatarAristeu Rozanski <arozansk@redhat.com>
      Cc: Borislav Petkov <bbpetkov@yahoo.de>
      Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      b5e1a4e2
  2. 12 Dec, 2007 1 commit
  3. 13 Nov, 2007 1 commit
  4. 05 Nov, 2007 2 commits
  5. 19 Oct, 2007 3 commits
  6. 18 Oct, 2007 1 commit
  7. 16 Oct, 2007 3 commits
  8. 13 Oct, 2007 1 commit
    • Bartlomiej Zolnierkiewicz's avatar
      ide-pmac: remove pmac_ide_do_setfeature() (take 2) · aedea591
      Bartlomiej Zolnierkiewicz authored
      
      
      Use ide_config_drive_speed() instead of pmac_ide_do_setfeature() and remove
      the latter, also  ide-iops.c::__ide_wait_stat() could be static again.
      
      Since for IDE PMAC host driver IDE_CONTROL_REG is always true, device's
      ->quirk_list is always zero and ->ide_dma_host_{on,off} are nops than
      the only changes in behavior are:
      
      * if PIO mode is set then ->dma_off_queitly is called to disable DMA
      
      * if setting transfer mode fails ide_dump_status() is called to dump status
      
      v2:
      * IDE PMAC controllers allow separate PIO and DMA timings and PPC userland
        depends on this fact, and calls "hdparm -p" without calling "hdparm -d".
      
        Therefore to compensate for DMA being disabled by ide_config_drive_speed()
        for PIO modes:
      
        - add IDE_HFLAG_SET_PIO_MODE_KEEP_DMA flag and set it in PMAC host driver
      
        - add handling of the new flag to ide-io.c::do_special()
      
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      aedea591
  9. 11 Oct, 2007 1 commit
    • Bartlomiej Zolnierkiewicz's avatar
      ide: add ide_set{_max}_pio() (take 4) · 26bcb879
      Bartlomiej Zolnierkiewicz authored
      
      
      * Add IDE_HFLAG_ABUSE_{PREFETCH,FAST_DEVSEL,DMA_MODES} flags
        and set them in ht6560, cmd640, cmd64x and sc1200 host drivers.
      
      * Add set_pio_mode_abuse() for checking if host driver has a non-standard
        ->tuneproc() implementation and use it in do_special().
      
      * Add ide_set_pio() for setting PIO mode (it uses hwif->pio_mask to find
        the maximum PIO mode supported by the host), also add ide_set_max_pio()
        wrapper for ide_set_pio() to use for auto-tuning.  Convert users of
        ->tuneproc to use ide_set{_max}_pio() where possible.  This leaves only
        do_special(), set_using_pio(), ide_hwif_restore() and ide_set_pio() as
        a direct users of ->tuneproc.
      
      * Remove no longer needed ide_get_best_pio_mode() calls and printk-s
        reporting PIO mode selected from ->tuneproc implementations.
      
      * Rename ->tuneproc hook to ->set_pio_mode and make 'pio' argument const.
      
      * Remove stale comment from ide_config_drive_speed().
      
      v2:
      * Fix "ata_" prefix (Noticed by Jeff).
      
      v3:
      * Minor cleanups/fixups per Sergei's suggestions.
      
      v4:
      * Fix compile problem in drivers/ide/pci/cmd640.c
        (Noticed by Andrew Morton).
      
      * Improve some ->set_pio_mode comments.
      Reviewed-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
      Cc: Jeff Garzik <jeff@garzik.org>
      Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      26bcb879
  10. 24 Jul, 2007 1 commit
  11. 19 Jul, 2007 2 commits
  12. 09 Jul, 2007 2 commits
  13. 15 May, 2007 1 commit
  14. 09 May, 2007 1 commit
  15. 10 Apr, 2007 1 commit
    • Suleiman Souhlal's avatar
      ide: correctly prevent IDE timer expiry function to run if request was already handled · 23450319
      Suleiman Souhlal authored
      
      
      It is possible for the timer expiry function to run even though the
      request has already been handled: ide_timer_expiry() only checks that
      the handler is not NULL, but it is possible that we have handled a
      request (thus clearing the handler) and then started a new request
      (thus starting the timer again, and setting a handler). 
      
      A simple way to exhibit this is to set the DMA timeout to 1 jiffy and
      run dd: The kernel will panic after a few minutes because
      ide_timer_expiry() tries to add a timer when it's already active.
      
      To fix this, we simply add a request generation count that gets
      incremented at every interrupt, and check in ide_timer_expiry() that
      we have not already handled a new interrupt before running the expiry
      function.
      Signed-off-by: default avatarSuleiman Souhlal <suleiman@google.com>
      Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      23450319
  16. 26 Mar, 2007 1 commit
    • Suleiman Souhlal's avatar
      ide: use correct IDE error recovery · 513daadd
      Suleiman Souhlal authored
      
      
      IDE error recovery is using IDLE IMMEDIATE if the drive is busy or has DRQ set.
      This violates the ATA spec (can only send IDLE IMMEDIATE when drive is not
      busy) and really hoses up some drives (modern drives will not be able to
      recover using this error handling).  The correct thing to do is issue a SRST
      followed by a SET FEATURES command.  This is what Western Digital recommends
      for error recovery and what Western Digital says Windows does.  It also does
      not violate the ATA spec as far as I can tell.
      
      Bart:
      * port the patch over the current tree
      * undo the recalibration code removal
      * send SET FEATURES command after checking for good drive status
      * don't check whether the current request is of REQ_TYPE_ATA_{CMD,TASK}
        type because we need to send SET FEATURES before handling any requests
      * some pre-ATA4 drives require INITIALIZE DEVICE PARAMETERS command before
        other commands (except IDENTIFY) so send SET FEATURES only if there are
        no pending drive->special requests
      * update comments and patch description
      * any bugs introduced by this patch are mine and not Suleiman's :-)
      Signed-off-by: default avatarSuleiman Souhlal <suleiman@google.com>
      Acked-by: default avatarAlan Cox <alan@redhat.com>
      Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      513daadd
  17. 16 Feb, 2007 3 commits
    • Bartlomiej Zolnierkiewicz's avatar
      ide: make ide_hwif_t.ide_dma_{host_off,off_quietly} void (v2) · 7469aaf6
      Bartlomiej Zolnierkiewicz authored
      
      
      * since ide_hwif_t.ide_dma_{host_off,off_quietly} always return '0'
        make these functions void and while at it drop "ide_" prefix
      * fix comment for __ide_dma_off_quietly()
      * make __ide_dma_{host_off,off_quietly,off}() void and drop "__" prefix
      
      v2:
      * while at it rename atiixp_ide_dma_host_off() to atiixp_dma_host_off(),
        sgiioc4_ide_dma_{host_off,off_quietly}() to sgiioc4_dma_{host_off,off_quietly}()
        and sl82c105_ide_dma_off_quietly() to sl82c105_dma_off_quietly()
        [ Noticed by Sergei Shtylyov <sshtylyov@ru.mvista.com>. ]
      Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      7469aaf6
    • Bartlomiej Zolnierkiewicz's avatar
      ide: add ide_set_dma() helper (v2) · 3608b5d7
      Bartlomiej Zolnierkiewicz authored
      
      
      * add ide_set_dma() helper and make ide_hwif_t.ide_dma_check return
        -1 when DMA needs to be disabled (== need to call ->ide_dma_off_quietly)
         0 when DMA needs to be enabled  (== need to call ->ide_dma_on)
         1 when DMA setting shouldn't be changed
      * fix IDE code to use ide_set_dma() instead if using ->ide_dma_check directly
      
      v2:
      * updated for scc_pata
      Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      3608b5d7
    • Albert Lee's avatar
      ide: clear bmdma status in ide_intr() for ICHx controllers (revised #4) · f0dd8712
      Albert Lee authored
      
      
      patch 1/2 (revised):
      - Fix drive->waiting_for_dma to work with CDB-intr devices.
      - Do the dma status clearing in ide_intr() and add a new
        hwif->ide_dma_clear_irq for Intel ICHx controllers.
      
      Revised per Alan, Sergei and Bart's advice.
      
      Patch against 2.6.20-rc6. Tested ok on my ICH4 and pdc20275 adapters.
      Please review/apply, thanks.
      Signed-off-by: default avatarAlbert Lee <albertcc@tw.ibm.com>
      Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Cc: "Adam W. Hawks" <awhawks@us.ibm.com>
      Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      f0dd8712
  18. 05 Oct, 2006 1 commit
    • David Howells's avatar
      IRQ: Maintain regs pointer globally rather than passing to IRQ handlers · 7d12e780
      David Howells authored
      
      
      Maintain a per-CPU global "struct pt_regs *" variable which can be used instead
      of passing regs around manually through all ~1800 interrupt handlers in the
      Linux kernel.
      
      The regs pointer is used in few places, but it potentially costs both stack
      space and code to pass it around.  On the FRV arch, removing the regs parameter
      from all the genirq function results in a 20% speed up of the IRQ exit path
      (ie: from leaving timer_interrupt() to leaving do_IRQ()).
      
      Where appropriate, an arch may override the generic storage facility and do
      something different with the variable.  On FRV, for instance, the address is
      maintained in GR28 at all times inside the kernel as part of general exception
      handling.
      
      Having looked over the code, it appears that the parameter may be handed down
      through up to twenty or so layers of functions.  Consider a USB character
      device attached to a USB hub, attached to a USB controller that posts its
      interrupts through a cascaded auxiliary interrupt controller.  A character
      device driver may want to pass regs to the sysrq handler through the input
      layer which adds another few layers of parameter passing.
      
      I've build this code with allyesconfig for x86_64 and i386.  I've runtested the
      main part of the code on FRV and i386, though I can't test most of the drivers.
      I've also done partial conversion for powerpc and MIPS - these at least compile
      with minimal configurations.
      
      This will affect all archs.  Mostly the changes should be relatively easy.
      Take do_IRQ(), store the regs pointer at the beginning, saving the old one:
      
      	struct pt_regs *old_regs = set_irq_regs(regs);
      
      And put the old one back at the end:
      
      	set_irq_regs(old_regs);
      
      Don't pass regs through to generic_handle_irq() or __do_IRQ().
      
      In timer_interrupt(), this sort of change will be necessary:
      
      	-	update_process_times(user_mode(regs));
      	-	profile_tick(CPU_PROFILING, regs);
      	+	update_process_times(user_mode(get_irq_regs()));
      	+	profile_tick(CPU_PROFILING);
      
      I'd like to move update_process_times()'s use of get_irq_regs() into itself,
      except that i386, alone of the archs, uses something other than user_mode().
      
      Some notes on the interrupt handling in the drivers:
      
       (*) input_dev() is now gone entirely.  The regs pointer is no longer stored in
           the input_dev struct.
      
       (*) finish_unlinks() in drivers/usb/host/ohci-q.c needs checking.  It does
           something different depending on whether it's been supplied with a regs
           pointer or not.
      
       (*) Various IRQ handler function pointers have been moved to type
           irq_handler_t.
      Signed-Off-By: default avatarDavid Howells <dhowells@redhat.com>
      (cherry picked from 1b16e7ac850969f38b375e511e3fa2f474a33867 commit)
      7d12e780
  19. 03 Oct, 2006 2 commits
    • Jason Lunz's avatar
      [PATCH] ide: reprogram disk pio timings on resume · 8c2c0118
      Jason Lunz authored
      
      
      Add a step to the IDE PM state machine that reprograms disk PIO timings
      as the first step on resume. This prevents ide deadlock on
      resume-from-ram on my nforce3-based laptop.
      
      An earlier implementation was written entirely within the amd74xx ide
      driver, but Alan helpfully pointed out that this is the correct thing to
      do globally. Still, I'm only calling hwif->tuneproc() for disks, based
      on two things:
      
       - The existing state machine is already passed over for non-disk drives
       - Previous testing on my laptop shows that the hangs are related only
         to the disk - suspend/resume from a livecd showed that there's no
         need for this on the cdrom.
      Signed-off-by: default avatarJason Lunz <lunz@falooley.org>
      Cc: Bartlomiej Zolnierkiewicz <B.Zolnierkiewicz@elka.pw.edu.pl>
      Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
      Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
      Cc: Pavel Machek <pavel@ucw.cz>
      Cc: Brad Campbell <brad@wasp.net.au>
      Cc: David Brownell <david-b@pacbell.net>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
      8c2c0118
    • Hua Zhong's avatar
      [PATCH] IDE error handling fixes · ce42f191
      Hua Zhong authored
      
      
      In 2.6.15.1 I encountered some IDE crashes when unplugging IDE cables to
      emulate disk errors.  Below is a patch against 2.6.16 which I think still
      applies.
      
      1.  The first BUG_ON could trigger when a PREFLUSH IO fails (it would
         fail the original barrier request which hasn't been marked REQ_STARTED
         yet).
      
      2. the rq could have been dequeued already (same as 1).
      
      3.  HWGROUP(drive)->rq could be NULL because of the ide_error() several
         lines earlier.
      Signed-off-by: default avatarHua Zhong <hzhong@gmail.com>
      Cc: Bartlomiej Zolnierkiewicz <B.Zolnierkiewicz@elka.pw.edu.pl>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
      ce42f191
  20. 30 Sep, 2006 3 commits
  21. 03 Jul, 2006 2 commits
  22. 30 Jun, 2006 1 commit