Merge git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6: (95 commits) ide-tape: remove idetape_config_t typedef ide-tape: remove mtio.h related comments ide-tape: make function name more accurate ide-tape: remove unused sense packet commands. ide-tape: use generic byteorder macros ide-tape: remove EXPERIMENTAL driver status ide-tape: use generic scsi commands ide-tape: remove struct idetape_block_size_page_t ide-tape: remove structs os_partition_t, os_dat_entry_t, os_dat_t ide-tape: remove struct idetape_parameter_block_descriptor_t ide-tape: remove struct idetape_medium_partition_page_t ide-tape: remove struct idetape_data_compression_page_t ide-tape: remove struct idetape_inquiry_result_t ide-tape: remove struct idetape_capabilities_page_t ide-tape: remove IDETAPE_DEBUG_BUGS ide-tape: remove IDETAPE_DEBUG_INFO ide-tape: dump gcw fields on error in idetape_identify_device() ide-tape: remove struct idetape_mode_parameter_header_t ide-tape: remove struct idetape_request_sense_result_t ide-tape: remove dead code ...
This commit is contained in:
commit
9135f1901e
77 changed files with 1985 additions and 2845 deletions
257
Documentation/ide/ChangeLog.ide-tape.1995-2002
Normal file
257
Documentation/ide/ChangeLog.ide-tape.1995-2002
Normal file
|
@ -0,0 +1,257 @@
|
|||
/*
|
||||
* Ver 0.1 Nov 1 95 Pre-working code :-)
|
||||
* Ver 0.2 Nov 23 95 A short backup (few megabytes) and restore procedure
|
||||
* was successful ! (Using tar cvf ... on the block
|
||||
* device interface).
|
||||
* A longer backup resulted in major swapping, bad
|
||||
* overall Linux performance and eventually failed as
|
||||
* we received non serial read-ahead requests from the
|
||||
* buffer cache.
|
||||
* Ver 0.3 Nov 28 95 Long backups are now possible, thanks to the
|
||||
* character device interface. Linux's responsiveness
|
||||
* and performance doesn't seem to be much affected
|
||||
* from the background backup procedure.
|
||||
* Some general mtio.h magnetic tape operations are
|
||||
* now supported by our character device. As a result,
|
||||
* popular tape utilities are starting to work with
|
||||
* ide tapes :-)
|
||||
* The following configurations were tested:
|
||||
* 1. An IDE ATAPI TAPE shares the same interface
|
||||
* and irq with an IDE ATAPI CDROM.
|
||||
* 2. An IDE ATAPI TAPE shares the same interface
|
||||
* and irq with a normal IDE disk.
|
||||
* Both configurations seemed to work just fine !
|
||||
* However, to be on the safe side, it is meanwhile
|
||||
* recommended to give the IDE TAPE its own interface
|
||||
* and irq.
|
||||
* The one thing which needs to be done here is to
|
||||
* add a "request postpone" feature to ide.c,
|
||||
* so that we won't have to wait for the tape to finish
|
||||
* performing a long media access (DSC) request (such
|
||||
* as a rewind) before we can access the other device
|
||||
* on the same interface. This effect doesn't disturb
|
||||
* normal operation most of the time because read/write
|
||||
* requests are relatively fast, and once we are
|
||||
* performing one tape r/w request, a lot of requests
|
||||
* from the other device can be queued and ide.c will
|
||||
* service all of them after this single tape request.
|
||||
* Ver 1.0 Dec 11 95 Integrated into Linux 1.3.46 development tree.
|
||||
* On each read / write request, we now ask the drive
|
||||
* if we can transfer a constant number of bytes
|
||||
* (a parameter of the drive) only to its buffers,
|
||||
* without causing actual media access. If we can't,
|
||||
* we just wait until we can by polling the DSC bit.
|
||||
* This ensures that while we are not transferring
|
||||
* more bytes than the constant referred to above, the
|
||||
* interrupt latency will not become too high and
|
||||
* we won't cause an interrupt timeout, as happened
|
||||
* occasionally in the previous version.
|
||||
* While polling for DSC, the current request is
|
||||
* postponed and ide.c is free to handle requests from
|
||||
* the other device. This is handled transparently to
|
||||
* ide.c. The hwgroup locking method which was used
|
||||
* in the previous version was removed.
|
||||
* Use of new general features which are provided by
|
||||
* ide.c for use with atapi devices.
|
||||
* (Programming done by Mark Lord)
|
||||
* Few potential bug fixes (Again, suggested by Mark)
|
||||
* Single character device data transfers are now
|
||||
* not limited in size, as they were before.
|
||||
* We are asking the tape about its recommended
|
||||
* transfer unit and send a larger data transfer
|
||||
* as several transfers of the above size.
|
||||
* For best results, use an integral number of this
|
||||
* basic unit (which is shown during driver
|
||||
* initialization). I will soon add an ioctl to get
|
||||
* this important parameter.
|
||||
* Our data transfer buffer is allocated on startup,
|
||||
* rather than before each data transfer. This should
|
||||
* ensure that we will indeed have a data buffer.
|
||||
* Ver 1.1 Dec 14 95 Fixed random problems which occurred when the tape
|
||||
* shared an interface with another device.
|
||||
* (poll_for_dsc was a complete mess).
|
||||
* Removed some old (non-active) code which had
|
||||
* to do with supporting buffer cache originated
|
||||
* requests.
|
||||
* The block device interface can now be opened, so
|
||||
* that general ide driver features like the unmask
|
||||
* interrupts flag can be selected with an ioctl.
|
||||
* This is the only use of the block device interface.
|
||||
* New fast pipelined operation mode (currently only on
|
||||
* writes). When using the pipelined mode, the
|
||||
* throughput can potentially reach the maximum
|
||||
* tape supported throughput, regardless of the
|
||||
* user backup program. On my tape drive, it sometimes
|
||||
* boosted performance by a factor of 2. Pipelined
|
||||
* mode is enabled by default, but since it has a few
|
||||
* downfalls as well, you may want to disable it.
|
||||
* A short explanation of the pipelined operation mode
|
||||
* is available below.
|
||||
* Ver 1.2 Jan 1 96 Eliminated pipelined mode race condition.
|
||||
* Added pipeline read mode. As a result, restores
|
||||
* are now as fast as backups.
|
||||
* Optimized shared interface behavior. The new behavior
|
||||
* typically results in better IDE bus efficiency and
|
||||
* higher tape throughput.
|
||||
* Pre-calculation of the expected read/write request
|
||||
* service time, based on the tape's parameters. In
|
||||
* the pipelined operation mode, this allows us to
|
||||
* adjust our polling frequency to a much lower value,
|
||||
* and thus to dramatically reduce our load on Linux,
|
||||
* without any decrease in performance.
|
||||
* Implemented additional mtio.h operations.
|
||||
* The recommended user block size is returned by
|
||||
* the MTIOCGET ioctl.
|
||||
* Additional minor changes.
|
||||
* Ver 1.3 Feb 9 96 Fixed pipelined read mode bug which prevented the
|
||||
* use of some block sizes during a restore procedure.
|
||||
* The character device interface will now present a
|
||||
* continuous view of the media - any mix of block sizes
|
||||
* during a backup/restore procedure is supported. The
|
||||
* driver will buffer the requests internally and
|
||||
* convert them to the tape's recommended transfer
|
||||
* unit, making performance almost independent of the
|
||||
* chosen user block size.
|
||||
* Some improvements in error recovery.
|
||||
* By cooperating with ide-dma.c, bus mastering DMA can
|
||||
* now sometimes be used with IDE tape drives as well.
|
||||
* Bus mastering DMA has the potential to dramatically
|
||||
* reduce the CPU's overhead when accessing the device,
|
||||
* and can be enabled by using hdparm -d1 on the tape's
|
||||
* block device interface. For more info, read the
|
||||
* comments in ide-dma.c.
|
||||
* Ver 1.4 Mar 13 96 Fixed serialize support.
|
||||
* Ver 1.5 Apr 12 96 Fixed shared interface operation, broken in 1.3.85.
|
||||
* Fixed pipelined read mode inefficiency.
|
||||
* Fixed nasty null dereferencing bug.
|
||||
* Ver 1.6 Aug 16 96 Fixed FPU usage in the driver.
|
||||
* Fixed end of media bug.
|
||||
* Ver 1.7 Sep 10 96 Minor changes for the CONNER CTT8000-A model.
|
||||
* Ver 1.8 Sep 26 96 Attempt to find a better balance between good
|
||||
* interactive response and high system throughput.
|
||||
* Ver 1.9 Nov 5 96 Automatically cross encountered filemarks rather
|
||||
* than requiring an explicit FSF command.
|
||||
* Abort pending requests at end of media.
|
||||
* MTTELL was sometimes returning incorrect results.
|
||||
* Return the real block size in the MTIOCGET ioctl.
|
||||
* Some error recovery bug fixes.
|
||||
* Ver 1.10 Nov 5 96 Major reorganization.
|
||||
* Reduced CPU overhead a bit by eliminating internal
|
||||
* bounce buffers.
|
||||
* Added module support.
|
||||
* Added multiple tape drives support.
|
||||
* Added partition support.
|
||||
* Rewrote DSC handling.
|
||||
* Some portability fixes.
|
||||
* Removed ide-tape.h.
|
||||
* Additional minor changes.
|
||||
* Ver 1.11 Dec 2 96 Bug fix in previous DSC timeout handling.
|
||||
* Use ide_stall_queue() for DSC overlap.
|
||||
* Use the maximum speed rather than the current speed
|
||||
* to compute the request service time.
|
||||
* Ver 1.12 Dec 7 97 Fix random memory overwriting and/or last block data
|
||||
* corruption, which could occur if the total number
|
||||
* of bytes written to the tape was not an integral
|
||||
* number of tape blocks.
|
||||
* Add support for INTERRUPT DRQ devices.
|
||||
* Ver 1.13 Jan 2 98 Add "speed == 0" work-around for HP COLORADO 5GB
|
||||
* Ver 1.14 Dec 30 98 Partial fixes for the Sony/AIWA tape drives.
|
||||
* Replace cli()/sti() with hwgroup spinlocks.
|
||||
* Ver 1.15 Mar 25 99 Fix SMP race condition by replacing hwgroup
|
||||
* spinlock with private per-tape spinlock.
|
||||
* Ver 1.16 Sep 1 99 Add OnStream tape support.
|
||||
* Abort read pipeline on EOD.
|
||||
* Wait for the tape to become ready in case it returns
|
||||
* "in the process of becoming ready" on open().
|
||||
* Fix zero padding of the last written block in
|
||||
* case the tape block size is larger than PAGE_SIZE.
|
||||
* Decrease the default disconnection time to tn.
|
||||
* Ver 1.16e Oct 3 99 Minor fixes.
|
||||
* Ver 1.16e1 Oct 13 99 Patches by Arnold Niessen,
|
||||
* niessen@iae.nl / arnold.niessen@philips.com
|
||||
* GO-1) Undefined code in idetape_read_position
|
||||
* according to Gadi's email
|
||||
* AJN-1) Minor fix asc == 11 should be asc == 0x11
|
||||
* in idetape_issue_packet_command (did effect
|
||||
* debugging output only)
|
||||
* AJN-2) Added more debugging output, and
|
||||
* added ide-tape: where missing. I would also
|
||||
* like to add tape->name where possible
|
||||
* AJN-3) Added different debug_level's
|
||||
* via /proc/ide/hdc/settings
|
||||
* "debug_level" determines amount of debugging output;
|
||||
* can be changed using /proc/ide/hdx/settings
|
||||
* 0 : almost no debugging output
|
||||
* 1 : 0+output errors only
|
||||
* 2 : 1+output all sensekey/asc
|
||||
* 3 : 2+follow all chrdev related procedures
|
||||
* 4 : 3+follow all procedures
|
||||
* 5 : 4+include pc_stack rq_stack info
|
||||
* 6 : 5+USE_COUNT updates
|
||||
* AJN-4) Fixed timeout for retension in idetape_queue_pc_tail
|
||||
* from 5 to 10 minutes
|
||||
* AJN-5) Changed maximum number of blocks to skip when
|
||||
* reading tapes with multiple consecutive write
|
||||
* errors from 100 to 1000 in idetape_get_logical_blk
|
||||
* Proposed changes to code:
|
||||
* 1) output "logical_blk_num" via /proc
|
||||
* 2) output "current_operation" via /proc
|
||||
* 3) Either solve or document the fact that `mt rewind' is
|
||||
* required after reading from /dev/nhtx to be
|
||||
* able to rmmod the idetape module;
|
||||
* Also, sometimes an application finishes but the
|
||||
* device remains `busy' for some time. Same cause ?
|
||||
* Proposed changes to release-notes:
|
||||
* 4) write a simple `quickstart' section in the
|
||||
* release notes; I volunteer if you don't want to
|
||||
* 5) include a pointer to video4linux in the doc
|
||||
* to stimulate video applications
|
||||
* 6) release notes lines 331 and 362: explain what happens
|
||||
* if the application data rate is higher than 1100 KB/s;
|
||||
* similar approach to lower-than-500 kB/s ?
|
||||
* 7) 6.6 Comparison; wouldn't it be better to allow different
|
||||
* strategies for read and write ?
|
||||
* Wouldn't it be better to control the tape buffer
|
||||
* contents instead of the bandwidth ?
|
||||
* 8) line 536: replace will by would (if I understand
|
||||
* this section correctly, a hypothetical and unwanted situation
|
||||
* is being described)
|
||||
* Ver 1.16f Dec 15 99 Change place of the secondary OnStream header frames.
|
||||
* Ver 1.17 Nov 2000 / Jan 2001 Marcel Mol, marcel@mesa.nl
|
||||
* - Add idetape_onstream_mode_sense_tape_parameter_page
|
||||
* function to get tape capacity in frames: tape->capacity.
|
||||
* - Add support for DI-50 drives( or any DI- drive).
|
||||
* - 'workaround' for read error/blank block around block 3000.
|
||||
* - Implement Early warning for end of media for Onstream.
|
||||
* - Cosmetic code changes for readability.
|
||||
* - Idetape_position_tape should not use SKIP bit during
|
||||
* Onstream read recovery.
|
||||
* - Add capacity, logical_blk_num and first/last_frame_position
|
||||
* to /proc/ide/hd?/settings.
|
||||
* - Module use count was gone in the Linux 2.4 driver.
|
||||
* Ver 1.17a Apr 2001 Willem Riede osst@riede.org
|
||||
* - Get drive's actual block size from mode sense block descriptor
|
||||
* - Limit size of pipeline
|
||||
* Ver 1.17b Oct 2002 Alan Stern <stern@rowland.harvard.edu>
|
||||
* Changed IDETAPE_MIN_PIPELINE_STAGES to 1 and actually used
|
||||
* it in the code!
|
||||
* Actually removed aborted stages in idetape_abort_pipeline
|
||||
* instead of just changing the command code.
|
||||
* Made the transfer byte count for Request Sense equal to the
|
||||
* actual length of the data transfer.
|
||||
* Changed handling of partial data transfers: they do not
|
||||
* cause DMA errors.
|
||||
* Moved initiation of DMA transfers to the correct place.
|
||||
* Removed reference to unallocated memory.
|
||||
* Made __idetape_discard_read_pipeline return the number of
|
||||
* sectors skipped, not the number of stages.
|
||||
* Replaced errant kfree() calls with __idetape_kfree_stage().
|
||||
* Fixed off-by-one error in testing the pipeline length.
|
||||
* Fixed handling of filemarks in the read pipeline.
|
||||
* Small code optimization for MTBSF and MTBSFM ioctls.
|
||||
* Don't try to unlock the door during device close if is
|
||||
* already unlocked!
|
||||
* Cosmetic fixes to miscellaneous debugging output messages.
|
||||
* Set the minimum /proc/ide/hd?/settings values for "pipeline",
|
||||
* "pipeline_min", and "pipeline_max" to 1.
|
||||
*/
|
146
Documentation/ide/ide-tape.txt
Normal file
146
Documentation/ide/ide-tape.txt
Normal file
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
* IDE ATAPI streaming tape driver.
|
||||
*
|
||||
* This driver is a part of the Linux ide driver.
|
||||
*
|
||||
* The driver, in co-operation with ide.c, basically traverses the
|
||||
* request-list for the block device interface. The character device
|
||||
* interface, on the other hand, creates new requests, adds them
|
||||
* to the request-list of the block device, and waits for their completion.
|
||||
*
|
||||
* Pipelined operation mode is now supported on both reads and writes.
|
||||
*
|
||||
* The block device major and minor numbers are determined from the
|
||||
* tape's relative position in the ide interfaces, as explained in ide.c.
|
||||
*
|
||||
* The character device interface consists of the following devices:
|
||||
*
|
||||
* ht0 major 37, minor 0 first IDE tape, rewind on close.
|
||||
* ht1 major 37, minor 1 second IDE tape, rewind on close.
|
||||
* ...
|
||||
* nht0 major 37, minor 128 first IDE tape, no rewind on close.
|
||||
* nht1 major 37, minor 129 second IDE tape, no rewind on close.
|
||||
* ...
|
||||
*
|
||||
* The general magnetic tape commands compatible interface, as defined by
|
||||
* include/linux/mtio.h, is accessible through the character device.
|
||||
*
|
||||
* General ide driver configuration options, such as the interrupt-unmask
|
||||
* flag, can be configured by issuing an ioctl to the block device interface,
|
||||
* as any other ide device.
|
||||
*
|
||||
* Our own ide-tape ioctl's can be issued to either the block device or
|
||||
* the character device interface.
|
||||
*
|
||||
* Maximal throughput with minimal bus load will usually be achieved in the
|
||||
* following scenario:
|
||||
*
|
||||
* 1. ide-tape is operating in the pipelined operation mode.
|
||||
* 2. No buffering is performed by the user backup program.
|
||||
*
|
||||
* Testing was done with a 2 GB CONNER CTMA 4000 IDE ATAPI Streaming Tape Drive.
|
||||
*
|
||||
* Here are some words from the first releases of hd.c, which are quoted
|
||||
* in ide.c and apply here as well:
|
||||
*
|
||||
* | Special care is recommended. Have Fun!
|
||||
*
|
||||
*
|
||||
* An overview of the pipelined operation mode.
|
||||
*
|
||||
* In the pipelined write mode, we will usually just add requests to our
|
||||
* pipeline and return immediately, before we even start to service them. The
|
||||
* user program will then have enough time to prepare the next request while
|
||||
* we are still busy servicing previous requests. In the pipelined read mode,
|
||||
* the situation is similar - we add read-ahead requests into the pipeline,
|
||||
* before the user even requested them.
|
||||
*
|
||||
* The pipeline can be viewed as a "safety net" which will be activated when
|
||||
* the system load is high and prevents the user backup program from keeping up
|
||||
* with the current tape speed. At this point, the pipeline will get
|
||||
* shorter and shorter but the tape will still be streaming at the same speed.
|
||||
* Assuming we have enough pipeline stages, the system load will hopefully
|
||||
* decrease before the pipeline is completely empty, and the backup program
|
||||
* will be able to "catch up" and refill the pipeline again.
|
||||
*
|
||||
* When using the pipelined mode, it would be best to disable any type of
|
||||
* buffering done by the user program, as ide-tape already provides all the
|
||||
* benefits in the kernel, where it can be done in a more efficient way.
|
||||
* As we will usually not block the user program on a request, the most
|
||||
* efficient user code will then be a simple read-write-read-... cycle.
|
||||
* Any additional logic will usually just slow down the backup process.
|
||||
*
|
||||
* Using the pipelined mode, I get a constant over 400 KBps throughput,
|
||||
* which seems to be the maximum throughput supported by my tape.
|
||||
*
|
||||
* However, there are some downfalls:
|
||||
*
|
||||
* 1. We use memory (for data buffers) in proportional to the number
|
||||
* of pipeline stages (each stage is about 26 KB with my tape).
|
||||
* 2. In the pipelined write mode, we cheat and postpone error codes
|
||||
* to the user task. In read mode, the actual tape position
|
||||
* will be a bit further than the last requested block.
|
||||
*
|
||||
* Concerning (1):
|
||||
*
|
||||
* 1. We allocate stages dynamically only when we need them. When
|
||||
* we don't need them, we don't consume additional memory. In
|
||||
* case we can't allocate stages, we just manage without them
|
||||
* (at the expense of decreased throughput) so when Linux is
|
||||
* tight in memory, we will not pose additional difficulties.
|
||||
*
|
||||
* 2. The maximum number of stages (which is, in fact, the maximum
|
||||
* amount of memory) which we allocate is limited by the compile
|
||||
* time parameter IDETAPE_MAX_PIPELINE_STAGES.
|
||||
*
|
||||
* 3. The maximum number of stages is a controlled parameter - We
|
||||
* don't start from the user defined maximum number of stages
|
||||
* but from the lower IDETAPE_MIN_PIPELINE_STAGES (again, we
|
||||
* will not even allocate this amount of stages if the user
|
||||
* program can't handle the speed). We then implement a feedback
|
||||
* loop which checks if the pipeline is empty, and if it is, we
|
||||
* increase the maximum number of stages as necessary until we
|
||||
* reach the optimum value which just manages to keep the tape
|
||||
* busy with minimum allocated memory or until we reach
|
||||
* IDETAPE_MAX_PIPELINE_STAGES.
|
||||
*
|
||||
* Concerning (2):
|
||||
*
|
||||
* In pipelined write mode, ide-tape can not return accurate error codes
|
||||
* to the user program since we usually just add the request to the
|
||||
* pipeline without waiting for it to be serviced. In case an error
|
||||
* occurs, I will report it on the next user request.
|
||||
*
|
||||
* In the pipelined read mode, subsequent read requests or forward
|
||||
* filemark spacing will perform correctly, as we preserve all blocks
|
||||
* and filemarks which we encountered during our excess read-ahead.
|
||||
*
|
||||
* For accurate tape positioning and error reporting, disabling
|
||||
* pipelined mode might be the best option.
|
||||
*
|
||||
* You can enable/disable/tune the pipelined operation mode by adjusting
|
||||
* the compile time parameters below.
|
||||
*
|
||||
*
|
||||
* Possible improvements.
|
||||
*
|
||||
* 1. Support for the ATAPI overlap protocol.
|
||||
*
|
||||
* In order to maximize bus throughput, we currently use the DSC
|
||||
* overlap method which enables ide.c to service requests from the
|
||||
* other device while the tape is busy executing a command. The
|
||||
* DSC overlap method involves polling the tape's status register
|
||||
* for the DSC bit, and servicing the other device while the tape
|
||||
* isn't ready.
|
||||
*
|
||||
* In the current QIC development standard (December 1995),
|
||||
* it is recommended that new tape drives will *in addition*
|
||||
* implement the ATAPI overlap protocol, which is used for the
|
||||
* same purpose - efficient use of the IDE bus, but is interrupt
|
||||
* driven and thus has much less CPU overhead.
|
||||
*
|
||||
* ATAPI overlap is likely to be supported in most new ATAPI
|
||||
* devices, including new ATAPI cdroms, and thus provides us
|
||||
* a method by which we can achieve higher throughput when
|
||||
* sharing a (fast) ATA-2 disk with any (slow) new ATAPI device.
|
||||
*/
|
|
@ -216,8 +216,7 @@ config BLK_DEV_IDECD_VERBOSE_ERRORS
|
|||
memory, though.
|
||||
|
||||
config BLK_DEV_IDETAPE
|
||||
tristate "Include IDE/ATAPI TAPE support (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
tristate "Include IDE/ATAPI TAPE support"
|
||||
help
|
||||
If you have an IDE tape drive using the ATAPI protocol, say Y.
|
||||
ATAPI is a newer protocol used by IDE tape and CD-ROM drives,
|
||||
|
|
|
@ -28,8 +28,10 @@ static int __init
|
|||
bastide_register(unsigned int base, unsigned int aux, int irq,
|
||||
ide_hwif_t **hwif)
|
||||
{
|
||||
ide_hwif_t *hwif;
|
||||
hw_regs_t hw;
|
||||
int i;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
memset(&hw, 0, sizeof(hw));
|
||||
|
||||
|
@ -44,8 +46,24 @@ bastide_register(unsigned int base, unsigned int aux, int irq,
|
|||
hw.io_ports[IDE_CONTROL_OFFSET] = aux + (6 * 0x20);
|
||||
hw.irq = irq;
|
||||
|
||||
ide_register_hw(&hw, NULL, hwif);
|
||||
hwif = ide_deprecated_find_port(hw.io_ports[IDE_DATA_OFFSET]);
|
||||
if (hwif == NULL)
|
||||
goto out;
|
||||
|
||||
i = hwif->index;
|
||||
|
||||
if (hwif->present)
|
||||
ide_unregister(i, 0, 0);
|
||||
else if (!hwif->hold)
|
||||
ide_init_port_data(hwif, i);
|
||||
|
||||
ide_init_port_hw(hwif, &hw);
|
||||
hwif->quirkproc = NULL;
|
||||
|
||||
idx[0] = i;
|
||||
|
||||
ide_device_add(idx, NULL);
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -377,9 +377,6 @@ static void icside_dma_lost_irq(ide_drive_t *drive)
|
|||
|
||||
static void icside_dma_init(ide_hwif_t *hwif)
|
||||
{
|
||||
hwif->mwdma_mask = 7; /* MW0..2 */
|
||||
hwif->swdma_mask = 7; /* SW0..2 */
|
||||
|
||||
hwif->dmatable_cpu = NULL;
|
||||
hwif->dmatable_dma = 0;
|
||||
hwif->set_dma_mode = icside_set_dma_mode;
|
||||
|
@ -459,11 +456,19 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec)
|
|||
|
||||
idx[0] = hwif->index;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct ide_port_info icside_v6_port_info __initdata = {
|
||||
.host_flags = IDE_HFLAG_SERIALIZE |
|
||||
IDE_HFLAG_NO_DMA | /* no SFF-style DMA */
|
||||
IDE_HFLAG_NO_AUTOTUNE,
|
||||
.mwdma_mask = ATA_MWDMA2,
|
||||
.swdma_mask = ATA_SWDMA2,
|
||||
};
|
||||
|
||||
static int __init
|
||||
icside_register_v6(struct icside_state *state, struct expansion_card *ec)
|
||||
{
|
||||
|
@ -472,6 +477,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
|
|||
unsigned int sel = 0;
|
||||
int ret;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
struct ide_port_info d = icside_v6_port_info;
|
||||
|
||||
ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
|
||||
if (!ioc_base) {
|
||||
|
@ -521,30 +527,25 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
|
|||
state->hwif[1] = mate;
|
||||
|
||||
hwif->maskproc = icside_maskproc;
|
||||
hwif->channel = 0;
|
||||
hwif->hwif_data = state;
|
||||
hwif->mate = mate;
|
||||
hwif->serialized = 1;
|
||||
hwif->config_data = (unsigned long)ioc_base;
|
||||
hwif->select_data = sel;
|
||||
|
||||
mate->maskproc = icside_maskproc;
|
||||
mate->channel = 1;
|
||||
mate->hwif_data = state;
|
||||
mate->mate = hwif;
|
||||
mate->serialized = 1;
|
||||
mate->config_data = (unsigned long)ioc_base;
|
||||
mate->select_data = sel | 1;
|
||||
|
||||
if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) {
|
||||
icside_dma_init(hwif);
|
||||
icside_dma_init(mate);
|
||||
}
|
||||
} else
|
||||
d.mwdma_mask = d.swdma_mask = 0;
|
||||
|
||||
idx[0] = hwif->index;
|
||||
idx[1] = mate->index;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, &d);
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ static int __init ide_arm_init(void)
|
|||
ide_init_port_hw(hwif, &hw);
|
||||
idx[0] = hwif->index;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -58,7 +58,7 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
|
|||
|
||||
idx[0] = hwif->index;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
|
||||
ecard_set_drvdata(ec, hwif);
|
||||
goto out;
|
||||
|
@ -76,7 +76,7 @@ static void __devexit rapide_remove(struct expansion_card *ec)
|
|||
|
||||
ecard_set_drvdata(ec, NULL);
|
||||
|
||||
ide_unregister(hwif->index);
|
||||
ide_unregister(hwif->index, 0, 0);
|
||||
|
||||
ecard_release_resources(ec);
|
||||
}
|
||||
|
|
|
@ -753,6 +753,15 @@ static void cris_set_dma_mode(ide_drive_t *drive, const u8 speed)
|
|||
cris_ide_set_speed(TYPE_DMA, 0, strobe, hold);
|
||||
}
|
||||
|
||||
static const struct ide_port_info cris_port_info __initdata = {
|
||||
.chipset = ide_etrax100,
|
||||
.host_flags = IDE_HFLAG_NO_ATAPI_DMA |
|
||||
IDE_HFLAG_NO_DMA, /* no SFF-style DMA */
|
||||
.pio_mask = ATA_PIO4,
|
||||
.udma_mask = cris_ultra_mask,
|
||||
.mwdma_mask = ATA_MWDMA2,
|
||||
};
|
||||
|
||||
static int __init init_e100_ide(void)
|
||||
{
|
||||
hw_regs_t hw;
|
||||
|
@ -780,7 +789,6 @@ static int __init init_e100_ide(void)
|
|||
ide_init_port_data(hwif, hwif->index);
|
||||
ide_init_port_hw(hwif, &hw);
|
||||
hwif->mmio = 1;
|
||||
hwif->chipset = ide_etrax100;
|
||||
hwif->set_pio_mode = &cris_set_pio_mode;
|
||||
hwif->set_dma_mode = &cris_set_dma_mode;
|
||||
hwif->ata_input_data = &cris_ide_input_data;
|
||||
|
@ -799,12 +807,6 @@ static int __init init_e100_ide(void)
|
|||
hwif->INB = &cris_ide_inb;
|
||||
hwif->INW = &cris_ide_inw;
|
||||
hwif->cbl = ATA_CBL_PATA40;
|
||||
hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA;
|
||||
hwif->pio_mask = ATA_PIO4,
|
||||
hwif->drives[0].autotune = 1;
|
||||
hwif->drives[1].autotune = 1;
|
||||
hwif->ultra_mask = cris_ultra_mask;
|
||||
hwif->mwdma_mask = 0x07; /* Multiword DMA 0-2 */
|
||||
|
||||
idx[h] = hwif->index;
|
||||
}
|
||||
|
@ -820,7 +822,7 @@ static int __init init_e100_ide(void)
|
|||
cris_ide_set_speed(TYPE_DMA, 0, ATA_DMA2_STROBE, ATA_DMA2_HOLD);
|
||||
cris_ide_set_speed(TYPE_UDMA, ATA_UDMA2_CYC, ATA_UDMA2_DVS, 0);
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, &cris_port_info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1032,11 +1034,7 @@ static int cris_dma_setup(ide_drive_t *drive)
|
|||
|
||||
static void cris_dma_exec_cmd(ide_drive_t *drive, u8 command)
|
||||
{
|
||||
/* set the irq handler which will finish the request when DMA is done */
|
||||
ide_set_handler(drive, &cris_dma_intr, WAIT_CMD, NULL);
|
||||
|
||||
/* issue cmd to drive */
|
||||
cris_ide_outb(command, IDE_COMMAND_REG);
|
||||
ide_execute_command(drive, command, &cris_dma_intr, WAIT_CMD, NULL);
|
||||
}
|
||||
|
||||
static void cris_dma_start(ide_drive_t *drive)
|
||||
|
|
|
@ -114,7 +114,7 @@ static int __init h8300_ide_init(void)
|
|||
|
||||
idx[0] = index;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -39,7 +39,6 @@ struct GTM_buffer {
|
|||
};
|
||||
|
||||
struct ide_acpi_drive_link {
|
||||
ide_drive_t *drive;
|
||||
acpi_handle obj_handle;
|
||||
u8 idbuff[512];
|
||||
};
|
||||
|
@ -280,16 +279,6 @@ static int do_drive_get_GTF(ide_drive_t *drive,
|
|||
|
||||
port = hwif->channel ? drive->dn - 2: drive->dn;
|
||||
|
||||
if (!drive->acpidata) {
|
||||
if (port == 0) {
|
||||
drive->acpidata = &hwif->acpidata->master;
|
||||
hwif->acpidata->master.drive = drive;
|
||||
} else {
|
||||
drive->acpidata = &hwif->acpidata->slave;
|
||||
hwif->acpidata->slave.drive = drive;
|
||||
}
|
||||
}
|
||||
|
||||
DEBPRINT("ENTER: %s at %s, port#: %d, hard_port#: %d\n",
|
||||
hwif->name, dev->bus_id, port, hwif->channel);
|
||||
|
||||
|
@ -494,7 +483,6 @@ int ide_acpi_exec_tfs(ide_drive_t *drive)
|
|||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ide_acpi_exec_tfs);
|
||||
|
||||
/**
|
||||
* ide_acpi_get_timing - get the channel (controller) timings
|
||||
|
@ -580,7 +568,6 @@ void ide_acpi_get_timing(ide_hwif_t *hwif)
|
|||
|
||||
kfree(output.pointer);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ide_acpi_get_timing);
|
||||
|
||||
/**
|
||||
* ide_acpi_push_timing - set the channel (controller) timings
|
||||
|
@ -634,7 +621,6 @@ void ide_acpi_push_timing(ide_hwif_t *hwif)
|
|||
}
|
||||
DEBPRINT("_STM status: %d\n", status);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ide_acpi_push_timing);
|
||||
|
||||
/**
|
||||
* ide_acpi_set_state - set the channel power state
|
||||
|
@ -688,11 +674,6 @@ void ide_acpi_set_state(ide_hwif_t *hwif, int on)
|
|||
*/
|
||||
void ide_acpi_init(ide_hwif_t *hwif)
|
||||
{
|
||||
int unit;
|
||||
int err;
|
||||
struct ide_acpi_drive_link *master;
|
||||
struct ide_acpi_drive_link *slave;
|
||||
|
||||
ide_acpi_blacklist();
|
||||
|
||||
hwif->acpidata = kzalloc(sizeof(struct ide_acpi_hwif_link), GFP_KERNEL);
|
||||
|
@ -704,40 +685,38 @@ void ide_acpi_init(ide_hwif_t *hwif)
|
|||
DEBPRINT("no ACPI object for %s found\n", hwif->name);
|
||||
kfree(hwif->acpidata);
|
||||
hwif->acpidata = NULL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void ide_acpi_port_init_devices(ide_hwif_t *hwif)
|
||||
{
|
||||
ide_drive_t *drive;
|
||||
int i, err;
|
||||
|
||||
if (hwif->acpidata == NULL)
|
||||
return;
|
||||
|
||||
/*
|
||||
* The ACPI spec mandates that we send information
|
||||
* for both drives, regardless whether they are connected
|
||||
* or not.
|
||||
*/
|
||||
hwif->acpidata->master.drive = &hwif->drives[0];
|
||||
hwif->drives[0].acpidata = &hwif->acpidata->master;
|
||||
master = &hwif->acpidata->master;
|
||||
|
||||
hwif->acpidata->slave.drive = &hwif->drives[1];
|
||||
hwif->drives[1].acpidata = &hwif->acpidata->slave;
|
||||
slave = &hwif->acpidata->slave;
|
||||
|
||||
|
||||
/*
|
||||
* Send IDENTIFY for each drive
|
||||
*/
|
||||
if (master->drive->present) {
|
||||
err = taskfile_lib_get_identify(master->drive, master->idbuff);
|
||||
if (err) {
|
||||
DEBPRINT("identify device %s failed (%d)\n",
|
||||
master->drive->name, err);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < MAX_DRIVES; i++) {
|
||||
drive = &hwif->drives[i];
|
||||
|
||||
if (slave->drive->present) {
|
||||
err = taskfile_lib_get_identify(slave->drive, slave->idbuff);
|
||||
if (err) {
|
||||
if (!drive->present)
|
||||
continue;
|
||||
|
||||
err = taskfile_lib_get_identify(drive, drive->acpidata->idbuff);
|
||||
if (err)
|
||||
DEBPRINT("identify device %s failed (%d)\n",
|
||||
slave->drive->name, err);
|
||||
}
|
||||
drive->name, err);
|
||||
}
|
||||
|
||||
if (ide_noacpionboot) {
|
||||
|
@ -753,13 +732,11 @@ void ide_acpi_init(ide_hwif_t *hwif)
|
|||
ide_acpi_get_timing(hwif);
|
||||
ide_acpi_push_timing(hwif);
|
||||
|
||||
for (unit = 0; unit < MAX_DRIVES; ++unit) {
|
||||
ide_drive_t *drive = &hwif->drives[unit];
|
||||
for (i = 0; i < MAX_DRIVES; i++) {
|
||||
drive = &hwif->drives[i];
|
||||
|
||||
if (drive->present) {
|
||||
if (drive->present)
|
||||
/* Execute ACPI startup code */
|
||||
ide_acpi_exec_tfs(drive);
|
||||
}
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ide_acpi_init);
|
||||
|
|
|
@ -604,8 +604,6 @@ static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive,
|
|||
* Block read functions.
|
||||
*/
|
||||
|
||||
typedef void (xfer_func_t)(ide_drive_t *, void *, u32);
|
||||
|
||||
static void ide_cd_pad_transfer(ide_drive_t *drive, xfer_func_t *xf, int len)
|
||||
{
|
||||
while (len > 0) {
|
||||
|
|
|
@ -819,6 +819,26 @@ int ide_set_dma(ide_drive_t *drive)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void ide_check_dma_crc(ide_drive_t *drive)
|
||||
{
|
||||
u8 mode;
|
||||
|
||||
ide_dma_off_quietly(drive);
|
||||
drive->crc_count = 0;
|
||||
mode = drive->current_speed;
|
||||
/*
|
||||
* Don't try non Ultra-DMA modes without iCRC's. Force the
|
||||
* device to PIO and make the user enable SWDMA/MWDMA modes.
|
||||
*/
|
||||
if (mode > XFER_UDMA_0 && mode <= XFER_UDMA_7)
|
||||
mode--;
|
||||
else
|
||||
mode = XFER_PIO_4;
|
||||
ide_set_xfer_rate(drive, mode);
|
||||
if (drive->current_speed >= XFER_SW_DMA_0)
|
||||
ide_dma_on(drive);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_IDEDMA_PCI
|
||||
void ide_dma_lost_irq (ide_drive_t *drive)
|
||||
{
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -23,7 +23,7 @@ static int __init ide_generic_init(void)
|
|||
for (i = 0; i < MAX_HWIFS; i++)
|
||||
idx[i] = ide_hwifs[i].present ? 0xff : i;
|
||||
|
||||
ide_device_add_all(idx);
|
||||
ide_device_add_all(idx, NULL);
|
||||
|
||||
if (ide_hwifs[0].io_ports[IDE_DATA_OFFSET])
|
||||
ide_release_lock(); /* for atari only */
|
||||
|
|
|
@ -163,8 +163,6 @@ void SELECT_DRIVE (ide_drive_t *drive)
|
|||
HWIF(drive)->OUTB(drive->select.all, IDE_SELECT_REG);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(SELECT_DRIVE);
|
||||
|
||||
void SELECT_MASK (ide_drive_t *drive, int mask)
|
||||
{
|
||||
if (HWIF(drive)->maskproc)
|
||||
|
@ -614,66 +612,6 @@ u8 eighty_ninty_three (ide_drive_t *drive)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ide_ata66_check (ide_drive_t *drive, ide_task_t *args)
|
||||
{
|
||||
if (args->tf.command == WIN_SETFEATURES &&
|
||||
args->tf.nsect > XFER_UDMA_2 &&
|
||||
args->tf.feature == SETFEATURES_XFER) {
|
||||
if (eighty_ninty_three(drive) == 0) {
|
||||
printk(KERN_WARNING "%s: UDMA speeds >UDMA33 cannot "
|
||||
"be set\n", drive->name);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Backside of HDIO_DRIVE_CMD call of SETFEATURES_XFER.
|
||||
* 1 : Safe to update drive->id DMA registers.
|
||||
* 0 : OOPs not allowed.
|
||||
*/
|
||||
int set_transfer (ide_drive_t *drive, ide_task_t *args)
|
||||
{
|
||||
if (args->tf.command == WIN_SETFEATURES &&
|
||||
args->tf.nsect >= XFER_SW_DMA_0 &&
|
||||
args->tf.feature == SETFEATURES_XFER &&
|
||||
(drive->id->dma_ultra ||
|
||||
drive->id->dma_mword ||
|
||||
drive->id->dma_1word))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_IDEDMA
|
||||
static u8 ide_auto_reduce_xfer (ide_drive_t *drive)
|
||||
{
|
||||
if (!drive->crc_count)
|
||||
return drive->current_speed;
|
||||
drive->crc_count = 0;
|
||||
|
||||
switch(drive->current_speed) {
|
||||
case XFER_UDMA_7: return XFER_UDMA_6;
|
||||
case XFER_UDMA_6: return XFER_UDMA_5;
|
||||
case XFER_UDMA_5: return XFER_UDMA_4;
|
||||
case XFER_UDMA_4: return XFER_UDMA_3;
|
||||
case XFER_UDMA_3: return XFER_UDMA_2;
|
||||
case XFER_UDMA_2: return XFER_UDMA_1;
|
||||
case XFER_UDMA_1: return XFER_UDMA_0;
|
||||
/*
|
||||
* OOPS we do not goto non Ultra DMA modes
|
||||
* without iCRC's available we force
|
||||
* the system to PIO and make the user
|
||||
* invoke the ATA-1 ATA-2 DMA modes.
|
||||
*/
|
||||
case XFER_UDMA_0:
|
||||
default: return XFER_PIO_4;
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_BLK_DEV_IDEDMA */
|
||||
|
||||
int ide_driveid_update(ide_drive_t *drive)
|
||||
{
|
||||
ide_hwif_t *hwif = drive->hwif;
|
||||
|
@ -882,22 +820,17 @@ void ide_execute_command(ide_drive_t *drive, u8 cmd, ide_handler_t *handler,
|
|||
unsigned long flags;
|
||||
ide_hwgroup_t *hwgroup = HWGROUP(drive);
|
||||
ide_hwif_t *hwif = HWIF(drive);
|
||||
|
||||
|
||||
spin_lock_irqsave(&ide_lock, flags);
|
||||
|
||||
BUG_ON(hwgroup->handler);
|
||||
hwgroup->handler = handler;
|
||||
hwgroup->expiry = expiry;
|
||||
hwgroup->timer.expires = jiffies + timeout;
|
||||
hwgroup->req_gen_timer = hwgroup->req_gen;
|
||||
add_timer(&hwgroup->timer);
|
||||
__ide_set_handler(drive, handler, timeout, expiry);
|
||||
hwif->OUTBSYNC(drive, cmd, IDE_COMMAND_REG);
|
||||
/* Drive takes 400nS to respond, we must avoid the IRQ being
|
||||
serviced before that.
|
||||
|
||||
FIXME: we could skip this delay with care on non shared
|
||||
devices
|
||||
*/
|
||||
/*
|
||||
* Drive takes 400nS to respond, we must avoid the IRQ being
|
||||
* serviced before that.
|
||||
*
|
||||
* FIXME: we could skip this delay with care on non shared devices
|
||||
*/
|
||||
ndelay(400);
|
||||
spin_unlock_irqrestore(&ide_lock, flags);
|
||||
}
|
||||
|
@ -1005,19 +938,6 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive)
|
|||
return ide_stopped;
|
||||
}
|
||||
|
||||
static void check_dma_crc(ide_drive_t *drive)
|
||||
{
|
||||
#ifdef CONFIG_BLK_DEV_IDEDMA
|
||||
if (drive->crc_count) {
|
||||
ide_dma_off_quietly(drive);
|
||||
ide_set_xfer_rate(drive, ide_auto_reduce_xfer(drive));
|
||||
if (drive->current_speed >= XFER_SW_DMA_0)
|
||||
ide_dma_on(drive);
|
||||
} else
|
||||
ide_dma_off(drive);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void ide_disk_pre_reset(ide_drive_t *drive)
|
||||
{
|
||||
int legacy = (drive->id->cfs_enable_2 & 0x0400) ? 0 : 1;
|
||||
|
@ -1039,17 +959,20 @@ static void pre_reset(ide_drive_t *drive)
|
|||
else
|
||||
drive->post_reset = 1;
|
||||
|
||||
if (drive->using_dma) {
|
||||
if (drive->crc_count)
|
||||
ide_check_dma_crc(drive);
|
||||
else
|
||||
ide_dma_off(drive);
|
||||
}
|
||||
|
||||
if (!drive->keep_settings) {
|
||||
if (drive->using_dma) {
|
||||
check_dma_crc(drive);
|
||||
} else {
|
||||
if (!drive->using_dma) {
|
||||
drive->unmask = 0;
|
||||
drive->io_32bit = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (drive->using_dma)
|
||||
check_dma_crc(drive);
|
||||
|
||||
if (HWIF(drive)->pre_reset != NULL)
|
||||
HWIF(drive)->pre_reset(drive);
|
||||
|
|
|
@ -49,7 +49,7 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id
|
|||
printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index);
|
||||
pnp_set_drvdata(dev,hwif);
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -60,9 +60,10 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id
|
|||
static void idepnp_remove(struct pnp_dev * dev)
|
||||
{
|
||||
ide_hwif_t *hwif = pnp_get_drvdata(dev);
|
||||
if (hwif) {
|
||||
ide_unregister(hwif->index);
|
||||
} else
|
||||
|
||||
if (hwif)
|
||||
ide_unregister(hwif->index, 0, 0);
|
||||
else
|
||||
printk(KERN_ERR "idepnp: Unable to remove device, please report.\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -423,8 +423,9 @@ static int ide_busy_sleep(ide_hwif_t *hwif)
|
|||
|
||||
static int do_probe (ide_drive_t *drive, u8 cmd)
|
||||
{
|
||||
int rc;
|
||||
ide_hwif_t *hwif = HWIF(drive);
|
||||
int rc;
|
||||
u8 stat;
|
||||
|
||||
if (drive->present) {
|
||||
/* avoid waiting for inappropriate probes */
|
||||
|
@ -461,15 +462,17 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
|
|||
/* failed: try again */
|
||||
rc = try_to_identify(drive,cmd);
|
||||
}
|
||||
if (hwif->INB(IDE_STATUS_REG) == (BUSY_STAT|READY_STAT))
|
||||
|
||||
stat = hwif->INB(IDE_STATUS_REG);
|
||||
|
||||
if (stat == (BUSY_STAT | READY_STAT))
|
||||
return 4;
|
||||
|
||||
if ((rc == 1 && cmd == WIN_PIDENTIFY) &&
|
||||
((drive->autotune == IDE_TUNE_DEFAULT) ||
|
||||
(drive->autotune == IDE_TUNE_AUTO))) {
|
||||
printk("%s: no response (status = 0x%02x), "
|
||||
"resetting drive\n", drive->name,
|
||||
hwif->INB(IDE_STATUS_REG));
|
||||
printk(KERN_ERR "%s: no response (status = 0x%02x), "
|
||||
"resetting drive\n", drive->name, stat);
|
||||
msleep(50);
|
||||
hwif->OUTB(drive->select.all, IDE_SELECT_REG);
|
||||
msleep(50);
|
||||
|
@ -477,11 +480,13 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
|
|||
(void)ide_busy_sleep(hwif);
|
||||
rc = try_to_identify(drive, cmd);
|
||||
}
|
||||
|
||||
/* ensure drive IRQ is clear */
|
||||
stat = hwif->INB(IDE_STATUS_REG);
|
||||
|
||||
if (rc == 1)
|
||||
printk("%s: no response (status = 0x%02x)\n",
|
||||
drive->name, hwif->INB(IDE_STATUS_REG));
|
||||
/* ensure drive irq is clear */
|
||||
(void) hwif->INB(IDE_STATUS_REG);
|
||||
printk(KERN_ERR "%s: no response (status = 0x%02x)\n",
|
||||
drive->name, stat);
|
||||
} else {
|
||||
/* not present or maybe ATAPI */
|
||||
rc = 3;
|
||||
|
@ -502,6 +507,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
|
|||
static void enable_nest (ide_drive_t *drive)
|
||||
{
|
||||
ide_hwif_t *hwif = HWIF(drive);
|
||||
u8 stat;
|
||||
|
||||
printk("%s: enabling %s -- ", hwif->name, drive->id->model);
|
||||
SELECT_DRIVE(drive);
|
||||
|
@ -515,11 +521,12 @@ static void enable_nest (ide_drive_t *drive)
|
|||
|
||||
msleep(50);
|
||||
|
||||
if (!OK_STAT((hwif->INB(IDE_STATUS_REG)), 0, BAD_STAT)) {
|
||||
printk("failed (status = 0x%02x)\n", hwif->INB(IDE_STATUS_REG));
|
||||
} else {
|
||||
printk("success\n");
|
||||
}
|
||||
stat = hwif->INB(IDE_STATUS_REG);
|
||||
|
||||
if (!OK_STAT(stat, 0, BAD_STAT))
|
||||
printk(KERN_CONT "failed (status = 0x%02x)\n", stat);
|
||||
else
|
||||
printk(KERN_CONT "success\n");
|
||||
|
||||
/* if !(success||timed-out) */
|
||||
if (do_probe(drive, WIN_IDENTIFY) >= 2) {
|
||||
|
@ -822,7 +829,7 @@ static void ide_port_tune_devices(ide_hwif_t *hwif)
|
|||
for (unit = 0; unit < MAX_DRIVES; ++unit) {
|
||||
ide_drive_t *drive = &hwif->drives[unit];
|
||||
|
||||
if (hwif->no_io_32bit)
|
||||
if (hwif->host_flags & IDE_HFLAG_NO_IO_32BIT)
|
||||
drive->no_io_32bit = 1;
|
||||
else
|
||||
drive->no_io_32bit = drive->id->dword_io ? 1 : 0;
|
||||
|
@ -881,13 +888,6 @@ static int ide_init_queue(ide_drive_t *drive)
|
|||
q->queuedata = drive;
|
||||
blk_queue_segment_boundary(q, 0xffff);
|
||||
|
||||
if (!hwif->rqsize) {
|
||||
if ((hwif->host_flags & IDE_HFLAG_NO_LBA48) ||
|
||||
(hwif->host_flags & IDE_HFLAG_NO_LBA48_DMA))
|
||||
hwif->rqsize = 256;
|
||||
else
|
||||
hwif->rqsize = 65536;
|
||||
}
|
||||
if (hwif->rqsize < max_sectors)
|
||||
max_sectors = hwif->rqsize;
|
||||
blk_queue_max_sectors(q, max_sectors);
|
||||
|
@ -918,6 +918,48 @@ static int ide_init_queue(ide_drive_t *drive)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void ide_add_drive_to_hwgroup(ide_drive_t *drive)
|
||||
{
|
||||
ide_hwgroup_t *hwgroup = drive->hwif->hwgroup;
|
||||
|
||||
spin_lock_irq(&ide_lock);
|
||||
if (!hwgroup->drive) {
|
||||
/* first drive for hwgroup. */
|
||||
drive->next = drive;
|
||||
hwgroup->drive = drive;
|
||||
hwgroup->hwif = HWIF(hwgroup->drive);
|
||||
} else {
|
||||
drive->next = hwgroup->drive->next;
|
||||
hwgroup->drive->next = drive;
|
||||
}
|
||||
spin_unlock_irq(&ide_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* For any present drive:
|
||||
* - allocate the block device queue
|
||||
* - link drive into the hwgroup
|
||||
*/
|
||||
static void ide_port_setup_devices(ide_hwif_t *hwif)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_DRIVES; i++) {
|
||||
ide_drive_t *drive = &hwif->drives[i];
|
||||
|
||||
if (!drive->present)
|
||||
continue;
|
||||
|
||||
if (ide_init_queue(drive)) {
|
||||
printk(KERN_ERR "ide: failed to init %s\n",
|
||||
drive->name);
|
||||
continue;
|
||||
}
|
||||
|
||||
ide_add_drive_to_hwgroup(drive);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine sets up the irq for an ide interface, and creates a new
|
||||
* hwgroup for the irq/hwif if none was previously assigned.
|
||||
|
@ -1019,30 +1061,12 @@ static int init_irq (ide_hwif_t *hwif)
|
|||
goto out_unlink;
|
||||
}
|
||||
|
||||
/*
|
||||
* For any present drive:
|
||||
* - allocate the block device queue
|
||||
* - link drive into the hwgroup
|
||||
*/
|
||||
for (index = 0; index < MAX_DRIVES; ++index) {
|
||||
ide_drive_t *drive = &hwif->drives[index];
|
||||
if (!drive->present)
|
||||
continue;
|
||||
if (ide_init_queue(drive)) {
|
||||
printk(KERN_ERR "ide: failed to init %s\n",drive->name);
|
||||
continue;
|
||||
}
|
||||
spin_lock_irq(&ide_lock);
|
||||
if (!hwgroup->drive) {
|
||||
/* first drive for hwgroup. */
|
||||
drive->next = drive;
|
||||
hwgroup->drive = drive;
|
||||
hwgroup->hwif = HWIF(hwgroup->drive);
|
||||
} else {
|
||||
drive->next = hwgroup->drive->next;
|
||||
hwgroup->drive->next = drive;
|
||||
}
|
||||
spin_unlock_irq(&ide_lock);
|
||||
if (!hwif->rqsize) {
|
||||
if ((hwif->host_flags & IDE_HFLAG_NO_LBA48) ||
|
||||
(hwif->host_flags & IDE_HFLAG_NO_LBA48_DMA))
|
||||
hwif->rqsize = 256;
|
||||
else
|
||||
hwif->rqsize = 65536;
|
||||
}
|
||||
|
||||
#if !defined(__mc68000__) && !defined(CONFIG_APUS)
|
||||
|
@ -1058,6 +1082,9 @@ static int init_irq (ide_hwif_t *hwif)
|
|||
printk(" (%sed with %s)",
|
||||
hwif->sharing_irq ? "shar" : "serializ", match->name);
|
||||
printk("\n");
|
||||
|
||||
ide_port_setup_devices(hwif);
|
||||
|
||||
mutex_unlock(&ide_cfg_mtx);
|
||||
return 0;
|
||||
out_unlink:
|
||||
|
@ -1182,30 +1209,6 @@ static void drive_release_dev (struct device *dev)
|
|||
complete(&drive->gendev_rel_comp);
|
||||
}
|
||||
|
||||
/*
|
||||
* init_gendisk() (as opposed to ide_geninit) is called for each major device,
|
||||
* after probing for drives, to allocate partition tables and other data
|
||||
* structures needed for the routines in genhd.c. ide_geninit() gets called
|
||||
* somewhat later, during the partition check.
|
||||
*/
|
||||
static void init_gendisk (ide_hwif_t *hwif)
|
||||
{
|
||||
unsigned int unit;
|
||||
|
||||
for (unit = 0; unit < MAX_DRIVES; ++unit) {
|
||||
ide_drive_t * drive = &hwif->drives[unit];
|
||||
ide_add_generic_settings(drive);
|
||||
snprintf(drive->gendev.bus_id,BUS_ID_SIZE,"%u.%u",
|
||||
hwif->index,unit);
|
||||
drive->gendev.parent = &hwif->gendev;
|
||||
drive->gendev.bus = &ide_bus_type;
|
||||
drive->gendev.driver_data = drive;
|
||||
drive->gendev.release = drive_release_dev;
|
||||
}
|
||||
blk_register_region(MKDEV(hwif->major, 0), MAX_DRIVES << PARTN_BITS,
|
||||
THIS_MODULE, ata_probe, ata_lock, hwif);
|
||||
}
|
||||
|
||||
static int hwif_init(ide_hwif_t *hwif)
|
||||
{
|
||||
int old_irq;
|
||||
|
@ -1262,8 +1265,8 @@ static int hwif_init(ide_hwif_t *hwif)
|
|||
hwif->name, hwif->irq);
|
||||
|
||||
done:
|
||||
init_gendisk(hwif);
|
||||
ide_acpi_init(hwif);
|
||||
blk_register_region(MKDEV(hwif->major, 0), MAX_DRIVES << PARTN_BITS,
|
||||
THIS_MODULE, ata_probe, ata_lock, hwif);
|
||||
return 1;
|
||||
|
||||
out:
|
||||
|
@ -1277,23 +1280,118 @@ static void hwif_register_devices(ide_hwif_t *hwif)
|
|||
|
||||
for (i = 0; i < MAX_DRIVES; i++) {
|
||||
ide_drive_t *drive = &hwif->drives[i];
|
||||
struct device *dev = &drive->gendev;
|
||||
int ret;
|
||||
|
||||
if (drive->present) {
|
||||
int ret = device_register(&drive->gendev);
|
||||
if (!drive->present)
|
||||
continue;
|
||||
|
||||
if (ret < 0)
|
||||
printk(KERN_WARNING "IDE: %s: "
|
||||
"device_register error: %d\n",
|
||||
__FUNCTION__, ret);
|
||||
}
|
||||
ide_add_generic_settings(drive);
|
||||
|
||||
snprintf(dev->bus_id, BUS_ID_SIZE, "%u.%u", hwif->index, i);
|
||||
dev->parent = &hwif->gendev;
|
||||
dev->bus = &ide_bus_type;
|
||||
dev->driver_data = drive;
|
||||
dev->release = drive_release_dev;
|
||||
|
||||
ret = device_register(dev);
|
||||
if (ret < 0)
|
||||
printk(KERN_WARNING "IDE: %s: device_register error: "
|
||||
"%d\n", __func__, ret);
|
||||
}
|
||||
}
|
||||
|
||||
int ide_device_add_all(u8 *idx)
|
||||
static void ide_port_init_devices(ide_hwif_t *hwif)
|
||||
{
|
||||
ide_hwif_t *hwif;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_DRIVES; i++) {
|
||||
ide_drive_t *drive = &hwif->drives[i];
|
||||
|
||||
if (hwif->host_flags & IDE_HFLAG_IO_32BIT)
|
||||
drive->io_32bit = 1;
|
||||
if (hwif->host_flags & IDE_HFLAG_UNMASK_IRQS)
|
||||
drive->unmask = 1;
|
||||
if (hwif->host_flags & IDE_HFLAG_NO_UNMASK_IRQS)
|
||||
drive->no_unmask = 1;
|
||||
if ((hwif->host_flags & IDE_HFLAG_NO_AUTOTUNE) == 0)
|
||||
drive->autotune = 1;
|
||||
}
|
||||
|
||||
if (hwif->port_init_devs)
|
||||
hwif->port_init_devs(hwif);
|
||||
}
|
||||
|
||||
static void ide_init_port(ide_hwif_t *hwif, unsigned int port,
|
||||
const struct ide_port_info *d)
|
||||
{
|
||||
if (d->chipset != ide_etrax100)
|
||||
hwif->channel = port;
|
||||
|
||||
if (d->chipset)
|
||||
hwif->chipset = d->chipset;
|
||||
|
||||
if (d->init_iops)
|
||||
d->init_iops(hwif);
|
||||
|
||||
if ((d->host_flags & IDE_HFLAG_NO_DMA) == 0)
|
||||
ide_hwif_setup_dma(hwif, d);
|
||||
|
||||
if ((!hwif->irq && (d->host_flags & IDE_HFLAG_LEGACY_IRQS)) ||
|
||||
(d->host_flags & IDE_HFLAG_FORCE_LEGACY_IRQS))
|
||||
hwif->irq = port ? 15 : 14;
|
||||
|
||||
hwif->host_flags = d->host_flags;
|
||||
hwif->pio_mask = d->pio_mask;
|
||||
|
||||
if ((d->host_flags & IDE_HFLAG_SERIALIZE) && hwif->mate)
|
||||
hwif->mate->serialized = hwif->serialized = 1;
|
||||
|
||||
hwif->swdma_mask = d->swdma_mask;
|
||||
hwif->mwdma_mask = d->mwdma_mask;
|
||||
hwif->ultra_mask = d->udma_mask;
|
||||
|
||||
/* reset DMA masks only for SFF-style DMA controllers */
|
||||
if ((d->host_flags && IDE_HFLAG_NO_DMA) == 0 && hwif->dma_base == 0)
|
||||
hwif->swdma_mask = hwif->mwdma_mask = hwif->ultra_mask = 0;
|
||||
|
||||
if (d->host_flags & IDE_HFLAG_RQSIZE_256)
|
||||
hwif->rqsize = 256;
|
||||
|
||||
/* call chipset specific routine for each enabled port */
|
||||
if (d->init_hwif)
|
||||
d->init_hwif(hwif);
|
||||
|
||||
if (hwif->cable_detect && (hwif->ultra_mask & 0x78)) {
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = hwif->cable_detect(hwif);
|
||||
}
|
||||
}
|
||||
|
||||
int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
|
||||
{
|
||||
ide_hwif_t *hwif, *mate = NULL;
|
||||
int i, rc = 0;
|
||||
|
||||
for (i = 0; i < MAX_HWIFS; i++) {
|
||||
if (d == NULL || idx[i] == 0xff) {
|
||||
mate = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
hwif = &ide_hwifs[idx[i]];
|
||||
|
||||
if (d->chipset != ide_etrax100 && (i & 1) && mate) {
|
||||
hwif->mate = mate;
|
||||
mate->mate = hwif;
|
||||
}
|
||||
|
||||
mate = (i & 1) ? NULL : hwif;
|
||||
|
||||
ide_init_port(hwif, i & 1, d);
|
||||
ide_port_init_devices(hwif);
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_HWIFS; i++) {
|
||||
if (idx[i] == 0xff)
|
||||
continue;
|
||||
|
@ -1337,6 +1435,9 @@ int ide_device_add_all(u8 *idx)
|
|||
rc = -1;
|
||||
continue;
|
||||
}
|
||||
|
||||
ide_acpi_init(hwif);
|
||||
ide_acpi_port_init_devices(hwif);
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_HWIFS; i++) {
|
||||
|
@ -1354,15 +1455,22 @@ int ide_device_add_all(u8 *idx)
|
|||
}
|
||||
|
||||
for (i = 0; i < MAX_HWIFS; i++) {
|
||||
if (idx[i] != 0xff)
|
||||
ide_proc_register_port(&ide_hwifs[idx[i]]);
|
||||
if (idx[i] == 0xff)
|
||||
continue;
|
||||
|
||||
hwif = &ide_hwifs[idx[i]];
|
||||
|
||||
if (hwif->present) {
|
||||
ide_proc_register_port(hwif);
|
||||
ide_proc_port_register_devices(hwif);
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ide_device_add_all);
|
||||
|
||||
int ide_device_add(u8 idx[4])
|
||||
int ide_device_add(u8 idx[4], const struct ide_port_info *d)
|
||||
{
|
||||
u8 idx_all[MAX_HWIFS];
|
||||
int i;
|
||||
|
@ -1370,6 +1478,6 @@ int ide_device_add(u8 idx[4])
|
|||
for (i = 0; i < MAX_HWIFS; i++)
|
||||
idx_all[i] = (i < 4) ? idx[i] : 0xff;
|
||||
|
||||
return ide_device_add_all(idx_all);
|
||||
return ide_device_add_all(idx_all, d);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ide_device_add);
|
||||
|
|
|
@ -739,7 +739,7 @@ void ide_proc_unregister_driver(ide_drive_t *drive, ide_driver_t *driver)
|
|||
|
||||
EXPORT_SYMBOL(ide_proc_unregister_driver);
|
||||
|
||||
static void create_proc_ide_drives(ide_hwif_t *hwif)
|
||||
void ide_proc_port_register_devices(ide_hwif_t *hwif)
|
||||
{
|
||||
int d;
|
||||
struct proc_dir_entry *ent;
|
||||
|
@ -793,9 +793,6 @@ static ide_proc_entry_t hwif_entries[] = {
|
|||
|
||||
void ide_proc_register_port(ide_hwif_t *hwif)
|
||||
{
|
||||
if (!hwif->present)
|
||||
return;
|
||||
|
||||
if (!hwif->proc) {
|
||||
hwif->proc = proc_mkdir(hwif->name, proc_ide_root);
|
||||
|
||||
|
@ -804,8 +801,6 @@ void ide_proc_register_port(ide_hwif_t *hwif)
|
|||
|
||||
ide_add_proc_entries(hwif->proc, hwif_entries, hwif);
|
||||
}
|
||||
|
||||
create_proc_ide_drives(hwif);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_IDEPCI
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -755,6 +755,7 @@ int ide_cmd_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
|
|||
u8 args[4], xfer_rate = 0;
|
||||
ide_task_t tfargs;
|
||||
struct ide_taskfile *tf = &tfargs.tf;
|
||||
struct hd_driveid *id = drive->id;
|
||||
|
||||
if (NULL == (void *) arg) {
|
||||
struct request rq;
|
||||
|
@ -792,10 +793,16 @@ int ide_cmd_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (set_transfer(drive, &tfargs)) {
|
||||
if (tf->command == WIN_SETFEATURES &&
|
||||
tf->feature == SETFEATURES_XFER &&
|
||||
tf->nsect >= XFER_SW_DMA_0 &&
|
||||
(id->dma_ultra || id->dma_mword || id->dma_1word)) {
|
||||
xfer_rate = args[1];
|
||||
if (ide_ata66_check(drive, &tfargs))
|
||||
if (tf->nsect > XFER_UDMA_2 && !eighty_ninty_three(drive)) {
|
||||
printk(KERN_WARNING "%s: UDMA speeds >UDMA33 cannot "
|
||||
"be set\n", drive->name);
|
||||
goto abort;
|
||||
}
|
||||
}
|
||||
|
||||
err = ide_raw_taskfile(drive, &tfargs, buf, args[3]);
|
||||
|
|
|
@ -499,6 +499,8 @@ void ide_remove_port_from_hwgroup(ide_hwif_t *hwif)
|
|||
/**
|
||||
* ide_unregister - free an IDE interface
|
||||
* @index: index of interface (will change soon to a pointer)
|
||||
* @init_default: init default hwif flag
|
||||
* @restore: restore hwif flag
|
||||
*
|
||||
* Perform the final unregister of an IDE interface. At the moment
|
||||
* we don't refcount interfaces so this will also get split up.
|
||||
|
@ -518,7 +520,7 @@ void ide_remove_port_from_hwgroup(ide_hwif_t *hwif)
|
|||
* This is raving bonkers.
|
||||
*/
|
||||
|
||||
void ide_unregister(unsigned int index)
|
||||
void ide_unregister(unsigned int index, int init_default, int restore)
|
||||
{
|
||||
ide_drive_t *drive;
|
||||
ide_hwif_t *hwif, *g;
|
||||
|
@ -602,9 +604,12 @@ void ide_unregister(unsigned int index)
|
|||
|
||||
/* restore hwif data to pristine status */
|
||||
ide_init_port_data(hwif, index);
|
||||
init_hwif_default(hwif, index);
|
||||
|
||||
ide_hwif_restore(hwif, &tmp_hwif);
|
||||
if (init_default)
|
||||
init_hwif_default(hwif, index);
|
||||
|
||||
if (restore)
|
||||
ide_hwif_restore(hwif, &tmp_hwif);
|
||||
|
||||
abort:
|
||||
spin_unlock_irq(&ide_lock);
|
||||
|
@ -678,6 +683,31 @@ void ide_init_port_hw(ide_hwif_t *hwif, hw_regs_t *hw)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(ide_init_port_hw);
|
||||
|
||||
ide_hwif_t *ide_deprecated_find_port(unsigned long base)
|
||||
{
|
||||
ide_hwif_t *hwif;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_HWIFS; i++) {
|
||||
hwif = &ide_hwifs[i];
|
||||
if (hwif->io_ports[IDE_DATA_OFFSET] == base)
|
||||
goto found;
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_HWIFS; i++) {
|
||||
hwif = &ide_hwifs[i];
|
||||
if (hwif->hold)
|
||||
continue;
|
||||
if (!hwif->present && hwif->mate == NULL)
|
||||
goto found;
|
||||
}
|
||||
|
||||
hwif = NULL;
|
||||
found:
|
||||
return hwif;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ide_deprecated_find_port);
|
||||
|
||||
/**
|
||||
* ide_register_hw - register IDE interface
|
||||
* @hw: hardware registers
|
||||
|
@ -697,38 +727,26 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *),
|
|||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
do {
|
||||
for (index = 0; index < MAX_HWIFS; ++index) {
|
||||
hwif = &ide_hwifs[index];
|
||||
if (hwif->io_ports[IDE_DATA_OFFSET] == hw->io_ports[IDE_DATA_OFFSET])
|
||||
goto found;
|
||||
}
|
||||
for (index = 0; index < MAX_HWIFS; ++index) {
|
||||
hwif = &ide_hwifs[index];
|
||||
if (hwif->hold)
|
||||
continue;
|
||||
if (!hwif->present && hwif->mate == NULL)
|
||||
goto found;
|
||||
}
|
||||
hwif = ide_deprecated_find_port(hw->io_ports[IDE_DATA_OFFSET]);
|
||||
index = hwif->index;
|
||||
if (hwif)
|
||||
goto found;
|
||||
for (index = 0; index < MAX_HWIFS; index++)
|
||||
ide_unregister(index);
|
||||
ide_unregister(index, 1, 1);
|
||||
} while (retry--);
|
||||
return -1;
|
||||
found:
|
||||
if (hwif->present)
|
||||
ide_unregister(index);
|
||||
else if (!hwif->hold) {
|
||||
ide_unregister(index, 0, 1);
|
||||
else if (!hwif->hold)
|
||||
ide_init_port_data(hwif, index);
|
||||
init_hwif_default(hwif, index);
|
||||
}
|
||||
if (hwif->present)
|
||||
return -1;
|
||||
|
||||
ide_init_port_hw(hwif, hw);
|
||||
hwif->quirkproc = quirkproc;
|
||||
|
||||
idx[0] = index;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
|
||||
if (hwifp)
|
||||
*hwifp = hwif;
|
||||
|
@ -791,10 +809,6 @@ int set_io_32bit(ide_drive_t *drive, int arg)
|
|||
return -EBUSY;
|
||||
|
||||
drive->io_32bit = arg;
|
||||
#ifdef CONFIG_BLK_DEV_DTC2278
|
||||
if (HWIF(drive)->chipset == ide_dtc2278)
|
||||
HWIF(drive)->drives[!drive->select.b.unit].io_32bit = arg;
|
||||
#endif /* CONFIG_BLK_DEV_DTC2278 */
|
||||
|
||||
spin_unlock_irq(&ide_lock);
|
||||
|
||||
|
@ -1021,11 +1035,8 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
|
|||
case HDIO_GET_NICE:
|
||||
return put_user(drive->dsc_overlap << IDE_NICE_DSC_OVERLAP |
|
||||
drive->atapi_overlap << IDE_NICE_ATAPI_OVERLAP |
|
||||
drive->nice0 << IDE_NICE_0 |
|
||||
drive->nice1 << IDE_NICE_1 |
|
||||
drive->nice2 << IDE_NICE_2,
|
||||
drive->nice1 << IDE_NICE_1,
|
||||
(long __user *) arg);
|
||||
|
||||
#ifdef CONFIG_IDE_TASK_IOCTL
|
||||
case HDIO_DRIVE_TASKFILE:
|
||||
if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
|
||||
|
@ -1066,7 +1077,7 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
|
|||
case HDIO_UNREGISTER_HWIF:
|
||||
if (!capable(CAP_SYS_RAWIO)) return -EACCES;
|
||||
/* (arg > MAX_HWIFS) checked in function */
|
||||
ide_unregister(arg);
|
||||
ide_unregister(arg, 1, 1);
|
||||
return 0;
|
||||
case HDIO_SET_NICE:
|
||||
if (!capable(CAP_SYS_ADMIN)) return -EACCES;
|
||||
|
@ -1711,7 +1722,7 @@ void __exit cleanup_module (void)
|
|||
int index;
|
||||
|
||||
for (index = 0; index < MAX_HWIFS; ++index)
|
||||
ide_unregister(index);
|
||||
ide_unregister(index, 0, 0);
|
||||
|
||||
proc_ide_destroy();
|
||||
|
||||
|
|
|
@ -191,9 +191,14 @@ static int __init initRegisters (void) {
|
|||
return t;
|
||||
}
|
||||
|
||||
static const struct ide_port_info ali14xx_port_info = {
|
||||
.chipset = ide_ali14xx,
|
||||
.host_flags = IDE_HFLAG_NO_DMA | IDE_HFLAG_NO_AUTOTUNE,
|
||||
.pio_mask = ATA_PIO4,
|
||||
};
|
||||
|
||||
static int __init ali14xx_probe(void)
|
||||
{
|
||||
ide_hwif_t *hwif, *mate;
|
||||
static u8 idx[4] = { 0, 1, 0xff, 0xff };
|
||||
|
||||
printk(KERN_DEBUG "ali14xx: base=0x%03x, regOn=0x%02x.\n",
|
||||
|
@ -205,21 +210,10 @@ static int __init ali14xx_probe(void)
|
|||
return 1;
|
||||
}
|
||||
|
||||
hwif = &ide_hwifs[0];
|
||||
mate = &ide_hwifs[1];
|
||||
ide_hwifs[0].set_pio_mode = &ali14xx_set_pio_mode;
|
||||
ide_hwifs[1].set_pio_mode = &ali14xx_set_pio_mode;
|
||||
|
||||
hwif->chipset = ide_ali14xx;
|
||||
hwif->pio_mask = ATA_PIO4;
|
||||
hwif->set_pio_mode = &ali14xx_set_pio_mode;
|
||||
hwif->mate = mate;
|
||||
|
||||
mate->chipset = ide_ali14xx;
|
||||
mate->pio_mask = ATA_PIO4;
|
||||
mate->set_pio_mode = &ali14xx_set_pio_mode;
|
||||
mate->mate = hwif;
|
||||
mate->channel = 1;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, &ali14xx_port_info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -232,7 +232,7 @@ static int __init buddha_init(void)
|
|||
}
|
||||
}
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -84,14 +84,20 @@ static void dtc2278_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|||
/* Actually we do - there is a data sheet available for the
|
||||
Winbond but does anyone actually care */
|
||||
}
|
||||
|
||||
/*
|
||||
* 32bit I/O has to be enabled for *both* drives at the same time.
|
||||
*/
|
||||
drive->io_32bit = 1;
|
||||
HWIF(drive)->drives[!drive->select.b.unit].io_32bit = 1;
|
||||
}
|
||||
|
||||
static const struct ide_port_info dtc2278_port_info __initdata = {
|
||||
.chipset = ide_dtc2278,
|
||||
.host_flags = IDE_HFLAG_SERIALIZE |
|
||||
IDE_HFLAG_NO_UNMASK_IRQS |
|
||||
IDE_HFLAG_IO_32BIT |
|
||||
/* disallow ->io_32bit changes */
|
||||
IDE_HFLAG_NO_IO_32BIT |
|
||||
IDE_HFLAG_NO_DMA |
|
||||
IDE_HFLAG_NO_AUTOTUNE,
|
||||
.pio_mask = ATA_PIO4,
|
||||
};
|
||||
|
||||
static int __init dtc2278_probe(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
@ -122,23 +128,9 @@ static int __init dtc2278_probe(void)
|
|||
#endif
|
||||
local_irq_restore(flags);
|
||||
|
||||
hwif->serialized = 1;
|
||||
hwif->chipset = ide_dtc2278;
|
||||
hwif->pio_mask = ATA_PIO4;
|
||||
hwif->set_pio_mode = &dtc2278_set_pio_mode;
|
||||
hwif->drives[0].no_unmask = 1;
|
||||
hwif->drives[1].no_unmask = 1;
|
||||
hwif->mate = mate;
|
||||
|
||||
mate->serialized = 1;
|
||||
mate->chipset = ide_dtc2278;
|
||||
mate->pio_mask = ATA_PIO4;
|
||||
mate->drives[0].no_unmask = 1;
|
||||
mate->drives[1].no_unmask = 1;
|
||||
mate->mate = hwif;
|
||||
mate->channel = 1;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, &dtc2278_port_info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -83,7 +83,7 @@ static int __init falconide_init(void)
|
|||
ide_init_port_data(hwif, index);
|
||||
ide_init_port_hw(hwif, &hw);
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -186,7 +186,7 @@ static int __init gayle_init(void)
|
|||
release_mem_region(res_start, res_n);
|
||||
}
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -300,16 +300,36 @@ static void ht6560b_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void __init ht6560b_port_init_devs(ide_hwif_t *hwif)
|
||||
{
|
||||
/* Setting default configurations for drives. */
|
||||
int t = (HT_CONFIG_DEFAULT << 8) | HT_TIMING_DEFAULT;
|
||||
|
||||
if (hwif->channel)
|
||||
t |= (HT_SECONDARY_IF << 8);
|
||||
|
||||
hwif->drives[0].drive_data = t;
|
||||
hwif->drives[1].drive_data = t;
|
||||
}
|
||||
|
||||
int probe_ht6560b = 0;
|
||||
|
||||
module_param_named(probe, probe_ht6560b, bool, 0);
|
||||
MODULE_PARM_DESC(probe, "probe for HT6560B chipset");
|
||||
|
||||
static const struct ide_port_info ht6560b_port_info __initdata = {
|
||||
.chipset = ide_ht6560b,
|
||||
.host_flags = IDE_HFLAG_SERIALIZE | /* is this needed? */
|
||||
IDE_HFLAG_NO_DMA |
|
||||
IDE_HFLAG_NO_AUTOTUNE |
|
||||
IDE_HFLAG_ABUSE_PREFETCH,
|
||||
.pio_mask = ATA_PIO5,
|
||||
};
|
||||
|
||||
static int __init ht6560b_init(void)
|
||||
{
|
||||
ide_hwif_t *hwif, *mate;
|
||||
static u8 idx[4] = { 0, 1, 0xff, 0xff };
|
||||
int t;
|
||||
|
||||
if (probe_ht6560b == 0)
|
||||
return -ENODEV;
|
||||
|
@ -328,36 +348,16 @@ static int __init ht6560b_init(void)
|
|||
goto release_region;
|
||||
}
|
||||
|
||||
hwif->chipset = ide_ht6560b;
|
||||
hwif->selectproc = &ht6560b_selectproc;
|
||||
hwif->host_flags = IDE_HFLAG_ABUSE_PREFETCH;
|
||||
hwif->pio_mask = ATA_PIO5;
|
||||
hwif->set_pio_mode = &ht6560b_set_pio_mode;
|
||||
hwif->serialized = 1; /* is this needed? */
|
||||
hwif->mate = mate;
|
||||
|
||||
mate->chipset = ide_ht6560b;
|
||||
mate->selectproc = &ht6560b_selectproc;
|
||||
mate->host_flags = IDE_HFLAG_ABUSE_PREFETCH;
|
||||
mate->pio_mask = ATA_PIO5;
|
||||
mate->set_pio_mode = &ht6560b_set_pio_mode;
|
||||
mate->serialized = 1; /* is this needed? */
|
||||
mate->mate = hwif;
|
||||
mate->channel = 1;
|
||||
|
||||
/*
|
||||
* Setting default configurations for drives
|
||||
*/
|
||||
t = (HT_CONFIG_DEFAULT << 8);
|
||||
t |= HT_TIMING_DEFAULT;
|
||||
hwif->drives[0].drive_data = t;
|
||||
hwif->drives[1].drive_data = t;
|
||||
hwif->port_init_devs = ht6560b_port_init_devs;
|
||||
mate->port_init_devs = ht6560b_port_init_devs;
|
||||
|
||||
t |= (HT_SECONDARY_IF << 8);
|
||||
mate->drives[0].drive_data = t;
|
||||
mate->drives[1].drive_data = t;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, &ht6560b_port_info);
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -145,13 +145,36 @@ static void ide_detach(struct pcmcia_device *link)
|
|||
|
||||
static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq, struct pcmcia_device *handle)
|
||||
{
|
||||
ide_hwif_t *hwif;
|
||||
hw_regs_t hw;
|
||||
int i;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
memset(&hw, 0, sizeof(hw));
|
||||
ide_init_hwif_ports(&hw, io, ctl, NULL);
|
||||
ide_std_init_ports(&hw, io, ctl);
|
||||
hw.irq = irq;
|
||||
hw.chipset = ide_pci;
|
||||
hw.dev = &handle->dev;
|
||||
return ide_register_hw(&hw, &ide_undecoded_slave, NULL);
|
||||
|
||||
hwif = ide_deprecated_find_port(hw.io_ports[IDE_DATA_OFFSET]);
|
||||
if (hwif == NULL)
|
||||
return -1;
|
||||
|
||||
i = hwif->index;
|
||||
|
||||
if (hwif->present)
|
||||
ide_unregister(i, 0, 0);
|
||||
else if (!hwif->hold)
|
||||
ide_init_port_data(hwif, i);
|
||||
|
||||
ide_init_port_hw(hwif, &hw);
|
||||
hwif->quirkproc = &ide_undecoded_slave;
|
||||
|
||||
idx[0] = i;
|
||||
|
||||
ide_device_add(idx, NULL);
|
||||
|
||||
return hwif->present ? i : -1;
|
||||
}
|
||||
|
||||
/*======================================================================
|
||||
|
@ -337,7 +360,7 @@ void ide_release(struct pcmcia_device *link)
|
|||
if (info->ndev) {
|
||||
/* FIXME: if this fails we need to queue the cleanup somehow
|
||||
-- need to investigate the required PCMCIA magic */
|
||||
ide_unregister(info->hd);
|
||||
ide_unregister(info->hd, 0, 0);
|
||||
}
|
||||
info->ndev = 0;
|
||||
|
||||
|
|
|
@ -108,7 +108,7 @@ static int __devinit plat_ide_probe(struct platform_device *pdev)
|
|||
|
||||
idx[0] = hwif->index;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
|
||||
platform_set_drvdata(pdev, hwif);
|
||||
|
||||
|
@ -122,7 +122,7 @@ static int __devexit plat_ide_remove(struct platform_device *pdev)
|
|||
{
|
||||
ide_hwif_t *hwif = pdev->dev.driver_data;
|
||||
|
||||
ide_unregister(hwif->index);
|
||||
ide_unregister(hwif->index, 0, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -123,19 +123,9 @@ static int __init macide_init(void)
|
|||
ide_init_port_data(hwif, index);
|
||||
ide_init_port_hw(hwif, &hw);
|
||||
|
||||
if (macintosh_config->ide_type == MAC_IDE_BABOON &&
|
||||
macintosh_config->ident == MAC_MODEL_PB190) {
|
||||
/* Fix breakage in ide-disk.c: drive capacity */
|
||||
/* is not initialized for drives without a */
|
||||
/* hardware ID, and we can't get that without */
|
||||
/* probing the drive which freezes a 190. */
|
||||
ide_drive_t *drive = &hwif->drives[0];
|
||||
drive->capacity64 = drive->cyl*drive->head*drive->sect;
|
||||
}
|
||||
|
||||
hwif->mmio = 1;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -154,7 +154,7 @@ static int __init q40ide_init(void)
|
|||
}
|
||||
}
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -305,18 +305,33 @@ static int __init qd_testreg(int port)
|
|||
* called to setup an ata channel : adjusts attributes & links for tuning
|
||||
*/
|
||||
|
||||
static void __init qd_setup(ide_hwif_t *hwif, int base, int config,
|
||||
unsigned int data0, unsigned int data1)
|
||||
static void __init qd_setup(ide_hwif_t *hwif, int base, int config)
|
||||
{
|
||||
hwif->chipset = ide_qd65xx;
|
||||
hwif->channel = hwif->index;
|
||||
hwif->select_data = base;
|
||||
hwif->config_data = config;
|
||||
hwif->drives[0].drive_data = data0;
|
||||
hwif->drives[1].drive_data = data1;
|
||||
hwif->drives[0].io_32bit =
|
||||
hwif->drives[1].io_32bit = 1;
|
||||
hwif->pio_mask = ATA_PIO4;
|
||||
}
|
||||
|
||||
static void __init qd6500_port_init_devs(ide_hwif_t *hwif)
|
||||
{
|
||||
u8 base = hwif->select_data, config = QD_CONFIG(hwif);
|
||||
|
||||
hwif->drives[0].drive_data = QD6500_DEF_DATA;
|
||||
hwif->drives[1].drive_data = QD6500_DEF_DATA;
|
||||
}
|
||||
|
||||
static void __init qd6580_port_init_devs(ide_hwif_t *hwif)
|
||||
{
|
||||
u16 t1, t2;
|
||||
u8 base = hwif->select_data, config = QD_CONFIG(hwif);
|
||||
|
||||
if (QD_CONTROL(hwif) & QD_CONTR_SEC_DISABLED) {
|
||||
t1 = QD6580_DEF_DATA;
|
||||
t2 = QD6580_DEF_DATA2;
|
||||
} else
|
||||
t2 = t1 = hwif->channel ? QD6580_DEF_DATA2 : QD6580_DEF_DATA;
|
||||
|
||||
hwif->drives[0].drive_data = t1;
|
||||
hwif->drives[1].drive_data = t2;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -356,6 +371,14 @@ static void __exit qd_unsetup(ide_hwif_t *hwif)
|
|||
}
|
||||
*/
|
||||
|
||||
static const struct ide_port_info qd65xx_port_info __initdata = {
|
||||
.chipset = ide_qd65xx,
|
||||
.host_flags = IDE_HFLAG_IO_32BIT |
|
||||
IDE_HFLAG_NO_DMA |
|
||||
IDE_HFLAG_NO_AUTOTUNE,
|
||||
.pio_mask = ATA_PIO4,
|
||||
};
|
||||
|
||||
/*
|
||||
* qd_probe:
|
||||
*
|
||||
|
@ -393,13 +416,14 @@ static int __init qd_probe(int base)
|
|||
return 1;
|
||||
}
|
||||
|
||||
qd_setup(hwif, base, config, QD6500_DEF_DATA, QD6500_DEF_DATA);
|
||||
qd_setup(hwif, base, config);
|
||||
|
||||
hwif->port_init_devs = qd6500_port_init_devs;
|
||||
hwif->set_pio_mode = &qd6500_set_pio_mode;
|
||||
|
||||
idx[0] = unit;
|
||||
idx[unit] = unit;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, &qd65xx_port_info);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -426,14 +450,15 @@ static int __init qd_probe(int base)
|
|||
hwif = &ide_hwifs[unit];
|
||||
printk(KERN_INFO "%s: qd6580: single IDE board\n",
|
||||
hwif->name);
|
||||
qd_setup(hwif, base, config | (control << 8),
|
||||
QD6580_DEF_DATA, QD6580_DEF_DATA2);
|
||||
|
||||
qd_setup(hwif, base, config | (control << 8));
|
||||
|
||||
hwif->port_init_devs = qd6580_port_init_devs;
|
||||
hwif->set_pio_mode = &qd6580_set_pio_mode;
|
||||
|
||||
idx[0] = unit;
|
||||
idx[unit] = unit;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, &qd65xx_port_info);
|
||||
|
||||
outb(QD_DEF_CONTR, QD_CONTROL_PORT);
|
||||
|
||||
|
@ -447,20 +472,20 @@ static int __init qd_probe(int base)
|
|||
printk(KERN_INFO "%s&%s: qd6580: dual IDE board\n",
|
||||
hwif->name, mate->name);
|
||||
|
||||
qd_setup(hwif, base, config | (control << 8),
|
||||
QD6580_DEF_DATA, QD6580_DEF_DATA);
|
||||
qd_setup(hwif, base, config | (control << 8));
|
||||
|
||||
hwif->port_init_devs = qd6580_port_init_devs;
|
||||
hwif->set_pio_mode = &qd6580_set_pio_mode;
|
||||
|
||||
qd_setup(mate, base, config | (control << 8),
|
||||
QD6580_DEF_DATA2, QD6580_DEF_DATA2);
|
||||
qd_setup(mate, base, config | (control << 8));
|
||||
|
||||
mate->port_init_devs = qd6580_port_init_devs;
|
||||
mate->set_pio_mode = &qd6580_set_pio_mode;
|
||||
|
||||
idx[0] = 0;
|
||||
idx[1] = 1;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, &qd65xx_port_info);
|
||||
|
||||
outb(QD_DEF_CONTR, QD_CONTROL_PORT);
|
||||
|
||||
|
|
|
@ -120,9 +120,14 @@ static void umc_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|||
spin_unlock_irqrestore(&ide_lock, flags);
|
||||
}
|
||||
|
||||
static const struct ide_port_info umc8672_port_info __initdata = {
|
||||
.chipset = ide_umc8672,
|
||||
.host_flags = IDE_HFLAG_NO_DMA | IDE_HFLAG_NO_AUTOTUNE,
|
||||
.pio_mask = ATA_PIO4,
|
||||
};
|
||||
|
||||
static int __init umc8672_probe(void)
|
||||
{
|
||||
ide_hwif_t *hwif, *mate;
|
||||
unsigned long flags;
|
||||
static u8 idx[4] = { 0, 1, 0xff, 0xff };
|
||||
|
||||
|
@ -143,21 +148,10 @@ static int __init umc8672_probe(void)
|
|||
umc_set_speeds (current_speeds);
|
||||
local_irq_restore(flags);
|
||||
|
||||
hwif = &ide_hwifs[0];
|
||||
mate = &ide_hwifs[1];
|
||||
ide_hwifs[0].set_pio_mode = &umc_set_pio_mode;
|
||||
ide_hwifs[1].set_pio_mode = &umc_set_pio_mode;
|
||||
|
||||
hwif->chipset = ide_umc8672;
|
||||
hwif->pio_mask = ATA_PIO4;
|
||||
hwif->set_pio_mode = &umc_set_pio_mode;
|
||||
hwif->mate = mate;
|
||||
|
||||
mate->chipset = ide_umc8672;
|
||||
mate->pio_mask = ATA_PIO4;
|
||||
mate->set_pio_mode = &umc_set_pio_mode;
|
||||
mate->mate = hwif;
|
||||
mate->channel = 1;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, &umc8672_port_info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -548,6 +548,17 @@ static void auide_setup_ports(hw_regs_t *hw, _auide_hwif *ahwif)
|
|||
*ata_regs = ahwif->regbase + (14 << AU1XXX_ATA_REG_OFFSET);
|
||||
}
|
||||
|
||||
static const struct ide_port_info au1xxx_port_info = {
|
||||
.host_flags = IDE_HFLAG_POST_SET_MODE |
|
||||
IDE_HFLAG_NO_DMA | /* no SFF-style DMA */
|
||||
IDE_HFLAG_NO_IO_32BIT |
|
||||
IDE_HFLAG_UNMASK_IRQS,
|
||||
.pio_mask = ATA_PIO4,
|
||||
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
|
||||
.mwdma_mask = ATA_MWDMA2,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int au_ide_probe(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
|
@ -606,21 +617,6 @@ static int au_ide_probe(struct device *dev)
|
|||
|
||||
hwif->dev = dev;
|
||||
|
||||
hwif->ultra_mask = 0x0; /* Disable Ultra DMA */
|
||||
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
|
||||
hwif->mwdma_mask = 0x07; /* Multimode-2 DMA */
|
||||
hwif->swdma_mask = 0x00;
|
||||
#else
|
||||
hwif->mwdma_mask = 0x0;
|
||||
hwif->swdma_mask = 0x0;
|
||||
#endif
|
||||
|
||||
hwif->pio_mask = ATA_PIO4;
|
||||
hwif->host_flags = IDE_HFLAG_POST_SET_MODE;
|
||||
|
||||
hwif->drives[0].unmask = 1;
|
||||
hwif->drives[1].unmask = 1;
|
||||
|
||||
/* hold should be on in all cases */
|
||||
hwif->hold = 1;
|
||||
|
||||
|
@ -651,16 +647,9 @@ static int au_ide_probe(struct device *dev)
|
|||
hwif->ide_dma_test_irq = &auide_dma_test_irq;
|
||||
hwif->dma_lost_irq = &auide_dma_lost_irq;
|
||||
#endif
|
||||
hwif->channel = 0;
|
||||
hwif->select_data = 0; /* no chipset-specific code */
|
||||
hwif->config_data = 0; /* no chipset-specific code */
|
||||
|
||||
hwif->drives[0].autotune = 1; /* 1=autotune, 2=noautotune, 0=default */
|
||||
hwif->drives[1].autotune = 1;
|
||||
|
||||
hwif->drives[0].no_io_32bit = 1;
|
||||
hwif->drives[1].no_io_32bit = 1;
|
||||
|
||||
auide_hwif.hwif = hwif;
|
||||
hwif->hwif_data = &auide_hwif;
|
||||
|
||||
|
@ -671,7 +660,7 @@ static int au_ide_probe(struct device *dev)
|
|||
|
||||
idx[0] = hwif->index;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, &au1xxx_port_info);
|
||||
|
||||
dev_set_drvdata(dev, hwif);
|
||||
|
||||
|
@ -688,7 +677,7 @@ static int au_ide_remove(struct device *dev)
|
|||
ide_hwif_t *hwif = dev_get_drvdata(dev);
|
||||
_auide_hwif *ahwif = &auide_hwif;
|
||||
|
||||
ide_unregister(hwif->index);
|
||||
ide_unregister(hwif->index, 0, 0);
|
||||
|
||||
iounmap((void *)ahwif->regbase);
|
||||
|
||||
|
|
|
@ -129,7 +129,7 @@ static int __devinit swarm_ide_probe(struct device *dev)
|
|||
|
||||
idx[0] = hwif->index;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
|
||||
dev_set_drvdata(dev, hwif);
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -166,6 +165,16 @@ static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev, const ch
|
|||
return dev->irq;
|
||||
}
|
||||
|
||||
static u8 __devinit atp86x_cable_detect(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
u8 ata66 = 0, mask = hwif->channel ? 0x02 : 0x01;
|
||||
|
||||
pci_read_config_byte(dev, 0x49, &ata66);
|
||||
|
||||
return (ata66 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
|
||||
}
|
||||
|
||||
static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
|
@ -174,21 +183,10 @@ static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif)
|
|||
|
||||
if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF)
|
||||
hwif->set_dma_mode = &aec6210_set_mode;
|
||||
else
|
||||
else {
|
||||
hwif->set_dma_mode = &aec6260_set_mode;
|
||||
|
||||
if (hwif->dma_base == 0)
|
||||
return;
|
||||
|
||||
if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF)
|
||||
return;
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT) {
|
||||
u8 ata66 = 0, mask = hwif->channel ? 0x02 : 0x01;
|
||||
|
||||
pci_read_config_byte(dev, 0x49, &ata66);
|
||||
|
||||
hwif->cbl = (ata66 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
|
||||
hwif->cable_detect = atp86x_cable_detect;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -666,13 +665,12 @@ static void __devinit init_hwif_common_ali15x3 (ide_hwif_t *hwif)
|
|||
hwif->set_dma_mode = &ali_set_dma_mode;
|
||||
hwif->udma_filter = &ali_udma_filter;
|
||||
|
||||
hwif->cable_detect = ata66_ali15x3;
|
||||
|
||||
if (hwif->dma_base == 0)
|
||||
return;
|
||||
|
||||
hwif->dma_setup = &ali15x3_dma_setup;
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = ata66_ali15x3(hwif);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -17,12 +17,9 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ide.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include "ide-timing.h"
|
||||
|
||||
|
@ -199,6 +196,14 @@ static unsigned int __devinit init_chipset_amd74xx(struct pci_dev *dev,
|
|||
return dev->irq;
|
||||
}
|
||||
|
||||
static u8 __devinit amd_cable_detect(ide_hwif_t *hwif)
|
||||
{
|
||||
if ((amd_80w >> hwif->channel) & 1)
|
||||
return ATA_CBL_PATA80;
|
||||
else
|
||||
return ATA_CBL_PATA40;
|
||||
}
|
||||
|
||||
static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
|
@ -209,15 +214,7 @@ static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif)
|
|||
hwif->set_pio_mode = &amd_set_pio_mode;
|
||||
hwif->set_dma_mode = &amd_set_drive;
|
||||
|
||||
if (!hwif->dma_base)
|
||||
return;
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT) {
|
||||
if ((amd_80w >> hwif->channel) & 1)
|
||||
hwif->cbl = ATA_CBL_PATA80;
|
||||
else
|
||||
hwif->cbl = ATA_CBL_PATA40;
|
||||
}
|
||||
hwif->cable_detect = amd_cable_detect;
|
||||
}
|
||||
|
||||
#define IDE_HFLAGS_AMD \
|
||||
|
|
|
@ -6,15 +6,11 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#define ATIIXP_IDE_PIO_TIMING 0x40
|
||||
#define ATIIXP_IDE_MDMA_TIMING 0x44
|
||||
#define ATIIXP_IDE_PIO_CONTROL 0x48
|
||||
|
@ -121,6 +117,19 @@ static void atiixp_set_dma_mode(ide_drive_t *drive, const u8 speed)
|
|||
spin_unlock_irqrestore(&atiixp_lock, flags);
|
||||
}
|
||||
|
||||
static u8 __devinit atiixp_cable_detect(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(hwif->dev);
|
||||
u8 udma_mode = 0, ch = hwif->channel;
|
||||
|
||||
pci_read_config_byte(pdev, ATIIXP_IDE_UDMA_MODE + ch, &udma_mode);
|
||||
|
||||
if ((udma_mode & 0x07) >= 0x04 || (udma_mode & 0x70) >= 0x40)
|
||||
return ATA_CBL_PATA80;
|
||||
else
|
||||
return ATA_CBL_PATA40;
|
||||
}
|
||||
|
||||
/**
|
||||
* init_hwif_atiixp - fill in the hwif for the ATIIXP
|
||||
* @hwif: IDE interface
|
||||
|
@ -131,21 +140,10 @@ static void atiixp_set_dma_mode(ide_drive_t *drive, const u8 speed)
|
|||
|
||||
static void __devinit init_hwif_atiixp(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(hwif->dev);
|
||||
u8 udma_mode = 0, ch = hwif->channel;
|
||||
|
||||
hwif->set_pio_mode = &atiixp_set_pio_mode;
|
||||
hwif->set_dma_mode = &atiixp_set_dma_mode;
|
||||
|
||||
if (!hwif->dma_base)
|
||||
return;
|
||||
|
||||
pci_read_config_byte(pdev, ATIIXP_IDE_UDMA_MODE + ch, &udma_mode);
|
||||
|
||||
if ((udma_mode & 0x07) >= 0x04 || (udma_mode & 0x70) >= 0x40)
|
||||
hwif->cbl = ATA_CBL_PATA80;
|
||||
else
|
||||
hwif->cbl = ATA_CBL_PATA40;
|
||||
hwif->cable_detect = atiixp_cable_detect;
|
||||
}
|
||||
|
||||
static const struct ide_port_info atiixp_pci_info[] __devinitdata = {
|
||||
|
|
|
@ -103,10 +103,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -703,6 +699,18 @@ static int pci_conf2(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct ide_port_info cmd640_port_info __initdata = {
|
||||
.chipset = ide_cmd640,
|
||||
.host_flags = IDE_HFLAG_SERIALIZE |
|
||||
IDE_HFLAG_NO_DMA |
|
||||
IDE_HFLAG_NO_AUTOTUNE |
|
||||
IDE_HFLAG_ABUSE_PREFETCH |
|
||||
IDE_HFLAG_ABUSE_FAST_DEVSEL,
|
||||
#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
|
||||
.pio_mask = ATA_PIO5,
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
* Probe for a cmd640 chipset, and initialize it if found.
|
||||
*/
|
||||
|
@ -760,11 +768,7 @@ static int __init cmd640x_init(void)
|
|||
setup_device_ptrs ();
|
||||
printk("%s: buggy cmd640%c interface on %s, config=0x%02x\n",
|
||||
cmd_hwif0->name, 'a' + cmd640_chip_version - 1, bus_type, cfr);
|
||||
cmd_hwif0->chipset = ide_cmd640;
|
||||
#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
|
||||
cmd_hwif0->host_flags = IDE_HFLAG_ABUSE_PREFETCH |
|
||||
IDE_HFLAG_ABUSE_FAST_DEVSEL;
|
||||
cmd_hwif0->pio_mask = ATA_PIO5;
|
||||
cmd_hwif0->set_pio_mode = &cmd640_set_pio_mode;
|
||||
#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
|
||||
|
||||
|
@ -815,23 +819,14 @@ static int __init cmd640x_init(void)
|
|||
* Initialize data for secondary cmd640 port, if enabled
|
||||
*/
|
||||
if (second_port_cmd640) {
|
||||
cmd_hwif0->serialized = 1;
|
||||
cmd_hwif1->serialized = 1;
|
||||
cmd_hwif1->chipset = ide_cmd640;
|
||||
cmd_hwif0->mate = cmd_hwif1;
|
||||
cmd_hwif1->mate = cmd_hwif0;
|
||||
cmd_hwif1->channel = 1;
|
||||
#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
|
||||
cmd_hwif1->host_flags = IDE_HFLAG_ABUSE_PREFETCH |
|
||||
IDE_HFLAG_ABUSE_FAST_DEVSEL;
|
||||
cmd_hwif1->pio_mask = ATA_PIO5;
|
||||
cmd_hwif1->set_pio_mode = &cmd640_set_pio_mode;
|
||||
#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
|
||||
|
||||
idx[1] = cmd_hwif1->index;
|
||||
}
|
||||
printk(KERN_INFO "%s: %sserialized, secondary interface %s\n", cmd_hwif1->name,
|
||||
cmd_hwif0->serialized ? "" : "not ", port2);
|
||||
second_port_cmd640 ? "" : "not ", port2);
|
||||
|
||||
/*
|
||||
* Establish initial timings/prefetch for all drives.
|
||||
|
@ -876,7 +871,7 @@ static int __init cmd640x_init(void)
|
|||
cmd640_dump_regs();
|
||||
#endif
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, &cmd640_port_info);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -393,6 +392,8 @@ static void __devinit init_hwif_cmd64x(ide_hwif_t *hwif)
|
|||
hwif->set_pio_mode = &cmd64x_set_pio_mode;
|
||||
hwif->set_dma_mode = &cmd64x_set_dma_mode;
|
||||
|
||||
hwif->cable_detect = ata66_cmd64x;
|
||||
|
||||
if (!hwif->dma_base)
|
||||
return;
|
||||
|
||||
|
@ -411,9 +412,6 @@ static void __devinit init_hwif_cmd64x(ide_hwif_t *hwif)
|
|||
if (dev->device == PCI_DEVICE_ID_CMD_646 && dev->revision < 5)
|
||||
hwif->ultra_mask = 0x00;
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = ata66_cmd64x(hwif);
|
||||
|
||||
switch (dev->device) {
|
||||
case PCI_DEVICE_ID_CMD_648:
|
||||
case PCI_DEVICE_ID_CMD_649:
|
||||
|
|
|
@ -35,22 +35,12 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
struct pio_clocks
|
||||
{
|
||||
int address;
|
||||
|
@ -180,7 +170,7 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic
|
|||
|
||||
ide_pci_setup_ports(dev, d, 14, &idx[0]);
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, d);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -15,18 +15,12 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ide.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
/*
|
||||
* Here are the standard PIO mode 0-4 timings for each "format".
|
||||
|
|
|
@ -155,8 +155,9 @@ static void cs5535_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|||
cs5535_set_speed(drive, XFER_PIO_0 + pio);
|
||||
}
|
||||
|
||||
static u8 __devinit cs5535_cable_detect(struct pci_dev *dev)
|
||||
static u8 __devinit cs5535_cable_detect(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
u8 bit;
|
||||
|
||||
/* if a 80 wire cable was detected */
|
||||
|
@ -175,15 +176,10 @@ static u8 __devinit cs5535_cable_detect(struct pci_dev *dev)
|
|||
*/
|
||||
static void __devinit init_hwif_cs5535(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
|
||||
hwif->set_pio_mode = &cs5535_set_pio_mode;
|
||||
hwif->set_dma_mode = &cs5535_set_dma_mode;
|
||||
|
||||
if (hwif->dma_base == 0)
|
||||
return;
|
||||
|
||||
hwif->cbl = cs5535_cable_detect(dev);
|
||||
hwif->cable_detect = cs5535_cable_detect;
|
||||
}
|
||||
|
||||
static const struct ide_port_info cs5535_chipset __devinitdata = {
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
|
|
|
@ -16,15 +16,14 @@
|
|||
* License. See the file COPYING in the main directory of this archive for
|
||||
* more details.
|
||||
*/
|
||||
#include <linux/autoconf.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
/*
|
||||
|
@ -52,6 +51,7 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
|
|||
ide_hwif_t *hwif = NULL;
|
||||
ide_drive_t *drive;
|
||||
int i, rc;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
rc = pci_enable_device(dev);
|
||||
if (rc) {
|
||||
|
@ -78,12 +78,27 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
|
|||
hw.irq = dev->irq;
|
||||
hw.chipset = ide_pci; /* this enables IRQ sharing */
|
||||
|
||||
rc = ide_register_hw(&hw, &ide_undecoded_slave, &hwif);
|
||||
if (rc < 0) {
|
||||
printk(KERN_ERR "delkin_cb: ide_register_hw failed (%d)\n", rc);
|
||||
pci_disable_device(dev);
|
||||
return -ENODEV;
|
||||
}
|
||||
hwif = ide_deprecated_find_port(hw.io_ports[IDE_DATA_OFFSET]);
|
||||
if (hwif == NULL)
|
||||
goto out_disable;
|
||||
|
||||
i = hwif->index;
|
||||
|
||||
if (hwif->present)
|
||||
ide_unregister(i, 0, 0);
|
||||
else if (!hwif->hold)
|
||||
ide_init_port_data(hwif, i);
|
||||
|
||||
ide_init_port_hw(hwif, &hw);
|
||||
hwif->quirkproc = &ide_undecoded_slave;
|
||||
|
||||
idx[0] = i;
|
||||
|
||||
ide_device_add(idx, NULL);
|
||||
|
||||
if (!hwif->present)
|
||||
goto out_disable;
|
||||
|
||||
pci_set_drvdata(dev, hwif);
|
||||
hwif->dev = &dev->dev;
|
||||
drive = &hwif->drives[0];
|
||||
|
@ -92,6 +107,11 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
|
|||
drive->unmask = 1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
out_disable:
|
||||
printk(KERN_ERR "delkin_cb: no IDE devices found\n");
|
||||
pci_disable_device(dev);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -100,7 +120,8 @@ delkin_cb_remove (struct pci_dev *dev)
|
|||
ide_hwif_t *hwif = pci_get_drvdata(dev);
|
||||
|
||||
if (hwif)
|
||||
ide_unregister(hwif->index);
|
||||
ide_unregister(hwif->index, 0, 0);
|
||||
|
||||
pci_disable_device(dev);
|
||||
}
|
||||
|
||||
|
|
|
@ -22,18 +22,11 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
static int ide_generic_all; /* Set to claim all devices */
|
||||
|
||||
/*
|
||||
|
|
|
@ -26,20 +26,13 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ide.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#define HPT343_DEBUG_DRIVE_INFO 0
|
||||
|
||||
static void hpt34x_set_mode(ide_drive_t *drive, const u8 speed)
|
||||
|
|
|
@ -121,12 +121,8 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -134,7 +130,6 @@
|
|||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
/* various tuning parameters */
|
||||
#define HPT_RESET_STATE_ENGINE
|
||||
|
@ -1279,12 +1274,55 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha
|
|||
return dev->irq;
|
||||
}
|
||||
|
||||
static u8 __devinit hpt3xx_cable_detect(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
struct hpt_info *info = pci_get_drvdata(dev);
|
||||
u8 chip_type = info->chip_type;
|
||||
u8 scr1 = 0, ata66 = hwif->channel ? 0x01 : 0x02;
|
||||
|
||||
/*
|
||||
* The HPT37x uses the CBLID pins as outputs for MA15/MA16
|
||||
* address lines to access an external EEPROM. To read valid
|
||||
* cable detect state the pins must be enabled as inputs.
|
||||
*/
|
||||
if (chip_type == HPT374 && (PCI_FUNC(dev->devfn) & 1)) {
|
||||
/*
|
||||
* HPT374 PCI function 1
|
||||
* - set bit 15 of reg 0x52 to enable TCBLID as input
|
||||
* - set bit 15 of reg 0x56 to enable FCBLID as input
|
||||
*/
|
||||
u8 mcr_addr = hwif->select_data + 2;
|
||||
u16 mcr;
|
||||
|
||||
pci_read_config_word(dev, mcr_addr, &mcr);
|
||||
pci_write_config_word(dev, mcr_addr, (mcr | 0x8000));
|
||||
/* now read cable id register */
|
||||
pci_read_config_byte(dev, 0x5a, &scr1);
|
||||
pci_write_config_word(dev, mcr_addr, mcr);
|
||||
} else if (chip_type >= HPT370) {
|
||||
/*
|
||||
* HPT370/372 and 374 pcifn 0
|
||||
* - clear bit 0 of reg 0x5b to enable P/SCBLID as inputs
|
||||
*/
|
||||
u8 scr2 = 0;
|
||||
|
||||
pci_read_config_byte(dev, 0x5b, &scr2);
|
||||
pci_write_config_byte(dev, 0x5b, (scr2 & ~1));
|
||||
/* now read cable id register */
|
||||
pci_read_config_byte(dev, 0x5a, &scr1);
|
||||
pci_write_config_byte(dev, 0x5b, scr2);
|
||||
} else
|
||||
pci_read_config_byte(dev, 0x5a, &scr1);
|
||||
|
||||
return (scr1 & ata66) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
|
||||
}
|
||||
|
||||
static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
struct hpt_info *info = pci_get_drvdata(dev);
|
||||
int serialize = HPT_SERIALIZE_IO;
|
||||
u8 scr1 = 0, ata66 = hwif->channel ? 0x01 : 0x02;
|
||||
u8 chip_type = info->chip_type;
|
||||
u8 new_mcr, old_mcr = 0;
|
||||
|
||||
|
@ -1301,6 +1339,8 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
|
|||
hwif->udma_filter = &hpt3xx_udma_filter;
|
||||
hwif->mdma_filter = &hpt3xx_mdma_filter;
|
||||
|
||||
hwif->cable_detect = hpt3xx_cable_detect;
|
||||
|
||||
/*
|
||||
* HPT3xxN chips have some complications:
|
||||
*
|
||||
|
@ -1346,43 +1386,6 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
|
|||
if (hwif->dma_base == 0)
|
||||
return;
|
||||
|
||||
/*
|
||||
* The HPT37x uses the CBLID pins as outputs for MA15/MA16
|
||||
* address lines to access an external EEPROM. To read valid
|
||||
* cable detect state the pins must be enabled as inputs.
|
||||
*/
|
||||
if (chip_type == HPT374 && (PCI_FUNC(dev->devfn) & 1)) {
|
||||
/*
|
||||
* HPT374 PCI function 1
|
||||
* - set bit 15 of reg 0x52 to enable TCBLID as input
|
||||
* - set bit 15 of reg 0x56 to enable FCBLID as input
|
||||
*/
|
||||
u8 mcr_addr = hwif->select_data + 2;
|
||||
u16 mcr;
|
||||
|
||||
pci_read_config_word (dev, mcr_addr, &mcr);
|
||||
pci_write_config_word(dev, mcr_addr, (mcr | 0x8000));
|
||||
/* now read cable id register */
|
||||
pci_read_config_byte (dev, 0x5a, &scr1);
|
||||
pci_write_config_word(dev, mcr_addr, mcr);
|
||||
} else if (chip_type >= HPT370) {
|
||||
/*
|
||||
* HPT370/372 and 374 pcifn 0
|
||||
* - clear bit 0 of reg 0x5b to enable P/SCBLID as inputs
|
||||
*/
|
||||
u8 scr2 = 0;
|
||||
|
||||
pci_read_config_byte (dev, 0x5b, &scr2);
|
||||
pci_write_config_byte(dev, 0x5b, (scr2 & ~1));
|
||||
/* now read cable id register */
|
||||
pci_read_config_byte (dev, 0x5a, &scr1);
|
||||
pci_write_config_byte(dev, 0x5b, scr2);
|
||||
} else
|
||||
pci_read_config_byte (dev, 0x5a, &scr1);
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = (scr1 & ata66) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
|
||||
|
||||
if (chip_type >= HPT374) {
|
||||
hwif->ide_dma_test_irq = &hpt374_ide_dma_test_irq;
|
||||
hwif->ide_dma_end = &hpt374_ide_dma_end;
|
||||
|
|
|
@ -10,13 +10,10 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
/**
|
||||
* it8213_set_pio_mode - set host controller for PIO mode
|
||||
* @drive: drive
|
||||
|
@ -143,6 +140,16 @@ static void it8213_set_dma_mode(ide_drive_t *drive, const u8 speed)
|
|||
}
|
||||
}
|
||||
|
||||
static u8 __devinit it8213_cable_detect(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
u8 reg42h = 0;
|
||||
|
||||
pci_read_config_byte(dev, 0x42, ®42h);
|
||||
|
||||
return (reg42h & 0x02) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
|
||||
}
|
||||
|
||||
/**
|
||||
* init_hwif_it8213 - set up hwif structs
|
||||
* @hwif: interface to set up
|
||||
|
@ -152,19 +159,10 @@ static void it8213_set_dma_mode(ide_drive_t *drive, const u8 speed)
|
|||
|
||||
static void __devinit init_hwif_it8213(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
u8 reg42h = 0;
|
||||
|
||||
hwif->set_dma_mode = &it8213_set_dma_mode;
|
||||
hwif->set_pio_mode = &it8213_set_pio_mode;
|
||||
|
||||
if (!hwif->dma_base)
|
||||
return;
|
||||
|
||||
pci_read_config_byte(dev, 0x42, ®42h);
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = (reg42h & 0x02) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
|
||||
hwif->cable_detect = it8213_cable_detect;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -63,13 +63,10 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
struct it821x_dev
|
||||
{
|
||||
unsigned int smart:1, /* Are we in smart raid mode */
|
||||
|
@ -579,14 +576,13 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
|
|||
} else
|
||||
hwif->host_flags |= IDE_HFLAG_NO_SET_MODE;
|
||||
|
||||
hwif->cable_detect = ata66_it821x;
|
||||
|
||||
if (hwif->dma_base == 0)
|
||||
return;
|
||||
|
||||
hwif->ultra_mask = ATA_UDMA6;
|
||||
hwif->mwdma_mask = ATA_MWDMA2;
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = ata66_it821x(hwif);
|
||||
}
|
||||
|
||||
static void __devinit it8212_disable_raid(struct pci_dev *dev)
|
||||
|
|
|
@ -8,13 +8,10 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
typedef enum {
|
||||
PORT_PATA0 = 0,
|
||||
PORT_PATA1 = 1,
|
||||
|
@ -111,11 +108,7 @@ static void __devinit init_hwif_jmicron(ide_hwif_t *hwif)
|
|||
hwif->set_pio_mode = &jmicron_set_pio_mode;
|
||||
hwif->set_dma_mode = &jmicron_set_dma_mode;
|
||||
|
||||
if (hwif->dma_base == 0)
|
||||
return;
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = ata66_jmicron(hwif);
|
||||
hwif->cable_detect = ata66_jmicron;
|
||||
}
|
||||
|
||||
static const struct ide_port_info jmicron_chipset __devinitdata = {
|
||||
|
|
|
@ -10,11 +10,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
|
|
|
@ -87,11 +87,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
|
@ -320,14 +315,18 @@ static void opti621_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|||
spin_unlock_irqrestore(&opti621_lock, flags);
|
||||
}
|
||||
|
||||
static void __devinit opti621_port_init_devs(ide_hwif_t *hwif)
|
||||
{
|
||||
hwif->drives[0].drive_data = PIO_DONT_KNOW;
|
||||
hwif->drives[1].drive_data = PIO_DONT_KNOW;
|
||||
}
|
||||
|
||||
/*
|
||||
* init_hwif_opti621() is called once for each hwif found at boot.
|
||||
*/
|
||||
static void __devinit init_hwif_opti621 (ide_hwif_t *hwif)
|
||||
{
|
||||
hwif->drives[0].drive_data = PIO_DONT_KNOW;
|
||||
hwif->drives[1].drive_data = PIO_DONT_KNOW;
|
||||
|
||||
hwif->port_init_devs = opti621_port_init_devs;
|
||||
hwif->set_pio_mode = &opti621_set_pio_mode;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,18 +19,12 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ide.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#ifdef CONFIG_PPC_PMAC
|
||||
#include <asm/prom.h>
|
||||
|
@ -197,7 +191,7 @@ static void pdcnew_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|||
}
|
||||
}
|
||||
|
||||
static u8 pdcnew_cable_detect(ide_hwif_t *hwif)
|
||||
static u8 __devinit pdcnew_cable_detect(ide_hwif_t *hwif)
|
||||
{
|
||||
if (get_indexed_reg(hwif, 0x0b) & 0x04)
|
||||
return ATA_CBL_PATA40;
|
||||
|
@ -456,11 +450,7 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif)
|
|||
hwif->quirkproc = &pdcnew_quirkproc;
|
||||
hwif->resetproc = &pdcnew_reset;
|
||||
|
||||
if (hwif->dma_base == 0)
|
||||
return;
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = pdcnew_cable_detect(hwif);
|
||||
hwif->cable_detect = pdcnew_cable_detect;
|
||||
}
|
||||
|
||||
static struct pci_dev * __devinit pdc20270_get_dev2(struct pci_dev *dev)
|
||||
|
|
|
@ -32,18 +32,13 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ide.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#define PDC202XX_DEBUG_DRIVE_INFO 0
|
||||
|
||||
|
@ -140,10 +135,10 @@ static void pdc202xx_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|||
pdc202xx_set_mode(drive, XFER_PIO_0 + pio);
|
||||
}
|
||||
|
||||
static u8 pdc202xx_old_cable_detect (ide_hwif_t *hwif)
|
||||
static u8 __devinit pdc2026x_old_cable_detect(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
u16 CIS = 0, mask = (hwif->channel) ? (1<<11) : (1<<10);
|
||||
u16 CIS, mask = hwif->channel ? (1 << 11) : (1 << 10);
|
||||
|
||||
pci_read_config_word(dev, 0x50, &CIS);
|
||||
|
||||
|
@ -311,9 +306,12 @@ static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif)
|
|||
|
||||
hwif->quirkproc = &pdc202xx_quirkproc;
|
||||
|
||||
if (dev->device != PCI_DEVICE_ID_PROMISE_20246)
|
||||
if (dev->device != PCI_DEVICE_ID_PROMISE_20246) {
|
||||
hwif->resetproc = &pdc202xx_reset;
|
||||
|
||||
hwif->cable_detect = pdc2026x_old_cable_detect;
|
||||
}
|
||||
|
||||
if (hwif->dma_base == 0)
|
||||
return;
|
||||
|
||||
|
@ -321,9 +319,6 @@ static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif)
|
|||
hwif->dma_timeout = &pdc202xx_dma_timeout;
|
||||
|
||||
if (dev->device != PCI_DEVICE_ID_PROMISE_20246) {
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = pdc202xx_old_cable_detect(hwif);
|
||||
|
||||
hwif->dma_start = &pdc202xx_old_ide_dma_start;
|
||||
hwif->ide_dma_end = &pdc202xx_old_ide_dma_end;
|
||||
}
|
||||
|
|
|
@ -47,11 +47,9 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
@ -290,14 +288,11 @@ static void __devinit init_hwif_piix(ide_hwif_t *hwif)
|
|||
hwif->set_pio_mode = &piix_set_pio_mode;
|
||||
hwif->set_dma_mode = &piix_set_dma_mode;
|
||||
|
||||
hwif->cable_detect = piix_cable_detect;
|
||||
|
||||
if (!hwif->dma_base)
|
||||
return;
|
||||
|
||||
if (hwif->ultra_mask & 0x78) {
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = piix_cable_detect(hwif);
|
||||
}
|
||||
|
||||
if (no_piix_dma)
|
||||
hwif->ultra_mask = hwif->mwdma_mask = hwif->swdma_mask = 0;
|
||||
}
|
||||
|
|
|
@ -16,18 +16,11 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
static void __devinit init_hwif_rz1000 (ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
|
@ -40,8 +33,7 @@ static void __devinit init_hwif_rz1000 (ide_hwif_t *hwif)
|
|||
} else {
|
||||
if (hwif->mate)
|
||||
hwif->mate->serialized = hwif->serialized = 1;
|
||||
hwif->drives[0].no_unmask = 1;
|
||||
hwif->drives[1].no_unmask = 1;
|
||||
hwif->host_flags |= IDE_HFLAG_NO_UNMASK_IRQS;
|
||||
printk(KERN_INFO "%s: serialized, disabled unmasking "
|
||||
"(buggy RZ1000/RZ1001)\n", hwif->name);
|
||||
}
|
||||
|
|
|
@ -14,19 +14,13 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/pm.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#define SC1200_REV_A 0x00
|
||||
#define SC1200_REV_B1 0x01
|
||||
|
|
|
@ -644,6 +644,11 @@ static void __devinit init_iops_scc(ide_hwif_t *hwif)
|
|||
init_mmio_iops_scc(hwif);
|
||||
}
|
||||
|
||||
static u8 __devinit scc_cable_detect(ide_hwif_t *hwif)
|
||||
{
|
||||
return ATA_CBL_PATA80;
|
||||
}
|
||||
|
||||
/**
|
||||
* init_hwif_scc - set up hwif
|
||||
* @hwif: interface to set up
|
||||
|
@ -678,8 +683,7 @@ static void __devinit init_hwif_scc(ide_hwif_t *hwif)
|
|||
else
|
||||
hwif->ultra_mask = ATA_UDMA5; /* 100MHz */
|
||||
|
||||
/* we support 80c cable only. */
|
||||
hwif->cbl = ATA_CBL_PATA80;
|
||||
hwif->cable_detect = scc_cable_detect;
|
||||
}
|
||||
|
||||
#define DECLARE_SCC_DEV(name_str) \
|
||||
|
@ -732,7 +736,7 @@ static void __devexit scc_remove(struct pci_dev *dev)
|
|||
hwif->dmatable_cpu = NULL;
|
||||
}
|
||||
|
||||
ide_unregister(hwif->index);
|
||||
ide_unregister(hwif->index, 0, 0);
|
||||
|
||||
hwif->chipset = ide_unknown;
|
||||
iounmap((void*)ports->dma);
|
||||
|
|
|
@ -31,12 +31,10 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
|
@ -346,13 +344,8 @@ static void __devinit init_hwif_svwks (ide_hwif_t *hwif)
|
|||
hwif->set_dma_mode = &svwks_set_dma_mode;
|
||||
hwif->udma_filter = &svwks_udma_filter;
|
||||
|
||||
if (!hwif->dma_base)
|
||||
return;
|
||||
|
||||
if (dev->device != PCI_DEVICE_ID_SERVERWORKS_OSB4IDE) {
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = ata66_svwks(hwif);
|
||||
}
|
||||
if (dev->device != PCI_DEVICE_ID_SERVERWORKS_OSB4IDE)
|
||||
hwif->cable_detect = ata66_svwks;
|
||||
}
|
||||
|
||||
#define IDE_HFLAGS_SVWKS \
|
||||
|
|
|
@ -25,8 +25,6 @@
|
|||
#include <linux/hdreg.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/scatterlist.h>
|
||||
|
@ -555,7 +553,6 @@ static void __devinit
|
|||
ide_init_sgiioc4(ide_hwif_t * hwif)
|
||||
{
|
||||
hwif->mmio = 1;
|
||||
hwif->pio_mask = 0x00;
|
||||
hwif->set_pio_mode = NULL; /* Sets timing for PIO mode */
|
||||
hwif->set_dma_mode = &sgiioc4_set_dma_mode;
|
||||
hwif->selectproc = NULL;/* Use the default routine to select drive */
|
||||
|
@ -572,8 +569,6 @@ ide_init_sgiioc4(ide_hwif_t * hwif)
|
|||
if (hwif->dma_base == 0)
|
||||
return;
|
||||
|
||||
hwif->mwdma_mask = ATA_MWDMA2_ONLY;
|
||||
|
||||
hwif->dma_host_set = &sgiioc4_dma_host_set;
|
||||
hwif->dma_setup = &sgiioc4_ide_dma_setup;
|
||||
hwif->dma_start = &sgiioc4_ide_dma_start;
|
||||
|
@ -583,6 +578,13 @@ ide_init_sgiioc4(ide_hwif_t * hwif)
|
|||
hwif->dma_timeout = &ide_dma_timeout;
|
||||
}
|
||||
|
||||
static const struct ide_port_info sgiioc4_port_info __devinitdata = {
|
||||
.chipset = ide_pci,
|
||||
.host_flags = IDE_HFLAG_NO_DMA | /* no SFF-style DMA */
|
||||
IDE_HFLAG_NO_AUTOTUNE,
|
||||
.mwdma_mask = ATA_MWDMA2_ONLY,
|
||||
};
|
||||
|
||||
static int __devinit
|
||||
sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
|
||||
{
|
||||
|
@ -593,6 +595,7 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
|
|||
int h;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
hw_regs_t hw;
|
||||
struct ide_port_info d = sgiioc4_port_info;
|
||||
|
||||
/*
|
||||
* Find an empty HWIF; if none available, return -ENOMEM.
|
||||
|
@ -641,7 +644,6 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
|
|||
ide_init_port_hw(hwif, &hw);
|
||||
|
||||
hwif->dev = &dev->dev;
|
||||
hwif->channel = 0; /* Single Channel chip */
|
||||
|
||||
/* The IOC4 uses MMIO rather than Port IO. */
|
||||
default_hwif_mmiops(hwif);
|
||||
|
@ -649,15 +651,17 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
|
|||
/* Initializing chipset IRQ Registers */
|
||||
writel(0x03, (void __iomem *)(irqport + IOC4_INTR_SET * 4));
|
||||
|
||||
if (dma_base == 0 || ide_dma_sgiioc4(hwif, dma_base))
|
||||
if (dma_base == 0 || ide_dma_sgiioc4(hwif, dma_base)) {
|
||||
printk(KERN_INFO "%s: %s Bus-Master DMA disabled\n",
|
||||
hwif->name, DRV_NAME);
|
||||
d.mwdma_mask = 0;
|
||||
}
|
||||
|
||||
ide_init_sgiioc4(hwif);
|
||||
|
||||
idx[0] = hwif->index;
|
||||
|
||||
if (ide_device_add(idx))
|
||||
if (ide_device_add(idx, &d))
|
||||
return -EIO;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -39,7 +39,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -332,15 +331,18 @@ static int siimage_mmio_ide_dma_test_irq (ide_drive_t *drive)
|
|||
{
|
||||
ide_hwif_t *hwif = HWIF(drive);
|
||||
unsigned long addr = siimage_selreg(hwif, 0x1);
|
||||
void __iomem *sata_error_addr
|
||||
= (void __iomem *)hwif->sata_scr[SATA_ERROR_OFFSET];
|
||||
|
||||
if (SATA_ERROR_REG) {
|
||||
if (sata_error_addr) {
|
||||
unsigned long base = (unsigned long)hwif->hwif_data;
|
||||
|
||||
u32 ext_stat = readl((void __iomem *)(base + 0x10));
|
||||
u8 watchdog = 0;
|
||||
|
||||
if (ext_stat & ((hwif->channel) ? 0x40 : 0x10)) {
|
||||
u32 sata_error = readl((void __iomem *)SATA_ERROR_REG);
|
||||
writel(sata_error, (void __iomem *)SATA_ERROR_REG);
|
||||
u32 sata_error = readl(sata_error_addr);
|
||||
|
||||
writel(sata_error, sata_error_addr);
|
||||
watchdog = (sata_error & 0x00680000) ? 1 : 0;
|
||||
printk(KERN_WARNING "%s: sata_error = 0x%08x, "
|
||||
"watchdog = %d, %s\n",
|
||||
|
@ -419,13 +421,17 @@ static int sil_sata_busproc(ide_drive_t * drive, int state)
|
|||
|
||||
static int sil_sata_reset_poll(ide_drive_t *drive)
|
||||
{
|
||||
if (SATA_STATUS_REG) {
|
||||
ide_hwif_t *hwif = HWIF(drive);
|
||||
ide_hwif_t *hwif = drive->hwif;
|
||||
void __iomem *sata_status_addr
|
||||
= (void __iomem *)hwif->sata_scr[SATA_STATUS_OFFSET];
|
||||
|
||||
/* SATA_STATUS_REG is valid only when in MMIO mode */
|
||||
if ((readl((void __iomem *)SATA_STATUS_REG) & 0x03) != 0x03) {
|
||||
if (sata_status_addr) {
|
||||
/* SATA Status is available only when in MMIO mode */
|
||||
u32 sata_stat = readl(sata_status_addr);
|
||||
|
||||
if ((sata_stat & 0x03) != 0x03) {
|
||||
printk(KERN_WARNING "%s: reset phy dead, status=0x%08x\n",
|
||||
hwif->name, readl((void __iomem *)SATA_STATUS_REG));
|
||||
hwif->name, sata_stat);
|
||||
HWGROUP(drive)->polling = 0;
|
||||
return ide_started;
|
||||
}
|
||||
|
@ -827,15 +833,14 @@ static void __devinit init_hwif_siimage(ide_hwif_t *hwif)
|
|||
} else
|
||||
hwif->udma_filter = &sil_pata_udma_filter;
|
||||
|
||||
hwif->cable_detect = ata66_siimage;
|
||||
|
||||
if (hwif->dma_base == 0)
|
||||
return;
|
||||
|
||||
if (sata)
|
||||
hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA;
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = ata66_siimage(hwif);
|
||||
|
||||
if (hwif->mmio) {
|
||||
hwif->ide_dma_test_irq = &siimage_mmio_ide_dma_test_irq;
|
||||
} else {
|
||||
|
|
|
@ -47,20 +47,11 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ide.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include "ide-timing.h"
|
||||
|
||||
/* registers layout and init values are chipset family dependant */
|
||||
|
@ -565,13 +556,12 @@ static void __devinit init_hwif_sis5513 (ide_hwif_t *hwif)
|
|||
if (chipset_family >= ATA_133)
|
||||
hwif->udma_filter = sis5513_ata133_udma_filter;
|
||||
|
||||
hwif->cable_detect = ata66_sis5513;
|
||||
|
||||
if (hwif->dma_base == 0)
|
||||
return;
|
||||
|
||||
hwif->ultra_mask = udma_rates[chipset_family];
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = ata66_sis5513(hwif);
|
||||
}
|
||||
|
||||
static const struct ide_port_info sis5513_chipset __devinitdata = {
|
||||
|
|
|
@ -17,17 +17,11 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/ide.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/dma.h>
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
|
|
|
@ -10,15 +10,11 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
static DEFINE_SPINLOCK(slc90e66_lock);
|
||||
|
||||
static void slc90e66_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||
|
@ -118,23 +114,23 @@ static void slc90e66_set_dma_mode(ide_drive_t *drive, const u8 speed)
|
|||
}
|
||||
}
|
||||
|
||||
static void __devinit init_hwif_slc90e66 (ide_hwif_t *hwif)
|
||||
static u8 __devinit slc90e66_cable_detect(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
u8 reg47 = 0;
|
||||
u8 mask = hwif->channel ? 0x01 : 0x02; /* bit0:Primary */
|
||||
|
||||
hwif->set_pio_mode = &slc90e66_set_pio_mode;
|
||||
hwif->set_dma_mode = &slc90e66_set_dma_mode;
|
||||
u8 reg47 = 0, mask = hwif->channel ? 0x01 : 0x02;
|
||||
|
||||
pci_read_config_byte(dev, 0x47, ®47);
|
||||
|
||||
if (hwif->dma_base == 0)
|
||||
return;
|
||||
/* bit[0(1)]: 0:80, 1:40 */
|
||||
return (reg47 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
|
||||
}
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
/* bit[0(1)]: 0:80, 1:40 */
|
||||
hwif->cbl = (reg47 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
|
||||
static void __devinit init_hwif_slc90e66(ide_hwif_t *hwif)
|
||||
{
|
||||
hwif->set_pio_mode = &slc90e66_set_pio_mode;
|
||||
hwif->set_dma_mode = &slc90e66_set_dma_mode;
|
||||
|
||||
hwif->cable_detect = slc90e66_cable_detect;
|
||||
}
|
||||
|
||||
static const struct ide_port_info slc90e66_chipset __devinitdata = {
|
||||
|
|
|
@ -160,6 +160,19 @@ static int tc86c001_busproc(ide_drive_t *drive, int state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static u8 __devinit tc86c001_cable_detect(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
unsigned long sc_base = pci_resource_start(dev, 5);
|
||||
u16 scr1 = inw(sc_base + 0x00);
|
||||
|
||||
/*
|
||||
* System Control 1 Register bit 13 (PDIAGN):
|
||||
* 0=80-pin cable, 1=40-pin cable
|
||||
*/
|
||||
return (scr1 & 0x2000) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
|
||||
}
|
||||
|
||||
static void __devinit init_hwif_tc86c001(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
|
@ -183,6 +196,8 @@ static void __devinit init_hwif_tc86c001(ide_hwif_t *hwif)
|
|||
|
||||
hwif->busproc = &tc86c001_busproc;
|
||||
|
||||
hwif->cable_detect = tc86c001_cable_detect;
|
||||
|
||||
if (!hwif->dma_base)
|
||||
return;
|
||||
|
||||
|
@ -196,15 +211,6 @@ static void __devinit init_hwif_tc86c001(ide_hwif_t *hwif)
|
|||
hwif->rqsize = 0xffff;
|
||||
|
||||
hwif->dma_start = &tc86c001_dma_start;
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT) {
|
||||
/*
|
||||
* System Control 1 Register bit 13 (PDIAGN):
|
||||
* 0=80-pin cable, 1=40-pin cable
|
||||
*/
|
||||
scr1 = inw(sc_base + 0x00);
|
||||
hwif->cbl = (scr1 & 0x2000) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned int __devinit init_chipset_tc86c001(struct pci_dev *dev,
|
||||
|
|
|
@ -28,11 +28,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/ide.h>
|
||||
|
|
|
@ -131,14 +131,12 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/ide.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
@ -179,10 +177,7 @@ static void trm290_selectproc (ide_drive_t *drive)
|
|||
|
||||
static void trm290_dma_exec_cmd(ide_drive_t *drive, u8 command)
|
||||
{
|
||||
BUG_ON(HWGROUP(drive)->handler != NULL); /* paranoia check */
|
||||
ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, NULL);
|
||||
/* issue cmd to drive */
|
||||
outb(command, IDE_COMMAND_REG);
|
||||
ide_execute_command(drive, command, &ide_dma_intr, WAIT_CMD, NULL);
|
||||
}
|
||||
|
||||
static int trm290_dma_setup(ide_drive_t *drive)
|
||||
|
|
|
@ -26,15 +26,11 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/dmi.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#ifdef CONFIG_PPC_CHRP
|
||||
#include <asm/processor.h>
|
||||
#endif
|
||||
|
@ -424,11 +420,7 @@ static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif)
|
|||
hwif->set_pio_mode = &via_set_pio_mode;
|
||||
hwif->set_dma_mode = &via_set_drive;
|
||||
|
||||
if (!hwif->dma_base)
|
||||
return;
|
||||
|
||||
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
|
||||
hwif->cbl = via82cxxx_cable_detect(hwif);
|
||||
hwif->cable_detect = via82cxxx_cable_detect;
|
||||
}
|
||||
|
||||
static const struct ide_port_info via82cxxx_chipset __devinitdata = {
|
||||
|
|
|
@ -848,7 +848,7 @@ static int __init mpc8xx_ide_probe(void)
|
|||
#endif
|
||||
#endif
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -412,7 +412,7 @@ kauai_lookup_timing(struct kauai_timing* table, int cycle_time)
|
|||
*/
|
||||
#define IDE_WAKEUP_DELAY (1*HZ)
|
||||
|
||||
static void pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif);
|
||||
static int pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif);
|
||||
static int pmac_ide_build_dmatable(ide_drive_t *drive, struct request *rq);
|
||||
static void pmac_ide_selectproc(ide_drive_t *drive);
|
||||
static void pmac_ide_kauai_selectproc(ide_drive_t *drive);
|
||||
|
@ -1003,6 +1003,17 @@ pmac_ide_do_resume(ide_hwif_t *hwif)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct ide_port_info pmac_port_info = {
|
||||
.chipset = ide_pmac,
|
||||
.host_flags = IDE_HFLAG_SET_PIO_MODE_KEEP_DMA |
|
||||
IDE_HFLAG_PIO_NO_DOWNGRADE |
|
||||
IDE_HFLAG_POST_SET_MODE |
|
||||
IDE_HFLAG_NO_DMA | /* no SFF-style DMA */
|
||||
IDE_HFLAG_UNMASK_IRQS,
|
||||
.pio_mask = ATA_PIO4,
|
||||
.mwdma_mask = ATA_MWDMA2,
|
||||
};
|
||||
|
||||
/*
|
||||
* Setup, register & probe an IDE channel driven by this driver, this is
|
||||
* called by one of the 2 probe functions (macio or PCI). Note that a channel
|
||||
|
@ -1016,23 +1027,28 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw)
|
|||
struct device_node *np = pmif->node;
|
||||
const int *bidp;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
struct ide_port_info d = pmac_port_info;
|
||||
|
||||
pmif->cable_80 = 0;
|
||||
pmif->broken_dma = pmif->broken_dma_warn = 0;
|
||||
if (of_device_is_compatible(np, "shasta-ata"))
|
||||
if (of_device_is_compatible(np, "shasta-ata")) {
|
||||
pmif->kind = controller_sh_ata6;
|
||||
else if (of_device_is_compatible(np, "kauai-ata"))
|
||||
d.udma_mask = ATA_UDMA6;
|
||||
} else if (of_device_is_compatible(np, "kauai-ata")) {
|
||||
pmif->kind = controller_un_ata6;
|
||||
else if (of_device_is_compatible(np, "K2-UATA"))
|
||||
d.udma_mask = ATA_UDMA5;
|
||||
} else if (of_device_is_compatible(np, "K2-UATA")) {
|
||||
pmif->kind = controller_k2_ata6;
|
||||
else if (of_device_is_compatible(np, "keylargo-ata")) {
|
||||
if (strcmp(np->name, "ata-4") == 0)
|
||||
d.udma_mask = ATA_UDMA5;
|
||||
} else if (of_device_is_compatible(np, "keylargo-ata")) {
|
||||
if (strcmp(np->name, "ata-4") == 0) {
|
||||
pmif->kind = controller_kl_ata4;
|
||||
else
|
||||
d.udma_mask = ATA_UDMA4;
|
||||
} else
|
||||
pmif->kind = controller_kl_ata3;
|
||||
} else if (of_device_is_compatible(np, "heathrow-ata"))
|
||||
} else if (of_device_is_compatible(np, "heathrow-ata")) {
|
||||
pmif->kind = controller_heathrow;
|
||||
else {
|
||||
} else {
|
||||
pmif->kind = controller_ohare;
|
||||
pmif->broken_dma = 1;
|
||||
}
|
||||
|
@ -1101,19 +1117,10 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw)
|
|||
/* Tell common code _not_ to mess with resources */
|
||||
hwif->mmio = 1;
|
||||
hwif->hwif_data = pmif;
|
||||
hw->chipset = ide_pmac;
|
||||
ide_init_port_hw(hwif, hw);
|
||||
hwif->noprobe = pmif->mediabay;
|
||||
hwif->hold = pmif->mediabay;
|
||||
hwif->cbl = pmif->cable_80 ? ATA_CBL_PATA80 : ATA_CBL_PATA40;
|
||||
hwif->drives[0].unmask = 1;
|
||||
hwif->drives[1].unmask = 1;
|
||||
hwif->drives[0].autotune = IDE_TUNE_AUTO;
|
||||
hwif->drives[1].autotune = IDE_TUNE_AUTO;
|
||||
hwif->host_flags = IDE_HFLAG_SET_PIO_MODE_KEEP_DMA |
|
||||
IDE_HFLAG_PIO_NO_DOWNGRADE |
|
||||
IDE_HFLAG_POST_SET_MODE;
|
||||
hwif->pio_mask = ATA_PIO4;
|
||||
hwif->set_pio_mode = pmac_ide_set_pio_mode;
|
||||
if (pmif->kind == controller_un_ata6
|
||||
|| pmif->kind == controller_k2_ata6
|
||||
|
@ -1133,14 +1140,16 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw)
|
|||
#endif /* CONFIG_PMAC_MEDIABAY */
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
|
||||
if (pmif->cable_80 == 0)
|
||||
d.udma_mask &= ATA_UDMA2;
|
||||
/* has a DBDMA controller channel */
|
||||
if (pmif->dma_regs)
|
||||
pmac_ide_setup_dma(pmif, hwif);
|
||||
#endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
|
||||
if (pmif->dma_regs == 0 || pmac_ide_setup_dma(pmif, hwif) < 0)
|
||||
#endif
|
||||
d.udma_mask = d.mwdma_mask = 0;
|
||||
|
||||
idx[0] = hwif->index;
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, &d);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1721,8 +1730,7 @@ pmac_ide_dma_lost_irq (ide_drive_t *drive)
|
|||
* Allocate the data structures needed for using DMA with an interface
|
||||
* and fill the proper list of functions pointers
|
||||
*/
|
||||
static void __devinit
|
||||
pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif)
|
||||
static int __devinit pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
|
||||
|
@ -1730,7 +1738,7 @@ pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif)
|
|||
* DMA routines ...
|
||||
*/
|
||||
if (dev == NULL)
|
||||
return;
|
||||
return -ENODEV;
|
||||
/*
|
||||
* Allocate space for the DBDMA commands.
|
||||
* The +2 is +1 for the stop command and +1 to allow for
|
||||
|
@ -1743,7 +1751,7 @@ pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif)
|
|||
if (pmif->dma_table_cpu == NULL) {
|
||||
printk(KERN_ERR "%s: unable to allocate DMA command list\n",
|
||||
hwif->name);
|
||||
return;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
hwif->sg_max_nents = MAX_DCMDS;
|
||||
|
@ -1757,29 +1765,7 @@ pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif)
|
|||
hwif->dma_timeout = &ide_dma_timeout;
|
||||
hwif->dma_lost_irq = &pmac_ide_dma_lost_irq;
|
||||
|
||||
switch(pmif->kind) {
|
||||
case controller_sh_ata6:
|
||||
hwif->ultra_mask = pmif->cable_80 ? 0x7f : 0x07;
|
||||
hwif->mwdma_mask = 0x07;
|
||||
hwif->swdma_mask = 0x00;
|
||||
break;
|
||||
case controller_un_ata6:
|
||||
case controller_k2_ata6:
|
||||
hwif->ultra_mask = pmif->cable_80 ? 0x3f : 0x07;
|
||||
hwif->mwdma_mask = 0x07;
|
||||
hwif->swdma_mask = 0x00;
|
||||
break;
|
||||
case controller_kl_ata4:
|
||||
hwif->ultra_mask = pmif->cable_80 ? 0x1f : 0x07;
|
||||
hwif->mwdma_mask = 0x07;
|
||||
hwif->swdma_mask = 0x00;
|
||||
break;
|
||||
default:
|
||||
hwif->ultra_mask = 0x00;
|
||||
hwif->mwdma_mask = 0x07;
|
||||
hwif->swdma_mask = 0x00;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
|
||||
|
|
|
@ -339,7 +339,8 @@ static int ide_pci_check_iomem(struct pci_dev *dev, const struct ide_port_info *
|
|||
* ide_hwif_configure - configure an IDE interface
|
||||
* @dev: PCI device holding interface
|
||||
* @d: IDE port info
|
||||
* @mate: Paired interface if any
|
||||
* @port: port number
|
||||
* @irq: PCI IRQ
|
||||
*
|
||||
* Perform the initial set up for the hardware interface structure. This
|
||||
* is done per interface port rather than per PCI device. There may be
|
||||
|
@ -348,7 +349,9 @@ static int ide_pci_check_iomem(struct pci_dev *dev, const struct ide_port_info *
|
|||
* Returns the new hardware interface structure, or NULL on a failure
|
||||
*/
|
||||
|
||||
static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, const struct ide_port_info *d, ide_hwif_t *mate, int port, int irq)
|
||||
static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev,
|
||||
const struct ide_port_info *d,
|
||||
unsigned int port, int irq)
|
||||
{
|
||||
unsigned long ctl = 0, base = 0;
|
||||
ide_hwif_t *hwif;
|
||||
|
@ -394,29 +397,24 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, const struct ide_port
|
|||
|
||||
hwif->dev = &dev->dev;
|
||||
hwif->cds = d;
|
||||
hwif->channel = port;
|
||||
|
||||
if (mate) {
|
||||
hwif->mate = mate;
|
||||
mate->mate = hwif;
|
||||
}
|
||||
return hwif;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_IDEDMA_PCI
|
||||
/**
|
||||
* ide_hwif_setup_dma - configure DMA interface
|
||||
* @dev: PCI device
|
||||
* @d: IDE port info
|
||||
* @hwif: IDE interface
|
||||
* @d: IDE port info
|
||||
*
|
||||
* Set up the DMA base for the interface. Enable the master bits as
|
||||
* necessary and attempt to bring the device DMA into a ready to use
|
||||
* state
|
||||
*/
|
||||
|
||||
static void ide_hwif_setup_dma(struct pci_dev *dev, const struct ide_port_info *d, ide_hwif_t *hwif)
|
||||
void ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d)
|
||||
{
|
||||
#ifdef CONFIG_BLK_DEV_IDEDMA_PCI
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
u16 pcicmd;
|
||||
|
||||
pci_read_config_word(dev, PCI_COMMAND, &pcicmd);
|
||||
|
@ -448,8 +446,8 @@ static void ide_hwif_setup_dma(struct pci_dev *dev, const struct ide_port_info *
|
|||
"(BIOS)\n", hwif->name, d->name);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_BLK_DEV_IDEDMA_PCI*/
|
||||
}
|
||||
#endif /* CONFIG_BLK_DEV_IDEDMA_PCI */
|
||||
|
||||
/**
|
||||
* ide_setup_pci_controller - set up IDE PCI
|
||||
|
@ -511,7 +509,7 @@ static int ide_setup_pci_controller(struct pci_dev *dev, const struct ide_port_i
|
|||
void ide_pci_setup_ports(struct pci_dev *dev, const struct ide_port_info *d, int pciirq, u8 *idx)
|
||||
{
|
||||
int channels = (d->host_flags & IDE_HFLAG_SINGLE) ? 1 : 2, port;
|
||||
ide_hwif_t *hwif, *mate = NULL;
|
||||
ide_hwif_t *hwif;
|
||||
u8 tmp;
|
||||
|
||||
/*
|
||||
|
@ -527,56 +525,11 @@ void ide_pci_setup_ports(struct pci_dev *dev, const struct ide_port_info *d, int
|
|||
continue; /* port not enabled */
|
||||
}
|
||||
|
||||
if ((hwif = ide_hwif_configure(dev, d, mate, port, pciirq)) == NULL)
|
||||
hwif = ide_hwif_configure(dev, d, port, pciirq);
|
||||
if (hwif == NULL)
|
||||
continue;
|
||||
|
||||
*(idx + port) = hwif->index;
|
||||
|
||||
if (d->init_iops)
|
||||
d->init_iops(hwif);
|
||||
|
||||
if ((d->host_flags & IDE_HFLAG_NO_DMA) == 0)
|
||||
ide_hwif_setup_dma(dev, d, hwif);
|
||||
|
||||
if ((!hwif->irq && (d->host_flags & IDE_HFLAG_LEGACY_IRQS)) ||
|
||||
(d->host_flags & IDE_HFLAG_FORCE_LEGACY_IRQS))
|
||||
hwif->irq = port ? 15 : 14;
|
||||
|
||||
hwif->host_flags = d->host_flags;
|
||||
hwif->pio_mask = d->pio_mask;
|
||||
|
||||
if ((d->host_flags & IDE_HFLAG_SERIALIZE) && hwif->mate)
|
||||
hwif->mate->serialized = hwif->serialized = 1;
|
||||
|
||||
if (d->host_flags & IDE_HFLAG_IO_32BIT) {
|
||||
hwif->drives[0].io_32bit = 1;
|
||||
hwif->drives[1].io_32bit = 1;
|
||||
}
|
||||
|
||||
if (d->host_flags & IDE_HFLAG_UNMASK_IRQS) {
|
||||
hwif->drives[0].unmask = 1;
|
||||
hwif->drives[1].unmask = 1;
|
||||
}
|
||||
|
||||
if (hwif->dma_base) {
|
||||
hwif->swdma_mask = d->swdma_mask;
|
||||
hwif->mwdma_mask = d->mwdma_mask;
|
||||
hwif->ultra_mask = d->udma_mask;
|
||||
}
|
||||
|
||||
hwif->drives[0].autotune = 1;
|
||||
hwif->drives[1].autotune = 1;
|
||||
|
||||
if (d->host_flags & IDE_HFLAG_RQSIZE_256)
|
||||
hwif->rqsize = 256;
|
||||
|
||||
if (d->init_hwif)
|
||||
/* Call chipset-specific routine
|
||||
* for each enabled hwif
|
||||
*/
|
||||
d->init_hwif(hwif);
|
||||
|
||||
mate = hwif;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -658,7 +611,7 @@ int ide_setup_pci_device(struct pci_dev *dev, const struct ide_port_info *d)
|
|||
ret = do_ide_setup_pci_device(dev, d, &idx[0], 1);
|
||||
|
||||
if (ret >= 0)
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, d);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -682,7 +635,7 @@ int ide_setup_pci_devices(struct pci_dev *dev1, struct pci_dev *dev2,
|
|||
goto out;
|
||||
}
|
||||
|
||||
ide_device_add(idx);
|
||||
ide_device_add(idx, d);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -595,7 +595,7 @@ static void media_bay_step(int i)
|
|||
if (bay->cd_index >= 0) {
|
||||
printk(KERN_DEBUG "Unregistering mb %d ide, index:%d\n", i,
|
||||
bay->cd_index);
|
||||
ide_unregister(bay->cd_index);
|
||||
ide_unregister(bay->cd_index, 1, 1);
|
||||
bay->cd_index = -1;
|
||||
}
|
||||
if (bay->cd_retry) {
|
||||
|
|
|
@ -588,19 +588,14 @@ static ide_startstop_t idescsi_issue_pc (ide_drive_t *drive, idescsi_pc_t *pc)
|
|||
hwif->sg_mapped = 0;
|
||||
}
|
||||
|
||||
SELECT_DRIVE(drive);
|
||||
|
||||
ide_pktcmd_tf_load(drive, IDE_TFLAG_NO_SELECT_MASK, bcount, dma);
|
||||
|
||||
if (dma)
|
||||
set_bit(PC_DMA_OK, &pc->flags);
|
||||
|
||||
if (test_bit(IDESCSI_DRQ_INTERRUPT, &scsi->flags)) {
|
||||
BUG_ON(HWGROUP(drive)->handler != NULL);
|
||||
ide_set_handler(drive, &idescsi_transfer_pc,
|
||||
get_timeout(pc), idescsi_expiry);
|
||||
/* Issue the packet command */
|
||||
HWIF(drive)->OUTB(WIN_PACKETCMD, IDE_COMMAND_REG);
|
||||
ide_execute_command(drive, WIN_PACKETCMD, &idescsi_transfer_pc,
|
||||
get_timeout(pc), idescsi_expiry);
|
||||
return ide_started;
|
||||
} else {
|
||||
/* Issue the packet command */
|
||||
|
|
|
@ -706,8 +706,10 @@ struct hd_driveid {
|
|||
*/
|
||||
#define IDE_NICE_DSC_OVERLAP (0) /* per the DSC overlap protocol */
|
||||
#define IDE_NICE_ATAPI_OVERLAP (1) /* not supported yet */
|
||||
#define IDE_NICE_0 (2) /* when sure that it won't affect us */
|
||||
#define IDE_NICE_1 (3) /* when probably won't affect us much */
|
||||
#ifndef __KERNEL__
|
||||
#define IDE_NICE_0 (2) /* when sure that it won't affect us */
|
||||
#define IDE_NICE_2 (4) /* when we know it's on our expense */
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_HDREG_H */
|
||||
|
|
|
@ -112,18 +112,12 @@ typedef unsigned char byte; /* used everywhere */
|
|||
#define SATA_NR_PORTS (3) /* 16 possible ?? */
|
||||
|
||||
#define SATA_STATUS_OFFSET (0)
|
||||
#define SATA_STATUS_REG (HWIF(drive)->sata_scr[SATA_STATUS_OFFSET])
|
||||
#define SATA_ERROR_OFFSET (1)
|
||||
#define SATA_ERROR_REG (HWIF(drive)->sata_scr[SATA_ERROR_OFFSET])
|
||||
#define SATA_CONTROL_OFFSET (2)
|
||||
#define SATA_CONTROL_REG (HWIF(drive)->sata_scr[SATA_CONTROL_OFFSET])
|
||||
|
||||
#define SATA_MISC_OFFSET (0)
|
||||
#define SATA_MISC_REG (HWIF(drive)->sata_misc[SATA_MISC_OFFSET])
|
||||
#define SATA_PHY_OFFSET (1)
|
||||
#define SATA_PHY_REG (HWIF(drive)->sata_misc[SATA_PHY_OFFSET])
|
||||
#define SATA_IEN_OFFSET (2)
|
||||
#define SATA_IEN_REG (HWIF(drive)->sata_misc[SATA_IEN_OFFSET])
|
||||
|
||||
/*
|
||||
* Our Physical Region Descriptor (PRD) table should be large enough
|
||||
|
@ -196,6 +190,7 @@ typedef struct hw_regs_s {
|
|||
} hw_regs_t;
|
||||
|
||||
struct hwif_s * ide_find_port(unsigned long);
|
||||
struct hwif_s *ide_deprecated_find_port(unsigned long);
|
||||
void ide_init_port_data(struct hwif_s *, unsigned int);
|
||||
void ide_init_port_hw(struct hwif_s *, hw_regs_t *);
|
||||
|
||||
|
@ -406,8 +401,6 @@ typedef struct ide_drive_s {
|
|||
unsigned no_unmask : 1; /* disallow setting unmask bit */
|
||||
unsigned no_io_32bit : 1; /* disallow enabling 32bit I/O */
|
||||
unsigned atapi_overlap : 1; /* ATAPI overlap (not supported) */
|
||||
unsigned nice0 : 1; /* give obvious excess bandwidth */
|
||||
unsigned nice2 : 1; /* give a share in our own bandwidth */
|
||||
unsigned doorlocking : 1; /* for removable only: door lock/unlock works */
|
||||
unsigned nodma : 1; /* disallow DMA */
|
||||
unsigned autotune : 2; /* 0=default, 1=autotune, 2=noautotune */
|
||||
|
@ -487,7 +480,6 @@ typedef struct hwif_s {
|
|||
u8 major; /* our major number */
|
||||
u8 index; /* 0 for ide0; 1 for ide1; ... */
|
||||
u8 channel; /* for dual-port chips: 0=primary, 1=secondary */
|
||||
u8 straight8; /* Alan's straight 8 check */
|
||||
u8 bus_state; /* power state of the IDE bus */
|
||||
|
||||
u32 host_flags;
|
||||
|
@ -513,6 +505,8 @@ typedef struct hwif_s {
|
|||
#if 0
|
||||
ide_hwif_ops_t *hwifops;
|
||||
#else
|
||||
/* host specific initialization of devices on a port */
|
||||
void (*port_init_devs)(struct hwif_s *);
|
||||
/* routine to program host for PIO mode */
|
||||
void (*set_pio_mode)(ide_drive_t *, const u8);
|
||||
/* routine to program host for DMA mode */
|
||||
|
@ -535,6 +529,8 @@ typedef struct hwif_s {
|
|||
u8 (*mdma_filter)(ide_drive_t *);
|
||||
u8 (*udma_filter)(ide_drive_t *);
|
||||
|
||||
u8 (*cable_detect)(struct hwif_s *);
|
||||
|
||||
void (*ata_input_data)(ide_drive_t *, void *, u32);
|
||||
void (*ata_output_data)(ide_drive_t *, void *, u32);
|
||||
|
||||
|
@ -602,10 +598,9 @@ typedef struct hwif_s {
|
|||
unsigned serialized : 1; /* serialized all channel operation */
|
||||
unsigned sharing_irq: 1; /* 1 = sharing irq with another hwif */
|
||||
unsigned reset : 1; /* reset after probe */
|
||||
unsigned auto_poll : 1; /* supports nop auto-poll */
|
||||
unsigned sg_mapped : 1; /* sg_table and sg_nents are ready */
|
||||
unsigned no_io_32bit : 1; /* 1 = can not do 32-bit IO ops */
|
||||
unsigned mmio : 1; /* host uses MMIO */
|
||||
unsigned straight8 : 1; /* Alan's straight 8 check */
|
||||
|
||||
struct device gendev;
|
||||
struct completion gendev_rel_comp; /* To deal with device release() */
|
||||
|
@ -625,6 +620,9 @@ typedef struct hwif_s {
|
|||
typedef ide_startstop_t (ide_handler_t)(ide_drive_t *);
|
||||
typedef int (ide_expiry_t)(ide_drive_t *);
|
||||
|
||||
/* used by ide-cd, ide-floppy, etc. */
|
||||
typedef void (xfer_func_t)(ide_drive_t *, void *, u32);
|
||||
|
||||
typedef struct hwgroup_s {
|
||||
/* irq handler, if active */
|
||||
ide_startstop_t (*handler)(ide_drive_t *);
|
||||
|
@ -708,6 +706,7 @@ typedef struct {
|
|||
void proc_ide_create(void);
|
||||
void proc_ide_destroy(void);
|
||||
void ide_proc_register_port(ide_hwif_t *);
|
||||
void ide_proc_port_register_devices(ide_hwif_t *);
|
||||
void ide_proc_unregister_port(ide_hwif_t *);
|
||||
void ide_proc_register_driver(ide_drive_t *, ide_driver_t *);
|
||||
void ide_proc_unregister_driver(ide_drive_t *, ide_driver_t *);
|
||||
|
@ -740,6 +739,7 @@ void ide_pci_create_host_proc(const char *, get_info_t *);
|
|||
static inline void proc_ide_create(void) { ; }
|
||||
static inline void proc_ide_destroy(void) { ; }
|
||||
static inline void ide_proc_register_port(ide_hwif_t *hwif) { ; }
|
||||
static inline void ide_proc_port_register_devices(ide_hwif_t *hwif) { ; }
|
||||
static inline void ide_proc_unregister_port(ide_hwif_t *hwif) { ; }
|
||||
static inline void ide_proc_register_driver(ide_drive_t *drive, ide_driver_t *driver) { ; }
|
||||
static inline void ide_proc_unregister_driver(ide_drive_t *drive, ide_driver_t *driver) { ; }
|
||||
|
@ -988,10 +988,8 @@ int ide_task_ioctl(ide_drive_t *, unsigned int, unsigned long);
|
|||
extern int system_bus_clock(void);
|
||||
|
||||
extern int ide_driveid_update(ide_drive_t *);
|
||||
extern int ide_ata66_check(ide_drive_t *, ide_task_t *);
|
||||
extern int ide_config_drive_speed(ide_drive_t *, u8);
|
||||
extern u8 eighty_ninty_three (ide_drive_t *);
|
||||
extern int set_transfer(ide_drive_t *, ide_task_t *);
|
||||
extern int taskfile_lib_get_identify(ide_drive_t *drive, u8 *);
|
||||
|
||||
extern int ide_wait_not_busy(ide_hwif_t *hwif, unsigned long timeout);
|
||||
|
@ -1016,6 +1014,13 @@ extern int __ide_pci_register_driver(struct pci_driver *driver, struct module *o
|
|||
void ide_pci_setup_ports(struct pci_dev *, const struct ide_port_info *, int, u8 *);
|
||||
void ide_setup_pci_noise(struct pci_dev *, const struct ide_port_info *);
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_IDEDMA_PCI
|
||||
void ide_hwif_setup_dma(ide_hwif_t *, const struct ide_port_info *);
|
||||
#else
|
||||
static inline void ide_hwif_setup_dma(ide_hwif_t *hwif,
|
||||
const struct ide_port_info *d) { }
|
||||
#endif
|
||||
|
||||
extern void default_hwif_iops(ide_hwif_t *);
|
||||
extern void default_hwif_mmiops(ide_hwif_t *);
|
||||
extern void default_hwif_transport(ide_hwif_t *);
|
||||
|
@ -1052,7 +1057,7 @@ enum {
|
|||
IDE_HFLAG_NO_SET_MODE = (1 << 9),
|
||||
/* trust BIOS for programming chipset/device for DMA */
|
||||
IDE_HFLAG_TRUST_BIOS_FOR_DMA = (1 << 10),
|
||||
/* host uses VDMA */
|
||||
/* host uses VDMA (tied with IDE_HFLAG_CS5520 for now) */
|
||||
IDE_HFLAG_VDMA = (1 << 11),
|
||||
/* ATAPI DMA is unsupported */
|
||||
IDE_HFLAG_NO_ATAPI_DMA = (1 << 12),
|
||||
|
@ -1062,8 +1067,10 @@ enum {
|
|||
IDE_HFLAG_NO_DMA = (1 << 14),
|
||||
/* check if host is PCI IDE device before allowing DMA */
|
||||
IDE_HFLAG_NO_AUTODMA = (1 << 15),
|
||||
/* don't autotune PIO */
|
||||
IDE_HFLAG_NO_AUTOTUNE = (1 << 16),
|
||||
/* host is CS5510/CS5520 */
|
||||
IDE_HFLAG_CS5520 = (1 << 16),
|
||||
IDE_HFLAG_CS5520 = IDE_HFLAG_VDMA,
|
||||
/* no LBA48 */
|
||||
IDE_HFLAG_NO_LBA48 = (1 << 17),
|
||||
/* no LBA48 DMA */
|
||||
|
@ -1089,6 +1096,10 @@ enum {
|
|||
IDE_HFLAG_CLEAR_SIMPLEX = (1 << 28),
|
||||
/* DSC overlap is unsupported */
|
||||
IDE_HFLAG_NO_DSC = (1 << 29),
|
||||
/* never use 32-bit I/O ops */
|
||||
IDE_HFLAG_NO_IO_32BIT = (1 << 30),
|
||||
/* never unmask IRQs */
|
||||
IDE_HFLAG_NO_UNMASK_IRQS = (1 << 31),
|
||||
};
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_OFFBOARD
|
||||
|
@ -1144,6 +1155,7 @@ void ide_dma_off_quietly(ide_drive_t *);
|
|||
void ide_dma_off(ide_drive_t *);
|
||||
void ide_dma_on(ide_drive_t *);
|
||||
int ide_set_dma(ide_drive_t *);
|
||||
void ide_check_dma_crc(ide_drive_t *);
|
||||
ide_startstop_t ide_dma_intr(ide_drive_t *);
|
||||
|
||||
int ide_build_sglist(ide_drive_t *, struct request *);
|
||||
|
@ -1171,6 +1183,7 @@ static inline void ide_dma_off(ide_drive_t *drive) { ; }
|
|||
static inline void ide_dma_on(ide_drive_t *drive) { ; }
|
||||
static inline void ide_dma_verbose(ide_drive_t *drive) { ; }
|
||||
static inline int ide_set_dma(ide_drive_t *drive) { return 1; }
|
||||
static inline void ide_check_dma_crc(ide_drive_t *drive) { ; }
|
||||
#endif /* CONFIG_BLK_DEV_IDEDMA */
|
||||
|
||||
#ifndef CONFIG_BLK_DEV_IDEDMA_PCI
|
||||
|
@ -1182,27 +1195,29 @@ extern int ide_acpi_exec_tfs(ide_drive_t *drive);
|
|||
extern void ide_acpi_get_timing(ide_hwif_t *hwif);
|
||||
extern void ide_acpi_push_timing(ide_hwif_t *hwif);
|
||||
extern void ide_acpi_init(ide_hwif_t *hwif);
|
||||
void ide_acpi_port_init_devices(ide_hwif_t *);
|
||||
extern void ide_acpi_set_state(ide_hwif_t *hwif, int on);
|
||||
#else
|
||||
static inline int ide_acpi_exec_tfs(ide_drive_t *drive) { return 0; }
|
||||
static inline void ide_acpi_get_timing(ide_hwif_t *hwif) { ; }
|
||||
static inline void ide_acpi_push_timing(ide_hwif_t *hwif) { ; }
|
||||
static inline void ide_acpi_init(ide_hwif_t *hwif) { ; }
|
||||
static inline void ide_acpi_port_init_devices(ide_hwif_t *hwif) { ; }
|
||||
static inline void ide_acpi_set_state(ide_hwif_t *hwif, int on) {}
|
||||
#endif
|
||||
|
||||
void ide_remove_port_from_hwgroup(ide_hwif_t *);
|
||||
extern int ide_hwif_request_regions(ide_hwif_t *hwif);
|
||||
extern void ide_hwif_release_regions(ide_hwif_t* hwif);
|
||||
extern void ide_unregister (unsigned int index);
|
||||
void ide_unregister(unsigned int, int, int);
|
||||
|
||||
void ide_register_region(struct gendisk *);
|
||||
void ide_unregister_region(struct gendisk *);
|
||||
|
||||
void ide_undecoded_slave(ide_drive_t *);
|
||||
|
||||
int ide_device_add_all(u8 *idx);
|
||||
int ide_device_add(u8 idx[4]);
|
||||
int ide_device_add_all(u8 *idx, const struct ide_port_info *);
|
||||
int ide_device_add(u8 idx[4], const struct ide_port_info *);
|
||||
|
||||
static inline void *ide_get_hwifdata (ide_hwif_t * hwif)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue