2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
									
										
										
										
											2005-08-28 20:18:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *   libata - core . c  -  helper  library  for  ATA 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-14 11:09:50 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *   Maintained  by :   Tejun  Heo  < tj @ kernel . org > 
							 
						 
					
						
							
								
									
										
										
										
											2005-08-28 20:18:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *     		    Please  ALWAYS  copy  linux - ide @ vger . kernel . org 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 		    on  emails . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   Copyright  2003 - 2004  Red  Hat ,  Inc .   All  rights  reserved . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   Copyright  2003 - 2004  Jeff  Garzik 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   This  program  is  free  software ;  you  can  redistribute  it  and / or  modify 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   it  under  the  terms  of  the  GNU  General  Public  License  as  published  by 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   the  Free  Software  Foundation ;  either  version  2 ,  or  ( at  your  option ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   any  later  version . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   This  program  is  distributed  in  the  hope  that  it  will  be  useful , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   but  WITHOUT  ANY  WARRANTY ;  without  even  the  implied  warranty  of 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   MERCHANTABILITY  or  FITNESS  FOR  A  PARTICULAR  PURPOSE .   See  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   GNU  General  Public  License  for  more  details . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   You  should  have  received  a  copy  of  the  GNU  General  Public  License 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   along  with  this  program ;  see  the  file  COPYING .   If  not ,  write  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   the  Free  Software  Foundation ,  675  Mass  Ave ,  Cambridge ,  MA  0213 9 ,  USA . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   libata  documentation  is  available  via  ' make  { ps | pdf } docs ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   as  Documentation / DocBook / libata . * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   Hardware  documentation  available  from  http : //www.t13.org/ and
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *   http : //www.sata-io.org/
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-19 14:30:16 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *   Standards  documents  from : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	http : //www.t13.org (ATA standards, PCI DMA IDE spec)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	http : //www.t10.org (SCSI MMC - for ATAPI MMC)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	http : //www.sata-io.org (SATA)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	http : //www.compactflash.org (CF)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	http : //www.qic.org (QIC157 - Tape and DSC)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	http : //www.ce-ata.org (CE-ATA: not supported)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/kernel.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/module.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/pci.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/init.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/list.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/mm.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/spinlock.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/blkdev.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/delay.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/timer.h> 
  
						 
					
						
							
								
									
										
										
										
											2016-01-07 21:18:52 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/time.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  <linux/interrupt.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/completion.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/suspend.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/workqueue.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-09-17 17:55:31 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/scatterlist.h> 
  
						 
					
						
							
								
									
										
										
										
											2007-10-19 06:42:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/io.h> 
  
						 
					
						
							
								
									
										
										
										
											2009-01-04 05:32:28 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/async.h> 
  
						 
					
						
							
								
									
										
										
										
											2009-03-19 13:32:21 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/log2.h> 
  
						 
					
						
							
								
									
										
											 
										
											
												include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
percpu.h is included by sched.h and module.h and thus ends up being
included when building most .c files.  percpu.h includes slab.h which
in turn includes gfp.h making everything defined by the two files
universally available and complicating inclusion dependencies.
percpu.h -> slab.h dependency is about to be removed.  Prepare for
this change by updating users of gfp and slab facilities include those
headers directly instead of assuming availability.  As this conversion
needs to touch large number of source files, the following script is
used as the basis of conversion.
  http://userweb.kernel.org/~tj/misc/slabh-sweep.py
The script does the followings.
* Scan files for gfp and slab usages and update includes such that
  only the necessary includes are there.  ie. if only gfp is used,
  gfp.h, if slab is used, slab.h.
* When the script inserts a new include, it looks at the include
  blocks and try to put the new include such that its order conforms
  to its surrounding.  It's put in the include block which contains
  core kernel includes, in the same order that the rest are ordered -
  alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
  doesn't seem to be any matching order.
* If the script can't find a place to put a new include (mostly
  because the file doesn't have fitting include block), it prints out
  an error message indicating which .h file needs to be added to the
  file.
The conversion was done in the following steps.
1. The initial automatic conversion of all .c files updated slightly
   over 4000 files, deleting around 700 includes and adding ~480 gfp.h
   and ~3000 slab.h inclusions.  The script emitted errors for ~400
   files.
2. Each error was manually checked.  Some didn't need the inclusion,
   some needed manual addition while adding it to implementation .h or
   embedding .c file was more appropriate for others.  This step added
   inclusions to around 150 files.
3. The script was run again and the output was compared to the edits
   from #2 to make sure no file was left behind.
4. Several build tests were done and a couple of problems were fixed.
   e.g. lib/decompress_*.c used malloc/free() wrappers around slab
   APIs requiring slab.h to be added manually.
5. The script was run on all .h files but without automatically
   editing them as sprinkling gfp.h and slab.h inclusions around .h
   files could easily lead to inclusion dependency hell.  Most gfp.h
   inclusion directives were ignored as stuff from gfp.h was usually
   wildly available and often used in preprocessor macros.  Each
   slab.h inclusion directive was examined and added manually as
   necessary.
6. percpu.h was updated not to include slab.h.
7. Build test were done on the following configurations and failures
   were fixed.  CONFIG_GCOV_KERNEL was turned off for all tests (as my
   distributed build env didn't work with gcov compiles) and a few
   more options had to be turned off depending on archs to make things
   build (like ipr on powerpc/64 which failed due to missing writeq).
   * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
   * powerpc and powerpc64 SMP allmodconfig
   * sparc and sparc64 SMP allmodconfig
   * ia64 SMP allmodconfig
   * s390 SMP allmodconfig
   * alpha SMP allmodconfig
   * um on x86_64 SMP allmodconfig
8. percpu.h modifications were reverted so that it could be applied as
   a separate patch and serve as bisection point.
Given the fact that I had only a couple of failures from tests on step
6, I'm fairly confident about the coverage of this conversion patch.
If there is a breakage, it's likely to be something in one of the arch
headers which should be easily discoverable easily on most builds of
the specific arch.
Signed-off-by: Tejun Heo <tj@kernel.org>
Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
											 
										 
										
											2010-03-24 17:04:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/slab.h> 
  
						 
					
						
							
								
									
										
										
										
											2014-08-06 16:09:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/glob.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  <scsi/scsi.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-11-07 00:59:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <scsi/scsi_cmnd.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  <scsi/scsi_host.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/libata.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <asm/byteorder.h> 
  
						 
					
						
							
								
									
										
										
										
											2007-12-12 12:21:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/cdrom.h> 
  
						 
					
						
							
								
									
										
										
										
											2010-04-12 21:11:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/ratelimit.h> 
  
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:28 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/pm_runtime.h> 
  
						 
					
						
							
								
									
										
										
										
											2012-11-02 12:29:32 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/platform_device.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 16:46:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define CREATE_TRACE_POINTS 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <trace/events/libata.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  "libata.h" 
  
						 
					
						
							
								
									
										
										
										
											2010-05-25 12:31:38 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "libata-transport.h" 
  
						 
					
						
							
								
									
										
										
										
											2007-01-31 07:43:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* debounce timing parameters in msecs { interval, duration, timeout } */  
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:26 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  unsigned  long  sata_deb_timing_normal [ ] 		=  {    5 ,   100 ,  2000  } ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  unsigned  long  sata_deb_timing_hotplug [ ] 		=  {   25 ,   500 ,  2000  } ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  unsigned  long  sata_deb_timing_long [ ] 		=  {  100 ,  2000 ,  5000  } ;  
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement and use ops inheritance
libata lets low level drivers build ata_port_operations table and
register it with libata core layer.  This allows low level drivers
high level of flexibility but also burdens them with lots of
boilerplate entries.
This becomes worse for drivers which support related similar
controllers which differ slightly.  They share most of the operations
except for a few.  However, the driver still needs to list all
operations for each variant.  This results in large number of
duplicate entries, which is not only inefficient but also error-prone
as it becomes very difficult to tell what the actual differences are.
This duplicate boilerplates all over the low level drivers also make
updating the core layer exteremely difficult and error-prone.  When
compounded with multi-branched development model, it ends up
accumulating inconsistencies over time.  Some of those inconsistencies
cause immediate problems and fixed.  Others just remain there dormant
making maintenance increasingly difficult.
To rectify the problem, this patch implements ata_port_operations
inheritance.  To allow LLDs to easily re-use their own ops tables
overriding only specific methods, this patch implements poor man's
class inheritance.  An ops table has ->inherits field which can be set
to any ops table as long as it doesn't create a loop.  When the host
is started, the inheritance chain is followed and any operation which
isn't specified is taken from the nearest ancestor which has it
specified.  This operation is called finalization and done only once
per an ops table and the LLD doesn't have to do anything special about
it other than making the ops table non-const such that libata can
update it.
libata provides four base ops tables lower drivers can inherit from -
base, sata, pmp, sff and bmdma.  To avoid overriding these ops
accidentaly, these ops are declared const and LLDs should always
inherit these instead of using them directly.
After finalization, all the ops table are identical before and after
the patch except for setting .irq_handler to ata_interrupt in drivers
which didn't use to.  The .irq_handler doesn't have any actual effect
and the field will soon be removed by later patch.
* sata_sx4 is still using old style EH and currently doesn't take
  advantage of ops inheritance.
Signed-off-by: Tejun Heo <htejun@gmail.com>
											 
										 
										
											2008-03-25 12:22:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  struct  ata_port_operations  ata_base_port_ops  =  {  
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									. prereset 		=  ata_std_prereset , 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									. postreset 		=  ata_std_postreset , 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: make reset related methods proper port operations
Currently reset methods are not specified directly in the
ata_port_operations table.  If a LLD wants to use custom reset
methods, it should construct and use a error_handler which uses those
reset methods.  It's done this way for two reasons.
First, the ops table already contained too many methods and adding
four more of them would noticeably increase the amount of necessary
boilerplate code all over low level drivers.
Second, as ->error_handler uses those reset methods, it can get
confusing.  ie. By overriding ->error_handler, those reset ops can be
made useless making layering a bit hazy.
Now that ops table uses inheritance, the first problem doesn't exist
anymore.  The second isn't completely solved but is relieved by
providing default values - most drivers can just override what it has
implemented and don't have to concern itself about higher level
callbacks.  In fact, there currently is no driver which actually
modifies error handling behavior.  Drivers which override
->error_handler just wraps the standard error handler only to prepare
the controller for EH.  I don't think making ops layering strict has
any noticeable benefit.
This patch makes ->prereset, ->softreset, ->hardreset, ->postreset and
their PMP counterparts propoer ops.  Default ops are provided in the
base ops tables and drivers are converted to override individual reset
methods instead of creating custom error_handler.
* ata_std_error_handler() doesn't use sata_std_hardreset() if SCRs
  aren't accessible.  sata_promise doesn't need to use separate
  error_handlers for PATA and SATA anymore.
* softreset is broken for sata_inic162x and sata_sx4.  As libata now
  always prefers hardreset, this doesn't really matter but the ops are
  forced to NULL using ATA_OP_NULL for documentation purpose.
* pata_hpt374 needs to use different prereset for the first and second
  PCI functions.  This used to be done by branching from
  hpt374_error_handler().  The proper way to do this is to use
  separate ops and port_info tables for each function.  Converted.
Signed-off-by: Tejun Heo <htejun@gmail.com>
											 
										 
										
											2008-03-25 12:22:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									. error_handler 		=  ata_std_error_handler , 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:25:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									. sched_eh 		=  ata_std_sched_eh , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. end_eh 			=  ata_std_end_eh , 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement and use ops inheritance
libata lets low level drivers build ata_port_operations table and
register it with libata core layer.  This allows low level drivers
high level of flexibility but also burdens them with lots of
boilerplate entries.
This becomes worse for drivers which support related similar
controllers which differ slightly.  They share most of the operations
except for a few.  However, the driver still needs to list all
operations for each variant.  This results in large number of
duplicate entries, which is not only inefficient but also error-prone
as it becomes very difficult to tell what the actual differences are.
This duplicate boilerplates all over the low level drivers also make
updating the core layer exteremely difficult and error-prone.  When
compounded with multi-branched development model, it ends up
accumulating inconsistencies over time.  Some of those inconsistencies
cause immediate problems and fixed.  Others just remain there dormant
making maintenance increasingly difficult.
To rectify the problem, this patch implements ata_port_operations
inheritance.  To allow LLDs to easily re-use their own ops tables
overriding only specific methods, this patch implements poor man's
class inheritance.  An ops table has ->inherits field which can be set
to any ops table as long as it doesn't create a loop.  When the host
is started, the inheritance chain is followed and any operation which
isn't specified is taken from the nearest ancestor which has it
specified.  This operation is called finalization and done only once
per an ops table and the LLD doesn't have to do anything special about
it other than making the ops table non-const such that libata can
update it.
libata provides four base ops tables lower drivers can inherit from -
base, sata, pmp, sff and bmdma.  To avoid overriding these ops
accidentaly, these ops are declared const and LLDs should always
inherit these instead of using them directly.
After finalization, all the ops table are identical before and after
the patch except for setting .irq_handler to ata_interrupt in drivers
which didn't use to.  The .irq_handler doesn't have any actual effect
and the field will soon be removed by later patch.
* sata_sx4 is still using old style EH and currently doesn't take
  advantage of ops inheritance.
Signed-off-by: Tejun Heo <htejun@gmail.com>
											 
										 
										
											2008-03-25 12:22:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  struct  ata_port_operations  sata_port_ops  =  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. inherits 		=  & ata_base_port_ops , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. qc_defer 		=  ata_std_qc_defer , 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									. hardreset 		=  sata_std_hardreset , 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement and use ops inheritance
libata lets low level drivers build ata_port_operations table and
register it with libata core layer.  This allows low level drivers
high level of flexibility but also burdens them with lots of
boilerplate entries.
This becomes worse for drivers which support related similar
controllers which differ slightly.  They share most of the operations
except for a few.  However, the driver still needs to list all
operations for each variant.  This results in large number of
duplicate entries, which is not only inefficient but also error-prone
as it becomes very difficult to tell what the actual differences are.
This duplicate boilerplates all over the low level drivers also make
updating the core layer exteremely difficult and error-prone.  When
compounded with multi-branched development model, it ends up
accumulating inconsistencies over time.  Some of those inconsistencies
cause immediate problems and fixed.  Others just remain there dormant
making maintenance increasingly difficult.
To rectify the problem, this patch implements ata_port_operations
inheritance.  To allow LLDs to easily re-use their own ops tables
overriding only specific methods, this patch implements poor man's
class inheritance.  An ops table has ->inherits field which can be set
to any ops table as long as it doesn't create a loop.  When the host
is started, the inheritance chain is followed and any operation which
isn't specified is taken from the nearest ancestor which has it
specified.  This operation is called finalization and done only once
per an ops table and the LLD doesn't have to do anything special about
it other than making the ops table non-const such that libata can
update it.
libata provides four base ops tables lower drivers can inherit from -
base, sata, pmp, sff and bmdma.  To avoid overriding these ops
accidentaly, these ops are declared const and LLDs should always
inherit these instead of using them directly.
After finalization, all the ops table are identical before and after
the patch except for setting .irq_handler to ata_interrupt in drivers
which didn't use to.  The .irq_handler doesn't have any actual effect
and the field will soon be removed by later patch.
* sata_sx4 is still using old style EH and currently doesn't take
  advantage of ops inheritance.
Signed-off-by: Tejun Heo <htejun@gmail.com>
											 
										 
										
											2008-03-25 12:22:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  unsigned  int  ata_dev_init_params ( struct  ata_device  * dev ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													u16  heads ,  u16  sectors ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  unsigned  int  ata_dev_set_xfermode ( struct  ata_device  * dev ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  ata_dev_xfermask ( struct  ata_device  * dev ) ;  
						 
					
						
							
								
									
										
										
										
											2007-07-05 13:31:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  unsigned  long  ata_dev_blacklisted ( const  struct  ata_device  * dev ) ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-04-22 11:38:00 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								atomic_t  ata_print_id  =  ATOMIC_INIT ( 0 ) ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  ata_force_param  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  char 	* name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  int 	cbl ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int 		spd_limit ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long 	xfer_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  int 	horkage_on ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  int 	horkage_off ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-08-13 20:19:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int 	lflags ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  ata_force_ent  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int 			port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int 			device ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_force_param 	param ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  struct  ata_force_ent  * ata_force_tbl ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  ata_force_tbl_size ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  char  ata_force_param_buf [ PAGE_SIZE ]  __initdata ;  
						 
					
						
							
								
									
										
										
										
											2008-03-09 20:21:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* param_buf is thrown away after initialization, disallow read */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								module_param_string ( force ,  ata_force_param_buf ,  sizeof ( ata_force_param_buf ) ,  0 ) ;  
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MODULE_PARM_DESC ( force ,  " Force ATA configurations including cable type, link speed and transfer mode (see Documentation/kernel-parameters.txt for details) " ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 07:52:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  atapi_enabled  =  1 ;  
						 
					
						
							
								
									
										
										
										
											2005-08-30 03:37:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								module_param ( atapi_enabled ,  int ,  0444 ) ;  
						 
					
						
							
								
									
										
										
										
											2009-06-22 09:46:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MODULE_PARM_DESC ( atapi_enabled ,  " Enable discovery of ATAPI devices (0=off, 1=on [default]) " ) ;  
						 
					
						
							
								
									
										
										
										
											2005-08-30 03:37:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-02-25 02:07:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  atapi_dmadir  =  0 ;  
						 
					
						
							
								
									
										
										
										
											2006-04-04 10:57:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								module_param ( atapi_dmadir ,  int ,  0444 ) ;  
						 
					
						
							
								
									
										
										
										
											2009-06-22 09:46:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MODULE_PARM_DESC ( atapi_dmadir ,  " Enable ATAPI DMADIR bridge support (0=off [default], 1=on) " ) ;  
						 
					
						
							
								
									
										
										
										
											2006-04-04 10:57:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-08 01:08:45 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  atapi_passthru16  =  1 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								module_param ( atapi_passthru16 ,  int ,  0444 ) ;  
						 
					
						
							
								
									
										
										
										
											2009-06-22 09:46:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MODULE_PARM_DESC ( atapi_passthru16 ,  " Enable ATA_16 passthru for ATAPI devices (0=off, 1=on [default]) " ) ;  
						 
					
						
							
								
									
										
										
										
											2007-08-08 01:08:45 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-27 22:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  libata_fua  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								module_param_named ( fua ,  libata_fua ,  int ,  0444 ) ;  
						 
					
						
							
								
									
										
										
										
											2009-06-22 09:46:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MODULE_PARM_DESC ( fua ,  " FUA support (0=off [default], 1=on) " ) ;  
						 
					
						
							
								
									
										
										
										
											2006-02-27 22:31:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-19 06:42:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_ignore_hpa ;  
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								module_param_named ( ignore_hpa ,  ata_ignore_hpa ,  int ,  0644 ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MODULE_PARM_DESC ( ignore_hpa ,  " Ignore HPA limit (0=keep BIOS limits, 1=ignore limits, using full disk) " ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-02 12:38:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  libata_dma_mask  =  ATA_DMA_MASK_ATA | ATA_DMA_MASK_ATAPI | ATA_DMA_MASK_CFA ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								module_param_named ( dma ,  libata_dma_mask ,  int ,  0444 ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MODULE_PARM_DESC ( dma ,  " DMA enable/disable (0x1==ATA, 0x2==ATAPI, 0x4==CF) " ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-05-20 02:17:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_probe_timeout ;  
						 
					
						
							
								
									
										
										
										
											2006-06-25 01:36:52 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								module_param ( ata_probe_timeout ,  int ,  0444 ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MODULE_PARM_DESC ( ata_probe_timeout ,  " Set ATA probing timeout (seconds) " ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-05 16:28:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  libata_noacpi  =  0 ;  
						 
					
						
							
								
									
										
										
										
											2007-03-28 01:57:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								module_param_named ( noacpi ,  libata_noacpi ,  int ,  0444 ) ;  
						 
					
						
							
								
									
										
										
										
											2009-06-22 09:46:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MODULE_PARM_DESC ( noacpi ,  " Disable the use of ACPI in probe/suspend/resume (0=off [default], 1=on) " ) ;  
						 
					
						
							
								
									
										
										
										
											2006-09-28 11:29:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-04 22:05:49 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  libata_allow_tpm  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								module_param_named ( allow_tpm ,  libata_allow_tpm ,  int ,  0444 ) ;  
						 
					
						
							
								
									
										
										
										
											2009-06-22 09:46:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MODULE_PARM_DESC ( allow_tpm ,  " Permit the use of TPM commands (0=off [default], 1=on) " ) ;  
						 
					
						
							
								
									
										
										
										
											2007-11-04 22:05:49 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-05-19 15:38:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  atapi_an ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								module_param ( atapi_an ,  int ,  0444 ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MODULE_PARM_DESC ( atapi_an ,  " Enable ATAPI AN media presence notification (0=0ff [default], 1=on) " ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								MODULE_AUTHOR ( " Jeff Garzik " ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MODULE_DESCRIPTION ( " Library module for ATA devices " ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MODULE_LICENSE ( " GPL " ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MODULE_VERSION ( DRV_VERSION ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-06-02 18:17:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  bool  ata_sstatus_online ( u32  sstatus )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ( sstatus  &  0xf )  = =  0x3 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_link_next  -  link  iteration  helper 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  the  previous  link ,  NULL  to  start 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ap :  ATA  port  containing  links  to  iterate 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ mode :  iteration  mode ,  one  of  ATA_LITER_ * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Host  lock  or  EH  context . 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Pointer  to  the  next  link . 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  ata_link  * ata_link_next ( struct  ata_link  * link ,  struct  ata_port  * ap ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											       enum  ata_link_iter_mode  mode ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									BUG_ON ( mode  ! =  ATA_LITER_EDGE  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									       mode  ! =  ATA_LITER_PMP_FIRST  & &  mode  ! =  ATA_LITER_HOST_FIRST ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* NULL link indicates start of iteration */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! link ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										switch  ( mode )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_LITER_EDGE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_LITER_PMP_FIRST : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( sata_pmp_attached ( ap ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  ap - > pmp_link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* fall through */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_LITER_HOST_FIRST : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  & ap - > link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* we just iterated over the host link, what's next? */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( link  = =  & ap - > link ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										switch  ( mode )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_LITER_HOST_FIRST : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( sata_pmp_attached ( ap ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  ap - > pmp_link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* fall through */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_LITER_PMP_FIRST : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( unlikely ( ap - > slave_link ) ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  ap - > slave_link ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* fall through */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_LITER_EDGE : 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  NULL ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* slave_link excludes PMP */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( unlikely ( link  = =  ap - > slave_link ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* we were over a PMP link */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( + + link  <  ap - > pmp_link  +  ap - > nr_pmp_links ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  link ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( mode  = =  ATA_LITER_PMP_FIRST ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  & ap - > link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_dev_next  -  device  iteration  helper 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  the  previous  device ,  NULL  to  start 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  containing  devices  to  iterate 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ mode :  iteration  mode ,  one  of  ATA_DITER_ * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Host  lock  or  EH  context . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Pointer  to  the  next  device . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  ata_device  * ata_dev_next ( struct  ata_device  * dev ,  struct  ata_link  * link ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												enum  ata_dev_iter_mode  mode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BUG_ON ( mode  ! =  ATA_DITER_ENABLED  & &  mode  ! =  ATA_DITER_ENABLED_REVERSE  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									       mode  ! =  ATA_DITER_ALL  & &  mode  ! =  ATA_DITER_ALL_REVERSE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* NULL dev indicates start of iteration */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! dev ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										switch  ( mode )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_DITER_ENABLED : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_DITER_ALL : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev  =  link - > device ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  check ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_DITER_ENABLED_REVERSE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_DITER_ALL_REVERSE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev  =  link - > device  +  ata_link_max_devices ( link )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  check ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 next : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* move to the next one */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( mode )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_DITER_ENABLED : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_DITER_ALL : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( + + dev  <  link - > device  +  ata_link_max_devices ( link ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  check ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_DITER_ENABLED_REVERSE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_DITER_ALL_REVERSE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( - - dev  > =  link - > device ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  check ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 check : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ( mode  = =  ATA_DITER_ENABLED  | |  mode  = =  ATA_DITER_ENABLED_REVERSE )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    ! ata_dev_enabled ( dev ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  next ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  dev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_dev_phys_link  -  find  physical  link  for  a  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  ATA  device  to  look  up  physical  link  for 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Look  up  physical  link  which  @ dev  is  attached  to .   Note  that 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	this  is  different  from  @ dev - > link  only  when  @ dev  is  on  slave 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	link .   For  all  other  cases ,  it ' s  the  same  as  @ dev - > link . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Don ' t  care . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Pointer  to  the  found  physical  link . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  ata_link  * ata_dev_phys_link ( struct  ata_device  * dev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  dev - > link - > ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ap - > slave_link ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  dev - > link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! dev - > devno ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  & ap - > link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ap - > slave_link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_force_cbl  -  force  cable  type  according  to  libata . force 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-22 12:21:37 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ ap :  ATA  port  of  interest 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Force  cable  type  according  to  libata . force  and  whine  about  it . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	The  last  entry  which  has  matching  port  number  is  used ,  so  it 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	can  be  specified  as  part  of  device  force  parameters .   For 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	example ,  both  " a:40c,1.00:udma4 "  and  " 1.00:40c,udma4 "  have  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	same  effect . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	EH  context . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  ata_force_cbl ( struct  ata_port  * ap )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  ata_force_tbl_size  -  1 ;  i  > =  0 ;  i - - )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  struct  ata_force_ent  * fe  =  & ata_force_tbl [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( fe - > port  ! =  - 1  & &  fe - > port  ! =  ap - > print_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( fe - > param . cbl  = =  ATA_CBL_NONE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ap - > cbl  =  fe - > param . cbl ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_port_notice ( ap ,  " FORCE: cable set to %s \n " ,  fe - > param . name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2008-08-13 20:19:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_force_link_limits  -  force  link  limits  according  to  libata . force 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  of  interest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2008-08-13 20:19:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Force  link  flags  and  SATA  spd  limit  according  to  libata . force 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	and  whine  about  it .   When  only  the  port  part  is  specified 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	( e . g .  1 : ) ,  the  limit  applies  to  all  links  connected  to  both 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	the  host  link  and  all  fan - out  ports  connected  via  PMP .   If  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	device  part  is  specified  as  0  ( e . g .  1.00 : ) ,  it  specifies  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	first  fan - out  link  not  the  host  link .   Device  number  15  always 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	points  to  the  host  link  whether  PMP  is  attached  or  not .   If  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	controller  has  slave  link ,  device  number  16  points  to  it . 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	EH  context . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-08-13 20:19:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  ata_force_link_limits ( struct  ata_link  * link )  
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-08-13 20:19:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  did_spd  =  false ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  linkno  =  link - > pmp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  i ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ata_is_host_link ( link ) ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										linkno  + =  15 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  ata_force_tbl_size  -  1 ;  i  > =  0 ;  i - - )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  struct  ata_force_ent  * fe  =  & ata_force_tbl [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( fe - > port  ! =  - 1  & &  fe - > port  ! =  link - > ap - > print_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( fe - > device  ! =  - 1  & &  fe - > device  ! =  linkno ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-08-13 20:19:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* only honor the first spd limit */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! did_spd  & &  fe - > param . spd_limit )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											link - > hw_sata_spd_limit  =  ( 1  < <  fe - > param . spd_limit )  -  1 ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_link_notice ( link ,  " FORCE: PHY spd limit set to %s \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2008-08-13 20:19:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													fe - > param . name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											did_spd  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-08-13 20:19:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* let lflags stack */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( fe - > param . lflags )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											link - > flags  | =  fe - > param . lflags ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_link_notice ( link , 
							 
						 
					
						
							
								
									
										
										
										
											2008-08-13 20:19:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													" FORCE: link flag 0x%x forced -> 0x%x \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													fe - > param . lflags ,  link - > flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_force_xfermask  -  force  xfermask  according  to  libata . force 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  ATA  device  of  interest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Force  xfer_mask  according  to  libata . force  and  whine  about  it . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	For  consistency  with  link  selection ,  device  number  15  selects 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	the  first  device  connected  to  the  host  link . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	EH  context . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  ata_force_xfermask ( struct  ata_device  * dev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  devno  =  dev - > link - > pmp  +  dev - > devno ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  alt_devno  =  devno ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* allow n.15/16 for devices attached to host port */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ata_is_host_link ( dev - > link ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										alt_devno  + =  15 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  ata_force_tbl_size  -  1 ;  i  > =  0 ;  i - - )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  struct  ata_force_ent  * fe  =  & ata_force_tbl [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										unsigned  long  pio_mask ,  mwdma_mask ,  udma_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( fe - > port  ! =  - 1  & &  fe - > port  ! =  dev - > link - > ap - > print_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( fe - > device  ! =  - 1  & &  fe - > device  ! =  devno  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    fe - > device  ! =  alt_devno ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! fe - > param . xfer_mask ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_unpack_xfermask ( fe - > param . xfer_mask , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												    & pio_mask ,  & mwdma_mask ,  & udma_mask ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( udma_mask ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev - > udma_mask  =  udma_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else  if  ( mwdma_mask )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev - > udma_mask  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev - > mwdma_mask  =  mwdma_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev - > udma_mask  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev - > mwdma_mask  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev - > pio_mask  =  pio_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_notice ( dev ,  " FORCE: xfer_mask set to %s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											       fe - > param . name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_force_horkage  -  force  horkage  according  to  libata . force 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  ATA  device  of  interest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Force  horkage  according  to  libata . force  and  whine  about  it . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	For  consistency  with  link  selection ,  device  number  15  selects 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	the  first  device  connected  to  the  host  link . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	EH  context . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  ata_force_horkage ( struct  ata_device  * dev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  devno  =  dev - > link - > pmp  +  dev - > devno ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  alt_devno  =  devno ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* allow n.15/16 for devices attached to host port */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ata_is_host_link ( dev - > link ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										alt_devno  + =  15 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  ata_force_tbl_size ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  struct  ata_force_ent  * fe  =  & ata_force_tbl [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( fe - > port  ! =  - 1  & &  fe - > port  ! =  dev - > link - > ap - > print_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( fe - > device  ! =  - 1  & &  fe - > device  ! =  devno  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    fe - > device  ! =  alt_devno ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ( ~ dev - > horkage  &  fe - > param . horkage_on )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    ! ( dev - > horkage  &  fe - > param . horkage_off ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > horkage  | =  fe - > param . horkage_on ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > horkage  & =  ~ fe - > param . horkage_off ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_notice ( dev ,  " FORCE: horkage modified (%s) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											       fe - > param . name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-04-02 17:28:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	atapi_cmd_type  -  Determine  ATAPI  command  type  from  SCSI  opcode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ opcode :  SCSI  opcode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Determine  ATAPI  command  type  from  @ opcode . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ATAPI_ { READ | WRITE | READ_CD | PASS_THRU | MISC } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  atapi_cmd_type ( u8  opcode )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( opcode )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  GPCMD_READ_10 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  GPCMD_READ_12 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ATAPI_READ ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  GPCMD_WRITE_10 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  GPCMD_WRITE_12 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  GPCMD_WRITE_AND_VERIFY_10 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ATAPI_WRITE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  GPCMD_READ_CD : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  GPCMD_READ_CD_MSF : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ATAPI_READ_CD ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-04-02 17:35:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  ATA_16 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_12 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( atapi_passthru16 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  ATAPI_PASS_THRU ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* fall thru */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-02 17:28:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ATAPI_MISC ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_tf_to_fis  -  Convert  ATA  taskfile  to  SATA  FIS  structure 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ tf :  Taskfile  to  convert 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ pmp :  Port  multiplier  port 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-16 14:29:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ is_cmd :  This  FIS  is  for  command 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ fis :  Buffer  into  which  data  will  output 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Converts  a  standard  ATA  taskfile  to  a  Serial  ATA 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	FIS  structure  ( Register  -  Host  to  Device ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  caller . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-16 14:29:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_tf_to_fis ( const  struct  ata_taskfile  * tf ,  u8  pmp ,  int  is_cmd ,  u8  * fis )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-07-16 14:29:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									fis [ 0 ]  =  0x27 ; 			/* Register - Host to Device FIS */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 1 ]  =  pmp  &  0xf ; 		/* Port multiplier number*/ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( is_cmd ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										fis [ 1 ]  | =  ( 1  < <  7 ) ; 	/* bit 7 indicates Command FIS */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									fis [ 2 ]  =  tf - > command ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 3 ]  =  tf - > feature ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 4 ]  =  tf - > lbal ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 5 ]  =  tf - > lbam ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 6 ]  =  tf - > lbah ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 7 ]  =  tf - > device ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 8 ]  =  tf - > hob_lbal ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 9 ]  =  tf - > hob_lbam ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 10 ]  =  tf - > hob_lbah ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 11 ]  =  tf - > hob_feature ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 12 ]  =  tf - > nsect ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 13 ]  =  tf - > hob_nsect ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 14 ]  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 15 ]  =  tf - > ctl ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-01 08:59:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									fis [ 16 ]  =  tf - > auxiliary  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 17 ]  =  ( tf - > auxiliary  > >  8 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 18 ]  =  ( tf - > auxiliary  > >  16 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fis [ 19 ]  =  ( tf - > auxiliary  > >  24 )  &  0xff ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_tf_from_fis  -  Convert  SATA  FIS  to  ATA  taskfile 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ fis :  Buffer  from  which  data  will  be  input 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ tf :  Taskfile  to  output 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2005-11-12 18:55:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Converts  a  serial  ATA  FIS  structure  to  a  standard  ATA  taskfile . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  caller . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-10-22 14:27:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_tf_from_fis ( const  u8  * fis ,  struct  ata_taskfile  * tf )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf - > command 	=  fis [ 2 ] ; 	/* status */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf - > feature 	=  fis [ 3 ] ; 	/* error */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf - > lbal 	=  fis [ 4 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf - > lbam 	=  fis [ 5 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf - > lbah 	=  fis [ 6 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf - > device 	=  fis [ 7 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf - > hob_lbal 	=  fis [ 8 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf - > hob_lbam 	=  fis [ 9 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf - > hob_lbah 	=  fis [ 10 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf - > nsect 	=  fis [ 12 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf - > hob_nsect 	=  fis [ 13 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-10-12 15:06:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  u8  ata_rw_cmds [ ]  =  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* pio multi */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ATA_CMD_READ_MULTI , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ATA_CMD_WRITE_MULTI , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ATA_CMD_READ_MULTI_EXT , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ATA_CMD_WRITE_MULTI_EXT , 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:56:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ATA_CMD_WRITE_MULTI_FUA_EXT , 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-12 15:06:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* pio */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ATA_CMD_PIO_READ , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ATA_CMD_PIO_WRITE , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ATA_CMD_PIO_READ_EXT , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ATA_CMD_PIO_WRITE_EXT , 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:56:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									0 , 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-12 15:06:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* dma */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ATA_CMD_READ , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ATA_CMD_WRITE , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ATA_CMD_READ_EXT , 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:56:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ATA_CMD_WRITE_EXT , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ATA_CMD_WRITE_FUA_EXT 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-12 15:06:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2005-10-12 15:06:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_rwcmd_protocol  -  set  taskfile  r / w  commands  and  protocol 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ tf :  command  to  examine  and  configure 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  device  tf  belongs  to 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 09:56:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Examine  the  device  configuration  and  tf - > flags  to  calculate 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-12 15:06:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	the  proper  read / write  commands  and  protocol  to  use . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	caller . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_rwcmd_protocol ( struct  ata_taskfile  * tf ,  struct  ata_device  * dev )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:56:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u8  cmd ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:56:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  index ,  fua ,  lba48 ,  write ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 09:56:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:56:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									fua  =  ( tf - > flags  &  ATA_TFLAG_FUA )  ?  4  :  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-12 15:06:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									lba48  =  ( tf - > flags  &  ATA_TFLAG_LBA48 )  ?  2  :  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									write  =  ( tf - > flags  &  ATA_TFLAG_WRITE )  ?  1  :  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-10-12 15:06:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dev - > flags  &  ATA_DFLAG_PIO )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > protocol  =  ATA_PROT_PIO ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:56:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										index  =  dev - > multi_count  ?  0  :  8 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( lba48  & &  ( dev - > link - > ap - > flags  &  ATA_FLAG_PIO_LBA48 ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-17 20:50:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* Unable to use DMA due to host limitation */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > protocol  =  ATA_PROT_PIO ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-13 18:55:25 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										index  =  dev - > multi_count  ?  0  :  8 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-12 15:06:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > protocol  =  ATA_PROT_DMA ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:56:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										index  =  16 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-12 15:06:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:56:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cmd  =  ata_rw_cmds [ index  +  fua  +  lba48  +  write ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( cmd )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > command  =  cmd ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:37:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_tf_read_block  -  Read  block  address  from  ATA  taskfile 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ tf :  ATA  taskfile  of  interest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  ATA  device  @ tf  belongs  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Read  block  address  from  @ tf .   This  function  can  handle  all 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	three  address  formats  -  LBA ,  LBA48  and  CHS .   tf - > protocol  and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	flags  select  the  address  format  to  use . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Block  address  read  from  @ tf . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-03 11:41:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								u64  ata_tf_read_block ( struct  ata_taskfile  * tf ,  struct  ata_device  * dev )  
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:37:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u64  block  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-03 11:41:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( tf - > flags  &  ATA_TFLAG_LBA )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:37:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( tf - > flags  &  ATA_TFLAG_LBA48 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											block  | =  ( u64 ) tf - > hob_lbah  < <  40 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											block  | =  ( u64 ) tf - > hob_lbam  < <  32 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-04 10:34:48 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											block  | =  ( u64 ) tf - > hob_lbal  < <  24 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:37:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											block  | =  ( tf - > device  &  0xf )  < <  24 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										block  | =  tf - > lbah  < <  16 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										block  | =  tf - > lbam  < <  8 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										block  | =  tf - > lbal ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										u32  cyl ,  head ,  sect ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cyl  =  tf - > lbam  |  ( tf - > lbah  < <  8 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										head  =  tf - > device  &  0xf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sect  =  tf - > lbal ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-08-16 21:21:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! sect )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												     " device reported invalid CHS sector 0 \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-08-16 21:21:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											sect  =  1 ;  /* oh well */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										block  =  ( cyl  *  dev - > heads  +  head )  *  dev - > sectors  +  sect  -  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:37:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  block ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_build_rw_tf  -  Build  ATA  taskfile  for  given  read / write  request 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ tf :  Target  ATA  taskfile 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  ATA  device  @ tf  belongs  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ block :  Block  address 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ n_block :  Number  of  blocks 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ tf_flags :  RW / FUA  etc . . . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ tag :  tag 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Build  ATA  taskfile  @ tf  for  read / write  request  described  by 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ block ,  @ n_block ,  @ tf_flags  and  @ tag  on  @ dev . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - ERANGE  if  the  request  is  too  large  for  @ dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	- EINVAL  if  the  request  is  invalid . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_build_rw_tf ( struct  ata_taskfile  * tf ,  struct  ata_device  * dev ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    u64  block ,  u32  n_block ,  unsigned  int  tf_flags , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    unsigned  int  tag ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf - > flags  | =  ATA_TFLAG_ISADDR  |  ATA_TFLAG_DEVICE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf - > flags  | =  tf_flags ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-02-20 23:20:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_ncq_enabled ( dev )  & &  likely ( tag  ! =  ATA_TAG_INTERNAL ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* yay, NCQ */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! lba_48_ok ( block ,  n_block ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  - ERANGE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > protocol  =  ATA_PROT_NCQ ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > flags  | =  ATA_TFLAG_LBA  |  ATA_TFLAG_LBA48 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( tf - > flags  &  ATA_TFLAG_WRITE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tf - > command  =  ATA_CMD_FPDMA_WRITE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tf - > command  =  ATA_CMD_FPDMA_READ ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > nsect  =  tag  < <  3 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > hob_feature  =  ( n_block  > >  8 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > feature  =  n_block  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > hob_lbah  =  ( block  > >  40 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > hob_lbam  =  ( block  > >  32 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > hob_lbal  =  ( block  > >  24 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > lbah  =  ( block  > >  16 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > lbam  =  ( block  > >  8 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > lbal  =  block  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-21 22:18:50 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tf - > device  =  ATA_LBA ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( tf - > flags  &  ATA_TFLAG_FUA ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tf - > device  | =  1  < <  7 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( dev - > flags  &  ATA_DFLAG_LBA )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > flags  | =  ATA_TFLAG_LBA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( lba_28_ok ( block ,  n_block ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* use LBA28 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tf - > device  | =  ( block  > >  24 )  &  0xf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( lba_48_ok ( block ,  n_block ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! ( dev - > flags  &  ATA_DFLAG_LBA48 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  - ERANGE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* use LBA48 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tf - > flags  | =  ATA_TFLAG_LBA48 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tf - > hob_nsect  =  ( n_block  > >  8 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tf - > hob_lbah  =  ( block  > >  40 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tf - > hob_lbam  =  ( block  > >  32 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tf - > hob_lbal  =  ( block  > >  24 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* request too large even for LBA48 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  - ERANGE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( unlikely ( ata_rwcmd_protocol ( tf ,  dev )  <  0 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > nsect  =  n_block  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > lbah  =  ( block  > >  16 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > lbam  =  ( block  > >  8 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > lbal  =  block  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > device  | =  ATA_LBA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* CHS */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										u32  sect ,  head ,  cyl ,  track ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* The request -may- be too large for CHS addressing. */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! lba_28_ok ( block ,  n_block ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  - ERANGE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( unlikely ( ata_rwcmd_protocol ( tf ,  dev )  <  0 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* Convert LBA to CHS */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										track  =  ( u32 ) block  /  dev - > sectors ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cyl    =  track  /  dev - > heads ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										head   =  track  %  dev - > heads ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sect   =  ( u32 ) block  %  dev - > sectors  +  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										DPRINTK ( " block %u track %u cyl %u head %u sect %u \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											( u32 ) block ,  track ,  cyl ,  head ,  sect ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* Check whether the converted CHS can fit.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   Cylinder :  0 - 65535 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   Head :  0 - 15 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   Sector :  1 - 255 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ( cyl  > >  16 )  | |  ( head  > >  4 )  | |  ( sect  > >  8 )  | |  ( ! sect ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  - ERANGE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > nsect  =  n_block  &  0xff ;  /* Sector count 0 means 256 sectors */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > lbal  =  sect ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > lbam  =  cyl ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > lbah  =  cyl  > >  8 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf - > device  | =  head ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_pack_xfermask  -  Pack  pio ,  mwdma  and  udma  masks  into  xfer_mask 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ pio_mask :  pio_mask 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ mwdma_mask :  mwdma_mask 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ udma_mask :  udma_mask 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Pack  @ pio_mask ,  @ mwdma_mask  and  @ udma_mask  into  a  single 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	unsigned  int  xfer_mask . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Packed  xfer_mask . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								unsigned  long  ata_pack_xfermask ( unsigned  long  pio_mask ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												unsigned  long  mwdma_mask , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												unsigned  long  udma_mask ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ( ( pio_mask  < <  ATA_SHIFT_PIO )  &  ATA_MASK_PIO )  | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										( ( mwdma_mask  < <  ATA_SHIFT_MWDMA )  &  ATA_MASK_MWDMA )  | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										( ( udma_mask  < <  ATA_SHIFT_UDMA )  &  ATA_MASK_UDMA ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 14:07:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_unpack_xfermask  -  Unpack  xfer_mask  into  pio ,  mwdma  and  udma  masks 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ xfer_mask :  xfer_mask  to  unpack 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ pio_mask :  resulting  pio_mask 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ mwdma_mask :  resulting  mwdma_mask 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ udma_mask :  resulting  udma_mask 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Unpack  @ xfer_mask  into  @ pio_mask ,  @ mwdma_mask  and  @ udma_mask . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Any  NULL  distination  masks  will  be  ignored . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_unpack_xfermask ( unsigned  long  xfer_mask ,  unsigned  long  * pio_mask ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 unsigned  long  * mwdma_mask ,  unsigned  long  * udma_mask ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 14:07:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pio_mask ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* pio_mask  =  ( xfer_mask  &  ATA_MASK_PIO )  > >  ATA_SHIFT_PIO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( mwdma_mask ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* mwdma_mask  =  ( xfer_mask  &  ATA_MASK_MWDMA )  > >  ATA_SHIFT_MWDMA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( udma_mask ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* udma_mask  =  ( xfer_mask  &  ATA_MASK_UDMA )  > >  ATA_SHIFT_UDMA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  struct  ata_xfer_ent  {  
						 
					
						
							
								
									
										
										
										
											2006-03-31 22:48:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  shift ,  bits ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u8  base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  ata_xfer_tbl [ ]  =  {  
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  ATA_SHIFT_PIO ,  ATA_NR_PIO_MODES ,  XFER_PIO_0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  ATA_SHIFT_MWDMA ,  ATA_NR_MWDMA_MODES ,  XFER_MW_DMA_0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  ATA_SHIFT_UDMA ,  ATA_NR_UDMA_MODES ,  XFER_UDMA_0  } , 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  - 1 ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_xfer_mask2mode  -  Find  matching  XFER_ *  for  the  given  xfer_mask 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ xfer_mask :  xfer_mask  of  interest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Return  matching  XFER_ *  value  for  @ xfer_mask .   Only  the  highest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	bit  of  @ xfer_mask  is  considered . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Matching  XFER_ *  value ,  0xff  if  no  match  found . 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								u8  ata_xfer_mask2mode ( unsigned  long  xfer_mask )  
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  highbit  =  fls ( xfer_mask )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  struct  ata_xfer_ent  * ent ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( ent  =  ata_xfer_tbl ;  ent - > shift  > =  0 ;  ent + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( highbit  > =  ent - > shift  & &  highbit  <  ent - > shift  +  ent - > bits ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  ent - > base  +  highbit  -  ent - > shift ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0xff ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_xfer_mode2mask  -  Find  matching  xfer_mask  for  XFER_ * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ xfer_mode :  XFER_ *  of  interest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Return  matching  xfer_mask  for  @ xfer_mode . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Matching  xfer_mask ,  0  if  no  match  found . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								unsigned  long  ata_xfer_mode2mask ( u8  xfer_mode )  
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  struct  ata_xfer_ent  * ent ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( ent  =  ata_xfer_tbl ;  ent - > shift  > =  0 ;  ent + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( xfer_mode  > =  ent - > base  & &  xfer_mode  <  ent - > base  +  ent - > bits ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  ( ( 2  < <  ( ent - > shift  +  xfer_mode  -  ent - > base ) )  -  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												&  ~ ( ( 1  < <  ent - > shift )  -  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_xfer_mode2shift  -  Find  matching  xfer_shift  for  XFER_ * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ xfer_mode :  XFER_ *  of  interest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Return  matching  xfer_shift  for  @ xfer_mode . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Matching  xfer_shift ,  - 1  if  no  match  found . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_xfer_mode2shift ( unsigned  long  xfer_mode )  
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  struct  ata_xfer_ent  * ent ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( ent  =  ata_xfer_tbl ;  ent - > shift  > =  0 ;  ent + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( xfer_mode  > =  ent - > base  & &  xfer_mode  <  ent - > base  +  ent - > bits ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  ent - > shift ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_mode_string  -  convert  xfer_mask  to  string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ xfer_mask :  mask  of  bits  supported ;  only  highest  bit  counts . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Determine  string  which  represents  the  highest  speed 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	( highest  bit  in  @ modemask ) . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Constant  C  string  representing  highest  speed  listed  in 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ mode_mask ,  or  the  constant  C  string  " <n/a> " . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  char  * ata_mode_string ( unsigned  long  xfer_mask )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  const  char  *  const  xfer_mode_str [ ]  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" PIO0 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" PIO1 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" PIO2 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" PIO3 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" PIO4 " , 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 18:52:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" PIO5 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" PIO6 " , 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" MWDMA0 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" MWDMA1 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" MWDMA2 " , 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 18:52:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" MWDMA3 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" MWDMA4 " , 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" UDMA/16 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" UDMA/25 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" UDMA/33 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" UDMA/44 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" UDMA/66 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" UDMA/100 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" UDMA/133 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" UDMA7 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  highbit ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									highbit  =  fls ( xfer_mask )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( highbit  > =  0  & &  highbit  <  ARRAY_SIZE ( xfer_mode_str ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  xfer_mode_str [ highbit ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  " <n/a> " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 12:31:38 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  char  * sata_spd_string ( unsigned  int  spd )  
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									static  const  char  *  const  spd_str [ ]  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" 1.5 Gbps " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" 3.0 Gbps " , 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-30 11:00:37 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" 6.0 Gbps " , 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( spd  = =  0  | |  ( spd  -  1 )  > =  ARRAY_SIZE ( spd_str ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  " <unknown> " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  spd_str [ spd  -  1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_dev_classify  -  determine  device  type  based  on  ATA - spec  signature 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ tf :  ATA  taskfile  register  set  for  device  to  be  identified 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Determine  from  taskfile  register  contents  whether  a  device  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ATA  or  ATAPI ,  as  per  " Signature and persistence "  section 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	of  ATA / PI  spec  ( volume  1 ,  sect  5.14 ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 13:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Device  type ,  % ATA_DEV_ATA ,  % ATA_DEV_ATAPI ,  % ATA_DEV_PMP , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	% ATA_DEV_ZAC ,  or  % ATA_DEV_UNKNOWN  the  event  of  failure . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-22 14:27:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								unsigned  int  ata_dev_classify ( const  struct  ata_taskfile  * tf )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Apple's open source Darwin code hints that some devices only
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  put  a  proper  signature  into  the  LBA  mid / high  registers , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  So ,  we  only  check  those .   It ' s  sufficient  for  uniqueness . 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  ATA / ATAPI - 7  ( d1532v1r1 :  Feb .  19 ,  2003 )  specified  separate 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  signatures  for  ATA  and  ATAPI  devices  attached  on  SerialATA , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  0x3c / 0xc3  and  0x69 / 0x96  respectively .   However ,  SerialATA 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  spec  has  never  mentioned  about  using  different  signatures 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  for  ATA / ATAPI  devices .   Then ,  Serial  ATA  II :  Port 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Multiplier  specification  began  to  use  0x69 / 0x96  to  identify 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  port  multpliers  and  0x3c / 0xc3  to  identify  SEMB  device . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  ATA / ATAPI - 7  dropped  descriptions  about  0x3c / 0xc3  and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  0x69 / 0x96  shortly  and  described  them  as  reserved  for 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  SerialATA . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  We  follow  the  current  spec  and  consider  that  0x69 / 0x96 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  identifies  a  port  multiplier  and  0x3c / 0xc3  a  SEMB  device . 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-15 06:21:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  Unfortunately ,  WDC  WD1600JS - 62 MHB5  ( a  hard  drive )  reports 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  SEMB  signature .   This  is  worked  around  in 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  ata_dev_read_id ( ) . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( tf - > lbam  = =  0 )  & &  ( tf - > lbah  = =  0 ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										DPRINTK ( " found ATA device by sig \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ATA_DEV_ATA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( tf - > lbam  = =  0x14 )  & &  ( tf - > lbah  = =  0xeb ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										DPRINTK ( " found ATAPI device by sig \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ATA_DEV_ATAPI ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( tf - > lbam  = =  0x69 )  & &  ( tf - > lbah  = =  0x96 ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										DPRINTK ( " found PMP device by sig \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ATA_DEV_PMP ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ( tf - > lbam  = =  0x3c )  & &  ( tf - > lbah  = =  0xc3 ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-15 06:21:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										DPRINTK ( " found SEMB device by sig (could be ATA device) \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ATA_DEV_SEMB ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 13:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( tf - > lbam  = =  0xcd )  & &  ( tf - > lbah  = =  0xab ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										DPRINTK ( " found ZAC device by sig \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ATA_DEV_ZAC ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									DPRINTK ( " unknown device \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ATA_DEV_UNKNOWN ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2006-02-13 10:02:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_id_string  -  Convert  IDENTIFY  DEVICE  page  into  string 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 	@ id :  IDENTIFY  DEVICE  results  we  will  examine 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ s :  string  into  which  data  is  output 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ofs :  offset  into  identify  device  page 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ len :  length  of  string  to  return .  must  be  an  even  number . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	The  strings  in  the  IDENTIFY  DEVICE  page  are  broken  up  into 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	16 - bit  chunks .   Run  through  the  string ,  and  output  each 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	8 - bit  chunk  linearly ,  regardless  of  platform . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	caller . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-13 10:02:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_id_string ( const  u16  * id ,  unsigned  char  * s ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   unsigned  int  ofs ,  unsigned  int  len ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  int  c ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-24 17:16:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									BUG_ON ( len  &  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									while  ( len  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										c  =  id [ ofs ]  > >  8 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* s  =  c ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										s + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										c  =  id [ ofs ]  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* s  =  c ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										s + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ofs + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										len  - =  2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 22:47:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2006-02-13 10:02:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_id_c_string  -  Convert  IDENTIFY  DEVICE  page  into  C  string 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 22:47:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ id :  IDENTIFY  DEVICE  results  we  will  examine 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ s :  string  into  which  data  is  output 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ofs :  offset  into  identify  device  page 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ len :  length  of  string  to  return .  must  be  an  odd  number . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-13 10:02:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	This  function  is  identical  to  ata_id_string  except  that  it 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 22:47:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	trims  trailing  spaces  and  terminates  the  resulting  string  with 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	null .   @ len  must  be  actual  maximum  length  ( even  number )  +  1. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	caller . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-13 10:02:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_id_c_string ( const  u16  * id ,  unsigned  char  * s ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										     unsigned  int  ofs ,  unsigned  int  len ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 22:47:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  char  * p ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-13 10:02:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_id_string ( id ,  s ,  ofs ,  len  -  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 22:47:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p  =  s  +  strnlen ( s ,  len  -  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( p  >  s  & &  p [ - 1 ]  = =  '   ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p - - ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									* p  =  ' \0 ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2005-06-02 18:17:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:31:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  u64  ata_id_n_sectors ( const  u16  * id )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ata_id_has_lba ( id ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ata_id_has_lba48 ( id ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-16 20:15:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  ata_id_u64 ( id ,  ATA_ID_LBA_CAPACITY_2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:31:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-16 20:15:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  ata_id_u32 ( id ,  ATA_ID_LBA_CAPACITY ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:31:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ata_id_current_chs_valid ( id ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-16 20:15:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  id [ ATA_ID_CUR_CYLS ]  *  id [ ATA_ID_CUR_HEADS ]  * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											       id [ ATA_ID_CUR_SECTORS ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:31:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-16 20:15:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  id [ ATA_ID_CYLS ]  *  id [ ATA_ID_HEADS ]  * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											       id [ ATA_ID_SECTORS ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:31:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-03-27 19:14:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								u64  ata_tf_to_lba48 ( const  struct  ata_taskfile  * tf )  
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u64  sectors  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sectors  | =  ( ( u64 ) ( tf - > hob_lbah  &  0xff ) )  < <  40 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sectors  | =  ( ( u64 ) ( tf - > hob_lbam  &  0xff ) )  < <  32 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-28 16:52:20 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									sectors  | =  ( ( u64 ) ( tf - > hob_lbal  &  0xff ) )  < <  24 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									sectors  | =  ( tf - > lbah  &  0xff )  < <  16 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sectors  | =  ( tf - > lbam  &  0xff )  < <  8 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sectors  | =  ( tf - > lbal  &  0xff ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-03-27 19:14:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  sectors ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-03-27 19:14:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								u64  ata_tf_to_lba ( const  struct  ata_taskfile  * tf )  
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u64  sectors  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sectors  | =  ( tf - > device  &  0x0f )  < <  24 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sectors  | =  ( tf - > lbah  &  0xff )  < <  16 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sectors  | =  ( tf - > lbam  &  0xff )  < <  8 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sectors  | =  ( tf - > lbal  &  0xff ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-03-27 19:14:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  sectors ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_read_native_max_address  -  Read  native  max  address 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  target  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ max_sectors :  out  parameter  for  the  result  native  max  address 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Perform  an  LBA48  or  LBA28  native  size  query  upon  the  device  in 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	question . 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - EACCES  if  command  is  aborted  by  the  drive . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	- EIO  on  other  errors . 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_read_native_max_address ( struct  ata_device  * dev ,  u64  * max_sectors )  
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  err_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_taskfile  tf ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  lba48  =  ata_id_has_lba48 ( dev - > id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_tf_init ( dev ,  & tf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* always clear all address registers */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tf . flags  | =  ATA_TFLAG_DEVICE  |  ATA_TFLAG_ISADDR ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( lba48 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf . command  =  ATA_CMD_READ_NATIVE_MAX_EXT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf . flags  | =  ATA_TFLAG_LBA48 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf . command  =  ATA_CMD_READ_NATIVE_MAX ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . protocol  | =  ATA_PROT_NODATA ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tf . device  | =  ATA_LBA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-09 15:05:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err_mask  =  ata_exec_internal ( dev ,  & tf ,  NULL ,  DMA_NONE ,  NULL ,  0 ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( err_mask )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     " failed to read native max address (err_mask=0x%x) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     err_mask ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( err_mask  = =  AC_ERR_DEV  & &  ( tf . feature  &  ATA_ABORTED ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  - EACCES ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EIO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( lba48 ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-03-27 19:14:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										* max_sectors  =  ata_tf_to_lba48 ( & tf )  +  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2008-03-27 19:14:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										* max_sectors  =  ata_tf_to_lba ( & tf )  +  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-19 06:42:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dev - > horkage  &  ATA_HORKAGE_HPA_SIZE ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-29 04:06:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										( * max_sectors ) - - ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_set_max_sectors  -  Set  max  sectors 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  target  device 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-01 17:35:55 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ new_sectors :  new  max  sectors  value  to  set  for  the  device 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Set  max  sectors  of  @ dev  to  @ new_sectors . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - EACCES  if  command  is  aborted  or  denied  ( due  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	previous  non - volatile  SET_MAX )  by  the  drive .   - EIO  on  other 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	errors . 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_set_max_sectors ( struct  ata_device  * dev ,  u64  new_sectors )  
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  err_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_taskfile  tf ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  lba48  =  ata_id_has_lba48 ( dev - > id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									new_sectors - - ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_tf_init ( dev ,  & tf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . flags  | =  ATA_TFLAG_DEVICE  |  ATA_TFLAG_ISADDR ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( lba48 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf . command  =  ATA_CMD_SET_MAX_EXT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf . flags  | =  ATA_TFLAG_LBA48 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf . hob_lbal  =  ( new_sectors  > >  24 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf . hob_lbam  =  ( new_sectors  > >  32 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf . hob_lbah  =  ( new_sectors  > >  40 )  &  0xff ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-21 20:07:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tf . command  =  ATA_CMD_SET_MAX ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-21 20:07:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tf . device  | =  ( new_sectors  > >  24 )  &  0xf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tf . protocol  | =  ATA_PROT_NODATA ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tf . device  | =  ATA_LBA ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . lbal  =  ( new_sectors  > >  0 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . lbam  =  ( new_sectors  > >  8 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . lbah  =  ( new_sectors  > >  16 )  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-09 15:05:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err_mask  =  ata_exec_internal ( dev ,  & tf ,  NULL ,  DMA_NONE ,  NULL ,  0 ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( err_mask )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     " failed to set max address (err_mask=0x%x) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     err_mask ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( err_mask  = =  AC_ERR_DEV  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    ( tf . feature  &  ( ATA_ABORTED  |  ATA_IDNF ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  - EACCES ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EIO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_hpa_resize 		- 	Resize  a  device  with  an  HPA  set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  Device  to  resize 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Read  the  size  of  an  LBA28  or  LBA48  disk  with  HPA  features  and  resize 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	it  if  required  to  the  full  size  of  the  media .  The  caller  must  check 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	the  drive  has  the  HPA  feature  set  enabled . 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - errno  on  failure . 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_hpa_resize ( struct  ata_device  * dev )  
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_eh_context  * ehc  =  & dev - > link - > eh_context ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  print_info  =  ehc - > i . flags  &  ATA_EHI_PRINTINFO ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-05 10:33:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  unlock_hpa  =  ata_ignore_hpa  | |  dev - > flags  &  ATA_DFLAG_UNLOCK_HPA ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u64  sectors  =  ata_id_n_sectors ( dev - > id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u64  native_sectors ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-21 20:14:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* do we need to do it? */ 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 13:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( dev - > class  ! =  ATA_DEV_ATA  & &  dev - > class  ! =  ATA_DEV_ZAC )  | | 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									    ! ata_id_has_lba ( dev - > id )  | |  ! ata_id_hpa_enabled ( dev - > id )  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    ( dev - > horkage  &  ATA_HORKAGE_BROKEN_HPA ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* read native max address */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  ata_read_native_max_address ( dev ,  & native_sectors ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc )  { 
							 
						 
					
						
							
								
									
										
										
										
											2008-03-23 21:05:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* If device aborted the command or HPA isn't going to
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  be  unlocked ,  skip  HPA  resizing . 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-05 10:33:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( rc  = =  - EACCES  | |  ! unlock_hpa )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												     " HPA support seems broken, skipping HPA handling \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											dev - > horkage  | =  ATA_HORKAGE_BROKEN_HPA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* we can continue if device aborted the command */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( rc  = =  - EACCES ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												rc  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2007-06-25 20:45:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-15 17:11:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dev - > n_native_sectors  =  native_sectors ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* nothing to do? */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-05 10:33:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( native_sectors  < =  sectors  | |  ! unlock_hpa )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! print_info  | |  native_sectors  = =  sectors ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( native_sectors  >  sectors ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_info ( dev , 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												" HPA detected: current %llu, native %llu \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												( unsigned  long  long ) sectors , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												( unsigned  long  long ) native_sectors ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else  if  ( native_sectors  <  sectors ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												" native sectors (%llu) is smaller than sectors (%llu) \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												( unsigned  long  long ) native_sectors , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												( unsigned  long  long ) sectors ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* let's unlock HPA */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  ata_set_max_sectors ( dev ,  native_sectors ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc  = =  - EACCES )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* if device aborted the command, skip HPA resizing */ 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     " device aborted resize (%llu -> %llu), skipping HPA handling \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     ( unsigned  long  long ) sectors , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     ( unsigned  long  long ) native_sectors ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev - > horkage  | =  ATA_HORKAGE_BROKEN_HPA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* re-read IDENTIFY data */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  ata_dev_reread_id ( dev ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_err ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    " failed to re-read IDENTIFY data after HPA resizing \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( print_info )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										u64  new_sectors  =  ata_id_n_sectors ( dev - > id ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_info ( dev , 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											" HPA unlocked: %llu -> %llu, native %llu \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											( unsigned  long  long ) sectors , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											( unsigned  long  long ) new_sectors , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											( unsigned  long  long ) native_sectors ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-11 00:23:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_dump_id  -  IDENTIFY  DEVICE  info  debugging  output 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 22:47:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ id :  IDENTIFY  DEVICE  page  to  dump 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 22:47:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Dump  selected  16 - bit  words  from  the  given  IDENTIFY  DEVICE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	page . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	caller . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 22:47:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  void  ata_dump_id ( const  u16  * id )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DPRINTK ( " 49==0x%04x   " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" 53==0x%04x   " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" 63==0x%04x   " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" 64==0x%04x   " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" 75==0x%04x   \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 22:47:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										id [ 49 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										id [ 53 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										id [ 63 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										id [ 64 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										id [ 75 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									DPRINTK ( " 80==0x%04x   " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" 81==0x%04x   " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" 82==0x%04x   " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" 83==0x%04x   " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" 84==0x%04x   \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 22:47:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										id [ 80 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										id [ 81 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										id [ 82 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										id [ 83 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										id [ 84 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									DPRINTK ( " 88==0x%04x   " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" 93==0x%04x \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 22:47:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										id [ 88 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										id [ 93 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_id_xfermask  -  Compute  xfermask  from  the  given  IDENTIFY  data 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ id :  IDENTIFY  data  to  compute  xfer  mask  from 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Compute  the  xfermask  for  this  device .  This  is  not  as  trivial 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	as  it  seems  if  we  must  consider  early  devices  correctly . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	FIXME :  pre  IDE  drive  timing  ( do  we  care  ? ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Computed  xfermask 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								unsigned  long  ata_id_xfermask ( const  u16  * id )  
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  pio_mask ,  mwdma_mask ,  udma_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Usual case. Word 53 indicates word 64 is valid */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( id [ ATA_ID_FIELD_VALID ]  &  ( 1  < <  1 ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pio_mask  =  id [ ATA_ID_PIO_MODES ]  &  0x03 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pio_mask  < < =  3 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pio_mask  | =  0x7 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* If word 64 isn't valid then Word 51 high byte holds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  the  PIO  timing  number  for  the  maximum .  Turn  it  into 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  a  mask . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-29 13:28:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										u8  mode  =  ( id [ ATA_ID_OLD_PIO_MODES ]  > >  8 )  &  0xFF ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-09-29 18:26:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( mode  <  5 ) 	/* Valid PIO range */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-19 06:42:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											pio_mask  =  ( 2  < <  mode )  -  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-09-29 18:26:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pio_mask  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* But wait.. there's more. Design your standards by
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  committee  and  you  too  can  get  a  free  iordy  field  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  process .  However  its  the  speeds  not  the  modes  that 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  are  supported . . .  Note  drivers  using  the  timing  API 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  will  get  this  right  anyway 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									mwdma_mask  =  id [ ATA_ID_MWDMA_MODES ]  &  0x07 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-12 12:34:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 18:52:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_id_is_cfa ( id ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 	Process  compact  flash  extended  modes 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-13 20:50:00 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  pio  =  ( id [ ATA_ID_CFA_MODES ]  > >  0 )  &  0x7 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  dma  =  ( id [ ATA_ID_CFA_MODES ]  > >  3 )  &  0x7 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 18:52:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( pio ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pio_mask  | =  ( 1  < <  5 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( pio  >  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pio_mask  | =  ( 1  < <  6 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( dma ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											mwdma_mask  | =  ( 1  < <  3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( dma  >  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											mwdma_mask  | =  ( 1  < <  4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-12 12:34:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									udma_mask  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( id [ ATA_ID_FIELD_VALID ]  &  ( 1  < <  2 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										udma_mask  =  id [ ATA_ID_UDMA_MODES ]  &  0xff ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ata_pack_xfermask ( pio_mask ,  mwdma_mask ,  udma_mask ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-01-04 00:09:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  ata_qc_complete_internal ( struct  ata_queued_cmd  * qc )  
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-01-23 13:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  completion  * waiting  =  qc - > private_data ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									complete ( waiting ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_exec_internal_sg  -  execute  libata  internal  command 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ dev :  Device  to  which  the  command  is  sent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ tf :  Taskfile  registers  for  the  command  and  the  result 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 18:51:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ cdb :  CDB  for  packet  command 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-18 22:54:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ dma_dir :  Data  transfer  direction  of  the  command 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-18 14:12:26 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ sgl :  sg  list  for  the  data  buffer  of  the  command 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ n_elem :  Number  of  sg  entries 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-09 15:05:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ timeout :  Timeout  in  msecs  ( 0  for  default ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Executes  libata  internal  command  with  timeout .   @ tf  contains 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	command  on  entry  and  result  on  return .   Timeout  and  error 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	conditions  are  reported  via  return  value .   No  recovery  action 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	is  taken  after  a  command  times  out .   It ' s  caller ' s  duty  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	clean  up  after  timeout . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None .   Should  be  called  with  kernel  context ,  might  sleep . 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-12 14:09:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Zero  on  success ,  AC_ERR_ *  mask  on  failure 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								unsigned  ata_exec_internal_sg ( struct  ata_device  * dev ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											      struct  ata_taskfile  * tf ,  const  u8  * cdb , 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-16 11:14:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											      int  dma_dir ,  struct  scatterlist  * sgl , 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-09 15:05:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											      unsigned  int  n_elem ,  unsigned  long  timeout ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_link  * link  =  dev - > link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  link - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u8  command  =  tf - > command ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-20 02:17:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  auto_timeout  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_queued_cmd  * qc ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  tag ,  preempted_tag ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u32  preempted_sactive ,  preempted_qc_active ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  preempted_nr_active_links ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 00:25:26 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DECLARE_COMPLETION_ONSTACK ( wait ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  flags ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-23 13:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  err_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-06-22 23:46:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock_irqsave ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* no internal command while frozen */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-29 01:29:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > pflags  &  ATA_PFLAG_FROZEN )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-22 23:46:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spin_unlock_irqrestore ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  AC_ERR_SYSTEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* initialize internal qc */ 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* XXX: Tag 0 is used for drivers with legacy EH as some
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  drivers  choke  if  any  other  tag  is  given .   This  breaks 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  ata_tag_internal ( )  test  for  those  drivers .   Don ' t  use  new 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  EH  stuff  without  converting  to  it . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ap - > ops - > error_handler ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tag  =  ATA_TAG_INTERNAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tag  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:03 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc  =  __ata_qc_from_tag ( ap ,  tag ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > tag  =  tag ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > scsicmd  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > ap  =  ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > dev  =  dev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_qc_reinit ( qc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									preempted_tag  =  link - > active_tag ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									preempted_sactive  =  link - > sactive ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									preempted_qc_active  =  ap - > qc_active ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									preempted_nr_active_links  =  ap - > nr_active_links ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									link - > active_tag  =  ATA_TAG_POISON ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									link - > sactive  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > qc_active  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > nr_active_links  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* prepare & issue qc */ 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc - > tf  =  * tf ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 18:51:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cdb ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										memcpy ( qc - > cdb ,  cdb ,  ATAPI_CDB_LEN ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-18 18:44:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* some SATA bridges need us to indicate data xfer direction */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( tf - > protocol  = =  ATAPI_PROT_DMA  & &  ( dev - > flags  &  ATA_DFLAG_DMADIR )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    dma_dir  = =  DMA_FROM_DEVICE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										qc - > tf . feature  | =  ATAPI_DMADIR ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc - > flags  | =  ATA_QCFLAG_RESULT_TF ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc - > dma_dir  =  dma_dir ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( dma_dir  ! =  DMA_NONE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										unsigned  int  i ,  buflen  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-16 11:14:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										struct  scatterlist  * sg ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-16 11:14:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for_each_sg ( sgl ,  sg ,  n_elem ,  i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											buflen  + =  sg - > length ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-16 11:14:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_sg_init ( qc ,  sgl ,  n_elem ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-30 11:32:26 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										qc - > nbytes  =  buflen ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-23 13:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc - > private_data  =  & wait ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc - > complete_fn  =  ata_qc_complete_internal ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-31 20:41:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_qc_issue ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-06-22 23:46:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock_irqrestore ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-05-20 02:17:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! timeout )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ata_probe_timeout ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											timeout  =  ata_probe_timeout  *  1000 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											timeout  =  ata_internal_cmd_timeout ( dev ,  command ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											auto_timeout  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-09 15:05:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement cross-port EH exclusion
In libata, the non-EH code paths should always take and release
ap->lock explicitly when accessing hardware or shared data structures.
However, once EH is active, it's assumed that the port is owned by EH
and EH methods don't explicitly take ap->lock unless race from irq
handler or other code paths are expected.  However, libata EH didn't
guarantee exclusion among EHs for ports of the same host.  IOW,
multiple EHs may execute in parallel on multiple ports of the same
controller.
In many cases, especially in SATA, the ports are completely
independent of each other and this doesn't cause problems; however,
there are cases where different ports share the same resource, which
lead to obscure timing related bugs such as the one fixed by commit
213373cf (ata_piix: fix locking around SIDPR access).
This patch implements exclusion among EHs of the same host.  When EH
begins, it acquires per-host EH ownership by calling ata_eh_acquire().
When EH finishes, the ownership is released by calling
ata_eh_release().  EH ownership is also released whenever the EH
thread goes to sleep from ata_msleep() or explicitly and reacquired
after waking up.
This ensures that while EH is actively accessing the hardware, it has
exclusive access to it while allowing EHs to interleave and progress
in parallel as they hit waiting stages, which dominate the time spent
in EH.  This achieves cross-port EH exclusion without pervasive and
fragile changes while still allowing parallel EH for the most part.
This was first reported by yuanding02@gmail.com more than three years
ago in the following bugzilla.  :-)
  https://bugzilla.kernel.org/show_bug.cgi?id=8223
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Reported-by: yuanding02@gmail.com
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2010-09-06 17:57:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > ops - > error_handler ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_eh_release ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-09 15:05:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  wait_for_completion_timeout ( & wait ,  msecs_to_jiffies ( timeout ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement cross-port EH exclusion
In libata, the non-EH code paths should always take and release
ap->lock explicitly when accessing hardware or shared data structures.
However, once EH is active, it's assumed that the port is owned by EH
and EH methods don't explicitly take ap->lock unless race from irq
handler or other code paths are expected.  However, libata EH didn't
guarantee exclusion among EHs for ports of the same host.  IOW,
multiple EHs may execute in parallel on multiple ports of the same
controller.
In many cases, especially in SATA, the ports are completely
independent of each other and this doesn't cause problems; however,
there are cases where different ports share the same resource, which
lead to obscure timing related bugs such as the one fixed by commit
213373cf (ata_piix: fix locking around SIDPR access).
This patch implements exclusion among EHs of the same host.  When EH
begins, it acquires per-host EH ownership by calling ata_eh_acquire().
When EH finishes, the ownership is released by calling
ata_eh_release().  EH ownership is also released whenever the EH
thread goes to sleep from ata_msleep() or explicitly and reacquired
after waking up.
This ensures that while EH is actively accessing the hardware, it has
exclusive access to it while allowing EHs to interleave and progress
in parallel as they hit waiting stages, which dominate the time spent
in EH.  This achieves cross-port EH exclusion without pervasive and
fragile changes while still allowing parallel EH for the most part.
This was first reported by yuanding02@gmail.com more than three years
ago in the following bugzilla.  :-)
  https://bugzilla.kernel.org/show_bug.cgi?id=8223
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Reported-by: yuanding02@gmail.com
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2010-09-06 17:57:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > ops - > error_handler ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_eh_acquire ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-05-10 21:41:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_sff_flush_pio_task ( ap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-14 11:19:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! rc )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-22 23:46:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spin_lock_irqsave ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* We're racing with irq here.  If we lose, the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  following  test  prevents  us  from  completing  the  qc 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 *  twice .   If  we  win ,  the  port  is  frozen  and  will  be 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  cleaned  up  by  - > post_internal_cmd ( ) . 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-23 13:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( qc - > flags  &  ATA_QCFLAG_ACTIVE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											qc - > err_mask  | =  AC_ERR_TIMEOUT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ap - > ops - > error_handler ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ata_port_freeze ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ata_qc_complete ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-06-23 02:29:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ata_msg_warn ( ap ) ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ata_dev_warn ( dev ,  " qc timeout (cmd 0x%x) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													     command ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-06-22 23:46:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spin_unlock_irqrestore ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* do post_internal_cmd */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ap - > ops - > post_internal_cmd ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ap - > ops - > post_internal_cmd ( qc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-03-20 15:24:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* perform minimal error analysis */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( qc - > flags  &  ATA_QCFLAG_FAILED )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( qc - > result_tf . command  &  ( ATA_ERR  |  ATA_DF ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											qc - > err_mask  | =  AC_ERR_DEV ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! qc - > err_mask ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											qc - > err_mask  | =  AC_ERR_OTHER ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( qc - > err_mask  &  ~ AC_ERR_OTHER ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											qc - > err_mask  & =  ~ AC_ERR_OTHER ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* finish up */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-22 23:46:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock_irqsave ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									* tf  =  qc - > result_tf ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-23 13:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err_mask  =  qc - > err_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_qc_free ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									link - > active_tag  =  preempted_tag ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									link - > sactive  =  preempted_sactive ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > qc_active  =  preempted_qc_active ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > nr_active_links  =  preempted_nr_active_links ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-23 13:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-06-22 23:46:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock_irqrestore ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-05-20 02:17:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( err_mask  &  AC_ERR_TIMEOUT )  & &  auto_timeout ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_internal_cmd_timed_out ( dev ,  command ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-23 13:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  err_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:48:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2006-12-12 02:15:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_exec_internal  -  execute  libata  internal  command 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ dev :  Device  to  which  the  command  is  sent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ tf :  Taskfile  registers  for  the  command  and  the  result 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ cdb :  CDB  for  packet  command 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-18 22:54:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ dma_dir :  Data  transfer  direction  of  the  command 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ buf :  Data  buffer  of  the  command 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ buflen :  Length  of  data  buffer 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-09 15:05:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ timeout :  Timeout  in  msecs  ( 0  for  default ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Wrapper  around  ata_exec_internal_sg ( )  which  takes  simple 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	buffer  instead  of  sg  list . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None .   Should  be  called  with  kernel  context ,  might  sleep . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Zero  on  success ,  AC_ERR_ *  mask  on  failure 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								unsigned  ata_exec_internal ( struct  ata_device  * dev ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											   struct  ata_taskfile  * tf ,  const  u8  * cdb , 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-09 15:05:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											   int  dma_dir ,  void  * buf ,  unsigned  int  buflen , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											   unsigned  long  timeout ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-12-12 02:15:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  scatterlist  * psg  =  NULL ,  sg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  int  n_elem  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 02:15:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dma_dir  ! =  DMA_NONE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										WARN_ON ( ! buf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sg_init_one ( & sg ,  buf ,  buflen ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										psg  =  & sg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										n_elem + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-09 15:05:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ata_exec_internal_sg ( dev ,  tf ,  cdb ,  dma_dir ,  psg ,  n_elem , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												    timeout ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-09 17:18:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_pio_need_iordy 	- 	check  if  iordy  needed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ adev :  ATA  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Check  if  the  current  speed  of  the  device  requires  IORDY .  Used 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	by  various  controllers  for  chip  configuration . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								unsigned  int  ata_pio_need_iordy ( const  struct  ata_device  * adev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2009-06-11 11:04:45 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Don't set IORDY if we're preparing for reset.  IORDY may
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  lead  to  controller  lock  up  on  certain  controllers  if  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  port  is  not  occupied .   See  bko # 11703  for  details . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( adev - > link - > ap - > pflags  &  ATA_PFLAG_RESETTING ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Controller doesn't support IORDY.  Probably a pointless
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  check  as  the  caller  should  know  this . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( adev - > link - > ap - > flags  &  ATA_FLAG_NO_IORDY ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-09 17:18:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-10 15:39:12 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* CF spec. r4.1 Table 22 says no iordy on PIO5 and PIO6.  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ata_id_is_cfa ( adev - > id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    & &  ( adev - > pio_mode  = =  XFER_PIO_5  | |  adev - > pio_mode  = =  XFER_PIO_6 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-08 23:22:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* PIO3 and higher it is mandatory */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( adev - > pio_mode  >  XFER_PIO_2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* We turn it on when possible */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ata_id_has_iordy ( adev - > id ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-09 17:18:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-08 23:22:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2006-03-24 09:56:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-03-08 23:22:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_pio_mask_no_iordy 	- 	Return  the  non  IORDY  mask 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ adev :  ATA  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Compute  the  highest  mode  possible  if  we  are  not  using  iordy .  Return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	- 1  if  no  iordy  mode  is  available . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  u32  ata_pio_mask_no_iordy ( const  struct  ata_device  * adev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-01-09 17:18:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* If we have no drive specific rule, then PIO 2 is non IORDY */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( adev - > id [ ATA_ID_FIELD_VALID ]  &  2 )  { 	/* EIDE */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-08 23:22:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										u16  pio  =  adev - > id [ ATA_ID_EIDE_PIO ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-09 17:18:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* Is the speed faster than the drive allows non IORDY ? */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( pio )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* This is cycle times not frequency - watch the logic! */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( pio  >  240 ) 	/* PIO2 is 240nS per cycle */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-08 23:22:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  3  < <  ATA_SHIFT_PIO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  7  < <  ATA_SHIFT_PIO ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-09 17:18:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-08 23:22:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  3  < <  ATA_SHIFT_PIO ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-09 17:18:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-24 17:16:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_do_dev_read_id 		- 	default  ID  read  method 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ tf :  proposed  taskfile 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ id :  data  buffer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Issue  the  identify  taskfile  and  hand  back  the  buffer  containing 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	identify  data .  For  some  RAID  controllers  and  for  pre  ATA  devices 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	this  function  is  wrapped  or  replaced  by  the  driver 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								unsigned  int  ata_do_dev_read_id ( struct  ata_device  * dev ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													struct  ata_taskfile  * tf ,  u16  * id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ata_exec_internal ( dev ,  tf ,  NULL ,  DMA_FROM_DEVICE , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												     id ,  sizeof ( id [ 0 ] )  *  ATA_ID_WORDS ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_dev_read_id  -  Read  ID  data  from  the  specified  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  target  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ p_class :  pointer  to  class  of  the  target  device  ( may  be  changed ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-10 18:08:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ flags :  ATA_READID_ *  flags 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ id :  buffer  to  read  IDENTIFY  data  into 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Read  ID  data  from  the  specified  device .   ATA_CMD_ID_ATA  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	performed  on  ATA  devices  and  ATA_CMD_ID_ATAPI  on  ATAPI 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-25 01:33:34 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	devices .   This  function  also  issues  ATA_CMD_INIT_DEV_PARAMS 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	for  pre - ATA4  drives . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-08 14:27:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	FIXME :  ATA_CMD_ID_ATA  is  optional  for  early  drives  and  right 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-19 06:42:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	now  we  abort  if  we  hit  that  case . 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-08 14:27:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - errno  otherwise . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_dev_read_id ( struct  ata_device  * dev ,  unsigned  int  * p_class ,  
						 
					
						
							
								
									
										
										
										
											2006-11-10 18:08:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										    unsigned  int  flags ,  u16  * id ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  dev - > link - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  class  =  * p_class ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:49:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_taskfile  tf ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  err_mask  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  char  * reason ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-15 06:21:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  is_semb  =  class  = =  ATA_DEV_SEMB ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-11 14:35:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  may_fallback  =  1 ,  tried_spinup  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-06-23 02:29:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_msg_ctl ( ap ) ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_dbg ( dev ,  " %s: ENTER \n " ,  __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-24 17:16:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								retry :  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_tf_init ( dev ,  & tf ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:49:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( class )  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-15 06:21:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  ATA_DEV_SEMB : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										class  =  ATA_DEV_ATA ; 	/* some hard drives report SEMB sig */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  ATA_DEV_ATA : 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 13:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  ATA_DEV_ZAC : 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:49:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tf . command  =  ATA_CMD_ID_ATA ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_DEV_ATAPI : 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:49:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tf . command  =  ATA_CMD_ID_ATAPI ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  - ENODEV ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										reason  =  " unsupported class " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  err_out ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:49:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tf . protocol  =  ATA_PROT_PIO ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-07 12:37:41 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Some devices choke if TF registers contain garbage.  Make
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  sure  those  are  properly  initialized . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . flags  | =  ATA_TFLAG_ISADDR  |  ATA_TFLAG_DEVICE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Device presence detection is unreliable on some
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  controllers .   Always  poll  IDENTIFY  if  available . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . flags  | =  ATA_TFLAG_POLLING ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-24 17:16:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > ops - > read_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err_mask  =  ap - > ops - > read_id ( dev ,  & tf ,  id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err_mask  =  ata_do_dev_read_id ( dev ,  & tf ,  id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:49:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( err_mask )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-03 21:34:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( err_mask  &  AC_ERR_NODEV_HINT )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_dbg ( dev ,  " NODEV after polling detection \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-10 18:08:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  - ENOENT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-04-15 06:21:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( is_semb )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_info ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										     " IDENTIFY failed on device w/ SEMB sig, disabled \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-15 06:21:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* SEMB is not supported yet */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											* p_class  =  ATA_DEV_SEMB_UNSUP ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-03-23 15:16:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ( err_mask  = =  AC_ERR_DEV )  & &  ( tf . feature  &  ATA_ABORTED ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* Device or controller might have reported
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  the  wrong  device  class .   Give  a  shot  at  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  other  IDENTIFY  if  the  current  one  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  aborted  by  the  device . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( may_fallback )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												may_fallback  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( class  = =  ATA_DEV_ATA ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													class  =  ATA_DEV_ATAPI ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													class  =  ATA_DEV_ATA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  retry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* Control reaches here iff the device aborted
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  both  flavors  of  IDENTIFYs  which  happens 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  sometimes  with  phantom  devices . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_dbg ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												    " both IDENTIFYs aborted, assuming NODEV \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-03-23 15:16:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  - ENOENT ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-11 14:35:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  - EIO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										reason  =  " I/O error " ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										goto  err_out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-05-23 12:59:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dev - > horkage  &  ATA_HORKAGE_DUMP_ID )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_dbg ( dev ,  " dumping IDENTIFY data,  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    " class=%d may_fallback=%d tried_spinup=%d \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    class ,  may_fallback ,  tried_spinup ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-23 12:59:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										print_hex_dump ( KERN_DEBUG ,  " " ,  DUMP_PREFIX_OFFSET , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											       16 ,  2 ,  id ,  ATA_ID_WORDS  *  sizeof ( * id ) ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-05-11 14:35:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Falling back doesn't make sense if ID data was read
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  successfully  at  least  once . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									may_fallback  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									swap_buf_le16 ( id ,  ATA_ID_WORDS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* sanity check */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-09-12 20:35:49 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  - EINVAL ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-06-07 16:13:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									reason  =  " device reports invalid type " ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-09-12 20:35:49 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 13:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( class  = =  ATA_DEV_ATA  | |  class  = =  ATA_DEV_ZAC )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-09-12 20:35:49 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ata_id_is_ata ( id )  & &  ! ata_id_is_cfa ( id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  err_out ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-04 22:15:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ap - > host - > flags  &  ATA_HOST_IGNORE_ATA  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															ata_id_is_ata ( id ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ata_dev_dbg ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												" host indicates ignore ATA devices, ignored \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  - ENOENT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2006-09-12 20:35:49 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ata_id_is_ata ( id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  err_out ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
											
												libata: Handle drives that require a spin-up command before first access
(S)ATA drives can be configured for "power-up in standby",
a mode whereby a specific "spin up now!" command is required
before the first media access.
Currently, a drive with this feature enabled can not be used at all
with libata, and once in this mode, the drive becomes a doorstop.
The older drivers/ide subsystem at least enumerates the drive,
so that it can be woken up after the fact from a userspace HDIO_*
command, but not libata.
This patch adds support to libata for the "power-up in standby"
mode where a "spin up now!" command (SET_FEATURES) is needed.
With this, libata will recognize such drives, spin them up,
and then re-IDENTIFY them if necessary to get a full/complete
set of drive features data.
Drives in this state are determined by looking for
special values in id[2], as documented in the current ATA specs.
Signed-off-by: Mark Lord <mlord@pobox.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-04-17 18:26:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! tried_spinup  & &  ( id [ 2 ]  = =  0x37c8  | |  id [ 2 ]  = =  0x738c ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tried_spinup  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Drive  powered - up  in  standby  mode ,  and  requires  a  specific 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  SET_FEATURES  spin - up  subcommand  before  it  will  accept 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  anything  other  than  the  original  IDENTIFY  command . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 00:33:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										err_mask  =  ata_dev_set_feature ( dev ,  SETFEATURES_SPINUP ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-10 13:59:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( err_mask  & &  id [ 2 ]  ! =  0x738c )  { 
							 
						 
					
						
							
								
									
										
										
											
												libata: Handle drives that require a spin-up command before first access
(S)ATA drives can be configured for "power-up in standby",
a mode whereby a specific "spin up now!" command is required
before the first media access.
Currently, a drive with this feature enabled can not be used at all
with libata, and once in this mode, the drive becomes a doorstop.
The older drivers/ide subsystem at least enumerates the drive,
so that it can be woken up after the fact from a userspace HDIO_*
command, but not libata.
This patch adds support to libata for the "power-up in standby"
mode where a "spin up now!" command (SET_FEATURES) is needed.
With this, libata will recognize such drives, spin them up,
and then re-IDENTIFY them if necessary to get a full/complete
set of drive features data.
Drives in this state are determined by looking for
special values in id[2], as documented in the current ATA specs.
Signed-off-by: Mark Lord <mlord@pobox.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-04-17 18:26:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											rc  =  - EIO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											reason  =  " SPINUP failed " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  err_out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  If  the  drive  initially  returned  incomplete  IDENTIFY  info , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  we  now  must  reissue  the  IDENTIFY  command . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( id [ 2 ]  = =  0x37c8 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  retry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 13:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( flags  &  ATA_READID_POSTRESET )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    ( class  = =  ATA_DEV_ATA  | |  class  = =  ATA_DEV_ZAC ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  The  exact  sequence  expected  by  certain  pre - ATA4  drives  is : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  SRST  RESET 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-08 14:27:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 *  IDENTIFY  ( optional  in  early  ATA ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  INITIALIZE  DEVICE  PARAMETERS  ( later  IDE  and  ATA ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 *  anything  else . . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Some  drives  were  very  specific  about  that  exact  sequence . 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-08 14:27:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Note  that  ATA4  says  lba  is  mandatory  so  the  second  check 
							 
						 
					
						
							
								
									
										
										
										
											2009-12-18 15:40:42 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 *  should  never  trigger . 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ata_id_major_version ( id )  <  4  | |  ! ata_id_has_lba ( id ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											err_mask  =  ata_dev_init_params ( dev ,  id [ 3 ] ,  id [ 6 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( err_mask )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												rc  =  - EIO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												reason  =  " INIT_DEV_PARAMS failed " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  err_out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* current CHS translation info (id[53-58]) might be
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  changed .  reread  the  identify  device  info . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-10 18:08:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											flags  & =  ~ ATA_READID_POSTRESET ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											goto  retry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									* p_class  =  class ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 err_out : 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-25 20:00:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_msg_warn ( ap ) ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_warn ( dev ,  " failed to IDENTIFY (%s, err_mask=0x%x) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     reason ,  err_mask ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_do_link_spd_horkage ( struct  ata_device  * dev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_link  * plink  =  ata_dev_phys_link ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u32  target ,  target_limit ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! sata_scr_valid ( plink ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( dev - > horkage  &  ATA_HORKAGE_1_5_GBPS ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										target  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									target_limit  =  ( 1  < <  target )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* if already on stricter limit, no need to push further */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( plink - > sata_spd_limit  < =  target_limit ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									plink - > sata_spd_limit  =  target_limit ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Request another EH round by returning -EAGAIN if link is
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  going  faster  than  the  target  speed .   Forward  progress  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  guaranteed  by  setting  sata_spd_limit  to  target_limit  above . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( plink - > sata_spd  >  target )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_info ( dev ,  " applying link speed limit horkage to %s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     sata_spd_string ( target ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  - EAGAIN ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  u8  ata_dev_knobble ( struct  ata_device  * dev )  
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  dev - > link - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-08-27 15:23:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ata_dev_blacklisted ( dev )  &  ATA_HORKAGE_BRIDGE_OK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ( ( ap - > cbl  = =  ATA_CBL_SATA )  & &  ( ! ata_id_is_sata ( dev - > id ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-07-27 09:24:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_dev_config_ncq ( struct  ata_device  * dev ,  
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											       char  * desc ,  size_t  desc_sz ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  dev - > link - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  hdepth  =  0 ,  ddepth  =  ata_id_queue_depth ( dev - > id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-27 09:24:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  err_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * aa_desc  =  " " ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ata_id_has_ncq ( dev - > id ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										desc [ 0 ]  =  ' \0 ' ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-27 09:24:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-05 13:31:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dev - > horkage  &  ATA_HORKAGE_NONCQ )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										snprintf ( desc ,  desc_sz ,  " NCQ (not used) " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-27 09:24:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > flags  &  ATA_FLAG_NCQ )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										hdepth  =  min ( ap - > scsi_host - > can_queue ,  ATA_MAX_QUEUE  -  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev - > flags  | =  ATA_DFLAG_NCQ ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-07-27 09:24:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! ( dev - > horkage  &  ATA_HORKAGE_BROKEN_FPDMA_AA )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										( ap - > flags  &  ATA_FLAG_FPDMA_AA )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_id_has_fpdma_aa ( dev - > id ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err_mask  =  ata_dev_set_feature ( dev ,  SETFEATURES_SATA_ENABLE , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SATA_FPDMA_AA ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( err_mask )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_err ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												    " failed to enable AA (error_mask=0x%x) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												    err_mask ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-27 09:24:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( err_mask  ! =  AC_ERR_DEV )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												dev - > horkage  | =  ATA_HORKAGE_BROKEN_FPDMA_AA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  - EIO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											aa_desc  =  " , AA " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( hdepth  > =  ddepth ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-27 09:24:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										snprintf ( desc ,  desc_sz ,  " NCQ (depth %d)%s " ,  ddepth ,  aa_desc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-27 09:24:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										snprintf ( desc ,  desc_sz ,  " NCQ (depth %d/%d)%s " ,  hdepth , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ddepth ,  aa_desc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-24 23:22:50 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ( ap - > flags  &  ATA_FLAG_FPDMA_AUX )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    ata_id_has_ncq_send_and_recv ( dev - > id ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err_mask  =  ata_read_log_page ( dev ,  ATA_LOG_NCQ_SEND_RECV , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													     0 ,  ap - > sector_buf ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( err_mask )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ata_dev_dbg ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												    " failed to get NCQ Send/Recv Log Emask 0x%x \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												    err_mask ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 18:15:53 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											u8  * cmds  =  dev - > ncq_send_recv_cmds ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-24 23:22:50 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											dev - > flags  | =  ATA_DFLAG_NCQ_SEND_RECV ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 18:15:53 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											memcpy ( cmds ,  ap - > sector_buf ,  ATA_LOG_NCQ_SEND_RECV_SIZE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( dev - > horkage  &  ATA_HORKAGE_NO_NCQ_TRIM )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ata_dev_dbg ( dev ,  " disabling queued TRIM support \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												cmds [ ATA_LOG_NCQ_SEND_RECV_DSM_OFFSET ]  & = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													~ ATA_LOG_NCQ_SEND_RECV_DSM_TRIM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-24 23:22:50 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-07-27 09:24:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_dev_configure  -  Configure  the  specified  ATA / ATAPI  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  Target  device  to  configure 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Configure  @ dev  according  to  @ dev - > id .   Generic  and  low - level 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	driver  specific  fixups  are  also  applied . 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - errno  otherwise 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-01 18:38:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_dev_configure ( struct  ata_device  * dev )  
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  dev - > link - > ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_eh_context  * ehc  =  & dev - > link - > eh_context ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reimplement ACPI invocation
This patch reimplements ACPI invocation such that, instead of
exporting ACPI details to the rest of libata, ACPI event handlers -
ata_acpi_on_resume() and ata_acpi_on_devcfg() - are used.  These two
functions are responsible for determining whether specific ACPI method
is used and when.
On resume, _GTF is scheduled by setting ATA_DFLAG_ACPI_PENDING device
flag.  This is done this way to avoid performing the action on wrong
device device (device swapping while suspended).
On every ata_dev_configure(), ata_acpi_on_devcfg() is called, which
performs _SDD and _GTF.  _GTF is performed only after resuming and, if
SATA, hardreset as the ACPI spec specifies.  As _GTF may contain
arbitrary commands, IDENTIFY page is re-read after _GTF taskfiles are
executed.
If one of ACPI methods fails, ata_acpi_on_devcfg() retries on the
first failure.  If it fails again on the second try, ACPI is disabled
on the device.  Note that successful configuration clears ACPI failed
status.
With all feature checks moved to the above two functions,
do_drive_set_taskfiles() is trivial and thus collapsed into
ata_acpi_exec_tfs(), which is now static and converted to return the
number of executed taskfiles to be used by ata_acpi_on_resume().  As
failures are handled properly, ata_acpi_push_id() now returns -errno
on errors instead of unconditional zero.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-05-15 03:28:16 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  print_info  =  ehc - > i . flags  &  ATA_EHI_PRINTINFO ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-13 19:48:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  u16  * id  =  dev - > id ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  xfer_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-07 22:40:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  err_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 18:52:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									char  revbuf [ 7 ] ; 		/* XYZ-99\0 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-30 23:00:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									char  fwrevbuf [ ATA_ID_FW_REV_LEN + 1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  modelbuf [ ATA_ID_PROD_LEN + 1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-28 08:30:31 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-06-23 02:29:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! ata_dev_enabled ( dev )  & &  ata_msg_info ( ap ) )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_info ( dev ,  " %s: ENTER/EXIT -- nodev \n " ,  __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-21 02:12:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-06-23 02:29:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_msg_probe ( ap ) ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_dbg ( dev ,  " %s: ENTER \n " ,  __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-07-05 13:31:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* set horkage */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev - > horkage  | =  ata_dev_blacklisted ( dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_force_horkage ( dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-05 13:31:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-05-19 01:15:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dev - > horkage  &  ATA_HORKAGE_DISABLE )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_info ( dev ,  " unsupported device, disabling \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-19 01:15:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_disable ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 07:52:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( ! atapi_enabled  | |  ( ap - > flags  &  ATA_FLAG_NO_ATAPI ) )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    dev - > class  = =  ATA_DEV_ATAPI )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_warn ( dev ,  " WARNING: ATAPI is %s, device ignored \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     atapi_enabled  ?  " not supported with this driver " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     :  " disabled " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 07:52:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_disable ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  ata_do_link_spd_horkage ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-16 09:47:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* some WD SATA-1 drives have issues with LPM, turn on NOLPM for them */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ( dev - > horkage  &  ATA_HORKAGE_WD_BROKEN_LPM )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    ( id [ ATA_ID_SATA_CAPABILITY ]  &  0xe )  = =  0x2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > horkage  | =  ATA_HORKAGE_NOLPM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( dev - > horkage  &  ATA_HORKAGE_NOLPM )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_dev_warn ( dev ,  " LPM support broken, forcing max_power \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > link - > ap - > target_lpm_policy  =  ATA_LPM_MAX_POWER ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reimplement ACPI invocation
This patch reimplements ACPI invocation such that, instead of
exporting ACPI details to the rest of libata, ACPI event handlers -
ata_acpi_on_resume() and ata_acpi_on_devcfg() - are used.  These two
functions are responsible for determining whether specific ACPI method
is used and when.
On resume, _GTF is scheduled by setting ATA_DFLAG_ACPI_PENDING device
flag.  This is done this way to avoid performing the action on wrong
device device (device swapping while suspended).
On every ata_dev_configure(), ata_acpi_on_devcfg() is called, which
performs _SDD and _GTF.  _GTF is performed only after resuming and, if
SATA, hardreset as the ACPI spec specifies.  As _GTF may contain
arbitrary commands, IDENTIFY page is re-read after _GTF taskfiles are
executed.
If one of ACPI methods fails, ata_acpi_on_devcfg() retries on the
first failure.  If it fails again on the second try, ACPI is disabled
on the device.  Note that successful configuration clears ACPI failed
status.
With all feature checks moved to the above two functions,
do_drive_set_taskfiles() is trivial and thus collapsed into
ata_acpi_exec_tfs(), which is now static and converted to return the
number of executed taskfiles to be used by ata_acpi_on_resume().  As
failures are handled properly, ata_acpi_push_id() now returns -errno
on errors instead of unconditional zero.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-05-15 03:28:16 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* let ACPI work its magic */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  ata_acpi_on_devcfg ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-10 16:14:47 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:32:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* massage HPA, do it early as it might change IDENTIFY data */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  ata_hpa_resize ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-13 19:51:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* print device capabilities */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-23 02:29:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_msg_probe ( ap ) ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_dbg ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    " %s: cfg 49:%04x 82:%04x 83:%04x 84:%04x  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    " 85:%04x 86:%04x 87:%04x 88:%04x \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    __func__ , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    id [ 49 ] ,  id [ 82 ] ,  id [ 83 ] ,  id [ 84 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    id [ 85 ] ,  id [ 86 ] ,  id [ 87 ] ,  id [ 88 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-13 19:51:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* initialize to-be-configured parameters */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 18:51:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dev - > flags  & =  ~ ATA_DFLAG_CFG_MASK ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dev - > max_sectors  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev - > cdb_len  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev - > n_sectors  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev - > cylinders  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev - > heads  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev - > sectors  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-03-19 13:32:21 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dev - > multi_count  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  common  ATA ,  ATAPI  feature  tests 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* find max transfer mode; for printk only */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-13 19:48:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									xfer_mask  =  ata_id_xfermask ( id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-06-23 02:29:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_msg_probe ( ap ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_dump_id ( id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-06-05 13:01:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* SCSI only uses 4-char revisions, dump full 8 chars from ATA */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_id_c_string ( dev - > id ,  fwrevbuf ,  ATA_ID_FW_REV , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											sizeof ( fwrevbuf ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_id_c_string ( dev - > id ,  modelbuf ,  ATA_ID_PROD , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											sizeof ( modelbuf ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									/* ATA-specific feature tests */ 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 13:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dev - > class  = =  ATA_DEV_ATA  | |  dev - > class  = =  ATA_DEV_ZAC )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 18:52:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ata_id_is_cfa ( id ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-13 20:50:00 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* CPRM may make this media unusable */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( id [ ATA_ID_CFA_KEY_MGMT ]  &  1 ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" supports DRM functions and may not be fully accessible \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 18:52:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											snprintf ( revbuf ,  7 ,  " CFA " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-04 22:05:49 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-19 06:42:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											snprintf ( revbuf ,  7 ,  " ATA-%d " ,  ata_id_major_version ( id ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-04 22:05:49 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* Warn the user if the device has TPM extensions */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ata_id_has_tpm ( id ) ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" supports DRM functions and may not be fully accessible \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-04 22:05:49 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 18:52:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-13 19:48:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev - > n_sectors  =  ata_id_n_sectors ( id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 22:47:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-03-19 13:32:21 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* get current R/W Multiple count setting */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ( dev - > id [ 47 ]  > >  8 )  = =  0x80  & &  ( dev - > id [ 59 ]  &  0x100 ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											unsigned  int  max  =  dev - > id [ 47 ]  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											unsigned  int  cnt  =  dev - > id [ 59 ]  &  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* only recognize/allow powers of two here */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( is_power_of_2 ( max )  & &  is_power_of_2 ( cnt ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( cnt  < =  max ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													dev - > multi_count  =  cnt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-30 23:00:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-13 19:48:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ata_id_has_lba ( id ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  char  * lba_desc ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-27 09:24:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											char  ncq_desc [ 24 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											lba_desc  =  " LBA " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev - > flags  | =  ATA_DFLAG_LBA ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-13 19:48:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ata_id_has_lba48 ( id ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												dev - > flags  | =  ATA_DFLAG_LBA48 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												lba_desc  =  " LBA48 " ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-11 20:10:45 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( dev - > n_sectors  > =  ( 1UL  < <  28 )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												    ata_id_has_flush_ext ( id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													dev - > flags  | =  ATA_DFLAG_FLUSH_EXT ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* config NCQ */ 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-27 09:24:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											rc  =  ata_dev_config_ncq ( dev ,  ncq_desc ,  sizeof ( ncq_desc ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* print device info to dmesg */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-30 23:00:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ata_msg_drv ( ap )  & &  print_info )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ata_dev_info ( dev ,  " %s: %s, %s, max %s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													     revbuf ,  modelbuf ,  fwrevbuf , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													     ata_mode_string ( xfer_mask ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ata_dev_info ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													     " %llu sectors, multi %u: %s %s \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													( unsigned  long  long ) dev - > n_sectors , 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-30 23:00:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													dev - > multi_count ,  lba_desc ,  ncq_desc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* CHS */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* Default translation */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-13 19:48:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											dev - > cylinders 	=  id [ 1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev - > heads 	=  id [ 3 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev - > sectors 	=  id [ 6 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-13 19:48:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ata_id_current_chs_valid ( id ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												/* Current CHS translation is valid. */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-13 19:48:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												dev - > cylinders  =  id [ 54 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												dev - > heads      =  id [ 55 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												dev - > sectors    =  id [ 56 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* print device info to dmesg */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-30 23:00:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ata_msg_drv ( ap )  & &  print_info )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ata_dev_info ( dev ,  " %s: %s, %s, max %s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													     revbuf , 	modelbuf ,  fwrevbuf , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													     ata_mode_string ( xfer_mask ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ata_dev_info ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													     " %llu sectors, multi %u, CHS %u/%u/%u \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													     ( unsigned  long  long ) dev - > n_sectors , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													     dev - > multi_count ,  dev - > cylinders , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													     dev - > heads ,  dev - > sectors ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-30 23:00:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2005-11-01 19:33:20 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-17 23:18:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* Check and mark DevSlp capability. Get DevSlp timing variables
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  from  SATA  Settings  page  of  Identify  Device  Data  Log . 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-07 22:40:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-17 23:18:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ata_id_has_devslp ( dev - > id ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 11:54:55 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											u8  * sata_setting  =  ap - > sector_buf ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-17 23:18:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  i ,  j ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev - > flags  | =  ATA_DFLAG_DEVSLP ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-07 22:40:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											err_mask  =  ata_read_log_page ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														     ATA_LOG_SATA_ID_DEV_DATA , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														     ATA_LOG_SATA_SETTINGS , 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-17 23:18:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														     sata_setting , 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-07 22:40:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														     1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( err_mask ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ata_dev_dbg ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													    " failed to get Identify Device Data, Emask 0x%x \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													    err_mask ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-17 23:18:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( i  =  0 ;  i  <  ATA_LOG_DEVSLP_SIZE ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													j  =  ATA_LOG_DEVSLP_OFFSET  +  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													dev - > devslp_timing [ i ]  =  sata_setting [ j ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-07 22:40:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-03 11:45:34 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 23:32:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev - > cdb_len  =  16 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* ATAPI-specific feature tests */ 
							 
						 
					
						
							
								
									
										
										
										
											2005-11-14 14:14:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else  if  ( dev - > class  = =  ATA_DEV_ATAPI )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  char  * cdb_intr_string  =  " " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  char  * atapi_an_string  =  " " ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-21 13:25:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  char  * dma_dir_string  =  " " ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										u32  sntf ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-31 13:29:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-13 19:48:04 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  atapi_cdb_len ( id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( ( rc  <  12 )  | |  ( rc  >  ATAPI_CDB_LEN ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-23 02:29:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ata_msg_warn ( ap ) ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ata_dev_warn ( dev ,  " unsupported CDB len \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											rc  =  - EINVAL ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											goto  err_out_nosup ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-12 23:32:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev - > cdb_len  =  ( unsigned  int )  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* Enable ATAPI AN if both the host and device have
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  the  support .   If  PMP  is  attached ,  SNTF  is  required 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  to  enable  ATAPI  AN  to  discern  between  PHY  status 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  changed  notifications  and  ATAPI  ANs . 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-15 03:57:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-19 15:38:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( atapi_an  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    ( ap - > flags  &  ATA_FLAG_AN )  & &  ata_id_has_atapi_AN ( id )  & & 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										    ( ! sata_pmp_attached ( ap )  | | 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										     sata_scr_read ( & ap - > link ,  SCR_NOTIFICATION ,  & sntf )  = =  0 ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-15 03:57:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* issue SET feature command to turn this on */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 00:33:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											err_mask  =  ata_dev_set_feature ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													SETFEATURES_SATA_ENABLE ,  SATA_AN ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( err_mask ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ata_dev_err ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													    " failed to enable ATAPI AN (err_mask=0x%x) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													    err_mask ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											else  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-15 03:57:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												dev - > flags  | =  ATA_DFLAG_AN ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												atapi_an_string  =  " , ATAPI AN " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-15 03:57:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-31 13:29:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ata_id_cdb_intr ( dev - > id ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-09-27 17:38:03 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											dev - > flags  | =  ATA_DFLAG_CDB_INTR ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-31 13:29:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cdb_intr_string  =  " , CDB intr " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2005-09-27 17:38:03 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-21 22:30:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( atapi_dmadir  | |  ( dev - > horkage  &  ATA_HORKAGE_ATAPI_DMADIR )  | |  atapi_id_dmadir ( dev - > id ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-21 13:25:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											dev - > flags  | =  ATA_DFLAG_DMADIR ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dma_dir_string  =  " , DMADIR " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-01-15 17:20:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ata_id_has_da ( dev - > id ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-25 16:13:08 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											dev - > flags  | =  ATA_DFLAG_DA ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-15 17:20:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											zpodd_init ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-25 16:13:08 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										/* print device info to dmesg */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-27 14:51:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ata_msg_drv ( ap )  & &  print_info ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_info ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												     " ATAPI: %s, %s, max %s%s%s%s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												     modelbuf ,  fwrevbuf , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												     ata_mode_string ( xfer_mask ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												     cdb_intr_string ,  atapi_an_string , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												     dma_dir_string ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-11-01 18:39:55 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* determine max_sectors */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev - > max_sectors  =  ATA_MAX_SECTORS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( dev - > flags  &  ATA_DFLAG_LBA48 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > max_sectors  =  ATA_MAX_SECTORS_LBA48 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 14:21:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Limit PATA drive on SATA cable bridge transfers to udma5,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   200  sectors  */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_dev_knobble ( dev ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-27 14:51:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ata_msg_drv ( ap )  & &  print_info ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_info ( dev ,  " applying bridge limits \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 14:07:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev - > udma_mask  & =  ATA_UDMA5 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev - > max_sectors  =  ATA_MAX_SECTORS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-30 11:44:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( dev - > class  = =  ATA_DEV_ATAPI )  & & 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-15 10:35:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									    ( atapi_command_packet_set ( id )  = =  TYPE_TAPE ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-30 11:44:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev - > max_sectors  =  ATA_MAX_SECTORS_TAPE ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-15 10:35:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev - > horkage  | =  ATA_HORKAGE_STUCK_ERR ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-30 11:44:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-07-05 13:31:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dev - > horkage  &  ATA_HORKAGE_MAX_SEC_128 ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-12 13:38:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev - > max_sectors  =  min_t ( unsigned  int ,  ATA_MAX_SECTORS_128 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 dev - > max_sectors ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-02 11:34:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-13 11:48:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dev - > horkage  &  ATA_HORKAGE_MAX_SEC_1024 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > max_sectors  =  min_t ( unsigned  int ,  ATA_MAX_SECTORS_1024 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 dev - > max_sectors ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-18 10:30:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dev - > horkage  &  ATA_HORKAGE_MAX_SEC_LBA48 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > max_sectors  =  ATA_MAX_SECTORS_LBA48 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > ops - > dev_config ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-02 00:56:15 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ap - > ops - > dev_config ( dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 14:21:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dev - > horkage  &  ATA_HORKAGE_DIAGNOSTIC )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* Let the user know. We don't want to disallow opens for
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   rescue  purposes ,  or  in  case  the  vendor  is  just  a  blithering 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   idiot .  Do  this  after  the  dev_config  call  as  some  controllers 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   with  buggy  firmware  may  want  to  avoid  reporting  false  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   bugs  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( print_info )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_warn ( dev , 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 14:21:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								" Drive reports diagnostics failure. This may indicate a drive \n " ) ;  
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_warn ( dev , 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 14:21:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								" fault or invalid emulation. Contact drive vendor for information. \n " ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-27 13:36:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( dev - > horkage  &  ATA_HORKAGE_FIRMWARE_WARN )  & &  print_info )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_warn ( dev ,  " WARNING: device requires firmware update to be fully functional \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_dev_warn ( dev ,  "          contact the vendor or visit http://ata.wiki.kernel.org \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-27 13:36:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								err_out_nosup :  
						 
					
						
							
								
									
										
										
										
											2006-06-23 02:29:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_msg_probe ( ap ) ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_dbg ( dev ,  " %s: EXIT, err \n " ,  __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2007-03-08 23:19:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_cable_40wire 	- 	return  40  wire  cable  type 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ ap :  port 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-08 23:19:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Helper  method  for  drivers  which  want  to  hardwire  40  wire  cable 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	detection . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_cable_40wire ( struct  ata_port  * ap )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ATA_CBL_PATA40 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2007-03-08 23:19:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_cable_80wire 	- 	return  80  wire  cable  type 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ ap :  port 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-08 23:19:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Helper  method  for  drivers  which  want  to  hardwire  80  wire  cable 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	detection . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_cable_80wire ( struct  ata_port  * ap )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ATA_CBL_PATA80 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_cable_unknown 	- 	return  unknown  PATA  cable . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ap :  port 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Helper  method  for  drivers  which  have  no  PATA  cable  detection . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_cable_unknown ( struct  ata_port  * ap )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ATA_CBL_PATA_UNK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_cable_ignore 	- 	return  ignored  PATA  cable . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ap :  port 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Helper  method  for  drivers  which  don ' t  use  cable  type  to  limit 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	transfer  mode . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_cable_ignore ( struct  ata_port  * ap )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ATA_CBL_PATA_IGN ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_cable_sata 	- 	return  SATA  cable  type 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ap :  port 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Helper  method  for  drivers  which  have  SATA  cables 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_cable_sata ( struct  ata_port  * ap )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ATA_CBL_SATA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_bus_probe  -  Reset  and  probe  ATA  bus 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ap :  Bus  to  probe 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-30 19:49:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Master  ATA  bus  probing  function .   Initiates  a  hardware - dependent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	bus  reset ,  then  attempts  to  identify  any  devices  found  on 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	the  bus . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-30 19:49:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	PCI / etc .  bus  probe  sem . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Zero  on  success ,  negative  errno  otherwise . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-08-07 14:27:31 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_bus_probe ( struct  ata_port  * ap )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  classes [ ATA_MAX_DEVICES ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  tries [ ATA_MAX_DEVICES ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_device  * dev ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_for_each_dev ( dev ,  & ap - > link ,  ALL ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tries [ dev - > devno ]  =  ATA_PROBE_MAX_TRIES ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 retry : 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_for_each_dev ( dev ,  & ap - > link ,  ALL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-29 16:41:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* If we issue an SRST then an ATA drive (not ATAPI)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  may  change  configuration  and  be  in  PIO0  timing .  If 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  we  do  a  hard  reset  ( or  are  coming  from  power  on ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  this  is  true  for  ATA  or  ATAPI .  Until  we ' ve  set  a 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  suitable  controller  mode  we  should  not  touch  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  bus  as  we  may  be  talking  too  fast . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > pio_mode  =  XFER_PIO_0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-03 11:35:02 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev - > dma_mode  =  0xff ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-29 16:41:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* If the controller has a pio mode setup function
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  then  use  it  to  set  the  chipset  to  rights .  Don ' t 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  touch  the  DMA  setup  as  that  will  be  dealt  with  when 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  configuring  devices . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ap - > ops - > set_piomode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ap - > ops - > set_piomode ( ap ,  dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-13 01:57:01 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* reset and determine device classes */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > ops - > phy_reset ( ap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-12 00:57:39 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_for_each_dev ( dev ,  & ap - > link ,  ALL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-10 21:41:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( dev - > class  ! =  ATA_DEV_UNKNOWN ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											classes [ dev - > devno ]  =  dev - > class ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											classes [ dev - > devno ]  =  ATA_DEV_NONE ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-13 01:57:01 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev - > class  =  ATA_DEV_UNKNOWN ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-03-02 17:47:28 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* read IDENTIFY page and configure devices. We have to do the identify
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   specific  sequence  bass - ackwards  so  that  PDIAG -  is  released  by 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   the  slave  device  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_for_each_dev ( dev ,  & ap - > link ,  ALL_REVERSE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( tries [ dev - > devno ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev - > class  =  classes [ dev - > devno ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ata_dev_enabled ( dev ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-01 16:09:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-11-10 18:08:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  ata_dev_read_id ( dev ,  & dev - > class ,  ATA_READID_POSTRESET , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												     dev - > id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  fail ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-02 17:47:28 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Now ask for the cable type as PDIAG- should have been released */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ap - > ops - > cable_detect ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ap - > cbl  =  ap - > ops - > cable_detect ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* We may have SATA bridge glue hiding here irrespective of
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  the  reported  cable  types  and  sensed  types .   When  SATA 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  drives  indicate  we  have  a  bridge ,  we  don ' t  know  which  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  of  the  link  the  bridge  is  which  is  a  problem . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_for_each_dev ( dev ,  & ap - > link ,  ENABLED ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-22 23:22:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ata_id_is_sata ( dev - > id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ap - > cbl  =  ATA_CBL_SATA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-03-02 17:47:28 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* After the identify sequence we can now set up the devices. We do
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   this  in  the  normal  order  so  that  the  user  doesn ' t  get  confused  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_for_each_dev ( dev ,  & ap - > link ,  ENABLED )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ap - > link . eh_context . i . flags  | =  ATA_EHI_PRINTINFO ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-01 18:38:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  ata_dev_configure ( dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ap - > link . eh_context . i . flags  & =  ~ ATA_EHI_PRINTINFO ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  fail ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* configure transfer mode */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  ata_set_mode ( & ap - > link ,  & dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-11 22:26:29 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  fail ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_for_each_dev ( dev ,  & ap - > link ,  ENABLED ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  - ENODEV ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 fail : 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tries [ dev - > devno ] - - ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( rc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  - EINVAL : 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* eeek, something went very wrong, give up */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tries [ dev - > devno ]  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  - ENODEV : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* give it just one more chance */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tries [ dev - > devno ]  =  min ( tries [ dev - > devno ] ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  - EIO : 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( tries [ dev - > devno ]  = =  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* This is the last chance, better to slow
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  down  than  lose  it . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											sata_down_spd_limit ( & ap - > link ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_down_xfermask_limit ( dev ,  ATA_DNXFER_PIO ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! tries [ dev - > devno ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_disable ( dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-11 22:26:29 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									goto  retry ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-12-19 22:35:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	sata_print_link_status  -  Print  SATA  link  status 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  SATA  link  to  printk  link  status  about 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-19 22:35:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	This  function  prints  link  speed  and  status  of  a  SATA  link . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-21 11:51:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  sata_print_link_status ( struct  ata_link  * link )  
						 
					
						
							
								
									
										
										
										
											2005-12-19 22:35:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-04-03 00:09:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u32  sstatus ,  scontrol ,  tmp ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-19 22:35:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( sata_scr_read ( link ,  SCR_STATUS ,  & sstatus ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-19 22:35:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									sata_scr_read ( link ,  SCR_CONTROL ,  & scontrol ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-19 22:35:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_phys_link_online ( link ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-19 22:35:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tmp  =  ( sstatus  > >  4 )  &  0xf ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_link_info ( link ,  " SATA link up %s (SStatus %X SControl %X) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											      sata_spd_string ( tmp ) ,  sstatus ,  scontrol ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-19 22:35:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_link_info ( link ,  " SATA link down (SStatus %X SControl %X) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											      sstatus ,  scontrol ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-19 22:35:02 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-23 15:38:34 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_dev_pair 		- 	return  other  device  on  cable 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ adev :  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Obtain  the  other  device  on  the  same  cable ,  or  if  none  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	present  NULL  is  returned 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 09:56:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  ata_device  * ata_dev_pair ( struct  ata_device  * adev )  
						 
					
						
							
								
									
										
										
										
											2006-03-23 15:38:34 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_link  * link  =  adev - > link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_device  * pair  =  & link - > device [ 1  -  adev - > devno ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! ata_dev_enabled ( pair ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-23 15:38:34 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  pair ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	sata_down_spd_limit  -  adjust  SATA  spd  limit  downward 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  Link  to  adjust  SATA  spd  limit  for 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ spd_limit :  Additional  limit 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Adjust  SATA  spd  limit  of  @ link  downward .   Note  that  this 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	function  only  adjusts  the  limit .   The  change  must  be  applied 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	using  sata_set_spd ( ) . 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	If  @ spd_limit  is  non - zero ,  the  speed  is  limited  to  equal  to  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	lower  than  @ spd_limit  if  such  speed  is  supported .   If 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ spd_limit  is  slower  than  any  supported  speed ,  only  the  lowest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	supported  speed  is  allowed . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  caller . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  negative  errno  on  failure 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  sata_down_spd_limit ( struct  ata_link  * link ,  u32  spd_limit )  
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u32  sstatus ,  spd ,  mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ,  bit ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! sata_scr_valid ( link ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-16 14:29:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  - EOPNOTSUPP ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* If SCR can be read, use it to determine the current SPD.
 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  If  not ,  use  cached  value  in  link - > sata_spd . 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-16 14:29:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  sata_scr_read ( link ,  SCR_STATUS ,  & sstatus ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc  = =  0  & &  ata_sstatus_online ( sstatus ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-16 14:29:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spd  =  ( sstatus  > >  4 )  &  0xf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spd  =  link - > sata_spd ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mask  =  link - > sata_spd_limit ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( mask  < =  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-16 14:29:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* unconditionally mask off the highest bit */ 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bit  =  fls ( mask )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									mask  & =  ~ ( 1  < <  bit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-07-16 14:29:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Mask off all speeds higher than or equal to the current
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  one .   Force  1.5 Gbps  if  current  SPD  is  not  available . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( spd  >  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mask  & =  ( 1  < <  ( spd  -  1 ) )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mask  & =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* were we already at the bottom? */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! mask ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( spd_limit )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( mask  &  ( ( 1  < <  spd_limit )  -  1 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											mask  & =  ( 1  < <  spd_limit )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bit  =  ffs ( mask )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											mask  =  1  < <  bit ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									link - > sata_spd_limit  =  mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_link_warn ( link ,  " limiting SATA link speed to %s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										      sata_spd_string ( fls ( mask ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  __sata_set_spd_needed ( struct  ata_link  * link ,  u32  * scontrol )  
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-10-31 10:17:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_link  * host_link  =  & link - > ap - > link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u32  limit ,  target ,  spd ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-31 10:17:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									limit  =  link - > sata_spd_limit ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Don't configure downstream link faster than upstream link.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  It  doesn ' t  speed  up  anything  and  some  PMPs  choke  on  such 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  configuration . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ata_is_host_link ( link )  & &  host_link - > sata_spd ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										limit  & =  ( 1  < <  host_link - > sata_spd )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( limit  = =  UINT_MAX ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										target  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-31 10:17:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										target  =  fls ( limit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spd  =  ( * scontrol  > >  4 )  &  0xf ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-31 10:17:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									* scontrol  =  ( * scontrol  &  ~ 0xf0 )  |  ( ( target  &  0xf )  < <  4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-31 10:17:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  spd  ! =  target ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	sata_set_spd_needed  -  is  SATA  spd  configuration  needed 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  Link  in  question 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Test  whether  the  spd  limit  in  SControl  matches 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link - > sata_spd_limit .   This  function  is  used  to  determine 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	whether  hardreset  is  necessary  to  apply  SATA  spd 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	configuration . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  caller . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	1  if  SATA  spd  configuration  is  needed ,  0  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-21 11:51:17 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  sata_set_spd_needed ( struct  ata_link  * link )  
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u32  scontrol ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( sata_scr_read ( link ,  SCR_CONTROL ,  & scontrol ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-31 10:17:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  __sata_set_spd_needed ( link ,  & scontrol ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	sata_set_spd  -  set  SATA  spd  according  to  spd  limit 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  Link  to  set  SATA  spd  for 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Set  SATA  spd  of  @ link  according  to  sata_spd_limit . 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  caller . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  if  spd  doesn ' t  need  to  be  changed ,  1  if  spd  has  been 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	changed .   Negative  errno  if  SCR  registers  are  inaccessible . 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  sata_set_spd ( struct  ata_link  * link )  
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u32  scontrol ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( rc  =  sata_scr_read ( link ,  SCR_CONTROL ,  & scontrol ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! __sata_set_spd_needed ( link ,  & scontrol ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( rc  =  sata_scr_write ( link ,  SCR_CONTROL ,  scontrol ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  This  mode  timing  computation  functionality  is  ported  over  from 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  drivers / ide / ide - timing . h  and  was  originally  written  by  Vojtech  Pavlik 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
									
										
										
										
											2006-08-10 18:52:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  PIO  0 - 4 ,  MWDMA  0 - 2  and  UDMA  0 - 6  timings  ( in  nanoseconds ) . 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  These  were  taken  from  ATA / ATAPI - 6  standard ,  rev  0 a ,  except 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 18:52:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  for  UDMA6 ,  which  is  currently  supported  only  by  Maxtor  drives . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  For  PIO  5 / 6  MWDMA  3 / 4  see  the  CFA  specification  3.0 . 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  struct  ata_timing  ata_timing [ ]  =  {  
						 
					
						
							
								
									
										
										
										
											2009-01-15 17:45:31 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*	{ XFER_PIO_SLOW, 120, 290, 240, 960, 290, 240, 0,  960,   0 }, */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_PIO_0 ,      70 ,  290 ,  240 ,  600 ,  165 ,  150 ,  0 ,   600 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_PIO_1 ,      50 ,  290 ,   93 ,  383 ,  125 ,  100 ,  0 ,   383 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_PIO_2 ,      30 ,  290 ,   40 ,  330 ,  100 ,   90 ,  0 ,   240 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_PIO_3 ,      30 ,   80 ,   70 ,  180 ,   80 ,   70 ,  0 ,   180 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_PIO_4 ,      25 ,   70 ,   25 ,  120 ,   70 ,   25 ,  0 ,   120 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_PIO_5 ,      15 ,   65 ,   25 ,  100 ,   65 ,   25 ,  0 ,   100 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_PIO_6 ,      10 ,   55 ,   20 ,   80 ,   55 ,   20 ,  0 ,    80 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_SW_DMA_0 ,  120 ,    0 ,    0 ,    0 ,  480 ,  480 ,  50 ,  960 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_SW_DMA_1 ,   90 ,    0 ,    0 ,    0 ,  240 ,  240 ,  30 ,  480 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_SW_DMA_2 ,   60 ,    0 ,    0 ,    0 ,  120 ,  120 ,  20 ,  240 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_MW_DMA_0 ,   60 ,    0 ,    0 ,    0 ,  215 ,  215 ,  20 ,  480 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_MW_DMA_1 ,   45 ,    0 ,    0 ,    0 ,   80 ,   50 ,  5 ,   150 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_MW_DMA_2 ,   25 ,    0 ,    0 ,    0 ,   70 ,   25 ,  5 ,   120 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_MW_DMA_3 ,   25 ,    0 ,    0 ,    0 ,   65 ,   25 ,  5 ,   100 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_MW_DMA_4 ,   25 ,    0 ,    0 ,    0 ,   55 ,   20 ,  5 ,    80 ,    0  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*	{ XFER_UDMA_SLOW,  0,   0,   0,   0,   0,   0, 0,    0, 150 }, */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_UDMA_0 ,      0 ,    0 ,    0 ,    0 ,    0 ,    0 ,  0 ,     0 ,  120  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_UDMA_1 ,      0 ,    0 ,    0 ,    0 ,    0 ,    0 ,  0 ,     0 ,   80  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_UDMA_2 ,      0 ,    0 ,    0 ,    0 ,    0 ,    0 ,  0 ,     0 ,   60  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_UDMA_3 ,      0 ,    0 ,    0 ,    0 ,    0 ,    0 ,  0 ,     0 ,   45  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_UDMA_4 ,      0 ,    0 ,    0 ,    0 ,    0 ,    0 ,  0 ,     0 ,   30  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_UDMA_5 ,      0 ,    0 ,    0 ,    0 ,    0 ,    0 ,  0 ,     0 ,   20  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  XFER_UDMA_6 ,      0 ,    0 ,    0 ,    0 ,    0 ,    0 ,  0 ,     0 ,   15  } , 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  0xFF  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-19 06:42:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define ENOUGH(v, unit)		(((v)-1) / (unit)+1) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define EZ(v, unit)		((v)?ENOUGH(v, unit):0) 
  
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  ata_timing_quantize ( const  struct  ata_timing  * t ,  struct  ata_timing  * q ,  int  T ,  int  UT )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2009-01-15 17:45:31 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									q - > setup 	=  EZ ( t - > setup       *  1000 ,   T ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									q - > act8b 	=  EZ ( t - > act8b       *  1000 ,   T ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									q - > rec8b 	=  EZ ( t - > rec8b       *  1000 ,   T ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									q - > cyc8b 	=  EZ ( t - > cyc8b       *  1000 ,   T ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									q - > active 	=  EZ ( t - > active      *  1000 ,   T ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									q - > recover 	=  EZ ( t - > recover     *  1000 ,   T ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									q - > dmack_hold 	=  EZ ( t - > dmack_hold  *  1000 ,   T ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									q - > cycle 	=  EZ ( t - > cycle       *  1000 ,   T ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									q - > udma 		=  EZ ( t - > udma        *  1000 ,  UT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  ata_timing_merge ( const  struct  ata_timing  * a ,  const  struct  ata_timing  * b ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										      struct  ata_timing  * m ,  unsigned  int  what ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( what  &  ATA_TIMING_SETUP   )  m - > setup    =  max ( a - > setup ,    b - > setup ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( what  &  ATA_TIMING_ACT8B   )  m - > act8b    =  max ( a - > act8b ,    b - > act8b ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( what  &  ATA_TIMING_REC8B   )  m - > rec8b    =  max ( a - > rec8b ,    b - > rec8b ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( what  &  ATA_TIMING_CYC8B   )  m - > cyc8b    =  max ( a - > cyc8b ,    b - > cyc8b ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( what  &  ATA_TIMING_ACTIVE  )  m - > active   =  max ( a - > active ,   b - > active ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( what  &  ATA_TIMING_RECOVER )  m - > recover  =  max ( a - > recover ,  b - > recover ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-15 17:45:31 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( what  &  ATA_TIMING_DMACK_HOLD )  m - > dmack_hold  =  max ( a - > dmack_hold ,  b - > dmack_hold ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( what  &  ATA_TIMING_CYCLE   )  m - > cycle    =  max ( a - > cycle ,    b - > cycle ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( what  &  ATA_TIMING_UDMA    )  m - > udma     =  max ( a - > udma ,     b - > udma ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:39 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  struct  ata_timing  * ata_timing_find_mode ( u8  xfer_mode )  
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  struct  ata_timing  * t  =  ata_timing ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( xfer_mode  >  t - > mode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( xfer_mode  = =  t - > mode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  t ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-10-21 18:57:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WARN_ONCE ( true ,  " %s: unable to find timing for xfer_mode 0x%x \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											__func__ ,  xfer_mode ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_timing_compute ( struct  ata_device  * adev ,  unsigned  short  speed ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										       struct  ata_timing  * t ,  int  T ,  int  UT ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-01-18 18:13:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  u16  * id  =  adev - > id ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  struct  ata_timing  * s ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_timing  p ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 09:56:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  Find  the  mode . 
							 
						 
					
						
							
								
									
										
										
										
											2005-11-16 17:06:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ( s  =  ata_timing_find_mode ( speed ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-11-16 17:06:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memcpy ( t ,  s ,  sizeof ( * s ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  If  the  drive  is  an  EIDE  drive ,  it  can  tell  us  it  needs  extended 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  PIO / MW_DMA  cycle  timing . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-01-18 18:13:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( id [ ATA_ID_FIELD_VALID ]  &  2 )  { 	/* EIDE drive */ 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										memset ( & p ,  0 ,  sizeof ( p ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-18 18:13:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-13 15:17:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( speed  > =  XFER_PIO_0  & &  speed  <  XFER_SW_DMA_0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-18 18:13:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( speed  < =  XFER_PIO_2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p . cycle  =  p . cyc8b  =  id [ ATA_ID_EIDE_PIO ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											else  if  ( ( speed  < =  XFER_PIO_4 )  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												 ( speed  = =  XFER_PIO_5  & &  ! ata_id_is_cfa ( id ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p . cycle  =  p . cyc8b  =  id [ ATA_ID_EIDE_PIO_IORDY ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( speed  > =  XFER_MW_DMA_0  & &  speed  < =  XFER_MW_DMA_2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p . cycle  =  id [ ATA_ID_EIDE_DMA_MIN ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_timing_merge ( & p ,  t ,  t ,  ATA_TIMING_CYCLE  |  ATA_TIMING_CYC8B ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Convert  the  timing  to  bus  clock  counts . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-11-16 17:06:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_timing_quantize ( t ,  t ,  T ,  UT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-28 13:15:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  Even  in  DMA / UDMA  modes  we  still  use  PIO  access  for  IDENTIFY , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  S . M . A . R . T  *  and  some  other  commands .  We  have  to  ensure  that  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  DMA  cycle  timing  is  slower / equal  than  the  fastest  PIO  timing . 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-12-07 12:41:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( speed  >  XFER_PIO_6 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_timing_compute ( adev ,  adev - > pio_mode ,  & p ,  T ,  UT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_timing_merge ( & p ,  t ,  t ,  ATA_TIMING_ALL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-28 13:15:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  Lengthen  active  &  recovery  time  so  that  cycle  time  is  correct . 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( t - > act8b  +  t - > rec8b  <  t - > cyc8b )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t - > act8b  + =  ( t - > cyc8b  -  ( t - > act8b  +  t - > rec8b ) )  /  2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t - > rec8b  =  t - > cyc8b  -  t - > act8b ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( t - > active  +  t - > recover  <  t - > cycle )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t - > active  + =  ( t - > cycle  -  ( t - > active  +  t - > recover ) )  /  2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t - > recover  =  t - > cycle  -  t - > active ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-21 20:14:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-23 11:55:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* In a few cases quantisation may produce enough errors to
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   leave  t - > cycle  too  low  for  the  sum  of  active  and  recovery 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   if  so  we  must  correct  this  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( t - > active  +  t - > recover  >  t - > cycle ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t - > cycle  =  t - > active  +  t - > recover ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-12-18 16:33:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_timing_cycle2mode  -  find  xfer  mode  for  the  specified  cycle  duration 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ xfer_shift :  ATA_SHIFT_ *  value  for  transfer  type  to  examine . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ cycle :  cycle  duration  in  ns 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Return  matching  xfer  mode  for  @ cycle .   The  returned  mode  is  of 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	the  transfer  type  specified  by  @ xfer_shift .   If  @ cycle  is  too 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	slow  for  @ xfer_shift ,  0xff  is  returned .   If  @ cycle  is  faster 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	than  the  fastest  known  mode ,  the  fasted  mode  is  returned . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Matching  xfer_mode ,  0xff  if  no  match  found . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								u8  ata_timing_cycle2mode ( unsigned  int  xfer_shift ,  int  cycle )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u8  base_mode  =  0xff ,  last_mode  =  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  struct  ata_xfer_ent  * ent ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  struct  ata_timing  * t ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( ent  =  ata_xfer_tbl ;  ent - > shift  > =  0 ;  ent + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ent - > shift  = =  xfer_shift ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											base_mode  =  ent - > base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( t  =  ata_timing_find_mode ( base_mode ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									     t  & &  ata_xfer_mode2shift ( t - > mode )  = =  xfer_shift ;  t + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										unsigned  short  this_cycle ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										switch  ( xfer_shift )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_SHIFT_PIO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_SHIFT_MWDMA : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											this_cycle  =  t - > cycle ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_SHIFT_UDMA : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											this_cycle  =  t - > udma ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  0xff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( cycle  >  this_cycle ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										last_mode  =  t - > mode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  last_mode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_down_xfermask_limit  -  adjust  dev  xfer  masks  downward 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  Device  to  adjust  xfer  masks 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ sel :  ATA_DNXFER_ *  selector 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Adjust  xfer  masks  of  @ dev  downward .   Note  that  this  function 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	does  not  apply  the  change .   Invoking  ata_set_mode ( )  afterwards 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	will  apply  the  limit . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  caller . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  negative  errno  on  failure 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_down_xfermask_limit ( struct  ata_device  * dev ,  unsigned  int  sel )  
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									char  buf [ 32 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  orig_mask ,  xfer_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  pio_mask ,  mwdma_mask ,  udma_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  quiet ,  highbit ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									quiet  =  ! ! ( sel  &  ATA_DNXFER_QUIET ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sel  & =  ~ ATA_DNXFER_QUIET ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									xfer_mask  =  orig_mask  =  ata_pack_xfermask ( dev - > pio_mask , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														  dev - > mwdma_mask , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														  dev - > udma_mask ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_unpack_xfermask ( xfer_mask ,  & pio_mask ,  & mwdma_mask ,  & udma_mask ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( sel )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_DNXFER_PIO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										highbit  =  fls ( pio_mask )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pio_mask  & =  ~ ( 1  < <  highbit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_DNXFER_DMA : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( udma_mask )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											highbit  =  fls ( udma_mask )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											udma_mask  & =  ~ ( 1  < <  highbit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! udma_mask ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  - ENOENT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( mwdma_mask )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											highbit  =  fls ( mwdma_mask )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											mwdma_mask  & =  ~ ( 1  < <  highbit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! mwdma_mask ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  - ENOENT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_DNXFER_40C : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										udma_mask  & =  ATA_UDMA_MASK_40C ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_DNXFER_FORCE_PIO0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pio_mask  & =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_DNXFER_FORCE_PIO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mwdma_mask  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										udma_mask  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										BUG ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									xfer_mask  & =  ata_pack_xfermask ( pio_mask ,  mwdma_mask ,  udma_mask ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ( xfer_mask  &  ATA_MASK_PIO )  | |  xfer_mask  = =  orig_mask ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - ENOENT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! quiet )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( xfer_mask  &  ( ATA_MASK_MWDMA  |  ATA_MASK_UDMA ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											snprintf ( buf ,  sizeof ( buf ) ,  " %s:%s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												 ata_mode_string ( xfer_mask ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												 ata_mode_string ( xfer_mask  &  ATA_MASK_PIO ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											snprintf ( buf ,  sizeof ( buf ) ,  " %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												 ata_mode_string ( xfer_mask ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_warn ( dev ,  " limiting speed to %s \n " ,  buf ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:22:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_unpack_xfermask ( xfer_mask ,  & dev - > pio_mask ,  & dev - > mwdma_mask , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    & dev - > udma_mask ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_dev_set_mode ( struct  ata_device  * dev )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2009-07-09 09:27:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  dev - > link - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_eh_context  * ehc  =  & dev - > link - > eh_context ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-09 09:27:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  bool  nosetxfer  =  dev - > horkage  &  ATA_HORKAGE_NOSETXFER ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-07 10:34:08 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  char  * dev_err_whine  =  " " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  ign_dev_err  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-09 09:27:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  err_mask  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 15:25:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 18:51:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dev - > flags  & =  ~ ATA_DFLAG_PIO ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( dev - > xfer_shift  = =  ATA_SHIFT_PIO ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > flags  | =  ATA_DFLAG_PIO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-07-09 09:27:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( nosetxfer  & &  ap - > flags  &  ATA_FLAG_SATA  & &  ata_id_is_sata ( dev - > id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev_err_whine  =  "  (SET_XFERMODE skipped) " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( nosetxfer ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												     " NOSETXFER but PATA detected - can't  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												     " skip SETXFER, might malfunction \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-09 09:27:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										err_mask  =  ata_dev_set_xfermode ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-19 06:42:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-02-07 10:34:08 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( err_mask  &  ~ AC_ERR_DEV ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* revalidate */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ehc - > i . flags  | =  ATA_EHI_POST_SETMODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  ata_dev_revalidate ( dev ,  ATA_DEV_UNKNOWN ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ehc - > i . flags  & =  ~ ATA_EHI_POST_SETMODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-04-08 16:36:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dev - > xfer_shift  = =  ATA_SHIFT_PIO )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* Old CFA may refuse this command, which is just fine */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ata_id_is_cfa ( dev - > id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ign_dev_err  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* Catch several broken garbage emulations plus some pre
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   ATA  devices  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ata_id_major_version ( dev - > id )  = =  0  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													dev - > pio_mode  < =  XFER_PIO_2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ign_dev_err  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* Some very old devices and some bad newer ones fail
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   any  kind  of  SET_XFERMODE  request  but  support  PIO0 - 2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   timings  and  no  IORDY  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ata_id_has_iordy ( dev - > id )  & &  dev - > pio_mode  < =  XFER_PIO_2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ign_dev_err  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-15 19:18:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Early MWDMA devices do DMA but don't allow DMA mode setting.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   Don ' t  fail  an  MWDMA0  set  IFF  the  device  indicates  it  is  in  MWDMA0  */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 14:21:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dev - > xfer_shift  = =  ATA_SHIFT_MWDMA  & & 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-15 19:18:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									    dev - > dma_mode  = =  XFER_MW_DMA_0  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    ( dev - > id [ 63 ]  > >  8 )  &  1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-07 10:34:08 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ign_dev_err  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-15 19:18:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-02-07 10:34:08 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* if the device is actually configured correctly, ignore dev err */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( dev - > xfer_mode  = =  ata_xfer_mask2mode ( ata_id_xfermask ( dev - > id ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ign_dev_err  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-02-07 10:34:08 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( err_mask  &  AC_ERR_DEV )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ign_dev_err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev_err_whine  =  "  (device error ignored) " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DPRINTK ( " xfer_shift=%u, xfer_mode=0x%x \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > xfer_shift ,  ( int ) dev - > xfer_mode ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_dev_info ( dev ,  " configured for %s%s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										     ata_mode_string ( ata_xfer_mode2mask ( dev - > xfer_mode ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										     dev_err_whine ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-07 10:34:08 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 15:25:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-07 10:34:08 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 fail : 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_dev_err ( dev ,  " failed to set xfermode (err_mask=0x%x) \n " ,  err_mask ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-07 10:34:08 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  - EIO ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:52 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_do_set_mode  -  Program  timings  and  issue  SET  FEATURES  -  XFER 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  link  on  which  timings  will  be  programmed 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-03 17:08:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ r_failed_dev :  out  parameter  for  failed  device 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:52 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Standard  implementation  of  the  function  used  to  tune  and  set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ATA  device  disk  transfer  mode  ( PIO3 ,  UDMA6 ,  etc . ) .   If 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_dev_set_mode ( )  fails ,  pointer  to  the  failing  device  is 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	returned  in  @ r_failed_dev . 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-30 15:41:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-30 19:49:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	PCI / etc .  bus  probe  sem . 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  negative  errno  otherwise 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:52 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_do_set_mode ( struct  ata_link  * link ,  struct  ata_device  * * r_failed_dev )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  link - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_device  * dev ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc  =  0 ,  used_dma  =  0 ,  found  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:37 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* step 1: calculate xfer_mask */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_for_each_dev ( dev ,  link ,  ENABLED )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										unsigned  long  pio_mask ,  dma_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-02 12:38:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										unsigned  int  mode_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-02 12:38:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										mode_mask  =  ATA_DMA_MASK_ATA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( dev - > class  = =  ATA_DEV_ATAPI ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											mode_mask  =  ATA_DMA_MASK_ATAPI ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else  if  ( ata_id_is_cfa ( dev - > id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											mode_mask  =  ATA_DMA_MASK_CFA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_xfermask ( dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_force_xfermask ( dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 14:07:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pio_mask  =  ata_pack_xfermask ( dev - > pio_mask ,  0 ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-02 12:38:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( libata_dma_mask  &  mode_mask ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-22 22:41:32 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											dma_mask  =  ata_pack_xfermask ( 0 ,  dev - > mwdma_mask , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														     dev - > udma_mask ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-02 12:38:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dma_mask  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 14:07:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev - > pio_mode  =  ata_xfer_mask2mode ( pio_mask ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > dma_mode  =  ata_xfer_mask2mode ( dma_mask ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-27 18:58:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										found  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-08-01 09:18:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ata_dma_enabled ( dev ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-27 18:58:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											used_dma  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! found ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  out ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* step 2: always set host PIO timings */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_for_each_dev ( dev ,  link ,  ENABLED )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( dev - > pio_mode  = =  0xff )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_warn ( dev ,  " no PIO support \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											rc  =  - EINVAL ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											goto  out ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > xfer_mode  =  dev - > pio_mode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > xfer_shift  =  ATA_SHIFT_PIO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ap - > ops - > set_piomode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ap - > ops - > set_piomode ( ap ,  dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* step 3: set host DMA timings */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_for_each_dev ( dev ,  link ,  ENABLED )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ata_dma_enabled ( dev ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > xfer_mode  =  dev - > dma_mode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > xfer_shift  =  ata_xfer_mode2shift ( dev - > dma_mode ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ap - > ops - > set_dmamode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ap - > ops - > set_dmamode ( ap ,  dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* step 4: update devices' xfer mode */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_for_each_dev ( dev ,  link ,  ENABLED )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  ata_dev_set_mode ( dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( rc ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											goto  out ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 15:25:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Record simplex status. If we selected DMA then the other
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  host  channels  are  not  permitted  to  do  so . 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-27 18:58:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( used_dma  & &  ( ap - > host - > flags  &  ATA_HOST_SIMPLEX ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-01 17:36:46 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ap - > host - > simplex_claimed  =  ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-27 18:58:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 out : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* r_failed_dev  =  dev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_wait_ready  -  wait  for  link  to  become  ready 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  link  to  be  waited  on 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ deadline :  deadline  jiffies  for  the  operation 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ check_ready :  callback  to  check  link  readiness 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Wait  for  @ link  to  become  ready .   @ check_ready  should  return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	positive  number  if  @ link  is  ready ,  0  if  it  isn ' t ,  - ENODEV  if 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	link  doesn ' t  seem  to  be  occupied ,  other  errno  for  other  error 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	conditions . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Transient  - ENODEV  conditions  are  allowed  for 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ATA_TMOUT_FF_WAIT . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	EH  context . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  if  @ linke  is  ready  before  @ deadline ;  otherwise ,  - errno . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_wait_ready ( struct  ata_link  * link ,  unsigned  long  deadline ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   int  ( * check_ready ) ( struct  ata_link  * link ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  start  =  jiffies ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-09 19:46:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  nodev_deadline ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  warned  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-09 19:46:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* choose which 0xff timeout to use, read comment in libata.h */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( link - > ap - > host - > flags  &  ATA_HOST_PARALLEL_SCAN ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										nodev_deadline  =  ata_deadline ( start ,  ATA_TMOUT_FF_WAIT_LONG ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										nodev_deadline  =  ata_deadline ( start ,  ATA_TMOUT_FF_WAIT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Slave readiness can't be tested separately from master.  On
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  M / S  emulation  configuration ,  this  function  should  be  called 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  only  on  the  master  and  it  will  handle  both  master  and  slave . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WARN_ON ( link  = =  link - > ap - > slave_link ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( time_after ( nodev_deadline ,  deadline ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										nodev_deadline  =  deadline ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										unsigned  long  now  =  jiffies ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  ready ,  tmp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ready  =  tmp  =  check_ready ( link ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ready  >  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-09 19:46:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  - ENODEV  could  be  transient .   Ignore  - ENODEV  if  link 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 *  is  online .   Also ,  some  SATA  devices  take  a  long 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-09 19:46:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 *  time  to  clear  0xff  after  reset .   Wait  for 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  ATA_TMOUT_FF_WAIT [ _LONG ]  on  - ENODEV  if  link  isn ' t 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  offline . 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Note  that  some  PATA  controllers  ( pata_ali )  explode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  if  status  register  is  read  more  than  once  when 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  there ' s  no  device  attached . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ready  = =  - ENODEV )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ata_link_online ( link ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ready  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											else  if  ( ( link - > ap - > flags  &  ATA_FLAG_SATA )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												 ! ata_link_offline ( link )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												 time_before ( now ,  nodev_deadline ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ready  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ready ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  ready ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( time_after ( now ,  deadline ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  - EBUSY ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! warned  & &  time_after ( now ,  start  +  5  *  HZ )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    ( deadline  -  now  >  3  *  HZ ) )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_link_warn ( link , 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												" link is slow to respond, please be patient  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												" (ready=%d) \n " ,  tmp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											warned  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-09-06 17:56:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_msleep ( link - > ap ,  50 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_wait_after_reset  -  wait  for  link  to  become  ready  after  reset 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  link  to  be  waited  on 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ deadline :  deadline  jiffies  for  the  operation 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ check_ready :  callback  to  check  link  readiness 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Wait  for  @ link  to  become  ready  after  reset . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	EH  context . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  if  @ linke  is  ready  before  @ deadline ;  otherwise ,  - errno . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-24 18:37:34 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_wait_after_reset ( struct  ata_link  * link ,  unsigned  long  deadline ,  
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  ( * check_ready ) ( struct  ata_link  * link ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-09-06 17:56:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_msleep ( link - > ap ,  ATA_WAIT_AFTER_RESET ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ata_wait_ready ( link ,  deadline ,  check_ready ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	sata_link_debounce  -  debounce  SATA  phy  status 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  to  debounce  SATA  phy  status  for 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ params :  timing  parameters  {  interval ,  duratinon ,  timeout  }  in  msec 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: add deadline support to prereset and reset methods
Add @deadline to prereset and reset methods and make them honor it.
ata_wait_ready() which directly takes @deadline is implemented to be
used as the wait function.  This patch is in preparation for EH timing
improvements.
* ata_wait_ready() never does busy sleep.  It's only used from EH and
  no wait in EH is that urgent.  This function also prints 'be
  patient' message automatically after 5 secs of waiting if more than
  3 secs is remaining till deadline.
* ata_bus_post_reset() now fails with error code if any of its wait
  fails.  This is important because earlier reset tries will have
  shorter timeout than the spec requires.  If a device fails to
  respond before the short timeout, reset should be retried with
  longer timeout rather than silently ignoring the device.
  There are three behavior differences.
  1. Timeout is applied to both devices at once, not separately.  This
     is more consistent with what the spec says.
  2. When a device passes devchk but fails to become ready before
     deadline.  Previouly, post_reset would just succeed and let
     device classification remove the device.  New code fails the
     reset thus causing reset retry.  After a few times, EH will give
     up disabling the port.
  3. When slave device passes devchk but fails to become accessible
     (TF-wise) after reset.  Original code disables dev1 after 30s
     timeout and continues as if the device doesn't exist, while the
     patched code fails reset.  When this happens, new code fails
     reset on whole port rather than proceeding with only the primary
     device.
  If the failing device is suffering transient problems, new code
  retries reset which is a better behavior.  If the failing device is
  actually broken, the net effect is identical to it, but not to the
  other device sharing the channel.  In the previous code, reset would
  have succeeded after 30s thus detecting the working one.  In the new
  code, reset fails and whole port gets disabled.  IMO, it's a
  pathological case anyway (broken device sharing bus with working
  one) and doesn't really matter.
* ata_bus_softreset() is changed to return error code from
  ata_bus_post_reset().  It used to return 0 unconditionally.
* Spin up waiting is to be removed and not converted to honor
  deadline.
* To be on the safe side, deadline is set to 40s for the time being.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-02-02 16:50:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ deadline :  deadline  jiffies  for  the  operation 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:50:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Make  sure  SStatus  of  @ link  reaches  stable  state ,  determined  by 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	holding  the  same  value  where  DET  is  not  1  for  @ duration  polled 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	every  @ interval ,  before  @ timeout .   Timeout  constraints  the 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: add deadline support to prereset and reset methods
Add @deadline to prereset and reset methods and make them honor it.
ata_wait_ready() which directly takes @deadline is implemented to be
used as the wait function.  This patch is in preparation for EH timing
improvements.
* ata_wait_ready() never does busy sleep.  It's only used from EH and
  no wait in EH is that urgent.  This function also prints 'be
  patient' message automatically after 5 secs of waiting if more than
  3 secs is remaining till deadline.
* ata_bus_post_reset() now fails with error code if any of its wait
  fails.  This is important because earlier reset tries will have
  shorter timeout than the spec requires.  If a device fails to
  respond before the short timeout, reset should be retried with
  longer timeout rather than silently ignoring the device.
  There are three behavior differences.
  1. Timeout is applied to both devices at once, not separately.  This
     is more consistent with what the spec says.
  2. When a device passes devchk but fails to become ready before
     deadline.  Previouly, post_reset would just succeed and let
     device classification remove the device.  New code fails the
     reset thus causing reset retry.  After a few times, EH will give
     up disabling the port.
  3. When slave device passes devchk but fails to become accessible
     (TF-wise) after reset.  Original code disables dev1 after 30s
     timeout and continues as if the device doesn't exist, while the
     patched code fails reset.  When this happens, new code fails
     reset on whole port rather than proceeding with only the primary
     device.
  If the failing device is suffering transient problems, new code
  retries reset which is a better behavior.  If the failing device is
  actually broken, the net effect is identical to it, but not to the
  other device sharing the channel.  In the previous code, reset would
  have succeeded after 30s thus detecting the working one.  In the new
  code, reset fails and whole port gets disabled.  IMO, it's a
  pathological case anyway (broken device sharing bus with working
  one) and doesn't really matter.
* ata_bus_softreset() is changed to return error code from
  ata_bus_post_reset().  It used to return 0 unconditionally.
* Spin up waiting is to be removed and not converted to honor
  deadline.
* To be on the safe side, deadline is set to 40s for the time being.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-02-02 16:50:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	beginning  of  the  stable  state .   Because  DET  gets  stuck  at  1  on 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	some  controllers  after  hot  unplugging ,  this  functions  waits 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	until  timeout  then  returns  0  if  DET  is  stable  at  1. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: add deadline support to prereset and reset methods
Add @deadline to prereset and reset methods and make them honor it.
ata_wait_ready() which directly takes @deadline is implemented to be
used as the wait function.  This patch is in preparation for EH timing
improvements.
* ata_wait_ready() never does busy sleep.  It's only used from EH and
  no wait in EH is that urgent.  This function also prints 'be
  patient' message automatically after 5 secs of waiting if more than
  3 secs is remaining till deadline.
* ata_bus_post_reset() now fails with error code if any of its wait
  fails.  This is important because earlier reset tries will have
  shorter timeout than the spec requires.  If a device fails to
  respond before the short timeout, reset should be retried with
  longer timeout rather than silently ignoring the device.
  There are three behavior differences.
  1. Timeout is applied to both devices at once, not separately.  This
     is more consistent with what the spec says.
  2. When a device passes devchk but fails to become ready before
     deadline.  Previouly, post_reset would just succeed and let
     device classification remove the device.  New code fails the
     reset thus causing reset retry.  After a few times, EH will give
     up disabling the port.
  3. When slave device passes devchk but fails to become accessible
     (TF-wise) after reset.  Original code disables dev1 after 30s
     timeout and continues as if the device doesn't exist, while the
     patched code fails reset.  When this happens, new code fails
     reset on whole port rather than proceeding with only the primary
     device.
  If the failing device is suffering transient problems, new code
  retries reset which is a better behavior.  If the failing device is
  actually broken, the net effect is identical to it, but not to the
  other device sharing the channel.  In the previous code, reset would
  have succeeded after 30s thus detecting the working one.  In the new
  code, reset fails and whole port gets disabled.  IMO, it's a
  pathological case anyway (broken device sharing bus with working
  one) and doesn't really matter.
* ata_bus_softreset() is changed to return error code from
  ata_bus_post_reset().  It used to return 0 unconditionally.
* Spin up waiting is to be removed and not converted to honor
  deadline.
* To be on the safe side, deadline is set to 40s for the time being.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-02-02 16:50:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ timeout  is  further  limited  by  @ deadline .   The  sooner  of  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	two  is  used . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - errno  on  failure . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  sata_link_debounce ( struct  ata_link  * link ,  const  unsigned  long  * params ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										       unsigned  long  deadline ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-02 18:20:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-05-20 02:17:51 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  interval  =  params [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  duration  =  params [ 1 ] ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: add deadline support to prereset and reset methods
Add @deadline to prereset and reset methods and make them honor it.
ata_wait_ready() which directly takes @deadline is implemented to be
used as the wait function.  This patch is in preparation for EH timing
improvements.
* ata_wait_ready() never does busy sleep.  It's only used from EH and
  no wait in EH is that urgent.  This function also prints 'be
  patient' message automatically after 5 secs of waiting if more than
  3 secs is remaining till deadline.
* ata_bus_post_reset() now fails with error code if any of its wait
  fails.  This is important because earlier reset tries will have
  shorter timeout than the spec requires.  If a device fails to
  respond before the short timeout, reset should be retried with
  longer timeout rather than silently ignoring the device.
  There are three behavior differences.
  1. Timeout is applied to both devices at once, not separately.  This
     is more consistent with what the spec says.
  2. When a device passes devchk but fails to become ready before
     deadline.  Previouly, post_reset would just succeed and let
     device classification remove the device.  New code fails the
     reset thus causing reset retry.  After a few times, EH will give
     up disabling the port.
  3. When slave device passes devchk but fails to become accessible
     (TF-wise) after reset.  Original code disables dev1 after 30s
     timeout and continues as if the device doesn't exist, while the
     patched code fails reset.  When this happens, new code fails
     reset on whole port rather than proceeding with only the primary
     device.
  If the failing device is suffering transient problems, new code
  retries reset which is a better behavior.  If the failing device is
  actually broken, the net effect is identical to it, but not to the
  other device sharing the channel.  In the previous code, reset would
  have succeeded after 30s thus detecting the working one.  In the new
  code, reset fails and whole port gets disabled.  IMO, it's a
  pathological case anyway (broken device sharing bus with working
  one) and doesn't really matter.
* ata_bus_softreset() is changed to return error code from
  ata_bus_post_reset().  It used to return 0 unconditionally.
* Spin up waiting is to be removed and not converted to honor
  deadline.
* To be on the safe side, deadline is set to 40s for the time being.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-02-02 16:50:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  last_jiffies ,  t ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u32  last ,  cur ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-05-20 02:17:51 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									t  =  ata_deadline ( jiffies ,  params [ 2 ] ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: add deadline support to prereset and reset methods
Add @deadline to prereset and reset methods and make them honor it.
ata_wait_ready() which directly takes @deadline is implemented to be
used as the wait function.  This patch is in preparation for EH timing
improvements.
* ata_wait_ready() never does busy sleep.  It's only used from EH and
  no wait in EH is that urgent.  This function also prints 'be
  patient' message automatically after 5 secs of waiting if more than
  3 secs is remaining till deadline.
* ata_bus_post_reset() now fails with error code if any of its wait
  fails.  This is important because earlier reset tries will have
  shorter timeout than the spec requires.  If a device fails to
  respond before the short timeout, reset should be retried with
  longer timeout rather than silently ignoring the device.
  There are three behavior differences.
  1. Timeout is applied to both devices at once, not separately.  This
     is more consistent with what the spec says.
  2. When a device passes devchk but fails to become ready before
     deadline.  Previouly, post_reset would just succeed and let
     device classification remove the device.  New code fails the
     reset thus causing reset retry.  After a few times, EH will give
     up disabling the port.
  3. When slave device passes devchk but fails to become accessible
     (TF-wise) after reset.  Original code disables dev1 after 30s
     timeout and continues as if the device doesn't exist, while the
     patched code fails reset.  When this happens, new code fails
     reset on whole port rather than proceeding with only the primary
     device.
  If the failing device is suffering transient problems, new code
  retries reset which is a better behavior.  If the failing device is
  actually broken, the net effect is identical to it, but not to the
  other device sharing the channel.  In the previous code, reset would
  have succeeded after 30s thus detecting the working one.  In the new
  code, reset fails and whole port gets disabled.  IMO, it's a
  pathological case anyway (broken device sharing bus with working
  one) and doesn't really matter.
* ata_bus_softreset() is changed to return error code from
  ata_bus_post_reset().  It used to return 0 unconditionally.
* Spin up waiting is to be removed and not converted to honor
  deadline.
* To be on the safe side, deadline is set to 40s for the time being.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-02-02 16:50:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( time_before ( t ,  deadline ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										deadline  =  t ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( rc  =  sata_scr_read ( link ,  SCR_STATUS ,  & cur ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cur  & =  0xf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									last  =  cur ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									last_jiffies  =  jiffies ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( 1 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-06 17:56:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_msleep ( link - > ap ,  interval ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ( rc  =  sata_scr_read ( link ,  SCR_STATUS ,  & cur ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cur  & =  0xf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* DET stable? */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( cur  = =  last )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: add deadline support to prereset and reset methods
Add @deadline to prereset and reset methods and make them honor it.
ata_wait_ready() which directly takes @deadline is implemented to be
used as the wait function.  This patch is in preparation for EH timing
improvements.
* ata_wait_ready() never does busy sleep.  It's only used from EH and
  no wait in EH is that urgent.  This function also prints 'be
  patient' message automatically after 5 secs of waiting if more than
  3 secs is remaining till deadline.
* ata_bus_post_reset() now fails with error code if any of its wait
  fails.  This is important because earlier reset tries will have
  shorter timeout than the spec requires.  If a device fails to
  respond before the short timeout, reset should be retried with
  longer timeout rather than silently ignoring the device.
  There are three behavior differences.
  1. Timeout is applied to both devices at once, not separately.  This
     is more consistent with what the spec says.
  2. When a device passes devchk but fails to become ready before
     deadline.  Previouly, post_reset would just succeed and let
     device classification remove the device.  New code fails the
     reset thus causing reset retry.  After a few times, EH will give
     up disabling the port.
  3. When slave device passes devchk but fails to become accessible
     (TF-wise) after reset.  Original code disables dev1 after 30s
     timeout and continues as if the device doesn't exist, while the
     patched code fails reset.  When this happens, new code fails
     reset on whole port rather than proceeding with only the primary
     device.
  If the failing device is suffering transient problems, new code
  retries reset which is a better behavior.  If the failing device is
  actually broken, the net effect is identical to it, but not to the
  other device sharing the channel.  In the previous code, reset would
  have succeeded after 30s thus detecting the working one.  In the new
  code, reset fails and whole port gets disabled.  IMO, it's a
  pathological case anyway (broken device sharing bus with working
  one) and doesn't really matter.
* ata_bus_softreset() is changed to return error code from
  ata_bus_post_reset().  It used to return 0 unconditionally.
* Spin up waiting is to be removed and not converted to honor
  deadline.
* To be on the safe side, deadline is set to 40s for the time being.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-02-02 16:50:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( cur  = =  1  & &  time_before ( jiffies ,  deadline ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-20 02:17:51 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( time_after ( jiffies , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												       ata_deadline ( last_jiffies ,  duration ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* unstable, start over */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										last  =  cur ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										last_jiffies  =  jiffies ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-07-16 14:29:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* Check deadline.  If debouncing failed, return
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  - EPIPE  to  tell  upper  layer  to  lower  link  speed . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: add deadline support to prereset and reset methods
Add @deadline to prereset and reset methods and make them honor it.
ata_wait_ready() which directly takes @deadline is implemented to be
used as the wait function.  This patch is in preparation for EH timing
improvements.
* ata_wait_ready() never does busy sleep.  It's only used from EH and
  no wait in EH is that urgent.  This function also prints 'be
  patient' message automatically after 5 secs of waiting if more than
  3 secs is remaining till deadline.
* ata_bus_post_reset() now fails with error code if any of its wait
  fails.  This is important because earlier reset tries will have
  shorter timeout than the spec requires.  If a device fails to
  respond before the short timeout, reset should be retried with
  longer timeout rather than silently ignoring the device.
  There are three behavior differences.
  1. Timeout is applied to both devices at once, not separately.  This
     is more consistent with what the spec says.
  2. When a device passes devchk but fails to become ready before
     deadline.  Previouly, post_reset would just succeed and let
     device classification remove the device.  New code fails the
     reset thus causing reset retry.  After a few times, EH will give
     up disabling the port.
  3. When slave device passes devchk but fails to become accessible
     (TF-wise) after reset.  Original code disables dev1 after 30s
     timeout and continues as if the device doesn't exist, while the
     patched code fails reset.  When this happens, new code fails
     reset on whole port rather than proceeding with only the primary
     device.
  If the failing device is suffering transient problems, new code
  retries reset which is a better behavior.  If the failing device is
  actually broken, the net effect is identical to it, but not to the
  other device sharing the channel.  In the previous code, reset would
  have succeeded after 30s thus detecting the working one.  In the new
  code, reset fails and whole port gets disabled.  IMO, it's a
  pathological case anyway (broken device sharing bus with working
  one) and doesn't really matter.
* ata_bus_softreset() is changed to return error code from
  ata_bus_post_reset().  It used to return 0 unconditionally.
* Spin up waiting is to be removed and not converted to honor
  deadline.
* To be on the safe side, deadline is set to 40s for the time being.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-02-02 16:50:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( time_after ( jiffies ,  deadline ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-16 14:29:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  - EPIPE ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	sata_link_resume  -  resume  SATA  link 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  to  resume  SATA 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ params :  timing  parameters  {  interval ,  duratinon ,  timeout  }  in  msec 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: add deadline support to prereset and reset methods
Add @deadline to prereset and reset methods and make them honor it.
ata_wait_ready() which directly takes @deadline is implemented to be
used as the wait function.  This patch is in preparation for EH timing
improvements.
* ata_wait_ready() never does busy sleep.  It's only used from EH and
  no wait in EH is that urgent.  This function also prints 'be
  patient' message automatically after 5 secs of waiting if more than
  3 secs is remaining till deadline.
* ata_bus_post_reset() now fails with error code if any of its wait
  fails.  This is important because earlier reset tries will have
  shorter timeout than the spec requires.  If a device fails to
  respond before the short timeout, reset should be retried with
  longer timeout rather than silently ignoring the device.
  There are three behavior differences.
  1. Timeout is applied to both devices at once, not separately.  This
     is more consistent with what the spec says.
  2. When a device passes devchk but fails to become ready before
     deadline.  Previouly, post_reset would just succeed and let
     device classification remove the device.  New code fails the
     reset thus causing reset retry.  After a few times, EH will give
     up disabling the port.
  3. When slave device passes devchk but fails to become accessible
     (TF-wise) after reset.  Original code disables dev1 after 30s
     timeout and continues as if the device doesn't exist, while the
     patched code fails reset.  When this happens, new code fails
     reset on whole port rather than proceeding with only the primary
     device.
  If the failing device is suffering transient problems, new code
  retries reset which is a better behavior.  If the failing device is
  actually broken, the net effect is identical to it, but not to the
  other device sharing the channel.  In the previous code, reset would
  have succeeded after 30s thus detecting the working one.  In the new
  code, reset fails and whole port gets disabled.  IMO, it's a
  pathological case anyway (broken device sharing bus with working
  one) and doesn't really matter.
* ata_bus_softreset() is changed to return error code from
  ata_bus_post_reset().  It used to return 0 unconditionally.
* Spin up waiting is to be removed and not converted to honor
  deadline.
* To be on the safe side, deadline is set to 40s for the time being.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-02-02 16:50:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ deadline :  deadline  jiffies  for  the  operation 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Resume  SATA  phy  @ link  and  debounce  it . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - errno  on  failure . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  sata_link_resume ( struct  ata_link  * link ,  const  unsigned  long  * params ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										     unsigned  long  deadline ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-01-11 11:14:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  tries  =  ATA_LINK_RESUME_TRIES ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u32  scontrol ,  serror ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( rc  =  sata_scr_read ( link ,  SCR_CONTROL ,  & scontrol ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-02 18:20:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-01-11 11:14:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Writes  to  SControl  sometimes  get  ignored  under  certain 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  controllers  ( ata_piix  SIDPR ) .   Make  sure  DET  actually  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  cleared . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									do  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scontrol  =  ( scontrol  &  0x0f0 )  |  0x300 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ( rc  =  sata_scr_write ( link ,  SCR_CONTROL ,  scontrol ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Some  PHYs  react  badly  if  SStatus  is  pounded 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  immediately  after  resuming .   Delay  200 ms  before 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  debouncing . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-07 16:03:33 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ( link - > flags  &  ATA_LFLAG_NO_DB_DELAY ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ata_msleep ( link - > ap ,  200 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-01-11 11:14:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* is SControl restored correctly? */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ( rc  =  sata_scr_read ( link ,  SCR_CONTROL ,  & scontrol ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  while  ( ( scontrol  &  0xf0f )  ! =  0x300  & &  - - tries ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-02 18:20:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-01-11 11:14:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( scontrol  &  0xf0f )  ! =  0x300 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-01 15:12:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_link_warn ( link ,  " failed to resume link (SControl %X) \n " , 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											     scontrol ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-11 11:14:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( tries  <  ATA_LINK_RESUME_TRIES ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_link_warn ( link ,  " link resume succeeded after %d retries \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											      ATA_LINK_RESUME_TRIES  -  tries ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-02 18:20:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( rc  =  sata_link_debounce ( link ,  params ,  deadline ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-05-19 01:15:08 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* clear SError, some PHYs require this even for SRST to work */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! ( rc  =  sata_scr_read ( link ,  SCR_ERROR ,  & serror ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  sata_scr_write ( link ,  SCR_ERROR ,  serror ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-05-19 01:15:08 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  rc  ! =  - EINVAL  ?  rc  :  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-02 18:20:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:50:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	sata_link_scr_lpm  -  manipulate  SControl  IPM  and  SPM  fields 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  to  manipulate  SControl  for 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ policy :  LPM  policy  to  configure 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ spm_wakeup :  initiate  LPM  transition  to  active  state 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Manipulate  the  IPM  field  of  the  SControl  register  of  @ link 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	according  to  @ policy .   If  @ policy  is  ATA_LPM_MAX_POWER  and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ spm_wakeup  is  % true ,  the  SPM  field  is  manipulated  to  wake  up 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	the  link .   This  function  also  clears  PHYRDY_CHG  before 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	returning . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	EH  context . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-29 23:11:51 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	0  on  success ,  - errno  otherwise . 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:50:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  sata_link_scr_lpm ( struct  ata_link  * link ,  enum  ata_lpm_policy  policy ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										      bool  spm_wakeup ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_eh_context  * ehc  =  & link - > eh_context ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  woken_up  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u32  scontrol ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  sata_scr_read ( link ,  SCR_CONTROL ,  & scontrol ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( policy )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_LPM_MAX_POWER : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* disable all LPM transitions */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-07 22:40:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										scontrol  | =  ( 0x7  < <  8 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:50:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* initiate transition to active state */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( spm_wakeup )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											scontrol  | =  ( 0x4  < <  12 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											woken_up  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_LPM_MED_POWER : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* allow LPM to PARTIAL */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scontrol  & =  ~ ( 0x1  < <  8 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-07 22:40:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										scontrol  | =  ( 0x6  < <  8 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:50:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  ATA_LPM_MIN_POWER : 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-04 10:24:11 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ata_link_nr_enabled ( link )  >  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* no restrictions on LPM transitions */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-07 22:40:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											scontrol  & =  ~ ( 0x7  < <  8 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-04 10:24:11 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* empty port, power off */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											scontrol  & =  ~ 0xf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											scontrol  | =  ( 0x1  < <  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:50:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										WARN_ON ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  sata_scr_write ( link ,  SCR_CONTROL ,  scontrol ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* give the link time to transit out of LPM state */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( woken_up ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										msleep ( 10 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* clear PHYRDY_CHG from SError */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ehc - > i . serror  & =  ~ SERR_PHYRDY_CHG ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  sata_scr_write ( link ,  SCR_ERROR ,  SERR_PHYRDY_CHG ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_std_prereset  -  prepare  for  reset 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  to  be  reset 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: add deadline support to prereset and reset methods
Add @deadline to prereset and reset methods and make them honor it.
ata_wait_ready() which directly takes @deadline is implemented to be
used as the wait function.  This patch is in preparation for EH timing
improvements.
* ata_wait_ready() never does busy sleep.  It's only used from EH and
  no wait in EH is that urgent.  This function also prints 'be
  patient' message automatically after 5 secs of waiting if more than
  3 secs is remaining till deadline.
* ata_bus_post_reset() now fails with error code if any of its wait
  fails.  This is important because earlier reset tries will have
  shorter timeout than the spec requires.  If a device fails to
  respond before the short timeout, reset should be retried with
  longer timeout rather than silently ignoring the device.
  There are three behavior differences.
  1. Timeout is applied to both devices at once, not separately.  This
     is more consistent with what the spec says.
  2. When a device passes devchk but fails to become ready before
     deadline.  Previouly, post_reset would just succeed and let
     device classification remove the device.  New code fails the
     reset thus causing reset retry.  After a few times, EH will give
     up disabling the port.
  3. When slave device passes devchk but fails to become accessible
     (TF-wise) after reset.  Original code disables dev1 after 30s
     timeout and continues as if the device doesn't exist, while the
     patched code fails reset.  When this happens, new code fails
     reset on whole port rather than proceeding with only the primary
     device.
  If the failing device is suffering transient problems, new code
  retries reset which is a better behavior.  If the failing device is
  actually broken, the net effect is identical to it, but not to the
  other device sharing the channel.  In the previous code, reset would
  have succeeded after 30s thus detecting the working one.  In the new
  code, reset fails and whole port gets disabled.  IMO, it's a
  pathological case anyway (broken device sharing bus with working
  one) and doesn't really matter.
* ata_bus_softreset() is changed to return error code from
  ata_bus_post_reset().  It used to return 0 unconditionally.
* Spin up waiting is to be removed and not converted to honor
  deadline.
* To be on the safe side, deadline is set to 40s for the time being.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-02-02 16:50:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ deadline :  deadline  jiffies  for  the  operation 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link  is  about  to  be  reset .   Initialize  it .   Failure  from 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:50:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	prereset  makes  libata  abort  whole  reset  sequence  and  give  up 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	that  port ,  so  prereset  should  be  best - effort .   It  does  its 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	best  to  prepare  for  reset  sequence  but  if  things  go  wrong ,  it 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	should  just  whine ,  not  fail . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - errno  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_std_prereset ( struct  ata_link  * link ,  unsigned  long  deadline )  
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  link - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_eh_context  * ehc  =  & link - > eh_context ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:26 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  unsigned  long  * timing  =  sata_ehc_deb_timing ( ehc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* if we're about to do hardreset, nothing more to do */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ehc - > i . action  &  ATA_EH_HARDRESET ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* if SATA, resume link */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-21 18:33:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > flags  &  ATA_FLAG_SATA )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  sata_link_resume ( link ,  timing ,  deadline ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-02 16:50:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* whine about phy resume failure but proceed */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( rc  & &  rc  ! =  - EOPNOTSUPP ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_link_warn ( link , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      " failed to resume link for reset (errno=%d) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-04-08 01:46:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* no point in trying softreset on offline link */ 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_phys_link_offline ( link ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-08 01:46:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ehc - > i . action  & =  ~ ATA_EH_SOFTRESET ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	sata_link_hardreset  -  reset  link  via  SATA  phy  reset 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  link  to  reset 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ timing :  timing  parameters  {  interval ,  duratinon ,  timeout  }  in  msec 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: add deadline support to prereset and reset methods
Add @deadline to prereset and reset methods and make them honor it.
ata_wait_ready() which directly takes @deadline is implemented to be
used as the wait function.  This patch is in preparation for EH timing
improvements.
* ata_wait_ready() never does busy sleep.  It's only used from EH and
  no wait in EH is that urgent.  This function also prints 'be
  patient' message automatically after 5 secs of waiting if more than
  3 secs is remaining till deadline.
* ata_bus_post_reset() now fails with error code if any of its wait
  fails.  This is important because earlier reset tries will have
  shorter timeout than the spec requires.  If a device fails to
  respond before the short timeout, reset should be retried with
  longer timeout rather than silently ignoring the device.
  There are three behavior differences.
  1. Timeout is applied to both devices at once, not separately.  This
     is more consistent with what the spec says.
  2. When a device passes devchk but fails to become ready before
     deadline.  Previouly, post_reset would just succeed and let
     device classification remove the device.  New code fails the
     reset thus causing reset retry.  After a few times, EH will give
     up disabling the port.
  3. When slave device passes devchk but fails to become accessible
     (TF-wise) after reset.  Original code disables dev1 after 30s
     timeout and continues as if the device doesn't exist, while the
     patched code fails reset.  When this happens, new code fails
     reset on whole port rather than proceeding with only the primary
     device.
  If the failing device is suffering transient problems, new code
  retries reset which is a better behavior.  If the failing device is
  actually broken, the net effect is identical to it, but not to the
  other device sharing the channel.  In the previous code, reset would
  have succeeded after 30s thus detecting the working one.  In the new
  code, reset fails and whole port gets disabled.  IMO, it's a
  pathological case anyway (broken device sharing bus with working
  one) and doesn't really matter.
* ata_bus_softreset() is changed to return error code from
  ata_bus_post_reset().  It used to return 0 unconditionally.
* Spin up waiting is to be removed and not converted to honor
  deadline.
* To be on the safe side, deadline is set to 40s for the time being.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-02-02 16:50:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ deadline :  deadline  jiffies  for  the  operation 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ online :  optional  out  parameter  indicating  link  onlineness 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ check_ready :  optional  callback  to  check  link  readiness 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	SATA  phy - reset  @ link  using  DET  bits  of  SControl  register . 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	After  hardreset ,  link  readiness  is  waited  upon  using 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_wait_ready ( )  if  @ check_ready  is  specified .   LLDs  are 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	allowed  to  not  specify  @ check_ready  and  wait  itself  after  this 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	function  returns .   Device  classification  is  LLD ' s 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	responsibility . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	* @ online  is  set  to  one  iff  reset  succeeded  and  @ link  is  online 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	after  reset . 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - errno  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  sata_link_hardreset ( struct  ata_link  * link ,  const  unsigned  long  * timing ,  
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											unsigned  long  deadline , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bool  * online ,  int  ( * check_ready ) ( struct  ata_link  * ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u32  scontrol ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DPRINTK ( " ENTER \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( online ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* online  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( sata_set_spd_needed ( link ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* SATA spec says nothing about how to reconfigure
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  spd .   To  be  on  the  safe  side ,  turn  off  phy  during 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  reconfiguration .   This  works  for  at  least  ICH7  AHCI 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  and  Sil3124 . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ( rc  =  sata_scr_read ( link ,  SCR_CONTROL ,  & scontrol ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-01 17:59:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											goto  out ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-07-05 15:06:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										scontrol  =  ( scontrol  &  0x0f0 )  |  0x304 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ( rc  =  sata_scr_write ( link ,  SCR_CONTROL ,  scontrol ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-01 17:59:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											goto  out ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										sata_set_spd ( link ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* issue phy wake/reset */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( rc  =  sata_scr_read ( link ,  SCR_CONTROL ,  & scontrol ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-01 17:59:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  out ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-01 01:38:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scontrol  =  ( scontrol  &  0x0f0 )  |  0x301 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( rc  =  sata_scr_write_flush ( link ,  SCR_CONTROL ,  scontrol ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-01 17:59:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  out ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 20:53:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Couldn't find anything in SATA I/II specs, but AHCI-1.1
 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  10.4 .2  says  at  least  1  ms . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-06 17:56:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_msleep ( link - > ap ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* bring link back */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  sata_link_resume ( link ,  timing ,  deadline ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* if link is offline nothing more to do */ 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_phys_link_offline ( link ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Link is online.  From this point, -ENODEV too is an error. */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( online ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* online  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( sata_pmp_supported ( link - > ap )  & &  ata_is_host_link ( link ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* If PMP is supported, we have to do follow-up SRST.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Some  PMPs  don ' t  send  D2H  Reg  FIS  after  hardreset  if 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  the  first  port  is  empty .   Wait  only  for 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  ATA_TMOUT_PMP_SRST_WAIT . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( check_ready )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											unsigned  long  pmp_deadline ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-05-20 02:17:51 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											pmp_deadline  =  ata_deadline ( jiffies , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														    ATA_TMOUT_PMP_SRST_WAIT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( time_after ( pmp_deadline ,  deadline ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pmp_deadline  =  deadline ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ata_wait_ready ( link ,  pmp_deadline ,  check_ready ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  - EAGAIN ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( check_ready ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  ata_wait_ready ( link ,  deadline ,  check_ready ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-01 17:59:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 out : 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-19 01:15:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc  & &  rc  ! =  - EAGAIN )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* online is set iff link is online && reset succeeded */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( online ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											* online  =  false ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_link_err ( link ,  " COMRESET failed (errno=%d) \n " ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-19 01:15:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-01 17:59:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DPRINTK ( " EXIT, rc=%d \n " ,  rc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	sata_std_hardreset  -  COMRESET  w / o  waiting  or  classification 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  link  to  reset 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ class :  resulting  class  of  attached  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ deadline :  deadline  jiffies  for  the  operation 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Standard  SATA  COMRESET  w / o  waiting  or  classification . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  if  link  offline ,  - EAGAIN  if  link  online ,  - errno  on  errors . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  sata_std_hardreset ( struct  ata_link  * link ,  unsigned  int  * class ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										       unsigned  long  deadline ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  unsigned  long  * timing  =  sata_ehc_deb_timing ( & link - > eh_context ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  online ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* do hardreset */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  sata_link_hardreset ( link ,  timing ,  deadline ,  & online ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  online  ?  - EAGAIN  :  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_std_postreset  -  standard  postreset  callback 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  the  target  ata_link 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ classes :  classes  of  attached  devices 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	This  function  is  invoked  after  a  successful  reset .   Note  that 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	the  device  might  have  been  reset  more  than  once  using 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	different  reset  methods  before  postreset  is  invoked . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_std_postreset ( struct  ata_link  * link ,  unsigned  int  * classes )  
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-05-19 01:15:08 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u32  serror ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DPRINTK ( " ENTER \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-05-19 01:15:08 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* reset complete, clear SError */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! sata_scr_read ( link ,  SCR_ERROR ,  & serror ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sata_scr_write ( link ,  SCR_ERROR ,  serror ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* print link status */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									sata_print_link_status ( link ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-24 17:05:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DPRINTK ( " EXIT \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_dev_same_device  -  Determine  whether  new  ID  matches  configured  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  device  to  compare  against 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ new_class :  class  of  the  new  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ new_id :  IDENTIFY  page  of  the  new  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Compare  @ new_class  and  @ new_id  against  @ dev  and  determine 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	whether  @ dev  is  the  device  indicated  by  @ new_class  and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ new_id . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	1  if  @ dev  matches  @ new_class  and  @ new_id ,  0  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_dev_same_device ( struct  ata_device  * dev ,  unsigned  int  new_class ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											       const  u16  * new_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  u16  * old_id  =  dev - > id ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-02 20:18:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  char  model [ 2 ] [ ATA_ID_PROD_LEN  +  1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  char  serial [ 2 ] [ ATA_ID_SERNO_LEN  +  1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( dev - > class  ! =  new_class )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_info ( dev ,  " class mismatch %d != %d \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     dev - > class ,  new_class ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-01-02 20:18:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_id_c_string ( old_id ,  model [ 0 ] ,  ATA_ID_PROD ,  sizeof ( model [ 0 ] ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_id_c_string ( new_id ,  model [ 1 ] ,  ATA_ID_PROD ,  sizeof ( model [ 1 ] ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_id_c_string ( old_id ,  serial [ 0 ] ,  ATA_ID_SERNO ,  sizeof ( serial [ 0 ] ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_id_c_string ( new_id ,  serial [ 1 ] ,  ATA_ID_SERNO ,  sizeof ( serial [ 1 ] ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( strcmp ( model [ 0 ] ,  model [ 1 ] ) )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_info ( dev ,  " model number mismatch '%s' != '%s' \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     model [ 0 ] ,  model [ 1 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( strcmp ( serial [ 0 ] ,  serial [ 1 ] ) )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_info ( dev ,  " serial number mismatch '%s' != '%s' \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     serial [ 0 ] ,  serial [ 1 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2007-05-15 03:28:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_dev_reread_id  -  Re - read  IDENTIFY  data 
							 
						 
					
						
							
								
									
										
										
										
											2007-06-19 10:10:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ dev :  target  ATA  device 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-10 18:08:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ readid_flags :  read  ID  flags 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Re - read  IDENTIFY  page  and  make  sure  @ dev  is  still  attached  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	the  port . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  negative  errno  otherwise 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-15 03:28:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_dev_reread_id ( struct  ata_device  * dev ,  unsigned  int  readid_flags )  
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-04-02 18:51:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  class  =  dev - > class ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u16  * id  =  ( void  * ) dev - > link - > ap - > sector_buf ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* read ID data */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-10 18:08:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  ata_dev_read_id ( dev ,  & class ,  readid_flags ,  id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-15 03:28:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* is the device still there? */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-15 03:28:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! ata_dev_same_device ( dev ,  class ,  id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - ENODEV ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memcpy ( dev - > id ,  id ,  sizeof ( id [ 0 ] )  *  ATA_ID_WORDS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-15 03:28:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_dev_revalidate  -  Revalidate  ATA  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  device  to  revalidate 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ new_class :  new  class  code 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-15 03:28:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ readid_flags :  read  ID  flags 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Re - read  IDENTIFY  page ,  make  sure  @ dev  is  still  attached  to  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	port  and  reconfigure  it  according  to  the  new  IDENTIFY  page . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  negative  errno  otherwise 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_dev_revalidate ( struct  ata_device  * dev ,  unsigned  int  new_class ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										       unsigned  int  readid_flags ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-15 03:28:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-05-15 03:28:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u64  n_sectors  =  dev - > n_sectors ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-15 17:11:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u64  n_native_sectors  =  dev - > n_native_sectors ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-15 03:28:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ata_dev_enabled ( dev ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - ENODEV ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* fail early if !ATA && !ATAPI to avoid issuing [P]IDENTIFY to PMP */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ata_class_enabled ( new_class )  & & 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-26 16:33:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									    new_class  ! =  ATA_DEV_ATA  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    new_class  ! =  ATA_DEV_ATAPI  & & 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 13:08:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									    new_class  ! =  ATA_DEV_ZAC  & & 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-26 16:33:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									    new_class  ! =  ATA_DEV_SEMB )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_info ( dev ,  " class mismatch %u != %u \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     dev - > class ,  new_class ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  - ENODEV ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-05-15 03:28:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* re-read ID */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  ata_dev_reread_id ( dev ,  readid_flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  fail ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* configure device according to the new ID */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-01 18:38:52 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  ata_dev_configure ( dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-15 03:28:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* verify n_sectors hasn't changed */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-05 10:33:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dev - > class  ! =  ATA_DEV_ATA  | |  ! n_sectors  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    dev - > n_sectors  = =  n_sectors ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* n_sectors has changed */ 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_dev_warn ( dev ,  " n_sectors mismatch %llu != %llu \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										     ( unsigned  long  long ) n_sectors , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										     ( unsigned  long  long ) dev - > n_sectors ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-05 10:33:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Something  could  have  caused  HPA  to  be  unlocked 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  involuntarily .   If  n_native_sectors  hasn ' t  changed  and  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  new  size  matches  it ,  keep  the  device . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( dev - > n_native_sectors  = =  n_native_sectors  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    dev - > n_sectors  >  n_sectors  & &  dev - > n_sectors  = =  n_native_sectors )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     " new n_sectors matches native, probably  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     " late HPA unlock, n_sectors updated \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-15 20:09:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* use the larger n_sectors */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-05 10:33:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-15 03:28:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-05 10:33:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Some  BIOSes  boot  w / o  HPA  but  resume  w /  HPA  locked .   Try 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  unlocking  HPA  in  those  cases . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  https : //bugzilla.kernel.org/show_bug.cgi?id=15396
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( dev - > n_native_sectors  = =  n_native_sectors  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    dev - > n_sectors  <  n_sectors  & &  n_sectors  = =  n_native_sectors  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    ! ( dev - > horkage  &  ATA_HORKAGE_BROKEN_HPA ) )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     " old n_sectors matches native, probably  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     " late HPA lock, will try to unlock HPA \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-05 10:33:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* try unlocking HPA */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > flags  | =  ATA_DFLAG_UNLOCK_HPA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  - EIO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  - ENODEV ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-05 10:33:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* restore original n_[native_]sectors and fail */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev - > n_native_sectors  =  n_native_sectors ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev - > n_sectors  =  n_sectors ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 fail : 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_dev_err ( dev ,  " revalidation failed (errno=%d) \n " ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 17:55:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  ata_blacklist_entry  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  char  * model_num ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  char  * model_rev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  horkage ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  struct  ata_blacklist_entry  ata_device_blacklist  [ ]  =  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Devices with DMA related problems under Linux */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC AC11000H " , 	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC AC22100H " , 	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC AC32500H " , 	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC AC33100H " , 	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC AC31600H " , 	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC AC32100H " , 	" 24.09P07 " , 	ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC AC23200L " , 	" 21.10N21 " , 	ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " Compaq CRD-8241B " ,  	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " CRD-8400B " , 		NULL ,  		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-01 18:18:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " CRD-848[02]B " , 	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " CRD-84 " , 		NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " SanDisk SDP3B " , 	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " SanDisk SDP3B-64 " , 	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " SANYO CD-ROM CRD " , 	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " HITACHI CDR-8 " , 	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-01 18:18:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " HITACHI CDR-8[34]35 " , NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " Toshiba CD-ROM XM-6202B " ,  NULL , 	ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " TOSHIBA CD-ROM XM-1702BC " ,  NULL , 	ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " CD-532E-A " ,  		NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " E-IDE CD-ROM CR-840 " , NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " CD-ROM Drive/F5A " , 	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WPI CDD-820 " ,  	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " SAMSUNG CD-ROM SC-148C " ,  NULL , 	ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " SAMSUNG CD-ROM SC " , 	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " ATAPI CD-ROM DRIVE 40X MAXIMUM " , NULL , ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " _NEC DV5800A " ,  	NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-19 06:42:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " SAMSUNG CD-ROM SN-124 " ,  " N001 " , 	ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-21 14:31:03 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " Seagate STT20000A " ,  NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-23 15:11:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  "  2GB ATA Flash Disk " ,  " ADMA428M " , 	ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-11 14:55:45 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " VRFDFC22048UCHC-TE* " ,  NULL , 		ATA_HORKAGE_NODMA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Odd clown on sil3726/4726 PMPs */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-19 01:15:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " Config  Disk " , 	NULL , 		ATA_HORKAGE_DISABLE  } , 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-02 11:34:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Weird ATAPI devices */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-06-27 02:49:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " TORiSAN DVD-ROM DRD-N216 " ,  NULL , 	ATA_HORKAGE_MAX_SEC_128  } , 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 19:01:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " QUANTUM DAT    DAT72-000 " ,  NULL , 	ATA_HORKAGE_ATAPI_MOD16_DMA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-18 10:30:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " Slimtype DVD A  DS8A8SH " ,  NULL , 	ATA_HORKAGE_MAX_SEC_LBA48  } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-28 16:08:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " Slimtype DVD A  DS8A9SH " ,  NULL , 	ATA_HORKAGE_MAX_SEC_LBA48  } , 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-02 11:34:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-13 11:48:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Causes  silent  data  corruption  with  higher  max  sects . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  http : //lkml.kernel.org/g/x49wpy40ysk.fsf@segfault.boston.devel.redhat.com
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " ST380013AS " , 		" 3.20 " , 		ATA_HORKAGE_MAX_SEC_1024  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Devices we expect to fail diagnostics */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Devices where NCQ should be avoided */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* NCQ is slow */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-19 06:42:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " WDC WD740ADFD-00 " , 	NULL , 		ATA_HORKAGE_NONCQ  } , 
							 
						 
					
						
							
								
									
										
										
										
											2007-12-07 12:46:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " WDC WD740ADFD-00NLR1 " ,  NULL , 		ATA_HORKAGE_NONCQ ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-28 15:21:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* http://thread.gmane.org/gmane.linux.ide/14907 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " FUJITSU MHT2060BH " , 	NULL , 		ATA_HORKAGE_NONCQ  } , 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-26 21:43:44 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* NCQ is broken */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-20 16:31:47 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " Maxtor * " , 		" BANC* " , 	ATA_HORKAGE_NONCQ  } , 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-20 15:22:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " Maxtor 7V300F0 " , 	" VA111630 " , 	ATA_HORKAGE_NONCQ  } , 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-04 11:06:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " ST380817AS " , 		" 3.42 " , 		ATA_HORKAGE_NONCQ  } , 
							 
						 
					
						
							
								
									
										
										
										
											2007-12-09 19:45:39 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " ST3160023AS " , 	" 3.42 " , 		ATA_HORKAGE_NONCQ  } , 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-22 11:35:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " OCZ CORE_SSD " , 	" 02.10104 " , 	ATA_HORKAGE_NONCQ  } , 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-20 16:31:47 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-27 13:36:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Seagate NCQ + FLUSH CACHE firmware bug */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-05 18:53:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " ST31500341AS " , 	" SD1[5-9] " , 	ATA_HORKAGE_NONCQ  | 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-27 13:36:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														ATA_HORKAGE_FIRMWARE_WARN  } , 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-11 13:42:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-05 18:53:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " ST31000333AS " , 	" SD1[5-9] " , 	ATA_HORKAGE_NONCQ  | 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-11 13:42:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														ATA_HORKAGE_FIRMWARE_WARN  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-05 18:53:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " ST3640[36]23AS " , 	" SD1[5-9] " , 	ATA_HORKAGE_NONCQ  | 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-11 13:42:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														ATA_HORKAGE_FIRMWARE_WARN  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-05 18:53:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " ST3320[68]13AS " , 	" SD1[5-9] " , 	ATA_HORKAGE_NONCQ  | 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-27 13:36:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														ATA_HORKAGE_FIRMWARE_WARN  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-01 13:48:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* drives which fail FPDMA_AA activation (some may freeze afterwards) */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 19:00:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " ST1000LM024 HN-M101MBB " ,  " 2AR10001 " , 	ATA_HORKAGE_BROKEN_FPDMA_AA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-07 16:34:29 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " ST1000LM024 HN-M101MBB " ,  " 2BA30001 " , 	ATA_HORKAGE_BROKEN_FPDMA_AA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-01 13:48:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " VB0250EAVER " , 	" HPG7 " , 		ATA_HORKAGE_BROKEN_FPDMA_AA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 19:00:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-02 22:05:29 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Blacklist entries taken from Silicon Image 3124/3132
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   Windows  driver  . inf  file  -  also  several  Linux  problem  reports  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " HTS541060G9SA00 " ,     " MB3OC60D " ,      ATA_HORKAGE_NONCQ ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " HTS541080G9SA00 " ,     " MB4OC60D " ,      ATA_HORKAGE_NONCQ ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " HTS541010G9SA00 " ,     " MBZOC60D " ,      ATA_HORKAGE_NONCQ ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-05 10:51:26 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* https://bugzilla.kernel.org/show_bug.cgi?id=15573 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " C300-CTFDDAC128MAG " , 	" 0001 " , 		ATA_HORKAGE_NONCQ ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-29 11:58:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* devices which puke on READ_NATIVE_MAX */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " HDS724040KLSA80 " , 	" KFAOA20N " , 	ATA_HORKAGE_BROKEN_HPA ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC WD3200JD-00KLB0 " ,  " WD-WCAMR1130137 " ,  ATA_HORKAGE_BROKEN_HPA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC WD2500JD-00HBB0 " ,  " WD-WMAL71490727 " ,  ATA_HORKAGE_BROKEN_HPA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " MAXTOR 6L080L4 " , 	" A93.0500 " , 	ATA_HORKAGE_BROKEN_HPA  } , 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-08-07 01:59:15 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* this one allows HPA unlocking but fails IOs on the area */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " OCZ-VERTEX " , 		    " 1.30 " , 	ATA_HORKAGE_BROKEN_HPA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-29 04:06:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Devices which report 1 sector over size HPA */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " ST340823A " , 		NULL , 		ATA_HORKAGE_HPA_SIZE ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " ST320413A " , 		NULL , 		ATA_HORKAGE_HPA_SIZE ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-19 01:41:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " ST310211A " , 		NULL , 		ATA_HORKAGE_HPA_SIZE ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-29 04:06:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-05 22:58:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Devices which get the IVB wrong */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " QUANTUM FIREBALLlct10 05 " ,  " A03.0900 " ,  ATA_HORKAGE_IVB ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-29 14:08:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Maybe we should just blacklist TSSTcorp... */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-01 18:18:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " TSSTcorp CDDVDW SH-S202[HJN] " ,  " SB0[01] " ,   ATA_HORKAGE_IVB ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-05 22:58:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-08-27 15:23:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Devices that do not need bridging limits applied */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " MTRON MSP-SATA* " , 		NULL , 	ATA_HORKAGE_BRIDGE_OK ,  } , 
							 
						 
					
						
							
								
									
										
										
											
												[libata] new quirk, lift bridge limits for Buffalo DriveStation Quattro
Michael Eitelwein writes:
I have an external SATA drive that was slowed down by bridge limits. I
found a solution in a thread on this list posted in 2008: It introduces
whitelist entries in libata-core.c for devices with well working bridges
(e.g. email on Fri, 31 Oct 2008 01:45:27 -0400).
I added my device to this whitelist in a custom built kernel and it
works fine for weeks now. How can I have this device added on the
whitelist within the official kernel? Is this whitelist mechanism still
supported or is there a smarter way to achieve whitelisting?
I added the following whitelist entry for my Buffalo DriveStation
Quattro "BUFFALO HD-QSU2/R5":
        /* Devices that do not need bridging limits applied */
        { "MTRON MSP-SATA*",            NULL,   ATA_HORKAGE_BRIDGE_OK, },
        { "BUFFALO HD-QSU2/R5",         NULL,   ATA_HORKAGE_BRIDGE_OK, },
Reported-by: Michael Eitelwein <michael@eitelwein.net>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2012-08-17 13:36:59 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " BUFFALO HD-QSU2/R5 " , 		NULL , 	ATA_HORKAGE_BRIDGE_OK ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2008-08-27 15:23:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Devices which aren't very happy with higher link speeds */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WD My Book " , 			NULL , 	ATA_HORKAGE_1_5_GBPS ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-07-23 12:22:37 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " Seagate FreeAgent GoFlex " , 	NULL , 	ATA_HORKAGE_1_5_GBPS ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-07-09 09:27:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Devices  which  choke  on  SETXFER .   Applies  only  if  both  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  device  and  controller  are  SATA . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-22 12:13:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " PIONEER DVD-RW  DVRTD08 " , 	NULL , 	ATA_HORKAGE_NOSETXFER  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-08 13:50:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " PIONEER DVD-RW  DVRTD08A " , 	NULL , 	ATA_HORKAGE_NOSETXFER  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " PIONEER DVD-RW  DVR-215 " , 	NULL , 	ATA_HORKAGE_NOSETXFER  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-22 12:13:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " PIONEER DVD-RW  DVR-212D " , 	NULL , 	ATA_HORKAGE_NOSETXFER  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " PIONEER DVD-RW  DVR-216D " , 	NULL , 	ATA_HORKAGE_NOSETXFER  } , 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-09 09:27:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 18:15:53 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* devices that don't properly handle queued TRIM commands */ 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-18 14:50:18 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " Micron_M500_* " , 		NULL , 	ATA_HORKAGE_NO_NCQ_TRIM  | 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 15:17:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " Crucial_CT*M500* " , 		NULL , 	ATA_HORKAGE_NO_NCQ_TRIM  | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-15 21:03:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " Micron_M5[15]0_* " , 		" MU01 " , 	ATA_HORKAGE_NO_NCQ_TRIM  | 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 15:17:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " Crucial_CT*M550* " , 		" MU01 " , 	ATA_HORKAGE_NO_NCQ_TRIM  | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " Crucial_CT*MX100* " , 		" MU01 " , 	ATA_HORKAGE_NO_NCQ_TRIM  | 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 10:34:27 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-04 12:20:29 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " Samsung SSD 8* " , 		NULL , 	ATA_HORKAGE_NO_NCQ_TRIM  | 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 15:17:21 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-25 23:29:13 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " FCCT*M500* " , 			NULL , 	ATA_HORKAGE_NO_NCQ_TRIM  | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 10:34:27 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-15 13:54:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* devices that don't properly handle TRIM commands */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " SuperSSpeed S238* " , 		NULL , 	ATA_HORKAGE_NOTRIM ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 10:34:27 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  As  defined ,  the  DRAT  ( Deterministic  Read  After  Trim )  and  RZAT 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  ( Return  Zero  After  Trim )  flags  in  the  ATA  Command  Set  are 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  unreliable  in  the  sense  that  they  only  define  what  happens  if 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  the  device  successfully  executed  the  DSM  TRIM  command .  TRIM 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  is  only  advisory ,  however ,  and  the  device  is  free  to  silently 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  ignore  all  or  parts  of  the  request . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Whitelist  drives  that  are  known  to  reliably  return  zeroes 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  after  TRIM . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  The  intel  510  drive  has  buggy  DRAT / RZAT .  Explicitly  exclude 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  that  model  before  whitelisting  all  other  intel  SSDs . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " INTEL*SSDSC2MH* " , 		NULL , 	0 ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 15:17:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " Micron* " , 			NULL , 	ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " Crucial* " , 			NULL , 	ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-08 10:34:27 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  " INTEL*SSD* " ,  		NULL , 	ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " SSD*INTEL* " , 			NULL , 	ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " Samsung*SSD* " , 		NULL , 	ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " SAMSUNG*SSD* " , 		NULL , 	ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " ST[1248][0248]0[FH]* " , 	NULL , 	ATA_HORKAGE_ZERO_AFTER_TRIM ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 18:15:53 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-16 09:47:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Some  WD  SATA - I  drives  spin  up  and  down  erratically  when  the  link 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  is  put  into  the  slumber  mode .   We  don ' t  have  full  list  of  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  affected  devices .   Disable  LPM  if  the  device  matches  one  of  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  known  prefixes  and  is  SATA - 1.   As  a  side  effect  LPM  partial  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  lost  too . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  https : //bugzilla.kernel.org/show_bug.cgi?id=57211
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC WD800JD-* " , 		NULL , 	ATA_HORKAGE_WD_BROKEN_LPM  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC WD1200JD-* " , 		NULL , 	ATA_HORKAGE_WD_BROKEN_LPM  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC WD1600JD-* " , 		NULL , 	ATA_HORKAGE_WD_BROKEN_LPM  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC WD2000JD-* " , 		NULL , 	ATA_HORKAGE_WD_BROKEN_LPM  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC WD2500JD-* " , 		NULL , 	ATA_HORKAGE_WD_BROKEN_LPM  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC WD3000JD-* " , 		NULL , 	ATA_HORKAGE_WD_BROKEN_LPM  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  " WDC WD3200JD-* " , 		NULL , 	ATA_HORKAGE_WD_BROKEN_LPM  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* End Marker */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  } 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
									
										
										
										
											2006-03-24 09:56:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-07-05 13:31:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  unsigned  long  ata_dev_blacklisted ( const  struct  ata_device  * dev )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-01-02 20:19:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  char  model_num [ ATA_ID_PROD_LEN  +  1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  char  model_rev [ ATA_ID_FW_REV_LEN  +  1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  struct  ata_blacklist_entry  * ad  =  ata_device_blacklist ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-22 13:00:25 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-01-02 20:19:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_id_c_string ( dev - > id ,  model_num ,  ATA_ID_PROD ,  sizeof ( model_num ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_id_c_string ( dev - > id ,  model_rev ,  ATA_ID_FW_REV ,  sizeof ( model_rev ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									while  ( ad - > model_num )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: Un-break ATA blacklist
lib/glob.c provides a new glob_match() function, with arguments in
(pattern, string) order.  It replaced a private function with arguments
in (string, pattern) order, but I didn't swap the call site...
The result was the entire ATA blacklist was effectively disabled.
The lesson for today is "I f***ed up *how* badly *how* many months ago?",
er, I mean "Nobody Tests RC Kernels On Legacy Hardware".
This was not a subtle break, but it made it through an entire RC
cycle unreported, presumably because all the people doing testing
have full-featured hardware.
(FWIW, the reason for the argument swap was because fnmatch() does it that
way, and for a while implementing a full fnmatch() was being considered.)
Fixes: 428ac5fc056e0 (libata: Use glob_match from lib/glob.c)
Reported-by: Steven Honeyman <stevenhoneyman@gmail.com>
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=71371#c21
Signed-off-by: George Spelvin <linux@horizon.com>
Cc: <stable@vger.kernel.org> # 3.17
Tested-by: Steven Honeyman <stevenhoneyman@gmail.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-10-07 07:26:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( glob_match ( ad - > model_num ,  model_num ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ad - > model_rev  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  ad - > horkage ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: Un-break ATA blacklist
lib/glob.c provides a new glob_match() function, with arguments in
(pattern, string) order.  It replaced a private function with arguments
in (string, pattern) order, but I didn't swap the call site...
The result was the entire ATA blacklist was effectively disabled.
The lesson for today is "I f***ed up *how* badly *how* many months ago?",
er, I mean "Nobody Tests RC Kernels On Legacy Hardware".
This was not a subtle break, but it made it through an entire RC
cycle unreported, presumably because all the people doing testing
have full-featured hardware.
(FWIW, the reason for the argument swap was because fnmatch() does it that
way, and for a while implementing a full fnmatch() was being considered.)
Fixes: 428ac5fc056e0 (libata: Use glob_match from lib/glob.c)
Reported-by: Steven Honeyman <stevenhoneyman@gmail.com>
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=71371#c21
Signed-off-by: George Spelvin <linux@horizon.com>
Cc: <stable@vger.kernel.org> # 3.17
Tested-by: Steven Honeyman <stevenhoneyman@gmail.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-10-07 07:26:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( glob_match ( ad - > model_rev ,  model_rev ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  ad - > horkage ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-22 15:54:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ad + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-22 15:54:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_dma_blacklisted ( const  struct  ata_device  * dev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* We don't support polling DMA.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  DMA  blacklist  those  ATAPI  devices  with  CDB - intr  ( and  use  PIO ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  if  the  LLDD  handles  only  interrupts  in  the  HSM_ST_LAST  state . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( dev - > link - > ap - > flags  &  ATA_FLAG_PIO_POLLING )  & & 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									    ( dev - > flags  &  ATA_DFLAG_CDB_INTR ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-05 13:31:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ( dev - > horkage  &  ATA_HORKAGE_NODMA )  ?  1  :  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-27 19:08:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-05 22:58:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_is_40wire 		- 	check  drive  side  detection 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Perform  drive  side  detection  decoding ,  allowing  for  device  vendors 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	who  can ' t  follow  the  documentation . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  ata_is_40wire ( struct  ata_device  * dev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( dev - > horkage  &  ATA_HORKAGE_IVB ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ata_drive_40wire_relaxed ( dev - > id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ata_drive_40wire ( dev - > id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-03-28 14:33:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	cable_is_40wire 		- 	40 / 80 / SATA  decider 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ap :  port  to  consider 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	This  function  encapsulates  the  policy  for  speed  management 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	in  one  place .  At  the  moment  we  don ' t  cache  the  result  but 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	there  is  a  good  case  for  setting  ap - > cbl  to  the  result  when 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	we  are  called  with  unknown  cables  ( and  figuring  out  if  it 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	impacts  hotplug  at  all ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Return  1  if  the  cable  appears  to  be  40  wire . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  cable_is_40wire ( struct  ata_port  * ap )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_link  * link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_device  * dev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-10-27 19:59:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* If the controller thinks we are 40 wire, we are. */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-03-28 14:33:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > cbl  = =  ATA_CBL_PATA40 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-27 19:59:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* If the controller thinks we are 80 wire, we are. */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-03-28 14:33:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > cbl  = =  ATA_CBL_PATA80  | |  ap - > cbl  = =  ATA_CBL_SATA ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-27 19:59:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* If the system is known to be 40 wire short cable (eg
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  laptop ) ,  then  we  allow  80  wire  modes  even  if  the  drive 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  isn ' t  sure . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-08 16:37:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > cbl  = =  ATA_CBL_PATA40_SHORT ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-27 19:59:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* If the controller doesn't know, we scan.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Note :  We  look  for  all  40  wire  detects  at  this  point .   Any 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *        80  wire  detect  is  taken  to  be  80  wire  cable  because 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  -  in  many  setups  only  the  one  drive  ( slave  if  present )  will 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *    give  a  valid  detect 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  -  if  you  have  a  non  detect  capable  drive  you  don ' t  want  it 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *    to  colour  the  choice 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_for_each_link ( link ,  ap ,  EDGE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_for_each_dev ( dev ,  link ,  ENABLED )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! ata_is_40wire ( dev ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-03-28 14:33:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_dev_xfermask  -  Compute  supported  xfermask  of  the  given  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  Device  to  compute  xfermask  for 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 14:07:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Compute  supported  xfermask  of  @ dev  and  store  it  in 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	dev - > * _mask .   This  function  is  responsible  for  applying  all 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	known  limits  including  host  controller  limits ,  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	blacklist ,  etc . . . 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  ata_dev_xfermask ( struct  ata_device  * dev )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_link  * link  =  dev - > link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  link - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_host  * host  =  ap - > host ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  xfer_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 16:59:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* controller modes available */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									xfer_mask  =  ata_pack_xfermask ( ap - > pio_mask , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      ap - > mwdma_mask ,  ap - > udma_mask ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:51 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* drive modes available */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 16:59:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									xfer_mask  & =  ata_pack_xfermask ( dev - > pio_mask , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												       dev - > mwdma_mask ,  dev - > udma_mask ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									xfer_mask  & =  ata_id_xfermask ( dev - > id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 18:52:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 	CFA  Advanced  TrueIDE  timings  are  not  allowed  on  a  shared 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 	cable 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ata_dev_pair ( dev ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* No PIO5 or PIO6 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										xfer_mask  & =  ~ ( 0x03  < <  ( ATA_SHIFT_PIO  +  5 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* No MWDMA3 or MWDMA 4 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										xfer_mask  & =  ~ ( 0x03  < <  ( ATA_SHIFT_MWDMA  +  3 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 16:59:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_dma_blacklisted ( dev ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										xfer_mask  & =  ~ ( ATA_MASK_MWDMA  |  ATA_MASK_UDMA ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     " device is on DMA blacklist, disabling DMA \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 16:59:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-06 04:31:57 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												Fix simplex adapters with libata
Recently I got my hands on nVidia's MCP61 PM-AM board, and
it contains IDE chip configured by BIOS with only primary
channel enabled.  This confuses code which probes for
device DMA capabilities - it gets 0x60 (happy duplex
device) from primary channel BMDMA, but 0xFF (nobody here)
from secondary channel BMDMA.  Due to this code then believes
that chip is simplex.  I do not address this problem in
my patch, as I'm not sure how to handle this.  Probably
ata_pci_init_one should have bitmap of enabled/possible
interfaces instead of their count, but it looks like
quite intrusive change, and maybe we do not care - for device
with only one channel simplex and regular DMA engines are
same.
But making device simplex pointed out that support for
DMA on simplex devices is currently broken - ata_dev_xfermask
tests whether device is simplex and if it is whether DMA
engine was assigned to this port.  If not then it strips
out DMA bits from device.  Problem is that code which assigns
DMA engine to port in ata_set_mode first detect device
mode and assigns DMA engine to channel only if some DMA
capable device was found.
And as xfermask stripped out DMA bits, host->simplex_claimed
is always NULL with current implementation.
By allowing DMA either if simplex_claimed is NULL or if it
points to current port DMA can be finally used - it gets
assigned to first port which contains any DMA capable
device.
Before:
pata_amd 0000:00:06.0: version 0.2.8
PCI: Setting latency timer of device 0000:00:06.0 to 64
ata5: PATA max UDMA/133 cmd 0x000101f0 ctl 0x000103f6 bmdma 0x0001f000 irq 14
ata6: PATA max UDMA/133 cmd 0x00010170 ctl 0x00010376 bmdma 0x0001f008 irq 15
scsi4 : pata_amd
ata5.00: ATAPI, max UDMA/66
ata5.00: simplex DMA is claimed by other device, disabling DMA
ata5.00: configured for PIO4
scsi5 : pata_amd
ata6: port disabled. ignoring.
ata6: reset failed, giving up
scsi 4:0:0:0: CD-ROM            ATAPI    DVD W  DH16W1P   LG12 PQ: 0 ANSI: 5
After:
pata_amd 0000:00:06.0: version 0.2.8
PCI: Setting latency timer of device 0000:00:06.0 to 64
ata5: PATA max UDMA/133 cmd 0x000101f0 ctl 0x000103f6 bmdma 0x0001f000 irq 14
ata6: PATA max UDMA/133 cmd 0x00010170 ctl 0x00010376 bmdma 0x0001f008 irq 15
scsi4 : pata_amd
ata5.00: ATAPI, max UDMA/66
ata5.00: configured for UDMA/33
scsi5 : pata_amd
ata6: port disabled. ignoring.
ata6: reset failed, giving up
scsi 4:0:0:0: CD-ROM            ATAPI    DVD W  DH16W1P   LG12 PQ: 0 ANSI: 5
Signed-off-by: Petr Vandrovec <petr@vandrovec.name>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2007-03-08 10:12:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( host - > flags  &  ATA_HOST_SIMPLEX )  & & 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-19 06:42:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									    host - > simplex_claimed  & &  host - > simplex_claimed  ! =  ap )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 16:59:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										xfer_mask  & =  ~ ( ATA_MASK_MWDMA  |  ATA_MASK_UDMA ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     " simplex DMA is claimed by other device, disabling DMA \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-27 18:58:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-03-09 09:56:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > flags  &  ATA_FLAG_NO_IORDY ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										xfer_mask  & =  ata_pio_mask_no_iordy ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-27 18:58:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > ops - > mode_filter ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-09 09:34:07 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										xfer_mask  =  ap - > ops - > mode_filter ( dev ,  xfer_mask ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-27 18:58:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:51 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Apply cable rule here.  Don't apply it early because when
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  we  handle  hot  plug  the  cable  type  can  itself  change . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Check  this  last  so  that  we  know  if  the  transfer  rate  was 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  solely  limited  by  the  cable . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Unknown  or  80  wire  cables  reported  host  side  are  checked 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  drive  side  as  well .  Cases  where  we  know  a  40 wire  cable 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  is  used  safely  for  80  are  not  checked  here . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( xfer_mask  &  ( 0xF8  < <  ATA_SHIFT_UDMA ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* UDMA/44 or higher would be available */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-03-28 14:33:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cable_is_40wire ( ap ) )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_dev_warn ( dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												     " limited to UDMA/33 due to 40-wire cable \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:51 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											xfer_mask  & =  ~ ( 0xF8  < <  ATA_SHIFT_UDMA ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-02 17:54:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_unpack_xfermask ( xfer_mask ,  & dev - > pio_mask , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    & dev - > mwdma_mask ,  & dev - > udma_mask ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_dev_set_xfermode  -  Issue  SET  FEATURES  -  XFER  MODE  command 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  Device  to  which  command  will  be  sent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-30 15:41:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Issue  SET  FEATURES  -  XFER  MODE  command  to  device  @ dev 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	on  port  @ ap . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-30 19:49:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	PCI / etc .  bus  probe  sem . 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 15:25:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  AC_ERR_ *  mask  otherwise . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  unsigned  int  ata_dev_set_xfermode ( struct  ata_device  * dev )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:49:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_taskfile  tf ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 15:25:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  err_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* set up set-features taskfile */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DPRINTK ( " set features - xfer mode \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-05-27 15:10:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Some controllers and ATAPI devices show flaky interrupt
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  behavior  after  setting  xfer  mode .   Use  polling  instead . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_tf_init ( dev ,  & tf ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:49:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tf . command  =  ATA_CMD_SET_FEATURES ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . feature  =  SETFEATURES_XFER ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-05-27 15:10:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tf . flags  | =  ATA_TFLAG_ISADDR  |  ATA_TFLAG_DEVICE  |  ATA_TFLAG_POLLING ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:49:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tf . protocol  =  ATA_PROT_NODATA ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-19 14:33:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* If we are using IORDY we must send the mode setting command */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-23 21:12:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_pio_need_iordy ( dev ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tf . nsect  =  dev - > xfer_mode ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-19 14:33:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* If the device has IORDY and the controller does not - turn it off */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 	else  if  ( ata_id_has_iordy ( dev - > id ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-23 21:12:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tf . nsect  =  0x01 ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-19 14:33:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else  /* In the ancient relic department - skip all of this */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-08 13:06:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* On some disks, this command causes spin-up, so we need longer timeout */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									err_mask  =  ata_exec_internal ( dev ,  & tf ,  NULL ,  DMA_NONE ,  NULL ,  0 ,  15000 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-15 03:57:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DPRINTK ( " EXIT, err_mask=%x \n " ,  err_mask ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  err_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:50:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-15 03:57:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2007-10-25 00:33:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_dev_set_feature  -  Issue  SET  FEATURES  -  SATA  FEATURES 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-15 03:57:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ dev :  Device  to  which  command  will  be  sent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ enable :  Whether  to  enable  or  disable  the  feature 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 00:33:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ feature :  The  sector  count  represents  the  feature  to  set 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-15 03:57:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Issue  SET  FEATURES  -  SATA  FEATURES  command  to  device  @ dev 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 00:33:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	on  port  @ ap  with  sector  count 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-15 03:57:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	PCI / etc .  bus  probe  sem . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  AC_ERR_ *  mask  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:50:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								unsigned  int  ata_dev_set_feature ( struct  ata_device  * dev ,  u8  enable ,  u8  feature )  
						 
					
						
							
								
									
										
										
										
											2007-08-15 03:57:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_taskfile  tf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  int  err_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* set up set-features taskfile */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DPRINTK ( " set features - SATA features \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_tf_init ( dev ,  & tf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . command  =  ATA_CMD_SET_FEATURES ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . feature  =  enable ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . flags  | =  ATA_TFLAG_ISADDR  |  ATA_TFLAG_DEVICE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . protocol  =  ATA_PROT_NODATA ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 00:33:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tf . nsect  =  feature ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-15 03:57:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-09 15:05:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err_mask  =  ata_exec_internal ( dev ,  & tf ,  NULL ,  DMA_NONE ,  NULL ,  0 ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-24 15:25:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DPRINTK ( " EXIT, err_mask=%x \n " ,  err_mask ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  err_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2012-09-13 01:12:29 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_dev_set_feature ) ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_dev_init_params  -  Issue  INIT  DEV  PARAMS  command 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  Device  to  which  command  will  be  sent 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-18 10:50:18 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ heads :  Number  of  heads  ( taskfile  parameter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ sectors :  Number  of  sectors  ( taskfile  parameter ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-15 18:24:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  AC_ERR_ *  mask  otherwise . 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  unsigned  int  ata_dev_init_params ( struct  ata_device  * dev ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													u16  heads ,  u16  sectors ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:49:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_taskfile  tf ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-02-15 18:24:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  err_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Number of sectors per track 1-255. Number of heads 1-16 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( sectors  <  1  | |  sectors  >  255  | |  heads  <  1  | |  heads  >  16 ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-27 16:39:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  AC_ERR_INVALID ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* set up init dev params taskfile */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DPRINTK ( " init dev params  \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_tf_init ( dev ,  & tf ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-12-13 14:49:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tf . command  =  ATA_CMD_INIT_DEV_PARAMS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . flags  | =  ATA_TFLAG_ISADDR  |  ATA_TFLAG_DEVICE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . protocol  =  ATA_PROT_NODATA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . nsect  =  sectors ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tf . device  | =  ( heads  -  1 )  &  0x0f ;  /* max head = num. of heads - 1 */ 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-09 15:05:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err_mask  =  ata_exec_internal ( dev ,  & tf ,  NULL ,  DMA_NONE ,  NULL ,  0 ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-08 14:28:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* A clean abort indicates an original or just out of spec drive
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   and  we  should  continue  as  we  issue  the  setup  based  on  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   drive  reported  working  geometry  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( err_mask  = =  AC_ERR_DEV  & &  ( tf . feature  &  ATA_ABORTED ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err_mask  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-15 18:24:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DPRINTK ( " EXIT, err_mask=%x \n " ,  err_mask ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  err_mask ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-12 15:29:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2005-05-30 19:49:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_sg_clean  -  Unmap  DMA  memory  associated  with  command 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ qc :  Command  containing  DMA  memory  to  be  released 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Unmap  all  mapped  DMA  memory  associated  with  this  command . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	spin_lock_irqsave ( host  lock ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:47:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_sg_clean ( struct  ata_queued_cmd  * qc )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  qc - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-12-05 16:43:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  scatterlist  * sg  =  qc - > sg ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									int  dir  =  qc - > dma_dir ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-01-09 19:19:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									WARN_ON_ONCE ( sg  = =  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-02-19 11:36:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									VPRINTK ( " unmapping %u sg elements \n " ,  qc - > n_elem ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-02-19 11:36:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( qc - > n_elem ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-27 17:35:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dma_unmap_sg ( ap - > dev ,  sg ,  qc - > orig_n_elem ,  dir ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > flags  & =  ~ ATA_QCFLAG_DMAMAP ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-12-05 16:43:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc - > sg  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2008-06-17 12:36:26 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	atapi_check_dma  -  Check  whether  ATAPI  DMA  can  be  supported 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 	@ qc :  Metadata  associated  with  taskfile  to  check 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-30 15:41:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Allow  low - level  driver  to  filter  ATA  PACKET  commands ,  returning 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	a  status  indicating  whether  or  not  it  is  OK  to  use  DMA  for  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	supplied  PACKET  command . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	spin_lock_irqsave ( host  lock ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS :  0  when  ATAPI  DMA  can  be  used 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *                nonzero  otherwise 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-06-17 12:36:26 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  atapi_check_dma ( struct  ata_queued_cmd  * qc )  
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  qc - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-25 18:11:12 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Don't allow DMA if it isn't multiple of 16 bytes.  Quite a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  few  ATAPI  devices  choke  on  such  DMA  requests . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 19:01:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! ( qc - > dev - > horkage  &  ATA_HORKAGE_ATAPI_MOD16_DMA )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    unlikely ( qc - > nbytes  &  15 ) ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-25 17:43:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > ops - > check_atapi_dma ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ap - > ops - > check_atapi_dma ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-25 17:43:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_std_qc_defer  -  Check  whether  a  qc  needs  to  be  deferred 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ qc :  ATA  command  in  question 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Non - NCQ  commands  cannot  run  with  any  other  command ,  NCQ  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	not .   As  upper  layer  only  knows  the  queue  depth ,  we  are 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	responsible  for  maintaining  exclusion .   This  function  checks 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	whether  a  new  command  @ qc  can  be  issued . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	spin_lock_irqsave ( host  lock ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ATA_DEFER_ *  if  deferring  is  needed ,  0  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_std_qc_defer ( struct  ata_queued_cmd  * qc )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_link  * link  =  qc - > dev - > link ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-25 17:43:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( qc - > tf . protocol  = =  ATA_PROT_NCQ )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ata_tag_valid ( link - > active_tag ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ata_tag_valid ( link - > active_tag )  & &  ! link - > sactive ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-25 17:43:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ATA_DEFER_LINK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2006-03-25 17:45:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_noop_qc_prep ( struct  ata_queued_cmd  * qc )  {  }  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_sg_init  -  Associate  command  with  scatter - gather  table . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ qc :  Command  to  be  associated 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ sg :  Scatter - gather  table . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ n_elem :  Number  of  elements  in  s / g  table . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Initialize  the  data - related  elements  of  queued_cmd  @ qc 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	to  point  to  a  scatter - gather  table  @ sg ,  containing  @ n_elem 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	elements . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	spin_lock_irqsave ( host  lock ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  ata_sg_init ( struct  ata_queued_cmd  * qc ,  struct  scatterlist  * sg ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 unsigned  int  n_elem ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > sg  =  sg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > n_elem  =  n_elem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > cursg  =  qc - > sg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2006-03-25 17:48:02 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_sg_setup  -  DMA - map  the  scatter - gather  table  associated  with  a  command . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ qc :  Command  with  scatter - gather  table  to  be  mapped . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	DMA - map  the  scatter - gather  table  associated  with  queued_cmd  @ qc . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	spin_lock_irqsave ( host  lock ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Zero  on  success ,  negative  on  error . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  ata_sg_setup ( struct  ata_queued_cmd  * qc )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  qc - > ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  int  n_elem ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									VPRINTK ( " ENTER, ata%u \n " ,  ap - > print_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-25 17:43:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									n_elem  =  dma_map_sg ( ap - > dev ,  qc - > sg ,  qc - > n_elem ,  qc - > dma_dir ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( n_elem  <  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-25 17:48:02 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DPRINTK ( " %d sg elements mapped \n " ,  n_elem ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-27 17:35:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc - > orig_n_elem  =  qc - > n_elem ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc - > n_elem  =  n_elem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > flags  | =  ATA_QCFLAG_DMAMAP ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	swap_buf_le16  -  swap  halves  of  16 - bit  words  in  place 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ buf :   Buffer  to  swap 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ buf_words :   Number  of  16 - bit  words  in  buffer . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Swap  halves  of  16 - bit  words  if  needed  to  convert  from 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	little - endian  byte  order  to  native  cpu  byte  order ,  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	vice - versa . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  caller . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  swap_buf_le16 ( u16  * buf ,  unsigned  int  buf_words )  
						 
					
						
							
								
									
										
										
										
											2006-03-05 15:29:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef __BIG_ENDIAN 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  int  i ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-05 15:29:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: reorganize SFF related stuff
* Move SFF related functions from libata-core.c to libata-sff.c.
  ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
  ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
  ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
  ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
  sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
  ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
  ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
  atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
  ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
  ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
  ata_interrupt(), ata_std_ports()
* Make ata_pio_queue_task() global as it's now called from
  libata-sff.c.
* Move SFF related stuff in include/linux/libata.h and
  drivers/ata/libata.h into one place.  While at it, move timing
  constants into the global enum definition and fortify comments a
  bit.
This patch strictly moves stuff around and as such doesn't cause any
functional difference.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
											 
										 
										
											2008-03-25 22:16:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  buf_words ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										buf [ i ]  =  le16_to_cpu ( buf [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif  /* __BIG_ENDIAN */ 
  
						 
					
						
							
								
									
										
										
										
											2006-03-05 15:29:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-10 14:48:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2015-01-23 19:52:07 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_qc_new_init  -  Request  an  available  ATA  command ,  and  initialize  it 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  Device  from  whom  we  request  an  available  command  structure 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-09 18:37:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ tag :  tag 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-12 12:08:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-10 14:48:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-23 19:52:07 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  ata_queued_cmd  * ata_qc_new_init ( struct  ata_device  * dev ,  int  tag )  
						 
					
						
							
								
									
										
										
										
											2008-11-10 14:48:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2015-01-23 19:52:07 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  dev - > link - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-15 17:32:27 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_queued_cmd  * qc ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-10 14:48:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* no command while frozen */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( unlikely ( ap - > pflags  &  ATA_PFLAG_FROZEN ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-23 19:52:07 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* libsas case */ 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-12 10:32:18 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > flags  &  ATA_FLAG_SAS_HOST )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-23 19:52:07 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tag  =  ata_sas_allocate_tag ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( tag  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-17 11:48:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-10 14:48:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-23 19:52:07 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc  =  __ata_qc_from_tag ( ap ,  tag ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > tag  =  tag ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > scsicmd  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > ap  =  ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > dev  =  dev ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-23 19:52:07 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_qc_reinit ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  qc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-10 14:48:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_qc_free  -  free  unused  ata_queued_cmd 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ qc :  Command  to  complete 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Designed  to  free  unused  ata_queued_cmd  object 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	in  case  something  prevents  using  it . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	spin_lock_irqsave ( host  lock ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  ata_qc_free ( struct  ata_queued_cmd  * qc )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2009-10-17 08:41:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-10 14:48:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  tag ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-01-09 19:19:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									WARN_ON_ONCE ( qc  = =  NULL ) ;  /* ata_qc_from_tag _might_ return NULL */ 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-17 08:41:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap  =  qc - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-10 14:48:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > flags  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tag  =  qc - > tag ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( likely ( ata_tag_valid ( tag ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										qc - > tag  =  ATA_TAG_POISON ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-12 10:32:18 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ap - > flags  &  ATA_FLAG_SAS_HOST ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-23 19:52:07 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_sas_free_tag ( tag ,  ap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-10 14:48:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-02-11 15:13:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  __ata_qc_complete ( struct  ata_queued_cmd  * qc )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2009-10-17 08:41:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_link  * link ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-01-09 19:19:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									WARN_ON_ONCE ( qc  = =  NULL ) ;  /* ata_qc_from_tag _might_ return NULL */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WARN_ON_ONCE ( ! ( qc - > flags  &  ATA_QCFLAG_ACTIVE ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-17 08:41:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap  =  qc - > ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									link  =  qc - > dev - > link ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( likely ( qc - > flags  &  ATA_QCFLAG_DMAMAP ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_sg_clean ( qc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:32 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* command should be marked inactive atomically with qc completion */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( qc - > tf . protocol  = =  ATA_PROT_NCQ )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										link - > sactive  & =  ~ ( 1  < <  qc - > tag ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! link - > sactive ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ap - > nr_active_links - - ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										link - > active_tag  =  ATA_TAG_POISON ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ap - > nr_active_links - - ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* clear exclusive status */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( unlikely ( qc - > flags  &  ATA_QCFLAG_CLEAR_EXCL  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										     ap - > excl_link  = =  link ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ap - > excl_link  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:32 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-08-16 14:25:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* atapi: mark qc as inactive to prevent the interrupt handler
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  from  completing  the  command  twice  later ,  before  the  error  handler 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  is  called .  ( when  rc  ! =  0  and  atapi  request  sense  is  needed ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > flags  & =  ~ ATA_QCFLAG_ACTIVE ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > qc_active  & =  ~ ( 1  < <  qc - > tag ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-08-16 14:25:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									/* call completion callback */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-23 13:09:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc - > complete_fn ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:37:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  fill_result_tf ( struct  ata_queued_cmd  * qc )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  qc - > ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									qc - > result_tf . flags  =  qc - > tf . flags ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:20 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > ops - > qc_fill_rtf ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:37:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:28:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  ata_verify_xfer ( struct  ata_queued_cmd  * qc )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_device  * dev  =  qc - > dev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ata_is_nodata ( qc - > tf . protocol ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ( dev - > mwdma_mask  | |  dev - > udma_mask )  & &  ata_is_pio ( qc - > tf . protocol ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev - > flags  & =  ~ ATA_DFLAG_DUBIOUS_XFER ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_qc_complete  -  Complete  an  active  ATA  command 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ qc :  Command  to  complete 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-25 15:03:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Indicate  to  the  mid  and  upper  layers  that  an  ATA  command  has 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	completed ,  with  either  an  ok  or  not - ok  status . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Refrain  from  calling  this  function  multiple  times  when 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	successfully  completing  multiple  NCQ  commands . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_qc_complete_multiple ( )  should  be  used  instead ,  which  will 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	properly  update  IRQ  expect  state . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	spin_lock_irqsave ( host  lock ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  ata_qc_complete ( struct  ata_queued_cmd  * qc )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  qc - > ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* XXX: New EH and old EH use different mechanisms to
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  synchronize  EH  with  regular  execution  path . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  In  new  EH ,  a  failed  qc  is  marked  with  ATA_QCFLAG_FAILED . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Normal  execution  path  is  responsible  for  not  accessing  a 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  failed  qc .   libata  core  enforces  the  rule  by  returning  NULL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  from  ata_qc_from_tag ( )  for  failed  qcs . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Old  EH  depends  on  ata_qc_complete ( )  nullifying  completion 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  requests  if  ATA_QCFLAG_EH_SCHEDULED  is  set .   Old  EH  does 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  not  synchronize  with  interrupt  handler .   Only  PIO  task  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  taken  care  of . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ap - > ops - > error_handler )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 18:22:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										struct  ata_device  * dev  =  qc - > dev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  ata_eh_info  * ehi  =  & dev - > link - > eh_info ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( unlikely ( qc - > err_mask ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											qc - > flags  | =  ATA_QCFLAG_FAILED ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-09 15:59:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Finish  internal  commands  without  any  further  processing 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  and  always  with  the  result  TF  filled . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( unlikely ( ata_tag_internal ( qc - > tag ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-16 13:00:51 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											fill_result_tf ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 16:46:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											trace_ata_qc_complete_internal ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-09 15:59:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											__ata_qc_complete ( qc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-16 13:00:51 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-09 15:59:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Non - internal  qc  has  failed .   Fill  the  result  TF  and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  summon  EH . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( unlikely ( qc - > flags  &  ATA_QCFLAG_FAILED ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											fill_result_tf ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 16:46:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											trace_ata_qc_complete_failed ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-09 15:59:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_qc_schedule_eh ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-16 13:00:51 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-09-17 18:45:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										WARN_ON_ONCE ( ap - > pflags  &  ATA_PFLAG_FROZEN ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* read result TF if requested */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( qc - > flags  &  ATA_QCFLAG_RESULT_TF ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:37:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											fill_result_tf ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 16:46:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										trace_ata_qc_complete_done ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 18:22:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* Some commands need post-processing after successful
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  completion . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										switch  ( qc - > tf . command )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_CMD_SET_FEATURES : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( qc - > tf . feature  ! =  SETFEATURES_WC_ON  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    qc - > tf . feature  ! =  SETFEATURES_WC_OFF ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* fall through */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_CMD_INIT_DEV_PARAMS :  /* CHS translation changed */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_CMD_SET_MULTI :  /* multi_count changed */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* revalidate device */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ehi - > dev_action [ dev - > devno ]  | =  ATA_EH_REVALIDATE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ata_port_schedule_eh ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 18:30:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ATA_CMD_SLEEP : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dev - > flags  | =  ATA_DFLAG_SLEEPING ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 18:22:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:28:58 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( unlikely ( dev - > flags  &  ATA_DFLAG_DUBIOUS_XFER ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ata_verify_xfer ( qc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										__ata_qc_complete ( qc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( qc - > flags  &  ATA_QCFLAG_EH_SCHEDULED ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* read result TF if failed or requested */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( qc - > err_mask  | |  qc - > flags  &  ATA_QCFLAG_RESULT_TF ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-14 22:37:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											fill_result_tf ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										__ata_qc_complete ( qc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_qc_complete_multiple  -  Complete  multiple  qcs  successfully 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ap :  port  in  question 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ qc_active :  new  qc_active  mask 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Complete  in - flight  commands .   This  functions  is  meant  to  be 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	called  from  low - level  driver ' s  interrupt  routine  to  complete 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	requests  normally .   ap - > qc_active  and  @ qc_active  is  compared 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	and  commands  are  completed  accordingly . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-25 15:03:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Always  use  this  function  when  completing  multiple  NCQ  commands 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	from  IRQ  handlers  instead  of  calling  ata_qc_complete ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	multiple  times  to  keep  IRQ  expect  status  properly  in  sync . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	spin_lock_irqsave ( host  lock ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Number  of  completed  commands  on  success ,  - errno  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:20 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_qc_complete_multiple ( struct  ata_port  * ap ,  u32  qc_active )  
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  nr_done  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u32  done_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									done_mask  =  ap - > qc_active  ^  qc_active ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( unlikely ( done_mask  &  qc_active ) )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_port_err ( ap ,  " illegal qc_active transition (%08x->%08x) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											     ap - > qc_active ,  qc_active ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-05-20 09:44:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									while  ( done_mask )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										struct  ata_queued_cmd  * qc ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-20 09:44:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										unsigned  int  tag  =  __ffs ( done_mask ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-05-20 09:44:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										qc  =  ata_qc_from_tag ( ap ,  tag ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( qc )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_qc_complete ( qc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nr_done + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-20 09:44:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										done_mask  & =  ~ ( 1  < <  tag ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nr_done ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_qc_issue  -  issue  taskfile  to  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ qc :  command  to  issue  to  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Prepare  an  ATA  command  to  submission  to  device . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	This  includes  mapping  the  data  into  a  DMA - able 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	area ,  filling  in  the  S / G  table ,  and  finally 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	writing  the  taskfile  to  hardware ,  starting  the  command . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	spin_lock_irqsave ( host  lock ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-31 20:41:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_qc_issue ( struct  ata_queued_cmd  * qc )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  qc - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_link  * link  =  qc - > dev - > link ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:28:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u8  prot  =  qc - > tf . protocol ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Make sure only one non-NCQ command is outstanding.  The
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  check  is  skipped  for  old  EH  because  it  reuses  active  qc  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  request  ATAPI  sense . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-09 19:19:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									WARN_ON_ONCE ( ap - > ops - > error_handler  & &  ata_tag_valid ( link - > active_tag ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-12-05 10:36:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_is_ncq ( prot ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-09 19:19:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										WARN_ON_ONCE ( link - > sactive  &  ( 1  < <  qc - > tag ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! link - > sactive ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ap - > nr_active_links + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										link - > sactive  | =  1  < <  qc - > tag ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-09 19:19:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										WARN_ON_ONCE ( link - > sactive ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ap - > nr_active_links + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										link - > active_tag  =  qc - > tag ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-31 20:36:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc - > flags  | =  ATA_QCFLAG_ACTIVE ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > qc_active  | =  1  < <  qc - > tag ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-31 20:36:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-08-23 11:27:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  We  guarantee  to  LLDs  that  they  will  have  at  least  one 
							 
						 
					
						
							
								
									
										
										
										
											2007-12-05 16:43:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  non - zero  sg  if  the  command  is  a  data  command . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-23 11:27:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( WARN_ON_ONCE ( ata_is_data ( prot )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 ( ! qc - > sg  | |  ! qc - > n_elem  | |  ! qc - > nbytes ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  sys_err ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-12-05 16:43:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:28:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_is_dma ( prot )  | |  ( ata_is_pio ( prot )  & & 
							 
						 
					
						
							
								
									
										
										
										
											2007-12-05 16:43:10 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												 ( ap - > flags  &  ATA_FLAG_PIO_DMA ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-12-05 16:43:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ata_sg_setup ( qc ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-23 11:27:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											goto  sys_err ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: prefer hardreset
When both soft and hard resets are available, libata preferred
softreset till now.  The logic behind it was to be softer to devices;
however, this doesn't really help much.  Rationales for the change:
* BIOS may freeze lock certain things during boot and softreset can't
  unlock those.  This by itself is okay but during operation PHY event
  or other error conditions can trigger hardreset and the device may
  end up with different configuration.
  For example, after a hardreset, previously unlockable HPA can be
  unlocked resulting in different device size and thus revalidation
  failure.  Similar condition can occur during or after resume.
* Certain ATAPI devices require hardreset to recover after certain
  error conditions.  On PATA, this is done by issuing the DEVICE RESET
  command.  On SATA, COMRESET has equivalent effect.  The problem is
  that DEVICE RESET needs its own execution protocol.
  For SFF controllers with bare TF access, it can be easily
  implemented but more advanced controllers (e.g. ahci and sata_sil24)
  require specialized implementations.  Simply using hardreset solves
  the problem nicely.
* COMRESET initialization sequence is the norm in SATA land and many
  SATA devices don't work properly if only SRST is used.  For example,
  some PMPs behave this way and libata works around by always issuing
  hardreset if the host supports PMP.
  Like the above example, libata has developed a number of mechanisms
  aiming to promote softreset to hardreset if softreset is not going
  to work.  This approach is time consuming and error prone.
  Also, note that, dependingon how you read the specs, it could be
  argued that PMP fan-out ports require COMRESET to start operation.
  In fact, all the PMPs on the market except one don't work properly
  if COMRESET is not issued to fan-out ports after PMP reset.
* COMRESET is an integral part of SATA connection and any working
  device should be able to handle COMRESET properly.  After all, it's
  the way to signal hardreset during reboot.  This is the most used
  and recommended (at least by the ahci spec) method of resetting
  devices.
So, this patch makes libata prefer hardreset over softreset by making
the following changes.
* Rename ATA_EH_RESET_MASK to ATA_EH_RESET and use it whereever
  ATA_EH_{SOFT|HARD}RESET used to be used.  ATA_EH_{SOFT|HARD}RESET is
  now only used to tell prereset whether soft or hard reset will be
  issued.
* Strip out now unneeded promote-to-hardreset logics from
  ata_eh_reset(), ata_std_prereset(), sata_pmp_std_prereset() and
  other places.
Signed-off-by: Tejun Heo <htejun@gmail.com>
											 
										 
										
											2008-01-24 00:05:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* if device is sleeping, schedule reset and abort the link */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 18:30:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( unlikely ( qc - > dev - > flags  &  ATA_DFLAG_SLEEPING ) )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: prefer hardreset
When both soft and hard resets are available, libata preferred
softreset till now.  The logic behind it was to be softer to devices;
however, this doesn't really help much.  Rationales for the change:
* BIOS may freeze lock certain things during boot and softreset can't
  unlock those.  This by itself is okay but during operation PHY event
  or other error conditions can trigger hardreset and the device may
  end up with different configuration.
  For example, after a hardreset, previously unlockable HPA can be
  unlocked resulting in different device size and thus revalidation
  failure.  Similar condition can occur during or after resume.
* Certain ATAPI devices require hardreset to recover after certain
  error conditions.  On PATA, this is done by issuing the DEVICE RESET
  command.  On SATA, COMRESET has equivalent effect.  The problem is
  that DEVICE RESET needs its own execution protocol.
  For SFF controllers with bare TF access, it can be easily
  implemented but more advanced controllers (e.g. ahci and sata_sil24)
  require specialized implementations.  Simply using hardreset solves
  the problem nicely.
* COMRESET initialization sequence is the norm in SATA land and many
  SATA devices don't work properly if only SRST is used.  For example,
  some PMPs behave this way and libata works around by always issuing
  hardreset if the host supports PMP.
  Like the above example, libata has developed a number of mechanisms
  aiming to promote softreset to hardreset if softreset is not going
  to work.  This approach is time consuming and error prone.
  Also, note that, dependingon how you read the specs, it could be
  argued that PMP fan-out ports require COMRESET to start operation.
  In fact, all the PMPs on the market except one don't work properly
  if COMRESET is not issued to fan-out ports after PMP reset.
* COMRESET is an integral part of SATA connection and any working
  device should be able to handle COMRESET properly.  After all, it's
  the way to signal hardreset during reboot.  This is the most used
  and recommended (at least by the ahci spec) method of resetting
  devices.
So, this patch makes libata prefer hardreset over softreset by making
the following changes.
* Rename ATA_EH_RESET_MASK to ATA_EH_RESET and use it whereever
  ATA_EH_{SOFT|HARD}RESET used to be used.  ATA_EH_{SOFT|HARD}RESET is
  now only used to tell prereset whether soft or hard reset will be
  issued.
* Strip out now unneeded promote-to-hardreset logics from
  ata_eh_reset(), ata_std_prereset(), sata_pmp_std_prereset() and
  other places.
Signed-off-by: Tejun Heo <htejun@gmail.com>
											 
										 
										
											2008-01-24 00:05:14 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										link - > eh_info . action  | =  ATA_EH_RESET ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-25 18:30:36 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_ehi_push_desc ( & link - > eh_info ,  " waking up from sleep " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_link_abort ( link ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ap - > ops - > qc_prep ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-27 16:46:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									trace_ata_qc_issue ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-31 20:41:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc - > err_mask  | =  ap - > ops - > qc_issue ( qc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( unlikely ( qc - > err_mask ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-08-23 11:27:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								sys_err :  
						 
					
						
							
								
									
										
										
										
											2006-03-31 20:41:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qc - > err_mask  | =  AC_ERR_SYSTEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								err :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_qc_complete ( qc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	sata_scr_valid  -  test  whether  SCRs  are  accessible 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  to  test  SCR  accessibility  for 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Test  whether  SCRs  are  accessible  for  @ link . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	1  if  SCRs  are  accessible ,  0  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  sata_scr_valid ( struct  ata_link  * link )  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  link - > ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-05-21 18:33:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ( ap - > flags  &  ATA_FLAG_SATA )  & &  ap - > ops - > scr_read ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	sata_scr_read  -  read  SCR  register  of  the  specified  port 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  to  read  SCR  for 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ reg :  SCR  to  read 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ val :  Place  to  store  read  value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Read  SCR  register  @ reg  of  @ link  into  * @ val .   This  function  is 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	guaranteed  to  succeed  if  @ link  is  ap - > link ,  the  cable  type  of 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	the  port  is  SATA  and  the  port  implements  - > scr_read . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	None  if  @ link  is  ap - > link .   Kernel  thread  context  otherwise . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  negative  errno  on  failure . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  sata_scr_read ( struct  ata_link  * link ,  int  reg ,  u32  * val )  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_is_host_link ( link ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( sata_scr_valid ( link ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  link - > ap - > ops - > scr_read ( link ,  reg ,  val ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  - EOPNOTSUPP ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  sata_pmp_scr_read ( link ,  reg ,  val ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	sata_scr_write  -  write  SCR  register  of  the  specified  port 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  to  write  SCR  for 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ reg :  SCR  to  write 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ val :  value  to  write 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Write  @ val  to  SCR  register  @ reg  of  @ link .   This  function  is 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	guaranteed  to  succeed  if  @ link  is  ap - > link ,  the  cable  type  of 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	the  port  is  SATA  and  the  port  implements  - > scr_read . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	None  if  @ link  is  ap - > link .   Kernel  thread  context  otherwise . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  negative  errno  on  failure . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  sata_scr_write ( struct  ata_link  * link ,  int  reg ,  u32  val )  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_is_host_link ( link ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( sata_scr_valid ( link ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  link - > ap - > ops - > scr_write ( link ,  reg ,  val ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  - EOPNOTSUPP ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  sata_pmp_scr_write ( link ,  reg ,  val ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	sata_scr_write_flush  -  write  SCR  register  of  the  specified  port  and  flush 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  to  write  SCR  for 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ reg :  SCR  to  write 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ val :  value  to  write 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	This  function  is  identical  to  sata_scr_write ( )  except  that  this 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	function  performs  flush  after  writing  to  the  register . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	None  if  @ link  is  ap - > link .   Kernel  thread  context  otherwise . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  negative  errno  on  failure . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  sata_scr_write_flush ( struct  ata_link  * link ,  int  reg ,  u32  val )  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ata_is_host_link ( link ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-16 14:29:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( sata_scr_valid ( link ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											rc  =  link - > ap - > ops - > scr_write ( link ,  reg ,  val ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( rc  = =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:40 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												rc  =  link - > ap - > ops - > scr_read ( link ,  reg ,  & val ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EOPNOTSUPP ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  sata_pmp_scr_write ( link ,  reg ,  val ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_phys_link_online  -  test  whether  the  given  link  is  online 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  to  test 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Test  whether  @ link  is  online .   Note  that  this  function  returns 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  if  online  status  of  @ link  cannot  be  obtained ,  so 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_link_online ( link )  ! =  ! ata_link_offline ( link ) . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	True  if  the  port  online  status  is  available  and  online . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  ata_phys_link_online ( struct  ata_link  * link )  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u32  sstatus ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( sata_scr_read ( link ,  SCR_STATUS ,  & sstatus )  = =  0  & & 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									    ata_sstatus_online ( sstatus ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_phys_link_offline  -  test  whether  the  given  link  is  offline 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  to  test 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Test  whether  @ link  is  offline .   Note  that  this  function 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	returns  0  if  offline  status  of  @ link  cannot  be  obtained ,  so 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_link_online ( link )  ! =  ! ata_link_offline ( link ) . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	True  if  the  port  offline  status  is  available  and  offline . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  ata_phys_link_offline ( struct  ata_link  * link )  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									u32  sstatus ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( sata_scr_read ( link ,  SCR_STATUS ,  & sstatus )  = =  0  & & 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:31 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									    ! ata_sstatus_online ( sstatus ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 17:02:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2005-06-02 18:17:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_link_online  -  test  whether  the  given  link  is  online 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  to  test 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Test  whether  @ link  is  online .   This  is  identical  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_phys_link_online ( )  when  there ' s  no  slave  link .   When 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	there ' s  a  slave  link ,  this  function  should  only  be  called  on 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	the  master  link  and  will  return  true  if  any  of  M / S  links  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	online . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	True  if  the  port  online  status  is  available  and  online . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  ata_link_online ( struct  ata_link  * link )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_link  * slave  =  link - > ap - > slave_link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WARN_ON ( link  = =  slave ) ; 	/* shouldn't be called on slave link */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ata_phys_link_online ( link )  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										( slave  & &  ata_phys_link_online ( slave ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_link_offline  -  test  whether  the  given  link  is  offline 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  ATA  link  to  test 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Test  whether  @ link  is  offline .   This  is  identical  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_phys_link_offline ( )  when  there ' s  no  slave  link .   When 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	there ' s  a  slave  link ,  this  function  should  only  be  called  on 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	the  master  link  and  will  return  true  if  both  M / S  links  are 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	offline . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	True  if  the  port  offline  status  is  available  and  offline . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  ata_link_offline ( struct  ata_link  * link )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_link  * slave  =  link - > ap - > slave_link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WARN_ON ( link  = =  slave ) ; 	/* shouldn't be called on slave link */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ata_phys_link_offline ( link )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										( ! slave  | |  ata_phys_link_offline ( slave ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-03-02 17:32:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_PM 
  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  ata_port_request_pm ( struct  ata_port  * ap ,  pm_message_t  mesg ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												unsigned  int  action ,  unsigned  int  ehi_flags , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  async ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_link  * link ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  flags ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Previous resume operation might still be in
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  progress .   Wait  for  PM_PENDING  to  clear . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ap - > pflags  &  ATA_PFLAG_PM_PENDING )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_port_wait_eh ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										WARN_ON ( ap - > pflags  &  ATA_PFLAG_PM_PENDING ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* request PM ops to EH */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_lock_irqsave ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > pm_mesg  =  mesg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ap - > pflags  | =  ATA_PFLAG_PM_PENDING ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_for_each_link ( link ,  ap ,  HOST_FIRST )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										link - > eh_info . action  | =  action ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										link - > eh_info . flags  | =  ehi_flags ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_schedule_eh ( ap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock_irqrestore ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:41:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! async )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_port_wait_eh ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										WARN_ON ( ap - > pflags  &  ATA_PFLAG_PM_PENDING ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  On  some  hardware ,  device  fails  to  respond  after  spun  down  for  suspend .   As 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  the  device  won ' t  be  used  before  being  resumed ,  we  don ' t  need  to  touch  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  device .   Ask  EH  to  skip  the  usual  stuff  and  proceed  directly  to  suspend . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  http : //thread.gmane.org/gmane.linux.ide/46764
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  unsigned  int  ata_port_suspend_ehi  =  ATA_EHI_QUIET  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														 |  ATA_EHI_NO_AUTOPSY 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														 |  ATA_EHI_NO_RECOVERY ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  ata_port_suspend ( struct  ata_port  * ap ,  pm_message_t  mesg )  
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_request_pm ( ap ,  mesg ,  0 ,  ata_port_suspend_ehi ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  ata_port_suspend_async ( struct  ata_port  * ap ,  pm_message_t  mesg )  
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:41:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_request_pm ( ap ,  mesg ,  0 ,  ata_port_suspend_ehi ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:41:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_port_pm_suspend ( struct  device  * dev )  
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  to_ata_port ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pm_runtime_suspended ( dev ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_suspend ( ap ,  PMSG_SUSPEND ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-22 14:50:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_port_pm_freeze ( struct  device  * dev )  
						 
					
						
							
								
									
										
										
										
											2011-12-22 14:50:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  to_ata_port ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-22 14:50:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pm_runtime_suspended ( dev ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-25 14:32:25 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-22 14:50:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_suspend ( ap ,  PMSG_FREEZE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-22 14:50:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_port_pm_poweroff ( struct  device  * dev )  
						 
					
						
							
								
									
										
										
										
											2011-12-22 14:50:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_suspend ( to_ata_port ( dev ) ,  PMSG_HIBERNATE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  unsigned  int  ata_port_resume_ehi  =  ATA_EHI_NO_AUTOPSY  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														|  ATA_EHI_QUIET ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  ata_port_resume ( struct  ata_port  * ap ,  pm_message_t  mesg )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_port_request_pm ( ap ,  mesg ,  ATA_EH_RESET ,  ata_port_resume_ehi ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  ata_port_resume_async ( struct  ata_port  * ap ,  pm_message_t  mesg )  
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:41:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_request_pm ( ap ,  mesg ,  ATA_EH_RESET ,  ata_port_resume_ehi ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:41:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_port_pm_resume ( struct  device  * dev )  
						 
					
						
							
								
									
										
										
										
											2011-12-22 14:50:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2014-03-14 13:52:54 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_resume_async ( to_ata_port ( dev ) ,  PMSG_RESUME ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pm_runtime_disable ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pm_runtime_set_active ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pm_runtime_enable ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-22 14:50:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-01-15 17:21:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  For  ODDs ,  the  upper  layer  will  poll  for  media  change  every  few  seconds , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  which  will  make  it  enter  and  leave  suspend  state  every  few  seconds .  And 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  as  each  suspend  will  cause  a  hard / soft  reset ,  the  gain  of  runtime  suspend 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  is  very  little  and  the  ODD  may  malfunction  after  constantly  being  reset . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  So  the  idle  callback  here  will  not  proceed  to  suspend  if  a  non - ZPODD  capable 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  ODD  is  attached  to  the  port . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:28 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_port_runtime_idle ( struct  device  * dev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-01-15 17:21:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  to_ata_port ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_link  * link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_device  * adev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_for_each_link ( link ,  ap ,  HOST_FIRST )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_for_each_dev ( adev ,  link ,  ENABLED ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( adev - > class  = =  ATA_DEV_ATAPI  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    ! zpodd_dev_enabled ( adev ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  - EBUSY ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												PM / Runtime: Rework the "runtime idle" helper routine
The "runtime idle" helper routine, rpm_idle(), currently ignores
return values from .runtime_idle() callbacks executed by it.
However, it turns out that many subsystems use
pm_generic_runtime_idle() which checks the return value of the
driver's callback and executes pm_runtime_suspend() for the device
unless that value is not 0.  If that logic is moved to rpm_idle()
instead, pm_generic_runtime_idle() can be dropped and its users
will not need any .runtime_idle() callbacks any more.
Moreover, the PCI, SCSI, and SATA subsystems' .runtime_idle()
routines, pci_pm_runtime_idle(), scsi_runtime_idle(), and
ata_port_runtime_idle(), respectively, as well as a few drivers'
ones may be simplified if rpm_idle() calls rpm_suspend() after 0 has
been returned by the .runtime_idle() callback executed by it.
To reduce overall code bloat, make the changes described above.
Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Tested-by: Kevin Hilman <khilman@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Kevin Hilman <khilman@linaro.org>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
											 
										 
										
											2013-06-03 21:49:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:28 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-01-25 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ata_port_runtime_suspend ( struct  device  * dev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_suspend ( to_ata_port ( dev ) ,  PMSG_AUTO_SUSPEND ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-25 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  ata_port_runtime_resume ( struct  device  * dev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_resume ( to_ata_port ( dev ) ,  PMSG_AUTO_RESUME ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-25 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  struct  dev_pm_ops  ata_port_pm_ops  =  {  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									. suspend  =  ata_port_pm_suspend , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. resume  =  ata_port_pm_resume , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. freeze  =  ata_port_pm_freeze , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. thaw  =  ata_port_pm_resume , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. poweroff  =  ata_port_pm_poweroff , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. restore  =  ata_port_pm_resume , 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:28 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-01-25 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									. runtime_suspend  =  ata_port_runtime_suspend , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. runtime_resume  =  ata_port_runtime_resume , 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:28 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									. runtime_idle  =  ata_port_runtime_idle , 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:41:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* sas ports don't participate in pm runtime management of ata_ports,
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  and  need  to  resume  ata  devices  at  the  domain  level ,  not  the  per - port 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  level .  sas  suspend / resume  is  async  to  allow  parallel  port  recovery 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  since  sas  has  multiple  ata_port  instances  per  Scsi_Host . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_sas_port_suspend ( struct  ata_port  * ap )  
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:41:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_suspend_async ( ap ,  PMSG_SUSPEND ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:41:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_sas_port_suspend ) ;  
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:41:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_sas_port_resume ( struct  ata_port  * ap )  
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:41:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_resume_async ( ap ,  PMSG_RESUME ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:41:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
											 
										
											
												libata, libsas: kill pm_result and related cleanup
Tejun says:
  "At least for libata, worrying about suspend/resume failures don't make
   whole lot of sense.  If suspend failed, just proceed with suspend.  If
   the device can't be woken up afterwards, that's that.  There isn't
   anything we could have done differently anyway.  The same for resume, if
   spinup fails, the device is dud and the following commands will invoke
   EH actions and will eventually fail.  Again, there really isn't any
   *choice* to make.  Just making sure the errors are handled gracefully
   (ie. don't crash) and the following commands are handled correctly
   should be enough."
The only libata user that actually cares about the result from a suspend
operation is libsas.  However, it only cares about whether queuing a new
operation collides with an in-flight one.  All libsas does with the
error is retry, but we can just let libata wait for the previous
operation before continuing.
Other cleanups include:
1/ Unifying all ata port pm operations on an ata_port_pm_ prefix
2/ Marking all ata port pm helper routines as returning void, only
   ata_port_pm_ entry points need to fake a 0 return value.
3/ Killing ata_port_{suspend|resume}_common() in favor of calling
   ata_port_request_pm() directly
4/ Killing the wrappers that just do a to_ata_port() conversion
5/ Clearly marking the entry points that do async operations with an
  _async suffix.
Reference: http://marc.info/?l=linux-scsi&m=138995409532286&w=2
Cc: Phillip Susi <psusi@ubuntu.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Todd Brandt <todd.e.brandt@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
											 
										 
										
											2014-03-14 13:52:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_sas_port_resume ) ;  
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:41:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_host_suspend  -  suspend  host 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ host :  host  to  suspend 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ mesg :  PM  message 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Suspend  @ host .   Actual  operation  is  performed  by  port  suspend . 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_host_suspend ( struct  ata_host  * host ,  pm_message_t  mesg )  
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									host - > dev - > power . power_state  =  mesg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_host_resume  -  resume  host 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ host :  host  to  resume 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Resume  @ host .   Actual  operation  is  performed  by  port  resume . 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_host_resume ( struct  ata_host  * host )  
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-02-25 17:31:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									host - > dev - > power . power_state  =  PMSG_ON ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2007-03-02 17:32:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-05 09:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  device_type  ata_port_type  =  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. name  =  " ata_port " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef CONFIG_PM 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. pm  =  & ata_port_pm_ops , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_dev_init  -  Initialize  an  ata_device  structure 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  Device  structure  to  initialize 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Initialize  @ dev  in  preparation  for  probing . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  caller . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  ata_dev_init ( struct  ata_device  * dev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_link  * link  =  ata_dev_phys_link ( dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  link - > ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:32 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  flags ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* SATA spd limit is bound to the attached device, reset together */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									link - > sata_spd_limit  =  link - > hw_sata_spd_limit ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									link - > sata_spd  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:38 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:32 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* High bits of dev->flags are used to record warm plug
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  requests  which  occur  asynchronously .   Synchronize  using 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  host  lock . 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:32 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-22 23:46:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock_irqsave ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:32 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dev - > flags  & =  ~ ATA_DFLAG_INIT_MASK ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-03 12:20:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dev - > horkage  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-22 23:46:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock_irqrestore ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-01-29 20:31:32 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memset ( ( void  * ) dev  +  ATA_DEVICE_CLEAR_BEGIN ,  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									       ATA_DEVICE_CLEAR_END  -  ATA_DEVICE_CLEAR_BEGIN ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dev - > pio_mask  =  UINT_MAX ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev - > mwdma_mask  =  UINT_MAX ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev - > udma_mask  =  UINT_MAX ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_link_init  -  Initialize  an  ata_link  structure 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ap :  ATA  port  link  is  attached  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  Link  structure  to  initialize 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ pmp :  Port  multiplier  port  number 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Initialize  @ link . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_link_init ( struct  ata_port  * ap ,  struct  ata_link  * link ,  int  pmp )  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* clear everything except for devices */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 12:31:38 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memset ( ( void  * ) link  +  ATA_LINK_CLEAR_BEGIN ,  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									       ATA_LINK_CLEAR_END  -  ATA_LINK_CLEAR_BEGIN ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									link - > ap  =  ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									link - > pmp  =  pmp ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									link - > active_tag  =  ATA_TAG_POISON ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									link - > hw_sata_spd_limit  =  UINT_MAX ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* can't use iterator, ap isn't initialized yet */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  ATA_MAX_DEVICES ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  ata_device  * dev  =  & link - > device [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > link  =  link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > devno  =  dev  -  link - > device ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-16 04:17:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_ATA_ACPI 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dev - > gtf_filter  =  ata_acpi_gtf_filter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_dev_init ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	sata_link_init_spd  -  Initialize  link - > sata_spd_limit 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  Link  to  configure  sata_spd_limit  for 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Initialize  @ link - > [ hw_ ] sata_spd_limit  to  the  currently 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	configured  value . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - errno  on  failure . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  sata_link_init_spd ( struct  ata_link  * link )  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u8  spd ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 16:09:34 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  sata_scr_read ( link ,  SCR_CONTROL ,  & link - > saved_scontrol ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-31 16:09:34 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spd  =  ( link - > saved_scontrol  > >  4 )  &  0xf ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( spd ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										link - > hw_sata_spd_limit  & =  ( 1  < <  spd )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-08-13 20:19:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_force_link_limits ( link ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									link - > sata_spd_limit  =  link - > hw_sata_spd_limit ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_port_alloc  -  allocate  and  initialize  basic  ATA  port  resources 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ host :  ATA  host  this  allocated  port  belongs  to 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Allocate  and  initialize  basic  ATA  port  resources . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Allocate  ATA  port  on  success ,  NULL  on  failure . 
							 
						 
					
						
							
								
									
										
										
										
											2005-05-30 19:49:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	Inherited  from  calling  layer  ( may  sleep ) . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  ata_port  * ata_port_alloc ( struct  ata_host  * host )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_port  * ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DPRINTK ( " ENTER \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ap  =  kzalloc ( sizeof ( * ap ) ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ap ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-15 01:13:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-03-16 14:58:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > pflags  | =  ATA_PFLAG_INITIALIZING  |  ATA_PFLAG_FROZEN ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > lock  =  & host - > lock ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > print_id  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-14 13:48:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > local_port_no  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > host  =  host ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > dev  =  host - > dev ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-11 23:17:01 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if defined(ATA_VERBOSE_DEBUG) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* turn on all debugging levels */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ap - > msg_enable  =  0x00FF ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# elif defined(ATA_DEBUG) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ap - > msg_enable  =  ATA_MSG_DRV  |  ATA_MSG_INFO  |  ATA_MSG_CTL  |  ATA_MSG_WARN  |  ATA_MSG_ERR ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-25 20:00:35 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2006-06-23 02:29:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > msg_enable  =  ATA_MSG_DRV  |  ATA_MSG_ERR  |  ATA_MSG_WARN ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-11 23:17:01 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-02 10:03:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mutex_init ( & ap - > scsi_scan_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-11-22 14:55:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									INIT_DELAYED_WORK ( & ap - > hotplug_task ,  ata_scsi_hotplug ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									INIT_WORK ( & ap - > scsi_rescan_task ,  ata_scsi_dev_rescan ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-23 13:09:37 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									INIT_LIST_HEAD ( & ap - > eh_done_q ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									init_waitqueue_head ( & ap - > eh_wait_q ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-09-21 11:54:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									init_completion ( & ap - > park_req_pending ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-16 14:29:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									init_timer_deferrable ( & ap - > fastdrain_timer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ap - > fastdrain_timer . function  =  ata_eh_fastdrain_timerfn ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ap - > fastdrain_timer . data  =  ( unsigned  long ) ap ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:44 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > cbl  =  ATA_CBL_NONE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_link_init ( ap ,  & ap - > link ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef ATA_IRQ_TRAP 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ap - > stats . unhandled_irq  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ap - > stats . idle_irq  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2010-05-10 21:41:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_sff_port_init ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-01-20 16:00:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  ata_host_release ( struct  device  * gendev ,  void  * res )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_host  * host  =  dev_get_drvdata ( gendev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-03-09 19:36:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  host - > n_ports ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  ata_port  * ap  =  host - > ports [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ap ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ap - > scsi_host ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-09 19:36:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											scsi_host_put ( ap - > scsi_host ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:19:54 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										kfree ( ap - > pmp_link ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										kfree ( ap - > slave_link ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										kfree ( ap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-03-09 19:36:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										host - > ports [ i ]  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-02-27 22:33:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dev_set_drvdata ( gendev ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-20 16:00:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_host_alloc  -  allocate  and  init  basic  ATA  host  resources 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  generic  device  this  host  is  associated  with 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ max_ports :  maximum  number  of  ATA  ports  associated  with  this  host 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Allocate  and  initialize  basic  ATA  host  resources .   LLD  calls 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	this  function  to  allocate  a  host ,  initializes  it  fully  and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	attaches  it  using  ata_host_register ( ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ max_ports  ports  are  allocated  and  host - > n_ports  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	initialized  to  @ max_ports .   The  caller  is  allowed  to  decrease 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	host - > n_ports  before  calling  ata_host_register ( ) .   The  unused 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ports  will  be  automatically  freed  on  registration . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Allocate  ATA  host  on  success ,  NULL  on  failure . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  calling  layer  ( may  sleep ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  ata_host  * ata_host_alloc ( struct  device  * dev ,  int  max_ports )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_host  * host ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									size_t  sz ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DPRINTK ( " ENTER \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! devres_open_group ( dev ,  NULL ,  GFP_KERNEL ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* alloc a container for our list of ATA ports (buses) */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sz  =  sizeof ( struct  ata_host )  +  ( max_ports  +  1 )  *  sizeof ( void  * ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* alloc a container for our list of ATA ports (buses) */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									host  =  devres_alloc ( ata_host_release ,  sz ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! host ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  err_out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									devres_add ( dev ,  host ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev_set_drvdata ( dev ,  host ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_lock_init ( & host - > lock ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement cross-port EH exclusion
In libata, the non-EH code paths should always take and release
ap->lock explicitly when accessing hardware or shared data structures.
However, once EH is active, it's assumed that the port is owned by EH
and EH methods don't explicitly take ap->lock unless race from irq
handler or other code paths are expected.  However, libata EH didn't
guarantee exclusion among EHs for ports of the same host.  IOW,
multiple EHs may execute in parallel on multiple ports of the same
controller.
In many cases, especially in SATA, the ports are completely
independent of each other and this doesn't cause problems; however,
there are cases where different ports share the same resource, which
lead to obscure timing related bugs such as the one fixed by commit
213373cf (ata_piix: fix locking around SIDPR access).
This patch implements exclusion among EHs of the same host.  When EH
begins, it acquires per-host EH ownership by calling ata_eh_acquire().
When EH finishes, the ownership is released by calling
ata_eh_release().  EH ownership is also released whenever the EH
thread goes to sleep from ata_msleep() or explicitly and reacquired
after waking up.
This ensures that while EH is actively accessing the hardware, it has
exclusive access to it while allowing EHs to interleave and progress
in parallel as they hit waiting stages, which dominate the time spent
in EH.  This achieves cross-port EH exclusion without pervasive and
fragile changes while still allowing parallel EH for the most part.
This was first reported by yuanding02@gmail.com more than three years
ago in the following bugzilla.  :-)
  https://bugzilla.kernel.org/show_bug.cgi?id=8223
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Reported-by: yuanding02@gmail.com
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2010-09-06 17:57:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mutex_init ( & host - > eh_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									host - > dev  =  dev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									host - > n_ports  =  max_ports ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* allocate ports bound to this host */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  max_ports ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  ata_port  * ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ap  =  ata_port_alloc ( host ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ap ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  err_out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ap - > port_no  =  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										host - > ports [ i ]  =  ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									devres_remove_group ( dev ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  host ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 err_out : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									devres_release_group ( dev ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_host_alloc_pinfo  -  alloc  host  and  init  with  port_info  array 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev :  generic  device  this  host  is  associated  with 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ppi :  array  of  ATA  port_info  to  initialize  host  with 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ n_ports :  number  of  ATA  ports  attached  to  this  host 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Allocate  ATA  host  and  initialize  with  info  from  @ ppi .   If  NULL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	terminated ,  @ ppi  may  contain  fewer  entries  than  @ n_ports .   The 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	last  entry  will  be  used  for  the  remaining  ports . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Allocate  ATA  host  on  success ,  NULL  on  failure . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  calling  layer  ( may  sleep ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  ata_host  * ata_host_alloc_pinfo ( struct  device  * dev ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      const  struct  ata_port_info  *  const  *  ppi , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      int  n_ports ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  struct  ata_port_info  * pi ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_host  * host ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  i ,  j ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									host  =  ata_host_alloc ( dev ,  n_ports ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! host ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  0 ,  j  =  0 ,  pi  =  NULL ;  i  <  host - > n_ports ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  ata_port  * ap  =  host - > ports [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ppi [ j ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pi  =  ppi [ j + + ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ap - > pio_mask  =  pi - > pio_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ap - > mwdma_mask  =  pi - > mwdma_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ap - > udma_mask  =  pi - > udma_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ap - > flags  | =  pi - > flags ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ap - > link . flags  | =  pi - > link_flags ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ap - > ops  =  pi - > port_ops ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! host - > ops  & &  ( pi - > port_ops  ! =  & ata_dummy_port_ops ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											host - > ops  =  pi - > port_ops ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  host ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_slave_link_init  -  initialize  slave  link 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ap :  port  to  initialize  slave  link  for 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Create  and  initialize  slave  link  for  @ ap .   This  enables  slave 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	link  handling  on  the  port . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	In  libata ,  a  port  contains  links  and  a  link  contains  devices . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	There  is  single  host  link  but  if  a  PMP  is  attached  to  it , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	there  can  be  multiple  fan - out  links .   On  SATA ,  there ' s  usually 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	a  single  device  connected  to  a  link  but  PATA  and  SATA 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	controllers  emulating  TF  based  interface  can  have  two  -  master 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	and  slave . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	However ,  there  are  a  few  controllers  which  don ' t  fit  into  this 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	abstraction  too  well  -  SATA  controllers  which  emulate  TF 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	interface  with  both  master  and  slave  devices  but  also  have 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	separate  SCR  register  sets  for  each  device .   These  controllers 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	need  separate  links  for  physical  link  handling 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	( e . g .  onlineness ,  link  speed )  but  should  be  treated  like  a 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	traditional  M / S  controller  for  everything  else  ( e . g .  command 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	issue ,  softreset ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	slave_link  is  libata ' s  way  of  handling  this  class  of 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	controllers  without  impacting  core  layer  too  much .   For 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	anything  other  than  physical  link  handling ,  the  default  host 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	link  is  used  for  both  master  and  slave .   For  physical  link 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	handling ,  separate  @ ap - > slave_link  is  used .   All  dirty  details 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	are  implemented  inside  libata  core  layer .   From  LLD ' s  POV ,  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	only  difference  is  that  prereset ,  hardreset  and  postreset  are 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	called  once  more  for  the  slave  link ,  so  the  reset  sequence 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	looks  like  the  following . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	prereset ( M )  - >  prereset ( S )  - >  hardreset ( M )  - >  hardreset ( S )  - > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	softreset ( M )  - >  postreset ( M )  - >  postreset ( S ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Note  that  softreset  is  called  only  for  the  master .   Softreset 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	resets  both  M / S  by  definition ,  so  SRST  on  master  should  handle 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	both  ( the  standard  method  will  work  just  fine ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Should  be  called  before  host  is  registered . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - errno  on  failure . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_slave_link_init ( struct  ata_port  * ap )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_link  * link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WARN_ON ( ap - > slave_link ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WARN_ON ( ap - > flags  &  ATA_FLAG_PMP ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									link  =  kzalloc ( sizeof ( * link ) ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! link ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_link_init ( ap ,  link ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ap - > slave_link  =  link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-08 13:09:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  ata_host_stop ( struct  device  * gendev ,  void  * res )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_host  * host  =  dev_get_drvdata ( gendev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WARN_ON ( ! ( host - > flags  &  ATA_HOST_STARTED ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  host - > n_ports ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  ata_port  * ap  =  host - > ports [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ap - > ops - > port_stop ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ap - > ops - > port_stop ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( host - > ops - > host_stop ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										host - > ops - > host_stop ( host ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement and use ops inheritance
libata lets low level drivers build ata_port_operations table and
register it with libata core layer.  This allows low level drivers
high level of flexibility but also burdens them with lots of
boilerplate entries.
This becomes worse for drivers which support related similar
controllers which differ slightly.  They share most of the operations
except for a few.  However, the driver still needs to list all
operations for each variant.  This results in large number of
duplicate entries, which is not only inefficient but also error-prone
as it becomes very difficult to tell what the actual differences are.
This duplicate boilerplates all over the low level drivers also make
updating the core layer exteremely difficult and error-prone.  When
compounded with multi-branched development model, it ends up
accumulating inconsistencies over time.  Some of those inconsistencies
cause immediate problems and fixed.  Others just remain there dormant
making maintenance increasingly difficult.
To rectify the problem, this patch implements ata_port_operations
inheritance.  To allow LLDs to easily re-use their own ops tables
overriding only specific methods, this patch implements poor man's
class inheritance.  An ops table has ->inherits field which can be set
to any ops table as long as it doesn't create a loop.  When the host
is started, the inheritance chain is followed and any operation which
isn't specified is taken from the nearest ancestor which has it
specified.  This operation is called finalization and done only once
per an ops table and the LLD doesn't have to do anything special about
it other than making the ops table non-const such that libata can
update it.
libata provides four base ops tables lower drivers can inherit from -
base, sata, pmp, sff and bmdma.  To avoid overriding these ops
accidentaly, these ops are declared const and LLDs should always
inherit these instead of using them directly.
After finalization, all the ops table are identical before and after
the patch except for setting .irq_handler to ata_interrupt in drivers
which didn't use to.  The .irq_handler doesn't have any actual effect
and the field will soon be removed by later patch.
* sata_sx4 is still using old style EH and currently doesn't take
  advantage of ops inheritance.
Signed-off-by: Tejun Heo <htejun@gmail.com>
											 
										 
										
											2008-03-25 12:22:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_finalize_port_ops  -  finalize  ata_port_operations 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ops :  ata_port_operations  to  finalize 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	An  ata_port_operations  can  inherit  from  another  ops  and  that 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ops  can  again  inherit  from  another .   This  can  go  on  as  many 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	times  as  necessary  as  long  as  there  is  no  loop  in  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	inheritance  chain . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Ops  tables  are  finalized  when  the  host  is  started .   NULL  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	unspecified  entries  are  inherited  from  the  closet  ancestor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	which  has  the  method  and  the  entry  is  populated  with  it . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	After  finalization ,  the  ops  table  directly  points  to  all  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	methods  and  - > inherits  is  no  longer  necessary  and  cleared . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Using  ATA_OP_NULL ,  inheriting  ops  can  force  a  method  to  NULL . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  ata_finalize_port_ops ( struct  ata_port_operations  * ops )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-05-29 23:28:14 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  DEFINE_SPINLOCK ( lock ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement and use ops inheritance
libata lets low level drivers build ata_port_operations table and
register it with libata core layer.  This allows low level drivers
high level of flexibility but also burdens them with lots of
boilerplate entries.
This becomes worse for drivers which support related similar
controllers which differ slightly.  They share most of the operations
except for a few.  However, the driver still needs to list all
operations for each variant.  This results in large number of
duplicate entries, which is not only inefficient but also error-prone
as it becomes very difficult to tell what the actual differences are.
This duplicate boilerplates all over the low level drivers also make
updating the core layer exteremely difficult and error-prone.  When
compounded with multi-branched development model, it ends up
accumulating inconsistencies over time.  Some of those inconsistencies
cause immediate problems and fixed.  Others just remain there dormant
making maintenance increasingly difficult.
To rectify the problem, this patch implements ata_port_operations
inheritance.  To allow LLDs to easily re-use their own ops tables
overriding only specific methods, this patch implements poor man's
class inheritance.  An ops table has ->inherits field which can be set
to any ops table as long as it doesn't create a loop.  When the host
is started, the inheritance chain is followed and any operation which
isn't specified is taken from the nearest ancestor which has it
specified.  This operation is called finalization and done only once
per an ops table and the LLD doesn't have to do anything special about
it other than making the ops table non-const such that libata can
update it.
libata provides four base ops tables lower drivers can inherit from -
base, sata, pmp, sff and bmdma.  To avoid overriding these ops
accidentaly, these ops are declared const and LLDs should always
inherit these instead of using them directly.
After finalization, all the ops table are identical before and after
the patch except for setting .irq_handler to ata_interrupt in drivers
which didn't use to.  The .irq_handler doesn't have any actual effect
and the field will soon be removed by later patch.
* sata_sx4 is still using old style EH and currently doesn't take
  advantage of ops inheritance.
Signed-off-by: Tejun Heo <htejun@gmail.com>
											 
										 
										
											2008-03-25 12:22:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  struct  ata_port_operations  * cur ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									void  * * begin  =  ( void  * * ) ops ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									void  * * end  =  ( void  * * ) & ops - > inherits ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									void  * * pp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ops  | |  ! ops - > inherits ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_lock ( & lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( cur  =  ops - > inherits ;  cur ;  cur  =  cur - > inherits )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										void  * * inherit  =  ( void  * * ) cur ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( pp  =  begin ;  pp  <  end ;  pp + + ,  inherit + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! * pp ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												* pp  =  * inherit ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( pp  =  begin ;  pp  <  end ;  pp + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( IS_ERR ( * pp ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											* pp  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ops - > inherits  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_unlock ( & lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_host_start  -  start  and  freeze  ports  of  an  ATA  host 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ host :  ATA  host  to  start  ports  for 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Start  and  then  freeze  ports  of  @ host .   Started  status  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	recorded  in  host - > flags ,  so  this  function  can  be  called 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	multiple  times .   Ports  are  guaranteed  to  get  started  only 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	once .   If  host - > ops  isn ' t  initialized  yet ,  its  set  to  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	first  non - dummy  port  ops . 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  calling  layer  ( may  sleep ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  if  all  ports  are  started  successfully ,  - errno  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_host_start ( struct  ata_host  * host )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-11-08 13:09:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  have_stop  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									void  * start_dr  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  i ,  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( host - > flags  &  ATA_HOST_STARTED ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement and use ops inheritance
libata lets low level drivers build ata_port_operations table and
register it with libata core layer.  This allows low level drivers
high level of flexibility but also burdens them with lots of
boilerplate entries.
This becomes worse for drivers which support related similar
controllers which differ slightly.  They share most of the operations
except for a few.  However, the driver still needs to list all
operations for each variant.  This results in large number of
duplicate entries, which is not only inefficient but also error-prone
as it becomes very difficult to tell what the actual differences are.
This duplicate boilerplates all over the low level drivers also make
updating the core layer exteremely difficult and error-prone.  When
compounded with multi-branched development model, it ends up
accumulating inconsistencies over time.  Some of those inconsistencies
cause immediate problems and fixed.  Others just remain there dormant
making maintenance increasingly difficult.
To rectify the problem, this patch implements ata_port_operations
inheritance.  To allow LLDs to easily re-use their own ops tables
overriding only specific methods, this patch implements poor man's
class inheritance.  An ops table has ->inherits field which can be set
to any ops table as long as it doesn't create a loop.  When the host
is started, the inheritance chain is followed and any operation which
isn't specified is taken from the nearest ancestor which has it
specified.  This operation is called finalization and done only once
per an ops table and the LLD doesn't have to do anything special about
it other than making the ops table non-const such that libata can
update it.
libata provides four base ops tables lower drivers can inherit from -
base, sata, pmp, sff and bmdma.  To avoid overriding these ops
accidentaly, these ops are declared const and LLDs should always
inherit these instead of using them directly.
After finalization, all the ops table are identical before and after
the patch except for setting .irq_handler to ata_interrupt in drivers
which didn't use to.  The .irq_handler doesn't have any actual effect
and the field will soon be removed by later patch.
* sata_sx4 is still using old style EH and currently doesn't take
  advantage of ops inheritance.
Signed-off-by: Tejun Heo <htejun@gmail.com>
											 
										 
										
											2008-03-25 12:22:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_finalize_port_ops ( host - > ops ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  host - > n_ports ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  ata_port  * ap  =  host - > ports [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement and use ops inheritance
libata lets low level drivers build ata_port_operations table and
register it with libata core layer.  This allows low level drivers
high level of flexibility but also burdens them with lots of
boilerplate entries.
This becomes worse for drivers which support related similar
controllers which differ slightly.  They share most of the operations
except for a few.  However, the driver still needs to list all
operations for each variant.  This results in large number of
duplicate entries, which is not only inefficient but also error-prone
as it becomes very difficult to tell what the actual differences are.
This duplicate boilerplates all over the low level drivers also make
updating the core layer exteremely difficult and error-prone.  When
compounded with multi-branched development model, it ends up
accumulating inconsistencies over time.  Some of those inconsistencies
cause immediate problems and fixed.  Others just remain there dormant
making maintenance increasingly difficult.
To rectify the problem, this patch implements ata_port_operations
inheritance.  To allow LLDs to easily re-use their own ops tables
overriding only specific methods, this patch implements poor man's
class inheritance.  An ops table has ->inherits field which can be set
to any ops table as long as it doesn't create a loop.  When the host
is started, the inheritance chain is followed and any operation which
isn't specified is taken from the nearest ancestor which has it
specified.  This operation is called finalization and done only once
per an ops table and the LLD doesn't have to do anything special about
it other than making the ops table non-const such that libata can
update it.
libata provides four base ops tables lower drivers can inherit from -
base, sata, pmp, sff and bmdma.  To avoid overriding these ops
accidentaly, these ops are declared const and LLDs should always
inherit these instead of using them directly.
After finalization, all the ops table are identical before and after
the patch except for setting .irq_handler to ata_interrupt in drivers
which didn't use to.  The .irq_handler doesn't have any actual effect
and the field will soon be removed by later patch.
* sata_sx4 is still using old style EH and currently doesn't take
  advantage of ops inheritance.
Signed-off-by: Tejun Heo <htejun@gmail.com>
											 
										 
										
											2008-03-25 12:22:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_finalize_port_ops ( ap - > ops ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! host - > ops  & &  ! ata_port_is_dummy ( ap ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											host - > ops  =  ap - > ops ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-08 13:09:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ap - > ops - > port_stop ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											have_stop  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( host - > ops - > host_stop ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										have_stop  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( have_stop )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										start_dr  =  devres_alloc ( ata_host_stop ,  0 ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! start_dr ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  host - > n_ports ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  ata_port  * ap  =  host - > ports [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ap - > ops - > port_start )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rc  =  ap - > ops - > port_start ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( rc )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-30 15:23:16 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( rc  ! =  - ENODEV ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-15 15:51:58 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													dev_err ( host - > dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														" failed to start port %d (errno=%d) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														i ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  err_out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_eh_freeze_port ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-08 13:09:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( start_dr ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										devres_add ( host - > dev ,  start_dr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									host - > flags  | =  ATA_HOST_STARTED ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 err_out : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( - - i  > =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  ata_port  * ap  =  host - > ports [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ap - > ops - > port_stop ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ap - > ops - > port_stop ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-08 13:09:00 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									devres_free ( start_dr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-08-07 14:27:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
									
										
										
										
											2012-07-09 21:06:08 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	ata_sas_host_init  -  Initialize  a  host  struct  for  sas  ( ipr ,  libsas ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ host : 	host  to  initialize 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ dev : 	device  host  is  attached  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ops : 	port_ops 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-07 14:27:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_host_init ( struct  ata_host  * host ,  struct  device  * dev ,  
						 
					
						
							
								
									
										
										
										
											2012-07-09 21:06:08 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										   struct  ata_port_operations  * ops ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-07 14:27:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock_init ( & host - > lock ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement cross-port EH exclusion
In libata, the non-EH code paths should always take and release
ap->lock explicitly when accessing hardware or shared data structures.
However, once EH is active, it's assumed that the port is owned by EH
and EH methods don't explicitly take ap->lock unless race from irq
handler or other code paths are expected.  However, libata EH didn't
guarantee exclusion among EHs for ports of the same host.  IOW,
multiple EHs may execute in parallel on multiple ports of the same
controller.
In many cases, especially in SATA, the ports are completely
independent of each other and this doesn't cause problems; however,
there are cases where different ports share the same resource, which
lead to obscure timing related bugs such as the one fixed by commit
213373cf (ata_piix: fix locking around SIDPR access).
This patch implements exclusion among EHs of the same host.  When EH
begins, it acquires per-host EH ownership by calling ata_eh_acquire().
When EH finishes, the ownership is released by calling
ata_eh_release().  EH ownership is also released whenever the EH
thread goes to sleep from ata_msleep() or explicitly and reacquired
after waking up.
This ensures that while EH is actively accessing the hardware, it has
exclusive access to it while allowing EHs to interleave and progress
in parallel as they hit waiting stages, which dominate the time spent
in EH.  This achieves cross-port EH exclusion without pervasive and
fragile changes while still allowing parallel EH for the most part.
This was first reported by yuanding02@gmail.com more than three years
ago in the following bugzilla.  :-)
  https://bugzilla.kernel.org/show_bug.cgi?id=8223
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Reported-by: yuanding02@gmail.com
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2010-09-06 17:57:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mutex_init ( & host - > eh_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-23 09:05:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									host - > n_tags  =  ATA_MAX_QUEUE  -  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									host - > dev  =  dev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									host - > ops  =  ops ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-07 14:27:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-01-18 20:47:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  __ata_port_probe ( struct  ata_port  * ap )  
						 
					
						
							
								
									
										
										
										
											2009-01-04 05:32:28 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-01-18 20:47:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_eh_info  * ehi  =  & ap - > link . eh_info ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  flags ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-09 15:54:07 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-01-18 20:47:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* kick EH for boot probing */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_lock_irqsave ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-04 05:32:28 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-01-18 20:47:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ehi - > probe_mask  | =  ATA_ALL_DEVICES ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ehi - > action  | =  ATA_EH_RESET ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ehi - > flags  | =  ATA_EHI_NO_AUTOPSY  |  ATA_EHI_QUIET ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-04 05:32:28 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-01-18 20:47:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > pflags  & =  ~ ATA_PFLAG_INITIALIZING ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ap - > pflags  | =  ATA_PFLAG_LOADING ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_port_schedule_eh ( ap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-04 05:32:28 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-01-18 20:47:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock_irqrestore ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2009-01-04 05:32:28 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-01-18 20:47:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_port_probe ( struct  ata_port  * ap )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-04 05:32:28 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-01-18 20:47:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > ops - > error_handler )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										__ata_port_probe ( ap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-04 05:32:28 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_port_wait_eh ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										DPRINTK ( " ata%u: bus probe begin \n " ,  ap - > print_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  ata_bus_probe ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										DPRINTK ( " ata%u: bus probe end \n " ,  ap - > print_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-23 08:28:33 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  async_port_probe ( void  * data ,  async_cookie_t  cookie )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_port  * ap  =  data ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-15 01:13:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-23 08:28:33 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  If  we ' re  not  allowed  to  scan  this  host  in  parallel , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  we  need  to  wait  until  all  previous  scans  have  completed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  before  going  further . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Jeff  Garzik  says  this  is  only  within  a  controller ,  so  we 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  don ' t  need  to  wait  for  port  0 ,  only  for  later  ports . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ( ap - > host - > flags  &  ATA_HOST_PARALLEL_SCAN )  & &  ap - > port_no  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										async_synchronize_cookie ( cookie ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									( void ) ata_port_probe ( ap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-05 15:07:07 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* in order to keep device order, we need to synchronize at this point */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									async_synchronize_cookie ( cookie ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_scsi_scan_host ( ap ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-04 05:32:28 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2011-01-23 08:28:33 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_host_register  -  register  initialized  ATA  host 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ host :  ATA  host  to  register 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ sht :  template  for  SCSI  host 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Register  initialized  ATA  host .   @ host  is  allocated  using 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_host_alloc ( )  and  fully  initialized  by  LLD .   This  function 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	starts  ports ,  registers  @ host  with  ATA  and  SCSI  layers  and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	probe  registered  devices . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  calling  layer  ( may  sleep ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - errno  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_host_register ( struct  ata_host  * host ,  struct  scsi_host_template  * sht )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  i ,  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-23 09:05:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									host - > n_tags  =  clamp ( sht - > can_queue ,  1 ,  ATA_MAX_QUEUE  -  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-12 12:08:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* host must have been started */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ( host - > flags  &  ATA_HOST_STARTED ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-15 15:51:58 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev_err ( host - > dev ,  " BUG: trying to register unstarted host \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										WARN_ON ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Blow away unused ports.  This happens when LLD can't
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  determine  the  exact  number  of  ports  to  allocate  at 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  allocation  time . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  host - > n_ports ;  host - > ports [ i ] ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kfree ( host - > ports [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* give ports names and add SCSI hosts */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-14 13:48:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  host - > n_ports ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-10 23:28:46 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										host - > ports [ i ] - > print_id  =  atomic_inc_return ( & ata_print_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-14 13:48:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										host - > ports [ i ] - > local_port_no  =  i  +  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-15 01:13:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 12:31:38 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Create associated sysfs transport objects  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  host - > n_ports ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  ata_tport_add ( host - > dev , host - > ports [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( rc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  err_tadd ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  ata_scsi_add_hosts ( host ,  sht ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 12:31:38 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  err_tadd ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* set cable, sata_spd_limit and report */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  host - > n_ports ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  ata_port  * ap  =  host - > ports [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										unsigned  long  xfer_mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* set SATA cable type if still unset */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ap - > cbl  = =  ATA_CBL_NONE  & &  ( ap - > flags  &  ATA_FLAG_SATA ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ap - > cbl  =  ATA_CBL_SATA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* init sata_spd_limit to the current value */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										sata_link_init_spd ( & ap - > link ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ap - > slave_link ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											sata_link_init_spd ( ap - > slave_link ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-18 13:14:55 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* print per-port info to dmesg */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										xfer_mask  =  ata_pack_xfermask ( ap - > pio_mask ,  ap - > mwdma_mask , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													      ap - > udma_mask ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-09 14:57:25 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ata_port_is_dummy ( ap ) )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_port_info ( ap ,  " %cATA max %s %s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      ( ap - > flags  &  ATA_FLAG_SATA )  ?  ' S '  :  ' P ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      ata_mode_string ( xfer_mask ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      ap - > link . eh_info . desc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-09 14:57:25 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_ehi_clear_desc ( & ap - > link . eh_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ata_port_info ( ap ,  " DUMMY \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-04-08 18:19:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* perform each probe asynchronously */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  host - > n_ports ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  ata_port  * ap  =  host - > ports [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-04 05:32:28 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										async_schedule ( async_port_probe ,  ap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 12:31:38 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 err_tadd : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( - - i  > =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_tport_delete ( host - > ports [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_host_activate  -  start  host ,  request  IRQ  and  register  it 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ host :  target  ATA  host 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ irq :  IRQ  to  request 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ irq_handler :  irq_handler  used  when  requesting  IRQ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ irq_flags :  irq_flags  used  when  requesting  IRQ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ sht :  scsi_host_template  to  use  when  registering  the  host 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	After  allocating  an  ATA  host  and  initializing  it ,  most  libata 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LLDs  perform  three  steps  to  activate  the  host  -  start  host , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	request  IRQ  and  register  it .   This  helper  takes  necessasry 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	arguments  and  performs  the  three  steps  in  one  go . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-08 11:14:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	An  invalid  IRQ  skips  the  IRQ  registration  and  expects  the  host  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	have  set  polling  mode  on  the  port .  In  this  case ,  @ irq_handler 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	should  be  NULL . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  calling  layer  ( may  sleep ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	0  on  success ,  - errno  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_host_activate ( struct  ata_host  * host ,  int  irq ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										      irq_handler_t  irq_handler ,  unsigned  long  irq_flags , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										      struct  scsi_host_template  * sht ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-08-18 13:14:55 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  i ,  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-06 21:56:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									char  * irq_desc ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  ata_host_start ( host ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-08 11:14:56 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Special case for polling mode */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! irq )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										WARN_ON ( irq_handler ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ata_host_register ( host ,  sht ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-06 21:56:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									irq_desc  =  devm_kasprintf ( host - > dev ,  GFP_KERNEL ,  " %s[%s] " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												  dev_driver_string ( host - > dev ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												  dev_name ( host - > dev ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! irq_desc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  devm_request_irq ( host - > dev ,  irq ,  irq_handler ,  irq_flags , 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-06 21:56:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											      irq_desc ,  host ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-18 13:14:55 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  host - > n_ports ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_port_desc ( host - > ports [ i ] ,  " irq %d " ,  irq ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-03 01:38:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  ata_host_register ( host ,  sht ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* if failed, just free the IRQ and leave ports alone */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										devm_free_irq ( host - > dev ,  irq ,  host ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_port_detach  -  Detach  ATA  port  in  prepration  of  device  removal 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ap :  ATA  port  to  be  detached 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Detach  all  ATA  devices  and  the  associated  SCSI  devices  of  @ ap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	then ,  remove  the  associated  SCSI  host .   @ ap  is  guaranteed  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	be  quiescent  on  return  from  this  function . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-10-24 18:23:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  ata_port_detach ( struct  ata_port  * ap )  
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  flags ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-06 15:57:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_link  * link ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_device  * dev ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ap - > ops - > error_handler ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-05 03:59:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  skip_eh ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* tell EH we're leaving & flush EH */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-22 23:46:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock_irqsave ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-29 01:29:30 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ap - > pflags  | =  ATA_PFLAG_UNLOADING ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:04:37 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_schedule_eh ( ap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-22 23:46:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock_irqrestore ( ap - > lock ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:04:37 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* wait till EH commits suicide */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_port_wait_eh ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:04:37 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* it better be dead now */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WARN_ON ( ! ( ap - > pflags  &  ATA_PFLAG_UNLOADED ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-14 16:21:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cancel_delayed_work_sync ( & ap - > hotplug_task ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-08-05 03:59:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 skip_eh : 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-06 15:57:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* clean up zpodd on port removal */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_for_each_link ( link ,  ap ,  HOST_FIRST )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_for_each_dev ( dev ,  link ,  ALL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( zpodd_dev_enabled ( dev ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												zpodd_exit ( dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 12:31:38 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ap - > pmp_link )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( i  =  0 ;  i  <  SATA_PMP_MAX_PORTS ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ata_tlink_delete ( & ap - > pmp_link [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* remove the associated SCSI host */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									scsi_remove_host ( ap - > scsi_host ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 13:19:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_tport_delete ( ap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-01-20 16:00:26 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_host_detach  -  Detach  all  ports  of  an  ATA  host 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ host :  Host  to  detach 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Detach  all  ports  of  @ host . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  ata_host_detach ( struct  ata_host  * host )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  host - > n_ports ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_port_detach ( host - > ports [ i ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-12-15 15:05:01 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* the host is dead now, dissociate ACPI */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_acpi_dissociate ( host ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-20 16:00:26 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-08-30 05:42:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_PCI 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_pci_remove_one  -  PCI  layer  callback  for  device  removal 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ pdev :  PCI  device  that  was  removed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-20 16:00:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	PCI  layer  indicates  to  libata  via  this  hook  that  hot - unplug  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	module  unload  event  has  occurred .   Detach  all  ports .   Resource 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	release  is  handled  via  devres . 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  PCI  layer  ( may  sleep ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-20 16:00:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_pci_remove_one ( struct  pci_dev  * pdev )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-12-03 10:34:41 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_host  * host  =  pci_get_drvdata ( pdev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-01-20 16:00:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_host_detach ( host ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* move to PCI subsystem */  
						 
					
						
							
								
									
										
										
										
											2005-10-22 14:27:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  pci_test_config_bits ( struct  pci_dev  * pdev ,  const  struct  pci_bits  * bits )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  tmp  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( bits - > width )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  1 :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										u8  tmp8  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pci_read_config_byte ( pdev ,  bits - > reg ,  & tmp8 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tmp  =  tmp8 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  2 :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										u16  tmp16  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pci_read_config_word ( pdev ,  bits - > reg ,  & tmp16 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tmp  =  tmp16 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  4 :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										u32  tmp32  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pci_read_config_dword ( pdev ,  bits - > reg ,  & tmp32 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tmp  =  tmp32 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tmp  & =  bits - > mask ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ( tmp  = =  bits - > val )  ?  1  :  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:28:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-03-02 17:32:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_PM 
  
						 
					
						
							
								
									
										
										
										
											2006-07-26 16:58:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_pci_device_do_suspend ( struct  pci_dev  * pdev ,  pm_message_t  mesg )  
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:28:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pci_save_state ( pdev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-20 18:14:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pci_disable_device ( pdev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-02-23 19:13:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( mesg . event  &  PM_EVENT_SLEEP ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pci_set_power_state ( pdev ,  PCI_D3hot ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:28:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-12-26 19:39:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_pci_device_do_resume ( struct  pci_dev  * pdev )  
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:28:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-12-26 19:39:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:28:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pci_set_power_state ( pdev ,  PCI_D0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pci_restore_state ( pdev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-26 19:39:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-01-20 16:00:28 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  pcim_enable_device ( pdev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-26 19:39:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-15 15:51:58 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										dev_err ( & pdev - > dev , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" failed to enable device after resume (%d) \n " ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-26 19:39:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:28:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pci_set_master ( pdev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-26 19:39:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-07-26 16:58:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  ata_pci_device_suspend ( struct  pci_dev  * pdev ,  pm_message_t  mesg )  
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-12-03 10:34:41 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_host  * host  =  pci_get_drvdata ( pdev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  ata_host_suspend ( host ,  mesg ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-07-26 16:58:33 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_pci_device_do_suspend ( pdev ,  mesg ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_pci_device_resume ( struct  pci_dev  * pdev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-12-03 10:34:41 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ata_host  * host  =  pci_get_drvdata ( pdev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-26 19:39:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-12-26 19:39:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  ata_pci_device_do_resume ( pdev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc  = =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_host_resume ( host ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:28:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2007-03-02 17:32:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  /* CONFIG_PM */ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# endif  /* CONFIG_PCI */ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-11-02 12:29:32 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_platform_remove_one  -  Platform  layer  callback  for  device  removal 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ pdev :  Platform  device  that  was  removed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Platform  layer  indicates  to  libata  via  this  hook  that  hot - unplug  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	module  unload  event  has  occurred .   Detach  all  ports .   Resource 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	release  is  handled  via  devres . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Inherited  from  platform  layer  ( may  sleep ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_platform_remove_one ( struct  platform_device  * pdev )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  ata_host  * host  =  platform_get_drvdata ( pdev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_host_detach ( host ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  __init  ata_parse_force_one ( char  * * cur ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      struct  ata_force_ent  * force_ent , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      const  char  * * reason ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2015-06-09 15:33:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  const  struct  ata_force_param  force_tbl [ ]  __initconst  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{  " 40c " , 	. cbl 		=  ATA_CBL_PATA40  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " 80c " , 	. cbl 		=  ATA_CBL_PATA80  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " short40c " , 	. cbl 		=  ATA_CBL_PATA40_SHORT  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " unk " , 	. cbl 		=  ATA_CBL_PATA_UNK  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " ign " , 	. cbl 		=  ATA_CBL_PATA_IGN  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " sata " , 	. cbl 		=  ATA_CBL_SATA  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " 1.5Gbps " , 	. spd_limit 	=  1  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " 3.0Gbps " , 	. spd_limit 	=  2  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " noncq " , 	. horkage_on 	=  ATA_HORKAGE_NONCQ  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " ncq " , 	. horkage_off 	=  ATA_HORKAGE_NONCQ  } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-04 21:54:18 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{  " noncqtrim " , 	. horkage_on 	=  ATA_HORKAGE_NO_NCQ_TRIM  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " ncqtrim " , 	. horkage_off 	=  ATA_HORKAGE_NO_NCQ_TRIM  } , 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-23 12:59:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{  " dump_id " , 	. horkage_on 	=  ATA_HORKAGE_DUMP_ID  } , 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{  " pio0 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_PIO  +  0 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " pio1 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_PIO  +  1 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " pio2 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_PIO  +  2 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " pio3 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_PIO  +  3 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " pio4 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_PIO  +  4 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " pio5 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_PIO  +  5 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " pio6 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_PIO  +  6 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " mwdma0 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_MWDMA  +  0 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " mwdma1 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_MWDMA  +  1 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " mwdma2 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_MWDMA  +  2 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " mwdma3 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_MWDMA  +  3 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " mwdma4 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_MWDMA  +  4 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma0 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  0 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma16 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  0 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma/16 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  0 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma1 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  1 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma25 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  1 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma/25 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  1 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma2 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  2 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma33 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  2 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma/33 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  2 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma3 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  3 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma44 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  3 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma/44 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  3 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma4 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  4 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma66 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  4 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma/66 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  4 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma5 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  5 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma100 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  5 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma/100 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  5 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma6 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  6 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma133 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  6 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma/133 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  6 )  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " udma7 " , 	. xfer_mask 	=  1  < <  ( ATA_SHIFT_UDMA  +  7 )  } , 
							 
						 
					
						
							
								
									
										
										
										
											2008-08-13 20:19:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{  " nohrst " , 	. lflags 		=  ATA_LFLAG_NO_HRST  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " nosrst " , 	. lflags 		=  ATA_LFLAG_NO_SRST  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  " norst " , 	. lflags 		=  ATA_LFLAG_NO_HRST  |  ATA_LFLAG_NO_SRST  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:41:41 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{  " rstonce " , 	. lflags 		=  ATA_LFLAG_RST_ONCE  } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-21 22:30:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{  " atapi_dmadir " ,  . horkage_on 	=  ATA_HORKAGE_ATAPI_DMADIR  } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 09:31:19 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{  " disable " , 	. horkage_on 	=  ATA_HORKAGE_DISABLE  } , 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * start  =  * cur ,  * p  =  * cur ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * id ,  * val ,  * endp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  struct  ata_force_param  * match_fp  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  nr_matches  =  0 ,  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* find where this param ends and update *cur */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( * p  ! =  ' \0 '  & &  * p  ! =  ' , ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( * p  = =  ' \0 ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* cur  =  p ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* cur  =  p  +  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									* p  =  ' \0 ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* parse */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p  =  strchr ( start ,  ' : ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! p )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										val  =  strstrip ( start ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  parse_val ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									* p  =  ' \0 ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									id  =  strstrip ( start ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									val  =  strstrip ( p  +  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* parse id */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p  =  strchr ( id ,  ' . ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* p + +  =  ' \0 ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										force_ent - > device  =  simple_strtoul ( p ,  & endp ,  10 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( p  = =  endp  | |  * endp  ! =  ' \0 ' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											* reason  =  " invalid device " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									force_ent - > port  =  simple_strtoul ( id ,  & endp ,  10 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p  = =  endp  | |  * endp  ! =  ' \0 ' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* reason  =  " invalid port/link " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 parse_val : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* parse val, allow shortcuts so that both 1.5 and 1.5Gbps work */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  ARRAY_SIZE ( force_tbl ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  struct  ata_force_param  * fp  =  & force_tbl [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( strncasecmp ( val ,  fp - > name ,  strlen ( val ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										nr_matches + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										match_fp  =  fp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( strcasecmp ( val ,  fp - > name )  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nr_matches  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! nr_matches )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* reason  =  " unknown value " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( nr_matches  >  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* reason  =  " ambigious value " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									force_ent - > param  =  * match_fp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  __init  ata_parse_force_param ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  idx  =  0 ,  size  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  last_port  =  - 1 ,  last_device  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * p ,  * cur ,  * next ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* calculate maximum number of params and allocate force_tbl */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( p  =  ata_force_param_buf ;  * p ;  p + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( * p  = =  ' , ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											size + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_force_tbl  =  kzalloc ( sizeof ( ata_force_tbl [ 0 ] )  *  size ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ata_force_tbl )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										printk ( KERN_WARNING  " ata: failed to extend force table,  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										       " libata.force ignored \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* parse and populate the table */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( cur  =  ata_force_param_buf ;  * cur  ! =  ' \0 ' ;  cur  =  next )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  char  * reason  =  " " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  ata_force_ent  te  =  {  . port  =  - 1 ,  . device  =  - 1  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										next  =  cur ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ata_parse_force_one ( & next ,  & te ,  & reason ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											printk ( KERN_WARNING  " ata: failed to parse force  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											       " parameter  \" %s \"  (%s) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											       cur ,  reason ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( te . port  = =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											te . port  =  last_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											te . device  =  last_device ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_force_tbl [ idx + + ]  =  te ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										last_port  =  te . port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										last_device  =  te . device ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_force_tbl_size  =  idx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  __init  ata_init ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-05-25 12:31:38 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-10 21:41:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_parse_force_param ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-05-10 21:41:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  ata_sff_init ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-02 10:03:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kfree ( ata_force_tbl ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:27:42 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 12:31:38 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									libata_transport_init ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ata_scsi_transport_template  =  ata_attach_transport ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ata_scsi_transport_template )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_sff_exit ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  err_out ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-15 01:13:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 12:31:38 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									printk ( KERN_DEBUG  " libata version  "  DRV_VERSION  "  loaded. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 12:31:38 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								err_out :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  __exit  ata_exit ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-05-25 12:31:38 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_release_transport ( ata_scsi_transport_template ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									libata_transport_exit ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-10 21:41:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ata_sff_exit ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-13 09:15:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( ata_force_tbl ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-11-13 16:32:36 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								subsys_initcall ( ata_init ) ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								module_exit ( ata_exit ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-12 21:11:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  DEFINE_RATELIMIT_STATE ( ratelimit ,  HZ  /  5 ,  1 ) ;  
						 
					
						
							
								
									
										
										
										
											2005-10-05 02:58:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  ata_ratelimit ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-04-12 21:11:41 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  __ratelimit ( & ratelimit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-05 02:58:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement cross-port EH exclusion
In libata, the non-EH code paths should always take and release
ap->lock explicitly when accessing hardware or shared data structures.
However, once EH is active, it's assumed that the port is owned by EH
and EH methods don't explicitly take ap->lock unless race from irq
handler or other code paths are expected.  However, libata EH didn't
guarantee exclusion among EHs for ports of the same host.  IOW,
multiple EHs may execute in parallel on multiple ports of the same
controller.
In many cases, especially in SATA, the ports are completely
independent of each other and this doesn't cause problems; however,
there are cases where different ports share the same resource, which
lead to obscure timing related bugs such as the one fixed by commit
213373cf (ata_piix: fix locking around SIDPR access).
This patch implements exclusion among EHs of the same host.  When EH
begins, it acquires per-host EH ownership by calling ata_eh_acquire().
When EH finishes, the ownership is released by calling
ata_eh_release().  EH ownership is also released whenever the EH
thread goes to sleep from ata_msleep() or explicitly and reacquired
after waking up.
This ensures that while EH is actively accessing the hardware, it has
exclusive access to it while allowing EHs to interleave and progress
in parallel as they hit waiting stages, which dominate the time spent
in EH.  This achieves cross-port EH exclusion without pervasive and
fragile changes while still allowing parallel EH for the most part.
This was first reported by yuanding02@gmail.com more than three years
ago in the following bugzilla.  :-)
  https://bugzilla.kernel.org/show_bug.cgi?id=8223
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Reported-by: yuanding02@gmail.com
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2010-09-06 17:57:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_msleep  -  ATA  EH  owner  aware  msleep 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ap :  ATA  port  to  attribute  the  sleep  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ msecs :  duration  to  sleep  in  milliseconds 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Sleeps  @ msecs .   If  the  current  task  is  owner  of  @ ap ' s  EH ,  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ownership  is  released  before  going  to  sleep  and  reacquired 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	after  the  sleep  is  complete .   IOW ,  other  ports  sharing  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ ap - > host  will  be  allowed  to  own  the  EH  while  this  task  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	sleeping . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Might  sleep . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-06 17:56:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_msleep ( struct  ata_port  * ap ,  unsigned  int  msecs )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
											 
										
											
												libata: implement cross-port EH exclusion
In libata, the non-EH code paths should always take and release
ap->lock explicitly when accessing hardware or shared data structures.
However, once EH is active, it's assumed that the port is owned by EH
and EH methods don't explicitly take ap->lock unless race from irq
handler or other code paths are expected.  However, libata EH didn't
guarantee exclusion among EHs for ports of the same host.  IOW,
multiple EHs may execute in parallel on multiple ports of the same
controller.
In many cases, especially in SATA, the ports are completely
independent of each other and this doesn't cause problems; however,
there are cases where different ports share the same resource, which
lead to obscure timing related bugs such as the one fixed by commit
213373cf (ata_piix: fix locking around SIDPR access).
This patch implements exclusion among EHs of the same host.  When EH
begins, it acquires per-host EH ownership by calling ata_eh_acquire().
When EH finishes, the ownership is released by calling
ata_eh_release().  EH ownership is also released whenever the EH
thread goes to sleep from ata_msleep() or explicitly and reacquired
after waking up.
This ensures that while EH is actively accessing the hardware, it has
exclusive access to it while allowing EHs to interleave and progress
in parallel as they hit waiting stages, which dominate the time spent
in EH.  This achieves cross-port EH exclusion without pervasive and
fragile changes while still allowing parallel EH for the most part.
This was first reported by yuanding02@gmail.com more than three years
ago in the following bugzilla.  :-)
  https://bugzilla.kernel.org/show_bug.cgi?id=8223
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Reported-by: yuanding02@gmail.com
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2010-09-06 17:57:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  owns_eh  =  ap  & &  ap - > host - > eh_owner  = =  current ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( owns_eh ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_eh_release ( ap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-07 21:18:52 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( msecs  <  20 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										unsigned  long  usecs  =  msecs  *  USEC_PER_MSEC ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										usleep_range ( usecs ,  usecs  +  50 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										msleep ( msecs ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement cross-port EH exclusion
In libata, the non-EH code paths should always take and release
ap->lock explicitly when accessing hardware or shared data structures.
However, once EH is active, it's assumed that the port is owned by EH
and EH methods don't explicitly take ap->lock unless race from irq
handler or other code paths are expected.  However, libata EH didn't
guarantee exclusion among EHs for ports of the same host.  IOW,
multiple EHs may execute in parallel on multiple ports of the same
controller.
In many cases, especially in SATA, the ports are completely
independent of each other and this doesn't cause problems; however,
there are cases where different ports share the same resource, which
lead to obscure timing related bugs such as the one fixed by commit
213373cf (ata_piix: fix locking around SIDPR access).
This patch implements exclusion among EHs of the same host.  When EH
begins, it acquires per-host EH ownership by calling ata_eh_acquire().
When EH finishes, the ownership is released by calling
ata_eh_release().  EH ownership is also released whenever the EH
thread goes to sleep from ata_msleep() or explicitly and reacquired
after waking up.
This ensures that while EH is actively accessing the hardware, it has
exclusive access to it while allowing EHs to interleave and progress
in parallel as they hit waiting stages, which dominate the time spent
in EH.  This achieves cross-port EH exclusion without pervasive and
fragile changes while still allowing parallel EH for the most part.
This was first reported by yuanding02@gmail.com more than three years
ago in the following bugzilla.  :-)
  https://bugzilla.kernel.org/show_bug.cgi?id=8223
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Reported-by: yuanding02@gmail.com
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2010-09-06 17:57:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( owns_eh ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ata_eh_acquire ( ap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-06 17:56:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-04-11 22:22:29 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	ata_wait_register  -  wait  until  register  value  changes 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-06 17:56:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ ap :  ATA  port  to  wait  register  for ,  can  be  NULL 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-11 22:22:29 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ reg :  IO - mapped  register 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ mask :  Mask  to  apply  to  read  register  value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ val :  Wait  condition 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-20 02:17:51 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 	@ interval :  polling  interval  in  milliseconds 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ timeout :  timeout  in  milliseconds 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-11 22:22:29 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Waiting  for  some  bits  of  register  to  change  is  a  common 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	operation  for  ATA  controllers .   This  function  reads  32 bit  LE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	IO - mapped  register  @ reg  and  tests  for  the  following  condition . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	( * @ reg  &  mask )  ! =  val 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	If  the  condition  is  met ,  it  returns ;  otherwise ,  the  process  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	repeated  after  @ interval_msec  until  timeout . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Kernel  thread  context  ( may  sleep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	The  final  register  value . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-06 17:56:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								u32  ata_wait_register ( struct  ata_port  * ap ,  void  __iomem  * reg ,  u32  mask ,  u32  val ,  
						 
					
						
							
								
									
										
										
										
											2008-05-20 02:17:51 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										      unsigned  long  interval ,  unsigned  long  timeout ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-11 22:22:29 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-05-20 02:17:51 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  deadline ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-11 22:22:29 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									u32  tmp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tmp  =  ioread32 ( reg ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Calculate timeout _after_ the first read to make sure
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  preceding  writes  reach  the  controller  before  starting  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  eat  away  the  timeout . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-20 02:17:51 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									deadline  =  ata_deadline ( jiffies ,  timeout ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-11 22:22:29 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-05-20 02:17:51 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									while  ( ( tmp  &  mask )  = =  val  & &  time_before ( jiffies ,  deadline ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-06 17:56:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ata_msleep ( ap ,  interval ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-04-11 22:22:29 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tmp  =  ioread32 ( reg ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  tmp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-25 19:52:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	sata_lpm_ignore_phy_events  -  test  if  PHY  event  should  be  ignored 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	@ link :  Link  receiving  the  event 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	Test  whether  the  received  PHY  event  has  to  be  ignored  or  not . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	LOCKING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	RETURNS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 	True  if  the  event  has  to  be  ignored . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  sata_lpm_ignore_phy_events ( struct  ata_link  * link )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2015-04-25 19:52:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  lpm_timeout  =  link - > last_lpm_change  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												    msecs_to_jiffies ( ATA_TMOUT_SPURIOUS_PHY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-25 19:52:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* if LPM is enabled, PHYRDY doesn't mean anything */ 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-25 19:52:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( link - > lpm_policy  >  ATA_LPM_MAX_POWER ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* ignore the first PHY event after the LPM policy changed
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  as  it  is  might  be  spurious 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ( link - > flags  &  ATA_LFLAG_CHANGED )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    time_before ( jiffies ,  lpm_timeout ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-25 19:52:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_lpm_ignore_phy_events ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 16:59:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Dummy  port_ops 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  unsigned  int  ata_dummy_qc_issue ( struct  ata_queued_cmd  * qc )  
						 
					
						
							
								
									
										
										
										
											2006-08-10 16:59:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  AC_ERR_SYSTEM ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 16:59:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  ata_dummy_error_handler ( struct  ata_port  * ap )  
						 
					
						
							
								
									
										
										
										
											2006-08-10 16:59:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* truly dummy */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 16:59:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												libata: implement and use ops inheritance
libata lets low level drivers build ata_port_operations table and
register it with libata core layer.  This allows low level drivers
high level of flexibility but also burdens them with lots of
boilerplate entries.
This becomes worse for drivers which support related similar
controllers which differ slightly.  They share most of the operations
except for a few.  However, the driver still needs to list all
operations for each variant.  This results in large number of
duplicate entries, which is not only inefficient but also error-prone
as it becomes very difficult to tell what the actual differences are.
This duplicate boilerplates all over the low level drivers also make
updating the core layer exteremely difficult and error-prone.  When
compounded with multi-branched development model, it ends up
accumulating inconsistencies over time.  Some of those inconsistencies
cause immediate problems and fixed.  Others just remain there dormant
making maintenance increasingly difficult.
To rectify the problem, this patch implements ata_port_operations
inheritance.  To allow LLDs to easily re-use their own ops tables
overriding only specific methods, this patch implements poor man's
class inheritance.  An ops table has ->inherits field which can be set
to any ops table as long as it doesn't create a loop.  When the host
is started, the inheritance chain is followed and any operation which
isn't specified is taken from the nearest ancestor which has it
specified.  This operation is called finalization and done only once
per an ops table and the LLD doesn't have to do anything special about
it other than making the ops table non-const such that libata can
update it.
libata provides four base ops tables lower drivers can inherit from -
base, sata, pmp, sff and bmdma.  To avoid overriding these ops
accidentaly, these ops are declared const and LLDs should always
inherit these instead of using them directly.
After finalization, all the ops table are identical before and after
the patch except for setting .irq_handler to ata_interrupt in drivers
which didn't use to.  The .irq_handler doesn't have any actual effect
and the field will soon be removed by later patch.
* sata_sx4 is still using old style EH and currently doesn't take
  advantage of ops inheritance.
Signed-off-by: Tejun Heo <htejun@gmail.com>
											 
										 
										
											2008-03-25 12:22:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  ata_port_operations  ata_dummy_port_ops  =  {  
						 
					
						
							
								
									
										
										
										
											2006-08-10 16:59:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									. qc_prep 		=  ata_noop_qc_prep , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. qc_issue 		=  ata_dummy_qc_issue , 
							 
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:21 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									. error_handler 		=  ata_dummy_error_handler , 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-21 23:25:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									. sched_eh 		=  ata_std_sched_eh , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. end_eh 			=  ata_std_end_eh , 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-10 16:59:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  struct  ata_port_info  ata_dummy_port_info  =  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									. port_ops 		=  & ata_dummy_port_ops , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Utility  print  functions 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 09:52:18 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_port_printk ( const  struct  ata_port  * ap ,  const  char  * level ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										     const  char  * fmt ,  . . . ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  va_format  vaf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									va_list  args ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									va_start ( args ,  fmt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vaf . fmt  =  fmt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vaf . va  =  & args ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 09:52:18 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									printk ( " %sata%u: %pV " ,  level ,  ap - > print_id ,  & vaf ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									va_end ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( ata_port_printk ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 09:52:18 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_link_printk ( const  struct  ata_link  * link ,  const  char  * level ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										     const  char  * fmt ,  . . . ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  va_format  vaf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									va_list  args ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									va_start ( args ,  fmt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vaf . fmt  =  fmt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vaf . va  =  & args ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( sata_pmp_attached ( link - > ap )  | |  link - > ap - > slave_link ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 09:52:18 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										printk ( " %sata%u.%02u: %pV " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										       level ,  link - > ap - > print_id ,  link - > pmp ,  & vaf ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 09:52:18 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										printk ( " %sata%u: %pV " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										       level ,  link - > ap - > print_id ,  & vaf ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									va_end ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( ata_link_printk ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 09:52:18 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_dev_printk ( const  struct  ata_device  * dev ,  const  char  * level ,  
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										    const  char  * fmt ,  . . . ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  va_format  vaf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									va_list  args ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									va_start ( args ,  fmt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vaf . fmt  =  fmt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vaf . va  =  & args ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 09:52:18 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									printk ( " %sata%u.%02u: %pV " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									       level ,  dev - > link - > ap - > print_id ,  dev - > link - > pmp  +  dev - > devno , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									       & vaf ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
 #define ata_link_printk(link, lv, fmt, args...) do { \
       if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)    \
               printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                      (link)->pmp , ##args); \
       else \
               printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
       } while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
   text	   data	    bss	    dec	    hex	filename
 544969	  73893	 116584	 735446	  b38d6	drivers/ata/built-in.allyesconfig.ata.o
 558429	  73893	 117864	 750186	  b726a	drivers/ata/built-in.allyesconfig.dev_level.o
 141328	  14689	   4220	 160237	  271ed	drivers/ata/built-in.defconfig.ata.o
 149567	  14689	   4220	 168476	  2921c	drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
											 
										 
										
											2011-04-15 15:51:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									va_end ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( ata_dev_printk ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-04-15 15:52:00 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ata_print_version ( const  struct  device  * dev ,  const  char  * version )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dev_printk ( KERN_DEBUG ,  dev ,  " version %s \n " ,  version ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( ata_print_version ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  libata  is  essentially  a  library  of  internal  helper  functions  for 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  low - level  ATA  host  controller  drivers .   As  such ,  the  API / ABI  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  likely  to  change  as  new  drivers  are  added  and  updated . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Do  not  depend  on  ABI / API  stability . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:26 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_deb_timing_normal ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_deb_timing_hotplug ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_deb_timing_long ) ;  
						 
					
						
							
								
									
										
											 
										
											
												libata: implement and use ops inheritance
libata lets low level drivers build ata_port_operations table and
register it with libata core layer.  This allows low level drivers
high level of flexibility but also burdens them with lots of
boilerplate entries.
This becomes worse for drivers which support related similar
controllers which differ slightly.  They share most of the operations
except for a few.  However, the driver still needs to list all
operations for each variant.  This results in large number of
duplicate entries, which is not only inefficient but also error-prone
as it becomes very difficult to tell what the actual differences are.
This duplicate boilerplates all over the low level drivers also make
updating the core layer exteremely difficult and error-prone.  When
compounded with multi-branched development model, it ends up
accumulating inconsistencies over time.  Some of those inconsistencies
cause immediate problems and fixed.  Others just remain there dormant
making maintenance increasingly difficult.
To rectify the problem, this patch implements ata_port_operations
inheritance.  To allow LLDs to easily re-use their own ops tables
overriding only specific methods, this patch implements poor man's
class inheritance.  An ops table has ->inherits field which can be set
to any ops table as long as it doesn't create a loop.  When the host
is started, the inheritance chain is followed and any operation which
isn't specified is taken from the nearest ancestor which has it
specified.  This operation is called finalization and done only once
per an ops table and the LLD doesn't have to do anything special about
it other than making the ops table non-const such that libata can
update it.
libata provides four base ops tables lower drivers can inherit from -
base, sata, pmp, sff and bmdma.  To avoid overriding these ops
accidentaly, these ops are declared const and LLDs should always
inherit these instead of using them directly.
After finalization, all the ops table are identical before and after
the patch except for setting .irq_handler to ata_interrupt in drivers
which didn't use to.  The .irq_handler doesn't have any actual effect
and the field will soon be removed by later patch.
* sata_sx4 is still using old style EH and currently doesn't take
  advantage of ops inheritance.
Signed-off-by: Tejun Heo <htejun@gmail.com>
											 
										 
										
											2008-03-25 12:22:49 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_base_port_ops ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_port_ops ) ;  
						 
					
						
							
								
									
										
										
										
											2006-08-10 16:59:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_dummy_port_ops ) ;  
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_dummy_port_info ) ;  
						 
					
						
							
								
									
										
										
										
											2008-11-03 20:03:17 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_link_next ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_dev_next ) ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_std_bios_param ) ;  
						 
					
						
							
								
									
										
										
										
											2010-05-15 20:09:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_scsi_unlock_native_capacity ) ;  
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_host_init ) ;  
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_host_alloc ) ;  
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_host_alloc_pinfo ) ;  
						 
					
						
							
								
									
										
											 
										
											
												libata: implement slave_link
Explanation taken from the comment of ata_slave_link_init().
 In libata, a port contains links and a link contains devices.  There
 is single host link but if a PMP is attached to it, there can be
 multiple fan-out links.  On SATA, there's usually a single device
 connected to a link but PATA and SATA controllers emulating TF based
 interface can have two - master and slave.
 However, there are a few controllers which don't fit into this
 abstraction too well - SATA controllers which emulate TF interface
 with both master and slave devices but also have separate SCR
 register sets for each device.  These controllers need separate links
 for physical link handling (e.g. onlineness, link speed) but should
 be treated like a traditional M/S controller for everything else
 (e.g. command issue, softreset).
 slave_link is libata's way of handling this class of controllers
 without impacting core layer too much.  For anything other than
 physical link handling, the default host link is used for both master
 and slave.  For physical link handling, separate @ap->slave_link is
 used.  All dirty details are implemented inside libata core layer.
 From LLD's POV, the only difference is that prereset, hardreset and
 postreset are called once more for the slave link, so the reset
 sequence looks like the following.
 prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
 softreset(M) -> postreset(M) -> postreset(S)
 Note that softreset is called only for the master.  Softreset resets
 both M/S by definition, so SRST on master should handle both (the
 standard method will work just fine).
As slave_link excludes PMP support and only code paths which deal with
the attributes of physical link are affected, all the changes are
localized to libata.h, libata-core.c and libata-eh.c.
 * ata_is_host_link() updated so that slave_link is considered as host
   link too.
 * iterator extended to iterate over the slave_link when using the
   underbarred version.
 * force param handling updated such that devno 16 is mapped to the
   slave link/device.
 * ata_link_on/offline() updated to return the combined result from
   master and slave link.  ata_phys_link_on/offline() are the direct
   versions.
 * EH autopsy and report are performed separately for master slave
   links.  Reset is udpated to implement the above described reset
   sequence.
Except for reset update, most changes are minor, many of them just
modifying dev->link to ata_dev_phys_link(dev) or using phys online
test instead.
After this update, LLDs can take full advantage of per-dev SCR
registers by simply turning on slave link.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
											 
										 
										
											2008-07-31 17:02:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_slave_link_init ) ;  
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:06 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_host_start ) ;  
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_host_register ) ;  
						 
					
						
							
								
									
										
										
										
											2007-04-17 23:44:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_host_activate ) ;  
						 
					
						
							
								
									
										
										
										
											2007-01-20 16:00:26 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_host_detach ) ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_sg_init ) ;  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_qc_complete ) ;  
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:43 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_qc_complete_multiple ) ;  
						 
					
						
							
								
									
										
										
										
											2008-04-02 17:28:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( atapi_cmd_type ) ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_tf_to_fis ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_tf_from_fis ) ;  
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:39 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_pack_xfermask ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_unpack_xfermask ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_xfer_mask2mode ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_xfer_mode2mask ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_xfer_mode2shift ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_mode_string ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_id_xfermask ) ;  
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:52 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_do_set_mode ) ;  
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:12 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_std_qc_defer ) ;  
						 
					
						
							
								
									
										
										
										
											2006-03-17 17:04:03 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_noop_qc_prep ) ;  
						 
					
						
							
								
									
										
										
										
											2007-02-20 18:01:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_dev_disable ) ;  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_set_spd ) ;  
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_wait_after_reset ) ;  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_link_debounce ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_link_resume ) ;  
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:50:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_link_scr_lpm ) ;  
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_std_prereset ) ;  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_link_hardreset ) ;  
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:19 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_std_hardreset ) ;  
						 
					
						
							
								
									
										
										
										
											2008-04-07 22:47:18 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_std_postreset ) ;  
						 
					
						
							
								
									
										
										
										
											2006-03-24 09:56:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_dev_classify ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_dev_pair ) ;  
						 
					
						
							
								
									
										
										
										
											2005-10-05 02:58:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_ratelimit ) ;  
						 
					
						
							
								
									
										
										
										
											2010-09-06 17:56:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_msleep ) ;  
						 
					
						
							
								
									
										
										
										
											2006-04-11 22:22:29 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_wait_register ) ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_scsi_queuecmd ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_scsi_slave_config ) ;  
						 
					
						
							
								
									
										
										
										
											2006-05-31 18:28:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_scsi_slave_destroy ) ;  
						 
					
						
							
								
									
										
										
										
											2006-05-15 21:03:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_scsi_change_queue_depth ) ;  
						 
					
						
							
								
									
										
										
										
											2011-09-20 15:10:33 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( __ata_change_queue_depth ) ;  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:57:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_scr_valid ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_scr_read ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_scr_write ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_scr_write_flush ) ;  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_link_online ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_link_offline ) ;  
						 
					
						
							
								
									
										
										
										
											2007-03-02 17:32:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_PM 
  
						 
					
						
							
								
									
										
										
										
											2006-08-24 03:19:22 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_host_suspend ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_host_resume ) ;  
						 
					
						
							
								
									
										
										
										
											2007-03-02 17:32:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  /* CONFIG_PM */ 
  
						 
					
						
							
								
									
										
										
										
											2006-02-13 10:02:46 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_id_string ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_id_c_string ) ;  
						 
					
						
							
								
									
										
										
										
											2008-07-24 17:16:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_do_dev_read_id ) ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_scsi_simulate ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-09 17:18:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_pio_need_iordy ) ;  
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:39 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_timing_find_mode ) ;  
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_timing_compute ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_timing_merge ) ;  
						 
					
						
							
								
									
										
										
										
											2007-12-18 16:33:05 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_timing_cycle2mode ) ;  
						 
					
						
							
								
									
										
										
										
											2005-10-21 19:01:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# ifdef CONFIG_PCI 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( pci_test_config_bits ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_pci_remove_one ) ;  
						 
					
						
							
								
									
										
										
										
											2007-03-02 17:32:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_PM 
  
						 
					
						
							
								
									
										
										
										
											2006-07-03 16:07:27 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_pci_device_do_suspend ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_pci_device_do_resume ) ;  
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:28:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_pci_device_suspend ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_pci_device_resume ) ;  
						 
					
						
							
								
									
										
										
										
											2007-03-02 17:32:47 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  /* CONFIG_PM */ 
  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# endif  /* CONFIG_PCI */ 
  
						 
					
						
							
								
									
										
										
										
											2006-01-06 09:28:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-11-02 12:29:32 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_platform_remove_one ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-07-16 14:29:39 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( __ata_ehi_push_desc ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_ehi_push_desc ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_ehi_clear_desc ) ;  
						 
					
						
							
								
									
										
										
										
											2007-08-18 13:14:55 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_port_desc ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef CONFIG_PCI 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_port_pbar_desc ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif  /* CONFIG_PCI */ 
  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_port_schedule_eh ) ;  
						 
					
						
							
								
									
										
										
										
											2007-08-06 18:36:23 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_link_abort ) ;  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:07 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_port_abort ) ;  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_port_freeze ) ;  
						 
					
						
							
								
									
										
										
										
											2007-09-23 13:14:13 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( sata_async_notification ) ;  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:09 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_eh_freeze_port ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_eh_thaw_port ) ;  
						 
					
						
							
								
									
										
										
										
											2006-04-02 18:51:53 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_eh_qc_complete ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_eh_qc_retry ) ;  
						 
					
						
							
								
									
										
										
										
											2008-05-02 02:14:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_eh_analyze_ncq_error ) ;  
						 
					
						
							
								
									
										
										
										
											2006-05-15 20:58:22 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_do_eh ) ;  
						 
					
						
							
								
									
										
											 
										
											
												libata: make reset related methods proper port operations
Currently reset methods are not specified directly in the
ata_port_operations table.  If a LLD wants to use custom reset
methods, it should construct and use a error_handler which uses those
reset methods.  It's done this way for two reasons.
First, the ops table already contained too many methods and adding
four more of them would noticeably increase the amount of necessary
boilerplate code all over low level drivers.
Second, as ->error_handler uses those reset methods, it can get
confusing.  ie. By overriding ->error_handler, those reset ops can be
made useless making layering a bit hazy.
Now that ops table uses inheritance, the first problem doesn't exist
anymore.  The second isn't completely solved but is relieved by
providing default values - most drivers can just override what it has
implemented and don't have to concern itself about higher level
callbacks.  In fact, there currently is no driver which actually
modifies error handling behavior.  Drivers which override
->error_handler just wraps the standard error handler only to prepare
the controller for EH.  I don't think making ops layering strict has
any noticeable benefit.
This patch makes ->prereset, ->softreset, ->hardreset, ->postreset and
their PMP counterparts propoer ops.  Default ops are provided in the
base ops tables and drivers are converted to override individual reset
methods instead of creating custom error_handler.
* ata_std_error_handler() doesn't use sata_std_hardreset() if SCRs
  aren't accessible.  sata_promise doesn't need to use separate
  error_handlers for PATA and SATA anymore.
* softreset is broken for sata_inic162x and sata_sx4.  As libata now
  always prefers hardreset, this doesn't really matter but the ops are
  forced to NULL using ATA_OP_NULL for documentation purpose.
* pata_hpt374 needs to use different prereset for the first and second
  PCI functions.  This used to be done by branching from
  hpt374_error_handler().  The proper way to do this is to use
  separate ops and port_info tables for each function.  Converted.
Signed-off-by: Tejun Heo <htejun@gmail.com>
											 
										 
										
											2008-03-25 12:22:50 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_std_error_handler ) ;  
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_cable_40wire ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_cable_80wire ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_cable_unknown ) ;  
						 
					
						
							
								
									
										
										
										
											2007-11-27 19:43:48 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_cable_ignore ) ;  
						 
					
						
							
								
									
										
										
										
											2007-03-06 02:37:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL_GPL ( ata_cable_sata ) ;