Skip to contentSkip to conversation

sata_nv: Use notifier for completion checks

PATCH In review Robert Hancock 1 participant 1 message Feb 20, 2007 libata

lore
Share & tools
lore
#0 lore raw

PATCH 4/5 sata_nv: Use notifier for completion checks

The hardware provides us a notifier register that indicates what command tags have completed. Use this to determine which CPBs to check, rather than blindly checking all active CPBs. This should provide a minor performance win, since if the controller has touched some of these incomplete CPBs, accessing them will likely result in a cache miss.

drivers/ata/sata_nv.c.delayandfixes renamed from drivers/ata/sata_nv.c +0 -0
@@ -853,22 +854,14 @@ static irqreturn_t nv_adma_interrupt(int
 
			if (status & (NV_ADMA_STAT_DONE |
				      NV_ADMA_STAT_CPBERR)) {
+				u32 check_commands = notifier | notifier_error;
+				int pos, error = 0;
				/** Check CPBs for completed commands */

-
- if (ata_tag_valid(ap->active_tag)) {
- /* Non-NCQ command */
- nv_adma_check_cpb(ap, ap->active_tag,
- notifier_error & (1 << ap->active_tag));
- } else {
- int pos, error = 0;
- u32 active = ap->sactive;
-
- while ((pos = ffs(active)) && !error) {
- pos--;
- error = nv_adma_check_cpb(ap, pos,
- notifier_error & (1 << pos) );
- active &= ~(1 << pos );
- }
+ while ((pos = ffs(check_commands)) && !error) {
+ pos--;
+ error = nv_adma_check_cpb(ap, pos,
+ notifier_error & (1 << pos) );

+					check_commands &= ~(1 << pos );
				}
			}
		}